关于实时统计 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_STATISTICSUSER_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 CONVENTIONALOPTIMIZER 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 View 循环

Oracle 19c - 手动升级到 Non-CDB Oracle Database 19c 的完整核对清单 (Doc ID 2577572.1)

Oracle 19c - 手动升级到 Non-CDB Oracle Database 19c 的完整核对清单 (Doc ID 2577572.1)

Oracle 检查表的数据变动

为啥我的 charFormat 样式仅适用于选择,并且仅适用于特定方向的选择?