SQL Server использует FETCH OFFSET со сложными операторами - PullRequest
0 голосов
/ 03 января 2019

Я использую синтаксис 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Поиски: «Я ищу решение для управления способом использования этих значений, и все же нет, это не приводит к падению моей производительности.

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

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

Спасибо, Ив

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