У нас есть 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