11

我正在处理需要查询实时 CRM 系统的 DW 项目。标准隔离级别会对性能产生负面影响。我很想使用未提交的无锁/事务隔离级别。我想知道脏读识别了多少选定的行。

4

3 回答 3

8

也许你可以这样做:

SELECT * FROM T WITH (SNAPSHOT)
EXCEPT
SELECT * FROM T WITH (READCOMMITTED, READPAST)

但这本质上是活泼的。

于 2014-03-07T09:02:33.873 回答
5

为什么你需要知道这一点?

您使用TRANSACTION ISOLATION LEVER READ UNCOMMITTEDjust 表示该SELECT语句不会等到表/页面/行上的任何更新/插入/删除事务完成 - 甚至会抓取记录。你这样做是为了提高性能。试图获取有关哪些记录是脏的信息就像打在你脸上的搅拌机一样。它很痛,除了痛苦,什么也没有给你。因为它们在某些时候是脏的,现在它们不是了。还是还很脏?谁知道...

更新

现在关于数据质量。想象一下,您使用如下查询读取脏记录:

SELECT *
FROM dbo.MyTable
WITH (NOLOCK)

例如用id = 1and记录name = 'someValue'。比您要更新名称,将其设置为“anotherValue” - 所以你做以下查询:

UPDATE dbo.MyTable
SET
    Name = 'anotherValue'
WHERE  id = 1

因此,如果此记录存在,您将在那里获得实际值,如果它被删除(即使在脏读时 - 已删除但尚未提交) - 没有发生任何可怕的事情,查询不会影响任何行。这是个问题吗?当然不是。因为在您阅读和更新之间的时间可能会改变无数次。只需检查@@ROWCOUNT以确保查询完成了它必须做的事情,并警告用户有关结果。

无论如何,这取决于数据的情况和重要性。如果数据必须是真实的 - 不要使用脏读

于 2014-03-07T09:08:47.633 回答
4

标准隔离级别会对性能产生负面影响

那你为什么不解决这个问题?你知道脏读是不一致的读,所以你不应该使用它们。显而易见的答案是使用快照隔离。阅读在 SQL Server 中实现快照或读取提交的快照隔离:指南

但问题实际上更深。为什么会遇到阻塞?为什么读被写阻塞?DW 工作负载不应该在操作事务数据上松散,这就是我们使用 ETL 和 OLAP 产品的原因。考虑一下多维数据集、列存储、powerpivot,所有这些都允许非常快速的DW 和分析。不要用端到端的分析扫描给业务运营数据库带来负担,你只会遇到问题。

于 2014-03-07T09:57:45.617 回答