我在繁忙的数据库上有一个存储过程,该数据库在某种程度上一直在昂贵的查询列表中排在首位。该查询非常简单,它采用单个参数(@ 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%的操作
我认为通过使用where (ID = @ID or @ID is null)您,您将获得次优的计划。将其分为2个单独的查询,以便在@Id不为null的情况下,它将直接查找它,并且您将获得搜索而不是扫描出现在计划中。您可能会创建一个需要避免重复的列的View(即不带where子句的Query)
where (ID = @ID or @ID is null)
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