
目前設定:
我們有一個非常大的表,其中有一個 bigint pk 和一個 nvarchar(1025) 欄位。唯一的指標就是PK。我們還有另一個表,它是第一個表的 bigint_fk,帶有字串欄位的校驗和。
create table BigStringTable (
id bigint identity(1,1) not null,
dataString nvarchar(1025) not null,
primary key clustered (id));
);
create table BigStringTableHashes(
id bigint not null,
dataStringHash int not null,
CONSTRAINT [PK_dataStringHash] PRIMARY KEY NONCLUSTERED
(
[claid] dataStringHash
)
);
所以你可能會查詢類似的內容:
SELECT datastring FROM BigStringTable AS bst
JOIN BigStringTableHashes AS hashes ON bst.id = hashes.id
WHERE hashes.dataStringHash = checksum(<Whatever String>) AND bst.dataString = '<Whatever String>'
該表是非常大的。
我們在亞馬遜上有一台非常昂貴的伺服器,有 1.9 TB RAM 來運行所有這些。版本:
Microsoft SQL Server 2017 (RTM-CU13) (KB4466404) - 14.0.3048.4 (X64) Nov 30 2018 12:57:58 Copyright (C) 2017 Microsoft Corporation Enterprise Edition: Core-based Licensing (64-bit) on Windows Server 2019 Datacenter 10.0 <X64> (Build 17763: ) (Hypervisor)
然而,如果我們添加超過 900 GB 的 RAM,效能就會突然下降。上面的查詢開始讀取大量資料。我知道當更改最大內存時,它會清除緩存,但它永遠不會恢復,直到我們降低最大內存並重新啟動。
該伺服器上沒有其他內容。
據我所知,查詢計劃是相同的,但很難確認,因為我們不能太頻繁地將其置於這種不良狀態,從而造成客戶中斷。
我不明白的是添加 RAM 如何破壞性能。
答案1
也許嘗試不要對事物運行函數,如果還沒有的話,可以考慮按有用的鍵進行分區。
解釋說了什麼?
希望能有所幫助或激發想法。順便一提:天啊。對於 AWS 來說,這肯定是昂貴的。這是一個瘋狂的內存量。