Oracle物化视图VS物理表

时间:2012-07-18 12:28:55

标签: database performance oracle oracle11g

注意:Oracle 11gR2标准版(所以没有分区)

因此,我必须构建一个流程,以便在包含大约2700万条记录的表中构建报告。我面临的困境是我无法在此表中创建自己的索引,因为它是我们无法改变的第三方表。所以,我开始尝试使用Materialized视图,然后我可以创建自己的索引,或者基本上只是一个副本的物理表,我会根据需要截断并重新填充。

MAT视图的优势在于它基本上是从“实时”表中提取的,所以只要我在使用前刷新它就不用担心差异,问题是刷新似乎需要很大多少时间。然后我决定尝试物理表方法,在那里我尝试截断并重新填充(大约10分钟),然后重建索引(需要另外10个,给予或接受)....我还尝试仅使用“新”记录进行更新通过执行:

INSERT... SELECT where NOT Exists (Select 1 from Table where PK = PK) 

无论我的索引,并行性等等,这几乎需要10分钟......

有没有人必须处理这些数据(这将继续增长)并找到一种表现良好并且有效工作的方法?

似乎一个视图不会....所以我留下了这两个选项,因为我无法调整我的主表上的索引,所以任何提示建议都将非常感谢...的全部目的这个过程是为了让报告“更快”,但不知怎的,我在某些方面获得了性能,但最终我会因为我需要移动的数据量而在其他方面失败。还有其他选择:

  1. 截断/填充表格,重建索引
  2. 从不存在PK的主表填充辅助表
  3. 物化视图(刷新,重建索引)
  4. 查看来自Live表(没有新索引)
  5. 的视图

    提前感谢任何建议......

    有没有人知道如果我在第二个选项上进行插入时,如果我渲染我的索引并且这样做不可用,那么执行“Create Table As Select ...”比“插入...选择”表现更好,还是应该公平相似?

2 个答案:

答案 0 :(得分:1)

我认为对于这种任务采用非常简单的方法有很多话要说。考虑在重复表上插入截断和直接路径(追加)而不禁用/重建索引,并在表上设置NOLOGGING。直接路径插入具有与之关联的索引维护机制,这可能比在加载后运行多个索引重建更有效,因为它在临时段中记录构建索引所需的数据,从而避免后续的多个全表扫描。

如果你想尝试使用索引禁用/重建,那么尝试同时重建所有索引而不进行查询并行,因为只使用一次物理全扫描 - 其余的扫描将是“寄生”的他们将从内存中读取表块。

加载重复表时,请考虑对select中的行进行排序,以便报表上常用的谓词能够访问较少的块。例如,如果您通常查询日期范围,请按日期列排序。请记住,可以在缩减的报表查询执行时间内恢复构建此报表的一些额外时间。

考虑压缩表格,但仅当您加载直接路径插入时,除非您有昂贵的高级压缩选项。索引压缩和位图索引也值得考虑。

另外,请考虑不分析报告表。报告查询通常使用多个谓词,这些谓词使用常规统计数据无法很好地估计,并且您无论如何都必须依靠动态抽样来获得良好的基数估算。

答案 1 :(得分:0)

“将表创建为选择”会生成较小的撤消。这是一个优势。 当“插入”数据时,也会保持索引并且性能受到负面影响。