Управление памятью SQL Server - PullRequest
0 голосов
/ 06 августа 2011

При загрузке таблицы с ~ 17M строк (размером около 2 ГБ) в SQLServer с использованием класса BulkCopy сервер, похоже, тихо исчерпывает память после загрузки около 6M записей.то есть, я занимаю чуть более 90% системной памяти, и после этого, не вызывая исключение нехватки памяти, молча продолжает пытаться загрузить данные, что становится чрезвычайно медленным.

Кто-нибудь еще сталкивался с подобными проблемами?Есть ли способ сказать SQLServer, чтобы очистить часть памяти без перезапуска?Если нет, может кто-нибудь сказать мне, как программно перезагрузить сервер?

PS: я подтвердил, что не моя программа пожирает память.

[EDIT] Я использую 64-разрядную версию Windows 7, 64-разрядную версию sqlserver 2008 R2 с 8 гигабайтами памяти.

Ответы [ 2 ]

3 голосов
/ 06 августа 2011

SQL Server выделит всю память, доступную в системе. Как только он достигнет максимальной памяти, он останется там и не освободит эту память. Это намеренно предполагаемое поведение.

Вы не сообщили нам некоторые важные сведения:

  • сколько физической памяти имеет система?
  • это 64-битная или 32-битная ОС?
  • - это 64-битный или 32-битный экземпляр SQL Server?

Я подозреваю, что вы видите что-то совершенно не связанное: в 6M строках ваш тест начинает увеличивать файлы, и у вас не включена мгновенная инициализация файла . Есть много счетчиков производительности, чтобы посмотреть:

И, как и при любой проблеме устранения неполадок SQL Server, следование методологии Ожидания и очереди не может повредить. Наконец, если проблема действительно связана с нехваткой памяти, в приведены рекомендации по расследованию использования DBCC MEMORYSTATUS для мониторинга использования памяти SQL Server .

1 голос
/ 06 августа 2011

Sql имеет некоторые накладные расходы для загрузки всех этих данных в память, поэтому, хотя у вас может быть 2 ГБ необработанных данных, есть метаданные и указатели, и такие, которые должны быть загружены в память для отслеживания этих вещей. Что происходит в вашей системе, так это то, что у вас заканчивается ОЗУ для хранения всего в памяти, и поэтому определенные страницы (единицы, которые ОС использует для преобразования виртуальных адресов в физические) должны быть перенесены на жесткий диск (очень медленно), чтобы комната может быть сделана для хранения дополнительной информации. Обычно загрузка базы данных полностью в память делает это, поскольку базы данных могут стать довольно большими. Сервер Sql имеет настраиваемое управление памятью, поэтому он обычно избавляется от вещей, которые не использовались в последнее время и вряд ли будут использоваться в ближайшем будущем.

Перезапуск Sql, когда это происходит, на самом деле является единственным простым способом сделать это, в зависимости от вашей конкретной версии Sql (MySql, MsSql и т. Д.). Существуют способы программного перезапуска сервера.

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