2012-07-18 79 views
4

注意:Oracle 11gR2的标准版本(所以没有分区)Oracle实体化视图VS物理表

所以我必须建立一个工艺打造过含有约27万条记录的表报告。我面临的困境是,我无法在这张桌子上创建自己的索引,因为它是我们无法改变的第三方桌子。于是,我开始尝试使用Materialized视图,然后我可以创建自己的索引,或者物理表,这些表基本上只是根据需要截断和重新填充的重复项。

MAT视图的优势在于它基本上是从“Live”表中拉出来的,所以我不必担心差异,只要在使用前刷新它即可,问题在于刷新似乎需要大量的时间。然后,我决定尝试物理表方法,在那里我尝试截断和重新填充(大约10分钟),然后重建索引(这需要另外10次,给予或采取)....我也尝试更新只有“新”记录通过执行:

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

几乎需要10分钟也不管我的索引,排比等...

有没有人有处理这种数据量(这将继续增长),并发现一种性能良好且工作效率高的方法?

似乎一个视图不会这样做......所以我留下了这2个选项,因为我无法调整我的主表上的索引,所以任何提示建议将不胜感激......整个目的这个过程的目的是让事情“更快”地进行报告,但是不知何故我在某些领域获得了表现,鉴于我需要移动的数据量,我最终在别人中失败。是否有其他的选择除了:

  1. 截断/填充表,重建索引
  2. 填充从主表次级表,其中PK不存在
  3. 物化视图(刷新,重建索引)
  4. 视图,拉从直播表(没有新的索引)

在此先感谢您的任何建议.....

有没有人知道如果在第二个选项上执行插入操作时,如果执行“插入...选择”操作时执行“创建表格选择...”效果会比“插入...选择”效果更好,或者应该非常类似?

+2

您可以量化“大量时间”来刷新物化视图而不是使用物理表吗?你如何刷新物化视图?你正在做一个事务刷新(删除和插入)?或者你正在做一个截断和直接路径插入?你能在基表上创建一个物化视图日志,这样你就可以对物化视图进行增量刷新了吗? – 2012-07-18 13:14:22

+0

@JustinCave - 感谢您的回应!一般来说,刷新也需要花费10分钟以上,我简单地使用了以下内容:“DBMS_MVIEW.REFRESH(LIST =>'ASSUMPTION.GL_JLOG_UNBALANCED',PARALLELISM => 4);”...我对Oracle很新,所以如果有其他方法,请告诉我。实际上,在插入物理表之前禁用了日志记录(NOLOGGING),并使用了APPEND和并行提示,这些都有所帮助。在我的主表上启用日志记录是的,所以我怎么能像你建议的那样进行增量刷新?你能提供一个例子吗? – denisb 2012-07-18 14:00:27

+0

我不相信你无法制作索引。可以使索引与表中的不同模式。 – 2012-07-18 14:17:01

回答

0

“Create Table As Select”生成较小的撤销。这是一个优势。 当数据被“插入”时,索引也被保留,性能受到负面影响。

+0

与截断/直接路径nologging插入相比,CTAS的UNDO减少量相当小。 – 2012-12-05 10:33:52

1

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

如果您确实想要尝试index disable/rebuild,那么请尝试在没有查询并行性的情况下同时重建所有索引,因为只使用一次物理全扫描 - 其余扫描将为“寄生”因为他们会从内存中读取表格块。

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

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

此外,请考虑不分析报表。报告查询通常使用多个谓词,这些谓词使用传统的统计数据不能很好地估计,您必须依靠动态采样来获得良好的基数估计。