Я использую SQL Server 2012.
У меня есть таблица с 1 500 000 человек.В этой таблице у меня есть некластеризованное индексированное поле 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 секунды.
Как я могу улучшить производительность здесь?Чего мне не хватает?
Редактировать: ![Execution Plan of the Query](https://i.stack.imgur.com/8aw5v.png)