我有以下查询,返回 < 300 个结果。目前大约需要 4 秒才能完成,当我查看执行计划时,它显示它在聚集索引扫描上花费了 41% 的资源。我对数据库管理的有限知识表明聚集索引查找可以提高性能。如何让查询使用聚集索引查找而不是聚集索引扫描?以下是相关信息和查询。
- SQL Server 2008 R2
- PMDME 表大约 140,000 行(该表占用了 41% 的资源)
- 服务器硬件:16 核 2.7gz 处理器、48GB 内存
DECLARE @start date, @end date SET @start = '2013-01-01' SET @end = CAST(GETDATE() AS DATE) SELECT b.total, c.intakes, d.ships, a.CODE_, RTRIM(a.NAME_) as name, f.employee as Salesperson, g.referral_type_id, h.referral_type, e.slscode, a.city, a.STATE_, a.zip FROM PACWARE.ADS.RFDME a LEFT OUTER JOIN ( SELECT SUM(b.quantity) total, a.ref_id from event.dbo.sample a JOIN event.dbo.sample_parts b on a.id = b.sample_id JOIN PACWARE.ADS.PTDME c on b.part_id = c.CODE_ WHERE c.MEDICAREID = 'E0607' AND a.order_date between @start and @end GROUP BY a.ref_id )b on a.CODE_ = b.ref_id LEFT OUTER JOIN ( SELECT COUNT(a.CODE_)as intakes, rfcode FROM PACWARE.ADS.PMDME a WHERE a.REGDATETIME BETWEEN @start and @end GROUP BY a.RFCODE ) c on a.CODE_ = c.rfcode LEFT OUTER JOIN ( SELECT COUNT(a.CODE) as ships, b.rfcode FROM ( SELECT A.ACCOUNT AS CODE, MIN(CAST(A.BILLDATETIME AS DATE)) AS SHIPDATE FROM PACWARE.ADS.ARODME A LEFT OUTER JOIN PACWARE.ADS.PTDME B ON A.PTCODE=B.CODE_ LEFT OUTER JOIN event.dbo.newdate() D ON A.ACCOUNT=D.ACCOUNT LEFT OUTER JOIN event.dbo.newdate_extras() D2 ON A.ACCOUNT=D2.ACCOUNT WHERE A.BILLDATETIME>=@start AND A.BILLDATETIME=@start AND D.NEWDATE=@start AND D2.NEWDATE'ID' Group by A.ACCOUNT, B.MEDICAREID, A.CATEGORY ) a JOIN PACWARE.ADS.PMDME b on a.CODE = b.CODE_ GROUP BY b.RFCODE ) d on a.CODE_ = d.rfcode LEFT OUTER JOIN event.dbo.employee_slscode e on a.SLSCODE = e.slscode JOIN event.dbo.employee f on e.employee_id = f.id JOIN event.dbo.referral_data g on a.CODE_ = g.CODE_ JOIN event.dbo.referral_type h on g.referral_type_id = h.id WHERE total > 0
最佳答案
我会尝试仅为 PACWARE.ADS.PMDME
表上的 REGDATETIME
列创建第一个索引。
GO
CREATE NONCLUSTERED INDEX [IX_PMDME_REGDATETIME] ON PACWARE.ADS.PMDME
(
[REGDATETIME] ASC
)
GO
测试它是如何工作的。如果 selectivity of the column ,我还会测试向 RFCODE
列(同一个表)添加另一个索引。已经足够好了。
关于performance - 使用聚集索引扫描而不是查找的查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14610158/