<< 返回文章列表

数据恢复|数据运维:你见过最高的 SQL Version 是多少?

2017年12月26日
盖国强
1154

【云和恩墨,提供7*24最专业的数据恢复(Oracle,MySQL,SQL server)服务,致力于为您的数据库系统做最后一道安全防护!服务热线:010-59007017-7030】数据恢复|数据库运维|性能优化|安全保障


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



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

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

image.png

image.png

image.png

image.png

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

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