У меня есть запрос, который будет выполняться несколько раз с регулярным интервалом на таблице, которая может стать очень большой. Я хочу убедиться, что у меня есть индекс, который может обрабатывать мой запрос, чтобы сделать его быстрее. Я не очень хорошо знаком с индексами, но до сих пор у меня есть следующий запрос и индекс:Oracle - Как создать индекс таблицы для соответствия конкретному запросу?
update PERMISSION
SET EXPIRED_FLAG=1
where CASE WHEN VAL_END IS NULL THEN 1 ELSE 0 END =1
AND CURRENT_FLAG=1
AND SYSDATE+SUBSTR(TO_CHAR(SYSTIMESTAMP, 'TZR'),2,2)/24> VAL_START+30/1400
AND EXPIRED_FLAG=0;
Мой индекс выглядит следующим образом:
CREATE INDEX NDX_VAL_DB_CLOSE ON PERMISSION
(CURRENT_FLAG, CASE WHEN VAL_END IS NULL THEN 1 ELSE 0 END, CASE WHEN EXPIRED_FLAG=0 THEN EXPIRED_FLAG END)
PCTFREE 10
INITRANS 2
MAXTRANS 255
STORAGE (
INITIAL 1M
NEXT 1M
MAXSIZE UNLIMITED
MINEXTENTS 1
MAXEXTENTS UNLIMITED
PCTINCREASE 0
BUFFER_POOL DEFAULT
FLASH_CACHE DEFAULT
CELL_FLASH_CACHE DEFAULT
)
LOGGING
LOCAL (
PARTITION NDX_VAL_FKTICKET_ID_PRT1
LOGGING
NOCOMPRESS
TABLESPACE IDX_PRT_01
PCTFREE 10
INITRANS 2
MAXTRANS 255
STORAGE (
INITIAL 1M
NEXT 1M
MAXSIZE UNLIMITED
MINEXTENTS 1
MAXEXTENTS UNLIMITED
PCTINCREASE 0
FREELISTS 1
FREELIST GROUPS 1
BUFFER_POOL DEFAULT
FLASH_CACHE DEFAULT
CELL_FLASH_CACHE DEFAULT
),
PARTITION NDX_VAL_FKTICKET_ID_PRT2
LOGGING
NOCOMPRESS
TABLESPACE IDX_PRT_02
PCTFREE 10
INITRANS 2
MAXTRANS 255
STORAGE (
INITIAL 1M
NEXT 1M
MAXSIZE UNLIMITED
MINEXTENTS 1
MAXEXTENTS UNLIMITED
PCTINCREASE 0
FREELISTS 1
FREELIST GROUPS 1
BUFFER_POOL DEFAULT
FLASH_CACHE DEFAULT
CELL_FLASH_CACHE DEFAULT
)
)
NOPARALLEL;
План выполнения:
I хотите выяснить, действительно ли мой индекс соответствует запросу. Из рассмотрения плана выполнения выясняется, что мой индекс используется, но я не уверен на 100%, что условия индекса имеют смысл и полностью соответствуют запросу обновления. Есть ли что-нибудь, что я могу сделать с индексом, чтобы он действительно соответствовал запросу или все индексированные столбцы уже используются? (опять же, я совершенно новичок в индексировании, и это секционированная таблица, поэтому я немного потерян)
Насколько избирательны различные предикаты? Я предполагаю, что различные предикаты 1/0 не особенно избирательны, а 'val_start' является единственным разумно избирательным предикатом в запросе. То есть, я предполагаю, что предикат val_start сокращает количество строк, которые необходимо существенно обновить, а другие предикаты не делают много. Но это я догадываюсь - вы знаете свои данные. Как разделена таблица? –
В этой таблице большая часть записей будет иметь истекший флаг = 1, только один из немногих будет = 0, еще меньше будет> 30 минут. Что касается раздела на текущем флаге, который контролируется процессом, который я не слишком хорошо знаком, но по мере того как время идет, и добавляется больше записей, будет больше записей, которые будут перемещены во второй раздел с током = 0, а затем текущим = 1 в активном разделе, о котором я забочусь. –
Я предполагаю, что мой фактический вопрос здесь, делает ли этот индекс какой-либо смысл с учетом контекста запроса на обновление и все параметры (предикаты) фактически используются в показанном обновленном запросе. –