暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 大型分区表上的增量统计信息

askTom 2017-04-24
353

问题描述

我们有一个报告数据库,每天从我们的生产数据库中克隆。源数据库是一个关键任务数据库,我们不能在其中进行任何更改 (不能为统计信息收集设置表首选项)。我们有一个范围分区表,它有600多个分区。
克隆后的每一天,我们都需要在此表上收集统计信息,以确保我们的SQL遵循最佳路径。这是我们的挑战。完整的统计数据收集需要3.5小时。每天很少有分区有新数据。

增量统计是不可能的,因为我们每天从源克隆数据库。源数据库未设置增量统计信息选项,我们无法更改此选项。

我正在考虑一个选项,它将有助于快速收集统计数据。

分区级别统计信息收集-仅适用于处于陈旧状态的分区-但是,如果我们遵循此方法,则不会更新全局统计信息。

有没有其他优雅的方法来做这个统计收集。我们只需要找到陈旧的parititons,然后在精益窗口中收集统计数据并更新全局统计数据。

更新 ****
Clone是来自源系统的所有数据文件的副本。然后,我们从源创建一个控制文件,然后在目标上重命名数据库并挂载数据库。
****


专家解答

由于您正在克隆文件,因此将统计信息完全复制在源节点上。所以我假设你说的是你的统计数据在源节点上是 “坏的” (其中 “坏的” 意味着它们不利于你的报告需求,但它们可以满足你的源节点需求。


基于此,这意味着您可以自由地对报告节点上的统计信息进行任何操作-因此,我的第一条建议是-停止 * 收集 * 如此多的统计信息。

我的意思是

a) 如果只有几个分区是陈旧的,只需在分区级别收集这些分区的统计信息。这应该是有效率的。

b) 大型分区表很少有其统计信息 * 分布 * 发生巨大变化。如果你的50亿行表有200不同的值 (比如) 一个位置列,那么明天,当有51亿行... 那么你可能 * 仍然 * 有200位置... 或者 * 也许 * 1更多。

因此,减少 * 收集 * 和更多 * 设置 * 统计信息,例如

-低不同的值列 (如上面的位置示例),设置一次并每6个月重新访问一次

-递增值 (时间戳、序列等)。简单-只需获取最大值并使用设置柱高水标的值即可。对于许多日期,您甚至不需要查询,因为hwm是 “今天”。

-num_rows-告诉您哪些分区已过时的相同信息 (xxx_tab_modepications) 显示添加了多少新行。用它来增加num_rows。

-块-您将已经有avg_row_len... 因此 'n' 新行可以轻松地映射到块增量中。

一旦分区表变得很大...它通常达到稳定状态。在 * 增长 * 方面不是稳定的,但是在数据分布和其中的数据模式方面是稳定的。为什么要让数据库烧掉几个小时的cpu来告诉你一些你已经知道的事情。

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论