Oracle - 如何创建 table 索引以匹配特定查询?
Oracle - How to create a table index to match a specific query?
我有一个查询将 运行 在 table 上定期 运行 多次,它有可能变得非常大。我想确保我有一个索引可以处理我的查询以使其更快。我对索引不是很熟悉,但到目前为止我有以下查询和索引:
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;
执行计划:
我想弄清楚我的索引是否确实与查询匹配。从执行计划来看,我的索引似乎正在被使用,但我不能 100% 确定索引的条件是否有意义并完全匹配更新查询。我可以对索引做些什么来让它与查询实际匹配,还是所有索引列都已被使用? (同样,我对索引完全陌生,这是一个分区 table 所以我有点迷茫)
您的查询似乎使用了另一个索引 (NDX_PTP_DB_CLOSE) 来代替您的索引 (NDX_VAL_DB_CLOSE)。尝试使用具有正确索引的 oracle 优化器提示。如果它不使用重组查询。
我有一个查询将 运行 在 table 上定期 运行 多次,它有可能变得非常大。我想确保我有一个索引可以处理我的查询以使其更快。我对索引不是很熟悉,但到目前为止我有以下查询和索引:
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;
执行计划:
我想弄清楚我的索引是否确实与查询匹配。从执行计划来看,我的索引似乎正在被使用,但我不能 100% 确定索引的条件是否有意义并完全匹配更新查询。我可以对索引做些什么来让它与查询实际匹配,还是所有索引列都已被使用? (同样,我对索引完全陌生,这是一个分区 table 所以我有点迷茫)
您的查询似乎使用了另一个索引 (NDX_PTP_DB_CLOSE) 来代替您的索引 (NDX_VAL_DB_CLOSE)。尝试使用具有正确索引的 oracle 优化器提示。如果它不使用重组查询。