2016-09-07 5 views
0

У меня есть запрос, который будет выполняться несколько раз с регулярным интервалом на таблице, которая может стать очень большой. Я хочу убедиться, что у меня есть индекс, который может обрабатывать мой запрос, чтобы сделать его быстрее. Я не очень хорошо знаком с индексами, но до сих пор у меня есть следующий запрос и индекс: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; 

План выполнения:

enter image description here

I хотите выяснить, действительно ли мой индекс соответствует запросу. Из рассмотрения плана выполнения выясняется, что мой индекс используется, но я не уверен на 100%, что условия индекса имеют смысл и полностью соответствуют запросу обновления. Есть ли что-нибудь, что я могу сделать с индексом, чтобы он действительно соответствовал запросу или все индексированные столбцы уже используются? (опять же, я совершенно новичок в индексировании, и это секционированная таблица, поэтому я немного потерян)

+0

Насколько избирательны различные предикаты? Я предполагаю, что различные предикаты 1/0 не особенно избирательны, а 'val_start' является единственным разумно избирательным предикатом в запросе. То есть, я предполагаю, что предикат val_start сокращает количество строк, которые необходимо существенно обновить, а другие предикаты не делают много. Но это я догадываюсь - вы знаете свои данные. Как разделена таблица? –

+0

В этой таблице большая часть записей будет иметь истекший флаг = 1, только один из немногих будет = 0, еще меньше будет> 30 минут. Что касается раздела на текущем флаге, который контролируется процессом, который я не слишком хорошо знаком, но по мере того как время идет, и добавляется больше записей, будет больше записей, которые будут перемещены во второй раздел с током = 0, а затем текущим = 1 в активном разделе, о котором я забочусь. –

+0

Я предполагаю, что мой фактический вопрос здесь, делает ли этот индекс какой-либо смысл с учетом контекста запроса на обновление и все параметры (предикаты) фактически используются в показанном обновленном запросе. –

ответ

0

кажется, что ваш запрос использует вместо индекса (NDX_VAL_DB_CLOSE) другой индекс (NDX_PTP_DB_CLOSE). попробуйте использовать подсказку оптимизатора oracle с правильным индексом. если он не использует реструктуризацию запроса.

+0

Спасибо за это, вы правы, это была опечатка с моей стороны, индекс фактически использует NDX_VAL_DB_CLOSE сейчас (что то же самое, что и версия PTP, я просто переименовал ее) –