共享SQL語句
為了不重複解析完全相同的SQL語句,在第一次解析之後,Oracle將解析後的SQL語句儲存在記憶體中。
SGA->Shared Pool->Library Cache->Shared SQL Area。
Oracle對Share SQL Area的共享要求兩個SQL語句在文字上必須完成相同,包括空格、換行、大小寫都必須完全相同。點選(此處)摺疊或開啟
-
--清空shared pool
-
sys@TESTDB11>alter system flush shared_pool;
-
-
--使用scott執行下面的語句
-
scott@TESTDB11>select * from emp where empno = 7788;
-
scott@TESTDB11>select * from emp where empno = 7788;
-
scott@TESTDB11>SELECT * FROM EMP WHERE EMPNO = 7788;
-
scott@TESTDB11>Select * From Emp Where Empno = 7788;
-
scott@TESTDB11>select * from emp where empno = 7788;
-
-
--檢視在SCOTT方案中解析的SQL語句,結論:語句的文字必須完全相同才能被認為是相同的SQL語句
-
sys@TESTDB11>select sql_id, child_number, sql_text from v$sql where parsing_schema_name = \'SCOTT\';
-
-
SQL_ID CHILD_NUMBER SQL_TEXT
-
------------- ------------ ------------------------------------------------------------------------
-
fnzhctjcmspgz 0 SELECT * FROM EMP WHERE EMPNO = 7788
-
073yn322p1cx9 0 select * from emp where empno = 7788
-
7mc5065rargfv 0 select * from emp where empno = 7788
- 7mh165n4umhsx 0 Select * From Emp Where Empno = 7788
兩語句引用的物件必須完全相同。
點選(此處)摺疊或開啟
-
--授權
-
scott@TESTDB11>grant select on emp to hr;
-
--在HR方案中建立表
-
hr@TESTDB11>create table emp as select * from scott.emp;
-
--清空shared pool
-
sys@TESTDB11>alter system flush buffer_cache;
-
-
--執行下面2條SQL語句
-
scott@TESTDB11>select * from emp;
-
hr@TESTDB11>select * from emp;
-
-
--檢視結果. 兩個語句共享相同的父遊標,但對應於不同的子游標
-
sys@TESTDB11>select sql_id, hash_value, child_number, sql_text from v$sql
-
where parsing_schema_name = \'SCOTT\' or parsing_schema_name =\'HR\';
-
-
SQL_ID HASH_VALUE CHILD_NUMBER SQL_TEXT
-
------------- ---------- ------------ ----------------------------------------------------------------------------------------------------
-
gx6qnrgvv63mx 4155707005 0 SELECT /* OPT_DYN_SAMP */ /*+ ALL_ROWS IGNORE_WHERE_CLAUSE NO_PARALLEL(SAMPLESUB) opt_param(\'paralle
-
l_execution_enabled\', \'false\') NO_PARALLEL_INDEX(SAMPLESUB) NO_SQL_TUNE */ NVL(SUM(C1),:\"SYS_B_0\"),
-
NVL(SUM(C2),:\"SYS_B_1\") FROM (SELECT /*+ NO_PARALLEL(\"EMP\") FULL(\"EMP\") NO_PARALLEL_INDEX(\"EMP\") */
-
:\"SYS_B_2\" AS C1, :\"SYS_B_3\" AS C2 FROM \"HR\".\"EMP\" \"EMP\") SAMPLESUB
-
-
a2dk8bdn0ujx7 1745700775 0 select * from emp
- a2dk8bdn0ujx7 1745700775 1 select * from emp
兩個SQL語句必須使用相同的繫結變數名。(否則,即使是使用相同的繫結變數值,也不會共享SQL文字)
點選(此處)摺疊或開啟
-
--清空shared pool
-
sys@TESTDB11>alter system flush buffer_cache;
-
-
--定義繫結變數並賦值
-
scott@TESTDB11>variable empno1 number
-
scott@TESTDB11>execute :empno1 := 7788;
-
-
PL/SQL procedure successfully completed.
-
-
scott@TESTDB11>variable empno2 number
-
scott@TESTDB11>execute :empno2 := 7788;
-
-
PL/SQL procedure successfully completed.
-
-
--執行兩條語句
- scott@TESTDB11>select e.empno, e.ename, e.job from emp e where empno = :empno1;
點選(此處)摺疊或開啟
- scott@TESTDB11>select e.empno, e.ename, e.job from emp e where empno = :empno2;
點選(此處)摺疊或開啟
-
--檢視結果. 是不同的游標
- sys@TESTDB11>select sql_id, hash_value, child_number, sql_text from v$sql where parsing_schema_name = \'SCOTT\';
點選(此處)摺疊或開啟
-
--繫結變數賦予不同的值,但SQL語句在Shared SQL Area中是共享的
-
scott@TESTDB11>execute :empno1 := 7369;
- scott@TESTDB11>select e.empno, e.ename, e.job from emp e where empno = :empno1;
點選(此處)摺疊或開啟
- sys@TESTDB11>select sql_id, hash_value, child_number, sql_text from v$sql where parsing_schema_name = \'SCOTT\';
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/17013648/viewspace-1070261/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- SQL語句為什麼不會共享(上)SQL
- SQL語句為什麼不會共享(中)SQL
- SQL語句為什麼不會共享(下)SQL
- 關於sql語句的遊標共享問題SQL
- SQL語句SQL
- Java中如何解析SQL語句、格式化SQL語句、生成SQL語句?JavaSQL
- 如何定位SQL語句在共享池裡用到了哪些chunksSQL
- sql語句大全SQL
- SQL語句整理SQL
- SQL基本語句SQL
- 精妙Sql語句SQL
- SQL語句集合SQL
- oracle sql語句OracleSQL
- sql語句 求救!SQL
- SQL精妙語句SQL
- SQL語句收集SQL
- 常用SQL語句SQL
- sql常用語句SQL
- 【SQL】10 SQL UPDATE 語句SQL
- 【SQL】11 SQL DELETE 語句SQLdelete
- 【SQL】9 SQL INSERT INTO 語句SQL
- 1.3. SQL 語句SQL
- Sql語句小整理SQL
- SQL語句優化SQL優化
- SQL SELECT 語句SQL
- SQL 語句學習SQL
- SQL語句IN的用法SQL
- Oracle基本SQL語句OracleSQL
- 重拾Sql語句SQL
- sql語句錯誤SQL
- SQL語句筆記SQL筆記
- Statement (操作 SQL 語句)SQL
- SQL中常見語句SQL
- Sql建表語句SQL
- sql語句學習SQL
- SQL 語句基礎SQL
- oracle常用SQL語句OracleSQL
- 常用的SQL語句SQL