DM数据库常用SQL集合
2022/3/21 19:30:33
本文主要是介绍DM数据库常用SQL集合,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
在DM数据库的日常使用中,本人通过各种途径(数据库安装后的doc目录、官方eco社区、互联网,以及同事技术交流)收集了有一些高频实用的SQL命令集,本文将悉数罗列出来,日后将继续补充完善。
表结构查看
如何获取表字段信息和列注释信息?
SELECT S.NAME AS 表名, C.NAME AS 列名, C.TYPE$ AS 类型, C.LENGTH$ AS 长度, C.SCALE AS 标度, C.INFO2 AS 自增字段, C.NULLABLE$ AS 可为空, C.DEFVAL AS 默认值, (SELECT COMMENTS FROM ALL_COL_COMMENTS CC WHERE CC.OWNER = SF_GET_SCHEMA_NAME_BY_ID(S.SCHID) AND CC.TABLE_NAME = S.NAME AND CC.COLUMN_NAME = C.NAME) AS 列注释 FROM SYSOBJECTS S, SYSCOLUMNS C WHERE S.ID = C.ID -- 默认查询当前用户下面的用户表,要查看其他模式的表,请替换下面的USER函数为指定的模式名 AND S.SCHID = SF_GET_SCHEMA_ID_BY_NAME(USER) AND SUBTYPE$ = 'UTAB' -- 默认查询指定模式下所有的表,取消下方注释,替换表名DEPT为你需要查看的表名 -- AND S.NAME = 'DEPT' ORDER BY S.NAME, C.COLID;
如何获取数据库对象(表、索引、函数、过程)的DDL语句?
-- 根据表名返回DDL语句 SELECT TABLEDEF(USERNAME=>'TEST',TABLENAME=>'DICT_AREA'); -- 根据对象类型、对象名、对象所属模式返回DDL语句 SELECT SF_DBMS_METADATA_GET_DDL(OBJECT_TYPE=>'TABLE',OBJECT_NAME=>'DICT_AREA',SCHNAME=>'TEST');
系统函数信息
如何获知某个函数、过程所需的参数有哪些?
-- 模糊搜索函数名 SELECT * FROM V$IFUN WHERE NAME LIKE upper('%table_used_space%'); -- 根据上一步id查询函数参数 SELECT * FROM V$IFUN_ARG WHERE id= V$IFUN.ID ;
空间占用
表空间占用情况
哪些表空间空间所剩不多,需要提前扩充?哪些表空间使用率较低?(在磁盘紧张的时候考虑充分利用起来)
-- 查看表空间占用 SELECT D.TABLESPACE_NAME "Name", --d.contents "Type", TO_CHAR(NVL(A.BYTES / 1024 / 1024 / 1024, 0), '99999999.9') "总空间(GB)", TO_CHAR(NVL(A.BYTES2 / 1024 / 1024 / 1024, 0), '99999999.9') "已使用(GB)", TO_CHAR(NVL((A.BYTES2 / A.BYTES * 100), 0), '990.99') "使用%", TO_CHAR(NVL((A.BYTES2 - NVL(F.BYTES, 0)) / A.BYTES2 * 100, 0), '990.99') "使用率%" FROM SYS.DBA_TABLESPACES D, ( SELECT TABLESPACE_NAME, SUM(GREATEST(BYTES, MAXBYTES)) BYTES, SUM(BYTES) BYTES2 FROM DBA_DATA_FILES GROUP BY TABLESPACE_NAME ) A, ( SELECT TABLESPACE_NAME, SUM(BYTES) BYTES FROM DBA_FREE_SPACE GROUP BY TABLESPACE_NAME ) F WHERE D.TABLESPACE_NAME = A.TABLESPACE_NAME(+) AND D.TABLESPACE_NAME = F.TABLESPACE_NAME(+) ORDER BY NVL((A.BYTES2 - NVL(F.BYTES, 0)) / A.BYTES2 * 100, 0) DESC;
用户表占用情况
某个用户模式下来的表都占用了多大空间,分别有多少行?大表有哪些?
-- 通过页数和显示单位(可选参数MB/GB,默认KB为单位显示) WITH FUNCTION GET_SIZE_BY_PAGES(NUM_OF_PAGE INT, KB_MB_GB VARCHAR(2) DEFAULT 'KB') RETURN NUMBER(15, 2) AS V_SIZE_KB NUMBER(15, 2) := ROUND(PAGE() * NUM_OF_PAGE / 1024.00, 2); BEGIN IF KB_MB_GB = 'MB' THEN RETURN V_SIZE_KB / 1024.00; ELSIF KB_MB_GB = 'GB' THEN RETURN V_SIZE_KB / 1024.00 / 1024.00; END IF; RETURN V_SIZE_KB; END; -- 查看每个表空间占用情况和行数 SELECT T.TABLESPACE_NAME, T.OWNER, T.TABLE_NAME, GET_SIZE_BY_PAGES(TABLE_USED_PAGES(T.OWNER, T.TABLE_NAME), 'MB') AS TABLE_USED_SPACE_MB, GET_SIZE_BY_PAGES(TABLE_USED_PAGES(T.OWNER, T.TABLE_NAME), 'GB') AS TABLE_USED_SPACE_GB, TABLE_ROWCOUNT(T.OWNER, T.TABLE_NAME) AS TABLE_ROWCOUNT FROM DBA_TABLES T WHERE T.OWNER IN ('TEST') ORDER BY TABLE_USED_SPACE_MB DESC, TABLE_ROWCOUNT DESC;
性能诊断
阻塞会话SQL
当前哪个会话正在执行的哪条SQL(持有的锁)阻塞了另外哪个会话的哪一个SQL正在等待执行?
-- 查询持有锁的会话和等待锁的会话V$TRXWAIT版本 SELECT H.SESS_ID AS HOLD_LOCK_SESSION_ID, CONCAT('SP_CLOSE_SESSION(', H.SESS_ID, ');') AS HOLD_LOCK_SESSION_KILL, H.SQL_TEXT AS HOLD_LOCK_SESSION_SQL, H.STATE AS HOLD_LOCK_SESSION_STATE, H.CLNT_HOST AS HOLD_LOCK_CLIENT_HOST, H.CLNT_IP AS HOLD_LOCK_CLIENT_IP, H.THRD_ID AS HOLD_LOCK_THRD, H.TRX_ID AS HOLD_LOCK_TRX_ID, T.WAIT_TIME / 1000.00 AS WAIT_SECOND, W.* FROM SYS."V$TRXWAIT" T JOIN SYS."V$SESSIONS" H ON T.WAIT_FOR_ID = H.TRX_ID JOIN SYS."V$SESSIONS" W ON T.ID = W.TRX_ID WHERE H.STATE != 'ACTIVE' ORDER BY WAIT_SECOND DESC; -- 或者使用以下查询方式 -- 查询持有锁的会话和等待锁的会话 SELECT H.SESS_ID AS HOLD_LOCK_SESSION_ID, CONCAT('SP_CLOSE_SESSION(', H.SESS_ID, ');') AS HOLD_LOCK_SESSION_KILL, TO_CHAR(H.SQL_TEXT) AS HOLD_LOCK_SESSION_SQL, H.STATE AS HOLD_LOCK_SESSION_STATE, H.CLNT_HOST AS HOLD_LOCK_CLIENT_HOST, H.CLNT_IP AS HOLD_LOCK_CLIENT_IP, H.THRD_ID AS HOLD_LOCK_THRD, H.TRX_ID AS HOLD_LOCK_TRX_ID, SF_GET_TABLENAME_BY_ID(L.TABLE_ID) AS LOCKED_TABLE, CONCAT('SP_CLOSE_SESSION(', W.SESS_ID, ');') AS WAITING_SESSION_KILL, W.* FROM SYS."V$LOCK" L JOIN SYS."V$SESSIONS" W ON L.TRX_ID = W.TRX_ID AND L.BLOCKED = 1 JOIN SYS."V$SESSIONS" H ON L.TID = H.TRX_ID; --WHERE H.STATE != 'ACTIVE';
使用大量内存的SQL
哪些SQL占用了大量的内存?
-- 查询最近1000条内存占用量高的SQL select * from SYS."V$LARGE_MEM_SQLS" ORDER BY FINISH_TIME DESC; -- 查询系统中内存占用量最高的20条SQL SELECT * FROM V$SYSTEM_LARGE_MEM_SQLS ORDER BY "V$SYSTEM_LARGE_MEM_SQLS".MEM_USED_BY_K DESC; -- 查询最近内存占用最高的10000条SQL SELECT SF_GET_SESSION_SQL(SESSID), MAX_MEM_USED / 1024.0 MAX_MEM_USED_MB, SQL_TXT FROM V$SQL_STAT_HISTORY ORDER BY MAX_MEM_USED DESC;
慢查询定位
如何快速的获取慢查询语句?
-- 查询执行时间大于2秒的活动会话 SELECT SESS_ID, SQL_TEXT, DATEDIFF(SS, LAST_RECV_TIME, SYSDATE) EXETIME, TO_CHAR(SF_GET_SESSION_SQL(SESSID)) FULLSQL, CLNT_IP FROM V$SESSIONS WHERE STATE = 'ACTIVE' AND LAST_RECV_TIME <= SYSDATE - 1 / 24 / 60 * 2;
-- 显示系统最近 1000 条执行时间超过预定值(SF_GET_LONG_TIME,该阀值可通过SP_SET_LONG_TIME调整)的 SQL 语句 select * from SYS."V$LONG_EXEC_SQLS";
-- 显示系统自启动以来执行时间最长的 20 条 SQL 语句 select * from SYS."V$SYSTEM_LONG_EXEC_SQLS";
慢查询分析
如何知道SQL执行计划的哪些执行步骤消耗最长,更值得优化?
-- 通过ET查看SQL各个执行阶段耗时 SF_SET_SESSION_PARA_VALUE('MONITOR_SQL_EXEC',1); -- 下面执行需要测量的查询,获取执行号 select count(*) from AIRPORT.BOOKING; -- 使用下面的存储过程或者直接点击管理工具消息窗口中的执行号超级链接 et(16974); -- 取消监控 SF_SET_SESSION_PARA_VALUE('MONITOR_SQL_EXEC',0);
备份集
-- 备份集查看 SELECT BACKUP_TIME, BACKUP_NAME, BACKUP_PATH, CASE TYPE WHEN 1 THEN '增备' ELSE '全备' END AS "type" FROM V$BACKUPSET WHERE PARENT_ID = -1 ORDER BY BACKUP_TIME DESC;
系统信息
如何通过数据库快速查看服务器的负载信息?
-- 系统信息 select * from SYS."V$SYSTEMINFO";
license授权信息
如何查看当前数据库的授权信息?授权的的到期时间是什么时候?
-- 查看授权信息 SELECT SERIES_NO, EXPIRED_DATE, AUTHORIZED_CUSTOMER, PROJECT_NAME, CLUSTER_TYPE FROM V$LICENSE;
替换授权的KEY之后,如何刷新授权信息?
-- 重新载入授权 CALL P_LOAD_LIC_INFO();
小技巧
这么多的常用SQL命令,大家都是保存到哪里的呢?保存后又是怎样才能快速地找出来并调用?
好多同学可能会将这些日常使用的SQL用文本文件的方式,或者通过各种笔记软件(有道云笔记、印象笔记等等)进行记录并保存,每次使用的时候再打开这个文本文件进行搜索、复制、粘贴。
这些方法都未尝不可,但对于追求效率的我们来说,稍微有那么一点点的麻烦。我在这里推荐给大家一个我日常使用的小技巧:将日常使用频繁的SQL命令添加的输入法的自定义词条,这样不仅可能快速查找并调用,还能支持云端同步保存。下面,我将以搜狗输入法为例进行演示。
例如,大家很多时候想查看某些(个)表结构信息(字段名、字段类型、默认值、是否自增列、列注释等),可能会通过DM管理工具依次点击【对象导航】→【模式名】→【表名】→【修改】、【属性】、【列】打开对应窗口进行查看。但如果使用输入法的自定义词条功能,那么通常只需要切换到搜索输入法,然后键入desc,然后选择5(假设我们将该SQL查询命令候选项设置为5),即可快速调用查看表结构的SQL命令。如下图所示:
达梦技术社区:https://eco.dameng.com/
这篇关于DM数据库常用SQL集合的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-23Springboot应用的多环境打包入门
- 2024-11-23Springboot应用的生产发布入门教程
- 2024-11-23Python编程入门指南
- 2024-11-23Java创业入门:从零开始的编程之旅
- 2024-11-23Java创业入门:新手必读的Java编程与创业指南
- 2024-11-23Java对接阿里云智能语音服务入门详解
- 2024-11-23Java对接阿里云智能语音服务入门教程
- 2024-11-23JAVA对接阿里云智能语音服务入门教程
- 2024-11-23Java副业入门:初学者的简单教程
- 2024-11-23JAVA副业入门:初学者的实战指南