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