Oracle:对日期间隔的高效查询

时间:2012-09-17 16:33:49

标签: oracle datetime intervals

我有表格表示具有开始和结束时间的事件(存储为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值s.t. t1< = t2。

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

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

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

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

毋庸置疑,我不是要求你快速回答我的问题,复制和粘贴的东西,只是提示我是否正在朝着正确的方向前进。

TIA

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

对于后者,是的,我的意思是PARTITION BY子句。我发现这是一个愚蠢的规范,因为分析函数应该与PARTITION BY子句一起使用。 我为这种困惑道歉,正如我之前所说的那样,我没有深入研究这个主题。

1 个答案:

答案 0 :(得分:0)

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

您可能希望研究创建对象以改进访问方法。具体来说,indexes(如果您选择少量数据)和partitions(如果您选择了大量数据)。

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