對于web應用開發,多數性能瓶頸均出現在資料庫上,除了采用分布式架構或雲處理(大公司基本上都是),更重要的是平時程式設計時要遵照一些規則,從根本上提高系統的性能,以下總結了一些常用的規則方法,僅供參考,歡迎跟帖補充。。。 F P$ +A'
t~%l!jdi
1、 把資料、日志、索引放到不同的I/O裝置上,增加讀取速度。資料量(尺寸)越大,提高I/O越重要。 wQN1rUMG
J:0y6O6}
2、 縱向、橫向分割表,減少表的尺寸,如:可以把大資料量的字段拆分表。 3gZr&F<O
26IhUJn(
3、 根據查詢條件,建立索引,優化索引、優化通路方式,限制結果集的資料量。注意填充因子要适當(最好是使用預設值0)。索引應該盡量小,盡量使用位元組數小的列建索引,不要對有限的幾個值的列建單一索引。 ^.l\e XX
vjJZJ
4、 用OR的字句可以分解成多個查詢,并且通過UNION連結多個查詢。它們的速度隻與是否使用索引有關,如果查詢需要用到聯合索引,用UNION all執行的效率更高。 qx_CJ;D-
EpTi*^{
5、 在查詢SELECT語句中用WHERE子句限制傳回的行數,避免表掃描。如果傳回不必要的資料,則浪費了伺服器的I/O資源,加重了網絡的負擔,降低了性能。如果表很大,在表掃描期間将表鎖住,禁止其他的聯結通路表,後果很嚴重。 ArR ew!
;R=<[=j
6、 注意使用DISTINCT,在沒有必要時不要用,它同UNION一樣會使查詢變慢。 BQ.x jp
6 W%5
7、 在IN後面值的清單中,将出現最頻繁的值放在最前面,出現最少的放在最後面,減少判斷的次數。 /8JeJ0)Y`
"tEq</[ s
8、 一般在GROUP BY和HAVING子句之前就能剔除多餘的行,是以盡量不要用它們來做剔除行的工作,也就是說盡可能在WHERE中過濾資料。 4<[email protected]
NT,i9C
9、 盡量将資料的處理工作放在伺服器上,減少網絡的開銷,如使用存儲過程。存儲過程是編譯、優化過,并且被組織到一個執行規劃裡,且存儲在資料庫中的SQL語句(存儲過程是資料庫伺服器端的一段程式),是控制流語言的集合,速度當然快。 I.=#qX
[I>%x
10、 不要在一句話裡再三地使用相同的函數,浪費資源,将結果放在變量裡再調用更快。 YMbFgOJsb
9L U XUy
11、 針對大量隻讀查詢操作進行優化的方法: w?UzC6QF
nXl`[z('r
1) 資料量小的資料,可以考慮不存儲在資料庫中,而是通過程式常量的方式解決。 >uk8'\bop
IUx5=1h
2) 需要存儲在資料庫中的資料,可以考慮采用物化視圖(索引視圖)。當DBA在視圖上建立索引時,這個視圖就被物化(執行)了,并且結果集被永久地儲存在唯一索引中,儲存方式與一個有聚簇索引的表的儲存方式相同。物化視圖減除了為引用視圖的查詢動态建立結果集的開銷,優化人員可以在查詢中使用視圖索引,而不需要在FROM子句中直接指定視圖。 Y5 v6n;_
BuzGJWWq
3) 資料存儲時可以考慮适當的資料備援,以減少資料庫表之間的連結操作,提高查詢效率。 (BOnss8
a u{(:wyo
4) 針對資料的特點,采取特定的索引類型。例如,位圖索引等。 12 Nfh%=
#W;;_Wg
12、 對于SQL語句書寫時的一些建議: [email protected]
5f04TkA
1) 寫語句時能夠确定資料庫對象所有者的,盡可能把所有者帶上,如: Dv$Nzp* `
.6nt aW
SELECT * FROM dbo.Users cz~IFu1!m
tG</W .H
0s]_<+1N
':G?Jv>
2) 存儲過程中,參數定義最好放在最前面,盡可能一次定義,如: `[email protected]
{dOw%fx+
DECLARE @USER_ID INT 9T zwCPwY
0$lL#1k
,@USER_NAME VARCHAR(50) IuRG%o2
mMg:Q;ZWA
,@PASSWORD VARCHAR(50) hd5EJ+VT}
5~H/QF+C2/
%S6{{[email protected]
[WGR|d
3) 為參數指派時,盡可能一次指派,如: BuTH_w
hzFiLG5}
SELECT @USER_ID = 1001 riXsEz9/
|{K[&84
,@USER_NAME = 'xiaojun.liu' QynGP4+0U
0pe]
RttWok
?iG8%
4) 盡量少用遊标 y+GN?KKd
轉載于:https://www.cnblogs.com/caicainiao/archive/2011/04/16/2018094.html