常用的
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...