Запрос:Почему этот запрос выполняет полное сканирование таблицы?
SELECT tbl1.*
FROM tbl1
JOIN tbl2
ON (tbl1.t1_pk = tbl2.t2_fk_t1_pk
AND tbl2.t2_strt_dt <= sysdate
AND tbl2.t2_end_dt >= sysdate)
JOIN tbl3 on (tbl3.t3_pk = tbl2.t2_fk_t3_pk
AND tbl3.t3_lkup_1 = 2577304
AND tbl3.t3_lkup_2 = 1220833)
where tbl2.t2_lkup_1 = 1020000002981587;
Факты:
- Oracle XE
- tbl1.t1_pk является первичным ключом.
- tbl2.t2_fk_t1_pk - это внешний ключ в этом столбце t1_pk.
- tbl2.t2_lkup_1 индексируется.
- tbl3.t3_pk является первичным ключом.
- tbl2.t2_fk_t3_pk - это внешний ключ в этом столбце t3_pk.
Объяснить план на базе данных с 11000 строк в tbl1 и 3500 строк в tbl2 показывает, что он делает полное сканирование таблицы на tbl1. Мне кажется, что он должен быть быстрее, если он может сделать индексный запрос на tbl1.
Объясните план базы данных с 11 000 строк в tbl1 и 3500 строк в . Tbl2 показывает, что он выполняет полное сканирование таблицы на tbl1. Мне кажется, что он должен быть быстрее, если он может сделать индексный запрос на tbl1.
Обновление: Я попробовал подсказку, предложенную некоторыми из вас, и стоимость объяснения стала намного хуже! Теперь я действительно смущен.
Дальнейшее обновление: Наконец, я получил доступ к копии производственной базы данных, и «план объяснения» показал ее с использованием индексов и с гораздо более низкой стоимостью запроса . Я думаю, что больше данных (более 100 000 строк в tbl1 и 50 000 строк в tbl2) были для того, чтобы заставить его решить, что индексы стоят того. Спасибо всем, кто помог. Я все еще думаю, что настройка производительности Oracle - это черное искусство, но я рад, что некоторые из вас это понимают.
Дальнейшее обновление: я обновил вопрос по просьбе моего бывшего работодателя. Им не нравятся имена их таблиц, отображаемые в запросах Google. Я должен был знать лучше.
Какой-то садист выбирает имена таблиц и столбцов? Или это результат обфускатора кода? –
Это не совсем «полный» план объяснений. AutoTrace в SQLPlus дает намного больше информации. –
Вот некоторые из худших имен таблиц, которые я видел через некоторое время. – Kibbee