SQL查詢語句優化指南

2021-04-12 14:10:44 字數 1773 閱讀 4171

改進查詢的目標是提高查詢效率,改進查詢要綜合考慮多方面的因素,其基本點就是如何有效使用索引,沒有有效利用索引的查詢會造成全表掃瞄,當資料量很大時,查詢效率十分低下,甚至是不可接受的。下面列出了常用的查詢設計原則。

]總體原則

查詢優化器檢視查詢的每個字段,並決定對於限制需要掃瞄的資料量是否有用。如果乙個字段可以被用作乙個掃瞄引數(

sarg

),那麼就稱之為可優化的,並且可以利用索引快速獲得所需資料。

掃瞄引數

sarg

的定義:用於限制搜尋範圍的乙個操作,因為它通常是指乙個特定的匹配,乙個值的範圍內的匹配,或者兩個以上條件的

and連線。形式如下:

<

列名》 <

操作符》 《常數或

變數》 或

《常數或

變數》 <

操作符》 <

列名》如果乙個表示式不能滿足

sarg

的形式,那它就無法限制搜尋的範圍了,所以索引對於不滿足

sarg

形式的表示式來說是無用的。

]like

語句是否屬於

sarg

取決於所使用的萬用字元的型別

如:name like 『張%

』,這就屬於

sarg 而:

name like 『%

張』,就不屬於

sarg

。原因是萬用字元

%在字串的開頭使得索引無法使用。

]not

操作符、函式會導致不滿足

sarg

形式的語句

不滿足sarg

形式的語句最典型的情況就是包括非操作符的語句,如:

not、!=、

<>

、!<

、!>

、not exists

、not in

、not like

等,另外還有函式。例如:

abs(

**)<5000 **

*2>5000 ]

判斷字段是否為空(

is null

或is not null

操作)一般是不會應用索引的,因為

b樹索引是不索引空值的;設計時可用乙個預設值代替空值。

]進行了顯式或隱式的運算的字段不能進行索引

ss_df+20>50

,優化處理:

ss_df>30 假設

hbs_bh

欄位是字元型,那麼對

hbs_bh=5401002554

要優化處理為

hbs_bh=』

5401002554』

,注:此條件對

hbs_bh

進行隱式的

to_number轉換]

字段之間的比較不會有效使用索引

例如,task.userextstring1 = ea_wsbmain.refno

因為這種形式不符合

sarg定義]

經測試,

exists

、in 和or

,三者的效率差不多

select * from table1 where tid in (2,3) 和

select * from table1 where tid=2 or tid=3 ]

經測試,

count(*)

不比count(字段)

慢綜上所述,盡量改造成「

<

欄位名》 <

操作符》 《常量或

變數的》

」的sarg

形式。

SQL查詢語句優化

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

Sql語句的優化查詢

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

sql查詢語句的優化

一 操作符優化 1 in 操作符 2 not in操作符 此操作是強列不推薦使用的,因為它不能應用表的索引。3 is null 或is not null操作 判斷字段是否為空 判斷字段是否為空一般是不會應用索引的,因為索引是不索引空值的。4 及 操作符 大於或小於操作符 大於或小於操作符一般情況下是...