【问题标题】: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 的价值,因为我现在没有索引。

标签: sql oracle oracle11gr2


【解决方案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 被限制为非空
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-06-13
  • 1970-01-01
  • 2020-06-20
  • 2017-02-26
  • 2018-12-16
  • 2016-07-19
  • 2017-06-18
相关资源
最近更新 更多