4

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

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

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

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

无论我的索引、并行度等如何,这几乎都需要 10 分钟...

有没有人不得不处理如此大量的数据(这将继续增长)并找到一种性能良好且有效的方法?

似乎视图不行......所以我只剩下这两个选项,因为我无法调整我的主表上的索引,所以任何提示建议将不胜感激......这个过程的整个目的是为了让报告“更快”,但不知何故,我在某些领域获得了性能,但考虑到我需要移动的数据量,我最终会在其他领域失去。除了以下是否还有其他选择:

  1. 截断/填充表,重建索引
  2. 从不存在 PK 的主表填充辅助表
  3. 物化视图(刷新、重建索引)
  4. 从 Live 表中提取的视图(无新索引)

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

有谁知道如果我在第二个选项上进行插入时呈现我的索引并且这样不可用,或者它是否应该非常相似,那么执行“将表创建为选择...”是否比“插入...选择”表现更好?

4

2 回答 2

1

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

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

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

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

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

于 2012-12-05T10:31:21.877 回答
0

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

于 2012-12-05T10:10:25.567 回答