SQL語句為什麼不會共享(中)
前篇(http://space.itpub.net/17203031/viewspace-703624)中我們介紹了SQL父子游標機制和兩種SQL不共享的情形。本篇中我們繼續介紹由於物件不一致和cursor_sharing等因素帶來的SQL不共享的問題。
5、SQL指定物件相同(2)
分別從兩個schema下發出SQL,對應相同的物件。我們這裡使用公有同義詞技術。
SQL> show user
User is "SYS"
SQL> create public synonym m for t;
Synonym created
SQL> select /*+ demo_3 */ count(*) from m;
COUNT(*)
----------
18015
SQL> conn scott/tiger@orcl;
Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.1.0
Connected as scott
SQL> select /*+ demo_3 */ count(*) from m;
COUNT(*)
----------
18015
兩句SQL相同,而且指定物件相同。那麼遊標共享情況如何呢?
SQL> select sql_text, sql_id, OPTIMIZER_MODE, hash_value, plan_hash_value, address, executions,version_count from v$sqlarea where sql_text like 'select /*+ demo_3 */%';
SQL_TEXT SQL_ID OPTIMIZER_MODE HASH_VALUE PLAN_HASH_VALUE ADDRESS EXECUTIONS VERSION_COUNT
-------------------------------------------------------------------------------- ------------- -------------- ---------- --------------- -------- ---------- -------------
select /*+ demo_3 */ count(*) from m 9pdna8fx02604 ALL_ROWS 3120633860 2966233522 6CE7C19C 1 1
select /*+ demo_3 */ count(*) from m 8pvzq44h3rnnv ALL_ROWS 540791451 2966233522 695B4930 1 1
SQL> select sql_id, PARSING_SCHEMA_NAME, child_number,executions from v$sql where sql_id='9pdna8fx02604';
SQL_ID PARSING_SCHEMA_NAME CHILD_NUMBER EXECUTIONS
------------- ------------------------------ ------------ ----------
9pdna8fx02604 SYS 0 1
SQL> select sql_id, PARSING_SCHEMA_NAME, child_number,executions from v$sql where sql_id='8pvzq44h3rnnv';
SQL_ID PARSING_SCHEMA_NAME CHILD_NUMBER EXECUTIONS
------------- ------------------------------ ------------ ----------
8pvzq44h3rnnv SCOTT 0 1
結果顯而易見,雖然執行SQL相同,對應物件也是相同。但是Oracle在這種情況下,也是會處理為兩個父遊標。這樣的語句不進行共享。
6、cursor_sharing模式
在CBO時代,cursor_sharing可能是我們最常討論的一個引數。cursor_sharing的設定,主要在於對繫結變數SQL的使用和是否將字面SQL整理為繫結變數SQL上。那麼,cursor_sharing不同的設定值,是否會影響到SQL shared_cursor的使用呢?
//當前spfile中定義的引數值為EXACT;
SQL> show parameter cursor_sharing;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
cursor_sharing string EXACT
//當前session所使用的引數值;
SQL> select name, value from v$parameter where name='cursor_sharing';
NAME VALUE
-------------------- --------------------
cursor_sharing EXACT
此時我們呼叫Demo的SQL語句。
SQL> select /*+ demo_4 */ count(*) from t;
COUNT(*)
----------
18015
我們修改引數值,之後檢視結果。
SQL> alter session set cursor_sharing=FORCE;
Session altered
SQL> select name, value from v$parameter where name='cursor_sharing';
NAME VALUE
-------------------- --------------------
cursor_sharing FORCE
SQL> select /*+ demo_4 */ count(*) from t;
COUNT(*)
----------
18015
此時,我們觀察父子游標檢視。
SQL> select sql_text, sql_id, OPTIMIZER_MODE, hash_value, plan_hash_value, address, executions,version_count from v$sqlarea where sql_text like 'select /*+ demo_4 */%';
SQL_TEXT SQL_ID OPTIMIZER_MODE EXECUTIONS VERSION_COUNT
--------------------------------------- ------------- -------------- ---------- -------------
select /*+ demo_4 */ count(*) from t 5v4v3gmkh8aaf ALL_ROWS 2 1
SQL> select sql_id, PARSING_SCHEMA_NAME, child_number,executions from v$sql where sql_id='5v4v3gmkh8aaf';
SQL_ID PARSING_SCHEMA_NAME CHILD_NUMBER EXECUTIONS
------------- ------------------------------ ------------ ----------
5v4v3gmkh8aaf SYS 0 2
注意,一個child cursor對應兩次執行。
結論:在相同的環境下,cursor_sharing引數不會影響到一般SQL的執行情況。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/17203031/viewspace-703757/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Java中如何解析SQL語句、格式化SQL語句、生成SQL語句?JavaSQL
- 為什麼 SQL 語句使用了索引,但卻還是慢查詢?SQL索引
- springboot 中列印 sql 語句Spring BootSQL
- Python中break語句和continue語句有什麼區別?Python
- GreatSQL 中為什麼 Update 不會被鎖等待SQL
- 為什麼說共享WiFi專案是如今風口,會不會已經太晚了!WiFi
- SQL語句SQL
- 必知必會——SQL語句基本語法整理SQL
- 執行一條sql語句都經歷了什麼?SQL
- 執行一條 SQL 語句,期間發生了什麼?SQL
- Jtti:MySQL 資料庫中update語句會不會發生死鎖JttiMySql資料庫
- 為什麼說會不會SQL,決定著你的工資?方向不對,努力也白費!SQL
- sql中row_number over語句SQL
- 程式語言中為什麼使用分號作為語句結束符?
- 【SQL】9 SQL INSERT INTO 語句SQL
- 【SQL】10 SQL UPDATE 語句SQL
- 【SQL】11 SQL DELETE 語句SQLdelete
- SQL SELECT 語句SQL
- sql常用語句SQL
- [20240607]PL/SQL中sql語句的註解.txtSQL
- 網站為什麼會打不開網站
- [20240409]為什麼一條sql語句在例項2執行要慢的分析.txtSQL
- [20210407]分析sql語句的共享記憶體段3.txtSQL記憶體
- [20220328]查詢游標為什麼不共享指令碼.txt指令碼
- 關於Mybatis中SQL語句的整理MyBatisSQL
- SAP:什麼熱 什麼不熱 為什麼你會關心?(轉)
- java switch語句是什麼?Java
- Java 可以採用什麼語句跳出迴圈語句Java
- 這就是為什麼你學不會DDD
- Python 的切片為什麼不會索引越界?Python索引
- 1.3. SQL 語句SQL
- Oracle基本SQL語句OracleSQL
- Sql語句小整理SQL
- SQL語句優化SQL優化
- SQL語句IN的用法SQL
- SQL 語句學習SQL
- (xml中sql語句為紅)解決No data sources are configured to run this SQL and provide advanced的問題XMLSQLIDE
- [20220420]完善查詢游標為什麼不共享指令碼.txt指令碼
- MySQL 修改int型別為bigint SQL語句拼接MySql型別