У меня есть следующая хранимая процедура, и она работает нормально. Но я хочу реализовать внутренний пейджинг в операторах 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