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