#sql #sql-server #performance #sql-execution-plan
#sql #sql-сервер #Производительность #sql-execution-plan
Вопрос:
Я создал временную таблицу для тестирования моего первичного ключа в intindex.
Когда я делаю select * from #TmpDashboard where intindex = 1
, я получаю поиск по индексу.
но когда я применяю формулу подкачки, я получаю сканирование индекса, что вызывает проблемы с производительностью.
Declare @Currentpage INT = 1
,@Pagesize INT = 10
select * from #TmpDashboard
WHERE (@Pagesize = 0 OR (intIndex BETWEEN ((@CurrentPage - 1) * @PageSize) 1 AND (@CurrentPage * @PageSize))) --gives index scan
Как я могу преобразовать приведенную выше формулу для получения поиска по индексу.
Комментарии:
1. Вы проверили план выполнения? Сколько строк у вас есть в
#TmpDashboard
и для скольких из них требуетсяintIndex BETWEEN ((@CurrentPage - 1) * @PageSize) 1 AND (@CurrentPage * @PageSize))
?2. @MartinK. просто проверил sick или сканировать не количество строк!
3. Метод извлечения данных зависит от имеющихся у вас данных. Если имеется слишком много строк, соответствующих условию, сканирование таблицы более эффективно, чем индексирование.
4. @MartinK. значение всегда будет равно 1.
5. Попробуйте добавить покрывающий индекс.
Ответ №1:
«ИЛИ» в предложении WHERE вызывает сканирование, потому что это делает оператор недетерминированным. Я бы предложил установить второй набор переменных, которые вы можете использовать для упрощения запроса, например, так:
Declare @Currentpage INT = 1
,@Pagesize INT = 10;
declare @start int = Case when @pagesizee = 0 then 0 else ((@CurrentPage - 1) * @PageSize) 1 end
, @end int = case when @pagesize > 0 then @CurrentPage * @PageSize else (select max(intindex) from #tmpdashboard) end
select * from #TmpDashboard
WHERE intindex between @start and @end
Ответ №2:
create table #TmpDashboard (intindex int primary key)
select * from #TmpDashboard where intindex = 1
Declare @Currentpage INT, @Pagesize INT;
select @Currentpage= 1, @Pagesize = 10;
select * from #TmpDashboard
WHERE intIndex BETWEEN ((@CurrentPage - 1) * @PageSize) 1 AND (@CurrentPage * @PageSize)
drop table #TmpDashboard