Получить поиск по индексу вместо сканирования во временной таблице подкачки?

#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