Низкая скорость подкачки на 500 000 записей в SQL Server 2008 R2 - PullRequest
0 голосов
/ 16 июня 2019

Я использую эту хранимую процедуру для разбивки на страницы в 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 записей для каждой страницы

Как это можно оптимизировать?

1 Ответ

0 голосов
/ 17 июня 2019

Вы можете использовать этот код для разбиения на страницы .... OFFSET поддерживается версия SQL Server 2012+. Поэтому сначала обновите версию своего сервера. Затем создайте индекс в своей таблице для быстрого поиска

   declare @Page bigint=1,@pageSize bigint = 20

    SELECT * FROM AC_TRN_STOCKHEADER 
    Order by HEADER_ID desc 
    OFFSET  (@Page-1) ROWS 
    FETCH NEXT @pageSize ROWS ONLY

-----==================================
-----Code to Create an index
CREATE NONCLUSTERED INDEX IDX_HEADER_ID ON YOUR_TABLE_NAME (KEY_FIELD_OF_TABLE)

ON THE ABOVE CODE "AC_TRN_STOCKHEADER" is my Table Name and "Header_ID" is my Key_FIELD
Hence,
CREATE NONCLUSTERED INDEX IDX_HEADER_ID ON AC_TRN_STOCKHEADER (Header_ID)

Надеюсь, это решит вашу проблему ..

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...