【发布时间】:2010-07-14 15:42:14
【问题描述】:
我正在处理具有3008698 行的表
exam_date 是一个 DATE 字段。
但我运行的查询只想匹配月份部分。所以我要做的是:
select * from my_big_table where to_number(to_char(exam_date, 'MM')) = 5;
我认为这需要很长时间,因为该列上的功能。有没有办法避免这种情况并使其更快?除了更改表格?表中的exam_date 具有不同的日期值。比如 01-OCT-10 或 12-OCT-10...等等
【问题讨论】:
-
你上面的 SQL 和 harpo 的 SQL 的计划会有所帮助。确保您的表格统计信息是最新的
-
基本问题,但该表实际上是否有关于exam_date 的索引? (在进行范围检查时您的表现不同的事实表明确实如此)。 APC 关于全表扫描的评论很重要 - 如果您的数据均匀分布在 12 个月内,并且您需要返回 3008698 行的 1/12,则全表扫描可能是最好的 - 还有大量数据。加快全扫描速度的一种方法是查看 Oracle 的 /*+ PARALLEL */ 提示(它将全扫描划分到你的 CPU 上)——但需要重新组装结果的成本。
标签: oracle optimization date