如何在SQL Server中仅选择未提交的行?

12

我正在进行DW项目,在这个项目中我需要查询实时的CRM系统。标准隔离级别对性能有负面影响。我想使用no lock/事务隔离级别read uncommitted。我想知道有多少被选定的行是由脏读所识别的。

3个回答

9
也许你可以这样做:
SELECT * FROM T WITH (SNAPSHOT)
EXCEPT
SELECT * FROM T WITH (READCOMMITTED, READPAST)

但这本质上是有风险的。


非常好,但为什么要快照 - 读提交不足够吗? - benjamin moskovits
@benjaminmoskovits,读取已提交的事务可以读取被x锁定的行。我知道这听起来难以置信,但这是真的。RC只保证读取已提交的数据,没有锁定的保证。此外,快照是最好的选择,为什么不使用它呢? - usr
快照在资源方面是昂贵的。 - benjamin moskovits
@benjaminmoskovits 你所说的资源是什么?快照成本与DML有一定的比例关系。因此,它们可能接近于零百分比。读取操作非常便宜,特别是当由于SI而避免锁定时。 - usr

6

为什么需要知道这个?

你使用 TRANSACTION ISOLATION LEVER READ UNCOMMITTED 只是为了表明 SELECT 语句不会等待任何更新/插入/删除事务在表/页/行上完成 - 并且将获取甚至是 脏数据 的记录。而你这样做是为了提高性能。试图获取关于哪些记录是脏的信息就像往你的脸上打搅拌机一样。它会伤害你,却并不能给你任何东西,只有痛苦。因为它们曾经是脏的,现在不是了。或者还是脏的?谁知道呢...

更新

现在来谈谈数据质量。

想象一下,你用类似以下查询读取脏数据:

SELECT *
FROM dbo.MyTable
WITH (NOLOCK)

例如,您已经通过id = 1name ='someValue'获取了记录。然后您想要更新名称,将其设置为“anotherValue” - 所以您执行以下查询:

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

如果这条记录存在,你将在那里得到实际的值,如果它被删除(即使是脏读 - 被删除但是尚未提交),则没有发生任何可怕的事情,查询不会影响任何行。 这是一个问题吗? 当然不是。 因为在您读取和更新之间的时间内,事情可能会发生千变万化。 只需检查 @@ROWCOUNT 以确保查询执行了它应该执行的操作,并警告用户结果。

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


1
数据质量是识别未提交行的主要原因。除非我别无选择,否则我不想将实际上从未提交的记录带到DW中。我想进行这项研究并向业务部门呈现,以便我们可以做出最优决策。 - BI Dude

4

标准隔离级别对性能有负面影响

那么为什么不解决这个问题呢?您知道脏读是不一致的读取, 因此不应使用它们。明显的答案是使用快照隔离。请阅读在SQL Server中实现快照或读取已提交的快照隔离:指南

但实际上问题更深层次。为什么会出现阻塞?为什么读取会被写入阻塞?DW工作负载不应该放任于操作事务数据,这就是我们拥有ETL和OLAP产品的原因。考虑立方体、列存储、powerpivot等所有可以实现极快速DW和分析的好处。不要将分析型端到端扫描的负担加在业务操作数据库上,否则你只会遇到麻烦。


感谢提供链接,我很欣赏你的观点。阻止访问的主要原因是 MS CRM Dynamics 的过滤视图。ETL 产品仍需要获取操作数据,这是第一步。立方体/Powerpivot/报告在此之后。我有点困惑你所说的“DW 工作负载不应该放在操作事务数据上”的意思。 - BI Dude
DW工作负载包含扫描范围的查询(“每日销售”,“上周存在情况”,“NW地区成本”)。操作OLTP工作负载非常狭窄,一次只处理一行或少量行(“插入一次销售”,“使用ID 2更新员工”,“删除待处理订单”)。 OLTP工作负载写操作不相互交互,因为它们所代表的业务流程不重叠(没有两个操作员尝试插入相同的发票数据)。但是DW读取与OLTP写入交互,因为OLTP写入落在DW查询范围内。 - Remus Rusanu
1
这就是为什么DW工作负载与OLTP交互如此糟糕的原因,它们往往会相互阻塞,因为DW会对所有内容进行“窥探”,由于范围扫描(甚至常常是全表扫描)。即使表格为DW扫描提供了必要的索引,它们仍然倾向于阻塞(例如,“今日销售”报告可能会阻塞新销售的插入,这是一个极端的例子)。SNAPSHOT可以大有裨益,但也有成本。 - Remus Rusanu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接