使用日期字段提高查询执行的性能

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 被限制为非空

以上是关于使用日期字段提高查询执行的性能的主要内容,如果未能解决你的问题,请参考以下文章

提高计算 MS-Access 中大型数据集 7 天滚动平均值的查询的性能

如何提高sql中的查询性能?

如何提高大型表上基于日期的查询性能?

使用子查询时如何提高查询性能

SQL 查询执行时间过长。需要提高查询的性能

如何提高oracle的查询速度