关于实时统计 oracle 19c 仅适用于特定表
Posted
技术标签:
【中文标题】关于实时统计 oracle 19c 仅适用于特定表【英文标题】:About real time statistics oracle 19c only for particular table 【发布时间】:2020-05-18 06:16:28 【问题描述】:Reg 实时统计数据将在线统计数据收集 (12c) 扩展到还包括传统的 DML 语句。 实时统计信息有助于优化器生成更优化的计划。批量加载操作收集所有必要的统计信息,而实时统计信息增加而不是取代传统统计信息。
Oracle 引入了新参数
_optimizer_gather_stats_on_conventional_dml
和 _optimizer_use_stats_on_conventional_dml
默认为真
_optimizer_stats_on_conventional_dml_sample_rate
100%
实时统计是如何工作的?
默认情况下,_optimizer_gather_stats_on_conventional_dml
为 true,因此它会自动启动
当 DML 操作当前正在修改表(常规)时,如果上述参数打开,Oracle 数据库会动态计算最重要的统计信息的值。
考虑一个有很多插入并且行在增加的表的例子。在插入行时,实时统计信息会跟踪不断增加的行数。如果优化器对新查询执行硬解析,则优化器可以使用实时统计信息来获得更准确的成本估算。
USER_TAB_COL_STATISTICS
和 USER_TAB_STATISITICS
有列 NOTES 告诉实时统计信息已被使用。 “STATS_ON_CONVENTIONAL_DML”。
执行计划展示
|Id| Operation | Name|Rows|Bytes|Cost (%CPU)|Time| Pstart|Pstop|
---------------------------------------------------------------------------------------
| 0| INSERT STATEMENT | | | |910 (100)| | | |
| 1| LOAD TABLE CONVENTIONAL |SALES| | | | | | |
| 2| OPTIMIZER STATISTICS GATHERING | |918K| 25M|910 (2)|00:00:01| | |
| 3| PARTITION RANGE ALL | |918K| 25M|910 (2)|00:00:01| 1 | 28 |
| 4| TABLE ACCESS FULL |SALES|918K| 25M|910 (2)|00:00:01| 1 | 28 |
Also the explain plan in the query used will tell in note section
Note
-----
- dynamic statistics used: stats for conventional DML
LOAD TABLE CONVENTIONAL
和OPTIMIZER STATISTICS GATHERING
是已添加到此新功能说明计划中的新参数。
我们可以只对一组特定的表应用实时统计信息吗?如果是,怎么做?
我们知道为超过 100k 行发生的任何 dml 操作获取实时统计数据是非常昂贵的操作
我试图找出路,但没有成功
【问题讨论】:
【参考方案1】:动态统计和实时统计不同。
注意OPTIMIZER STATISTICS GATHERING
实际上是一个12.1的执行计划操作,与实时统计无关,根据
Mike Dietrich blog。看起来 12.1 的在线统计功能已在 19c 中针对 Exadata 进行了修改,并重命名了实时统计。
根据licensing guide,只能在 Exadata 上使用实时统计信息:您无法在通常的 Entreprise Edition 数据库上获得实时统计信息。
您有可用的 Exadata 系统吗?如果不是,则无法测试此功能。
【讨论】:
即使我没有可用的 Exadataa 系统,我们也可以使用alter system set “_exadata_feature_on”=true scope=spfile;
进行更改。这里我的问题是我们可以只对单个表使用实时统计吗,我不想为我的整个数据库架构实现这个
好的,您可以使用这个未记录的参数测试 Exadata 功能。并且有可能在 19 版本中对一些新的 12.1 相关功能进行了重命名和修改。然而,根据文档,实时统计是一种自动功能。有一个提示 NO_GATHER_OPTIMIZER_STATISTICS
可以为特定查询禁用它,但我没有找到任何提示可以在查询或表级别启用它,也没有 DBMS_STATS 功能可以在表级别启用它。
我已经修改了关于在线统计和实时统计功能的答案。
是的,我也发现了相同的情况,但是在生产环境中我们有 1000 多个表,我们无法使用此提示 NO_GATHER_OPTIMIZER_STATISTICS
手动修改所有表的插入、删除、更新查询。那么,有没有其他方法可以提及表名,所以只有这些表才能应用这个新功能
如果您在使用此 Exadata 功能时确实存在生产问题,您应该使用 Oracle 支持。如果您想使用未记录的参数,您甚至应该更多地使用 Oracle 支持(如果没有 Oracle 支持的同意,您不应该在生产中使用未记录的参数,否则您的系统可能不受 Oracle 支持)。抱歉,我不能提供更多帮助。以上是关于关于实时统计 oracle 19c 仅适用于特定表的主要内容,如果未能解决你的问题,请参考以下文章
Postgres distinct union 仅适用于特定列
Oracle 19c - 手动升级到 Non-CDB Oracle Database 19c 的完整核对清单 (Doc ID 2577572.1)
Oracle 19c - 手动升级到 Non-CDB Oracle Database 19c 的完整核对清单 (Doc ID 2577572.1)