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(上面中tablea 為交叉表,根據oracle對from子句從右向左的掃瞄方式,應該把交叉表放在最末尾,然後才是最小表,所以上面的應該這樣寫1) from tablea a,tableb b ,tablec c where a.id
=b.id and a.id
=c.id;
--這種寫法對大資料量會非常有用,大家謹記,也是很常用的。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子句一樣一樣的,把過濾條件排個序,按過濾資料的大小,自然就是最少資料的那個條件寫在最下面,最右邊,依次類推,例如
--三、使用select的時候少用*,多敲敲鍵盤,寫上欄位名吧,因為oracle的查詢器會把*轉換為表的全部列名,這個會浪費時間的,所以在大表中少用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'
四、充分利用rowid ,可以用rowid來分頁,刪除查詢重覆記錄,很強大的,給兩個例子:
--五、儲存過程中需要注意的,多用commit了,既可以釋放資源,但是要謹慎。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
六、減少對資料庫表的查詢,這個很重要,能減少就減少,因為在執行語句的時候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多表查詢優化
用select 時,少用 多用字段 select name,code from table,select from table select count from table1 tabale2 table2的記錄數比table1的記錄少,查詢速度快 如果要是三張表,其中乙個是中間表的話,中間表放在最...
Oracle多表查詢的優化
1,重複性查詢 當你向oracle提供乙個sql的時候,oracle會首先在相應的記憶體中查詢這條語句,如果匹配到,就能直接返回結果,這樣就能節省記憶體和提高資料訪問效率。但是匹配sql語句需要注意以下幾點 1 字元級的比較 sql語句和共享池中的語句必須完全相同才能匹配完整,尤其注意大小寫和空格 ...
Oracle 多表查詢
sql 外連線 sql 按部門統計員工人數 部門號 部門名稱 人數 sql select d.deptno,d.dname,count e.empno 2 from dept d,emp e 3 where d.deptno e.deptno 4 group by d.deptno,d.dname ...