Лучший подход к разбивке страниц на 10 последних записей из 100 миллионов записей с предложением where в SQL серверной хранимой процедуре - PullRequest
0 голосов
/ 16 апреля 2020

У меня есть две таблицы с отношением один ко многим. В настоящее время таблица-1 имеет записи около 4,3 миллиона , а таблица-2 имеет записи около тройной таблицы-1. Структура таблиц показана ниже.

Table-1   
ID | Title | ...    
 1 | ABC   | ...

Table-2    
ID | Table-1-ID | Table-1-Entity-Type | Principal-ID   | Principal-Type | Entity-Deleted    
1  |      1     |          1          |       2        |       4        |          0    
2  |      1     |          1          |       6        |       6        |          0
3  |      1     |          1          |       7        |       8        |          0

Таблица-2 содержит минимум 2 или более записей для каждого идентификатора таблицы-1. Я отфильтровываю отдельные идентификаторы таблиц-1 из таблицы-2, проверяя основные типы или основные идентификаторы в подзапросе выбора. Затем извлекает результат из таблицы 1, проверяя идентификаторы таблиц в результате подзапроса. Для лучшего понимания смотрите запрос ниже. Значения, которые необходимо проверить в столбцах таблицы-2, поступают через входные параметры от пользователей.

В настоящее время после выполнения многих НИОКР я использую способ фильтрации идентификаторов таблицы-1 из таблицы-2: выгрузив значения входных параметров в временную таблицу определенного пользователем типа таблицы, а затем соедините таблицу 2 с этой временной таблицей в подзапросе.

DECLARE @PageNo BigInt = 100;
DECLARE @PageSize BigInt = 10;
DECLARE @PrincipalIDs nvarchar(Max) = '1,2,3,4,5'; //Input Parameter
DECLARE @PrincipalTypes nvarchar(MAX) = '0,1,2,4,5,6'; //Input Parameter

DECLARE @TempTable AS dbo.TempTable (This is User-Definied-Table-Type variable);

INSERT INTO @TempTable (PrincipalID)
   SELECT CAST(Item AS bigint) FROM dbo.SplitString(@PrincipalIDs, ',') 

INSERT INTO @TempTable (PrincipalType)
   SELECT CAST(Item AS bigint) FROM dbo.SplitString(@PrincipalTypes, ',')

SELECT * FROM Table-1
WHERE 
FREETEXT(Table-1.Title, 'ABC') ...///Table-1 has a full text search index for multiple columns 
AND
Table-1.ID in (SELECT Distinct Table-2.Table-1-ID,
                        FROM 
                        Table-2
                        JOIN @TempTable as TT 
                        ON
                        Table-2.Table-1-Entity-Type= 1
                        Where 
                        (
                           TT.PrincipalId IS NOT NULL AND Table-2.PrincipalId = TT.PrincipalId
                            OR 
                           TT.PrincipalType IS NOT NULL AND Table-2.PrincipalType = TT.PrincipalType
                        )
                        ORDER BY Table-2.Table-1-ID  //DESC/ASC as per user demand
                        OFFSET ((@PageNo  - 1) * @PageSize) ROWS
                        FETCH NEXT @PageSize ROWS ONLY
                     )
Order By Table-1.ID //DESC/ASC as per user demand And Order by will have cases for multiple columns order by

Поскольку записи представлены в миллионах, и мы показываем 10 записей на каждой странице в таблице в соответствии с требованием нашего клиента, поэтому мое требование заключается в том, чтобы, если пользователь переходит на страницу 40,0000 со страницы 1. Как я могу сделать свой запрос быстрым, чтобы он быстро возвращал запись страницы 40,0000 с надлежащей проверкой доступных записей для этого пользователя. Приведенный выше запрос быстро возвращает результат для начальных номеров страниц, но по мере увеличения номеров страниц запрос занимает много времени. то есть для страницы с номером 1000 он возвращает результат в 1 сек c, в течение 5000 3 сек. Я хочу получить более быстрый запрос, время возврата результата которого должно оставаться постоянным независимо от того, какой номер страницы я хочу go.

Или предложить мне лучший способ в соответствии с требованиями моего клиента, поскольку требование нашего клиента заключается в том, что если он у него миллионы записей, и он хочет go перейти на любую страницу, чтобы просмотреть запись этой страницы, я могу go легко или хочу найти запись из миллионов записей, я тоже могу это сделать.

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