为什么查询占用这么多内存?

时间:2018-10-08 23:35:22

标签: sql sql-server performance sql-server-2014

我们的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查询计划在这里:

https://www.brentozar.com/pastetheplan/?id=HkgJVy95m

0 个答案:

没有答案