Advertisement
ExaGridDba

Different access / filter predicate, same plan_hash_value

Apr 26th, 2015
284
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. [oracle@stormking cdb12102 sqlplan]$ sqlplus /nolog @ accessvsfilter.SQL
  2.  
  3. SQL*Plus: RELEASE 12.1.0.2.0 Production ON Sun Apr 26 13:17:25 2015
  4.  
  5. Copyright (c) 1982, 2014, Oracle.  ALL rights reserved.
  6.  
  7. Connected.
  8. SQL> SET linesize 200
  9. SQL> SET pagesize 0
  10. SQL> SET trimspool ON
  11. SQL> WHENEVER oserror EXIT 1
  12. SQL> variable sqlid1 VARCHAR2(13)
  13. SQL> variable cld1 NUMBER
  14. SQL> variable phv1 NUMBER
  15. SQL> variable sqlid2 VARCHAR2(13)
  16. SQL> variable cld2 NUMBER
  17. SQL> variable phv2 NUMBER
  18. SQL> variable xplanopts VARCHAR2(40)
  19. SQL> EXEC :xplanopts := 'basic'
  20.  
  21. PL/SQL PROCEDURE successfully completed.
  22.  
  23. SQL> EXEC :xplanopts := NULL
  24.  
  25. PL/SQL PROCEDURE successfully completed.
  26.  
  27. SQL>
  28. SQL> DROP TABLE p;
  29.  
  30. TABLE dropped.
  31.  
  32. SQL> CREATE TABLE p (
  33.   2  m NUMBER,
  34.   3  n NUMBER,
  35.   4  a NUMBER
  36.   5  );
  37.  
  38. TABLE created.
  39.  
  40. SQL> CREATE INDEX i ON p ( m, n );
  41.  
  42. INDEX created.
  43.  
  44. SQL> INSERT INTO p ( m, n, a )
  45.   2  SELECT
  46.   3  MOD ( LEVEL, 499979 ),
  47.   4  MOD ( LEVEL, 131 ),
  48.   5  MOD ( LEVEL, 137 )
  49.   6  FROM dual
  50.   7  CONNECT BY LEVEL <=1000000;
  51.  
  52. 1000000 ROWS created.
  53.  
  54. SQL>
  55. SQL> EXEC dbms_stats.gather_table_stats(NULL,'p' );
  56.  
  57. PL/SQL PROCEDURE successfully completed.
  58.  
  59. SQL>
  60. SQL> SELECT m, n, a FROM p WHERE m = 499978 AND n = 34;
  61.     499978         34        131
  62.  
  63. SQL> @ phv1
  64. SQL> BEGIN
  65.   2  SELECT sql_id, child_number, plan_hash_value INTO :sqlid1, :cld1, :phv1
  66.   3  FROM v$sql
  67.   4  WHERE ( sql_id, child_number ) IN (
  68.   5          SELECT prev_sql_id, prev_child_number
  69.   6          FROM v$session WHERE sid = SYS_CONTEXT( 'userenv','sid' )
  70.   7  );
  71.   8  END;
  72.   9  /
  73.  
  74. PL/SQL PROCEDURE successfully completed.
  75.  
  76. SQL> @ xpl1
  77. SQL> SELECT * FROM TABLE( dbms_xplan.display_cursor( :sqlid1, :cld1, :xplanopts ));
  78. SQL_ID  f8x4m8pwykd98, child NUMBER 0
  79. -------------------------------------
  80. SELECT m, n, a FROM p WHERE m = 499978 AND n = 34
  81.  
  82. PLAN hash VALUE: 1743606228
  83.  
  84. --------------------------------------------------------------------------------------------
  85. | Id  | Operation                           | Name | ROWS  | Bytes | COST (%CPU)| TIME     |
  86. --------------------------------------------------------------------------------------------
  87. |   0 | SELECT STATEMENT                    |      |       |       |     4 (100)|          |
  88. |   1 |  TABLE ACCESS BY INDEX ROWID BATCHED| P    |     1 |    11 |     4   (0)| 00:00:01 |
  89. |*  2 |   INDEX RANGE SCAN                  | I    |     1 |       |     3   (0)| 00:00:01 |
  90. --------------------------------------------------------------------------------------------
  91.  
  92. Predicate Information (IDENTIFIED BY operation id):
  93. ---------------------------------------------------
  94.  
  95.    2 - ACCESS("M"=499978 AND "N"=34)
  96.  
  97.  
  98. 19 ROWS selected.
  99.  
  100. SQL>
  101. SQL> DROP INDEX i;
  102.  
  103. INDEX dropped.
  104.  
  105. SQL> CREATE INDEX i ON p ( m );
  106.  
  107. INDEX created.
  108.  
  109. SQL> SELECT m, n, a FROM p WHERE m = 499978 AND n = 34;
  110.     499978         34        131
  111.  
  112. SQL> @ phv2
  113. SQL> BEGIN
  114.   2  SELECT sql_id, child_number, plan_hash_value INTO :sqlid2, :cld2, :phv2
  115.   3  FROM v$sql
  116.   4  WHERE ( sql_id, child_number ) IN (
  117.   5          SELECT prev_sql_id, prev_child_number
  118.   6          FROM v$session WHERE sid = SYS_CONTEXT( 'userenv','sid' )
  119.   7  );
  120.   8  END;
  121.   9  /
  122.  
  123. PL/SQL PROCEDURE successfully completed.
  124.  
  125. SQL> @ xpl2
  126. SQL> SELECT * FROM TABLE( dbms_xplan.display_cursor( :sqlid2, :cld2, :xplanopts ));
  127. SQL_ID  f8x4m8pwykd98, child NUMBER 0
  128. -------------------------------------
  129. SELECT m, n, a FROM p WHERE m = 499978 AND n = 34
  130.  
  131. PLAN hash VALUE: 1743606228
  132.  
  133. --------------------------------------------------------------------------------------------
  134. | Id  | Operation                           | Name | ROWS  | Bytes | COST (%CPU)| TIME     |
  135. --------------------------------------------------------------------------------------------
  136. |   0 | SELECT STATEMENT                    |      |       |       |     5 (100)|          |
  137. |*  1 |  TABLE ACCESS BY INDEX ROWID BATCHED| P    |     1 |    11 |     5   (0)| 00:00:01 |
  138. |*  2 |   INDEX RANGE SCAN                  | I    |     2 |       |     3   (0)| 00:00:01 |
  139. --------------------------------------------------------------------------------------------
  140.  
  141. Predicate Information (IDENTIFIED BY operation id):
  142. ---------------------------------------------------
  143.  
  144.    1 - filter("N"=34)
  145.    2 - ACCESS("M"=499978)
  146.  
  147.  
  148. 20 ROWS selected.
  149.  
  150. SQL> @ cmp
  151. SQL> SELECT :sqlid1, :cld1, :phv1, :sqlid2, :cld2, :phv2, CASE WHEN :phv1 = :phv2 THEN 'SAME' ELSE 'DIFFERENT' END cmp FROM dual;
  152. f8x4m8pwykd98                             0 1743606228 f8x4m8pwykd98                             0 1743606228 SAME
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement