引用主键时SQL查询速度极慢

时间:2010-09-01 03:58:47

标签: sql sql-server database performance database-design

我有一个MS SQL表,大约有800万条记录。列“ID”上有一个主键(聚簇索引,碎片只有0.8%)。当我运行看似任何引用ID列的查询时,查询需要很长时间(事实上最终会崩溃我的应用程序)。这包括简单的查询,如“SELECT * FROM table WHERE ID = 2020”。相比之下,不引用ID的查询(例如“SELECT TOP 100 * from table”)就可以了。

有什么想法吗?

5 个答案:

答案 0 :(得分:4)

如果您已经检查过碎片,我会检查统计信息

他们是否被禁用或未更新?

他们快速检查的方法是使用STATS_DATE

答案 1 :(得分:2)

如果查询正在 10分钟(!?!),那么严重错误。即使是800万条记录的表扫描也只需要一两秒钟。我会检查事件日志中是否有即将发生硬件故障的指示,或者尝试将数据库移动到其他服务器以查看是否存在其他硬件故障。

答案 2 :(得分:1)

我怀疑查询正在进行表扫描(或者至少是对非常大或统计过时的索引进行索引扫描)。生成估计的执行计划(SSMS中的Control-L)或让SQL Server返回它实际使用的执行计划,因为它有时不同(Control-M启用它,然后正常运行查询 - 它将在您旁边创建一个新选项卡结果)。

获得执行计划后,搜索表扫描或索引扫描,这很可能是您缓慢的原因。 “估计执行计划”甚至可以推荐和索引以帮助查询更快地返回 - 较新版本的SQL Server / SSMS包含此功能。

虽然我怀疑你找不到任何有趣的东西 - 你的查询只是一步 - 这里是阅读执行计划的快速介绍:http://sqlserverpedia.com/wiki/Examining_Query_Execution_Plans

答案 3 :(得分:0)

ID是GUID吗? SQL Server在GUID列上生成哈希存在问题,这使得它们在索引中执行得很糟糕。

获取您的确切查询并从Sql Server Management Studio中获取“估计执行计划”。如果您查询是触发表扫描(它不应该是),那么这将解释时间。也许该计划可能会告诉你还有什么事情发生。

我假设您已经重建了索引(基于您的0.8%碎片评论)。

答案 4 :(得分:0)

我想如果您使用默认的读取级别并且您有一个长时间运行的更新,您可能也会遇到死锁?这肯定也会导致这种情况。