2

我有以下查询返回 < 300 个结果。目前完成大约需要 4 秒,当我查看执行计划时,它显示它在聚集索引扫描上花费了 41% 的资源。我对数据库管理的有限了解表明,聚集索引查找会提高性能。如何让查询使用聚集索引查找而不是聚集索引扫描?以下是相关信息和查询。

  • Sql Server 2008 R2
  • 表 PMDME 大约 140,000 行(这是占用 41% 资源的行)
  • 服务器硬件:16 核 2.7gz 处理器,48gb 内存
    声明@开始日期,@结束日期
    SET @start = '2013-01-01'
    SET @end = CAST(GETDATE() 作为日期)
    选择
        b.总计,    
        c.摄入量,
        d.船舶,
        a.CODE_,
        RTRIM(a.NAME_) 作为名称,
        f. 雇员作为销售员,
        g.referral_type_id,
        h.referral_type,
        e.slscode,
        一座城市,
        一个状态_,
        一个.zip
    来自 PAWARE.ADS.RFDME
    左外连接 (
        SELECT SUM(b.quantity) total, a.ref_id from event.dbo.sample a
        在 a.id = b.sample_id 上加入 event.dbo.sample_parts b
        在 b.part_id = c.CODE_ 上加入 PAWARE.ADS.PTDME c
        其中 c.MEDICAREID = 'E0607' AND a.order_date 在 @start 和 @end 之间
        按 a.ref_id 分组
    )b 上 a.CODE_ = b.ref_id
    左外连接 (
        选择 COUNT(a.CODE_) 作为摄入量,rfcode
        来自 PAWARE.ADS.PMDME
        @start 和 @end 之间的 a.REGDATETIME
        GROUP BY a.RFCODE
    ) c on a.CODE_ = c.rfcode
    左外连接 (
        选择
        COUNT(a.CODE) 作为船舶,b.rfcode
        从
        (
            选择
            A.帐户代码,
            MIN(CAST(A.BILLDATETIME AS DATE)) AS SHIPDATE

            来自 PACWARE.ADS.ARODME A
            在 A.PTCODE=B.CODE_ 上左外连接 PACWARE.ADS.PTDME B
            左外连接 event.dbo.newdate() D ON A.ACCOUNT=D.ACCOUNT
            左外连接 event.dbo.newdate_extras() D2 ON A.ACCOUNT=D2.ACCOUNT
            A.BILLDATETIME>=@start
            AND A.BILLDATETIME=@start AND D.NEWDATE=@start AND D2.NEWDATE'ID'
            通过...分组
            A.帐户,
            B.医疗保险,
            A.类别
        ) 一种
        在 a.CODE = b.CODE_ 上加入 PAWARE.ADS.PMDME b
        按 b.RFCODE 分组
    ) d on a.CODE_ = d.rfcode
    左外连接 event.dbo.employee_slscode e on a.SLSCODE = e.slscode
    在 e.employee_id = f.id 上加入 event.dbo.employee f
    在 a.CODE_ = g.CODE_ 上加入 event.dbo.referral_data g
    在 g.referral_type_id = h.id 上加入 event.dbo.referral_type h
    总计 > 0
4

1 回答 1

2

REGDATETIME我会尝试首先为表中的列创建索引PACWARE.ADS.PMDME

GO
CREATE NONCLUSTERED INDEX [IX_PMDME_REGDATETIME] ON PACWARE.ADS.PMDME
(
    [REGDATETIME] ASC
)
GO

测试它是如何工作的。如果列的选择性足够好,我还将测试向列RFCODE(同一个表)添加另一个索引。

于 2013-01-30T19:44:36.643 回答