sql查詢語句的優化

2022-03-26 09:17:40 字數 1858 閱讀 5206

一、操作符優化

1、in 操作符

2、not in操作符

此操作是強列不推薦使用的,因為它不能應用表的索引。

3、is null 或is not null操作(判斷字段是否為空)

判斷字段是否為空一般是不會應用索引的,因為索引是不索引空值的。

4、> 及 < 操作符(大於或小於操作符)

大於或小於操作符一般情況下是不用調整的,因為它有索引就會採用索引查詢,但有的情況下可以對它進行優化,如乙個表有100萬記錄,乙個數值型字段a,30萬記錄的a=0,30萬記錄的a=1,39萬記錄的a=2,1萬記錄的a=3。那麼執行a>2與a>=3的效果就有很大的區別了,因為a>2時oracle會先找出為2的記錄索引再進行比較,而a>=3時oracle則直接找到=3的記錄索引。

5、like操作符

like操作符可以應用萬用字元查詢,裡面的萬用字元組合可能達到幾乎是任意的查詢,但是如果用得不好則會產生效能上的問題,如like 『%5400%』 這種查詢不會引用索引,而like 『x5400%』則會引用範圍索引。

乙個實際例子:用yw_yhjbqk表中營業編號後面的戶標識號可來查詢營業編號 yy_bh like 『%5400%』 這個條件會產生全表掃瞄,如果改成yy_bh like 』x5400%』 or yy_bh like 』b5400%』 則會利用yy_bh的索引進行兩個範圍的查詢,效能肯定大大提高。

6、union操作符

union在進行表鏈結後會篩選掉重複的記錄,所以在表鏈結後會對所產生的結果集進行排序運算,刪除重複的記錄再返回結果。實際大部分應用中是不會產生重複的記錄,最常見的是過程表與歷史表union。如:

select * from gc_dfys

union

select * from ls_jg_dfys

這個sql在執行時先取出兩個表的結果,再用排序空間進行排序刪除重複的記錄,最後返回結果集,如果表資料量大的話可能會導致用磁碟進行排序。

select * from gc_dfys

union all

select * from ls_jg_dfys

二、sql書寫的影響

1、where後面的條件順序影響

where子句後面的條件順序對大資料量表的查詢會產生直接的影響。如:

select * from zl_yhjbqk where dy_dj = '1kv以下' and xh_bz=1

select * from zl_yhjbqk where xh_bz=1 and dy_dj = '1kv以下'

以上兩個sql中dy_dj(電壓等級)及xh_bz(銷戶標誌)兩個欄位都沒進行索引,所以執行的時候都是全表掃瞄,第一條sql的dy_dj = '1kv以下'條件在記錄集內比率為99%,而xh_bz=1的比率只為0.5%,在進行第一條sql的時候99%條記錄都進行dy_dj及xh_bz的比較,而在進行第二條sql的時候0.5%條記錄都進行dy_dj及xh_bz的比較,以此可以得出第二條sql的cpu佔用率明顯比第一條低。

三、經驗總結

1、必須設計良好的sql語句,使得其有where語句或top語句來限制結果集大小,分頁是限制結果集的一種有效手段。

2、使用儲存過程封裝那些複雜的sql語句或商業邏輯,這樣做有幾個好處。一是儲存過程的執行計畫可以被快取在記憶體中較長時間,減少了重新編譯的時間。二是儲存過程減少了客戶端和伺服器的繁複互動。三是如果程式發布後需要做某些改變你可以直接修改儲存過程而不用修改程式,避免需要重新安裝部署程式。

SQL查詢語句優化

sql查詢語句優化的使用方法 查詢語句的優化是sql效率優化的乙個方式,可以通過優化sql語句來盡量使用已有的索引,避免全表掃瞄,從而提高查詢效率。最近在對專案中的一些sql進行優化,總結整理了一些方法。1 在表中建立索引,優先考慮where group by使用到的字段。2 盡量避免使用selec...

Sql語句的優化查詢

1.多表查詢時必須指定別名 防止新加字段有同名字段 導致報錯 2.子句中避免使用 在select子句中列出所有的column時,使用動態sql列引用select 是乙個方便的方法.不幸的是,這是乙個非常低效的方法.實際上,oracle在解析的過程中,會將 依次轉換成所有的列名,這個工作是通過查詢資料...

SQL查詢語句優化指南

改進查詢的目標是提高查詢效率,改進查詢要綜合考慮多方面的因素,其基本點就是如何有效使用索引,沒有有效利用索引的查詢會造成全表掃瞄,當資料量很大時,查詢效率十分低下,甚至是不可接受的。下面列出了常用的查詢設計原則。總體原則 查詢優化器檢視查詢的每個字段,並決定對於限制需要掃瞄的資料量是否有用。如果乙個...