Оптимизация запросов для пейджинга - PullRequest
0 голосов
/ 28 января 2020

У меня есть следующая хранимая процедура, и она работает нормально. Но я хочу реализовать внутренний пейджинг в операторах select, прежде чем переходить к внешнему пейджингу для табличного параметра, чтобы повысить производительность запросов в случае больших данных. Пожалуйста, объясните мне, как это сделать. Или есть какой-то другой подход для написания этой хранимой процедуры, который будет более эффективным.

Create PROCEDURE [dbo].[GetEventsAndNotesByAccountId]
    @AccountId INT ,
    @EventType VARCHAR(50) ,
    @IsLinkedAccountsNotes BIT,
    @ExcludedEvents VARCHAR(MAX) ,
    @Page INT ,
    @PageSize INT ,
    @SortOrderASC BIT = 1
AS
     SET NOCOUNT ON;  


    DECLARE @ExcludedEventsTable TABLE ( EventType VARCHAR(50) )

    DECLARE @input VARCHAR(MAX) = @ExcludedEvents,
            @str VARCHAR(50) = '',
            @ind INT = 0;

    IF ( @input IS NOT NULL )
        BEGIN 
            SET @ind = CHARINDEX(',', @input) 
            WHILE @ind > 0
                BEGIN 
                    SET @str = SUBSTRING(@input, 1, @ind - 1) 
                    SET @input = SUBSTRING(@input, @ind + 1, LEN(@input) - @ind) 
                    INSERT  INTO @ExcludedEventsTable
                    VALUES  ( @str ) 
                    SET @ind = CHARINDEX(',', @input) 
                END 
            SET @str = @input 
            INSERT  INTO @ExcludedEventsTable
            VALUES  ( @str ) 
        END

    SET @EventType = LTRIM(RTRIM(ISNULL(@EventType, '')));

    DECLARE @EventSet TABLE (
                                    RNo bigint,
                                    InteractionLoginName VARCHAR(50) ,
                                    InteractionUserName  VARCHAR(50),
                                    EventId bigint,
                                    Occurred datetime2(7),
                                    EventType VARCHAR(50),
                                    EventInfo nvarchar(max),
                                    [EventData] xml,
                                    Summary nvarchar(max)
                                    )   
    Insert into @EventSet 
    --SELECT * FROM (
    SELECT
        ROW_NUMBER() OVER(ORDER BY CASE WHEN @SortOrderASC = 1 THEN Occurred END ASC, CASE WHEN @SortOrderASC = 0 THEN Occurred END DESC) as RNo,
        u.loginName as InteractionLoginName,
        u.userName as InteractionUserName,
        e.EventId ,
        e.Occurred ,
        e.EventType ,
        e.EventInfo,
        e.EventData,
        e.Summary 
    FROM
        lat.events e
        INNER JOIN dbo.MasterEvents me ON me.EventId = e.EventId        
        LEFT JOIN dbo.Users u ON e.UserId = u.ID 
    WHERE
        me.AccountId = @AccountId 
        AND CASE WHEN @EventType = '' THEN @EventType ELSE e.EventType END = @EventType 
        AND e.EventType NOT IN ( SELECT EventType FROM @ExcludedEventsTable ) 
    --)R
        --WHERE RNo BETWEEN ((@Page - 1) * @PageSize) + 1  AND @Page * @PageSize

IF(@IsLinkedAccountsNotes = 1 AND (ISNULL(@EventType,'') != ''  AND @EventType != 'AccountNoteAdded'))
    BEGIN
            Insert into @EventSet
            --SELECT * FROM (
                SELECT
                    ROW_NUMBER() OVER(ORDER BY CASE WHEN @SortOrderASC = 1 THEN Occurred END ASC, CASE WHEN @SortOrderASC = 0 THEN Occurred END DESC) RNo,
                    u.loginName as InteractionLoginName,
                    u.userName as InteractionUserName,
                    e.EventId ,
                    e.Occurred ,
                    e.EventType ,
                    e.EventInfo,
                    e.EventData,
                    e.Summary 
                FROM
                    lat.events e
                    INNER JOIN dbo.MasterEvents me ON me.EventId = e.EventId        
                    LEFT JOIN dbo.Users u ON e.UserId = u.ID 
                WHERE       
                   e.EventType = 'AccountNoteAdded'    
                   AND me.AccountId IN (SELECT [number]
                                        FROM   dbo.Linking_LinkedAccounts
                                        WHERE  linked_number = @AccountId
                                               AND [number] <> @AccountId)
                    AND CASE WHEN @EventType = '' THEN @EventType ELSE e.EventType END = @EventType
                --)R
                    --WHERE RNo BETWEEN ((@Page - 1) * @PageSize) + 1  AND @Page * @PageSize        
   END
    SELECT * FROM (
        SELECT
                ROW_NUMBER() OVER(ORDER BY CASE WHEN @SortOrderASC = 1 THEN Occurred END ASC, CASE WHEN @SortOrderASC = 0 THEN Occurred END DESC) RNo,
                InteractionLoginName,
                InteractionUserName,
                EventId,
                Occurred,
                EventType,
                EventInfo,
                [EventData],
                Summary
            FROM 
                @EventSet
                )R3
                    WHERE 
                        RNo BETWEEN ((@Page - 1) * @PageSize) + 1  AND @Page * @PageSize 
...