Oracle 使用dbms_stats.gather_table_stats来进行表analyse,网络表统计信 ...

打印 上一主题 下一主题

主题 801|帖子 801|积分 2403


一. 先容

DBMS_STATS.GATHER_TABLE_STATS 用于网络 表 级别的统计信息。这些统计信息有助于查询优化器优化查询筹划,影响与表自己相关的查询性能。
Oracle 查询优化器会根据表的统计信息来选择最优的执行筹划。当运行 DBMS_STATS.GATHER_TABLE_STATS 时,它会网络表的统计信息(例如:表的行数、列的基数、空值数目、数据分布等),这些信息会被存储在数据字典中。优化器使用这些统计信息来估算查询的成本,从而决定使用哪种执行筹划。
⭐可以提优化查询筹划,提升表的查询速度。
⏹注意事项


  • 如果表的数据量较大且数据分布发生了变化(如添加了很多新数据或删除了大量数据),则执行 DBMS_STATS.GATHER_TABLE_STATS 是必要的,才华包管优化器使用最新的表信息。
  • 频繁的统计信息更新并不总是有益的:如果你有稳定的数据负载而且查询性能已经稳定,频繁地网络统计信息大概不会显著改善性能,反而大概会增长系统负担。

二. 参数说明



  • ownname

    • 数据范例:VARCHAR2
    • schema名称,表的所有者

  • tabname

    • 数据范例:VARCHAR2
    • 要网络信息的表的名称

  • estimate_percent:

    • 数据范例:NUMBER
    • 用于估算样本的百分比(0 到 100),用于估算索引的统计信息。较低的百分比会减少网络时间,但大概会影响统计信息的准确性。
    • 默认值:DBMS_STATS.AUTO_SAMPLE_SIZE (主动选择样本大小)。

  • degree

    • 数据范例:NUMBER
    • 体现网络统计信息时要使用的并行度。如果设置为 0 或者省略,则不使用并行度。
    • 默认值:DBMS_STATS.DEFAULT_DEGREE(即通常不使用并行度)。

  • cascade

    • 数据范例:BOOLEAN
    • 是否网络索引表的统计信息。如果设置为 TRUE,则会在网络索引统计信息时,也网络该索引所在表的统计信息。
    • 默认值:FALSE

  • no_invalidate

    • 数据范例:BOOLEAN
    • 是否在网络统计信息后不使所有依赖此索引的查询筹划失效。如果设置为 TRUE,则不使查询筹划失效。

      • 当设置为 FALSE 时,网络统计信息后不会使现有的执行筹划失效。换句话说,如果索引统计信息有变化,优化器不会重新盘算查询的执行筹划。
      • 如果设置为 TRUE,则会使相关的执行筹划失效,并重新天生新的执行筹划。
      • 通常,设置为 FALSE 是比较安全的做法,避免不必要的性能颠簸。

    • 默认值:FALSE(使查询筹划失效)

  1. DBMS_STATS.GATHER_TABLE_STATS(
  2.     ownname => 参数值,
  3.     tabname => 参数值,
  4.     estimate_percent => 参数值,
  5.     degree => 参数值,
  6.     cascade => 参数值,
  7.     no_invalidate => 参数值
  8. );
复制代码

三. 简易封装

⏹新建一个table_stats_analyse.sql的sql脚本,封装dbms_stats.gather_table_stats方法


  • 通过传参的方式指定要网络信息的表名
  • 可以将要执行的sql脚本打印在控制台上
  • 参数

    • &&1:oracle数据库用户名
    • &&2:oracle数据库密码
    • &&3:tnsnames.ora文件中设置的service名称
    • &&4:表的所有者
    • &&5:表名

  1. set echo on
  2. set pagesize 1000
  3. set linesize 1000
  4. -- 启用 DBMS_OUTPUT ,打印指定内容到控制台
  5. set serveroutput on
  6. -- 定义错误code
  7. define ERR_CD = 2
  8. -- 设置回滚条件
  9. whenever sqlerror exit &ERR_CD rollback;
  10. whenever oserror exit &ERR_CD rollback;
  11. -- 连接数据库
  12. connect &&1/&&2@&&3
  13. DECLARE
  14.     v_sql_text         VARCHAR2(4000);
  15.     v_ownname          VARCHAR2(15) := '&&4';
  16.     v_tabname          VARCHAR2(50) := '&&5';
  17.     v_estimate_percent NUMBER := NVL(TO_NUMBER('&&6'), DBMS_STATS.AUTO_SAMPLE_SIZE);
  18.     v_degree           NUMBER := NVL(TO_NUMBER('&&7'), DBMS_STATS.DEFAULT_DEGREE);
  19. BEGIN
  20.     -- 拼接动态内容
  21.     v_sql_text := 'DBMS_STATS.GATHER_TABLE_STATS(' || CHR(10) ||
  22.                   '    ownname => ''' || v_ownname || ''',' || CHR(10) ||
  23.                   '    tabname => ''' || v_tabname || ''',' || CHR(10) ||
  24.                   '    estimate_percent => ' || v_estimate_percent || ',' || CHR(10) ||
  25.                   '    degree => ' || v_degree || ',' || CHR(10) ||
  26.                   '    cascade => TRUE,' || CHR(10) ||
  27.                   '    no_invalidate => FALSE' || CHR(10) ||
  28.                   ');';
  29.    
  30.     -- 打印到控制台
  31.         DBMS_OUTPUT.PUT_LINE('=========================================');
  32.     DBMS_OUTPUT.PUT_LINE('Executing SQL:');
  33.     DBMS_OUTPUT.PUT_LINE('=========================================');
  34.     DBMS_OUTPUT.PUT_LINE(v_sql_text);
  35.     DBMS_OUTPUT.PUT_LINE('=========================================');
  36.     -- 取得统计情报
  37.     DBMS_STATS.GATHER_TABLE_STATS(
  38.         ownname => v_ownname,
  39.         tabname => v_tabname,
  40.         estimate_percent => v_estimate_percent,
  41.         degree => v_degree,
  42.         cascade => TRUE,
  43.         no_invalidate => FALSE
  44.     );
  45. END;
  46. /
  47. -- 退出
  48. exit 0
复制代码

四. 效果

⏹sqlplus -S /nolog @/home/apluser/work/table_stats_analyse.sql db_user oracle SERVICE_XEPDB1_CLIENT db_user CHARGE_FIXED_WORK 10 16

⏹sqlplus -S /nolog @/home/apluser/work/table_stats_analyse.sql db_user oracle SERVICE_XEPDB1_CLIENT db_user CHARGE_FIXED_WORK

⏹在表analyse完之后,可以通过下面的SQL查看index索引的LAST_ANALYZED时间

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

小秦哥

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表