1. 程式人生 > >SQL SERVER 效能優化

SQL SERVER 效能優化

1、效能指標監控     1)開啟perfmon.exe效能監視器     2)新增效能指標  Memory: Available Mbytes  Memory: Pages/sec
 Paging File:%Usage
 SQL Server: Buffer Manager: Buffer cache hit
 SQL Server: Buffer Manager: Page life expectancy
 SQL Server: Memory Manager: Memory Grants Pending
   3)資料分析 在本文中,再次使用了可靠性和效能監視器這個工具。為了獲取記憶體相關的效能計數器,需要在圖形化介面中觀察這些計數器。

    首先先檢查Memory: Available Mbytes,這個值意味著系統的可用記憶體。如果發現這個值經常很低,可能表示伺服器記憶體不足,在生產資料庫中,這個值可以使用GB為單位。

    然後檢查Memory: Pages/sec ,以為這因為硬頁面錯誤導致的從磁碟讀或寫頁面。這個值如果長期高於20,意味著記憶體不足使得應用程式使用虛擬記憶體,從而導致掛起。

    接著是Memory: pages/sec ,同時也要檢查Paging File:%Usage去預估記憶體掛起。如果這個值經常超過20%,可能意味著記憶體不足。

    SQL Server: Buffer Manager: Buffer cache hit ratio:意味著資料從快取中讀取的次數,比較合理的值為大於90%。如果該值很低,可能記憶體不足或者需要檢查索引和查詢。如果你需要獲得大量資料,這一步可能就會佔用大量記憶體然後引起SQLServer從磁碟讀資料而不是從記憶體。檢查索引,確保在大表中能儘可能筆描掃描。並儘可能限制查詢返回的結果行。

    檢查SQL Server: Buffer Manager: Page life expectancy,表示資料頁駐留在記憶體的秒數。微軟建議最少300秒。如果在一個例項中經常低於300秒,意味著資料保留的時間少於5分鐘就被移出記憶體。

    如果SQL Server: Memory Manager: Memory Grants Pending經常建議等待程序,你可能需要增加伺服器的記憶體了。

2、設定SQLSERVER 的最大使用記憶體,並重啟sqlserver伺服器,從而使得資料庫使用的記憶體超過最大設定記憶體時,自動實現記憶體回收。

    由於當前資料庫伺服器的記憶體是16G,為其他程式預留了4G的程式,所以資料庫的最大使用程式設定為12G

3、檢視連線數

   select*from sysprocesses where dbid in (select dbid from sysdatabases where name='MyDatabase')  檢視連線數,通過連線數的分析確定資料庫的連結程式是否正確。如果連線數過多,資源得不到釋放,說明有問題。

4、檢視等待型別

    SELECT TOP 10 * FROM SYS.dm_os_wait_stats ORDER BY wait_time_ms DESC  

   分析:通過等待型別,分析SQLSERVER 的耗時操作存在的型別:

   SELECT

(physical_memory_in_use_kb/1024) AS Memory_usedby_Sqlserver_MB, (locked_page_allocations_kb/1024) AS Locked_pages_used_Sqlserver_MB, (total_virtual_address_space_kb/1024) AS Total_VAS_in_MB, process_physical_memory_low, process_virtual_memory_low FROM sys.dm_os_process_memory;   檢視sqlserver的記憶體結構,通過記憶體結構分析SQLServer的記憶體情況

5、檢視耗時SQL

SELECT SS.SUM_EXECUTION_COUNT,
T.TEXT,
SS.SUM_TOTAL_ELAPSED_TIME,
SS.SUM_TOTAL_WORKER_TIME,
SS.SUM_TOTAL_LOGICAL_READS,
SS.SUM_TOTAL_LOGICAL_WRITES
FROM (SELECT S.PLAN_HANDLE,
SUM(S.EXECUTION_COUNT)SUM_EXECUTION_COUNT,
SUM(S.TOTAL_ELAPSED_TIME)SUM_TOTAL_ELAPSED_TIME,
SUM(S.TOTAL_WORKER_TIME)SUM_TOTAL_WORKER_TIME,
SUM(S.TOTAL_LOGICAL_READS)SUM_TOTAL_LOGICAL_READS,
SUM(S.TOTAL_LOGICAL_WRITES)SUM_TOTAL_LOGICAL_WRITES
FROM SYS.DM_EXEC_QUERY_STATS S
GROUP BY S.PLAN_HANDLE
) AS SS
CROSS APPLY SYS.dm_exec_sql_text(SS.PLAN_HANDLE)T
ORDER BY SUM_TOTAL_LOGICAL_READS DESC

通過此語句可以檢視耗時的SQL語句,根據SQL優化的規則進行鍼對性的SQL優化。另,SQLSERVER的效能殺手:

1)低質量的索引

2)不精確的統計

3)過多的阻塞和死鎖

4)低質量的查詢涉及

總結:

SQLSERVER 的效能優化是一個複雜的過程,其中的核心關鍵包括三個:1)減少全表檢索的次數 2)減少資料獲取的數量3)儘可能的採用執行緒池實現資料庫連結,並及時的關閉資料鏈接,方式記憶體溢位.當發現瓶頸後,針對性的優化演算法或者硬體吞吐量做出針對性的擴充套件.

知識擴充套件

SQLser的記憶體管理

SQL Server的記憶體管理設計的原則:1)減少磁碟讀取和寫入IO次數 2)減少資料檢索的時間。資料的記憶體管理機制採用頁式管理機制,分為資料頁和檢索頁。相應的記憶體的索引分為聚集索引和非聚集索引,聚集索引與資料的儲存相關,而非聚集索引與索引頁相關與儲存無關。資料庫的IO操作分為分頁讀和分頁寫。分頁讀採取預讀、讀取索引頁、讀取資料頁和高階掃描,其中涉及的創新技術包括快取記憶體預讀機制、資料讀取分析合併機制、資料索引引用機制和全表共享訪問機制。

分頁寫分為邏輯寫入和磁碟寫入,資料寫入快取記憶體時發生邏輯寫入,資料由快取記憶體寫入磁碟時發生磁碟寫入。寫入的核心是維護邏輯寫入和磁碟寫入的一致性。寫的過程包括形成髒資料和及時的事務日誌、查詢聚集寫入頁的髒資料、寫入磁碟資料。寫入磁碟資料包括惰性寫入、勤奮寫入和檢查點寫入,為了保證高效的操作,全部採用非同步操作.