【问题标题】:correct isolation levels when running queries on SQL DB在 SQL DB 上运行查询时正确的隔离级别
【发布时间】:2014-03-20 13:13:23
【问题描述】:

我正在使用 SELECT * 在 1 个少于 1m 条记录的表上查询数据库。看来我的查询已经关闭了附加到数据库的应用程序。

DBA 告诉我使用正确的隔离级别以避免对数据库的影响。

我在查询中添加了WITH (NOLOCK),这样可以吗?另外,1个查询会关闭数据库是否正常?

【问题讨论】:

  • 好吧,让查询能够关闭数据库需要特殊技能。在大多数情况下,Jedi 可以做到这一点;-) 好吧,说真的,您使用的是哪个 DBMS?我首先检查您的查询是否已被正确的索引覆盖。此外,如果您正在读取数据(不更新),您可以指定 NOLOCK,但在大多数情况下您不必这样做。
  • 数据库在 SQL Server 中 - 我认为是 2008 年。我只是使用报表生成器查询它,我无法访问表结构,所以不知道索引。我只是觉得奇怪的是,一个只返回 5 列和少于 1m 条记录的查询会导致应用程序崩溃。我应该使用什么隔离级别?
  • 有人告诉我,由于数据库中存在块,其他人无法使用它

标签: sql tsql reportbuilder3.0


【解决方案1】:

您的索引有问题。这不是您要获取多少行的问题,您必须注意查询的“位置”部分。 如果您不知道存在哪些索引,请向您的 DBA 询问索引或将查询的“位置”部分发送给他。如果幸运的话,正确的索引已经存在。如果没有,则必须创建新索引。

只有索引正确,才可以考虑使用NOLOCK提示。

【讨论】:

  • 查询没有 WHERE 部分 - 我只是调用了所有数据。
  • 查询中是否有“ORDER BY”子句?或者您只是从表中导出数据而没有特定顺序?
  • 无顺序,只是简单的 select * from tbl
  • 好的,由于您正在获取完整的数据集,因此您的查询可能需要一些时间才能完成。究竟什么是“小于 1 m”的记录?它是接近一百万条记录,还是更小?如果你真的有,例如 800.000 条记录......好吧,获取所有记录需要相同的时间。也许20秒?因此,某些用户可能阻止了您的查询。您可以尝试使用“SELECT * FROM Yourtable WITH (NOLOCK)”语句,在这种情况下它可能会有所帮助。或者您是否可以等待其他人完成他们的工作再试一次?
猜你喜欢
  • 1970-01-01
  • 2020-08-29
  • 2011-07-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多