当前设置:
我们有一张非常大的表,其中包含一个 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 并重新启动,否则它永远不会恢复。
该服务器上没有其他内容。
据我所知,查询计划是相同的,但很难确认,因为我们不能频繁地将其置于这种不执行状态,从而导致客户中断。
我不明白的是添加 RAM 怎么会破坏性能。
答案1
也许尝试不要对事物运行某个函数,如果还没有的话,可以考虑通过有用的键进行分区。
解释一下什么?
希望这能有所帮助或激发灵感。顺便说一句:天哪。对于 AWS 来说这一定很贵。这真是大量的 RAM。