Рекомендации по настройке SQL Server за пределами индексации - PullRequest
0 голосов
/ 28 ноября 2018

Я имею дело с запросом SQL, который требует много самосоединяющихся таблиц для создания агрегатных функций, таких как следующие.

SELECT  
    tab1.foo, 
    tab1.bar, 
    tab1.baz, 
    tab1.bam/tab2.bam as bam_ratio, 
    RANK() OVER (PARTITION BY tab1.bar, tab1.baz ORDER BY tab1.foo DESC) RANK
FROM 
    (SELECT 
         foo, 
         bar, 
         baz, 
         bam
     FROM 
         OPENDATASOURCE(server).dbo.table1
     WHERE 
         qux = 1 AND quux = 'A' AND corge = 2) tab1
JOIN
    (SELECT 
         foo, 
         bar, 
         baz, 
         bam
     FROM 
         OPENDATASOURCE(server).dbo.table1
     WHERE 
         qux = 1 AND quux = 'B' AND corge = 2) tab2 ON tab1.bar = tab2.bar
                                                    AND tab1.baz = tab2.baz
                                                    AND tab1.foo = tab2.foo

Проблема в том, что в каждой из этих таблиц есть несколько столбцов, но десятки миллионов записей.Это создало уникальный случай, когда индексация не позволяет должным образом улучшить производительность (в приведенном выше запросе используется каждая строка в таблице 1).

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

Есть ли способы повысить производительность дальше, чем простое индексирование?Я готов изменить базовые таблицы и создать таблицы-сироты.

Ответы [ 2 ]

0 голосов
/ 30 ноября 2018

Одной из проблем производительности, которую вы можете улучшить, является объединение между серверами.Это происходит с OPENROWSET, связанными серверами и т. Д.

Самый простой способ уменьшить это - перенести данные в временные или промежуточные таблицы из удаленных источников данных.Это будет хранить данные локально в базе данных tempdb.Затем присоединитесь к временным таблицам.SQL Server автоматически создаст статистику для этих таблиц, что значительно улучшит вашу производительность, плюс данные будут локальными, но вы также можете добавить индексы для ускорения ваших объединений, если хотите.

0 голосов
/ 28 ноября 2018

Индексно вам нужно это на исходном сервере:

CREATE NONCLUSTERED INDEX IX_NC_table1_bar_baz_INC_FILT ON dbo.table1(bar, baz)
INCLUDE(foo, bam)
WHERE qux = 1 AND quux = 'B' AND corge = 2;

Тогда вы, вероятно, могли бы создать индексированное представление поверх него и создать SP с вычислением RANK () на поле источника.Как только у вас будет все это, вы просто позвоните ему, чтобы использовать ваши предварительно рассчитанные данные + обналиченный план для него.

ОБНОВЛЕНИЕ:

Таким образом, SP, созданный наполе назначения должно быть точной копией вашего оператора выбора из вышеперечисленного.Вы должны создать его на целевом сервере, чтобы план выполнения SP создавался и кэшировался, а ваша статистика использовалась для лучшей оптимизации ресурсов, что в целом способствовало повышению производительности.Если у вас есть этот SP, просто назовите его так:

DECLARE @SP_SQL VARCHAR(128);
SET @SP_SQL = 'EXEC [DB].[Schema].[SP_Name]'; --> from the target
EXEC (@SP_SQL) AT [Target_Server];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...