Oracle 中范围查询的日期列索引?

gav*_*koa 4 performance index oracle select performance-tuning

我们有很多:

select count(*) from TBL where XDATE between ? and ? and FLD = ?;
Run Code Online (Sandbox Code Playgroud)

我们希望通过调整XDATE列(具有DATE类型)上的索引来提高性能。

什么类型的索引更适合DATE类型和条件之间

APC*_*APC 6

范围 - 特别是日期范围 - 可能很难调整。这之间有一个不同的词......

where xdate between date '2013-07-01' and date '2013-07-31'
Run Code Online (Sandbox Code Playgroud)

... 和这个 ...

where xdate between date '2003-07-01' and date '2013-07-31'
Run Code Online (Sandbox Code Playgroud)

您希望这两个查询完全不同的访问路径。索引对第一个有帮助,但对第二个可能是灾难性的(取决于所涉及的数据量)。

索引日期的另一个障碍涉及时间元素。如果xdate包含时间元素,那么每个日历日可能有 86400 个不同的值。在大多数情况下,当我们进行日期范围搜索时,我们希望获得当天的所有点击次数,而不考虑时间。

我们不能给出绝对的建议,因为你没有提供足够的细节,但我的一般建议是:

  1. 构建基于函数的索引,删除时间元素: create index tbl_xdate_idx on tbl(trunc(xdate))
  2. 调查索引压缩是否可以节省空间。压缩索引通常也表现得更好。但可能只有在日期不包括时间时才值得,这是 FBI 方法的另一个好处。哦,你需要企业版。
  3. 请记住,可能需要以不同方式处理跨越长范围的搜索。您如何做到这一点取决于您的应用程序的特性。

  • 感谢您指出 **tbl(trunc(xdate))** 和其他东西!+1 (2认同)