Oracle - 如何创建表索引以匹配特定查询?

时间:2016-09-07 18:34:17

标签: oracle indexing partitioning sql-execution-plan

我有一个查询会在一个有可能变得非常大的表上定期运行多次。我想确保我有一个索引可以处理我的查询,使其更快。我对索引不是很熟悉,但到目前为止我有以下查询和索引:

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

我想知道我的索引是否与查询匹配。从查看执行计划看来我的索引正在被使用,但我并不是100%确定索引的条件有意义并且完全匹配更新查询。我可以对索引执行任何操作以使其与查询实际匹配,或者是否已使用所有已建立索引的列? (再次,我完全是索引的新手,这是一个分区表,所以我有点迷路)

1 个答案:

答案 0 :(得分:0)

您的查询似乎使用另一个索引(NDX_PTP_DB_CLOSE)代替您的索引(NDX_VAL_DB_CLOSE)。尝试使用正确索引的oracle优化器提示。如果它不使用重组查询。