Sql Server查询性能

Mac*_*ros 3 sql t-sql sql-server performance

我在繁忙的数据库上有一个存储过程,它经常在昂贵的查询列表中排名第一(通过某种方式).查询非常简单,只需要一个参数(@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)
Run Code Online (Sandbox Code Playgroud)

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

Mar*_*ith 8

我认为通过使用where (ID = @ID or @ID is null)你得到一个次优计划.将其划分为2个单独的查询,以便在@Id不为空的情况下,它将直接查找它,并且您将获得计划中出现的搜索而不是扫描.你可以用你需要的列创建一个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
Run Code Online (Sandbox Code Playgroud)