Регистрация занимает слишком много времени - PullRequest
1 голос
/ 24 февраля 2011

У меня есть этот запрос, который в Oracle занимает около 5 минут:

select t1.A,t2.B,t2.C,t2.D,t2.E 
from TABLE1 t1 join TABLE2 t2 
on t2.X = t1.Y 
where t1.F = <integer> 
and t2.G = <integer> 
and t1.H = <integer> 

t1 имеет 1,7 миллиона строк, а t2 имеет 31 миллион. У меня есть индексы на t2.X и t1.F. Попытался добавить индексы на t1.Y, t2.G и t1.H, но они не помогли. Любые идеи, как я могу улучшить производительность этого соединения?

1 Ответ

3 голосов
/ 24 февраля 2011

При рассмотрении всех задействованных полей индекс покрытия для каждой таблицы будет включать майские столбцы

t1: Y, F, H, A
t2: X, G, C, D, E

Насколько избирательны ЛЮБЫЕ критерии: t2.X, t2.G или t1.Y, t1.F, t1.H?

Если ни один из отдельных столбцов не является достаточно избирательным (в идеале 0,5% или менее), вы можете создать один или несколько покрывающих индексов, включающих несколько столбцов, например

t2 (G, X)
t1 (H, F, Y)

Примечание: Порядок столбцов в индексе очень важен - всегда ставьте сначала наиболее избирательный (тот, который делит данные столбца на самые разные наборы).

За счет хранилища вы можете сделать индекс COVER запросом, указав все необходимые столбцы в самом индексе.Это означает, что запрос вообще не должен возвращаться к данным таблицы.

create index ix_t2 on t2 (G,X) INCLUDE (C,D,E)
create index ix_t1 on t1 (H,F,Y) INCLUDE (A)

EDIT

Похоже, я вставил туда SQL Server DDL.В Oracle вам пришлось бы расширить индекс до значения t2 (G, X, C, D, E), но это увеличивает требования к избирательности для использования индекса, поскольку ключ индекса становится очень длинным.

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