一种sql语句执行频次动态调整方法

文档序号:9217331阅读:887来源:国知局
一种sql语句执行频次动态调整方法
【技术领域】
[0001] 本发明涉及一种数据库优化处理方法,尤其涉及一种SQL语句执行频次动态调整 方法。
【背景技术】
[0002] 在数据库系统运行过程中,经常出现以下两种情况:
[0003] 1、SQL语句未使用绑定变量,每一个谓词的唯一值都有可能在查询时产生不同的 SQL语句,多个谓词甚至产生笛卡尔积,导致同一个查询功能点产生数量极多的SQL语句, 每个SQL的执行频次非常低,在数据库中重复解析,极大地增加了数据库负担,并产生内存 碎片问题。
[0004] 2、SQL语句使用了绑定变量,但是由于前台业务操作频繁,导致某一个SQL执行频 次过高,会话尝试以共享模式来获得一个游标时,需要修改相应的Mutex结构的引用计数, 产生了竞争和非空闲等待,影响了SQL的执行时间。
[0005] 目前业界一般采用以下方法进行避免:
[0006] 1、开发SQL时统一使用绑定变量,除谓词的值存在分布不均匀,且唯一值个数较 小,需要每一个值对应不同的SQL,以稳定执行计划。
[0007] 2、SQL使用绑定变量后,评估SQL的执行频次,如果频次较高,通过添加hint的方 式,将同一个SQL的文本变为不同,使之在解析时成为不同的SQL。
[0008] 目前的方式存在以下不足:
[0009] 1、开发人员对数据库专业知识了解不够深入,版本上线管控难以完全到位,现在 普遍各数据库系统中仍存在较多未使用绑定变量情况,但是改造工作涉及到代码变更,存 在风险。
[0010] 2、谓词值的分布情况会随着数据增长而改变,设计时考虑的不适用于改变后的情 况。
[0011] 3、SQL频次会随着业务增长而改变,设计时拆分SQL涉及到代码变更,无法动态调 整。

【发明内容】

[0012] 本发明所要解决的技术问题是提供一种SQL语句执行频次动态调整方法,能够对 SQL是否使用绑定变量进行动态调整,并动态调整通道,以适应SQL频次波动情况,提升数 据库处理性能。
[0013] 本发明为解决上述技术问题而采用的技术方案是提供一种SQL语句执行频次动 态调整方法,包括如下步骤:a)监听客户端的发送请求,获取操作数据库的SQL语句;b)对 获取的SQL语句进行解析,将SQL中谓词条件进行规整化处理,统一绑定变量,并为统一规 整化处理后SQL语句分配新的SQL_ID;c)在数据库服务端定期采集各规整后SQL语句的执 行频次;d)如果存在执行频次超过预设频次阀值的SQL语句,产生新的SQL语句替换原有 SQL语句,重复步骤b),并将规整化处理后的新SQL转发至数据库服务端运行。
[0014] 上述的SQL语句执行频次动态调整方法,其中,所述步骤b)从ORACLE数据库中查 询系统统计信息表视图DBA_TAB_COL_STATISTICS,采集字段NUM_DISTINCT获取SQL中涉 及谓词的唯一值,如果SQL中涉及谓词的唯一值低于预设阀值,则不进行规整化处理。
[0015] 上述的SQL语句执行频次动态调整方法,其中,所述步骤b)将SQL中谓词按如下 方式统一绑定变量:未使用绑定变量的SQL,使用依次递增变量代码代替常量;已使用绑定 变量的SQL,使用依次递增变量代码代替原绑定变量。
[0016] 上述的SQL语句执行频次动态调整方法,其中,所述步骤b)按如下方式对统一规 整化处理后SQL语句分配新的SQL_ID:对SQL语句通过md5方式进行散列,再对散列结果 进行base32编码,每五位转换为一个Base32编码,转换后的Base32编码即为该SQL语句 对应的SQL_ID。
[0017] 上述的SQL语句执行频次动态调整方法,其中,所述步骤c)中SQL语句的执行频 次freq采集计算如下:freq=EXECUTI0NSALAST_ACTIVE_TME-LAST_L0AD_TME)*24*60 ; EXECUTIONS为该SQL语句的执行次数,LAST_ACTIVE_HME为最后活动时间,LAST_L0AD_ TME为最后载入时间。
[0018] 上述的SQL语句执行频次动态调整方法,其中,所述步骤b)中预设频次阀值的设 置如下:遍历数据库中的节点,每个节点取所有前端业务对应的SQL语句的执行频次中间 值,最后取所有节点的执行频次中间值的平均值作为预设频次阀值f。
[0019] 上述的SQL语句执行频次动态调整方法,其中,所述步骤b)第n个节点的执行频 次中间值!!^的计算方法如下:bl)从数据库活动历史会话视图中获取EVENT= 〃Cursor:Pin S〃的所有SQL_ID和样例时间SAMPLEJ1ME;b2)筛选数据库历史快照视图,条件为样例时 间SAMPLEJ1ME在快照开始时间BEGIN_INTERVAL_HME和快照结束时间END_INTERVAL_ TME之间,且SQL_ID相等,得到SNAP_ID;b3)根据SNAP_ID和SQL_ID,得到数据库SQL 历史状态视图中的执行次数EXECUTION_DELTA;b4)根据SNAP_ID,指定STAT_NAME=〃DB time",得到数据库历史情况统计视图中的统计值VALUE。
[0020] 上述的SQL语句执行频次动态调整方法,其中,所述预设频次阀值f计算公式如 下:
[0021]
[0022] mn=DBA_HIST_SQLSTAT.EXECUTION_DELTA/(DBA_HIST_SNAPSHOT.END_INTERVAL_ TIME-DBA_HIST_SNAPSHOT.BEGIN_INTERVAL_TIME);
[0023] wn=DBA_HIST_SYS_TME_MODEL.VALUE;其中,DBA_HIST_ACTIVE_SESS_HISTORY 为数据库活动历史会话视图,DBA_HIST_SNAPSH0T为数据库历史快照视图,DBA_HIST_ SQLSTAT为数据库SQL历史状态视图,DBA_HIST_SYS_HME_MODEL为数据库历史情况统计视 图。
[0024] 本发明对比现有技术有如下的有益效果:本发明提供的SQL语句执行频次动态调 整方法,无需关注开发阶段的绑定变量使用,无需修改代码,通过在中间层自动规整SQL,统 一使用绑定变量,并定期采集数据值的分布情况,对SQL是否使用绑定变量进行动态调整, 从而动态调整通道,以适应SQL频次波动情况,提升数据库处理性能。
【附图说明】
[0025] 图1为本发明使用的数据库架构示意图;
[0026] 图2为本发明SQL语句执行频次采集流程图;
[0027] 图3为本发明SQL语句执行频次动态调整流程图。
【具体实施方式】
[0028] 下面结合附图和实施例对本发明作进一步的描述。
[0029] 图1为本发明使用的数据库架构示意图。
[0030] 请参见图1,本发明在客户端与数据库端连接之间设计中间层,在数据库端采集数 据库及相关SQL运行信息,进行计算并存储在中间层中,当中间层接收客户端请求后,根据 采集信息决定处理方式,并转发至数据库端。
[0031] 请继续参见图2和图3,本发明提供的SQL语句执行频次动态调整方法,包括如下 步骤:
[0032] S1、监听
[0033] 接收客户端发送请求,获取操作数据库的SQL语句。
[0034] S2、SQL预处理
[0035] 通过对SQL文本进行解析,将SQL中谓词条件进行规整化处理:
[0036] 1)未使用绑定变量的SQL,使用:1,: 2, : 3等依次递增变量代码代替常量。
[0037] 2)已使用绑定变量的SQL,使用:1,: 2, : 3等依次递增变量代码代替原绑定变量。
[0038] 为保证执行计划稳定,SQL中涉及谓词的唯一值低于阀值时,该谓词条件不进 行规整化处理。唯一值个数从ORACLE数据库中查询系统统计信息表视图DBA_TAB_C0L_ STATISTICS,采集字段为NUM_DISTINCT。
[0039] S3、SQL整合
[0040] 对于已规整化SQL文本,通过md5方式进行散列,再对散列结果进行base32编码, 每五位转换为一个Base32的编码,编码即为SQL文本对应的SQL_ID。
[0041] S4、通道处理
[0042] 依据规整后的SQL在实际数据库中执行频次,当超过预设频次阀值f后,启用新通 道,产生新的SQL替换原有SQL。创建数据结构存储各SQL通道信息。
[0043]
[0044] S5、频次监控
[0045] 每间隔10分钟,在数据库服务端采集各规整后SQL的执行频次。从ORACLE数据 库中查询系统视图V$SQL_AREA,采集字段如下:
[0048] 其中SQL_ID的执行频次(每分钟)计算公式为:
[0049] freq=EXECUTIONS/(LAST_ACTIVE_TIME-LAST_LOAD_TIME)*24*60
[0050] S6、转发
[0051] 将经过规整,通道处理后的新SQL转发至数据库服务端运行,并接收结果数据集 和执行结构,反馈客户端。
[0052] 其中阀值f的计算依据为数据库中如下系统视图中数据:
[0053] DBA_
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1