我有一个大型数据库并使用如下查询:
...WHERE (DATETIME > '30.10.2014 00:00:00' AND DATETIME < '03.11.2014 00:00:00')
我的查询已经由字段DATETIME
排序,因此如果第一次到达DATETIME < '03.11.2014 00:00:00'
,是否可以中断查询,以便oracle不需要检查剩余的行,因为它们不是这需要安全的时间吗?
谢谢!
答案 0 :(得分:1)
这里基本上有3个选项(从最好到最差排序):
DATETIME
列之前创建所需的表分区,则优化器将仅扫描相关分区(范围为30.10.2014 00:00) :00-03.11.2014 00:00:00)而不是访问整个表格。DATETIME
列上创建索引。这样,在访问列时,您将扫描有序索引。此选项有一个主要缺点 - 如果插入此表的数据是“实时顺序数据”(我的意思是DATETIME
列值总是增加[sysdate
例如]而不是随机的[例如出生日期]),B-Tree索引上总会有 Hot Block 。这会导致争用,可能还有很多等待事件(当然,取决于数据插入率)。 “解决”这个问题的方法是创建这个索引颠倒,但是你会在范围上执行查询时遇到大问题(比如你在这里提出的查询),因为数据会分散跨越索引而不是按顺序存储。因此,我对这种情况的最佳建议 - 使用分区,这是有效处理Oracle数据库上大量数据的最佳方法。
如果此表上没有足够的数据来考虑分区,那么表格就不那么大了,您可以考虑选项#2,#3。
最好的问候。