在當(dāng)今信息時(shí)代,數(shù)據(jù)庫(kù)優(yōu)化也是非常重要的課題,虹信軟件在此和大家分享一下數(shù)據(jù)庫(kù)優(yōu)化的經(jīng)驗(yàn)。
一、IO優(yōu)化
除硬盤硬件性能提升外,數(shù)據(jù)庫(kù)也有兩種方法來(lái)提升磁盤IO訪問(wèn)能力,他們實(shí)質(zhì)都是創(chuàng)建多個(gè)數(shù)據(jù)文件:
一是在物理存儲(chǔ)方面,創(chuàng)建數(shù)據(jù)文件的時(shí)候,可以創(chuàng)建多個(gè)數(shù)據(jù)文件;
二是在優(yōu)化大表數(shù)據(jù)時(shí),我們創(chuàng)建表分區(qū),也需要?jiǎng)?chuàng)建多個(gè)數(shù)據(jù)文件組,
當(dāng)然不同數(shù)據(jù)庫(kù)我們實(shí)現(xiàn)的方法都不相同。
二、設(shè)計(jì)優(yōu)化
我們?cè)谠O(shè)計(jì)的時(shí)候一般都遵循3NF范式設(shè)計(jì),通過(guò)我自己的一些經(jīng)驗(yàn)來(lái)看,數(shù)據(jù)庫(kù)設(shè)計(jì)我也需要根據(jù)合適的需求進(jìn)行合理的設(shè)計(jì),不能死搬硬套。
那么怎樣才是合理的設(shè)計(jì)呢?
一是我們?cè)谧龌A(chǔ)業(yè)務(wù)表設(shè)計(jì)的時(shí)候,最好是用范式設(shè)計(jì);
二是在報(bào)表統(tǒng)計(jì)和數(shù)據(jù)挖掘的時(shí)候,我們的設(shè)計(jì)就剛好相反,用的反范式設(shè)計(jì),使用更多的冗余數(shù)據(jù)。
三、索引優(yōu)化
我們使用最多的都是B樹索引,在SQLserver中,具體分成了聚集索引和非聚集索引,它們的區(qū)別在于:基礎(chǔ)表的數(shù)據(jù)行不按非聚集鍵的順序排序和存儲(chǔ);非聚集索引的葉層是由索引頁(yè)而不是由數(shù)據(jù)頁(yè)組成。一張表只能創(chuàng)建一個(gè)聚集索引。我們知道,索引在存儲(chǔ)的時(shí)候,與表一樣也是要占用存儲(chǔ)空間的,這也是索引提高我們查詢性能的原因。索引內(nèi)部存儲(chǔ)就是采用B+樹原理。其實(shí)索引也是雙刃劍,實(shí)質(zhì)是以空間換時(shí)間,所以我們?cè)谑褂玫臅r(shí)候還需要根據(jù)具體業(yè)務(wù)具體分析,在這里就不多描述了。
我們?cè)趺礃硬拍軇?chuàng)建有效的索引呢,虹信軟件認(rèn)為應(yīng)從以下方面入手:
一般來(lái)說(shuō),以下這幾種情況需要?jiǎng)?chuàng)建索引:
(1)在一張表中,外鍵需要?jiǎng)?chuàng)建索引;
(2)能確定的查詢,where條件中的列,需要?jiǎng)?chuàng)建索引,可以根據(jù)實(shí)際情況看,是否創(chuàng)建復(fù)合索引,因?yàn)閯?chuàng)建復(fù)合索引,效率更高;
(3)order by和group by 的列需要?jiǎng)?chuàng)建索引,其中在order by的列,最好是聚集索引,這樣效率最高;
(4)在inner join、left join和right join關(guān)聯(lián)的列,也需要?jiǎng)?chuàng)建索引。
另外,我們?cè)趧?chuàng)建索引時(shí)也需要注意幾點(diǎn):
(1)因?yàn)樗饕菃为?dú)的存儲(chǔ)空間,所以那種頻繁的insert、update、delete操作表,索引越少越好,用戶在做這些操作的時(shí)候,數(shù)據(jù)庫(kù)需要成本去維護(hù)我們的索引,讓索引與表數(shù)據(jù)保持同步,在一個(gè)周期后,我們的索引空間就會(huì)產(chǎn)生很多的碎片,數(shù)據(jù)庫(kù)查詢性能就會(huì)下降,在這種情況下,就需要重建索引和組織索引;
(2)通過(guò)索引列的值篩選后,還需要在原表進(jìn)行過(guò)半數(shù)據(jù)掃描時(shí),這種情況下,不適合創(chuàng)建索引,是因?yàn)檫@樣還沒(méi)有全表掃描速度快,我們可以通過(guò)執(zhí)行計(jì)劃查看我們創(chuàng)建的索引是否有效;
(3)我們的SQL語(yǔ)句,Where子句時(shí),“=” 左邊一定是字段,不要用函數(shù),否則我們創(chuàng)建的索引就用不上。 如:where Name=’張三’ 這種只要在Name列創(chuàng)建索引,就可以,where substring(Name)=’張三’這種你要在Name列創(chuàng)建了索引也沒(méi)用;
(4)列值為Null的時(shí)候,我們索引對(duì)它是無(wú)效的;
(5)我們?cè)趯慡QL語(yǔ)句需要注意:in和exists合理運(yùn)用,where關(guān)系運(yùn)算符越少越好,>= 、<=這種盡量用一種來(lái)表示。
在SQLserver中,我們可以通過(guò)下面的SQL語(yǔ)句來(lái)判斷哪些需要?jiǎng)?chuàng)建索引:
SELECT TOP 10
[Total Cost] = ROUND(avg_total_user_cost * avg_user_impact * (user_seeks + user_scans),0)
, avg_user_impact
, TableName = statement
,indexhad=d.index_handle
, [EqualityUsage] = equality_columns
, [InequalityUsage] = inequality_columns
, [Include Cloumns] = included_columns
FROM sys.dm_db_missing_index_groups g
INNER JOIN sys.dm_db_missing_index_group_stats s
ON s.group_handle = g.index_group_handle
INNER JOIN sys.dm_db_missing_index_details d
ON d.index_handle = g.index_handle
ORDER BY [Total Cost] DESC;
四、分區(qū)表優(yōu)化
我們?cè)谔幚泶蟊頂?shù)據(jù)的時(shí)候,需要把大表多過(guò)較小的表,查詢就可以更快的運(yùn)行,基本原理就是,因?yàn)橐獟呙璧臄?shù)據(jù)變的更小。通過(guò)將表物理放置在多個(gè)磁盤驅(qū)動(dòng)器上來(lái)拆分表的情況下獲取分區(qū)。如果將某個(gè)表放置在一個(gè)物理驅(qū)動(dòng)器上,將相關(guān)表放置在另一個(gè)驅(qū)動(dòng)器上,則可以提高查詢性能,因?yàn)楫?dāng)運(yùn)行涉及表間連接的查詢時(shí),多個(gè)磁盤頭同時(shí)讀取數(shù)據(jù)。可以使用SQL Server文件組來(lái)指定放置表的磁盤。
我們?cè)鯓硬拍軇?chuàng)建高效的分區(qū)表呢?當(dāng)我們創(chuàng)建了分區(qū)表,程序中,查詢條件需要做出相應(yīng)地的改變,這樣才能讓我們分區(qū)表發(fā)揮出高效(查詢條件盡量控制查詢數(shù)據(jù)結(jié)果在1個(gè)或2個(gè)分區(qū)中)。
當(dāng)我們有很多批量的新增、修改和刪除數(shù)據(jù)操作時(shí),也不適合使用分區(qū)表,這是因?yàn)槲覀冊(cè)趧?chuàng)建分區(qū)表時(shí),物理存儲(chǔ)數(shù)據(jù)文件也是分開(kāi)的,數(shù)據(jù)庫(kù)就會(huì)增加更多的成本去維護(hù)數(shù)據(jù)一致性。
五、網(wǎng)絡(luò)優(yōu)化
在網(wǎng)絡(luò)方面,除了網(wǎng)絡(luò)硬件本身的優(yōu)化外,我們數(shù)據(jù)庫(kù)本身也需要進(jìn)行一定優(yōu)化,對(duì)數(shù)據(jù)庫(kù)訪問(wèn)次數(shù)的優(yōu)化,下面是虹信軟件的一些經(jīng)驗(yàn)體會(huì):
(1)不要長(zhǎng)時(shí)間連接數(shù)據(jù)庫(kù):我們開(kāi)發(fā)人員很多容易犯的錯(cuò)誤,數(shù)據(jù)庫(kù)連接不關(guān)閉,不釋放;
(2)減少連接次數(shù):在一個(gè)連接中能一次性處理的業(yè)務(wù),盡量一次性處理完成。如果進(jìn)行多次連接,就會(huì)增加網(wǎng)絡(luò)消耗;
(3)在一個(gè)事務(wù)中,一定不要在中間斷掉連接,事務(wù)中業(yè)務(wù)不能與事務(wù)外進(jìn)行關(guān)聯(lián)處理,否則會(huì)造成死鎖。
如有侵權(quán)請(qǐng)聯(lián)系刪除!
核心關(guān)注:拓步ERP系統(tǒng)平臺(tái)是覆蓋了眾多的業(yè)務(wù)領(lǐng)域、行業(yè)應(yīng)用,蘊(yùn)涵了豐富的ERP管理思想,集成了ERP軟件業(yè)務(wù)管理理念,功能涉及供應(yīng)鏈、成本、制造、CRM、HR等眾多業(yè)務(wù)領(lǐng)域的管理,全面涵蓋了企業(yè)關(guān)注ERP管理系統(tǒng)的核心領(lǐng)域,是眾多中小企業(yè)信息化建設(shè)首選的ERP管理軟件信賴品牌。
轉(zhuǎn)載請(qǐng)注明出處:拓步ERP資訊網(wǎng)http://m.lukmueng.com/
本文標(biāo)題:Web應(yīng)用性能優(yōu)化之淺見(jiàn)(二)
本文網(wǎng)址:http://m.lukmueng.com/html/consultation/10820519002.html