Я использую эту хранимую процедуру для разбивки на страницы в SQL Server 2008 R2:
ALTER PROCEDURE [SelectPaging]
@SelectedColumn nvarchar(max),
@ViewName nvarchar(200),
@PrimaryKeyName nvarchar(100),
@RowCountOnPage int,
@PageNumberDesired int,
@Condition nvarchar(max),
@OrderBy nvarchar(200),
@OrderByAsc bit,
@UserID int,
@ErrorNumber int out,
@TotalRowsCount int out
as
begin
SET NOCOUNT ON;
Begin Try
exec [general].TotalRowsWithFiltering @PrimaryKeyName,@viewName ,@Condition ,@UserID,@TotalRowsCount out,@ErrorNumber out
declare @RowNumberFrom int,@RowNumberTo int
set @RowNumberFrom=((@PageNumberDesired-1)*@RowCountOnPage)
set @RowNumberTo=(@PageNumberDesired*@RowCountOnPage)+1
if @Condition='' or @Condition is null
set @Condition=' 1=1 '
else set @Condition=@Condition
if @OrderBy='' or @OrderBy is null
set @OrderBy=@PrimaryKeyName
declare @OrderByAsc_Desc nvarchar(6)
if (@OrderByAsc='false' or @OrderByAsc is null)
set @OrderByAsc_Desc=' Desc'
else if @OrderByAsc='true'
set @OrderByAsc_Desc=' Asc'
declare @SQLQuery nvarchar(max)
set @SQLQuery='SELECT
*
FROM (
SELECT
*,
ROW_NUMBER() OVER (order by '+@OrderBy+' '+@OrderByAsc_Desc+') AS RowNumber
FROM (
SELECT '+@SelectedColumn+'
FROM '+@viewName+' where ' + @Condition +'
) AS d
) AS c
where RowNumber >'+cast(@RowNumberFrom as nvarchar(10))+' and RowNumber < '+cast(@RowNumberTo as nvarchar(10))
EXECUTE sp_executesql @SQLQuery
set @ErrorNumber=@@ERROR
END TRY
BEGIN CATCH
END CATCH
end
Я запускаю запрос в представлении с 700.000 записей.
Когда я выбираю запрос в представлении, время выполнения равно нулю.
Но когда я запускаю этот sp для разбивки на страницы, требуется 50-60 секунд для извлечения 10 записей для каждой страницы
Как это можно оптимизировать?