gavenkoa Asked: 2013-08-03 01:45:48 +0800 CST2013-08-03 01:45:48 +0800 CST 2013-08-03 01:45:48 +0800 CST Oracle中范围查询的日期列索引? 772 我们有很多: select count(*) from TBL where XDATE between ? and ? and FLD = ?; 我们希望通过调整XDATE列(具有DATE类型)上的索引来提高性能。 什么类型的索引更适合DATE类型和条件之间? oracle index 2 个回答 Voted APC 2013-08-03T02:02:12+08:002013-08-03T02:02:12+08:00 范围——尤其是日期范围——可能很难调整。这之间有一个不同的词...... where xdate between date '2013-07-01' and date '2013-07-31' ... 和这个 ... where xdate between date '2003-07-01' and date '2013-07-31' 对于这两个查询,您可能需要完全不同的访问路径。索引将有助于第一个,但对于第二个可能是灾难性的(取决于所涉及的数据量)。 索引日期的另一个障碍与时间元素有关。如果xdate包含时间元素,那么每个日历日可能有 86400 个不同的值。在大多数情况下,当我们进行日期范围搜索时,我们想要当天的所有命中,而不考虑时间。 我们不能给出绝对的建议,因为您没有提供足够的细节,但我的一般建议是: 构建基于函数的索引,删除时间元素: create index tbl_xdate_idx on tbl(trunc(xdate)). 调查索引压缩是否会为您节省空间。压缩索引通常也表现更好。但如果日期不包括时间,这可能是值得的,这是 FBI 方法的另一个好处。哦,你需要企业版。 请记住,可能需要以不同方式处理跨越长范围的搜索。你如何做到这一点取决于你的应用程序的特性。 Best Answer Mindaugas Riauba 2013-08-03T02:57:23+08:002013-08-03T02:57:23+08:00 提供详细信息后,两列索引可能是明智的: CREATE INDEX tbl_index ON tbl(fld,xdate); 但当然,一切都取决于您的数据。 如果您的查询返回 >1% 的表全扫描,则很可能会更快。所以根本不需要创建索引 如果 FLD 的选择性不好,则 (xdate) 上的索引可能会达到类似的结果 每个索引都会增加 DML 操作的开销。除了更改数据,Oracle 还必须更改所有索引并将所有内容记录在重做日志中。 要收集数据,只需运行: 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 = ?; 并比较结果。或使用这些结果编辑您的问题。
范围——尤其是日期范围——可能很难调整。这之间有一个不同的词......
... 和这个 ...
对于这两个查询,您可能需要完全不同的访问路径。索引将有助于第一个,但对于第二个可能是灾难性的(取决于所涉及的数据量)。
索引日期的另一个障碍与时间元素有关。如果
xdate
包含时间元素,那么每个日历日可能有 86400 个不同的值。在大多数情况下,当我们进行日期范围搜索时,我们想要当天的所有命中,而不考虑时间。我们不能给出绝对的建议,因为您没有提供足够的细节,但我的一般建议是:
create index tbl_xdate_idx on tbl(trunc(xdate))
.提供详细信息后,两列索引可能是明智的:
CREATE INDEX tbl_index ON tbl(fld,xdate);
但当然,一切都取决于您的数据。
要收集数据,只需运行:
并比较结果。或使用这些结果编辑您的问题。