写点什么

【YashanDB 知识库】YashanDB 获取统计信息

作者:YashanDB
  • 2025-01-17
    广东
  • 本文字数:1051 字

    阅读完需:约 3 分钟

本文内容来自 YashanDB 官网,原文内容请见 https://www.yashandb.com/newsinfo/7106885.html?templateId=1718516


在测试环境重现生产环境 SQL 语句执行计划问题时,需要使用生产环境相关表的统计信息模拟。


“变更产生风险”,更新统计信息之后,有些 SQL 语句的执行计划可能改变,可能变好,也可能变差,纠正 SQL 语句执行计划比较有效的手段之一是回退统计信息,这样需要保留一份统计信息的历史版本。


下面脚本可以从系统表中获取某表的相关统计信息,并生成更新统计信息的系统包调用,协助 DBA 完成上面工作。


ysgstats.sh


#!/bin/bash
#
# 生成更新统计信息的DBMS_STATS.SET_XXX_STATS调用语句,可用来保存表的统计信息版本
#
# 限制:owner及table name 被转换为大写,名字中包含小写字母不能生成相应语句
# 在YashanDB 23.2 版本适用,其它版本有可能不能正常工作
#

if [[ $# -lt 3 ]]; then
echo Example: ${0} sys/yasdb_123@0.0.0.0:1688 owner tableName
exit 1
fi

DBURL=${1}
owner=$(echo ${2}|tr 'a-z' 'A-Z')
tableName=$(echo ${3}|tr 'a-z' 'A-Z')

# 表统计信息
echo "-- Update statistics for table ${owner}.${tableName}"
yasql ${DBURL} -c "SELECT 'EXEC DBMS_STATS.SET_TABLE_STATS('''||owner||''','''||table_name||''','''||partition_name||''',' \
||num_rows||','||blocks||','||avg_row_len||');' FROM dba_tab_statistics WHERE owner='${owner}' AND table_name='${tableName}' AND partition_name IS NULL" \
|grep ${owner}
echo ""

# 索引统计信息
yasql ${DBURL} -c "SELECT 'EXEC DBMS_STATS.SET_INDEX_STATS('''||owner||''','''||index_name||''','''||partition_name||''',' \
||num_rows||','||leaf_blocks||','||distinct_keys||','||distinct_fkeys||','||avg_leaf_blocks_per_key||','||avg_data_blocks_per_key \
||','||clustering_factor||','||blevel||');' \
FROM dba_ind_statistics WHERE owner='${owner}' AND table_name='${tableName}' AND partition_name IS NULL" \
|grep ${owner}
echo ""

# 列统计信息
yasql ${DBURL} -c "SELECT 'EXEC DBMS_STATS.SET_COLUMN_STATS('''||owner||''','''||table_name||''','''||column_name||''','||''''',' \
||num_distinct||','||density||','||num_nulls||','||avg_col_len||');' \
FROM dba_tab_col_statistics WHERE owner='${owner}' AND table_name='${tableName}' " \
|grep ${owner}
echo ""
复制代码


发布于: 刚刚阅读数: 3
用户头像

YashanDB

关注

全自研国产新型大数据管理系统 2022-02-15 加入

还未添加个人简介

评论

发布
暂无评论
【YashanDB知识库】YashanDB获取统计信息_数据库_YashanDB_InfoQ写作社区