[20171102]测试大量子光标对性能影响2.txt

简介: [20171102]测试大量子光标对性能影响2.txt --//跟开发讲关于绑定变量的问题,总有人讲不是有一个参数cursor_sharing能快捷简单地解决问题,设置cursor_sharing=force, --//实际上合理的使用绑定变量才是王道.

[20171102]测试大量子光标对性能影响2.txt

--//跟开发讲关于绑定变量的问题,总有人讲不是有一个参数cursor_sharing能快捷简单地解决问题,设置cursor_sharing=force,
--//实际上合理的使用绑定变量才是王道.
--//许多开发人员设置这个参数带来的各种bug,我第一次在8i下使用差点到处服务器cpu资源耗尽,好在我知道我当时的改动,修改回来一些正常.
--//我当时还记得设置这个参数报ora-00600错误.

--//我想起以前10g下遇到设置cursor_sharing=force的一个bug,正好拿来测试产生大量子光标的情况.

1.环境:
SCOTT@test> @&r/ver1

PORT_STRING                    VERSION        BANNER
------------------------------ -------------- ----------------------------------------------------------------
x86_64/Linux 2.4.xx            10.2.0.4.0     Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bi

SCOTT@test> CREATE PUBLIC DATABASE LINK loopback USING '192.168.100.33:1521/test';
Database link created.

--//建立一个loopback的dblink,实际上还是使用原来的服务器,这样可以简单模拟dblink的情况.
--//关于遇到bug的一些细节,参考链接 http://blog.itpub.net/267265/viewspace-1985215/=>[20160201]db_link与子光标问题.txt

2.建立测试环境:
CREATE TABLE t (n NUMBER);
INSERT INTO t VALUES (1);
COMMIT;
create unique index p_t on t(n);
execute dbms_stats.gather_table_stats(user,'t');

--//建立执行脚本tt1.sql,tt2.sql

$ cat tt1.sql
DECLARE
    l_count PLS_INTEGER;
BEGIN
    FOR i IN 1..1e5
    LOOP
    EXECUTE IMMEDIATE 'SELECT count(*) FROM t@loopback where n = '||i  into l_count ;
    END LOOP;
END;
/


$ cat tt2.sql
DECLARE
    l_count PLS_INTEGER;
BEGIN
    FOR i IN 1..1e5
    LOOP
        EXECUTE IMMEDIATE 'SELECT count(*) FROM t@loopback,dual where n = '|| i  into l_count ;
    END LOOP;
END;
/
--//注:如果加入一张本地表dual,就不会出现大量子光标的情况.

$ cat tt3.sql
DECLARE
    l_count PLS_INTEGER;
BEGIN
    FOR i IN 1..1e5
    LOOP
    EXECUTE IMMEDIATE 'SELECT count(*) FROM t@loopback where n = :x '  into l_count using i;
    END LOOP;
END;
/


3.测试一:
SCOTT@test> alter system set cursor_sharing=force scope=memory;
System altered.

--//注:测试一定要在system级别打开这个参数,因为dblink是本地服务器,这样如果cursor_sharing=force仅仅在会话级别设置,
--//远程的sql语句会按照原样执行,而不是如下,结果更慢....
--//SELECT COUNT(*) FROM "T" "A1" WHERE "A1"."N"=:"SYS_B_0"

alter system flush shared_pool;
set timing on
@ tt1.sql
commit

SCOTT@test> @ tt1.sql
PL/SQL procedure successfully completed.
Elapsed: 00:03:48.46

--//需要3:48.46.

SCOTT@test> select count(*),sql_text from v$sql where sql_id='f5z89fqpdz81t' group by sql_text;
  COUNT(*) SQL_TEXT
---------- ------------------------------------------------------------
      5861 SELECT count(*) FROM t@loopback where n = :"SYS_B_0"
--//可以发现产生大量子光标.


SCOTT@test> select count(*),sql_text,executions from v$sql where sql_id='2s6ybj0r4ukpb' group by sql_text,executions;
  COUNT(*) SQL_TEXT                                                     EXECUTIONS
---------- ------------------------------------------------------------ ----------
         1 SELECT COUNT(*) FROM "T" "A1" WHERE "A1"."N"=:"SYS_B_0"          100000


4.测试二:

alter system flush shared_pool;
set timing on
@ tt2.sql
commit

SCOTT@test> @ tt2.sql
PL/SQL procedure successfully completed.
Elapsed: 00:01:03.10
--//需要3:48.46.

SYS@test> select count(*),sql_text,executions  from v$sql where sql_id='5xjj10nkpcpgx' group by sql_text,executions;
  COUNT(*) SQL_TEXT                                                     EXECUTIONS
---------- ------------------------------------------------------------ ----------
         1 SELECT count(*) FROM t@loopback,dual where n = :"SYS_B_0"        100000

SYS@test> select count(*),sql_text,executions  from v$sql where sql_id='7gvf1y78qrx48' group by sql_text,executions;
  COUNT(*) SQL_TEXT                                                     EXECUTIONS
---------- ------------------------------------------------------------ ----------
         1 SELECT "N" FROM "T" "T" WHERE "N"=:1                             100000

--//远程执行语句与上面不同.

5.测试三:

alter system flush shared_pool;
set timing on
@ tt3.sql
commit

SCOTT@test> @ tt3.sql
PL/SQL procedure successfully completed.
Elapsed: 00:00:44.07

SYS@test> select count(*),sql_text,executions  from v$sql where sql_id='1s79mgdrcs29m' group by sql_text,executions;
  COUNT(*) SQL_TEXT                                                     EXECUTIONS
---------- ------------------------------------------------------------ ----------
         1 SELECT count(*) FROM t@loopback where n = :x                     100000

SYS@test> select count(*),sql_text,executions  from v$sql where sql_id='g8ug1c1cr255j' group by sql_text,executions;
  COUNT(*) SQL_TEXT                                                     EXECUTIONS
---------- ------------------------------------------------------------ ----------
         1 SELECT COUNT(*) FROM "T" "A1" WHERE "A1"."N"=:X                  100000

--//改用绑定变量44秒.

6.测试四:
--//补充测试,不使用dblink看看.
$ cat tt4.sql
DECLARE
    l_count PLS_INTEGER;
BEGIN
    FOR i IN 1..1e5
    LOOP
    EXECUTE IMMEDIATE 'SELECT count(*) FROM t where n = :x '  into l_count using i;
    END LOOP;
END;
/

alter system flush shared_pool;
set timing on
@ tt3.sql
commit


SCOTT@test> @ tt4.sql
PL/SQL procedure successfully completed.
Elapsed: 00:00:02.03

SYS@test> select count(*),sql_text,executions  from v$sql where sql_id='5duc59nwpqpfj' group by sql_text,executions;
  COUNT(*) SQL_TEXT                                                     EXECUTIONS
---------- ------------------------------------------------------------ ----------
         1 SELECT count(*) FROM t where n = :x                              100000

--//不知道为什么通过dblink连接会这么慢,除了产生少量事务外,语句多执行1倍外.也许更多的消耗在网络上.

目录
相关文章
|
1月前
|
安全 测试技术
BOSHIDA DC电源模块的安全性能评估与测试方法
BOSHIDA DC电源模块的安全性能评估与测试方法
 BOSHIDA DC电源模块的安全性能评估与测试方法
|
1月前
|
安全
DC电源模块的安全性能评估与测试方法
DC电源模块的安全性能评估与测试方法 DC电源模块的安全性能评估与测试方法应包括以下几个方面: 1. 输入安全性测试:包括输入电压范围、输入电压稳定性、输入电流范围、输入电流保护等方面的测试。测试方法可以是逐步增加输入电压或输入电流,观察模块的工作状态和保护功能。
DC电源模块的安全性能评估与测试方法
|
4月前
|
存储 测试技术 Linux
添加E1000网卡进行测试,只有VMXNET3性能的四分之一
添加E1000网卡进行测试,只有VMXNET3性能的四分之一
64 0
|
4月前
|
存储 测试技术 区块链
阿里云、百度云及移动云对象存储横向性能对比测试
在企业的数字化转型进程中,我们观察到越来越多的公司将其IT基础设施迁移到云端。随着企业业务的持续运营,无论是储存、处理、分享还是删除,都会产生大量的数据,这就要求有一个既可靠又高效的系统来管理和存储这些信息。对象存储产品在这个场景中扮演了至关重要的角色。它们以一种可扩展、安全、持久的方式,有效地满足了对大规模非结构化数据存储的需求。 尽管市场上云计算提供商众多,各自都有自己独特的对象存储产品,面对这样的丰富选择,如何寻找最符合企业需求的产品呢?这正是企业今天寻求解答的问题。 在本篇文章中,我们将深入进行一项横向对比测试,专门对阿里云OSS、百度云BOS和移动云EOS这三大云服务提供商的对象
1359 0
|
14天前
|
测试技术
深入白盒测试:提升软件质量与性能的关键策略
【4月更文挑战第6天】 在软件开发的生命周期中,确保代码质量和性能始终是至关重要的环节。白盒测试作为一种深入代码内部的测试方法,提供了对程序结构、逻辑路径和内部功能的全面评估。本文将探讨白盒测试的核心概念、技术及其在提升软件质量与性能方面的应用。通过分析控制流测试、数据流测试和静态代码分析等关键技术,我们揭示了白盒测试如何有效发现潜在缺陷,优化代码效率,并增强系统稳定性。
|
1月前
|
算法 Java 测试技术
性能工具之代码级性能测试工具ContiPerf
【2月更文挑战第23天】性能工具之代码级性能测试工具ContiPerf
266 1
性能工具之代码级性能测试工具ContiPerf
|
5月前
|
Java 应用服务中间件 测试技术
Tomcat压力测试tps性能下降问题
Tomcat压力测试tps性能下降问题
|
2月前
|
测试技术 BI
性能基准测试基本流程
性能基准测试基本流程
|
4月前
|
NoSQL 测试技术 Redis
Redis【性能 02】Redis-5.0.14伪集群和Docker集群搭建及延迟和性能测试(均无法提升性能)
Redis【性能 02】Redis-5.0.14伪集群和Docker集群搭建及延迟和性能测试(均无法提升性能)
151 0
|
4月前
|
NoSQL 测试技术 Redis
Redis【性能 01】Redis 5.x 6.x 7.x 共5个不同版本延迟及性能测试对比分析(单机版默认配置)
Redis【性能 01】Redis 5.x 6.x 7.x 共5个不同版本延迟及性能测试对比分析(单机版默认配置)
199 0