2013-09-20 4 views
0

У меня есть таблица с 226 миллионами строк, в которой есть столбец varchar2 (2000). Первые 10 символов индексируются с использованием функционального индекса SUBSTR("txtField",1,10).производительность функционального индекса oracle

Я бег такого запроса, как это:

select count(1) 
from myTable 
where SUBSTR("txtField",1,10) = 'ABCDEFGHIJ'; 

значение не существует в базе данных, так что возвращение в «0».

План объяснения показывает, что выполняемая операция представляет собой «INDEX (RANGE SCAN)», который я бы предположил, а стоимость - 4. Когда я запускаю этот запрос, он занимает в среднем 114 секунд.

Если изменить запрос и заставить его не использовать индекс:

select count(1) 
from myTable 
where SUBSTR("txtField",1,9) = 'ABCDEFGHI'; 

объяснить план показывает, операция будет «TABLE ACCESS (FULL)», который имеет смысл. Стоимость составляет 629 000. Когда я запускаю этот запрос, он занимает в среднем 103 секунды.

Я пытаюсь понять, как сканирование индекса может занять больше времени, чем чтение каждой записи в таблице и выполнение функции substr в поле.

Последующее наблюдение: В таблице указаны строки 230M +, и запрос возвращает 17 строк; Я выбрал новое значение, которое находится в базе данных. Первоначально я выполнял значение, которое не было в базе данных и возвращало нулевые строки. Кажется, не имеет значения.

Запрос информации о доходности индекса: CLUSTERING_FACTOR = 201808147 количество_листовых_блоков = 1131660

Я бегу запрос с AUTOTRACE ON и gather_plan_statistics и добавит те результаты, когда они доступны.

Спасибо за все предложения.

+0

Каков выходной сигнал, если вы вызываете 'SET AUTOTRACE ON' раньше? –

+1

Можете ли вы добавить точное определение своего индекса в свой вопрос? –

+1

«Count (1)» - то же, что и count (*), но не стандартный синтаксис для него. –

ответ

3

Существует множество возможностей.

Вы должны посмотреть на фактический план выполнения .

Вы можете выполнить запрос с /*+ gather_plan_statistics */ намеком, а затем выполнить:

select * from table(dbms_xplan.display_cursor(null, null, 'ALLSTATS LAST'));

Вы должны также изучить запуска трассировки/TKPROF, чтобы увидеть, что на самом деле происходит - администратор базы данных должен быть в состоянии помогите вам в этом.

+0

Вот синтаксис индекса: «создайте индекс myTable_IDX1 на myTable (SUBSTR (txtField, 1,10))» – user2799601

Смежные вопросы