【发布时间】:2011-08-29 09:32:34
【问题描述】:
我正在尝试优化我的查询。基本上我有一个部门表和一个文档表。每个文档属于一个部门,每个文档可以是特定类型。
目前 mu 查询看起来像这样
SELECT DepartmentID,
[Description] = DepartmentNo + ' (' + DepartmentName + ')',
hasInvoice = CASE WHEN EXISTS(SELECT DocID FROM Document WHERE DepartmentID = Department.DepartmentID AND TypeID = 1) > 0 THEN 1 ELSE 0 END,
hasCreditNote = CASE WHEN EXISTS(SELECT DocID FROM Document WHERE DepartmentID = Department.DepartmentID AND TypeID = 2) > 0 THEN 1 ELSE 0 END,
hasQuote = CASE WHEN EXISTS(SELECT DocID FROM Document WHERE DepartmentID = Department.DepartmentID AND TypeID = 3) > 0 THEN 1 ELSE 0 END
FROM Department
ORDER BY DepartmentName
我遇到的问题是,每次按类型查找与部门相关的文档都会导致查询重新扫描文档表,这使得事情变得非常缓慢。有没有更优化的方法来做到这一点?我尝试使用 CTE,为每种类型进行左连接。但它似乎对加快查询速度没有影响。
我们有大约 200000 个文档,因此优化此查询非常重要。
谢谢
【问题讨论】:
-
你在桌子上设置了哪些索引?
-
是的。它不应该“重新扫描”。执行计划是否真的显示了这一点?理想情况下,您希望在
Document(DepartmentID,TypeID)上有一个复合索引
标签: tsql optimization rows exists