资讯详情

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

使用系统过程和函数

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, 三:五:七; 

系统信息管理函数

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	        

标签: 1435连接器

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台