Я пытаюсь оптимизировать запрос подкачки для своего запроса с общим количеством записей в хранимой процедуре. Задайте оптимизированный запрос на разбиение на страницы, чтобы получить 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 '\'
это составной первичный ключ. Теперь я обновился в сообщении. Я упомянул некоторые важные столбцы в списке выбора из обеих таблиц. Но таблица Html содержит некоторые дополнительные столбцы. поэтому структура будет другой.





Что касается 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) определяет, сколько строк будет возвращено.
Я думаю, что мы не можем использовать один оператор выбора для моего запроса, потому что он содержит оператор объединения всех. Любой оптимизированный метод разбиения по страницам для этого оператора объединения всех с общим счетчиком.
Вы должны добавить ограничение Какие, которое есть у
pk_pdfи т. д. - вы просто говорите «ограничение» - не более того - что вы здесь пытаетесь создать ?? А почему у вас такой же состав две таблицы ?? В чем смысл?? Почему бы просто не использовать таблицу один и отделить PDF-файлы от HTML-файлов с помощью столбцаtype? Это сделало бы этот сумасшедший SELECT несколько проще!