我正在查询一个相当大的表,该表已按日期范围分区(由其他人),每天分成一个分区。平均每天有大约250,000条记录。经常查询将在几天内进行 - 通常查找一天,每周七天或一个日历月。现在查询超过2周的表现不佳 - 创建了正常的日期索引。如果我查询超过5天它没有使用索引,如果我使用索引提示它执行o.k.从大约5天到14天,但超出指数提示并没有多大帮助。
鉴于提示确实比优化器更好,我正在对表进行收集统计。
但是,我的问题是,一般来说,如果我想在表中的日期字段上创建索引,是否最好创建范围分区索引?是否最好创建一个范围索引,其每日范围类似于表分区?什么是最好的策略?
这是Oracle 11g。
谢谢,
答案 0 :(得分:0)
与您的问题相关,分区策略将取决于您将如何查询数据,最佳策略是查询尽可能少的分区。例如如果你要运行月度报告,你宁愿创建montly范围分区而不是每日范围分区。如果您的所有查询都是在几天内的数据周围,那么每日范围分区就可以了。
鉴于您在我的意见中提供的数字,您可以使用超分区数据。
P.S。查询每个分区需要额外的读取(比它只是一个分区),因此优化器选择完全访问表以减少索引的读取。
答案 1 :(得分:0)
尝试在日期列上创建全局索引。如果索引是分区的并且您选择-let说 - 14天,那么Oracle必须读取14个索引。在整个表上有一个索引,即"全局索引"它必须只读取1个索引。
注意,当您截断或删除分区时,您必须在之后重建索引。
答案 2 :(得分:0)
我猜测您可能正在编写SQL错误。
你说你按日期来查询。如果您的日期列具有时间部分,并且您希望从一天中的特定时间开始提取记录,例如20:00-21:00,然后是的,一个索引是有益的,我会推荐一个本地索引(按日分区,就像表一样)。
但是,由于您的查询跨越了几天,看起来情况并非如此,您只需要所有数据(可能会被其他一些属性过滤)。如果是这样,分区全扫描将始终比索引访问快得多...只要您从分区修剪中受益!因为如果不是 - 并且您实际上正在执行全表扫描 - 预计这将非常非常慢(在大多数情况下)。
那么可能出现什么问题?你在WHERE子句中使用简单日期吗?请注意:
SELECT * FROM trx WHERE trx_date = to_date('2014-04-03', 'YYYY-MM-DD');
只扫描一个分区,而:
SELECT * FROM trx WHERE trunc(trx_date) = to_date('2014-04-03', 'YYYY-MM-DD');
当您将函数应用于分区键时,将扫描所有分区,并且优化程序无法再确定要扫描的分区。
通过解释计划确定您是否提供了表定义,分区总数,示例数据和查询,这将更加容易。如果可能,请编辑您的问题并提供更多详细信息。