Я использую синтаксис OFFSET FETCH
, чтобы выполнить пагинацию в SQL Server для моего веб-приложения.
ПРИМЕЧАНИЕ : приложение имеет пользовательский интерфейс, в котором пользователь может строить свое представление, выбираястолбцы, эти столбцы могут ссылаться на значения.
Это прекрасно работает с простым оператором SQL, но становится очень медленным, если мои операторы SQL становятся слишком сложными.
Пример таблицыс 10k строк:
SELECT *
FROM
(SELECT TOP 100 PERCENT
id, title
FROM mytable) t
ORDER BY title
OFFSET 0 ROWS FETCH NEXT 5 ROWS ONLY;
Предположим, этот запрос занимает <1 с в SQL Server Management Studio. </p>
Теперь я начинаю реализовывать ссылочные таблицы в своем утверждении.
SELECT *
FROM
(SELECT TOP 100 PERCENT
id, title,
(SELECT value
FROM table_reference
WHERE id = ref_id) AS ref_value,
(SELECT value
FROM table_reference2
WHERE id = ref_id2) AS ref_value2
FROM
mytable) t
ORDER BY title
OFFSET 0 ROWS FETCH NEXT 5 ROWS ONLY;
Это все еще хорошо работает.
Теперь я использую ссылочные значения в моем предложении WHERE:
SELECT *
FROM
(SELECT TOP 100 PERCENT
id, title,
(SELECT value
FROM table_reference
WHERE id = ref_id) AS ref_value,
(SELECT value
FROM table_reference2
WHERE id = ref_id2) AS ref_value2
FROM
mytable) t
WHERE
ref_value LIKE '%something%'
ORDER BY title
OFFSET 0 ROWS FETCH NEXT 5 ROWS ONLY;
Теперь мой запрос идет от <1 с до 14 секунд. </p>
Что касается моих исследований в анализаторе запросов и в Интернете, я обнаружил, что OFFSET
- это проблема производительности, связанная с тем, как она работает.Большинство веб-информации хвалят FETCH OFFSET
как простую и быструю в использовании, но я не смог найти никакой подробной информации о узких местах и проблемах с производительностью.
Так как пользовательский интерфейс также позволяет определить, какие столбцы используются для "full likeПоиски: «Я ищу решение для управления способом использования этих значений, и все же нет, это не приводит к падению моей производительности.
Я думал о создании другого столбца, который содержит выбранное значение, но если ссылка меняет это значение,устарели.Кроме того, триггер не будет работать в ссылочной таблице для обновления, поскольку это становится сложным и не обслуживаемым.
Я никогда не смотрел на это, но могут ли вычисляемые столбцы быть опцией, чтобы проверить, работает ли это?Или любой другой хороший совет для этой конкретной проблемы?
Спасибо, Ив