常用的sql語句優化

2021-07-11 17:43:41 字數 4304 閱讀 4633

常用的

sql語句優化

order by

任何在order by

語句的非索引項或者有計算表示式都將降低查詢速度。

應盡量避免在

where

子句中使用

!=not <>

操作符

當oracle"

遇到"not,

他就會停止使用索引轉而執行全表掃瞄

,不支援索引。可以改為

< value or > value

這種支援索引的方式。

多表連線查詢

oracle 

的解析器按照從右到左的順序處理

from

子句中的表名,

from

子句中寫在最後的表

(基礎表

driving table)

將被最先處理,在

from

子句中包含多個表的情況下

,你必須選擇記錄條數最少的表作為基礎表。如果有

3個以上的表連線查詢

, 那就需要選擇交叉表

(intersection table)

作為基礎表

, 交叉表是指那個被其他表所引用的表

.where

子句中的連線順序

oracle

採用自下而上的順序解析

where子句,

根據這個原理

,表之間的連線必須寫在其他

where

條件之前

, 那些可以過濾掉最大數量記錄的條件必須寫在

where

子句的末尾. 

select

子句中避免使用*

oracle

在解析的過程中

, 會將

'*' 

依次轉換成所有的列名

, 這個工作是通過查詢資料字典完成的

, 這意味著將耗費更多的時間

使用表的別名(alias)

當在sql

語句中連線多個表時

, 請使用表的別名並把別名字首於每個

column上.

這樣一來

,就可以減少解析的時間並減少那些由

column

歧義引起的語法錯誤. 

exists

替代in

、用not exists

替代not in

在許多基於基礎表的查詢中

,為了滿足乙個條件

,往往需要對另乙個表進行聯接

.在這種情況下

, 使用

exists(

或not exists)

通常將提高查詢的效率

. 在子查詢中

,not in

子句將執行乙個內部的排序和合併

. 無論在哪種情況下

,not in

都是最低效的

(因為它對子查詢中的表執行了乙個全表遍歷

). 為了避免使用

not in ,

我們可以把它改寫成外連線

(outer joins)

或not exists.

sql

語句用大寫的

因為oracle

總是先解析

sql語句,把小寫的字母轉換成大寫的再執行

避免在索引列上使用計算

where

子句中,如果索引列是函式的一部分.優化器將不使用索引而使用全表掃瞄

用union

替換or (

適用於索引列

) 通常情況下, 用

union

替換where

子句中的

or將會起到較好的效果

. 對索引列使用

or將造成全表掃瞄

. 注意

, 以上規則只針對多個索引列有效

. 如果有

column

沒有被索引

, 查詢效率可能會因為你沒有選擇

or而降低

.索引

'!=' 

將不使用索引

. 記住

, 索引只能告訴你什麼存在於表中

, 而不能告訴你什麼不存在於表中;

'||'

是字元連線函式

.就象其他函式那樣

, 停用了索引;

'+'是數學函式

. 就象其他數學函式那樣

, 停用了索引

.為你的資料庫建立乙個健壯的索引,那可是功德一件。可要做到這一點簡直就是一門藝術。每當你為乙個表新增乙個索引,

select

會更快了,可

insert 

和delete

卻大大的變慢了,因為建立了維護索引需要許多額外的工作。顯然,這裡問題的關鍵是:你要對這張表進行什麼樣的操作。這個問題不太好把握,特別是涉及

delete

和update

時,因為這些語句經常在

where

部分包含

select

命令。不要給"性別

"列建立索引

首先,我們必須了解索引是如何加速對錶的訪問的。你可以將索引理解為基於一定的標準上對錶進行劃分的一種方式。如果你給類似於"性別

"這樣的列建立了乙個

索引,你僅僅是將表劃分為兩部分:男和女。你在處理乙個有

1,000,000

條記錄的表,這樣的劃分有什麼意義?記住:維護索引是比較費時的。當你設計索

引時,請遵循這樣的規則:根據列可能包含不同內容的數目從多到少排列,比如:姓名+省份

+性別。

count(*)

優於count(1)

和count(primary_key)

很多人為了統計記錄條數,就使用

count(1) 

和count(primary_key) 

而不是count(*) 

,他們認為這樣效能更好,其實這是乙個誤區。對於有些場景,這樣做可能性能會更差,應為資料庫對

count(*) 

計數操作做了一些特別的優化。

帶萬用字元(%)的like語句

萬用字元(%)在搜尋詞首出現,oracle系統索引。在很多情況下可能無法避免這種情況,但是一定要心中有底,萬用字元如此使用會降低查詢速度。然而當萬用字元出現在字串其他位置時(非詞首位置),優化器就能利用索引。

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

大於或小於操作符一般情況下是不用調整的,因為它有索引就會採用索引查詢,但有的情況下可以對它進行優化,如乙個表有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的記錄索引。

繫結變數

select name from table1 where id=』1』; select name from table1 where id=』2』;這兩句sql,查詢優化器認為是不同的sql語句,需要解析兩次。如果採用變數,就只會解析一次。select name fromtable1 where id=@id

大量的類似查詢可以重用執行計畫,這可以大大降低資料庫解析sql語句的負擔。一次解析,多次重用,是提高資料庫效率的原則。

不要在建立的索引的資料列上進行下列操作:

避免對索引字段進行計算操作

避免在索引欄位上使用not,<>,!=

避免在索引列上使用is null和is not null

避免在索引列上出現資料型別轉換

避免在索引欄位上使用函式

避免建立索引的列中使用空值。

常用SQL語句優化技巧

除了建立索引之外,保持良好的sql語句編寫習慣將會降低sql效能問題發生。通過變數的方式來設定引數 好 stringsql select from people p where p.id 壞 stringsql select from people p where p.id id 資料庫的sql文解...

mysql 常用sql語句優化原則

優化索引mysql 中用到索引的的場景 索引的使用原則 符合左字首原則 索引上不要使用函式和進行運算,另外型別也要對應 比如 where name abc 雖然sql不會報錯,但是會導致索引失效 使用 or 時,如果存在沒有在索引上的列,也會導致索引失效 如果 mysql 分析使用索引必沒有使用索引...

8個常用SQL語句優化

要提高sql語句的執行效率,最常見的方法就是建立索引,以及盡量避免全表掃瞄。在本章mysql教程中,uncletoo給大家整理一些常見的sql優化技巧,避免全表掃瞄。乙個簡單的優化,也許能讓你的sql執行效率提高幾倍,甚至幾十倍。1 避免在where子句中使用 is null 或 is not nu...