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


7

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

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

您可能会猜到,忘记其中一个数据集的提示仍然很容易。因此,这导致了一个问题:


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

PS。我意识到这在某种程度上是一个XY问题(我还有很多其他的X选择,例如优化查询,不对操作数据库进行报告等),但是尽管如此,它还是试图使之成为一个有效的问题。


选项:
以下是上述选项,并添加了一些选项,我很好奇它们是否可以工作:

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

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


到处乱锁或将隔离更改为全面读取未提交的问题是数据质量问题。您不仅会读取脏数据,而且还可能两次返回相同的数据或完全丢失数据。最好查看您的设计,看看是否应该使用单独的报告数据库。看到这个问题
Mike Walsh 2012年

@MikeWalsh同意。这也是我在XY问题上也尝试涉及的内容。尽管如此,如果谨慎使用,知道在何时何地使用锁定提示可能是有益的。
Jeroen 2012年

Answers:


5

快速解答:

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

如果对报告进行了优化并且仍然导致问题,则有一些可行的选择:

  1. 如果您有SQL 2012,请使用Always On。然后,您可以拥有一个SSRS报告可以使用的只读副本。
  2. 使用复制:如果不需要实时,则使用快照;如果需要实时性,则使用事务性。
  3. 如果您没有“永远在线”的预算或没有足够的耐心应对复制,那么请廉价地进行复制:创建一个报告友好的模式(即,对表进行非规范化,然后将其放入一种格式,以便于更轻松地运行报告) ),并使用SSIS来提供该报告模式。如果您的最终用户可以使用“较旧的”数据(例如,每小时或每5分钟更新一次),则效果更好。缺点是您将设计数据模型两次:一次用于OLTP模型,一次用于伪仓库模型。好处是,如果您朝着集中式数据仓库的方向迁移,这将是非常有用的练习。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.