對錶的連線的總結

2022-05-25 04:45:09 字數 2603 閱讀 7527

1.巢狀迴圈訪問的次數

sys@ prod>create table t1(

id number not null,

n number,

contents varchar2(4000)

);sys@ prod>create table t2(

id number not null,

t1_id number not null,

n number,

contents varchar2(4000)

);sys@ prod>execute dbms_random.seed(0);

sys@ prod>insert into t1

select rownum,rownum,dbms_random.string('a',50)

from dual

connect by level<=100

order by dbms_random.random;

sys@ prod>insert into t2 select rownum,rownum,rownum,dbms_random.string('b',50) from dualconnect by level<=100000 order by dbms_random.random;

sys@ prod>commit;

sys@ prod>select count(*) from t1;100

sys@ prod>select count(*) from t2;100000

測試:set linesize 1000

alter session set ststistics_level=all;

select /*+leading(t1) user_nl(t2)*/* from t1,t2 where t1.id=t2.t1_id;

select * from table(dbms_xplan.display_cursor(null,null,'allstats last'));

發現執行計畫裡面starts列t1表訪問1次,t2表訪問100次

1>sys@ prod>select /*+leading(t1) use_nl(t2)*/*

from t1,t2

where t1.id=t2.t1_id

and t1.n in(17,19);

sys@ prod>select * from table(dbms_xplan.display_cursor(null,null,'allstats last'));

發現執行計畫裡面starts列t1表訪問1次,t2表訪問2次

2>sys@ prod>select /*+leading(t1) use_nl(t2)*/*

from t1,t2

where t1.id=t2.t1_id

and t1.n=19;

發現執行計畫裡面starts列t1表訪問1次,t2表訪問1次

3>sys@ prod>select /*+leading(t1) use_nl(t2)*/*

from t1,t2

where t1.id=t2.t1_id

and t1.n=999999999;

發現執行計畫裡面starts列t1表訪問1次,t2表訪問0次

結論:t1表的查詢返回多少條記錄,t2表就訪問多少次。

hint的含義,其中use_nl表示強制用巢狀迴圈的方式連線,leading(t1)表示強制先訪問t1表,也就是t1表作為驅動表,增加這些hint

提示的目的只是為了確保我們的sql語句的執行計畫在做巢狀迴圈連線。在巢狀迴圈連線中,驅動表返回多少條記錄,被驅動表就訪問多少次。

2.雜湊連線表的訪問次數

/*leading(*) use_hash(t2)*/*

結論:在hash連線中,驅動表和被驅動表都只會訪問0次或者1次。

3.排序合併的訪問次數

/*leading(*) use_merge(t2)*/*

結論:排序合併連線根本就沒有驅動和被驅動的概念,而巢狀迴圈和雜湊連線要考慮驅動和被驅動情況。

三種訪問順序的比較:

1.巢狀迴圈連線特別要注意驅動表的順序,小的結果集先訪問,大的結果集後訪問,才能保證被驅動表的訪問次數降到最低,從而提公升效能。

2.雜湊迴圈順序也重要

3.巢狀迴圈連線和雜湊連線有驅動順序,驅動表的順序不同將影響連線的效能,而排序合併連線沒有驅動的概念,無論哪張表都無妨。

三種訪問的排序:

巢狀和雜湊不需要排序,而排序合併需要排序。

適合連線條件範圍的比較:

1.hash連線查詢條件不支援<>,大於和小於的寫法,也不支援like的連線方式,如果加了這些連線條件,會走全表掃瞄。

2.排序合併連線不支援<>,也不支援like的連線條件,但支援》和《之類的連線條件。遇到

3.巢狀迴圈支援所有的sql連線條件的寫法,沒有任何限制。

最適合nl連線的場景

①兩表關聯返回的記錄不多,最佳情況是驅動表結果集僅返回1條,或少量幾條記錄,而被驅動表僅匹配到1條或少量幾條資料

這種情況即便t1表和t2表的記錄奇大無比,也是非常迅速的。

②遇到一些不等值查詢導致雜湊和排序合併連線被限制使用,不得不使用nl連線。

排序合併連線上的連線條件雖然沒有檢索功能卻有消除排序的作用。

jquery中對表單屬性的操作總結

1.獲取下拉框的選取值 文字有以下幾種方法 1 select id option selected text 獲取文字 2 select id find option selected text 獲取文字 3 testselect val 獲取值 4 select name items option...

mysql對錶的操作

mysql增加列,修改列名 列屬性,刪除列語句 mysql修改表名,列名,列型別,新增表列,刪除表列 alter table test rename test1 修改表名 alter table test add column name varchar 10 新增表列 alter table tes...

Oracle 對錶的操作

給表增加字段 alter table 表名 add 欄位名 型別 default 預設值 修改表字段 alter table 表名 modify 要修改的字段 型別 如果你是以a使用者登入資料庫,想檢視a使用者下所有的表,用這個語句 select table name from user table...