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

Oracle 19C 关于人工优化器统计

原创 Asher.HU 2021-02-04
833
要为优化器提供用户创建的统计信息以进行测试,可以使用以下DBMS_STATS.SET_*_STATS过程。这些过程为优化器提供了用于指定统计信息的人为值。


出于测试目的,您可以使用以下DBMS_STATS.SET_*_STATS过程为表,索引或系统手动创建人工统计信息

如果stattab为null,则DBMS_STATS.SET_*_STATS过程将人工统计信息直接插入数据字典中。或者,您可以指定用户创建的表。

警告:

DBMS_STATS.SET_*_STATS过程仅用于开发测试。不要在生产数据库中使用它们。如果在数据字典中设置统计信息,则Oracle数据库会将设置的统计信息视为“真实”统计信息,这意味着,当统计信息收集作业不符合陈旧性标准时,它们可能不会重新收集人工统计信息。

DBMS_STATS.SET_*_STATS过程的典型用例是:

  • 显示执行计划如何随着表中行数或块数的变化而变化

    例如,SET_TABLE_STATS可以将小型或空表中的行和块的数量设置为大量。当您使用更改的统计信息执行查询时,优化器可能会更改执行计划。例如,增加的行数可能导致优化器选择索引扫描而不是全表扫描。通过试验不同的值,您可以了解优化器如何随着时间的推移更改其执行计划。

  • 为临时表创建真实的统计信息

    您可能想查看在多个SQL语句中引用大型临时表时优化器的功能。您可以创建一个常规表,加载代表数据,然后用于GET_TABLE_STATS检索统计信息。创建临时表后,您可以通过调用来“欺骗”优化器以使用这些统计信息SET_TABLE_STATS

(可选)您可以为用户创建的表中的统计信息指定唯一的ID。SET_*_STATS过程具有相应的GET_*_STATS过程。

表15-3 DBMS_STATS设置优化器统计信息的过程

DBMS_STATS过程描述
SET_TABLE_STATS使用的参数,例如设定表或分区统计numrowsnumblksavgrlen

如果数据库使用“内存中列”存储,则可以设置im_imcu_count为表或分区中的IMCU数量,以及表或分区中im_block_count的块数。对于外部表,scanrate以MB /秒为单位指定数据扫描的速率。

优化器使用缓存的数据来估计用于索引或统计信息表访问的缓存块的数量。总成本是从磁盘读取数据块的I / O成本,从缓冲区高速缓存中读取缓存的块的CPU成本以及处理数据的CPU成本。

SET_COLUMN_STATS设置列统计使用的参数,如distcntdensitynullcnt,等。

在处理用户定义的统计信息的此过程的版本中,用于stattypname指定要存储在数据字典中的统计信息的类型。

SET_SYSTEM_STATS使用的参数,如设置系统的统计数据iotfrspeedsreadtimcpuspeed
SET_INDEX_STATS设置使用参数,如指数统计numrowsnumlblksavglblkclstfct,和indlevel

在处理用户定义的统计信息的此过程的版本中,用于stattypname指定要存储在数据字典中的统计信息的类型。

也可以看看:

Oracle Database PL / SQL软件包和类型参考,以了解有关DBMS_STATS.SET_TABLE_STATS设置优化器统计信息的更多信息和其他过程

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

评论