(1) 語句解析時的執行順序創建測試用的 函數create or replace function F1(v_in in varchar2) return varchar2 IS v_out varchar2(20);begin v_out := v_in; dbms_output.put_line ...
(1) 語句解析時的執行順序
創建測試用的 函數
create or replace function F1(v_in in varchar2)
return varchar2 IS
v_out varchar2(20);
begin
v_out := v_in;
dbms_output.put_line('exec F1');
return v_out;
end;
create or replace function F2(v_in in varchar2)
return varchar2 IS
v_out varchar2(20);
begin
v_out := v_in;
dbms_output.put_line('exec F2');
return v_out;
end;
執行
select 1 from dual where F1('1')=1 and F2('1')='1';
輸出
exec F2
exec F1
執行
select 1 from dual where F2('1')=1 and F1('1')='1';
輸出
exec F1
exec F2
(2)語句執行時的執行順序
創建測試用的表及初始記錄
drop table temp;
create table temp( t1 varchar2(10),t2 varchar2(10));
insert into temp values('sz','1');
insert into temp values('sz','2');
insert into temp values('se','abcde');
執行1
select * from temp where t1=('sz' || F1('')) and t2=('abcde'||F2(''));
輸出
exec F1
exec F2
exec F1
exec F2
exec F1
執行2
select * from temp where t2=('abcde'||F2('')) and t1=('sz' || F1(''));
輸出
exec F2
exec F2
exec F2
exec F1
以上得出 執行1 先輸出exec F1 所以是先使用 t1條件,而執行2 先使用t2條件
如果 通過統計信息來 按 過濾出記錄少的條件先執行,則應該是先執行t2,因為t2只過濾出1條記錄。
此例中 沒有建索引, 沒有統計信息,查詢優化器沒有可利用的統計信息來優化條件的執行順序。
至於 oracle 中提到的CBO模式下動態採樣 何時介入還不是很理解。 動態採樣比如:對一次執行SQL時發現涉及對象(表、索引等)沒有被分析、統計過,那麼ORACLE會採用一種叫做動態採樣的技術,動態的收集表和索引上的一些數據信息,來幫助oracle做出最優的選擇
註:使用的是oracle 11g CBO優化器
要做深入分析 還需要加入表,索引,記錄數的比較等多種情況,這些情況才是項目中真正會遇到和需要解決的,後續有機會補充。。。