近期經常遇到使用者将自建資料庫與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中執行速度自然沒有自建庫快。
解決方案:
1. 上述我們分析到,rds的配置實際比自建庫高,那麼可以在rds 執行個體控制台的參數設定中,增加max degree of parallelism值來提升并行度。
2. 通過執行計劃,還發現使用者表中有missing index。 在rds添加了missing index後,查詢性能有大幅度提升,即使并行度為2,也可以在5s執行完畢。