SQL查询非常慢 - 突然

时间:2013-12-11 16:01:46

标签: sql sql-server stored-procedures indexing

我有一个运行完美的SQL存储过程(执行时间不超过0.2秒),今天突然耗时超过10分钟。

我发现问题的出现是因为文档表的LEFT JOIN(存储与数据库中记录关联的所有数字文件的位置)。

此文件表今天有153,234条记录。

架构是

enter image description here

该表有2个索引:

  • 主键(uid)
  • documenttype(nonclustered)

存储过程是:

SELECT 
    .....,
    CASE ISNULL(cd.countdocs,0) WHEN 0 THEN 0 ELSE 1 END as hasdocs
     .....
FROM 
    requests re
JOIN 
    employee e ON (e.employeeuid = re.employeeuid)
LEFT JOIN 
    (SELECT 
         COUNT(0) as countnotes, n.objectuid as objectuid 
     FROM 
         notes n
     WHERE 
         n.isactive = 1
     GROUP BY 
         n.objectuid) n ON n.objectuid = ma.authorizationuid

/* IF I COMMENT THIS LEFT JOIN THEN WORKS AMAZING FAST */
LEFT JOIN  
    (SELECT 
         COUNT(0) as countdocs, cd.objectuid 
     FROM 
         cloud_document cd
     WHERE  
         cd.isactivedocument = 1
         AND cd.entity = 'COMPANY'
     GROUP BY 
         cd.objectuid) cd ON cd.objectuid = re.authorizationuid
JOIN ....

所以不知道我是否需要添加另一个INDEX来改善这个查询,也许LEFT JOIN我不太理想。

如果我执行执行计划,我会得到这个:

/*
Missing Index Details from SQLQuery7.sql - (local).db_prod (Test/test (55))
The Query Processor estimates that implementing the following index could improve the query cost by 60.8843%.
*/

/*
USE [db_prod]
GO
CREATE NONCLUSTERED INDEX [<Name of Missing Index, sysname,>]
ON [dbo].[cloud_document] ([objectuid],[entity],[isactivedocument])

GO
*/

关于如何解决这个问题的任何线索?

感谢。

2 个答案:

答案 0 :(得分:-1)

只是不要出去添加索引。先做一些研究!

你能抓住查询计划的图片并发布吗?它将显示查询是否使用索引。

此外,该表的完整细节将非常棒,包括主键,外键和任何索引。只需将它们编写为TSQL。要启动的几个示例记录,我们可以在测试环境中重新创建它并帮助您。

另外,看看格伦巴里的DMV。

http://sqlserverperformance.wordpress.com/tag/dmv-queries/

好的东西,如最热门的查询,读/写索引的使用等等 - 仅举几例。

像生活中的许多事情一样,这一切都取决于你的情况!

在我们做出判断之前,只需要更多信息。

答案 1 :(得分:-1)

如果该字段上的索引有帮助,我会感到惊讶,因为它可能只有两个或三个值(0,1,null),并且当数据值很少时索引通常不常用。

我怀疑您的统计信息已过期或您当前的索引需要重建。