小编典典

SQL Server查询性能

sql

我在繁忙的数据库上有一个存储过程,该数据库在某种程度上一直在昂贵的查询列表中排在首位。该查询非常简单,它采用单个参数(@
ID,int)作为表的主键,并选择与该ID匹配的记录。主键是带有聚簇索引的身份字段,所以我很困惑如何进一步优化它?

查询如下

CREATE PROCEDURE [dbo].[P_Call_Get]

    @ID int = null

AS

    select ID,
        AppID,
        AgentID,
        AgentLogin,
        Ext,
        VDN,
        VDNName,
        Skill,
        SkillName,
        CallFrom,
        TelNoFrom,
        ParentCallID,
        CallStart,
        ACWStart,
        CallEnd,
        Outcome,
        StageID,
        TxTo,
        TxSuccess,
        ServiceID,
        DiallerID,
        CRC,
        TSCallID,
        CallDirection,
        [Manual],
        CallBackAgent,
        CallBackDateTime,
        Notes
    from P_Call
    where (ID = @ID or @ID is null)

不确定发布执行计划的最佳方法-显示的全部内容是聚集索引扫描占用了100%的操作


阅读 161

收藏
2021-04-14

共1个答案

小编典典

我认为通过使用where (ID = @ID or @ID is null)您,您将获得次优的计划。将其分为2个单独的查询,以便在@Id不为null的情况下,它将直接查找它,并且您将获得搜索而不是扫描出现在计划中。您可能会创建一个需要避免重复的列的View(即不带where子句的Query)

select ID,
    AppID,
    AgentID,
    AgentLogin,
    Ext,
    VDN,
    VDNName,
    Skill,
    SkillName,
    CallFrom,
    TelNoFrom,
    ParentCallID,
    CallStart,
    ACWStart,
    CallEnd,
    Outcome,
    StageID,
    TxTo,
    TxSuccess,
    ServiceID,
    DiallerID,
    CRC,
    TSCallID,
    CallDirection,
    [Manual],
    CallBackAgent,
    CallBackDateTime,
    Notes
from P_Call
2021-04-14