我们的Sometable
拥有超过2亿行,它占用了200GB以上的空间。定义如下:
CREATE TABLE Sometable
(
Id INT IDENTITY(1,1) NOT NULL CONSTRAINT PkSometable PRIMARY KEY,
Somefield UNIQUEIDENTIFIER NOT NULL,
[Data] NVARCHAR(MAX)
)
我们运行此查询
SELECT TOP 1000 *
FROM Sometable WITH (NOLOCK)
WHERE (Id < 123456789)
AND (Somefield = '957dbdff-f313-4ce7-a9c8-f822d9d789f5')
ORDER BY id DESC
此查询的确在聚集索引上进行搜索,但是Somefield
列上有一个附加条件,因此它需要进行大量页面查找以验证Somefield = '957dbdff-f313-4ce7-a9c8-f822d9d789f5'
条件。硬盘旋转得像疯了似的,没关系。
但是当该查询运行时,我也看到很高的内存使用率,并且日志中的条目与此类似:
AppDomain 2046 (...) is marked for unload due to memory pressure.
为什么会这样?为什么要使用这么多内存?该查询需要读取表,找到1000行,并将其返回。理论上只需要缓冲1000行。那会怎样呢?数据库版本为SQL Server 2014 Standard。
类似查询的SQL查询计划在这里: