我有一个运行完美的SQL存储过程(执行时间不超过0.2秒),今天突然耗时超过10分钟。
我发现问题的出现是因为文档表的LEFT JOIN(存储与数据库中记录关联的所有数字文件的位置)。
此文件表今天有153,234条记录。
架构是
该表有2个索引:
存储过程是:
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
*/
关于如何解决这个问题的任何线索?
感谢。
答案 0 :(得分:-1)
只是不要出去添加索引。先做一些研究!
你能抓住查询计划的图片并发布吗?它将显示查询是否使用索引。
此外,该表的完整细节将非常棒,包括主键,外键和任何索引。只需将它们编写为TSQL。要启动的几个示例记录,我们可以在测试环境中重新创建它并帮助您。
另外,看看格伦巴里的DMV。
http://sqlserverperformance.wordpress.com/tag/dmv-queries/
好的东西,如最热门的查询,读/写索引的使用等等 - 仅举几例。
像生活中的许多事情一样,这一切都取决于你的情况!
在我们做出判断之前,只需要更多信息。
答案 1 :(得分:-1)
如果该字段上的索引有帮助,我会感到惊讶,因为它可能只有两个或三个值(0,1,null),并且当数据值很少时索引通常不常用。
我怀疑您的统计信息已过期或您当前的索引需要重建。