多表查詢優化1

2021-08-31 10:40:46 字數 3332 閱讀 3422

oracle有個高速緩衝的概念,這個高速緩衝就是存放執行過的sql語句,那 oracle在執行sql語句的時候要做很多任務作,例如解析sql語句,估算索引利用率,繫結變數,讀取資料塊等等這些操作。假設高速緩衝裡已經儲存了執 行過的sql語句,那就直接匹配執行了,少了步驟,自然就快了,但是經過測試會發現高速緩衝只對簡單的表起作用,多表的情況完全沒有效果,例如在查詢單錶 的時候那叫乙個快,但是假設連線多個表,就龜速了。

最重要一點,oracle的高速緩衝是全字元匹配的,什麼意思呢,看下面三個select

--

no.1

select

*from tablea;

--no.

2select

*from tablea;

--no.

3select

*from tablea;

這三個語句乍一看是一樣的,但是快取記憶體是不認的,是全字元匹配的,索引在快取記憶體裡會儲存三條不同的語句,說到這裡,又引出乙個習慣,就是要保持良好的程式設計習慣,這個很重要

oracle多表優化我積累了一些,都是常用的,介紹下

一、from子句後面的表順序有講究

先說為啥,oracle在解析sql語句的時候對from子句後面的表名是從右往左解析的,是先掃瞄最右邊的表,然後在掃瞄左邊的表,然後用左邊的表匹配資料,匹配成功後就合併。 所以,在對多表查詢中,一定要把小表寫在最右邊,為什麼自己想想就明白了。例如下面的兩個語句:

--

no.1

tablea:100w條記錄 tableb:1w條記錄 執行速度十秒

select count(

*) from tablea, tableb;

--no.

2執行速度百秒甚至更高

select count(

*) from tableb, tablea;

這個估計很多人都知道,但是要確認非常有用。

還有一種是三張表的查詢,例如

select count(

1) from tablea a,tableb b ,tablec c where a.id

=b.id and a.id

=c.id;

上面中tablea 為交叉表,根據oracle對from子句從右向左的掃瞄方式,應該把交叉表放在最末尾,然後才是最小表,所以上面的應該這樣寫

--

tablea a 交叉表

--tabelb b 100w

--tablec c 1w

select count(

1) from tableb b ,tablec c ,tablea a where a.id

=b.id and a.id

=c.id;

這種寫法對大資料量會非常有用,大家謹記,也是很常用的。

二、where子句後面的條件過濾有講究,oracle對where子句後面的條件過濾是自下向上,從右向左掃瞄的,所以和from子句一樣一樣的,把過濾條件排個序,按過濾資料的大小,自然就是最少資料的那個條件寫在最下面,最右邊,依次類推,例如

--

no.1

不可取 效能低下

select

*from tablea a where

a.id

>

500and a.lx ='

2b'and a.id

<

(select count(

1) from tablea where id

=a.id)

--no.

2效能高

select

*from tablea a where

a.id

<

(select count(

1) from tablea where id

=a.id)

and a.id

>

500and a.lx ='

2b'

三、使用select的時候少用*,多敲敲鍵盤,寫上欄位名吧,因為oracle的查詢器會把*轉換為表的全部列名,這個會浪費時間的,所以在大表中少用

四、充分利用rowid ,可以用rowid來分頁,刪除查詢重覆記錄,很強大的,給兩個例子:

--

oracle查詢重覆記錄

select

*from tablea a where a.rowid

>=

(select min(rowid) from tableb b where a.column

=b.column)

--oracle刪除重覆記錄

delete from tablea a where a.rowid

>=

(select min(rowid) from tableb b where a.column

=b.column)

--分頁 start=10

limit=10

--end 為 start

+limit--1

.查詢要排列的表a--2

.查詢a表的rownum找出小於end的資料組成表b--3

.查詢b表通過rownum找出大於start的資料完成

--簡單的說先根據end值過濾資料,然後在根據start過濾資料

select

*from

(select a.

*, rownum rn from (select

*from uim_serv_file_data order by ouid) a where rownum

<=

20) b

where rn

>

10order by ouid desc

五、儲存過程中需要注意的,多用commit了,既可以釋放資源,但是要謹慎。

六、減少對資料庫表的查詢,這個很重要,能減少就減少,因為在執行語句的時候oracle會做很多初始工作。

七、少用in,多用exists來代替

--

no.1

in的寫法

select

*from tablea a where

a.id in (select id form tableb b where b.id

>1)

--no.

2exists 寫法

select

*from tablea a where

exists (select

1from tableb b where a.id

=b.id and b.id

>1)

ORACLE多表查詢優化

oracle有個高速緩衝的概念,這個高速緩衝就是存放執行過的sql語句,那oracle在執行sql語句的時候要做很多任務作,例如解析sql語句,估算索引利用率,繫結變數,讀取資料塊等等這些操作。假設高速緩衝裡已經儲存了執行過的sql語句,那就直接匹配執行了,少了步驟,自然就快了,但是經過測試會發現高...

oracle多表查詢優化

用select 時,少用 多用字段 select name,code from table,select from table select count from table1 tabale2 table2的記錄數比table1的記錄少,查詢速度快 如果要是三張表,其中乙個是中間表的話,中間表放在最...

多表查詢SQL優化

多表連線left join 是乙個例子 三張表,也就是多表聯查,使用聚集函式sum,用到了group by select c.channel short nameu.user name,bs.settlement amount bs.received amount trans,bs.bill sou...