1. 程式人生 > >Oracle 繫結變數窺探

Oracle 繫結變數窺探

Bind Peeking是Oracle 9i中引入的新特性,一直持續到Oracle 10g R2。它的作用就是在SQL語句硬分析的時候,檢視一下當前SQL謂詞的值
,以便生成最佳的執行計劃。而在oracle 9i之前的版本中,Oracle 只根據統計資訊來做出執行計劃。

一、繫結變數窺探 
    使用SQL首次執行時的值來生成執行計劃。後續再次執行該SQL語句則使用首次執行計劃來執行。
    影響的版本:Oracle 9i, Oracle 10g
    對於繫結變數列中的特殊值或非均勻分佈列上的繫結變數會造成非高效的執行計劃被選擇並執行。
    
        要注意的是,Bind Peeking只發生在硬分析的時候,即SQL被第一次執行的時候,之後的變數將不會在做peeking。我們可以看出,Bind 
    peeking並不能最終解決不同謂詞導致選擇不同執行計劃的問題,它只能讓SQL第一次執行的時候,執行計劃選擇更加準確,並不能幫助OLAP
    系統解決繫結變數導致執行計劃選擇錯誤的問題。這也是OLAP不應該使用繫結變數的一個原因。

        更確切地說,繫結變數窺探是在SQL解析的物理階段,查詢優化器將會窺探繫結變數的值並將其作為字面量來使用。即ORACLE首次解析
    SQL時會將變數的真實值代入產生執行計劃,後續對所有使用該繫結變數SQL語句都採用首次生存的執行計劃。如此這般?那效能究竟如何?
    結果是並非最佳的執行計劃的使用。此問題在Oracle 11g中得以解決。  
        請參考:Oracle自適應共享遊標

二、示例繫結變數窺探
    1、建立演示環境       

[sql] view plaincopyprint?
  1. SQL> 
    select * from v$version where rownum<2;    -->檢視當前資料庫版本                                         
  2. BANNER                                                                                                          
  3. ----------------------------------------------------------------                                              
  4. Oracle Database 10g Release 10.2.0.3.0 - 64bit Production                                                       
  5. SQL> createtable t(id,owner,object_id) as-->建立測試表t                                               
  6.   2  select rownum,owner,object_id from all_objects where rownum<=1000;                                         
  7. SQL> altertable t addconstraint t_pk primarykey(id);  -->為表t新增主鍵                                     
  8. SQL> begin-->收集統計資訊,此處未生成直方圖資訊                 
  9.   2  dbms_stats.gather_table_stats(                                                                             
  10.   3  ownname=>'SCOTT',                                                                                          
  11.   4  tabname=>'T',                                                                                              
  12.   5  estimate_percent=>100,                                                                                     
  13.   6  method_opt=>'for all columns size 1');                                                                     
  14.   7  end;                                                                                                       
  15.   8  /                                                                                                          
  16. PL/SQL procedure successfully completed.                                                                        
  17. SQL> selectcount(id),count(distinct id),min(id),max(id) from t;  -->檢視值的分佈情況                         
  18.  COUNT(ID) COUNT(DISTINCTID)    MIN(ID)    MAX(ID)                                                              
  19. ---------- ----------------- ---------- ----------                                                            
  20.       1000              1000          1       1000                                                              

    2、未使用繫結變數情形下SQL語句的執行計劃       

[sql] view plaincopyprint?
  1. SQL> selectsum(object_id) from t where id<900;     -->釋出SQL 查詢語句                                              
  2. SUM(OBJECT_ID)                                                                                                         
  3. --------------                                                                                                       
  4.         446549                                                                                                         
  5. SQL> select * fromtable(dbms_xplan.display_cursor()); -->由其執行計劃可知,當前的SQL語句使用了全表掃描              
  6. /**************************************************/                                                                   
  7. /* Author: Robinson Cheng                         */                                                                   
  8. /* Blog:   http://blog.csdn.net/robinson_0612     */                                                                   
  9. /* MSN:    [email protected]              */                                                                   
  10. /* QQ:     645746311                              */                                                                   
  11. /**************************************************/                                                                   
  12. PLAN_TABLE_OUTPUT                                                                                                      
  13. ---------------------------------------------------------------------------                                          
  14. SQL_ID  bz6h6fdsxgjka, child number 0                                                                                  
  15. -------------------------------------                                                                                
  16. selectsum(object_id) from t where id<900                                                                              
  17. Plan hash value: 2966233522                                                                                            
  18. ---------------------------------------------------------------------------                                          
  19. | Id  | Operation          | Name | Rows  | Bytes | Cost (%CPU)| Time     |                                            
  20. ---------------------------------------------------------------------------                                          
  21. |   0 | SELECT STATEMENT   |      |       |       |     3 (100)|          |                                            
  22. |   1 |  SORT AGGREGATE    |      |     1 |     8 |            |          |                                            
  23. |*  2 |   TABLE ACCESS FULL| T    |   900 |  7200 |     3   (0)| 00:00:01 |                                            
  24. ---------------------------------------------------------------------------                                          
  25. Predicate Information (identified by operation id):                                                                    
  26. ---------------------------------------------------                                                                  
  27.    2 - filter("ID"<900)                                                                                                
  28. SQL> selectsum(object_id) from t where id<10;   -->釋出另一條SQL 查詢語句                                           
  29. SQL> select * fromtable(dbms_xplan.display_cursor()); -->此時的查詢生成的執行計劃走索引範圍掃描                     
  30.                                                        -->由於字面量不同,因此兩條SQL語句生成了不同的SQL_ID與執行計劃
  31. PLAN_TABLE_OUTPUT                                                                                                      
  32. --------------------------------------------------------------------------                                           
  33. SQL_ID  6y2280pyvacfq, child number 0                                                                                  
  34. -------------------------------------                                                                                
  35. selectsum(object_id) from t where id<10                                                                               
  36. Plan hash value: 4270555908                                                                                            
  37. -------------------------------------------------------------------------------------                                
  38. | Id  | Operation                    | Name | Rows  | Bytes | Cost (%CPU)| Time     |                                  
  39. -------------------------------------------------------------------------------------                                
  40. |   0 | SELECT STATEMENT             |      |       |       |     3 (100)|          |                                  
  41. |   1 |  SORT AGGREGATE              |      |     1 |     8 |            |          |                                  
  42. |   2 |   TABLE ACCESS BYINDEX ROWID| T    |     9 |    72 |     3   (0)| 00:00:01 |                                  
  43. |*  3 |    INDEX RANGE SCAN          | T_PK |     9 |       |     2   (0)| 00:00:01 |                                  
  44. -------------------------------------------------------------------------------------                                
  45. Predicate Information (identified by operation id):                                                                    
  46. ---------------------------------------------------                                                                  
  47.    3 - access("ID"<10)                                                                                                 

    3、使用繫結變數情形下的執行計劃             

[sql] view plaincopyprint?
  1. SQL> variable v_id number;   -->定義繫結變數                                                                         
  2. SQL> exec :v_id:=900;        -->給繫結變數賦值                                                                       
  3. PL/SQL procedure successfully completed.                                                                               
  4. SQL> 

    相關推薦

    Oracle 變數窺探

    Bind Peeking是Oracle 9i中引入的新特性,一直持續到Oracle 10g R2。它的作用就是在SQL語句硬分析的時候,檢視一下當前SQL謂詞的值 ,以便生成最佳的執行計劃。而在oracle 9i之前的版本中,Oracle 只根據統計資訊來做出執行計劃。

    ORACLE 變數用法總結

    之前對ORACLE中的變數一直沒個太清楚的認識,比如說使用:、&、&&、DEIFINE、VARIABLE……等等。今天正好閒下來,上網搜了搜相關的文章,彙總了一下,貼在這裡,方便學習。 ================================

    直方圖;變數窺探;自適應遊標

    搭建環境 構建一個表 CREATE TABLE TEST2 AS SELECT * FROM DBA_OBJECTS; UPDATE SET OBJECT_ID = 11111 WHERE ROWNUM <=50000; 建立索引: CREATE INDEX IND

    oracle變數使用方法總結

    在Oracle中,對於一個提交的sql語句,存在兩種可選的解析過程,硬解析和軟解析。 一個硬解析需要經解析,制定執行路徑,優化訪問計劃等步驟。硬解析不僅僅會耗費大量的cpu,更重要的是會佔據重要的閂(latch)資源。唯一使得oracle能夠重複利用執行計劃的方法就是採用繫

    oracle 變數,索引優缺點

    繫結變數 優點: 可以在library cache中共享遊標,避免硬解析以及與之相關的額外開銷 在大批量資料操作時將呈數量級來減少閂鎖的使用,避免閂鎖的競爭 缺點: 繫結變數被使用時,查詢優化器會忽略其具體

    檢視oracle中未使用變數的sql語句

    資料庫版本:11.2.0.4 查詢語句: with force_mathces as (select l.force_matching_signature mathces, max(l.sql_id || l.child_number) max_sql_

    mybatis批量分批次插入oracle資料庫,報ORA-01745: 無效的主機/變數名...

    方法一:迴圈呼叫插入單條記錄的方法,效率真心讓人捉急 (3萬條資料,快三分鐘)     public int saveGwghidlist1(List<Gwghid> list) {                  int xh=0;         dele

    oracle動態sql以及變數

            實現動態SQL有兩種方式:DBMS_SQL和本地動態SQL(EXECUTE IMMEIDATE) 。 oracle從8代開始就提供了新的執行動態sql的功能:execute immeidate v_sql using *** into ***; 本地動態

    關於變數關閉的情況,Oracle是如何工作的?

    關於如果繫結變數窺探被關閉了,oracle 會怎麼處理的呢?是每次都硬解析還是這樣處理? 首先介紹下繫結變數窺探: 使用SQL首次執行時的值來生成執行計劃。後續再次執行該SQL語句則使用首次執行計劃來執行。 測試版本:Oracle 12.1.0.2

    oracle筆記--case的使用和變數

    oracle裡的case功能非常強大, 簡單的用法: select  CASE sex WHEN '1' THEN '男' WHEN '2' THEN '女' ELSE '其他' END from student; 還沒有當做預處理去使用 select

    oracle開發過程中儘量使用變數

    在儲存過程或者java程式使用sql的過程中,儘量使用繫結變數。否則硬解析太多,比較拖效能。 下面查詢只是空格多了幾個。 SQL> select * from ml_1234 where a

    oracle變數的使用

    不使用繫結變數而使用硬編碼是oracle效能問題的主要原因和可伸縮性的主要障礙而且這種障礙是除了使用繫結變數以外很難改變的!下面根據一個簡單的試驗來檢視硬編碼與使用繫結變數對效能的影響:在一個查詢中我們可以使用兩種方式:比如查詢個人編號:select * from ac01

    Oracle面對“資料傾斜列使用變數”場景的解決方案

    1.背景知識介紹 2.構造測試用例 3.場景測試 4.總結 1.背景知識介紹     我們知道,Oracle在傳統的OLTP(線上事務處理)類系統中,強烈推薦使用繫結變數,這樣可以有效的減少硬解析從而增加系統的併發處理能力。甚至在有些老舊系統,由於在開始開發階段缺乏

    Oracle SQL調優之變數用法簡介

    最近在看《基於Oracle的SQL優化一書》,並做了筆記,作者的個人部落格:[http://www.dbsnake.net/](http://www.dbsnake.net/) @[toc] ## 一、SQL執行過程簡介 繼上一篇部落格Oracle的cursor學習筆記:[Oracle的遊標Cursor原理

    SQL Profiles的force_match引數在不改變程式碼的情況下解決沒有使用變數的問題

    How To Use SQL Profiles for Queries Using Different Literals Using the Force_Match Parameter of DBMS_SQLTUNE.ACCEPT_SQL_PROFILE (Doc ID 1253696.1)

    Nginx 內建變數

    Nginx作為一個成熟、久經考驗的負載均衡軟體,與其提供豐富、完整的內建變數是分不開的,它極大增加了對Nginx網路行為的控制細度。這些變數大部分都是在請求進入時解析的,並把他們快取到請求cycle中,方便下一次獲取使用。首先來看看Nginx對都開放了那些API。 參看下表

    angular/ionic中對img、iframe等的src進行動態變數的問題解決

    例如以下程式碼: 對應的html頁面中是這樣:<iframe class=“filling” [src] = “iframe”> 在這裡直接對src進行動態繫結變數就會出現:unsafe value used in a resource URL co

    spring 中@ModelAttribute變數中文亂碼的解決辦法

    網上找了一些方法: 方法一 在專案的web.xml中配置spring的Character Encoding Filter <!-- Servlet Encoding Start --> <filter> <filter

    python cx_oracle 變數

    insert into tlcb_collect_f5 values(:stime,:virtual_servers,:default_pool_name,:ipaddr,:port,:AVAILABILITY_STATUS,:ENABLED_STATUS,:POOL_MEMBER_STATUS);

    powershell指令碼,命令列引數傳值,並變數的例子

            這是小技巧文章,所以文章不長。但原創唯一,非常重要。我搜了下,還真沒有人發 powershell怎樣 【命令列 引數 繫結】,所以我決定寫成部落格。 搜尋關鍵字如下: powershell 命令列 引數 繫結 powershell 傳入 引數 powershell 傳遞 引數 p