提高 SQL Server 性能
我有一個相當簡單的帶有一個主表的 SQL Server 2014 標準數據庫。這是工作量:
我插入一行,對其進行一些更新(最多 5 次更新),然後繼續。我總是更新最近的行。幾秒鐘後,我再也沒有更新該行。我偶爾會選擇,但我的主要問題是插入和更新,即使沒有選擇發生。
查詢如下所示:
insert into Table (Id, Field1, Field2, ...) values (@Id, @Field1, @Field2, ...) update Table set Field3 = @Field3, Field4 = @Field4 where Id = @Id
Id 是聚集索引中的唯一列。此表上沒有其他索引。Id 是唯一標識符。
bigint identity
在看到大量 pagelatch_ex 等待後,我改變了它。它每秒處理大約 45k 個請求,CPU 使用率為 90%,IO 為 50%。這是在 AWS 中,我使用 c3.2xlarge 和 2000 IOPS。我沒有太多空間來提高 CPU 的性能,但我確實有另外 10 倍的 IOPS。我可以做些什麼來減少 CPU 使用率?
它正在執行大約 45k 請求/秒
不要每秒執行 45k 請求。
在插入方面,您可以對它們進行批處理並使用批量插入。
可能使用儲存過程 - 在 CPU 上應該稍微不那麼緊張(更少的解析)。
但主要考慮是否可以減少操作次數。BulkCopy 非常好,您基本上可以每秒執行兩次操作,一次執行所有插入和更新(批量複製到臨時表,合併到目標)。
這可能會耗盡幾乎所有的 CPU。
是的,這可能需要一些認真的重新程式。但是,如果您需要降低 CPU 使用率,這就是這樣做的方法。
正如其他人所建議的那樣,我會嘗試對傳入的交易進行批處理。
一種方法可能是將傳入的行儲存在記憶體表中(需要升級到企業版),然後每五分鐘使用 SQL Server 代理作業之類的方式將成批的行移動到它們的最終儲存中,或者在您確定它們不會時再次改變。
記憶體表大大減少了鎖定和閂鎖問題,這使得它們非常適合您所描述的插入更新更新更新刪除工作負載類型。這對於本機編譯的儲存過程特別有效。