我使用SQL Server2012。
我有一张150万个人的桌子。在此表中,我有一个非聚集索引字段UR_ID
。我使用的应用程序从我的个人表中选择数据。它使用以下查询:
declare @p5 int
exec sp_prepexec @p5 output,
N'@P1 nvarchar(4000),@P2 numeric(38,0),@P3 numeric(38,0)',
N'select a.INDIVIDUAL_ID as ID_OBJEC_1
from dbo.INDIVIDUAL a
where lower(a.UR_ID) like @P1
and coalesce (a.FLD_DELETE, @P2 )= @P3
order by a.LST_UPD_DT desc, a.INDIVIDUAL_ID asc',
N'1000004708691',0,0
select @p5
基本上,查询只是将查询从索引字段转换为记录的主键。在此示例中,'1000004708691'
是搜索到的索引字段UR_ID
。 FLD_DELETE
表中的其他字段是LST_UPD_DT
和INDIVIDUAL
。
查询需要执行04.76秒。 因为我正在诊断性能问题,所以我使用以下查询来检查出什么问题了:
select a.INDIVIDUAL_ID as ID_OBJEC_1
from dbo.INDIVIDUAL a
where lower(a.UR_ID) like '1000004708691'
and coalesce (a.FLD_DELETE, 0)= 0
order by a.LST_UPD_DT desc, a.INDIVIDUAL_ID asc
查询需要1.18秒才能执行。
我不明白为什么使用sp_prepexec
会使查询慢5倍。
我也不明白为什么非聚集索引字段搜索可能要花多达1秒钟的时间来执行。
如何改善此处的演奏? 我想念什么?