Таблица не выполняет сканирование индекса

#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 = ‘том’?