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