欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

SQL SERVER性能優(yōu)化綜述(很好的總結(jié),不要錯(cuò)過(guò)哦)

 更新時(shí)間:2008年09月30日 23:16:16   作者:  
一個(gè)系統(tǒng)的性能的提高,不單單是試運(yùn)行或者維護(hù)階段的性能調(diào)優(yōu)的任務(wù),也不單單是開(kāi)發(fā)階段的事情,而是在整個(gè)軟件生命周期都需要注意,進(jìn)行有效工作才能達(dá)到的。所以我希望按照軟件生命周期的不同階段來(lái)總結(jié)數(shù)據(jù)庫(kù)性能優(yōu)化相關(guān)的注意事項(xiàng)。

7、
盡量使用索引
建立索引后,并不是每個(gè)查詢(xún)都會(huì)使用索引,在使用索引的情況下,索引的使用效率也會(huì)有很大的差別。只要我們?cè)诓樵?xún)語(yǔ)句中沒(méi)有強(qiáng)制指定索引,索引的選擇和使用方法是SQLSERVER的優(yōu)化器自動(dòng)作的選擇,而它選擇的根據(jù)是查詢(xún)語(yǔ)句的條件以及相關(guān)表的統(tǒng)計(jì)信息,這就要求我們?cè)趯?xiě)SQL語(yǔ)句的時(shí)候盡量使得優(yōu)化器可以使用索引。
為了使得優(yōu)化器能高效使用索引,寫(xiě)語(yǔ)句的時(shí)候應(yīng)該注意:
A、不要對(duì)索引字段進(jìn)行運(yùn)算,而要想辦法做變換,比如
SELECT ID FROM T WHERE NUM/2=100
應(yīng)改為:
SELECT ID FROM T WHERE NUM=100*2
SELECT ID FROM T WHERE NUM/2=NUM1
如果NUM有索引應(yīng)改為:
SELECT ID FROM T WHERE NUM=NUM1*2
如果NUM1有索引則不應(yīng)該改。
發(fā)現(xiàn)過(guò)這樣的語(yǔ)句:
SELECT 年,月,金額 FROM 結(jié)余表
WHERE 100*年+月=2007*100+10
應(yīng)該改為:
SELECT 年,月,金額 FROM 結(jié)余表WHERE 年=2007 AND
月=10
B、
不要對(duì)索引字段進(jìn)行格式轉(zhuǎn)換
日期字段的例子:
WHERE CONVERT(VARCHAR(10), 日期字段,120)='2008-08-15'
應(yīng)該改為
WHERE日期字段〉='2008-08-15'
AND 日期字段<'2008-08-16'
ISNULL轉(zhuǎn)換的例子:
WHERE ISNULL(字段,'')<>''應(yīng)改為:WHERE字段<>''
WHERE ISNULL(字段,'')=''不應(yīng)修改
WHERE ISNULL(字段,'F') ='T'應(yīng)改為: WHERE字段='T'
WHERE ISNULL(字段,'F')<>'T'不應(yīng)修改
C、
不要對(duì)索引字段使用函數(shù)
WHERE LEFT(NAME, 3)='ABC' 或者WHERE SUBSTRING(NAME,1, 3)='ABC'
應(yīng)改為:
WHERE NAME LIKE 'ABC%'
日期查詢(xún)的例子:
WHERE DATEDIFF(DAY, 日期,'2005-11-30')=0應(yīng)改為:WHERE 日期 >='2005-11-30' AND 日期 <'2005-12-1‘
WHERE DATEDIFF(DAY, 日期,'2005-11-30')>0應(yīng)改為:WHERE 日期 <'2005-11-30‘
WHERE DATEDIFF(DAY, 日期,'2005-11-30')>=0應(yīng)改為:WHERE 日期 <'2005-12-01‘
WHERE DATEDIFF(DAY, 日期,'2005-11-30')<0應(yīng)改為:WHERE 日期>='2005-12-01‘
WHERE DATEDIFF(DAY, 日期,'2005-11-30')<=0應(yīng)改為:WHERE 日期>='2005-11-30‘
D、不要對(duì)索引字段進(jìn)行多字段連接
比如:
WHERE FAME+ '.'+LNAME=‘HAIWEI.YANG'
應(yīng)改為:
WHERE FNAME=‘HAIWEI' AND LNAME=‘YANG'
8、
注意連接條件的寫(xiě)法
多表連接的連接條件對(duì)索引的選擇有著重要的意義,所以我們?cè)趯?xiě)連接條件條件的時(shí)候需要特別的注意。
A、多表連接的時(shí)候,連接條件必須寫(xiě)全,寧可重復(fù),不要缺漏。
B、
連接條件盡量使用聚集索引
C、
注意ON部分條件和WHERE部分條件的區(qū)別
9、
其他需要注意的地方
經(jīng)驗(yàn)表明,問(wèn)題發(fā)現(xiàn)的越早解決的成本越低,很多性能問(wèn)題可以在編碼階段就發(fā)現(xiàn),為了提早發(fā)現(xiàn)性能問(wèn)題,需要注意:
A、程序員注意、關(guān)心各表的數(shù)據(jù)量。
B、
編碼過(guò)程和單元測(cè)試過(guò)程盡量用數(shù)據(jù)量較大的數(shù)據(jù)庫(kù)測(cè)試,最好能用實(shí)際數(shù)據(jù)測(cè)試。
C、
每個(gè)SQL語(yǔ)句盡量簡(jiǎn)單
D、不要頻繁更新有觸發(fā)器的表的數(shù)據(jù)
E、
注意數(shù)據(jù)庫(kù)函數(shù)的限制以及其性能
10、
學(xué)會(huì)分辯SQL語(yǔ)句的優(yōu)劣
自己分辨SQL語(yǔ)句的優(yōu)劣非常重要,只有自己能分辨優(yōu)劣才能寫(xiě)出高效的語(yǔ)句。
A、
查看SQL語(yǔ)句的執(zhí)行計(jì)劃,可以在查詢(xún)分析其使用CTRL+L圖形化的顯示執(zhí)行計(jì)劃,一般應(yīng)該注意百分比最大的幾個(gè)圖形的屬性,把鼠標(biāo)移動(dòng)到其上面會(huì)顯示這個(gè)圖形的屬性,需要注意預(yù)計(jì)成本的數(shù)據(jù),也要注意其標(biāo)題,一般都是CLUSTERED INDEX SEEK 、INDEX SEEK 、CLUSTERED INDEX SCAN 、INDEX SCAN 、TABLE SCAN等,其中出現(xiàn)SCAN說(shuō)明語(yǔ)句有優(yōu)化的余地。也可以用語(yǔ)句
SET SHOWPLAN_ALL ON
要執(zhí)行的語(yǔ)句
SET SHOWPLAN_ALL OFF
查看執(zhí)行計(jì)劃的文本詳細(xì)信息。
B、
用事件探查器跟蹤系統(tǒng)的運(yùn)行,可疑跟蹤到執(zhí)行的語(yǔ)句,以及所用的時(shí)間,CPU用量以及I/O數(shù)據(jù),從而分析語(yǔ)句的效率。
C、
可以用WINDOWS的系統(tǒng)性能檢測(cè)器,關(guān)注CPU、I/O參數(shù)
四、 測(cè)試、試運(yùn)行、維護(hù)階段
測(cè)試的主要任務(wù)是發(fā)現(xiàn)并修改系統(tǒng)的問(wèn)題,其中性能問(wèn)題也是一個(gè)重要的方面。重點(diǎn)應(yīng)該放在發(fā)現(xiàn)有性能問(wèn)題的地方,并進(jìn)行必要的優(yōu)化。主要進(jìn)行語(yǔ)句優(yōu)化、索引優(yōu)化等。
試運(yùn)行和維護(hù)階段是在實(shí)際的環(huán)境下運(yùn)行系統(tǒng),發(fā)現(xiàn)的問(wèn)題范圍更廣,可能涉及操作系統(tǒng)、網(wǎng)絡(luò)以及多用戶(hù)并發(fā)環(huán)境出現(xiàn)的問(wèn)題,其優(yōu)化也擴(kuò)展到操作系統(tǒng)、網(wǎng)絡(luò)以及數(shù)據(jù)庫(kù)物理存儲(chǔ)的優(yōu)化。
這個(gè)階段的優(yōu)花方法在這里不再展開(kāi),只說(shuō)明下索引維護(hù)的方法:
A、
可以用DBCC DBREINDEX語(yǔ)句或者SQL SERVER維護(hù)計(jì)劃設(shè)定定時(shí)進(jìn)行索引重建,索引重建的目的是提高索引的效能。
B、
可以用語(yǔ)句UPDATE STATISTICS或者SQL SERVER維護(hù)計(jì)劃設(shè)定定時(shí)進(jìn)行索引統(tǒng)計(jì)信息的更新,其目的是使得統(tǒng)計(jì)信息更能反映實(shí)際情況,從而使得優(yōu)化器選擇更合適的索引。
C、
可以用DBCC CHECKDB或者DBCC CHECKTABLE語(yǔ)句檢查數(shù)據(jù)庫(kù)表和索引是否有問(wèn)題,這兩個(gè)語(yǔ)句也能修復(fù)一般的問(wèn)題。
D、
五、網(wǎng)上資料中一些說(shuō)法的個(gè)人不同意見(jiàn)
1、
“應(yīng)盡量避免在 WHERE 子句中對(duì)字段進(jìn)行 NULL 值判斷,否則將導(dǎo)致引擎放棄使用索引而進(jìn)行全表掃描,如:
SELECT ID FROM T WHERE NUM IS NULL
可以在NUM上設(shè)置默認(rèn)值0,確保表中NUM列沒(méi)有NULL值,然后這樣查詢(xún):
SELECT ID FROM T WHERE NUM=0”
個(gè)人意見(jiàn):經(jīng)過(guò)測(cè)試,IS NULL也是可以用INDEX SEEK查找的,0和NULL是不同概念的,以上說(shuō)法的兩個(gè)查詢(xún)的意義和記錄數(shù)是不同的。
2、
“應(yīng)盡量避免在 WHERE 子句中使用!=或<>操作符,否則將引擎放棄使用索引而進(jìn)行全表掃描?!?
個(gè)人意見(jiàn):經(jīng)過(guò)測(cè)試,<>也是可以用INDEX SEEK查找的。
3、
“應(yīng)盡量避免在 WHERE 子句中使用 OR 來(lái)連接條件,否則將導(dǎo)致引擎放棄使用索引而進(jìn)行全表掃描,如:
SELECT ID FROM T WHERE NUM=10 OR NUM=20
可以這樣查詢(xún):
SELECT ID FROM T WHERE NUM=10
UNION ALL
SELECT ID FROM T WHERE NUM=20”
個(gè)人意見(jiàn):主要對(duì)全表掃描的說(shuō)法不贊同。
4、
“IN 和 NOT IN 也要慎用,否則會(huì)導(dǎo)致全表掃描,如:
SELECT ID FROM T WHERE NUM IN(1,2,3)
對(duì)于連續(xù)的數(shù)值,能用 BETWEEN 就不要用 IN 了:
SELECT ID FROM T WHERE NUM BETWEEN 1 AND 3”
個(gè)人意見(jiàn):主要對(duì)全表掃描的說(shuō)法不贊同。
5、
“如果在 WHERE 子句中使用參數(shù),也會(huì)導(dǎo)致全表掃描。因?yàn)镾QL只有在運(yùn)行時(shí)才會(huì)解析局部變量,但優(yōu)化程序不能將訪問(wèn)計(jì)劃的選擇推遲到運(yùn)行時(shí);它必須在編譯時(shí)進(jìn)行選擇。然而,如果在編譯時(shí)建立訪問(wèn)計(jì)劃,變量的值還是未知的,因而無(wú)法作為索引選擇的輸入項(xiàng)。如下面語(yǔ)句將進(jìn)行全表掃描:
SELECT ID FROM T WHERE NUM=@NUM
可以改為強(qiáng)制查詢(xún)使用索引:
SELECT ID FROM T WITH(INDEX(索引名)) WHERE NUM=@NUM”
個(gè)人意見(jiàn):關(guān)于局部變量的解釋比較奇怪,使用參數(shù)如果會(huì)影響性能,那存儲(chǔ)過(guò)程就該校除了,我堅(jiān)持我上面對(duì)于強(qiáng)制索引的看法。
6、
“盡可能的使用 VARCHAR/NVARCHAR 代替 CHAR/NCHAR ,因?yàn)槭紫茸冮L(zhǎng)字段存儲(chǔ)空間小,可以節(jié)省存儲(chǔ)空間,其次對(duì)于查詢(xún)來(lái)說(shuō),在一個(gè)相對(duì)較小的字段內(nèi)搜索效率顯然要高些。”
個(gè)人意見(jiàn):“在一個(gè)相對(duì)較小的字段內(nèi)搜索效率顯然要高些”顯然是對(duì)的,但是字段的長(zhǎng)短似乎不是由變不變長(zhǎng)決定,而是業(yè)務(wù)本身決定。在SQLSERVER6.5或者之前版本,不定長(zhǎng)字符串字段的比較速度比定長(zhǎng)的字符串字段的比較速度慢很多,所以對(duì)于那些版本,我們都是推薦使用定長(zhǎng)字段存儲(chǔ)一些關(guān)鍵字段。而在2000版本,修改了不定長(zhǎng)字符串字段的比較方法,與定長(zhǎng)字段的比較速度差別不大了,這樣為了方便,我們大量使用不定長(zhǎng)字段。
7、
關(guān)于連接表的順序或者條件的順序的說(shuō)法,經(jīng)過(guò)測(cè)試,在SQL SERVER,這些順序都是不影響性能的,這些說(shuō)法可能是對(duì)ORACLE有效。

相關(guān)文章

最新評(píng)論