在数据集查询中设置 NOLOCK 提示的选项

Jer*_*oen 7 sql-server ssrs locking

一些上下文:
起初我们只是“直接”编写报告,在查询中没有任何锁定提示。对于较大的报告,这有时会导致锁定问题。在第一,我们通过使用补救这WITH (NOLOCK)提示在查询表。

因为(a)它是相当突兀,和(b)很容易忘记一个表的提示,我们搬到了第二种方法设置TRANSACTION ISOLATION LEVELREAD UNCOMMITTED每个数据集的查询的顶部(这是罚款)。

正如您可能猜到的,忘记其中一个数据集的提示仍然很容易。所以这就引出了一个问题:


问题:与报告查询一起发送NOLOCK提示的选项有哪些?

附注。我意识到这在某种程度上是一个XY 问题(我对 X 有很多其他选择,例如优化查询,不报告操作数据库等),但仍然试图使其成为一个有效的问题.


选项:
以下是上面提到的选项,添加了一些我很好奇它们是否可行的选项:

  1. WITH (NOLOCK)为每个表设置提示。(突兀,很容易忘记)
  2. READ UNCOMMITTED为整个查询设置隔离级别。(还是很容易忘记)
  3. 是否可以在报告级别指定这一点?例如,确保一份报告的所有数据集查询将在不锁定的情况下运行。
  4. 是否可以在其他 SSRS 级别指定它?例如,也许为某个报告文件夹设置它,或者通过使用扩展?
  5. 是否可以在数据源/连接字符串级别指定它?例如,所有相关报告都使用某个“无锁数据源”吗?
  6. 与上一个选项相关:也许可以为特定的“no-lock-sql-user”(连接中使用的那个)指定默认锁定提示?
  7. ???

哪些选项是可行的?有没有我错过的选项?

Han*_*non 6

您是否考虑READ_COMMITTED_SNAPSHOT过数据库的行版本控制?

Kim Tripp 在http://msdn.microsoft.com/en-us/library/ms345124%28v=sql.90%29.aspx 上有一篇关于它的好文章

READ_COMMITTED_SNAPSHOT允许更好的功能WITH (NOLOCK),因为它为长时间运行的聚合或查询提供了绝对的时间点一致性,因为减少了锁争用而增加了吞吐量。


Kev*_*sel 5

快速回答:

  1. 正如你所指出的那样有效。
  2. 正如你所指出的那样有效。
  3. 这似乎不起作用。我没有立即看到一个选项,每当问到这个问题时,答案总是回到在存储过程中设置隔离级别
  4. 我不会相信的。SSRS 处于比数据库引擎更高的抽象层,因此从某种意义上说,它并不“关心”隔离级别是什么——毕竟,您可以在报告中使用非 RDBMS 解决方案。
  5. 这不起作用。 您不能在连接字符串中设置隔离级别
  6. 这可以工作。 您可以创建登录触发器

如果报告已优化但仍然存在问题,则有几个选项是可行的:

  1. 如果您有 SQL 2012,请使用 Always On。然后您就可以拥有 SSRS 报告可以使用的只读副本。
  2. 使用复制:如果您不需要实时,请使用快照,如果您需要接近实时,请使用事务。
  3. 如果您没有 Always On 的预算或处理复制的耐心,请以便宜的方式进行复制:创建一个报告友好的模式(即,对表进行非规范化并将它们放在更容易运行报告的格式中) 并使用 SSIS 来提供该报告模式。如果您的最终用户可以接受“较旧”的数据(例如,每小时或每 5 分钟更新一次),则这种方法效果会更好。缺点是您将设计数据模型两次:一次用于 OLTP 模型,一次用于伪仓储模型。好处是,如果您朝集中式数据仓库的方向发展,这是一个非常有用的练习。