我们在生产环境中安装了Oracle 11G R2。
我想提高1个查询的效果
select ....
from FORMX
where (INF_TYP =?)
AND (STATUS IN (?, ?, ?, ?, ?, ?))
AND ((VAL_DAT>=? OR VAL_DAT IS NULL));
VAL_DAT
列的类型为DATE
。
向VAL_DAT
添加索引并未产生明显效果。
任何想法如何调整或如何更改查询?
修改
我们在该表中共有约150K记录(1年生产)
条件VAL_DAT is null
适用于大约8%的记录。
'INF_TYP'和'STATUS'的类型是VARCHAR2(2 CHAR)和VARCHAR2(10 CHAR)。
答案 0 :(得分:5)
您可以尝试添加索引,如下所示:
create index ...
on formx ( val_dat, 0)
因为0永远不为null,所以即使是val_dat的空条目也将被编入索引。
如果inf_typ通常与val_dat一起用作条件,那么以inf_typ为首的复合索引将是一个不错的选择。你想要inf_type引导因为val_dat上的谓词是一个范围:
create index ...
on formx ( inf_typ, val_dat)