Відновлення пам'яті з SQL Server


10

У мене є екземпляр SQL Server, який використовує пам'ять, поступово зростаючи, поки Windows більше не дасть йому. Здається логічним, що випадковий великий запит може призвести до зростання екземпляра.

Чи є спосіб переконати SQL Server звільнити пам'ять, яка йому більше не потрібна (крім перезавантаження служби)?

Редагувати:
я використовую SQL Server 2000 SQL Server 8.00.2039 - SP4 (стандартне видання)

Мені вдалося це дізнатись за допомогою наступного запиту:

SELECT 'SQL Server ' 
    + CAST(SERVERPROPERTY('productversion') AS VARCHAR) + ' - ' 
    + CAST(SERVERPROPERTY('productlevel') AS VARCHAR) + ' (' 
    + CAST(SERVERPROPERTY('edition') AS VARCHAR) + ')'

Відповіді:


19

Саме так повинен працювати SQL Server .

Якщо у вас є інші сервіси на цій машині і не хочете, щоб SQL споживав усю наявну пам'ять, вам потрібно буде встановити максимальну пам'ять сервера. Див. Параметри пам'яті SQL Server на MSDN.


1
Звучить більше як помилка, ніж функція ... це відбувається зі мною. SQL Server займає 95% доступної оперативної пам’яті, щоб щось зробити, і не може випустити її після її завершення.
Алхімічна

1
@Alchemical Залежить від того, що ви маєте на увазі під " завершеним ". SQL Server може використовувати всю оперативну пам’ять на комп'ютері; використовуючи його як кеш диска. Він не " завершує " використання його як кеш-диска, поки ви не закінчите використання SQL Server.
Ян Бойд

8

Інші афіші вірні, що це за задумом, але ви абсолютно хочете обмежити максимальну пам'ять трохи менше, ніж оперативна пам’ять вашого сервера. Подумайте про цю послідовність подій:

  • SQL 2000 працює із задоволенням, споживаючи всю оперативну пам’ять вашого сервера
  • Хтось RDP в, або вам потрібно підтягнути IE, щоб завантажити патч, або ваші резервні копії розпочнуться, як би там не було
  • SQL повинен розібратись та звільнити достатню кількість пам'яті для роботи ОС
  • Продуктивність відмовляє, звільняючи пам'ять і переходячи на диск
  • Речі йдуть досить добре, коли вона стабільна
  • Інша операція завершується, і SQL поступово відновлює звільнену ОЗУ
  • Повторіть

Щоб уникнути цього, налаштуйте максимальний обсяг пам’яті сервера приблизно на 80-90% фактичної фізичної пам’яті. Інструкції для SQL 2000 за адресою: http://msdn.microsoft.com/en-us/library/ms178067.aspx


Пам'ятайте, така поведінка 2005 і 2008 - 2000 років не звільняє пам'ять на вимогу в ОС.
Пол Рандал

2
Не зовсім на вимогу, але це звільняє пам'ять назад до ОС. З посилання, яке я розмістив: "Коли SQL Server динамічно використовує пам'ять, він періодично запитує систему, щоб визначити об'єм вільної фізичної пам'яті. У Microsoft Windows 2000 SQL Server збільшує або скорочує кеш-пам'ять, щоб зберегти вільну фізичну пам'ять між 4 Мб і 10 Мб, залежно від активності сервера. Збереження цієї вільної пам’яті заважає операційній системі Windows 2000 перейти до сторінки. Якщо пам’яті менше, SQL Server звільняє пам’ять у Windows 2000. Якщо пам’яті більше, SQL Server виділяє пам’ять у буферний пул ».
ш-бета

Ах - правда - це трюк декомпозиції трохи фізичної пам’яті - ти маєш рацію!
Пол Рандал

4

Він випустить його лише в тому випадку, якщо ОС подасть сигнал, що це голодна оперативна пам'ять, або якщо ви зупините та перезапустите службу; що потрібно зробити, це обмежити максимальну кількість, яку використовуватиме SQL, конфігуруючи значення "максимальної пам'яті сервера". Якщо на сервері немає нічого іншого, що потребує оперативної пам’яті (і, сподіваємось, її немає), я б не переживав про це.


4

Отже, підсумовуючи відповіді:

Немає способу спонукати MS SQL Server звільнити пам'ять, яка йому не потрібна відразу. SQL Server повинен автоматично звільняти пам'ять, коли цього потрібно, але не раніше. І якщо у вас виникають проблеми з пам’яттю, вам слід зменшити значення оптимізації пам’яті «max max memory».


3

SQL Server споживає пам'ять і не повертає її, якщо операційна система не скаже, що існує тиск у пам'яті. Як зазначив Портман, це розроблено, і якщо ви хочете обмежити споживання пам'яті, вам потрібно встановити максимальну пам'ять сервера, яку буде використовувати SQL Server.


2

Пам’ятайте, що поведінка, яку ви все описуєте, починається від SQL Server 2005 і далі, коли менеджер пам'яті був переписаний на (серед іншого) відповідь на запити тиску пам'яті в ОС.

Для SQL Server 2000 і раніше, як тільки він захопить пам'ять, він не поверне його, незалежно від того, скільки ОС кричить про це.

CodeSlave - чи працюєте ви 2000, 2005 чи 2008?


А-а ... так, справді SQL 2000.
BIBD

3
Він не повертає його, коли ОС кричить на нього, але НЕ повертає його, якщо він бачить, що ОС знаходиться нижче певного порогу вільної фізичної пам'яті. Дивіться msdn.microsoft.com/en-us/library/ms178067.aspx
sh-beta

І щоб підкріпити те, що говорив sh-beta, SQL Server 2000 звільняє пам'ять лише тоді, коли помічає, що в ОС недостатньо фізичної пам’яті, оскільки до Windows XP (2001) Windows не додала API, щоб дозволити « ОС кричати це "( msdn.microsoft.com/en-us/library/aa366799(v=vs.85).aspx ). SQL Server 2005 користується цією новою функцією Windows. Але коли було написано SQL Server 2000, ОС не могла кричати на це, змушуючи SQL Server періодично перевіряти тиск у пам'яті.
Ян Бойд

0

Я знаю, старе питання, але спосіб змусити (принаймні новіший) SQL звільнити пам'ять - написати додаток, що виділяє стільки пам’яті, скільки можливо, чекаючи (скажімо) 15 секунд (наприклад, сон (15000)) і звільнення виділеної пам'яті та вихід; Я спробував це, і SQL вивільняє пам'ять, щоб система повертала свою оперативну пам'ять; написання коду, як описано вище, майже тривіальне за допомогою C / C ++, лише питання створення ланцюга стуктів для утримання ланцюга блоку пам'яті (вказівник і розмір), поступово зменшувати розмір, коли "malloc ()" не вдається, поки не досягне мінімум (скажімо, менше 1024), а потім пройдіть пов'язаний список, щоб звільнити виділені блоки

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.