0

1. Вот процедура (самая большая таблица имеет около 1 млн строк) для извлечения записейSQL Server Dynamic Заказывайте Issue Performance

Create Procedure GetallTransctions(@Pagesize,@CurrentPage,@SortColumn,@SortDirection) 
AS 
Begin 

select TOP (@PageSize) * from (

    Select Top ((@PageSize*CurrentPage)[email protected]) * from TransactionDetails where 
    TransactionType ='Pay'--Few more conditions 
    Order By 
    case when @SortColumn= 'CustomerName' and @SortDirection= 'ASC' 
    then CustomerName end asc, 
    case when @SortColumn= 'CustomerName' and @SortDirection= 'DESC' 
    then CustomerName end desc 

) a 

Выше производительность процедура хороша, пока количество строк не меньше 1М. Когда размер записей продолжает увеличиваться, потребуется около 40 секунд для выполнения. Если я жесткий код заказа по так

Order By 
    CustomerName ASC 

Запрос занимает 3-5 секунд, чтобы выполнить, но я не могу жестко закодировать сортировки столбцов. Является ли оператор Case в порядке по порядку влиять на производительность? Любое решение/запрос.

2. Выполняется процедура всплытия. Поэтому позвольте сказать, что мне нужно выбрать записи в диапазоне 70000 - 70010. Мы применяем сортировку на основе значений значений параметров 0-70010 и принимаем 10 лучших записей. вместо этого примените сортировку и выборку только 70000 - 70010. Есть ли другой способ?

ответ

0

Проблема может заключаться в том, что оптимизатор SQL не распознает, что индекс может использоваться для сортировки.

Решение заключается в использовании динамического SQL.

declare @sql nvarchar(max); 

set @sql = ' 
select TOP (@PageSize) * from (
    Select Top ((@PageSize*CurrentPage)[email protected]) * from TransactionDetails where 
    TransactionType =''Pay'' --Few more conditions 
'; 

if @SortColumn = 'CustomerName' and @SortDirection = 'ASC' 
    set @sql = @sql + ' order by CustomerName asc'; 
else if @SortColumn = 'CustomerName' and @SortDirection = 'DESC' 
    set @sql = @sql + ' order by CustomerName desc'; 

set @sql = replace(@sql, '@Pagesize', @Pagesize); 

exec sp_executesql @sql; 

Это будет перекомпилировать запрос каждый раз, когда он будет запущен (накладные расходы). Но он также должен быстро получить данные, которые вы ищете, если сортировка может использовать индекс.

Кроме того, в SQL Server 2012+ вы можете использовать статьи offset/fetch, которые лучше подходят для подкачки.

+0

intially я использовал динамический запрос, но мы переходим на предварительно скомпилированный запрос. Есть ли другое решение без динамического запроса? – Siva

+0

@ Шива. , , Решение было бы повторить запрос несколько раз 'if @sortColumn =. , , начните выбор. , , order by CustomerName asc' end else if. , , '. Я не рекомендую повторять запрос. Это становится кошмаром для обслуживания. –