查詢語句(SELECT)的優化建議

2021-08-26 13:21:50 字數 2616 閱讀 2856

從大多數資料庫應用系統的例項來看,查詢*作在各種資料庫*作中所佔據的比重最大,而查詢*作所基於的select語句在sql語句中又是代價最大的語句。

[size=large][color=red]查詢語句(select)的優化建議[/color][/size]

[color=red] (1)、合理使用索引:where子句中變數順序應與索引字鍵順序相同。[/color]

如:create index test_idx on test(hm, rq, xx)

索引字鍵順序:首先是號碼hm,其次是日期rq,最後是標誌xx,所以where子句變數順序應是where hm<=「p1234」and rq=「06/06/1999」and xx=「ddd」,不應是where xx=「ddd」 and rq=「06/06/1999」 and hm <=「p1234」這樣的不按索引字鍵順序寫法。

[color=red](2)、將最具有限制性的條件放在前面,大值在前,小值在後。[/color]

如:where cola<=10000 and cola>=1 效率高

where cola>=1 and cola<=10000 效率低

[color=red] (3)、避免採用matches和like萬用字元匹配查詢[/color]

萬用字元匹配查詢特別耗費時間。即使在條件欄位上建立了索引,在這種情況下也還是採用順序掃瞄的方式。

例如語句:select * from customer where zipcode matches 「524*」

可以考慮將它改為select * from customer where zipcode<=「524999」 and zipcode >=「524000」,則在執行查詢時就會利用索引來查詢,顯然會大大提高速度。

[color=red](4)、避免非開始的子串[/color]

例如語句:select * from customer where zipcode[2,3] >「24」,在where子句中採用了非開始子串,因而這個語句也不會使用索引。

[color=red](5)、避免相關子查詢[/color]

乙個欄位的標籤同時在主查詢和where子句中的查詢中出現,那麼很可能當主查詢中的字段值改變之後,子查詢必須重新查詢一次。查詢巢狀層次越多,效率越低,因此應當盡量避免子查詢。如果子查詢不可避免,那麼要在子查詢中過濾掉盡可能多的行。

例如:將下面的語句

select hm,rq from taba

where item in (select item form tabb where tabb.num=50)

改為:select hm,bf from taba, tabb

where taba.item=tabb.item and tabb.num=50

[color=red](6)、避免或簡化排序[/color]

應當簡化或避免對大型表進行重複的排序。當能夠利用索引自動以適當的次序產生輸出時,優化器就避免了排序的步驟。以下是一些影響因素:

◆ 索引中不包括乙個或幾個待排序的字段;

◆ group by或order by子句中字段的次序與索引的次序不一樣;

◆ 排序的字段來自不同的表。

為了避免不必要的排序,就要正確地增建索引,合理地合併資料庫表(儘管有時可能影響表的規範化,但相對於效率的提高是值得的)。如果排序不可避免,那麼應當試圖簡化它,如縮小排序的字段的範圍等。

[color=red](7)、消除對大型錶行資料的順序訪問[/color]

在巢狀查詢中,對錶的順序訪問對查詢效率可能產生致命的影響。比如採用順序訪問策略,乙個巢狀3層的查詢,如果每層都查詢1000行,那麼這個查詢就要查詢10億行資料。避免這種情況的主要方法就是對連線的字段進行索引。例如,兩個表:學生表(學號、姓名、年齡……)和選課表(學號、課程號、成績)。如果兩個表要做連線,就要在「學號」這個連線欄位上建立索引。

還可以使用並集來避免順序訪問。儘管在所有的檢查列上都有索引,但某些形式的where子句強迫優化器使用順序訪問。下面的查詢將強迫對orders表執行順序*作:

select * from orders where (cust_num=126 and order_num>1001) or order_num=1008

雖然在cust_num和order_num上建有索引,但是在上面的語句中優化器還是使用順序訪問路徑掃瞄整個表。因為這個語句要檢索的是分離的行的集合,所以應該改為如下語句:

select * from orders where cust_num=126 and order_num>1001

union

select * from orders where order_num=1008

這樣就能利用索引路徑處理查詢。

[color=red](8)、對於大資料量的求和應避免使用單一的sum命令處理,可採用group by方式與其結合,有時其效率可提高幾倍甚至百倍。

(9)、避免會引起磁碟讀寫的rowid*作。在where子句中或select語句中,用rowid要產生磁碟讀寫,是乙個物理過程,會影響效能。

(10)、使用臨時表加速查詢[/color]

把錶的乙個子集進行排序並建立臨時表,有時能加速查詢。它有助於避免多重排序*作,而且在其他方面還能簡化優化器的工作。

[color=blue] 但要注意:臨時表建立後不會反映主表的修改。在主表中資料頻繁修改的情況下,注意不要丟失資料。[/color]

select 語句優化

select cd friend.fid,cd user.name from cd friend left join cd user on cd user.uid cd friend.fid where cd friend.uid 1312 limit 6 這條語句的本意是查詢id為1312 的使用...

SQL Server效能優化(6)查詢語句建議

1.如果對資料不是工業級的訪問 允許髒讀 在select裡新增 with nolock select top10 idfrom measure heat with nolock 2.限制結果集的資料量,如使用top 100等來限制返回的行數。實在不行,在資料庫內分頁。3.查詢時不要返回不需要的行 列...

8 2 1 優化select 語句

8.2 優化sql 語句 8.2.1 優化 select 語句 查詢,表現為 select語句,完成了資料庫中的所有查詢操作。調整這些語句具有高優先順序,無論是為了給動態頁面提供亞秒級的響應還是縮短產生大量夜間報表的時間。除了select 語句,調整的技巧同樣適用於 create table as ...