performance - 使用聚集索引扫描而不是查找的查询

标签 performance sql-server-2008 indexing

我有以下查询,返回 < 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/

相关文章:

sql - 复合词全文检索

matrix - 矩阵与其他矩阵的矢量化索引(以 Octave 为单位)

SQL逆透视多列数据

sql-server - 暂时暂停 SQL Server 复制

C++,用一个字节存储两个变量

performance - 如何检查应用程序是否受 CPU 限制或内存限制?

.net - : Constraint or FK? 对于状态列有什么更好的

python - 连接重复值/行的问题

Python字典查找性能,get vs in

ios - glDrawElements 与 GL_LINES 强制 gleRunVertexSubmitARM? (或 : why drawing wireframes is slow on iOS? )