[20150608]dbms_random.value.txt

[20150608]dbms_random.value.txt

--11.2.0.3与11.2.0.4下,调用dbms_random.value存在很大的差异,测试看看:

SCOTT@test> @ver1
PORT_STRING                    VERSION        BANNER
------------------------------ -------------- --------------------------------------------------------------------------------
x86_64/Linux 2.4.xx            11.2.0.3.0     Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production

set timing on
declare
   n number;
  begin
   for i in 1..1e8
   loop
    n:=dbms_random.value(0,10000);
   end loop;
  end;
/

PL/SQL procedure successfully completed.
Elapsed: 00:03:03.84

SYS@dbendg> @ &r/ver1
PORT_STRING                    VERSION        BANNER
------------------------------ -------------- --------------------------------------------------------------------------------
x86_64/Linux 2.4.xx            11.2.0.4.0     Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production

SYS@dbendg> set timing on

declare
   n number;
  begin
   for i in 1..1e8
   loop
    n:=dbms_random.value(0,10000);
   end loop;
  end;
/
PL/SQL procedure successfully completed.
Elapsed: 00:05:50.83

--而11.2.0.3的服务器是4cpu。
processor       : 3
vendor_id       : GenuineIntel
cpu family      : 15
model           : 4
model name      :                   Intel(R) Xeon(TM) CPU 3.00GHz

--而11.2.0.4的服务器是24cpu。
processor       : 23
vendor_id       : GenuineIntel
cpu family      : 6
model           : 62
model name      :       Intel(R) Xeon(R) CPU E5-2630 v2 @ 2.60GHz

--主频基本一样,但是时间存在很大差异。

$ grep -i "package.*dbms_random" *.sql
dbmsrand.sql:CREATE OR REPLACE PACKAGE dbms_random AUTHID DEFINER AS
dbmsrand.sql:CREATE OR REPLACE PACKAGE BODY dbms_random AS

--包dbms_random的定义在dbmsrand.sql文件中。
--拷贝在一台机器使用diff对比:

$ diff -Nur dbmsrand11203.sql dbmsrand11204.sql
--- dbmsrand11203.sql   2015-06-08 09:50:57.000000000 +0800
+++ dbmsrand11204.sql   2015-06-08 09:50:05.000000000 +0800
@@ -1,10 +1,10 @@
Rem
-Rem $Header: rdbms/admin/dbmsrand.sql /main/9 2009/01/15 13:45:55 traney Exp $
+Rem $Header: rdbms/admin/dbmsrand.sql /st_rdbms_11.2.0/1 2013/03/11 01:24:43 yujwang Exp $
Rem
Rem dbmsrand.sql
Rem
-Rem Copyright (c) 1997, 2009, Oracle and/or its affiliates.
-Rem All rights reserved.
+Rem Copyright (c) 1997, 2013, Oracle and/or its affiliates.
+Rem All rights reserved.
Rem
Rem    NAME
Rem      dbmsrand.sql - RANDom number generation package
@@ -14,6 +14,7 @@
Rem
Rem    NOTES
Rem    MODIFIED   (MM/DD/YY)
+Rem    yberezin    02/26/13 - record and replay random number - bug 12676338
Rem    traney      01/08/09 - add authid definer
Rem    ssonawan    09/20/06 - bug 5527875: add parallel_enable clause
Rem    rjenkins    05/09/02 - bug 2383801: fix string()
@@ -100,6 +101,14 @@
         RETURN VARCHAR2 PARALLEL_ENABLE;  -- string of characters
     PRAGMA restrict_references (string, WNDS);

+    -- external C function to record random value
+    PROCEDURE record_random_number(val IN NUMBER);
+    PRAGMA restrict_references (record_random_number, WNDS);
+
+    -- external C function to replay random value
+    FUNCTION replay_random_number RETURN NUMBER;
+    PRAGMA restrict_references (replay_random_number, WNDS);
+
     -- Obsolete, just calls seed(val)
     PROCEDURE initialize(val IN BINARY_INTEGER);
     PRAGMA restrict_references (initialize, WNDS);
@@ -182,13 +191,37 @@
             END LOOP;
         END LOOP;
     END seed;
-
+
+
+   PROCEDURE record_random_number(val IN NUMBER) IS
+       LANGUAGE C
+       NAME "kecrRecordRandomNumber"
+       LIBRARY dbms_workload_capture_lib
+       WITH CONTEXT
+       PARAMETERS
+       ( CONTEXT,
+         val OCINumber );
+
+   FUNCTION replay_random_number RETURN NUMBER IS
+       LANGUAGE C
+       NAME "kecpReplayRemappedRandomNumber"
+       LIBRARY dbms_workload_replay_lib
+       WITH CONTEXT
+       PARAMETERS
+       ( CONTEXT,
+         RETURN INDICATOR );

     -- give values to the user
     -- Delayed Fibonacci, pilfered from Knuth volume 2
     FUNCTION value RETURN NUMBER  PARALLEL_ENABLE IS
     randval  NUMBER;
     BEGIN
+
+        randval := replay_random_number();  -- null if not in replay mode
+        IF randval IS NOT NULL THEN
+            RETURN randval;
+        END IF;
+
         counter := counter + 1;
         IF counter >= 55 THEN

@@ -215,6 +248,9 @@
             END IF;
             counter := 0;
         END IF;
+
+        record_random_number(mem(counter));  -- no-op if not in recording
+
         RETURN mem(counter);
     END value;

--可以发现11.2.0.4增加了两个函数record_random_number,replay_random_number,在调用value时,也调用这两个函数,导致执行时间
--增加。

时间: 2024-10-12 00:22:58

[20150608]dbms_random.value.txt的相关文章

[20170103]关于latch shared pool.txt

[20170103]关于latch shared pool.txt --网友问的问题:http://www.itpub.net/thread-2074374-1-1.html SCOTT@book> select * from V$EVENT_NAME where name='latch: shared pool';     EVENT#   EVENT_ID NAME                 PARAMETER1           PARAMETER2           PARAM

[20150205]关于位图索引6.txt

[20150205]关于位图索引6.txt --许多人知道在oltp系统不适合使用位图索引.它的索引的记录结构如下是: 字段0:键值 字段1:开始rowid 字段2:结束rowid 字段3:位图信息,指示那行记录,位图1=>表示存在.位图0=>表示不存在. --昨天主要学习了解了字段3的相关信息,昨晚想起以前itpub的讨论,讲位图索引很容易出现阻塞,主要是如果事务发生在同一个行片, --如果不在同一个行片,就不会出现阻塞,还是通过例子来说明: 1.建立测试环境: SCOTT@test>

[20150205]关于位图索引7.txt

[20150205]关于位图索引7.txt --许多人知道在oltp系统不适合使用位图索引.它的索引的记录结构如下是: 字段0:键值 字段1:开始rowid 字段2:结束rowid 字段3:位图信息,指示那行记录,位图1=>表示存在.位图0=>表示不存在. --但是字段4的位图信息,介绍的资料太少,我自己看了链接http://juliandyke.com/Presentations/BitmapIndexInternals.ppt,做一个简单探究. --前面的blog已经讲解了字段3的位图信息

[20150204]关于位图索引5.txt

[20150204]关于位图索引5.txt --许多人知道在oltp系统不适合使用位图索引.它的索引的记录结构如下是: 字段0:键值 字段1:开始rowid 字段2:结束rowid 字段3:位图信息,指示那行记录,位图1=>表示存在.位图0=>表示不存在. --但是字段4的位图信息,介绍的资料太少,我自己看了链接http://juliandyke.com/Presentations/BitmapIndexInternals.ppt,做一个简单探究. --前面的讲解仅仅在1个数据块的情况,如果开

[20141228]关于bloom filter.txt

[20141228]关于bloom filter.txt --系统升级到11.2.0.4 ,执行计划经常出现bloom filter,自己对这些一点都不了解. --自己做了google,能查到的资料不多,eygle的blog讲解,我水平有限,至少第1次没看懂,不过里面指向一个链接: --http://antognini.ch/papers/BloomFilters20080620.pdf --我仔细阅读,感觉还是不好理解,决定把里面的测试例子执行1次,后面做一个测试: --实际上bloom fi

[20150203]关于位图索引1.txt

[20150203]关于位图索引1.txt --许多人知道在oltp系统不适合使用位图索引.它的索引的记录结构如下是: 字段0:键值 字段1:开始rowid 字段2:结束rowid 字段3:位图信息,指示那行记录,位图1=>表示存在.位图0=>表示不存在. --但是字段4的位图信息,介绍的资料太少,我自己看了链接http://juliandyke.com/Presentations/BitmapIndexInternals.ppt,做一个简单探究. 1.建立测试环境: SCOTT@test&g

[20150203]关于位图索引2.txt

[20150203]关于位图索引2.txt --许多人知道在oltp系统不适合使用位图索引.它的索引的记录结构如下是: 字段0:键值 字段1:开始rowid 字段2:结束rowid 字段3:位图信息,指示那行记录,位图1=>表示存在.位图0=>表示不存在. --但是字段4的位图信息,介绍的资料太少,我自己看了链接http://juliandyke.com/Presentations/BitmapIndexInternals.ppt,做一个简单探究. 1.建立测试环境: SCOTT@test&g

[20150204]关于位图索引3.txt

[20150204]关于位图索引3.txt --许多人知道在oltp系统不适合使用位图索引.它的索引的记录结构如下是: 字段0:键值 字段1:开始rowid 字段2:结束rowid 字段3:位图信息,指示那行记录,位图1=>表示存在.位图0=>表示不存在. --但是字段4的位图信息,介绍的资料太少,我自己看了链接http://juliandyke.com/Presentations/BitmapIndexInternals.ppt,做一个简单探究. --昨天讲了Single-Byte Grou

[20150508]列顺序问题.txt

[20150508]列顺序问题.txt --链接: https://viveklsharma.wordpress.com/2015/04/30/cpu-cycles-for-column-skipping/ --测试列顺序对CPU cost的影响: SCOTT@test> @ver1 PORT_STRING                    VERSION        BANNER ------------------------------ -------------- --------