Расширение ответа @ gbn .
Для таблицы такого размера вам определенно нужен индекс, который будет охватывать все выбранные столбцы.
Однако дляВ каждом столбце вы должны решить, хотите ли вы, чтобы он был ключевым столбцом или включенным столбцом в индексе.
Для этого выполните этот запрос:
SELECT SUM(CASE D1 WHEN 8 THEN 0 ELSE 1 END) / COUNT(*) AS D1Card,
SUM(CASE D2 WHEN 2 THEN 0 ELSE 1 END) / COUNT(*) / COUNT(DISTINCT D2) AS D2Card,
SUM(CASE D3 WHEN 5 THEN 0 ELSE 1 END) / COUNT(*) / COUNT(DISTINCT D3) AS D3Card,
SUM(CASE d4 WHEN 8 THEN 1 ELSE 0 END) / COUNT(DISTINCT D4) AS D4Card,
SUM(CASE d5 WHEN 2 THEN 1 ELSE 0 END) / COUNT(DISTINCT D5) AS D5Card,
SUM(CASE d6 WHEN 5 THEN 1 ELSE 0 END) / COUNT(DISTINCT D6) AS D6Card,
SUM(CASE d7 WHEN 5 THEN 1 ELSE 0 END) / COUNT(DISTINCT D7) AS D7Card,
SUM(CASE d8 WHEN 3 THEN 1 ELSE 0 END) / COUNT(DISTINCT D8) AS D8Card,
SUM(CASE d9 WHEN 4 THEN 1 ELSE 0 END) / COUNT(DISTINCT D9) AS D9Card,
SUM(CASE a WHEN 0 THEN 1 ELSE 0 END) / COUNT(DISTINCT A) AS ACard,
SUM(CASE Hb WHEN 0 THEN 1 ELSE 0 END) / COUNT(DISTINCT Hb) AS HbCard
FROM Mytable
Вы должны создать списокнаименее селективных столбцов (столбцов с самыми высокими значениями *Card
), которые (вместе) составляют более 25%
ваших записей.
Скажем, диаграмма избирательности по столбцам выглядит следующим образом:
Column Selectivity Cumulative selectivity
D4 0.96 0.96
D8 0.87 0.84
D9 0.85 0.70
D7 0.72 0.51
D6 0.65 0.33 -- here
D5 0.20 0.07
A 0.02 0.00
Hb 0.01 0.00
Это означает, что условия для столбцов d4, d8, d9, d7, d6
вместе соответствуют примерно 33%
ваших записей.
В этом случае нет необходимости использовать их в качестве ключевых столбцов.Вы должны создать индекс для других, выборочных столбцов и включить в индекс неселективные столбцы.
CREATE INDEX ix_mytable_filter ON (Hb, A, D5) INLCUDE (D1, D2, D3, D4, D6, D7, D8, D9)
Столбцы с фильтром неравенства всегда идут в раздел INCLUDE
.
Обратите внимание, что это только улучшит текущий запрос с заданными значениями фильтров.Если ваши фильтры являются произвольными, вам нужно будет использовать все фильтруемые по равенству столбцы в качестве ключей индекса.
Может также случиться, что такие условия, как [D1] <> 8
, включают в себя магические числа, и существует несколько записей длякоторого выполняется это условие.
В этом случае вы можете добавить вычисляемый столбец в определение вашей таблицы:
ALTER TABLE mytable ADD d1_ne_8 AS CASE D1 WHEN 8 THEN 0 ELSE 1 END
и добавить это выражение в индекс (с учетом приведенных выше правил).
Если вы сделаете это, вам придется использовать d1_ne_8 = 1
вместо d1 <> 8
.