oracle - 运行 dbms_stats.gather_table_stats 时统计信息是否可用
问题描述
我正在研究 oracle11g。
有一个外部进程在给定表上运行 dbms_stats.gather_table_stats。更具体地说,它运行以下代码:
dbms_stats.gather_table_stats('STAGING','NEW_TRANSACTIONS',
estimate_percent => DBMS_STATS.AUTO_SAMPLE_SIZE,
cascade=>true, method_opt=> 'FOR ALL INDEXED COLUMNS SIZE 1',
NO_INVALIDATE=>FALSE,DEGREE=>8);
由于维护窗口在下午 6 点到 8 点,因此自动统计信息收集在该表上效果不佳,但该表在下午 12 点左右完全刷新,导致统计信息过时。因此,我们专门收集统计数据。
假设收集统计信息需要 60 秒。
如果在重新生成统计信息时对该表运行查询会发生什么?
以前的(陈旧的)统计信息在生成新的统计信息之前是否可用?还是 oracle 在启动 dbms_stats.gather_table_stats 时完全删除统计信息?
让我用这种方式重新表述这个问题:如果查询与 dbms_stats.gather_table_stats 并行运行,那么很可能会发生这种情况:
oracle 会使用先前/陈旧的统计信息来确定执行计划吗?从我的角度来看,这是可以接受的,因为数据的统计分布在大多数日子里都是相对恒定的,所以从 oracle 的角度来看,统计数据可能是陈旧的,但在实践中仍然足够好
没有可用的统计信息来设置正确的执行计划,基于成本的优化器在生成执行计划时会失明
解决方案
推荐阅读
- powershell - 从嵌套函数获取用户输入
- javascript - 了解事件时间戳的时间来源
- javascript - p5.js - 平滑变形随机形状
- python - 如何将 FileTransport 干净地添加到 Asyncio?
- reactjs - 使用 Refetch 和 apollo 重新渲染查询和组件
- c# - 检查字符串是否为特定日期格式
- c# - 将存储过程用于存储库模式和服务类
- php - Woocommerce 3中订单项目的产品属性空值
- ios - 如何在没有 segue 的情况下使用通知中心将数据从 FirstTableView 发送到 SecondTableView
- css - 当顶栏使用像素时,如何让侧边栏占据页面的 90%?