【sql調優】使用繫結變數(二)
(記錄丁俊,吉慶,楊奇龍和我 討論並測試的過程)
接前面的測試,再來看看在資料分佈改變較大的時候,結合直方圖測試一下繫結變數的一些特點。
update t_test_bind a set a.object_id = 3 where a.object_id > 1000;
commit;
analyze table t_test_bind compute statistics ;
analyze table t_test_bind compute statistics for columns object_id size 50;
SQL> select /*+ gather_plan_statistics*/count(object_id) from t_test_bind where object_id =3;
COUNT(OBJECT_ID)
----------------
58670
SQL> select * from table(dbms_xplan.display_cursor) a ;
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------------------------
SQL_ID c5x11x69qbdcf, child number 0
-------------------------------------
select /*+ gather_plan_statistics*/count(object_id) from t_test_bind where
object_id =3
Plan hash value: 2169226493
--------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | | | 78 (100)| |
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------------------------
| 1 | SORT AGGREGATE | | 1 | 3 | | |
|* 2 | INDEX FAST FULL SCAN| IND_TEST_BIND__OID | 58431 | 171K| 78 (3)| 00:00:01 |
--------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
2 - filter("OBJECT_ID"=3)
已選擇20行。
SQL>
注意到不使用繫結變數的時候走了index fast full scan,這時候因為有直方圖,這個執行計劃是優化的。
下面使用繫結變數:
SQL> var x2 number;
SQL> exec :x2 :=3;
PL/SQL 過程已成功完成。
SQL> select /*+ gather_plan_statistics*/count(*) from t_test_bind where object_id= :x2;
COUNT(*)
----------
58670
SQL> select * from table(dbms_xplan.display_cursor) a ;
PLAN_TABLE_OUTPUT
----------------------------------------------------------------------------------------------------------
--------------------
SQL_ID 7z3c4rcwmatz2, child number 0
-------------------------------------
select /*+ gather_plan_statistics*/count(*) from t_test_bind where object_id= :x2
Plan hash value: 2169226493
--------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | | | 78 (100)| |
| 1 | SORT AGGREGATE | | 1 | 3 | | |
PLAN_TABLE_OUTPUT
----------------------------------------------------------------------------------------------------------
--------------------
|* 2 | INDEX FAST FULL SCAN| IND_TEST_BIND__OID | 58431 | 171K| 78 (3)| 00:00:01 |
--------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
2 - filter("OBJECT_ID"=:X2)
已選擇19行。
恩,也是比較合理的。
接下來修改x2的值:
SQL> exec :x2 :=4;
PL/SQL 過程已成功完成。
SQL> select /*+ gather_plan_statistics*/count(*) from t_test_bind where object_id= :x2;
COUNT(*)
----------
1
SQL> select * from table(dbms_xplan.display_cursor) a ;
PLAN_TABLE_OUTPUT
----------------------------------------------------------------------------------------------------------
--------------------
SQL_ID 7z3c4rcwmatz2, child number 0
-------------------------------------
select /*+ gather_plan_statistics*/count(*) from t_test_bind where object_id= :x2
Plan hash value: 2169226493
--------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | | | 78 (100)| |
| 1 | SORT AGGREGATE | | 1 | 3 | | |
PLAN_TABLE_OUTPUT
----------------------------------------------------------------------------------------------------------
--------------------
|* 2 | INDEX FAST FULL SCAN| IND_TEST_BIND__OID | 58431 | 171K| 78 (3)| 00:00:01 |
--------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
2 - filter("OBJECT_ID"=:X2)
已選擇19行。
SQL>
可以看到,這是繫結變數的特點了,沿用了前面已經解析後生成的執行計劃,但是我們清楚資料的分佈,也做過直方圖,最優的情況應該是下面這種:
SQL> select /*+ gather_plan_statistics*/count(*) from t_test_bind where object_id= 4;
COUNT(*)
----------
1
SQL> select * from table(dbms_xplan.display_cursor) a ;
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------------------------
--------------------
SQL_ID g29jyjygzd6sv, child number 0
-------------------------------------
select /*+ gather_plan_statistics*/count(*) from t_test_bind where object_id= 4
Plan hash value: 4208194829
----------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
----------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | | | 1 (100)| |
| 1 | SORT AGGREGATE | | 1 | 3 | | |
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------------------------
--------------------
|* 2 | INDEX RANGE SCAN| IND_TEST_BIND__OID | 1 | 3 | 1 (0)| 00:00:01 |
----------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
2 - access("OBJECT_ID"=4)
已選擇19行。
SQL>
所以,在使用繫結變數的時候,需要注意到非常大的資料分佈的改變時,可能之前的執行計劃已經不是最優的了,這種情況下,使用繫結變數的缺點就暴露出來了。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/16179598/viewspace-672921/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 【sql調優】使用繫結變數(一)SQL變數
- 【SQL 調優】繫結變數窺測SQL變數
- 【sql調優】繫結變數與CBOSQL變數
- 【優化】使用繫結變數 OR 不使用繫結變數,這不是問題!優化變數
- SQL Developer中使用繫結變數SQLDeveloper變數
- SQL使用繫結變數,測試例項。SQL變數
- SQL Server動態SQL,繫結變數SQLServer變數
- oracle 查詢未使用繫結變數的sqlOracle變數SQL
- 繫結變數優缺點、使用、繫結變數窺探、 Oracle自適應共享遊標變數Oracle
- PLSQL使用繫結變數SQL變數
- 【效能優化】查詢繫結變數的sql語句優化變數SQL
- 繫結變數及其優缺點變數
- 關於繫結變數的SQL繫結什麼值變數SQL
- SQL*Plus中使用DATE型別的繫結變數SQL型別變數
- 查詢沒有使用繫結變數的sql zt變數SQL
- 【最佳化】使用繫結變數 OR 不使用繫結變數,這不是問題!變數
- 檢視未繫結變數的sql變數SQL
- 獲取sql繫結變數的值SQL變數
- 統計沒有繫結變數SQL變數SQL
- ORACLE優化實戰(繫結變數)Oracle優化變數
- V$sql查詢未使用繫結變數的語句SQL變數
- PL/SQL中繫結變數使用的簡單測試SQL變數
- oracle找出沒有使用繫結變數的sql語句Oracle變數SQL
- 尋找沒有使用繫結變數的sql語句變數SQL
- 繫結變數變數
- 繫結變數的使用範圍變數
- 關於繫結變數的使用變數
- 關於pl/sql中的繫結變數SQL變數
- [SQL]oracle 繫結變數(bind variable)[轉載]SQLOracle變數
- 【SQL】在SQLPLUS中使用繫結變數的寫法SQL變數
- 使用繫結變數的一點總結!變數
- 繫結變數之繫結變數窺探(Bind Peeking)變數
- 繫結變數在靜態sql和動態sql中變數SQL
- Oracle 繫結變數Oracle變數
- 關於sql_profile中的繫結變數SQL變數
- 統計未用繫結變數的sql語句變數SQL
- v$sql_bind_capture 獲取繫結變數SQLAPT變數
- Oracle中如何查詢未使用繫結變數的SQL語句?Oracle變數SQL