Оптимизированный пейджинговый запрос в SQL Server - PullRequest
0 голосов
/ 30 декабря 2018

Я пытаюсь оптимизировать пейджинговый запрос для моего запроса с общим количеством записей в хранимой процедуре.Пожалуйста, дайте оптимизированный пейджинговый запрос для извлечения 25 записей на страницу из миллионов записей.

Команды DDL

create table pdf_details
(
     prodid nvarchar(100), 
     prodname nvarchar(100),
     lang nvarchar(100),
     fmt nvarchar(5),
     type varchar(2) 

     constraint pk_pdf Primary Key (proid, lang, fmt)
)

create table html_details
(
     prodid nvarchar(100),
     prodname nvarchar(100),
     lang nvarchar(100),
     fmt nvarchar(5),
     type varchar(2)

     constraint pk_html Primary Key(prodid, lang, fmt)
)

create index ix_pdf_details on pdf_details(prodname)

Образцы записей

insert into pdf_details 
values ('A100', 'X', 'EN', 'HM', 'PDF'),
       ('A100', 'X', 'JP', 'GM', 'PDF'),
       ('A100', 'X', 'EN', 'HM', 'PDF'),
       ('B101', 'Y', 'EN', 'HM', 'PDF');

insert into html_details 
values ('B100', 'X', 'EN', 'HM', 'HTML')
       ('B100', 'X', 'JP', 'GM', 'HTML')
       ('B100', 'X', 'EN', 'HM', 'HTML')
       ('C101', 'Y', 'EN', 'GH', 'HTML')

На самом деле эти таблицысодержат миллионы строк.

Исходный запрос

SELECT DISTINCT 
    TP.PRODID AS ID,
    TP.PRODNAME AS NAME,
    TP.LANG AS LANG,
    TP.FMT,
    TP.TYPE
FROM
    PDF_DETAILS TP
WHERE 
    TP.PRODID = @PRODID
    AND (@PRODUCTNAME IS NULL OR 
         REPLACE(REPLACE(REPLACE(REPLACE(TP.PRODNAME, '™', '|TM'), '®', '|TS'), '©', '|CP'), '°', '|DEG')
            LIKE REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(@PRODNAME, '[', '\['), '_', '\_'), '™', '|TM'), '®', '|TS'), '©', '|CP'), '°', '|DEG') ESCAPE '\' 

UNION ALL

SELECT DISTINCT 
    TP.PRODID AS ID,
    TP.PRODNAME AS NAME,
    TP.LANG AS LANG,
    TP.FMT,
    TP.TYPE
FROM 
    HTML_DETAILS TP
WHERE 
    TP.PRODID = @PRODID
    AND (@PRODUCTNAME IS NULL OR 
            REPLACE(REPLACE(REPLACE(REPLACE(TP.PRODNAME,'™','|TM'),'®','|TS'),'©','|CP'),'°','|DEG')
LIKE REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(@PRODNAME,'[','\['),'_','\_'),'™','|TM'),'®','|TS'),'©','|CP'),'°','|DEG') ESCAPE '\' 

1 Ответ

0 голосов
/ 30 декабря 2018

Начиная с SQL Server 2012 , вы можете использовать OFFSET ... FETCH подход к подкачке страниц - для вас Google, есть ТОНН замечательных статей об этом.

По сути, вы должны сделать что-то вроде этого:

SELECT (list-of-columns)
FROM YourTable
(optionally add JOINs here)
WHERE (conditions)
ORDER BY (some column)
      OFFSET n ROWS
      FETCH NEXT y ROWS ONLY

По сути, вы должны иметь ORDER BY (так как смещение / пропуск имеет смысл, только когда вы знаете, что ваши данные упорядочены), изатем вы можете определить с помощью предложения OFFSET (с фиксированным номером переменной SQL Server @offset), сколько строк (в указанном порядке) пропустить, а с помощью предложения FETCH NEXT (опять же с фиксированным номеромПеременная SQL Server @numrows) определяет, сколько строк будет возвращено.

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