簡單幾點優化你在oracle中多表查詢

2021-06-03 21:06:35 字數 3417 閱讀 2050

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優化之幾點技巧

1.選用適合的oracle優化器 oracle的優化器共有3種 1.rule 基於規則 2.cost 基於成本 3.choose 選擇性 設定預設的優化器,可以通過對init.ora檔案中optimizer mode引數的各種宣告,如rule,cost,choose,all rows,first r...

Oracle優化的幾點經驗

oracle優化的幾點經驗 在做專案時候,之前沒做過優化的工作,現在把學到的一些經驗記下來,希望自己可以記住,也希望對別人有所幫助。1.表空間管理。表空間是資料庫的邏輯劃分,乙個表空間只能屬於乙個資料庫。所有的資料庫物件都存放在指定的表空間中。但主要存放的是表,所以稱作表空間。oracle資料庫中至...

關於在oracle中是使用索引的幾點注意事項

例如一列c1在能取值 甲 乙 丙 丁 且均勻分布,則即使在該列建立了索引,資料庫執行時也未必會使用 但是如果取值 丁 的記錄極少,在選擇條件為 c1 丁 根據基於代價的優化器如果能獲得表的統計資訊的話,是會利用上索引而不做全表掃瞄的。例如 select from where c1 123 則即使在列...