Повышение производительности запроса в представлении, которое ссылается на внешние таблицы - PullRequest
0 голосов
/ 13 июня 2018

У меня есть вид, который выглядит следующим образом:

CREATE VIEW My_View AS
SELECT * FROM My_Table UNION
SELECT * FROM My_External_Table

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

SELECT * FROM My_View 
ORDER BY My_Column
OFFSET 20 ROWS FETCH NEXT 20 ROWS ONLY

В отличие от этого следующий (бесполезный) запрос занимает менее 2 секунд:

SELECT * FROM My_View 
ORDER BY GETDATE()
OFFSET 20 ROWS FETCH NEXT 20 ROWS ONLY

Я не могу добавитьиндексирует представление, поскольку оно не является SCHEMABOUND, и я не могу сделать его SCHEMABOUND, так как оно ссылается на внешнюю таблицу.

Есть ли способ улучшить производительность запроса или иным образом получить желаемый результат.Все задействованные базы данных являются AzureSQL.

Ответы [ 2 ]

0 голосов
/ 13 июня 2018

Если все элементы уникальны в My_table и My_external_table, использование OUTER UNION поможет вам улучшить производительность.

И добавление индекса в таблицу поможет ускорить ваш запрос.

0 голосов
/ 13 июня 2018

Вы действительно не можете обойти order by, поэтому я не думаю, что вы можете что-то сделать.

Я немного удивлен, что order by getdate() работает, потому что упорядочение по константеобычно не работает.Я предполагаю, что это эквивалентно order by (select null), и заказ не происходит.

Моя рекомендация?Вероятно, вам необходимо скопировать внешнюю таблицу в локальной системе и создать процесс для создания новой локальной таблицы.Это звучит сложно, но вы можете сделать это, используя материализованное представление .Однако это работает с «внешней» таблицей, зависит от того, что вы подразумеваете под «внешним».

Обратите внимание, что вам также понадобится индекс на my_column, чтобы избежать сортировки.

...