Я и ёжик
Member
Откуда: СПб
Сообщений: 1469
|
| ils | Вопрос такой Следует ли из порядка размещения таблиц в плане то, что для каждого значения индекса PK_PILOTBASE каждый раз происходит сканирование индекса PK_NUMBERBASE? И если да, то можно ли сделать наоборот, т.е. чтобы для каждого значения PK_NUMBERBASE происходил скан PK_PILOTBASE - поскольку таблица NUMBERBASE во много раз больше, чем PILOTBASE
Зараннее спасибо |
1) Оставьте оптимизатору право выбирать, что в каком порядке соединять. Ваша задача (или администратора базы) обеспечить оптимизатору корректную статистику.
2) С чего Вы взяли, что Ваш вариант соединения будет лучше? INDEX (UNIQUE SCAN) это не сканирование всех листьевых блоков индекса , а поиск нужного листа от головного блока индекса, т.е обычно около 3 операций чтения ( типичная глубина индекса 3).
Предположим, что PK_NUMBERBASE ( большой индекс) содержит ссылки на 100000 значений строк таблицы, и в один блок у нас влезает 100 пар значение-ссылка. т.е мы будем иметь 1000 листьевых блоков по 100 ключей в каждом.
В PK_PILOTBASE ( маленький индекс), так же условно, будем считать содержится 10000 ключей, т.е 100 листьевых блоков по 100 ключей.
В вашем варианте Oracle должен выполнить чтение ( INDEX FULL SCAN) 1000 листьевых блоков индекса PK_NUMBERBASE (multiblock-reads учитывать не будем) и для каждого из 100000 значения ключа выполнить 3 чтения (INDEX UNIQUE SCAN) блоков индекса PK_PILOTBASE для проверки есть ли там соответствующий ключ. Итого: 1000 + 100000*3 =301000 логических чтений.
В варианте, который выбрал оптимизатор, Oracle должен выполнить чтение 100 блоков индекса PK_PILOTBASE и для каждого из 10000 значения ключа выполнить 3 чтения блоков индекса PK_NUMBERBASE для проверки есть ли там соответствующий ключ. Итого: 100 + 10000*3= 30100 логических чтений.
Разница на порядок в пользу оптимизатора. |