#performance #oracle
#Производительность #Oracle
Вопрос:
Эй, парень, по какой-то причине моя таблица выполняет быстрое полное сканирование индекса.
вот мой запрос
SELECT bo.bid,cu.cid
FROM ass2master_booking bo, ass2master_customer cu
WHERE bo.cid = cu.cid
and rownum < 135000;
вот файл трассировки
SELECT bo.bid,cu.cid
FROM ass2master_booking bo, ass2master_customer cu
WHERE bo.cid = cu.cid
and rownum < 135000
call count cpu elapsed disk query current rows
------- ------ -------- ---------- ---------- ---------- ---------- ----------
Parse 1 0.00 0.00 0 0 0 0
Execute 2 0.00 0.00 0 0 0 0
Fetch 9001 0.19 0.41 387 2131 0 134999
------- ------ -------- ---------- ---------- ---------- ---------- ----------
total 9004 0.19 0.41 387 2131 0 134999
Misses in library cache during parse: 0
Optimizer mode: ALL_ROWS
Parsing user id: 5594
Rows Row Source Operation
------- ---------------------------------------------------
134999 COUNT STOPKEY (cr=2131 pr=387 pw=189 time=411804 us)
134999 HASH JOIN (cr=2131 pr=387 pw=189 time=276737 us)
150000 INDEX FAST FULL SCAN CUSTOMER_CID_IDX (cr=320 pr=315 pw=0 time=263 us)(object id 332052)
7412 TABLE ACCESS FULL ASS2MASTER_BOOKING (cr=1811 pr=44 pw=0 time=7566 us)
по сути, мне сказали добавить структуру к неструктурированным данным, мне дали 2 таблицы с 150 000 строк и определить, какая из следующих структур была лучшей.
- некластеризованный индекс
- кластеризованный индекс
- кластеризованный хэш
- неструктурированные данные.
И запрос, который я выбрал для тестирования, приведен выше.
Ответ №1:
Вы выбираете большую часть обеих таблиц, поэтому доступ к индексу не имеет смысла. (по крайней мере, oracle так считает)
Он использует быстрое полное сканирование индекса вместо полного доступа к таблице, потому что он находит все, что ему нужно (cu.cid) в индексе и не нуждается в таблице.
Я понятия не имею, что вы имеете в виду
некластеризованный индекс кластеризованный индекс хэш кластеризованных неструктурированных данных.
Обновить:
Я думаю, что эмпирическое правило, которое я использую:
Если вам нужно более 20% таблицы, я ожидаю полного сканирования таблицы. Если вам нужно менее 5% таблицы, я ожидаю какого-то доступа к индексу.
Одна из первых вещей, которые я делаю при настройке инструкции SQL, — это заглянуть в план выполнения и проверить количество строк, которые oracle ожидает получить обратно с каждого шага. Если эти цифры совершенно неверны, то план выполнения, вероятно, довольно плох.
Комментарии:
1. привет, Йенс, когда следует использовать индекс? когда вы выбираете конкретное значение в конкретной таблице? например, где customername = ‘том’?