Oracle 9i. У нас есть большая таблица (~ 1 млн строк), содержащая наш контент, который содержит столбцы заголовка и автора. Мы хотели бы написать представления, которые предлагают навигацию A-Z для заголовков и авторов к этому контенту (A: 1300, B: 45000, ...)
Сначала немного подготовки без индексации:
select * from content where substr(upper(title),0,1) = 'M'
работает немного лучше, чем
select * from content where upper(title) LIKE 'M%'
ExPlan для тех:
TABLE ACCESS content FULL Cost=1624
оба довольно быстрые, даже без индексов. Теперь медленная часть:
select count(*) from CONTENT WHERE substr(upper(TITLE),0,1) = 'A';
ExPlan:
SORT AGGREGATE else like above.
Теперь кумуляция (это то, что мы хотим, это очень медленно):
select substr(upper(title),0,1) , count(*) from content group by substr(upper(title),0,1);
ExPlan:
SORT: GROUP BY COST=8069 / TABLE ACCESS on CONTENT FULL COST=1624
Итак, я начал создавать функциональный индекс:
create index CONTENT_TITLE_LETTER_IDX on CONTENT(substr(upper(TITLE),0,1));
Это значительно ускоряет запрос количества букв:
select count(*) from CONTENT WHERE substr(upper(TITLE),0,1) = 'A';
ExPlan (он отвечает почти в реальном времени):
SORT AGGREGATE COST=1 / INDEX CONTENT_TITLE_LETTER_IDX RANGE SCAN COST=1
Но запрос кумуляции, который в основном запрашивает одно и то же, не использует индекс (он показывает тот же План объяснения, что и выше). Я попробовал подсказку:
select /*+ index(CONTENT CONTENT_TITLE_LETTER_IDX) */ substr(upper(title),0,1) , count(*) from content group by substr(upper(title),0,1);
но это все еще очень медленно. Я предполагаю, что это может быть связано с неупорядоченным индексом, но я предполагаю, что даже если бы я запустил цикл вокруг всех 26 возможных букв, один запрос (= 'буква') был бы быстрее!
Кто знает, как заставить Oracle использовать этот индекс (или альтернативный способ, кроме создания столбцов или таблиц с одним символом)?