达梦8常用性能优化相关SQL

2023-11-13

一、内存性能相关

1.1 查看数据库当前运行内存大小

select
(select sum(n_pages * page_size)/1024/1024 from v$bufferpool)||'MB' as BUFFER_SIZE,
(select sum(total_size)/1024/1024 from v$mem_pool)||'MB' as mem_pool,
(select sum(n_pages * page_size)/1024/1024 from v$bufferpool)+(select sum(total_size)/1024/1024 from v$mem_pool)||'MB' as TOTAL_SIZE
from  dual;

1.2 数据库系统运行过程中,大内存sql

select SQL_TEXT,MEM_USED_BY_K,FINISH_TIME,N_RUNS
from V$SYSTEM_LARGE_MEM_SQLS
order by mem_used_by_k desc limit 5;

1.3 正在执行的SQL使用内存大小

SELECT SESSID, MAX_MEM_USED,SQL_TXT
FROM V$SQL_STAT
order by MAX_MEM_USED DESC limit 5;

1.4 共享内存池大小(以M为单位)

select sum(total_size)/1024/1024 as mem_pool from v$mem_pool;

1.5 系统缓冲区大小(以M为单位)

select sum(n_pages * page_size)/1024/1024 as BUFFER_SIZE from v$bufferpool;

1.6 监控内存池

select name, 
       is_shared, 
       is_overflow, 
       org_size/1024.0/1024.0, 
       TOTAL_size/1024.0/1024.0, 
       RESERVED_SIZE/1024.0/1024.0,
       DATA_SIZE/1024.0/1024.0, 
       EXTEND_SIZE, 
       TARGET_SIZE, 
       N_EXTEND_NORMAL , 
       N_EXTEND_EXCLUSIVE 
from v$mem_pool 
order by TOTAL_size desc limit 5;

org_size/1024.0/1024.0 --内存池初始大小
TOTAL_size/1024.0/1024.0 --内存池总大小(包括扩展的) 
RESERVED_SIZE/1024.0/1024.0 --当前已分配大小(包括扩展的) 
DATA_SIZE/1024.0/1024.0 --实际有效字节

关注如下:
N_EXTEND_EXCLUSIVE 如果长期大于 0,说明长期从池外扩展,可能存在内存泄露,需要重点关注。
若 RESERVED_SIZE 比 org_size 小,说明内存池非常空闲,可以减小对应的初始内存,避免浪费。
若 TOTAL_size 比 TARGET_SIZE 大,说明内存池不够,经常向池外申请,需要把对应参数调大。

二、阻塞相关

2.1 查看数据库阻塞情况

SELECT SYSDATE STATTIME,DATEDIFF(SS,S1.LAST_SEND_TIME,SYSDATE) SS,
	'被阻塞的信息'   WT,S1.SESS_ID WT_SESS_ID,S1.SQL_TEXT WT_SQL_TEXT,S1.STATE WT_STATE,S1.TRX_ID WT_TRX_ID,
	S1.USER_NAME WT_USER_NAME,S1.CLNT_IP WT_CLNT_IP,S1.APPNAME WT_APPNAME,S1.LAST_SEND_TIME WT_LAST_SEND_TIME,
	'引起阻塞的信息' FM,S2.SESS_ID FM_SESS_ID,S2.SQL_TEXT FM_SQL_TEXT,S2.STATE FM_STATE,S2.TRX_ID FM_TRX_ID,
	S2.USER_NAME FM_USER_NAME,S2.CLNT_IP FM_CLNT_IP,S2.APPNAME FM_APPNAME,S2.LAST_SEND_TIME FM_LAST_SEND_TIME
 FROM V$SESSIONS S1,V$SESSIONS S2,V$TRXWAIT W
 WHERE S1.TRX_ID=W.ID
   AND S2.TRX_ID=W.WAIT_FOR_ID;

三、会话相关

查看当前活动会话时,若当前活动会话连接数量太大,则说明数据库当前可能存在以下异常情况: 当前业务繁忙,业务量太大;当前系统中存在慢 SQL;应用的重连机制存在缺陷

查看当前非活动会话时,若当前非活动会话连接数量太大,说明数据库可能存在以下情况: 系统当前处于会话空闲期;连接池会话上线设置过高;应用释放连接机制存在异常。

3.1 查看当前活动会话信息

select * from V$SESSIONS where STATE='ACTIVE';
select count(*) from v$sessions where state='ACTIVE';
select count(*) from v$sessions where state='IDLE';
select count(*),substr(clnt_ip,8,20),state from v$sessions group by substr(clnt_ip,8,20),state

3.2 会话使用内存总量排序

SELECT
A.CREATOR ,
B.SQL_TEXT ,
SUM(A.TOTAL_SIZE)/1024/1024||'MB' TOTAL_SIZE, --当前总量(包括扩展)
SUM(A.DATA_SIZE) /1024/1024||'MB' DATA_SIZE --实际使用量
FROM
V$MEM_POOL A,
V$SESSIONS B
WHERE
A.CREATOR = B.THRD_ID
GROUP BY
A.CREATOR,
B.SQL_TEXT
ORDER BY
TOTAL_SIZE DESC;

3.3 当前使用内存过多的SQL

SELECT MAX_MEM_USED/1024||'MB' as MAX_MEM_USED, SQL_TXT 
FROM V$SQL_STAT 
order by MAX_MEM_USED DESC;

3.4 查看当前活跃会话的session信息

Select
'sP_close_session('
||sess_id
||');' ,
datediff(ss, last_recv_time, sysdate) ss ,
cast(sf_get_session_sql(sess_id) as varchar) sql,
*
from
v$sessions
where
state='ACTIVE'
order by
last_send_time

四、慢SQL

4.1 查看系统启动以来执行时间最长的10条SQL

SELECT TOP 10 START_TIME,TIME_USED/1000 TIME_USED,TOP_SQL_TEXT
FROM V$SQL_HISTORY
ORDER BY TIME_USED DESC; 

4.2 查看慢SQL

SELECT * FROM V$SYSTEM_LONG_EXEC_SQLS ORDER BY EXEC_TIME DESC;

4.3 查找出活动会话中执行时间大于 1S 的 SQL

select * from (
select timestampdiff(second,s.last_recv_time,sysdate) t ,s.* 
from v$sessions s  where state='ACTIVE')
where t > 1

4.4 最近一个小时已经执行过的最慢语句TOP20

有的时候某条SQL执行时间很短,毫秒级,收录不到v$long_exec_sqls视图里。但执行次数多,对系统造成的影响很大。这样的SQL应该优先进行优化。下面的语句显示最近一个小时内累计执行时间最多的SQL,统计SQL执行次数,单次执行时间,累计执行时间,累计执行时间占总时间的比例。

with SQL_HISTORY
as
(
select a.*
from v$sql_history a,v$session_history b
where a.START_TIME > sysdate - 1.0/24
and a.sess_id=b.sess_id and a.sess_seq=b.sess_seq
and b.user_name='SYSDBA' 
)
select sql_id,substr(top_sql_text,1,35)  || decode(substr(top_sql_text,36,1),'','',' .....') sql_text,sec_to_time(round((sum(time_used)+0.0)/1000000,3)) sql_time_total,
round((sum(time_used)+0.0) * 100/(select sum(time_used) from SQL_HISTORY ),2) "RATIO %",
count(*) sql_execs,sec_to_time(round((sum(time_used)+0.0)/count(*)/1000000,5)) sql_time_per_exec,(min(time_used)+0.0)/1000000 second_min,(max(time_used)+0.0)/1000000 second_max
from SQL_HISTORY
group by sql_id,top_sql_text
order by 4 desc limit 20;

4.5 当前正在执行的最慢语句TOP20

v$long_exec_sqls、v$system_long_exec_sqls还有v$sql_history都只能显示已经执行完的语句。如果某条语句一直没有执行完,则无法统计到。这时就需要下面的语句

select clnt_ip,sec_to_time(datediff(ss,last_send_time,sysdate)) elapsed,appname,user_name,RUN_STATUS,sql_id,sql_text,last_send_time
from v$sessions where state in ('ACTIVE','WAIT')
order by elapsed desc
limit 20

4.6 统计最慢的SQL的执行节点耗时

可以分析出最慢的SQL中最耗时的执行节点

with SQL_HISTORY
as
(
select a.*
from v$sql_history a,v$session_history b
where a.START_TIME > sysdate - 1.0/24
and a.sess_id=b.sess_id and a.sess_seq=b.sess_seq
and b.user_name='SYSDBA' 
)
select a.sql_id,substr(a.top_sql_text,1,35)  || decode(substr(a.top_sql_text,36,1),'','',' .....') sql_text,
a.name,node_time_used/1000000.0 node_time,
a.execs,sql_time_used/1000000.0 sql_time,b.execs,
round(node_time_used*100.0/sql_time_used,2) "ratio %"
from
(select sql_id,top_sql_text,name,sum(b.time_used) node_time_used,count(*) execs
from SQL_HISTORY a,v$sql_node_history b,v$sql_node_name c
where  a.exec_id=b.exec_id and b.type$=c.type$
group by sql_id,top_sql_text,name
) a,
(
select sql_id,top_sql_text,sum(time_used) sql_time_used,count(*) execs
from SQL_HISTORY
group by sql_id,top_sql_text
) b
where a.sql_id=b.sql_id 
order by 4 desc 
limit 20

五、操作系统相关

5.1 查询占用cpu最多的线程

ps -eLo pcpu,pmem,pid,tid,psr,wchan:14,comm|grep DM进程号 |sort

六、诊断相关SQL

6.1 找到对应SQL的内存中的执行计划

select * from v$cachepln where upper(sqlstr) like '%SQL%';
#trace文件生成在data目录下的trace目录中
ALTER SESSION SET EVENTS 'IMMEDIATE TRACE NAME PLNDUMP,LEVEL 9658337440';

6.2 导出数据库内全部缓存的执行计划

select  'ALTER SESSION SET EVENTS ''IMMEDIATE TRACE NAME PLNDUMP,LEVEL '||cache_item||''';'  from v$cachepln ;

6.3 清空数据库执行计划缓存

select cache_item,sqlstr from v$cachepln
where sqlstr like '%insert into test2 select%' and sqlstr not like '%cachepln%';

call sp_clear_plan_cache();
#不加 pln 就是清理所有 sql 缓存
call sp_clear_plan_cache(pln号);

6.4 如何使用 DBMS_SQLTUNE 包获取 SQL 执行信息

DBMS_SQLTUNE 包提供一系列对实时 SQL 监控的方法。当 SQL 监控功能开启后,DBMS_SQLTUNE 包可以实时监控 SQL 执行过程中的信息,包括:执行时间、执行代价、执行用户、统计信息等情况。SQL 监控功能开启的方法是将 DM.INI 参数 ENABLE_MONITOR 和 MONITOR_SQL_EXEC 均设置为 1。

SQL> sf_set_session_para_value('MONITOR_SQL_EXEC',1);
SQL> set autotrace traceonly
SQL> select * from test;
已用时间: 0.195(毫秒). 执行号:57103.
SQL> set autotrace off
SQL> set long 99999
SQL> select dbms_sqltune.report_sql_monitor(sql_exec_id=>57103);

七、统计信息相关

7.1 收集表的统计信息

dbms_stats.gather_TABLE_stats('SYSDBA','TEST',NULL,100,TRUE,'FOR ALL COLUMNS SIZE AUTO');

7.2 统计信息查看

dbms_stats.table_stats_show('SYSDBA','TEST');
dbms_stats.column_stats_show('SYSDBA','TEST','NAME');
dbms_stats.index_stats_show('SYSDBA','IND_TEST');

7.3 清除统计信息

DBMS_STATS.DELETE_TABLE_STATS('SYSDBA','TEST')

八、HINT相关

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

达梦8常用性能优化相关SQL 的相关文章

  • 如何将数据插入 Microsoft Access 数据库?

    我正在尝试将数据插入 Microsoft Access 数据库 我将数据插入到 Access 数据库中 但只有第一次和第二次显示我插入的数据 当我重建应用程序时 我插入的数据消失了 我不知道他们去了哪里并且没有出现 我使用 C 和 NET
  • 使用外部硬盘写入和存储 mysql 数据库

    我已经设置了 mysql 数据库在我的 Mac 上使用 java 和 eclipse 运行 它运行得很好 但现在我将生成大约 43 亿行数据 这将占用大约 64GB 的数据 我存储了大量的密钥和加密值 我有一个 1TB 外部我想用作存储位置
  • MS-Access 查询中的语法错误(缺少运算符)

    以下查询给了我 missing operator 语法错误 所需的输出是表中数据的组合 dbo tbl 和意见 vw 我用过的所有钥匙都存在 有任何想法吗 SELECT dbo tbl BOD fpartno AS PartNumber d
  • Camel Sql 大型数据集的消费者性能

    我正在尝试在 Ignite 缓存中缓存一些静态数据 以便更快地查询 因此我需要从 DataBase 读取数据 以便将它们插入到缓存集群中 但是行数约为 300 万 通常会导致 OutOfMemory 错误 因为 SqlComponent 试
  • SQL分组和总结

    我的表如下所示 income date productid invoiceid customerid 300 2015 01 01 A 1234551 1 300 2016 01 02 A 1234552 1 300 2016 01 03
  • 仅使用 SQL 中的 MAX 函数更新重复行

    我有一张这样的桌子 假设为了举例 NAME是一个唯一的标识符 NAME AGE VALUE Jack Under 65 3 Jack 66 74 5 John 66 74 7 John Over 75 9 Gill 25 35 11 Som
  • 在 Oracle 中创建数据库链接时出错

    我有两个数据库 需要编写跨数据库查询 所以我试图创建一个数据库链接 CREATE PUBLIC DATABASE LINK DBLink CONNECT TO SchemaName IDENTIFIED BY 123 using DBNam
  • 在 Oracle SQL 中执行 MERGE 时,如何更新 SOURCE 中不匹配的行?

    我有一个main数据库和一个report数据库 我需要同步一个表main into report 但是 当项目在main数据库 我只想设置一个IsDeleted标志在report数据库 执行此操作的优雅方法是什么 我目前正在使用 MERGE
  • 在 C# 中多次使用单个参数的更好方法

    我刚开始使用准备好的语句从数据库查询数据 并且在实现 C 参数 特别是 OracleParameters 时遇到问题 假设我有以下 SQL string sql select from table1 t1 table2 t2 where t
  • 产品和变体 - 设计数据库的最佳方法

    描述 商店可以有产品 鞋子 T 恤等 每个产品可以有许多变体 每个变体可以有不同的价格和库存 例如T 恤有不同的颜色和尺寸 颜色 蓝色 尺寸 L 价格 10 美元 库存 5 颜色 蓝色 尺寸 XL 价格 10 美元 库存 10 颜色 白色
  • 数据库不存在。确保名称输入正确

    为什么我会出现这个错误 如果您查看屏幕截图 您将看到数据库 仅当我连接到两个数据库引擎时才会发生这种情况 它仅检测下面数据库引擎中的数据库 而不检测突出显示的数据库 除了关闭应用程序并仅打开一个数据库引擎之外 还有其他方法可以使用我的数据库
  • PDO 库比本机 MySQL 函数更快吗?

    我已经阅读了几个与此相关的问题 但我担心它们可能已经过时 因为自这些问题得到解答以来 更新版本的 PDO 库已经发布 我编写了一个 MySQL 类 它构建查询并转义参数 然后根据查询返回结果 目前这个类正在使用内置的mysql函数 我很清楚
  • SQL:将现有列设置为 MySQL 中的主键

    我有一个包含 3 列的数据库 id name somethingelse 该表没有设置索引 我收到 未定义索引 在 phpmyadmin 中id 是一个 7 位字母数字值 每行都是唯一的 我想将 Drugid 设置为主键 索引 我不知道有没
  • 使用子查询与 LEFT JOIN 一起选择 MAX 值

    我有一个获取搜索结果的查询 效果很好 查询成功示例 SELECT individuals individual id individuals unique id TIMESTAMPDIFF YEAR individuals day of b
  • 将 copyfromrecordset 写入范围

    我有以下 vba 它从单元格 C10 开始读取 MCO 直到其为空 并将从 SQL 数据库获取机器数量 解密和升级机器数量 这工作正常 但我在获取相应行中的数据时遇到问题 目前它总是将数据写入 D10 因为我已经对其进行了硬编码 但我不确定
  • MS Access:在列中搜索星号/星号

    我正在寻找一种方法来搜索包含字符串数据类型的列 问题是星号或星号是保留符号 以下查询无法正常工作 select from users where instr pattern 如何编写 Access 查询来搜索列中的星号 您可以使用方括号在
  • 如何使用 SQL Server 查询对“版本号”列进行排序

    我想知道我们当中的 SQL 天才是否可以向我伸出援助之手 我有一个专栏VersionNo在表中Versions包含 版本号 值 例如 VersionNo 1 2 3 1 1 10 3 1 1 4 7 2 etc 我正在寻找对此进行排序 但不
  • 如何更改 Amazon Redshift 中的默认时区?

    默认情况下将时间戳列设置为 SYSDATE 将其存储为UTC 是否可以更改时区 以便 SYSDATE 将日期和时间存储到不同的时区 到目前为止 我已经检查了SET http docs aws amazon com redshift late
  • sqlite 插入表中 select * from

    我需要在 Android 应用程序中将数据从一个表移动到另一个表 我想使用以下sql insert into MYTABLE2 select id STATUS risposta DATETIME now data ins from MYT
  • 在单个查询中设置和选择?

    我想知道是否可以在单个查询中设置和选择 像这样的事情 SET LOCAL search path TO 1 SET LOCAL ROLE user SELECT from posts 你可以这样做 with some set as sele

随机推荐

  • 50 亿观众的 “云上奥运”,顶级媒体背后的数智化力量

    东京 2020 奥运会即将闭幕 本届奥运会由于疫情限制 东京地区赛事以无观众的空场形式举行 在无法亲临现场的情况下 全球观众首次以 云上 方式观看奥运 云上奥运 该如何保证赛事的生动性和现场感 缩短观众与赛场之间的距离 随时随地捕捉精彩赛事
  • pydantic学习与使用-8.required-fields必填字段省略号( ...)

    前言 必填字段可以仅用注释来声明 也可以使用省略号 作为值 必填字段 必填字段 可以仅用注释来声明 以下name和age2个字段是必填字段 from pydantic import BaseModel class User BaseMode
  • 社区团购的运营模式是什么?

    社区团购是一种近年来兴起的新型电商模式 它通过社区的力量 以线上线下联动的方式将消费者聚集起来 以优惠的价格和更好的商品为社区居民提供服务 这种模式能够更好地满足社区居民的需求 并且可以有效地提高社区居民的生活质量 运营模式主要分为以下几个
  • 不懂23种设计模式?别灰心,这份核心笔记来帮你,你想知道的都在这里!

    设计模式是软件工程中各种常见问题的经典解决方案 设计模式不只是代码 而是组织代码的方式 假设一行行的代码是砖 设计模式就是蓝图 什么是设计模式 设计模式是解决问题的一种思想 和语言无关 在面向对象软件设计的工程中 针对特定的问题简洁优雅的一
  • Java实现五子棋小游戏(附思路讲解,全部代码,游戏截图)

    本文章是如何实现一个单机版双人五子棋小游戏 通过Swing技术进行可视操作 个人简介 个人主页 码云不秃头 本人是一名大三学生 马上就要变成考研狗啦 通过一学期对Java学习 经过老师的教学 实现单机版的双人五子棋小游戏 大家互相学习 也同
  • 一个web app有多主题,多环境

    在一个web app应用中 需要有多个运行环境 并且每个运行环境主题也是不一样 本项目解决方案 import http es6 ruanyifeng com docs module import ES6 import 可以动态加载 可以利用
  • Extjs入门

    1 什么是Extjs Ext JS 是一个强大的JavaScript类库 提供了丰富且美观的UI组件 和easyUI类似 但更强大 因而使用了Ext JS 您需要写的代码基本上是JavaScript 不需要写HTML 它主要用于创建前端用户
  • LLM推理部署(一):LLM七种推理服务框架总结

    自从ChatGPT发布以来 国内外的开源大模型如雨后春笋般成长 但是对于很多企业和个人从头训练预训练模型不太现实 即使微调开源大模型也捉襟见肘 那么直接部署这些开源大模型服务于企业业务将会有很大的前景 本文将介绍七中主流的LLM推理和服务开
  • 数字电路和模拟电路-10时序逻辑电路的分析和设计

    前言 学习同步时序逻辑电路的分析 设计 一 同步时序逻辑电路的分析 1 时序逻辑电路的分析步骤 步骤一 逻辑图 同步or异步 计数器or状态机 一条总线同步 多条总线是异步 计数器无输入 状态机有输入 状态机还分摩尔型和米里型 步骤二 驱动
  • zotero配置

    1 下载安装 2 配置坚果云同步 编辑 首选项 同步 输入zotero账户密码进行数据同步 文件同步选择坚果云同步 3 配置茉莉花插件 安装pdftk
  • C++-函数模板特化如何避免重复定义

    本文转自 https www cnblogs com dracohan p 3401660 html 转来收藏以便查阅 感谢原作者 另一篇相关博文 https blog csdn net shixin 0125 article detail
  • 【Tensorflow 2.12 电影推荐系统之排序模型】

    Tensorflow 2 12 电影推荐系统之排序模型 学习笔记 导入相关模块 准备数据 加载数据 数据预处理 获取词汇表 构建模型 定义评分排序模型 定义损失函数以及模型评估指标 定义完整的评分排序模型 训练和评估 创建排序模型实例 缓存
  • 2022年大厂Android高级面试题分享,安卓Apk安装过程

    现在的IT行业竞争压力越来越大 尤其是Android开发行业 而很多Android程序员却每天都在重复CRUD 原地徘徊 今年年初 你就想改变现状 于是在网上刷了大量面试题 强行记下之后 开始参加面试 但是你发现 现在的面试 却越来越难了
  • 2017.03 JAVA 面试题 中高级

    2017年3月份 从北京跳槽来到深圳 各种面试 面试的大部分公司都发了offer 现整理出面试的问答题目 如下 一 基础知识 1 集合类 List和Set比较 各自的子类比较 ArrayList Vector LinkedList Hash
  • angular 跨平台&dom操作&组件嵌套&投影

    angular 跨平台 angular 是跨平台的 不仅仅可以再pc端运行 anulgar 为跨平台做的工作 为了能够支持跨平台 Angular 通过抽象层封装了不同平台的差异 比如定义了抽象类 Renderer2 抽象类 RootRend
  • 小程序base64 图片for循环多个展示不了_微信小程序基础之一

    1 微信小程序在wxss中不能直接引用图片 微信小程序在wxss中使用背景图片会报错 渲染层网络层错误 pages demo demo wxss 中的本地资源图片无法通过 WXSS 获取 可以使用网络图片 或者 base64 或者使用
  • Anaconada 几个系统基本命令

    1 python 命令加入系统路径 找出 anaconada 安装路径 打开系统变量并写入该路径即可在系统内运行 python 命令 2 pip 命令写入系统路径 pip 的写入路途则是如下 方法相同 3 conda 的运行 conda c
  • 028.PowerDesigner16:导入SQL脚本、显示中文注释

    导入SQL脚本 生成物理模型 1 击File gt Reverse Engineer gt Database 2 弹出弹窗对模型进行命名 同时在DBMS下拉选择框中需要选择自己对应的数据库类型 点击确定 3 新的弹窗 选中Using scr
  • 西米支付:如何选择自己需求的接口(传奇游戏支付接口)

    传奇游戏是中国网游无法绕过的一座碑 也是千万初代网游玩家的游戏启蒙 2001年一款游戏横空出世 靠着超爽的打击感 和多人同屏战斗迅速在网游火了起来 它就是传奇 随着 传奇 盛大的成长 兴盛与衰弱 一路走来 已经在14年 游戏的充值模式也由以
  • 达梦8常用性能优化相关SQL

    一 内存性能相关 1 1 查看数据库当前运行内存大小 select select sum n pages page size 1024 1024 from v bufferpool MB as BUFFER SIZE select sum