首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Oracle中范围查询的日期列索引?

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

Database Administration用户
提问于 2013-08-02 09:45:48
回答 2查看 60.9K关注 0票数 4

我们有很多:

代码语言:javascript
复制
select count(*) from TBL where XDATE between ? and ? and FLD = ?;

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

哪种类型的索引更适合日期类型和之间的条件?

EN

回答 2

Database Administration用户

回答已采纳

发布于 2013-08-02 10:57:23

如果提供了详细信息,两列索引可能是合理的:

CREATE INDEX tbl_index ON tbl(fld,xdate);

但当然,一切都取决于你的数据。

  • 如果您的查询返回超过1%的表完整扫描,则最有可能会更快。所以根本不需要创建索引
  • 如果FLD的选择性较差,则索引on (xdate)可以获得类似的结果。
  • 每个索引都会增加DML操作的开销。除了更改数据之外,Oracle还必须更改所有索引,并记录重做日志中的所有内容。

要收集数据,只需运行:

代码语言:javascript
复制
select count(*) from TBL;
select count(*) from TBL where XDATE between ? and ?;
select count(*) from TBL where FLD = ?;
select count(*) from TBL where XDATE between ? and ? and FLD = ?;

并比较结果。或者用这些结果编辑你的问题。

票数 4
EN

Database Administration用户

发布于 2013-08-02 10:02:12

范围--特别是日期范围--可能很难调整。这是有区别的.

代码语言:javascript
复制
where xdate between date '2013-07-01' and date '2013-07-31'

..。而这个..。

代码语言:javascript
复制
where xdate between date '2003-07-01' and date '2013-07-31'

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

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

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

  1. 构建一个基于函数的索引,删除时间元素:create index tbl_xdate_idx on tbl(trunc(xdate))。
  2. 检查索引压缩是否会节省空间。压缩索引通常也表现得更好。但可能只有在日期不包括时间的情况下才有价值,这也是FBI方法的另一个好处。哦,你需要企业版。
  3. 请记住,跨越长范围的搜索可能需要以不同的方式处理。如何做到这一点取决于应用程序的特性。
票数 7
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/47462

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档