У меня есть таблица, содержащая около 640 м записей, и я пытаюсь создать индекс.
Я хочу выбирать записи примерно так:
index_i9(ORA_HASH(placard_bcd,128),event);
Однако это по-прежнему возвращает около 3-4 миллионов записей, и, судя по моему тестированию, это занимает много времени (~ 12 минут или около того).
Это плохая идея в качестве индекса? Я не думаю, что получение 3-4 миллионов записей должно занять так много времени.
Любые идеи?
Изменить (добавление дополнительной информации):
В таблице есть несколько столбцов, но я не знаю, нужно ли мне перечислять их все:
table_a
container NOT NULL NUMBER(19),
placard_bcd NOT NULL VARCHAR2(30),
event NOT NULL VARCHAR(5),
bin_number NUMBER(3),
...
...
Для возврата всех записей, которые будут возвращены на основе указанного выше индекса, требуется около 12 минут. Итак, чтобы предоставить мне все 3-4 миллиона записей.
Используемый запрос выглядит примерно так:
select barcode, event, bin_number
from table_a
where ora_hash(barcode,128) = 105;
and event in ('CLOS','PASG','BUILD');
Предоставленный план объяснения таков:
Plan hash value: 4185630329
-----------------------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
-----------------------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 35074 | 4212K| 338 (0)| 00:00:01 |
| 1 | INLIST ITERATOR | | | | | |
| 2 | TABLE ACCESS BY INDEX ROWID BATCHED| TABLE_A | 35074 | 4212K| 338 (0)| 00:00:01 |
|* 3 | INDEX RANGE SCAN | TABLE_A_I9 | 14030 | | 14 (0)| 00:00:01 |
-----------------------------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
3 - access(("EVENT_TYPE"='BUILD' OR "EVENT_TYPE"='CLOS' OR "EVENT_TYPE"='PASG') AND
ORA_HASH("PLACARD_BCD",128)=105)
Все кажется правильным, но все еще требуется время, чтобы предоставить мне записи.
Как вы думаете, сколько времени нужно, чтобы вернуть 3–4 миллиона записей? Кроме того, будьте ясны: когда вы говорите «возврат», вы имеете в виду время, затраченное на получение записи первый или записи 4 000 000-е?
Какой ваш SQL занимает 12 минут?
используется индекс? что раскрывает план объяснения? точно ли ваш предикат предложения where имитирует вызов функции этого индекса? (кстати: действительно не имеет смысла спрашивать нас о запросе и не отображать этот запрос в вопросе)
Выше я обновил план запроса, индекса и объяснения.
Как объявлены эти столбцы? Что они содержат? Чего вы пытаетесь достичь с помощью этого индекса? Похоже, это XY проблема.