Oracle 数据库之最:你见过最高的 SQL Version 是多少?
2023-09-11 14:19:43 时间
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 的更详细信息。
本文出自数据和云公众号,原文链接
以小博大外小内大,Db数据库SQL优化之小数据驱动大数据 SQL优化中,有一条放之四海而皆准的既定方针,那就是:永远以小数据驱动大数据。其本质其实就是以小的数据样本作为驱动查询能够优化查询效率,在SQL中,涉及到不同表数据的连接、转移、或者合并,这些操作必须得有个数据集作为“带头”大哥,即驱动数据,而这个驱动数据最好是数据量最小的那一个。
第十二届 BigData NoSQL Meetup — 基于hbase的New sql落地实践 立即下载
相关文章
- ORACLE数据库中ORACLE_SID与INSTANCE_NAME的差异
- Oracle数据库中的字节序格式是什么?
- STS工具:mybayis连接oracle数据库
- Oracle数据库:oracle数据表格dmp,sql,pde格式导入与导出,视图、序列、索引等对象的导出,oracle完结,后续开启mysql的学习
- Oracle数据库:创建和删除视图view,简单和复杂视图,内建视图,topN分析,oracle分页查询
- Oracle数据库:oracle组函数,聚合函数,多行函数,avg,sum,min,max,count,group by,having
- Oracle数据库:oracle外连接left/right/full outer join on,oracle扩展的左右外连接展示符号(+)
- Oracle数据库:oracle函数嵌套,nvl函数,nvl2函数,nullif函数,coalesce合并函数
- Oracle数据库:oracle 11g安装教程,已安装好的oracle各个文件夹的作用,oracle用户权限怎么样
- Oracle数据库调试和优化详解
- oracle 如何查看创建表等数据库对象时的DDL语句
- 关于plsql连接oracle数据库session失效时间设置
- oracle数据库迁移
- sql server 导出的datetime结果 CAST(0x00009E0E0095524F AS DateTime) 如何向mysql,oracle等数据库进行转换
- 《Oracle数据库管理与维护实战》—— 2.10 SQL语句的处理过程
- oracle整合简单,无关联的数据库访问
- 使用PL/SQL将sql脚本数据导入数据库
- gen_grant_sel.sql oracle 数据库如何获取用户的DDL 所有权限
- ORACLE数据库SQL语句的执行过程
- 各种数据库(oracle、mysql、sqlserver等)在Spring中数据源的配置和JDBC驱动包
- oracle的imp导入时覆盖目标数据库
- Oracle 数据库和Sql Server数据库的区别
- Oracle SQL Developer保持数据库连接的方法
- Oracle数据库题库
- Oracle Oracle数据库 迁移到 SQL Server上