天天看點

性能測試:自建資料庫與RDS性能對比SQL Server案例排查分析

近期經常遇到使用者将自建資料庫與rds進行對比,簡單的對比結果是自建庫比rds執行個體查詢快。我們這裡來看看一個執行個體,有一家物流公司,剛開始使用rds sql server資料庫,發現通過ecs通路rds執行個體,執行語句需要60s左右,但是通路ecs本地自建庫隻需要2-3s。那麼rds是否是真的不如自建資料庫呢? 接下來,我們來探讨對比自建庫和rds的正确姿勢,如何公平地對比自建庫和rds的性能。

對比自建庫和rds的語句執行性能,下面這些因素必須都考慮到:

針對rds sql server 2012執行個體,可以開啟sql server profiler, 抓取rpc:completed, sql:stmtstarting, sql:stmtcompleted, sql:batchstarting和sql:batchcompleted這幾個事件。 

針對rds sql server 2008 r2執行個體,暫不支援開啟sql server profiler, 可以通過下面語句查詢近期執行的語句,及其start_time和total_elapased_time 。total_elapased_time指請求到達sql server後執行該語句總共消耗的時間(機關ms)。

sql server執行個體需要關注的參數主要有fill factor (%),max degree of parallelism和max server memory (mb)。

fill factor(%):

這是一個用于調優資料存儲和性能的server_side參數,當建立或者重建索引時,該值可以确定每個葉級頁上要填充資料的空間百分比,以保留一些剩餘空間作為以後擴充索引的可用空間。

max degree of parallism(maxdop):

限制并行計劃執行時所用的處理器數量,即限制語句的并行度。

max server memory(mb):

設定buffer pool擷取的記憶體的上限。

兩個環境中,語句執行過程中,需要對比,是否有等待和阻塞情況發生。

檢視等待情況:

檢查索引碎片率語句如下:

索引碎片率大,影響查詢的速度。如果索引碎片率在5%-30#之間,推薦重組索引;如果碎片率大于30%,推薦重建索引。

檢查統計資訊語句如下:

如果發現rds中統計資訊比自建庫要老舊,可以手動更新下統計資訊。 防止由于統計資訊老舊,造成sql  server生成不準确的執行計劃,降低執行效率。

rds作為一個公共的關系資料庫服務,首要是保證穩定高可用,高安全,保證使用者使用的是既安全又穩定的服務。然後才是高性能。

rds sql server為了保證主備資料的一緻性,采用的是high safety同步模式,相對于high performance 模式,性能有所犧牲,但是增強了高可用性,保護了資料。

同時, rds 還提供多可用區主備執行個體,雙節點在不同機房,更進一步保證了高可用性和安全性。

問題排查:

1. rds執行個體的記憶體配置比本地高;

2. 網絡延遲不大;

3. rds的maxdop值是2,而ecs自建執行個體是預設值,即并行語句可以申請盡可能多的并行線程。

通過執行計劃看出,rds中查詢語句的并行度是2,而自建庫中查詢語句的并行度是8,rds中執行速度自然沒有自建庫快。

性能測試:自建資料庫與RDS性能對比SQL Server案例排查分析
性能測試:自建資料庫與RDS性能對比SQL Server案例排查分析

解決方案:

1. 上述我們分析到,rds的配置實際比自建庫高,那麼可以在rds 執行個體控制台的參數設定中,增加max degree of parallelism值來提升并行度。

2. 通過執行計劃,還發現使用者表中有missing index。 在rds添加了missing index後,查詢性能有大幅度提升,即使并行度為2,也可以在5s執行完畢。