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