Oracle数据库中执行的SQL,很多时候会因为种种原因产生多个不同的执行版本,一个游标的版本过多很容易引起数据库的性能问题,甚至故障。

有时候一个SQL的版本数量可能多达数万个,以下是我之前在"云和恩墨大讲堂”分享过的一个案例。这个报告中的 SQL,最高达到了26万个 SQL 版本。算是我见过的“之最”之一。

产生SQL多版本的原因很多,通过如下的一些测试我们可以稍微来看看如何分析和找到可能的原因。

以下作为一个基础测试数据,一条基本的SQL查询:


create table t1(c1 int, c2 nvarchar2(100));
alter system flush shared_pool;
var b1 number;
var b2 varchar2(10);
exec :b1 := 1;
exec :b2 := '0';
select /* test */ * from t1 where c1 = :b1 and c2 = :b2 order by c2;


如果我们修改了优化器参数、环境变量、绑定变量等,都可能使得SQL发生重新解析,产生不同的子游标,也就是不同的VERSION。

Rem 这里我们修改了NLS_SORT参数,
Rem 再来查看SQL的游标数。
SQL> alter session set nls_sort = 'SCHINESE_RADICAL_M';Session altered.

REM 注意,以上第一个Child就是因为
REM 语言不匹配产生的(LANGUAGE_MISMATCH)

REM 以下修改了优化器模式,
REM 又一个新的子游标将会因此而产生。

REM 可以看到,第二个子游标是因为优化器
REM 模式不匹配产生的,OPTIMIZER_MODE_MISMATCH.
REM 以下步骤,我们绑定了不同长度的绑定变量,
REM 由此又可能产生新的SQL版本。

REM 我们看到的第三个子游标就是
REM 因为绑定变量长度不同而产生的。

从Oracle 9i开始,Oracle对中文语言方式(Simplified Chinese和Traditional Chinese)提供了多种排序方式。主要由以下四种,大家可以进行修改尝试:

SCHINESE_RADICAL_M   针对简体中文,按照部首(第一顺序)、笔划(第二顺序)排序
SCHINESE_STROKE_M    针对简体中文,按照笔划(第一顺序)、部首(第二顺序)排序
SCHINESE_PINYIN_M       针对简体中文,按照拼音排序
TCHINESE_RADICAL_M    针对繁体中文,按照部首(第一顺序)、笔划(第二顺序)排序
TCHINESE_STROKE_M     针对繁体中文,按照笔划(第一顺序)、部首(第二顺序)排序

当然可以逐一尝试:

以上测试是基于11.2.0.3版本,在Oracle 12c中,相关的可能因素已经多达64个,参考官方手册可以了解 V$SQL_SHARED_CURSOR 的更详细信息。

本文出自数据和云公众号,原文链接

Oracle 数据库之最:你见过最高的 SQL Version 是多少?相关推荐

  1. 创建oracle 数据库表空间,角色,用户的sql语句

    创建oracle 数据库表空间,角色,用户的sql语句 1.创建角色 CREATE ROLE "QIUDINGROLE" NOT IDENTIFIED; GRANT "C ...

  2. Robot Framework操作MySQL数据库和Oracle数据库

    一.Robot Framework连接MySQL数据库 1.安装databaselibrary.pymsql 通过cmd命令执行pip install robotframework-databasel ...

  3. 转oracle数据库字符集AL32UTF8修改为ZHS16GBK即从超集到子集

    2016年02月01日 09:32:12 攻城记 阅读数 12296 问题: 一个汉字用GBK存放是2个字符,用AL32UTF8占用3个字符,问题来了: 一个字段A varchar2(10)存放了5个 ...

  4. 使用oracle 游标修改数据,修改oracle数据库游标

    SQL游标原理和使用方法 版权声明:本文为博主原创文章,未经博主允许不得转载.https://blog.csdn.net/chinahuyong/article/details/3552248 SQL ...

  5. 金蝶支持oracle数据库,强大的金蝶ORACLE数据库工具

    工具功能: 1.提供AIX/LINX系统上ORACLE数据库的逻辑备份 2.提供AIX/LINX系统上ORACLE数据库的物理RMAN备份 3.提供数据库备份文件时时异主机存储 4.提供数据库还原功能 ...

  6. oracle数据库 gbk,oracle 数据库编码转换(转GBK) | 学步园

    查看oracle数据库字符集: select userenv('language') from dual; SQL> shutdown immediate Database closed. Da ...

  7. Oracle表里的照片怎么导出来,如何导出oracle数据库中某张表到excel_oracle数据库表格导出到excel...

    如何将oracle数据库表字段导成excel表格 这个你只要用ADO连oracle并获取记录集,根据你用的编程语言打开EXCEL,然后操作EXCEL对象的工作表就可以了.以VB为例: 1.在工程中引用 ...

  8. linux sqlserver_SQLServer和Oracle数据库相比谁更强?

    SQLServer和Oracle数据库相比谁更强? 目录 [引言] [基本情况对比] [SQL Server] [Oracle] [历史情况对比] [SQL Server] [Oracle] [功能对 ...

  9. oracle客户端工具_Oracle 发布基于 VS Code 的开发者工具,轻松连接 Oracle 数据库

    在之前的文章中,我们提到了亚马逊.谷歌.IBM 等大厂都上了 Visual Studio Code 的船. 今天(北京时间 2019 年 6 月 20 日),甲骨文也上了 VS Code 的船,发布了 ...

最新文章

  1. 10个必会的 PyCharm 技巧
  2. 尚学堂requireJs课程---2、模块
  3. Android 中文 API (27) —— SeekBar.OnSeekBarChangeListener
  4. Go实战--也许最快的Go语言Web框架kataras/iris初识二(TOML、Cache、Cookie)
  5. 3、Swing布局管理器
  6. jsp怎么连接mysql_jsp如何连接数据库!
  7. Caffe: Faster-RCNN Python版本配置 (Windows)
  8. ansible 下lineinfile详细使用
  9. 如何构建自己的SIP SERVER!
  10. python和c语言混合编程-python和C语言混编的几种方式
  11. CDN高级技术专家周哲:深度剖析短视频分发过程中的用户体验优化技术点
  12. Excel 自定义关闭按钮
  13. Java通讯录管理系统使用线性表任务台程序
  14. 同步 Visual Studio Code 设置
  15. iphone--使用NSUserDefaults存储数据
  16. TortoiseSVN 命令 (命令行执行工具)
  17. 数学教育与计算机教育ppt,计算机基础教育课件.ppt
  18. 用c语言实现打印日历
  19. VxLAN技术基本原理
  20. hotmail邮箱pop3server设置方法

热门文章

  1. 文字常量区和栈区考点
  2. 运算符面试题(剑指offer,面试宝典,牛客网)
  3. linux双网卡端口聚合,Linux双网卡聚合改造
  4. C++(纯)虚函数重写时访问权限更改问题
  5. getsockname函数与getpeername函数的使用
  6. 【算法】学习笔记(1):算法就是人类去教会计算机的方法
  7. 比特币源码学习笔记(一)
  8. 996页阿里Android面试真题解析火爆全网,分享面经!
  9. python sendline_python Pexpect模块的使用
  10. 扫盲丨关于区块链你需要了解的所有概念