使用日期字段提高查询执行的性能
Posted
技术标签:
【中文标题】使用日期字段提高查询执行的性能【英文标题】:Improve performance of query execution with Date field 【发布时间】:2013-10-15 10:05:14 【问题描述】:我们在生产环境中有 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
不会产生明显的效果。
任何想法如何调整或如何更改查询?
编辑
我们在该表中总共有大约 15 万条记录(生产 1 年)
大约 8% 的记录的条件 VAL_DAT is null
为真。
“INF_TYP”和“STATUS”的类型是 VARCHAR2(2 CHAR) 和 VARCHAR2(10 CHAR)。
【问题讨论】:
信息不足。你的表有多大(有多少行,平均行空间)?每个过滤器应该返回多少行? VAL_DAT=null 有多少行?索引的clustering_factor
是什么?
@Vincent 说了什么 + 条件 1 和条件 2 是什么?表上还有哪些其他索引?
我更新了问题。 @Vincent Malgrat 我现在不知道 clustering_factor 的价值,因为我现在没有索引。
【参考方案1】:
您可以尝试如下添加索引:
create index ...
on formx ( val_dat, 0)
因为 0 永远不会为空,所以即使是 val_dat 的空条目也会被索引。
如果 inf_typ 通常与 val_dat 一起用作条件,那么以 inf_typ 开头的复合索引将是一个不错的选择。您希望 inf_type 领先,因为 val_dat 上的谓词是一个范围:
create index ...
on formx ( inf_typ, val_dat)
【讨论】:
+1 做得很好。不知道这个。虽然很难理解;)(inf_typ, val_dat)
上的索引会产生同样的效果吗?
当然会,如果 inf_typ 被限制为非空。
inf_typ 被限制为非空以上是关于使用日期字段提高查询执行的性能的主要内容,如果未能解决你的问题,请参考以下文章