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%的操作
我认为通过使用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)