Почему запрос занимает столько памяти? - PullRequest
0 голосов
/ 09 октября 2018

У нас есть Sometable с более чем 200 миллионами строк, и он занимает более 200 ГБ пространства.Определение выглядит так:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...