Oracle   发布时间:2022-05-17  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了Oracle 数据库之最:你见过最高的 SQL Version 是多少?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

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

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

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

产生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。

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

Rem 这里我们修改了NLS_SORT参数,
Rem 再来查看sql的游标数。

sql> alter session set nls_sort = 'SCHInesE_RADicAL_M'; Session altered.

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

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

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

REM 可以看到,第二个子游标是因为优化器
REM 模式不匹配产生的,OPTIMIZER_MODE_MIsmaTCH.

REM 以下步骤,我们绑定了不同长度的绑定变量
REM 由此又可能产生新的sql版本。

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

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


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

SCHInesE_RADicAL_M   针对简体中文,按照部首(第一顺序)、笔划(第二顺序)排序
SCHInesE_stroke_M    针对简体中文,按照笔划(第一顺序)、部首(第二顺序)排序
SCHInesE_PINYIN_M       针对简体中文,按照拼音排序
TCHInesE_RADicAL_M    针对繁体中文,按照部首(第一顺序)、笔划(第二顺序)排序
TCHInesE_stroke_M     针对繁体中文,按照笔划(第一顺序)、部首(第二顺序)排序

当然可以逐一尝试:

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

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

加入"云和墨大讲堂"微信群,讨论学习

搜索 盖国强(Eygle)微信号:eyygle,或者扫描下面二维码,备注:云和墨大讲堂,即可入群。每周与千人共享免费技术分享,与讲师在线讨论。

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

关注公众号,获得后续精彩分享

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

大佬总结

以上是大佬教程为你收集整理的Oracle 数据库之最:你见过最高的 SQL Version 是多少?全部内容,希望文章能够帮你解决Oracle 数据库之最:你见过最高的 SQL Version 是多少?所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签: