0

我有表示事件的开始和结束时间的表(存储为 DATE、TIMESTAMP 或 TIMESTAMP WITH TIME ZONE 格式),例如

MY_TABLE:
DATA       START           END  
A      1/11/2012 10:00    1/11/2012 12:00
B      2/12/2012 08:00    2/12/2012 16:00

而且它经常碰巧在一段时间内对这些表进行查询,例如

SELECT data
  FROM my_table
 WHERE start BETWEEN t1 AND t2; -- usually we either use start or end time for every row.

其中 t1 和 t2 是 DATE/TIMESTAMP 值 st t1<= t2。

由于这些查询将在大型表上运行,是否有更好的,即更有效的方式来执行上述查询?

目前我不知道是否有任何具有上述结构的表在任一时间数据列上都有索引,但添加它们仍然不是问题。它们在其他非时间相关的列上有索引。

我记得读过一些文章,使用分析函数(如分区)可以使这类查询比简单地使用 BETWEEN..AND 更有效。不幸的是,我再也找不到链接,也不知道分析功能,我在网上到处阅读了一些简短的介绍。

由于我没有多少时间进行调查,我想问您是否可以证实我的理论,以及您是否可以引导我找到与我的问题相关的示例。

不用说,我不是要您快速回答我的问题,要复制和粘贴的内容,只是提示您了解我是否在寻找正确的方向。

TIA

编辑: @jonearles:对于第一个陈述,我同意,但我想知道分析功能的使用是否实际上不能提供更有效的查询。

对于后者,是的,我的意思是 PARTITION BY 子句。在我看来,这是一个愚蠢的规范,因为预计分析函数将与 PARTITION BY 子句一起使用。我为混乱道歉,正如我之前所说,我没有深入研究这个主题。

4

1 回答 1

0

您的查询可能没问题。编写谓词的最简单方法通常是最好的。这正是 Oracle 所期望的,并且很可能是 Oracle 优化的目标。

您可能想研究创建对象以改进访问方法。特别是索引(如果您选择少量数据)和分区(如果您选择大量数据)。

“分区”在 Oracle 中至少可以表示三种不同的含义。也许您将分析函数中的“partition by”子句与分区混淆了?

于 2012-09-17T18:24:15.543 回答