达梦数据库-系统函数(过程)及性能优化

系统过程和函数使用

INI参数管理函数

获取INI参数配置
SF_GET_PARA_VALUE(scope, ini_param_name)
     scope           表示从哪里取值 1: 从INI配置文件中获取参数值 2: 从内存中获取参数值
     ini_param_name  参数名称

示例
  SQL> SELECT SF_GET_PARA_VALUE(1,'MAL_INI');
   行号     SF_GET_PARA_VALUE(1,'MAL_INI')
   ---------- ------------------------------
   1          0
设置INI参数
SP_SET_PARA_VALUE(scope, ini_param_value, value)
   scope            0: 修改内存中的动态配置参数 1: 修改INI配置文件和内存中的参数, 不需要重启 2: 只修改INI配置文件中的参数, 重启后生效  
   ini_param_value  参数名称
   value            参数值

        示例
            SQL> SP_SET_PARA_VALUE(1,'HFS_CACHE_SIZE',320);
            SQL> SELECT SF_GET_PARA_VALUE(1,'HFS_CACHE_SIZE');
            行号     SF_GET_PARA_VALUE(1,'HFS_CACHE_SIZE')
            ---------- -------------------------------------
            1          320

获取配置参数值为DOUBLE类型的
SF_GET_PARA_DOUBLE_VALUE(scope, ini_param_name)
    scope           1: 从配置文件中获取 2: 从内存中获取
    ini_param_name 参数名称

设置配置参数值为DOUBLE类型的
    SP_SET_PARA_DOUBLE_VALUE(scope, ini_param_value, value)
        scope            0: 修改内存中的动态配置参数 1: 修改INI配置文件和内存中的参数, 不需要重启 2: 只修改INI配置文件中的参数, 重启后生效  
        ini_param_value  参数名称
        value            参数值

获取配置参数类型为字符串的参数值
   SF_GET_PARA_STRING_VALUE(scope, ini_param_name)
   SP_SET_PARA_STRING_VALUE(scope, ini_param_value, value)

获取会话级别的参数值
    SF_SET_SESSION_PARA_VALUE(para_name, value)
        para_name   参数名称
        value       参数值

重置会话级别的参数值
    SP_RESET_SESSION_PARA_VALUE(para_name)

获取会话级别的参数值
    SF_GET_SESSION_PARA_VALUE(para_name)

获取会话级别的DOUBLE类型的参数值
    SF_GET_SESSION_PARA_DOUBLE_VALUE(para_name)

修改整型、DOUBLE、STRING、的静态配置或动态配置
    SF_SET_SYSTEM_PARA_VALUE(para_name, value, deferred, scope)
    para_name   参数名称
    value       参数值
    deferred    是否立即生效  0: 当前会话立即生效 1: 当前会话不生效, 后续生效 
    scope        0: 修改内存中的动态配置参数 1: 修改INI配置文件和内存中的参数, 不需要重启 2: 只修改INI配置文件中的参数, 重启后生效  

设置SQL日志的SVR_LOG和SQL_TRACE_MASK

SF_SET_SQL_LOG(svrlog, svrmask)

示例
SELECT SF_SET_SQL_LOG(1, '3:5:7');

系统信息管理函数

SP_SET_SESSION_READONLY()                       设置当前会话的只读模式 0: 对数据库可进行读写 1: 对数据库只能只读
SP_CLOSE_SESSION(session_id)                    停止一个活动会话, session_id 通过 V$SESSIONS 或 GV$SESSIONS 获取
SF_GET_CASE_SENSITIVE_FLAG()                    查看当前数据库大小写是否敏感
CASE_SENSITIVE()                                查看当前数据库大小写是否敏感
SF_GET_EXTENT_SIZE()                            获取当前数据库簇大小
SF_GET_PAGE_SIZE()                              获取当前页大小
SF_PAGE_GET_SEGID(ts_id, file_id,page_num)      获取页所在的段号 ts_id: 表空间id  file_id: 文件id page_num: 页号
SF_PAGE_GET_PAGE_TYPE(ts_id, file_id,page_num)  获取页的类型
SF_GET_FILE_BYTES_SIZE()                        获取文件的字节长度, 和查询dba_data_files中显示一样
SF_GET_UNICODE_FLAG ()                          获取建库时指定的字符集
SF_GET_SGUID()                                  获取数据库唯一标识符 
GUID()                                          生成一个唯一字符串32位
NEWID()                                         生成一个SQLSERVER格式的字符串
SESSID()                                        获取当前的session_id
CHECK_DB_INDEX ()                               检查数据库中所有所以的合法性 返回值: 0: 不合法 1: 合法 2: 存在未校验的索引
UID()                                           返回当前用户id
USER()                                          返回当前登录用户
CUR_DATABASE()                                  返回当前数据库名称
SP_RECLAIM_TS_FREE_EXTENTS(tbs_name)            重组表空间空闲簇
VSIZE()                                         输入一个值, 返回该值占用几个字节
SP_CLEAR_PLAN_CACHE([plan_id])                  清空执行缓存信息, 不写plan_id表示清空所有
SF_CLOB_LEN_IS_VALID(clob_column)               检查指定的clob字段字符长度是否正常 0: 不正常 1: 正常
SP_VALIDATE_CLOB_LEN(clob_column)               修复clob字符长度
CHECK_INDEX_PAGE_USED(index_id)                 检查索引数据页分配的簇清空是否一致
SF_FILE_SYS_CHECK_REPORT(tbs_id)                检查表空间的簇是否正常
SP_LOAD_LIC_INFO()                              检查服务器的licence, 不正常直接退出
SF_PROXY_USER()                                 返回当前代理用户
SP_CLEAR_PLAN_CACHE_BY_DICT()                   清空指定字典对象的缓存计划
CUR_TICK_TIME()                                 获取当前系统时钟记数
SP_SET_LONG_TIME(long_exec_time)                设置V$LOG_EXEC_SQLS_TIME视图中监控SQL语句的最短执行时间单位毫秒有效范围 50~3600000
SF_GET_LONG_TIME                                获取V$LOG_EXEC_SQLS_TIME视图中监控SQL语句的最短执行时间
PERMANENT_MAGIC()                               返回数据库的永久魔数
SP_CANCEL_SESSION_OPERATION(session_id)         终止指定的会话

强制设置某个执行计划的结果集是否生效
   	SP_SET_PLN_RS_CACHE(plan_id, to_cache)          
		plan_id 执行计划id, 通过V$CACHEPLN中的CACHE_ITEM获取
		to_cache 0: 不缓存 1: 缓存

检查一个索引的合法性和正确性
	CHECK_INDEX (sch_name, index_id)    
		sch_name 模式名称
		index_id 索引id, 可以通过 SYSOBJECTS 表获取 SELECT id FROM SYSBOJECTS WHERE NAME='idx_name';
		返回值: 0: 不合法 1: 合法 2: 存在未校验的索引

查询用户对某表是否具有某个权限
	SF_CHECK_USER_TABLE_PRIV(schema_name, table_name, user_name, priv_code)
		schema_name 模式名称
		user_name   用户名  
		priv_code   权限代码 0: SELECT 1: INSEERT 2: DELETE 3: UPDATE 4: REFERENCE
		返回值 0: 不具备相应权限 1: 具备相应权限

查看用户对某个表的某个字段是否具有相应的权限
SF_CHECK_USER_TABLE_COL_PRIV(schema_name, table_name,col_name, user_name, priv_code)
    schema_name 模式名称
    table_name  表名 
    col_name    字段名
    user_name   用户名  
    priv_code   权限代码 0: SELECT 1: INSEERT 2: DELETE 3: UPDATE 4: REFERENCE
    返回值 0: 不具备相应权限 1: 具备相应权限

将临时表空间截断到指定大小
SP_TRUNC_TS_FILE(tmp_tbs_name,file_size,to_size) 
    tmp_tbs_name    临时表空间id
    file_size       文件id
    to_size         截取到多大 单位MB 值必须在 4096 到 2G 之间

获取指定id最近一次执行的SQL
SF_GET_SESSION_SQL (session_id,[ep_seqno]) 
    ep_seqno    指定会话所在的 DMDSC 集群节点的节点号

备份恢复管理

添加备份目录
SF_BAKSET_BACKUP_DIR_ADD(device_type,backup_dir)
            device_type 指定备份目录的介质  DISK 或 TAPE
            backup_dir  备份目录

示例
    SQL> SF_BAKSET_BACKUP_DIR_ADD('DISK','/dmbak');
    DMSQL 过程已成功完成
删除备份集
SF_BAKSET_BACKUP_DIR_REMOVE(device_type, backup_dir)
    device_type 待删除的备份目录对应的存储介质
    backup_dir  待删除的备份目录
清理全部备份目录, 默认备份目录除外
SF_BAKSET_BACKUP_DIR_REMOVE_ALL()
对指定备份集校验
SF_BAKSET_CHECK(device_type, bakset_path)
    device_type 存储介质
    bakset_path 备份目录
删除指定备份集
SF_BAKSET_REMOVE(device_type, backsetpath, option)
    device_type 存储介质
    backsetpath 备份集路径
    option  删除备份集选项 0: 默认删除 1: 级联删除
批量删除满足条件的所有备份集
SF_BAKSET_REMOVE_BATCH(device_type, end_time, range, obj_name)
    device_type 存储介质
    end_time    删除该时间之前的备份集
    range       指定备份集的级别  1: 库级备份 2: 表空间级别 3: 表级别 4: 归档备份 NULL: 忽略级别
    obj_name    待删除备份集中的备份对象名称 NULL: 忽略备份集中备份对象的区别
批量删除指定时间之前的备份集
SP_DB_BAKSET_REMOVE_BATCH(device_type, end_time)
    device_type 存储介质
    end_time    删除该时间之前的备份集
批量删除指定表空间的备份集
SP_TS_BAKSET_REMOVE_BATCH(device_type,end_time, ts_name)
    device_type 存储介质
    end_time    删除该时间之前的备份集
    ts_name     表空间名称
批量删除指定表对象及指定时间之前的表备份集
SP_TAB_BAKSET_REMOVE_BATCH(device_type, end_time, sch_name, tab_name)
    device_type 存储介质
    end_time    删除该时间之前的备份集
    sch_name    模式名称
    tab_name    表名

数据复制管理

创建或删除数据复制所需的系统表
    SP_INIT_REP_SYS(CREATE_FLAG)
        CREATE_FLAG 1: 表示创建复制所需系统表  0: 表示删除这些系统表

创建复制组
    SP_RPS_ADD_GROUP(GROUP_NAME, GROUP_DESC)
        GROUP_NAME: 创建的复制组名称
        GROUP_DESC: 复制组描述

删除复制组
    SP_RPS_DROP_GROUP(GROUP_NAME)

创建复制关系
   SP_RPS_ADD_REPLICATION(GRP_NAME,REP_NAME,REP_DESC,MINSTANCE,SINSTANCE,REP_TIMER,ARCH_PATH)
        GRP_NAME:  复制组名
        REP_NAME:  复制名, 必须在 RPS 上唯一
        REP_DESC:  复制描述
        MINSTANCE: 主节点实例名, 必须在 RPS 的 MAL 中已配置
        SINSTANCE: 从节点实例名, 必须在 RPS 的 MAL 中已配置
        REP_TIMER: 复制定时器名, 借助定时器, 可以设置复制数据的同步时机, 如果是同步复制则为 NULL
        ARCH_PATH: 主服务器上逻辑日志的完整归档路径

设置复制路径故障超时
    SP_RPS_SET_ROUTE_FAULT_TIMEOUT (REP_NAME, TIMEOUTS)
        REP_NAME: 复制关系名
        TIMEOUTS: 故障超时值, 以秒为单位。0 立即超时 -1 表示无超时限制

设置复制节点故障超时
    SP_RPS_SET_INST_FAULT_TIMEOUT(INST_NAME,TIMEOUTS)
        INST_NAME: 复制节点实例名
        TIMEOUTS:  故障超时值,以秒为单位 0 为立即超时 -1 表示无超时限制

模式对象相关信息管理

获取表定义语句
    SP_TABLEDEF(schname, tablename)
        schname    模式名
        tablename  表名

获取视图定义语句
    SP_VIEWDEF(schname,viewname)
        schname  模式名
        viewname 视图名称

检查当前系统表中视图列定义是否有效
    SF_VIEW_EXPIRED(schname,viewname)
        返回值 0: 有效 1: 无效

获取约束的定义
    CHECKDEF (consid,preflag)
        consid  约束id
        preflag 对象前缀个数 0: 只导出对象名 1: 导出模式名

获取唯一约束的定义
    CONSDEF(indexid, preflag)
        indexid    索引id
        preflag    对象前缀个数 0: 只导出对象名 1: 导出模式名

获取索引的定义
    INDEXDEF(indexid, preflag)

对指定的索引进行空间整理
    SP_REORGANIZE_INDEX(schname, indexname)
        schname 模式名称
        indexname 索引名称

重建索引
    SP_REBUILD_INDEX(schname, indexid)

获取 context_index 的创建定义
    CONTEXT_INDEX_DEF(indexid, preflag)

获取同义词定义
    SYNONYMDEF (username ,synname,type int,preflag)
        username: 用户名
        synname:  同义词名
        type:     同义词类型 0: public 1: user
        preflag:  对象前缀个数 1 表示导出模式名 0 表示只导出对象名

获取序列定义
    SEQDEF(seqid,preflag)

获取自增列当前值
    IDENT_CURRENT(fulltablename)

获取自增列种子
    IDENT_SEED(fulltablename)

获取自增列增量值 increment
    IDENT_INCR(fulltablename)

判断一个列是否为CHECK约束列
    SF_COL_IS_CHECK_KEY(key_num,key_info,col_id)

禁用或启动事件触发器
    SP_ENABLE_EVT_TRIGGER(SCHNAME,TRINAME,ENABLE)

禁用或启动所有事件触发器
    SP_ENABLE_ALL_EVT_TRIGGER(enable)

数据守护管理

设置主备库监控组的 ID 号
    SP_SET_OGUID(oguid)

根据 IPv4 的 IP 地址以及子网掩码计算广播地址
    SF_GET_BROADCAST_ADDRESS()

设置实时归档有效
    SP_SET_RT_ARCH_VALID()

设置实时归档无效
    SP_SET_RT_ARCH_INVALID()

获取实时归档状态
    SF_GET_RT_ARCH_STATUS()

设置指定归档目标的归档状态
    SP_SET_ARCH_STATUS(ARCH_DEST, ARCH_STATUS)
        ARCH_DEST 归档路径
        ARCH_STATUS 归档状态

设置所有归档目标的归档状态
    SP_SET_ALL_ARCH_STATUS()

APPLY 备库的 KEEP_PKG 数据
    SP_APPLY_KEEP_PKG()

丢弃备库的 KEEP_PKG 数据
    SP_DISCARD_KEEP_PKG()

清理最近N次的归档发送信息, 只能在主库执行
    SP_CLEAR_ARCH_SEND_INFO()

用于清理此备库最近 N 次的日志重演信息, 只能在备库执行
    SP_CLEAR_RAPPLY_STAT()

OPEN 状态下动态扩展 TIMELY 归档
    SP_ADD_TIMELY_ARCH()

设置 MAL 配置状态
    SF_MAL_CONFIG()

增加 MAL 配置项
    SF_MAL_INST_ADD(ITEM_NAME,INST_NAME,MAL_IP,MAL_PORT,MAL_INST_IP,MAL_INST_PORT)
        ITEM_NAME       配置项名称
        INST_NAME       实例名
        MAL_IP          MAL IP 地址
        MAL_PORT        MAL 端口
        MAL_INST_IP     实例 IP 地址
        MAL_INST_PORT   实例端口

将 MAL 配置生效
    SF_MAL_CONFIG_APPLY()

设置异步备库重演到指定时间
    SP_SET_ARCH_SEND_UNTIL_TIME(DEST, UNTIL_TIME)
        DEST: 异步归档目标库实例名
        UNTIL_TIME: 重演到指定时间点。若为空串,则表示取消重演到指定时间点

获取异步备库的重演指定时间
    SP_GET_ARCH_SEND_UNTIL_TIME(DEST)

通知源库立即发送归档到指定异步备库
    SP_NOTIFY_ARCH_SEND(DEST)

MPP 管理

MPP 系统下设置当前会话是否只查询本节点数据。如果不设置,表示可以查询全部节点数据
    SP_SET_SESSION_MPP_SELECT_LOCAL(local_flag)
        local_flag: 设置标记    1: 代表只查询本节点数据 0: 代表查询全部节点数据


查询 MPP 系统下当前会话是否只查询本节点数据
    SF_GET_SESSION_MPP_SELECT_LOCAL()


设置本会话上是否允许 DDL 操作
    SP_SET_SESSION_LOCAL_TYPE(DDL_FLAG)
        DDL_FLAG 1 时表示允许当前本地会话执行 DDL 操作,为 0 时则不允许


根据查询出的行数据的 ROWID 获取本条数据来自哪个 EP 站点
    SF_GET_EP_SEQNO(rowid)


获取本会话连接的 EP 站点序号
    SF_GET_SELF_EP_SEQNO()


统计 MPP 环境下表在各个站点的数据行数
    SP_GET_EP_COUNT(SCH_NAME, TAB_NAME)


增加 MPP 实例配置
    SF_MPP_INST_ADD(ITEM_NAME,INST_NAME)
    ITEM_NAME: 配置项名称
    INST_NAME: 实例名


删除 MPP 实例
    SF_MPP_INST_REMOVE(INST_NAME)

日志与检查点管理

设置检查点
    CHECKPOINT(rate)
        rate: 刷脏页百分比取值范围 1~100


数据库以归档模式打开的情况下,删除指定时间之前的归档日志文件
    SF_ARCHIVELOG_DELETE_BEFORE_TIME(TIME)

    示例
        SELECT SF_ARCHIVELOG_DELETE_BEFORE_TIME(SYSDATE - 3);


数据库以归档模式打开的情况下,删除小于指定 LSN 值的归档日志文件,包括本地归档和远程归档
    SF_ARCHIVELOG_DELETE_BEFORE_LSN(lsn)

数据库重演

手工设置负载捕获开始
    SP_START_CAPTURE(path, duration)
        path        捕获文件保存的绝对路径
        duration    捕获持续的时间,如果设置为-1 秒,表示需要手动停止捕获,或者磁盘空间满了自动停止

手工停止数据库重演捕获
    SP_STOP_CAPTURE()

统计信息

对表上所有的索引生成统计信息
    SP_TAB_INDEX_STAT_INIT(schname, tablename)
        schname     模式名
        tablename   表名


对库上所有模式下的所有用户表以及表上的所有索引生成统计信息
    SP_DB_STAT_INIT()


对指定的索引生成统计信息
    SP_INDEX_STAT_INIT(schname, tablename)
        schname     模式名
        tablename   表名


对指定的列生成统计信息,不支持大字段列和虚拟列
    SP_COL_STAT_INIT(schname,tableanme,colname)
        schname     模式名
        tablename   表名
        colname     列名


对某个表上所有的列生成统计信息
    SP_TAB_COL_STAT_INIT(schname, tablename)
        schname     模式名
        tablename   表名


某个表上所有的列,按照指定的采样率生成统计信息
    SP_STAT_ON_TABLE_COLS(SCHEMA_NAME,TABLE_NAME,E_PERCENT)
        schname     模式名
        tablename   表名
        E_PERCENT   采样率 0-100


对某张表或某个索引生成统计信息
    SP_TAB_STAT_INIT(schname, tablename)
        schname     模式名
        tablename   表名


对某个 SQL 查询语句中涉及的所有表和过滤条件中的列(不包括大字段、ROWID)生成统计信息
    SP_SQL_STAT_INIT(sql)


清空指定索引的统计信息
    SP_INDEX_STAT_DEINIT(schname, tablename)
        schname     模式名
        tablename   表名


删除指定列的统计信息
    SP_COL_STAT_DEINIT(schname,tabname,colname)


删除表上所有列的统计信息
    SP_TAB_COL_STAT_DEINIT(schname, tablename)
        schname     模式名
        tablename   表名


删除某张表的统计信息
    SP_TAB_STAT_DEINIT(schname, tablename)
        schname     模式名
        tablename   表名


统计执行 ID 为 ID_IN 的所有操作符的执行时间, 需设置 INI 参数: ENABLE_MONITOR=1、MONITOR_TIME=1 和 MONITOR_SQL_EXEC=1
    ET(ID_IN)
        ID_IN   SQL 语句的执行 ID


用以升级及迁移统计信息
    SP_UPDATE_SYSSTATS()


删除一个表的多维统计信息
    SP_TAB_MSTAT_DEINIT(schname, tablename)
        schname     模式名
        tablename   表名


获取表上建多维统计信息的列信息
    SF_GET_MD_COL_STR(tabid,col_info,col_num)


更新系统表 SYSMODIFICATIONS 中的数据
    SP_FLUSH_MODIFICATIONS_INFO


清理系统表 SYSMODIFICATIONS 中的冗余数据
    SP_CLEAN_MODIFICATIONS()


清理 DSC 环境下高频冲突数据页的历史信息
    SP_GBS_FREQ_CONFLICT_CLEAR()

资源监测

对可用内存空间进行检测并在低于阈值对IDLE_MEM_THRESHOLD的情况下打印报警记录到日志同时报内存不足的异常
    SP_CHECK_IDLE_MEM()


对指定位置的磁盘空间进行检测
    SP_CHECK_IDLE_DISK(path)


查看 DM 服务器对用户命令的平均响应时间
    SF_GET_CMD_RESPONSE_TIME()


查看事务的平均响应时间
    SF_GET_TRX_RESPONSE_TIME()


查看数据库中用户态时间占总处理时间的比值
    SF_GET_DATABASE_TIME_PER_SEC()


获取指定表所占用的页数
    TABLE_USED_SPACE(schname, tablename)
        schname     模式名
        tablename   表名


获取指定 HUGE 表所占用的大小
    HUGE_TABLE_USED_SPACE(schname, tablename)
        schname     模式名
        tablename   表名


获取指定用户所占用的页数,不包括用户占用的 HUGE 表页数
    USER_USED_SPACE(username)


获取指定表空间所有文件所占用的页数之和。RLOG 和 ROLL 表空间不支持
    TS_USED_SPACE(tbs_name)


获取整个数据库占用的页数
    DB_USED_SPACE()


根据索引 ID 获取指定索引所占用的页数
    INDEX_USED_SPACE(schname, indexid,nth_index)


根据索引 id 获取指定索引已使用的页数
    INDEX_USED_PAGES(indexid)


获取指定表已使用的页数
    TABLE_USED_PAGES(schname, tablename)


获取指定表空间可分配的空闲页数
    TS_FREE_SPACE(tbs_name)


获取指定表空间系统预留的页数
    TS_RESERVED_SPACE(tbs_name)


重新计算指定表空间可分配的空闲页数
    TS_FREE_SPACE_CALC(tbs_name)


获取指定表已使用的 lob 页数,包括大字段列使用的行外数据 lob 页和指定了 USING LONG ROW 存储选项时变长字符串列使用的行外数据 lob 页
    TABLE_USED_LOB_PAGES(schname, tablename)
        schname     模式名
        tablename   表名


获取指定表的大字段的段首页登记的空闲页个数
    TABLE_FREE_LOB_PAGES(schname, tablename)
        schname     模式名
        tablename   表名


清理指定表的大字段的段首页登记的空闲页
    SP_TABLE_LOB_RECLAIM(schname, tablename)
        schname     模式名
        tablename   表名


设置语句级资源监控,SQL 监控项生成的条件阀值
    SP_SET_SQL_STAT_THRESHOLD()


根据模式下的索引名获取指定索引已使用的页数
    INDEX_USED_PAGES(schname, tablename)
        schname     模式名
        tablename   表名


获取指定模式下指定表的总行数
    TABLE_ROWCOUNT(schname, tablename)
        schname     模式名
        tablename   表名

审计

是否开启审计功能和审计功能的级别
    SP_SET_ENABLE_AUDIT (2);

性能分析

性能分析的层面

操作系统
数据库实例
SQL语句

操作系统层面性能分析工具

top

[dmdba@itsdata ~]$ top
top - 17:16:02 up 24 min,  2 users,  load average: 0.00, 0.02, 0.05
Tasks: 215 total,   1 running, 214 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.0 us,  0.2 sy,  0.0 ni, 99.8 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem :  8154920 total,  5062088 free,  1756180 used,  1336652 buff/cache
KiB Swap:  1048572 total,  1048572 free,        0 used.  6109068 avail Mem 

-- user%: 占用比较高不见得不好
--  sys%: 占用比较高说明系统存在问题,比如系统中断比较多
--   %id: 空闲百分比, 该值越接近100%越好, 

iostat

[dmdba@itsdata ~]$ iostat -xm 1
Linux 3.10.0-1160.el7.x86_64 (itsdata) 	2022年06月11日 	_x86_64_	(4 CPU)

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
        0.13    0.17    0.82    0.06    0.00   98.82

Device:         rrqm/s   wrqm/s     r/s     w/s    rMB/s    wMB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
sda               0.12     0.68   21.48    4.30     0.59     0.33    72.85     0.01    0.31    0.27    0.54   0.20   0.51
scd0              0.00     0.00    0.03    0.00     0.00     0.00    94.27     0.00    1.18    1.18    0.00   0.89   0.00

-- %iowait 越高, 说明磁盘存在I/O瓶颈
-- %idle 越高, 表示CPU越空闲 如果该值高, 但系统响应慢, 可能是CPU等待分配内存, 应加大内存容量, 如果该值低于10, 说明CPU处理能力差, 需要解决CPU资源问题

vmstat 虚拟内存的统计

[dmdba@itsdata ~]$ vmstat 1 3
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r  b   swpd   free   buff  cache     si   so    bi    bo   in   cs us sy id wa st
1  0      0 4718164   1076 1971768    0    0    60    76  129  171  0  0 99  0  0
0  0      0 4718148   1076 1971768    0    0     0     5  105  200  0  0 100  0  0
0  0      0 4718148   1076 1971772    0    0     0     0  113  179  0  0 100  0  0
[dmdba@itsdata ~]$ 

-- r  运行的队列, 长期大于CPU核心数则说明CPU不足
-- b  处于不可中断状态的进程个数, 连续为CPU的2-3倍则说明CPU队列比较严重
-- in 每秒产生的中断次数        in和cs 如果如果很大, 那么top可以看到sy这里的值也会很高
-- cs 每秒产生的上下文切换次数

dstat 查看操作系统整体性能

[dmdba@itsdata ~]$ dstat 1 3
----total-cpu-usage---- -dsk/total- -net/total- ---paging-- ---system--
usr sys idl wai hiq siq| read  writ| recv  send|  in   out | int   csw 
0   0 100   0   0   0|  94k   91k|   0     0 |   0     0 | 329   521 
0   0 100   0   0   0|   0     0 |  66B  838B|   0     0 | 227   429 
0   0 100   0   0   0|   0     0 | 118B  424B|   0     0 | 254   453 
0   0 100   0   0   0|   0  4096B|  66B  358B|   0     0 | 208   411 

free 查看内存使用清空

[dmdba@itsdata ~]$ free
            total        used        free      shared  buff/cache   available
Mem:        8154928     2483276     3624992       25772     2046660     5373832
Swap:       1048572           0     1048572
[dmdba@itsdata ~]$ free -h
            total        used        free      shared  buff/cache   available
Mem:           7.8G        2.4G        3.5G         25M        2.0G        5.1G
Swap:          1.0G          0B        1.0G
[dmdba@itsdata ~]$ 

nmon

    ./nmon -f -t -r jnt -s 10 -c 1435

perf 性能分析

Samples: 1K of event 'cycles', 4000 Hz, Event count (approx.): 887881281 lost: 0/0 drop: 0/0                                                              
Overhead  Shared Object            Symbol                                                                                                                 
7.96%  perf                     [.] rb_next         -- 查看系统各个函数占用的资源清空
7.46%  perf                     [.] __symbols__insert
4.32%  [kernel]                 [k] kallsyms_expand_symbol.constprop.1
3.36%  libc-2.17.so             [.] __GI_____strtoull_l_internal
3.04%  [kernel]                 [k] module_get_kallsym
2.82%  [kernel]                 [k] format_decode
2.55%  [kernel]                 [k] number.isra.2
2.55%  perf                     [.] __dso__load_kallsyms
2.45%  [kernel]                 [k] vsnprintf
2.17%  [kernel]                 [k] native_write_msr_safe
1.90%  perf                     [.] rb_insert_color
1.90%  [kernel]                 [k] strnlen
1.89%  [kernel]                 [k] string.isra.7
1.57%  libc-2.17.so             [.] _IO_getdelim
1.47%  libc-2.17.so             [.] __strchr_sse42
1.31%  libc-2.17.so             [.] _int_malloc
1.20%  libc-2.17.so             [.] __strlen_sse2_pminub
1.20%  perf                     [.] 0x00000000000d67a4
1.19%  libc-2.17.so             [.] __memcpy_sse2
1.18%  [kernel]                 [k] apic_timer_interrupt

pstack 查看堆栈信息

[root@itsdata ~]# pstack 1127
Thread 68 (Thread 0x7fb9a2dfc700 (LWP 1167)):
#0  0x00007fb9c5be9de2 in pthread_cond_timedwait@@GLIBC_2.3.2 () from /lib64/libpthread.so.0
#1  0x000000000043ee0f in os_event2_wait_timeout ()
#2  0x00000000004d547d in tlog_flush_thread ()
#3  0x00007fb9c5be5ea5 in start_thread () from /lib64/libpthread.so.0
#4  0x00007fb9c5100b0d in clone () from /lib64/libc.so.6
Thread 67 (Thread 0x7fb9370a2700 (LWP 1301)):
#0  0x00007fb9c5be9a35 in pthread_cond_wait@@GLIBC_2.3.2 () from /lib64/libpthread.so.0
#1  0x0000000000450d52 in os_semaphore_p ()
#2  0x00000000016b5379 in nsvr_quit_thread ()
#3  0x00007fb9c5be5ea5 in start_thread () from /lib64/libpthread.so.0
#4  0x00007fb9c5100b0d in clone () from /lib64/libc.so.6
Thread 66 (Thread 0x7fb92a828700 (LWP 1316)):
#0  0x00007fb9c5be9a35 in pthread_cond_wait@@GLIBC_2.3.2 () from /lib64/libpthread.so.0
#1  0x0000000000450d52 in os_semaphore_p ()
#2  0x000000000044c41a in os_io_thread_sema ()
#3  0x000000000044c8db in os_io_thread ()
#4  0x00007fb9c5be5ea5 in start_thread () from /lib64/libpthread.so.0
#5  0x00007fb9c5100b0d in clone () from /lib64/libc.so.6

磁盘调度算法

临时修改
    [root@itsapp1 ~]# echo deadline > /sys/block/sda/queue/scheduler

永久修改
    [root@itsapp1 ~]# grubby --update-kernel=ALL --args="elevator=deadline"
    [root@itsapp1 ~]# reboot

磁盘读写检查

写入检测
[root@itsapp1 ~]# dd if=/dev/zero of=test bs=64k count=4k oflag=dsync
记录了4096+0 的读入
记录了4096+0 的写出
268435456字节(268 MB)已复制,1.36906 秒,196 MB/秒
[root@itsapp1 ~]# 

    正常机械磁盘速度:  50MB/s ~ 90MB/s
    正常固态磁盘速度: 150MB/s ~ 300MB/s
读取检测
[root@itsapp1 ~]# dd if=test of=/dev/zero bs=64k count=4k oflag=dsync
记录了4096+0 的读入
记录了4096+0 的写出
268435456字节(268 MB)已复制,0.040036 秒,6.7 GB/秒
[root@itsapp1 ~]# 

数据库实例

数据库参数

MEMORY_POOL             运行时内存, 相当于计算时需要消耗的内存
BUFFER                  缓存数据页和索引页的缓冲区, 相当于数据的副本, buffer实际上是一个链表
BUFFER_POOLS            BUFFER的实例个数, 相当于MySQL的innodb_buffer_pool_instnaces 减少内部锁竞争
RECYCLE                 用于缓冲临时表空间, 对应的磁盘物理文件就是TEMP.DBF , 当产生的临时数据很多是, RECYCLE满了则需要写入TEMP.DBF 导致TEMP.DBF自动扩展(扩展相当于一个系统中断), 性能会下降
RECYCLE_POOLS           和BUFFER_POOLS原理相同, 建议设置>100
SORT_BUFFER_SIZE        排序缓冲区
CACHE_POOL_SIZE         用于结果集、执行计划、SQL语句的缓存, 相当于MySQL的query_cache 建议1024~2048
DICT_BUF_SIZE           元数据信息缓存区, 可以通过查询v$db_cache视图, 如果LRU_DISCARD 很大则需要调大该值
HJ_BUF_GLOBAL_SIZE      哈希连接使用的内存大小, 整个数据库分配给哈希连接的内存
HJ_BUF_SIZE             单个哈希连接使用的内存大小
HJ_BLK_BUF_SIZE         当单个哈希连接使用的内存不够时, 每次申请内存时一次性申请多少
HAGR_BUF_GLOBAL_SIZE    聚集操作使用的内存大小
HAGR_BUF_SIZE           单个聚集操作使用的内存大小, 例如SUM()操作
WORKER_THREADS          工作线程的个数
ENABLE_MONITOR          数据库系统监控级别
OLAP_FLAG               是否开启OLAP环境
OPTIMIZER_MODE          优化器探测模式, 1: 采用左深树方式进行探测 0: 采用卡特兰树方式进行探测
TASK_THREADS            任务线程的个数
IO_THR_GRUPS            I/O线程的组数
MAX_SESSIONS            最大连接数
MAX_SESSION_STATEMENT   单个会话允许同时执行与的最大数
CACHE_POOL_SIZE         SQL缓冲池大小

数据库会话监控

查询活动会话数
    SELECT COUNT(*) FROM V$SESSIONS WHERE STATE='ACTIVE';
已执行超过2秒的活动SQL
    SELECT
        *
    FROM
        (
            SELECT
                sess_id,
                sql_text,
                datediff(ss, last_send_time, sysdate) Y_EXETIME,
                SF_GET_SESSION_SQL(SESS_ID) fullsql,
                clnt_ip
            FROM
                V $ SESSIONS
            WHERE
                STATE = 'ACTIVE'
        )
    WHERE
        Y_EXETIME >= 2;
锁查询
    SELECT
        o.name,
        l.*
    FROM
        v $ LOCK l,
        sysobjects o
    WHERE
        l.table_id = o.id
        AND blocked = 1
阻塞查询
    WITH LOCKS AS(
        SELECT
            o.name,
            l.*,
            s.sess_id,
            s.sql_text,
            s.clnt_ip,
            s.last_send_time
        FROM
            v $ LOCK l,
            sysobjects o,
            v $ sessions s
        WHERE
            l.table_id = o.id
            AND l.trx_id = s.trx_id
    ),
    lock_tr AS (
        SELECT
            trx_id wt_trxid,
            row_idx blk_trxid
        FROM
            LOCKS
        WHERE
            blocked = 1
    ),
    res AS(
        SELECT
            sysdate stattime,
            t1.name,
            t1.sess_id wt_sessid,
            s.wt_trxid,
            t2.sess_id blk_sessid,
            s.blk_trxid,
            t2.clnt_ip,
            SF_GET_SESSION_SQL(t1.sess_id) fulsql,
            datediff(ss, t1.last_send_time, sysdate) ss,
            t1.sql_text wt_sql
        FROM
            lock_tr s,
            LOCKS t1,
            LOCKS t2
        WHERE
            t1.ltype = 'OBJECT'
            AND t1.table_id <> 0
            AND t2.ltype = 'OBJECT'
            AND t2.table_id <> 0
            AND s.wt_trxid = t1.trx_id
            AND s.blk_trxid = t2.trx_id
    )
    SELECT
        DISTINCT wt_sql,
        clnt_ip,
        ss,
        wt_trxid,
        blk_trxid
    FROM
        res;
查询最近10000条SQL历史记录并按照耗时倒序排列
    SELECT
        *
    FROM
        v $ sql_history
    ORDER BY
        time_used DESC
显示系统自启动以来执行时间最长的20条SQL语句
    SELECT
        *
    FROM
        V $ SYSTEM_LONG_EXEC_SQLS
    ORDER BY
        EXEC_TIME DESC;

SQL 优化

SQL监控视图
V$SQL_HISTORY       视图可以查询执行 SQL 的历史记录信息
V$SQL_NODE_HISTORY  既可以查询 SQL 执行节点信息

SQL监控 INI 参数配置

下面两个参数都开启, 才会记录SQL信息
ENABLE_MONITOR 
MONITOR_SQL_EXEC 
MONITOR_TIME = 10  表示执行的时间阈值

SQL 优化处理流程

生成日志 --> 日志入库 --> 分析SQL --> 优化方案

SQL 汇总分析

    并发非常高   执行频繁的SQL很多, 最优先处理
    并发一般     执行次数不多, 但会造成局部操作满, 次优先处理
    并发少但很慢 执行次数很少, 但语句很慢, 最后处理

SQL 优化思路

高并发

        单个SQL语句调到最快
                普通索引
                聚集索引
                覆盖索引

        优化应用, 减少执行次数
                应用做结果集缓存
                优化应用逻辑, 减少无用的执行 例如: 应用中每秒执行的SQL, 是否可以改为每10s执行一次
                将SQL分散到其他数据库节点

一般并发

        使用索引
                单列索引
                组合索引

         改写SQL
                LEFT JOIN 等价改写为 INNER JOIN
                避免隐式转换
                将过滤条件上拉, 走索引
                用分析函数, 减少表扫描

定位慢查询日志

相关参数

SQL_TRACE_MASK 设置SQL语句过滤规则
        2 只记录DML语句
        3 只记录DDL语句
        22 记录绑定参数的语句
        25 记录SQL语句和它的执行时间
        28 记录SQL语句绑定的参数信息

SVR_LOG_ASYNC_FLUSH 是否开启异步复制
SVR_LOG_MIN_EXEC_TIME 设置语句的超时事件 单位毫秒
SVR_LOG_NAME = SLOG_ALL sqllog.ini 中使用的名称
SVR_LOG 是否开启SQL日志

ET函数使用

1、开启ET
    --两个参数均为动态参数,可直接调用系统函数进行修改
    SP_SET_PARA_VALUE(1,'ENABLE_MONITOR',1);
    SP_SET_PARA_VALUE(1,'MONITOR_SQL_EXEC',1);
    -- MONITOR_SQL_EXEC 参数不要全局打开, 因为会记录所有会话的执行语句, 导致V$SQL_NODE_HISTORY暴涨
    -- V$SQL_NODE_HISTORY
2、执行SQL
    SELECT * FROM T1;  执行完成后有一个执行号
    已用时间: 0.527(毫秒). 执行号:609.
3、查看运行结果
    CALL ET(609);
4、查看性能视图
    SELECT * FROM V$LONG_EXEC_SQLS;
示例
SQL> SELECT * FROM FANGYU.EMP;
行号     EMPNO       ENAME  JOB       MGR         HIREDATE   SAL     COMM    DEPTNO     
---------- ----------- ------ --------- ----------- ---------- ------- ------- -----------
1          7369        SMITH  CLERK     7902        1980-12-17 800.00  NULL    20
2          7499        ALLEN  SALESMAN  7698        1981-02-20 1600.00 300.00  30
3          7521        WARD   SALESMAN  7698        1981-02-22 1250.00 500.00  30
4          7566        JONES  MANAGER   7839        1981-04-02 2975.00 NULL    20
5          7654        MARTIN SALESMAN  7698        1981-09-28 1250.00 1400.00 30
6          7698        BLAKE  MANAGER   7839        1981-05-01 2850.00 NULL    30
7          7782        CLARK  MANAGER   7839        1981-06-09 2450.00 NULL    10
8          7788        SCOTT  ANALYST   7566        1987-06-13 3000.00 NULL    20
9          7839        KING   PRESIDENT NULL        1981-11-17 5000.00 NULL    10
10         7844        TURNER SALESMAN  7698        1981-09-08 1500.00 0       30
11         7876        ADAMS  CLERK     7788        1987-06-13 1100.00 NULL    20

行号     EMPNO       ENAME  JOB     MGR         HIREDATE   SAL     COMM DEPTNO     
---------- ----------- ------ ------- ----------- ---------- ------- ---- -----------
12         7900        JAMES  CLERK   7698        1981-12-03 950.00  NULL 30
13         7902        FORD   ANALYST 7566        1981-12-03 3000.00 NULL 20
14         7934        MILLER CLERK   7782        1982-01-23 1300.00 NULL 10

已用时间: 0.229(毫秒). 执行号:607.  -- 记录当前的执行号
SQL> ET(607);

行号     OP    TIME(US)             PERCENT RANK                 SEQ         N_ENTER     HASH_USED_CELLS      HASH_CONFLICT       
---------- ----- -------------------- ------- -------------------- ----------- ----------- -------------------- --------------------
1          DLCK  1                    1.41%   3                    0           2           0                    0
2          PRJT2 1                    1.41%   3                    2           4           0                    0
3          NSET2 21                   29.58%  2                    1           3           0                    0
4          CSCN2 48                   67.61%  1                    3           2           0                    0

执行计划

 1   #NSET2: [1, 40, 792] 
 2     #PRJT2: [1, 40, 792]; exp_num(34), is_atom(FALSE) 
 3       #HASH2 INNER JOIN: [1, 40, 792]; LKEY_UNIQUE KEY_NUM(1); KEY(A.ID=B.PID) KEY_NULL_EQU(0)
 4         #BLKUP2: [1, 40, 396]; SYSINDEXNAMESYSOBJECTS(A)
 5           #SSEK2: [1, 40, 396]; scan_type(ASC), SYSINDEXNAMESYSOBJECTS(SYSOBJECTS as A), scan_range['a','b')
 6         #CSCN2: [1, 1077, 396]; SYSINDEXSYSOBJECTS(SYSOBJECTS as B)   -- 表示CSCN2表示全表扫描, 1: 估算使用多少ms 1071: 扫描多少行 396: 输出多少字节

     执行顺序: 5 4 6 3 2 1

 各计划节点的执行顺序为
     缩进越多的越先执行,同样缩进的上面的先执行,下面的后执行,上下的优先级高于内外

常用执行计划操作符

NEST: 收集结果集, 出现在最顶端
SSEK: 表示先根据二级索引扫描找到对应的rowid或者主键, 再根据主键或者rowid回表, 通常该操作的上级都是BLKUP
CSEK: 聚集索引扫描只扫描索引, 不需要扫描表, 相当于根据主键就可以查找到数据 因为是聚集索引所以索引包含整行数据
SSCN: 全索引扫描, 不需要扫描表
CSCN: 全表扫描, 没有使用索引
SLCT: 选择, 表示WHERE后面的表达式, 用于查询条件的过滤
PRJT: 投影, 用于表达式项的计算, 广泛用于查询, 排序, 函数索引建立等 例如: SELECT 1+1 FROM DUAL; 这个1+1就会产生PRJT因为进行了计算, 如果看到PRJT的值过大, 则说明SELECT后的计算很重, 需要优化一下
AAGR: 简单聚集分组操作
FAGR: 快速聚集分组操作
HAGR: 哈希分组, 通常用于没有走索引分组时
SAGR: 排序分组, 性能比HAGR好, 但是SAGR要求下级返回的数据必须是有序的 

BLKUP: 二次扫描(回表), 先使用二级索引定位rowid, 在根据表的主键,聚集索引,rowid等信息获取数据

连接查询

NEST LOOP INNER JOIN 表示全表扫描 A表的数据行 去 匹配 B表的数据行, 得到的结果 驱动表的行数就是循环次数, 严重影响效率
NEST LOOP INDEX JOIN 表示索引扫描 A表的索引行 去 匹配 B表的数据行, 得到的结果
HASH INNER JOIN 表示A表的数据做成hash表 B表的数据做成hash表 后进行匹配得到的结果集, 缺点是消耗内存
MERGE JOIN 合并连接 表的关联字段必须有索引, 对两张表扫描索引后安装索引顺序进行归并

SQL> EXPLAIN SELECT * FROM SYSOBJECTS A , SYSOBJECTS B WHERE A.ID=B.ID;

1   #NSET2: [1, 1077, 792] 
2     #PRJT2: [1, 1077, 792]; exp_num(34), is_atom(FALSE) 
3       #HASH2 INNER JOIN: [1, 1077, 792]; LRKEY_UNIQUE KEY_NUM(1); KEY(A.ID=B.ID) KEY_NULL_EQU(0)
4         #CSCN2: [1, 1077, 396]; SYSINDEXSYSOBJECTS(SYSOBJECTS as A)
5         #CSCN2: [1, 1077, 396]; SYSINDEXSYSOBJECTS(SYSOBJECTS as B)

已用时间: 0.629(毫秒). 执行号:0.
SQL> EXPLAIN SELECT /*+ PHC_MODE_ENFORCE(1) */ * FROM SYSOBJECTS A , SYSOBJECTS B WHERE A.ID=B.ID;

1   #NSET2: [48290, 1077, 792] 
2     #PRJT2: [48290, 1077, 792]; exp_num(34), is_atom(FALSE) 
3       #SLCT2: [48290, 1077, 792]; A.ID = B.ID
4         #NEST LOOP INNER JOIN2: [48290, 1077, 792]; 
5           #CSCN2: [1, 1077, 396]; SYSINDEXSYSOBJECTS(SYSOBJECTS as A)
6           #CSCN2: [1, 1077, 396]; SYSINDEXSYSOBJECTS(SYSOBJECTS as B)

已用时间: 0.509(毫秒). 执行号:0.

SQL> EXPLAIN SELECT /*+ PHC_MODE_ENFORCE(2) */ * FROM SYSOBJECTS A , SYSOBJECTS B WHERE A.ID=B.ID;

1   #NSET2: [7, 1077, 792] 
2     #PRJT2: [7, 1077, 792]; exp_num(34), is_atom(FALSE) 
3       #NEST LOOP INDEX JOIN2: [7, 1077, 792] 
4         #CSCN2: [1, 1077, 396]; SYSINDEXSYSOBJECTS(SYSOBJECTS as A)
5         #BLKUP2: [7, 1, 0]; SYSINDEXIDSYSOBJECTS(B)
6           #SSEK2: [7, 1, 0]; scan_type(ASC), SYSINDEXIDSYSOBJECTS(SYSOBJECTS as B), scan_range[A.ID,A.ID]

已用时间: 0.464(毫秒). 执行号:0.
SQL> 

统计信息

统计信息的内容

统计信息主要是描述数据库中表,索引的大小,规模,数据分布状况等的一类信息
比如,表的行数,块数,平均每行的大小,索引的高度、叶子节点数,索引字段的行数,不同值的大小等,都属于统计信息。

两种统计方式

频率直方图
适用于取值范围比较少的列,例如有些字段的取值范围非常有限,比如人类的年龄,一般不可能超过120, 因此无论表中有多少记录,年龄字段的唯一值个数都不会超过120,
我们可以采样部分记录,统计出每个年龄(0-120)的记录数,可以使用120个(V, count)二元组作为元素的数组,来表示这个频率直方图。

等高直方图
频率直方图虽然精确,但是它只能处理取值 范围较小的情况,如果字段的取值范围很大,那么就不可能为每一个值统计出它的出现次数,这个时候我们需要等高直方图。
等高直方图是针对一个数据集合不同值 个数很多的情况,把数据集合划分为若干个记录数相同或相近的不同区间,并记录区间的不同值个数。每个区间的记录数比较接近,这就是所谓等高的含义。

手动收集统计信息方法
 1、收集指定用户下所有表所有列的统计信息
    DBMS_STATS.GATHER_SCHEMA_STATS('username',100,TRUE,'FOR ALL COLUMNS SIZE AUTO');

 2、收集指定用户下所有索引的统计信息
     DBMS_STATS.GATHER_SCHEMA_STATS('usename',1.0,TRUE,'FOR ALL INDEXED SIZE AUTO');

 3、或 收集单个索引统计信息
     DBMS_STATS.GATHER_INDEX_STATS('username','IDX_T2_X');

4、收集指定用户下某表统计信息
	DBMS_STATS.GATHER_TABLE_STATS('username','table_name',null,100,TRUE,'FOR ALL COLUMNS SIZE AUTO');

5、收集某表某列的统计信息
    STAT 100 ON table_name(column_name);
自动收集统计信息
 1、打开表数据量监控开关,参数值为 1 时监控所有表,2 时仅监控配置表
       SP_SET_PARA_VALUE(1,'AUTO_STAT_OBJ',2);
       
 2、设置 SYSDBA.T 表数据变化率超过 15% 时触发自动更新统计信息
       DBMS_STATS.SET_TABLE_PREFS('SYSDBA','T','STALE_PERCENT',15);
       
3、配置自动收集统计信息触发时机
       SP_CREATE_AUTO_STAT_TRIGGER(1, 1, 1, 1,'14:36', '2020/3/31',60,1);

查看统计信息
   DBMS_STATS.COLUMN_STATS_SHOW(USER, 'TEST_TJ','AGE');

索引

聚集索引: 叶子节点存储的是整行数据
非聚集索引: 叶子节点存储的是聚集索引的值和rowid

不走索引的原因

    1、条件字段不是索引的首列
    2、条件字段上有函数或者计算
    3、存在隐式转换
    4、没有更新统计信息
    5、左前缀, 可以考虑使用跳表
    6、连接查询时, 关联字段类型不一致

SQL 优化

    1、避免使用OR
    2、LIKE 语句 col1 LIKE ‘L%’ 应该优化为 col1 >=‘L’ AND col1 <=‘M’ 这样可以使用到索引, 即使没有索引转换后的比较也更快col1 LIKE ‘LM_’ 转化为 col1 >=‘LM’ AND col1 <=‘LN’ AND col1 LIKE ‘LM_’ 该语句虽然还是包含通配符, 但大大缩小了匹配范围
    3、避免使用SELECT * ,会给执行器带来很大性能影响, 并且占用网络带宽
    4、避免功能相似的重复索引
    5、使用COUNT(*) 进行行数统计
    6、使用HINT进行优化

执行计划操作符

AAGR2	                        简单聚集: 如果没有分组(group by), 则总的就一个组, 直接计算聚集函数
ACTRL	                        控制备用计划转换
AFUN	                        分析函数计算
ASCN	                        数组当作表来扫描
ASSERT	                        约束检查
BLKUP2	                        定位查找
BMAND	                        位图索引的与运算
BMCNT	                        位图索引的行数计算
BMCVT	                        位图索引的ROWID转换
BMMG	                        位图索引归并
BMOR	                        位图索引的或运算
BMSEK	                        位图索引的范围查找
CONST VALUE LIST                常量列表
CONSTC	                        用于复合索引跳跃扫描
CSCN2	                        聚集索引扫描
CSEK2	                        聚集索引数据定位
CTNS	                        用于实现全文索引的CONTAINS
DELETE	                        删除数据
DELETE_REMOTE	                DBLINK删除操作
DISTINCT	                    去重
DSCN	                        动态视图表扫描
DSSEK	                        DISTINCT列上索引跳跃扫描(单列索引或复合索引)
ESCN	                        外部表扫描
EXCEPT	                        集合的差运算, 且取差集后删除重复项
EXCEPT ALL                      集合的差运算, 且取差集后不删除重复项
FAGR2	                        快速聚集, 如果没有where条件, 且取count(*), 或者基于索引的MAX/MIN值, 则可以快速取得集函数的值
FILL BTR                        填充B树
FTTS	                        MPP\LPQ下, 对临时表的优化
GSEK	                        空间索引查询
HAGR2	                        HASH 分组, 并计算聚集函数
HASH FULL JOIN2	                HASH全外连接
HASH LEFT JOIN2	                HASH左外连接
HASH LEFT SEMI JOIN2	        HASH左半连接
HASH LEFT SEMI MULTIPLE JOIN	多列NOT IN
HASH RIGHT JOIN2	            HASH右外连接
HASH RIGHT SEMI JOIN2	        HASH右半连接
HASH RIGHT SEMI JOIN32          用于OP SOME/ANY/ALL的HASH右半连接
HASH2 INNER JOIN	            HASH内连接
HEAP TABLE	                    临时结果表
HEAP TABLE SCAN	                临时结果表扫描
HFD	                            删除事务型HUGE表数据
HFDEL2	                        删除非事务型HUGE表数据
HFDEL_EP	                    MPP下从EP删除非事务型HUGE表数据
HFD_EP	                        MPP下从EP删除事务型HUGE表数据
HFI	                            事务型HUGE表插入记录
HFI2	                        MPP下优化的事务型HUGE表插入记录
HFINS2	                        非事务型HUGE表插入记录
HFINS3	                        MPP下优化的非事务型HUGE表插入记录
HFINS4	                        非MPP下, 针对非事务型HUGE水平分区主表的插入优化, 需要参数HFINS_PARALLEL_FLAG=2
HFINS_EP	                    MPP下从EP插入非事务型HUGE表数据
HFI_EP	                        MPP下从EP插入事务型HUGE表数据
HFLKUP	                        根据ROWID检索非事务型HUGE表数据
HFLKUP2	                        根据ROWID检索事务型HUGE表数据
HFLKUP_EP	                    MPP下从EP根据ROWID检索非事务型HUGE表数据
HFLKUP2_EP	                    MPP下从EP根据ROWID检索事务型HUGE表数据
HFSCN	                        非事务型HUGE表的逐行扫描
HFSCN2	                        事务型HUGE表的逐行扫描
HFSEK	                        根据KEY检索非事务型HUGE表数据
HFSEK2	                        根据KEY检索事务型HUGE表数据
HFU	                            更新事务型HUGE表数据
HFUPD	                        更新非事务型HUGE表数据
HFUPD_EP	                    MPP下从EP更新非事务型HUGE表数据
HFU_EP	                        MPP下从EP更新事务型HUGE表数据
HIERARCHICAL QUERY	            层次查询
HPM	                            水平分区表归并排序
INDEX JOIN LEFT JOIN2	        索引左连接
INDEX JOIN SEMI JOIN2	        索引半连接
INSERT	                        插入记录
INSERT3	                        MPP下, 查询插入优化处理
INSERT_LIST	                    堆表插入
INSERT_REMOTE	                DBLINK插入操作
INTERSECT	                    集合的交运算, 且取交集后删除重复项
INTERSECT ALL	                集合的交运算, 且取交集后不删除重复项
LOCAL BROADCAST                 本地并行模式下, 消息广播到各线程, 包含必要的聚集函数合并计算
LOCAL COLLECT	                本地并行下数据收集处理, 代替LOCAL GATHER
LOCAL DISTRIBUTE	            本地并行模式下, 消息各线程的相互重分发
LOCAL GATHER	                本地并行模式下, 消息收集到主线程
LOCAL SCATTER	                本地并行模式下, 主线程向各从线程广播消息
LOCK TID	                    上锁
LSET	                        DBLINK查询结果集
MERGE INNER JOIN3	            归并内连接
MERGE SEMI JOIN3	            归并半连接
MPP BROADCAST	                MPP模式下, 消息广播到各站点, 包含必要的聚集函数合并计算
MPP COLLECT	                    用于替换顶层MPP GATHER, 除了收集数据到主节点, 还增加主从节点间的同步执行功能, 防止从节点不断发送数据到主节点造成邮件堆积
MPP DISTRIBUTE	                MPP模式下, 消息各站点的相互重分发
MPP GATHER	                    MPP模式下, 消息收集到主站点
MPP SCATTER	                    MPP模式下, 主站点向各从站点广播消息
MSYNC	                        MPP下数据同步处理
MVCC CHECK	                    多版本检查
NCUR2	                        游标操作
NEST LOOP FULL JOIN2	        嵌套循环全外连接
NEST LOOP INDEX JOIN2	        索引内连接
NEST LOOP INNER JOIN2	        嵌套循环内连接
NEST LOOP LEFT JOIN2	        嵌套循环左外连接
NEST LOOP SEMI JOIN2	        嵌套循环半连接
NTTS2	                        临时表, 临时存放数据
NSET2	                        结果集(result set)收集, 一般是查询计划的顶层节点
PARALLEL	                    控制水平分区子表的扫描
PIPE2	                        管道;先做一遍右儿子, 然后执行左儿子, 并把左儿子的数据向上送, 直到左儿子不再有数据
PRJT2	                        关系的“投影”(project)运算, 用于选择表达式项的计算
PSCN	                        批量参数当作表来扫描
REMOTE SCAN	                    DBLINK远程表扫描
RN	                            实现ROWNUM查询
RNSK	                        ROWNUM作为过滤条件时的计算处理
SAGR2	                        如果输入流是有序的, 则使用流分组, 并计算聚集函数
SELECT INTO2	                查询插入
SET TRANSACTION	                事务操作(START除外)
SLCT2	                        关系的“选择”(select)运算, 用于查询条件的过滤
SORT2	                        排序
SORT3	                        排序
SPL2	                        临时表和NTTS2不同的是, 它的数据集不向父亲节点传送, 而是被编号, 用编号和KEY来定位访问;而NTTS2的数据, 主动传递给父亲节点
SSCN	                        直接使用二级索引进行扫描
SSEK2	                        二级索引数据定位
START TRANSACTION	            启动会话
STAT	                        统计信息计算
TOPN2	                        取前N条记录
UFLT	                        处理UPDATE FROM子句
UNION	                        UNION计算
UNION ALL	                    UNION ALL运算
UNION ALL(MERGE)	            UNION ALL运算(使用归并)
UNION FOR OR2	                OR过滤的UNION计算
UPDATE	                        更新数据
UPDATE_REMOTE	                DBLINK更新操作

​详细内容请参考官方文档:​​https://eco.dameng.com​​

更多详情请访问达梦在线服务平台 https://eco.dameng.com/

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值