У меня есть таблица с 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 и добавит те результаты, когда они доступны.
Спасибо за все предложения.
Каков выходной сигнал, если вы вызываете 'SET AUTOTRACE ON' раньше? –
Можете ли вы добавить точное определение своего индекса в свой вопрос? –
«Count (1)» - то же, что и count (*), но не стандартный синтаксис для него. –