Використана пам'ять не вивільняється після експорту SQL BULK / BCP


10

Я створив дуже основну таблицю SQL наступним чином

CREATE TABLE [dbo].[TickData](
[Date] [varchar](12) NULL,
[Time] [varchar](12) NOT NULL,
[Symbol] [varchar](12) NOT NULL,
[Side] [varchar](2) NOT NULL,
[Depth] [varchar](2) NOT NULL,
[Quote] [varchar](12) NOT NULL,
[Size] [varchar](18) NOT NULL
    ) ON [PRIMARY]

Потім я здійснив 3-х гігрову вставку

    BULK
    INSERT TickData
    FROM 
    'C:\SUMO.csv'
    GO

Тоді використання оперативної пам’яті для SQL-сервера перейшло на Skyrocking, з’їдаючи ~ 30Go оперативної пам’яті:

введіть тут опис зображення

введіть тут опис зображення

Я вважаю за краще це ненормальне поведінка, і щоб уникнути цього, можна вжити заходів.

EDIT:
Гаразд, це, мабуть, поведінка за замовчуванням. Справедливо.
Однак чому пам’ять не звільняється довго після завершення масової вставки?

Кілька додаткових міркувань:
Що стосується коментарів щодо SQL-сервера, що звільняє пам’ять, коли ОС йому "розповідає", мій практичний досвід роботи на 24-ядерному сервері 32 Gb Xeon доводить, що це неточно: Щойно екстракт BCP-Voracious закінчується У мене є пул .Net Екземпляри мого додатка для обробки даних, яким потрібно обробляти видобуті дані, і їм залишається задихатися / боротися, щоб поділитися рештою пам’яті, щоб спробувати виконати свої завдання, які займають набагато більше часу, ніж SQL Server повернутий вимкнено, а пам'ять доступна для всіх програм, якими можна ділитися. Мені потрібно зупинити агент SQL Server, щоб все пройшло безперебійно і не допускати збоїв додатків для Articiallt. Щодо штучного обмеження / обмеження жорстокої пам'яті, якщо вільна пам'ять доступна, чому б не використати його? В ідеалі, скоріше динамічно налаштовуватися на те, щоб адаптуватися до наявного, а не просто насильно обмежуватись "випадковим чином". Але я гадаю, що це задум, тому справа закрита в останньому питанні.


6
Чому SQL Server повинен звільнити пам'ять? Якщо для проведення цієї операції була потрібна пам'ять один раз, вона знову знадобиться. Якби SQL Server випустив пам'ять, для чого ти б цим скористався? Чому пам’ять повинна бути вільною? Якщо ви використовуєте пам'ять для чогось іншого, то ця об'ємна вставка працює знову, що повинно відбутися?
Аарон Бертран

Єдина дія, яку ви можете вжити, щоб уникнути цього, - це встановити максимальний розмір пам'яті. Щоб "відновити" пам'ять, можна перезапустити службу SQL Server. Очевидно, що це звільнить пам'ять, і коли служба перезапуститься, вона виділить пам'ять нормально.
TMN

Я прибрав останню редакцію. Якщо ви хочете мати аргумент / дискусію щодо достоїнств або проблем того, як кодується SQL Server (або будь-який інший двигун БД), знайдіть краще місце для цього. На оригінальне запитання було дано відповідь, мабуть, правильно та достатньо. Якщо цей Q продовжує повзати, він може заблокуватися.
JNK

Немає нічого поганого в тому, щоб хотіти знати відповіді та обговорювати методології, тільки не тут, на сайті Q&A. Ви точно можете десь провести цю дискусію в чаті або на форумі, але обмін стеками трохи структурованіший, і питання дискусії у вас закриються дуже швидко.
JNK

3
Крім того, мені, як не модератору, цікаво, чому ви на своєму сервері виконуєте не-SQL речі? Поле має бути зарезервовано ЗАБЕЗПЕЧЕНО для SQL Server, це як DBA 101. Двигун не був розроблений для спільного використання ресурсів.
JNK

Відповіді:


12

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


1
Що стосується вашої редакції, коментар Аарона є хорошим. Причина в тому, що на сервері баз даних мало сенсу звільняти пам'ять. SQL Server реагує на тиск пам'яті та звільнить пам'ять, якщо це дійсно потрібно, але насправді це не повинно бути необхідним.
Метт Вітфілд

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

Справедливо. Моя точка зору полягає лише в тому, що має бути можливість ввімкнути або вимкнути це, і припущення про те, що SQL-сервер є єдиним додатком на сервері, справді зловживає (можливо, це стосується великих компаній з великими мережами, але це не єдине можливі ні найпоширеніші налаштування)
Мехді ЛАМРАНІ

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

1
@AaronBertrand Добре, я можу помилятися, але як це було сказано в моїй останній редакції, я не був тим, чим я був свідком: пам'ять не звільнялася, коли інша програма не потребувала цього, викликаючи збої в пам'яті (звідси моє незадоволення ...) У будь-якому разі, давайте Закрийте тему, я думаю, немає справжньої необхідності сперечатися більше цього.
Мехді ЛАМРАНІ

7

Якщо ви дійсно хочете, щоб ОС повернула пам'ять з SQL Server, візьміть великий 20 ГБ файл і скопіюйте його по мережі. SQL Server звільнить пам'ять у міру необхідності ОС. Але я хотів би спостерігати за різними лічильниками ефективності, поки це триває, і бачити, як змінюється продуктивність вашої BULK INSERT, якщо ви запускаєте її знову або під час роботи копії, або відразу після неї.

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

Напевно, ви очікуєте більш гнучкої поведінки, де ви можете мати частину часу вільної пам'яті. З якою метою? Це як скорочення файлу бази даних, щоб звільнити місце на диску, який ви не можете використовувати для інших цілей, оскільки файл бази даних знову зростатиме?

Це смішно, якщо ви вводите пошук Google для "чому не SQL Server", найпоширенішим автоматичним завершенням є "звільнення пам'яті".



"Те, що ви, начебто, очікуєте, - більш гнучка поведінка". Саме так. Я хочу, щоб сервер SQL використовував усю наявну пам'ять, коли вона доступна, але коли ці важкі моменти закінчуються, повернутися в стан "сну" і залишити інші потрібні пам'яті додатки виконувати свою роботу спокійно (ви можете подивитися на мій нова остання редакція з цього приводу)
Мехді ЛАМРАНІ

Конкретний випадок, що пояснює, чому мені потрібно це зробити, ви можете подивитися @ мій останній коментар до JNK внизу питання
Мехді ЛАМРАНІ

4

Це, на жаль, дизайн, будь ласка, посилайтесь на це повідомлення. Однак у цій публікації він дає вам певну інструкцію щодо того, як це контролювати.

/server/251832/sql-server-bulk-insert-physical-memory-issue

Виділення пам'яті Редагувати

Пам'ять не freedпрацює, оскільки вона виділяє пам'ять багато, як додаток .NET. Оскільки розподіл пам’яті дорогий, він буде тримати це розподіл, якщо ОС не вимагає цього. Але, не бійтеся, якщо ОС хоче пам'яті, вона отримає її, як і в .NET-додатку.


@MikaJacobi Звичайно, немає проблем. Ще одне, що потрібно зазначити, так що ви знаєте, що SQL Server візьме на себе всі ядра, тому переконайтеся, що ви обмежите кількість наявних ядер. Я бачив, як SQL Server фактично знищує операційну систему, на якій він працював раніше, і мені довелося важко перезавантажити центр обробки даних SQL Server.

Добре знати. У мене є 24 ядра, так що зараз це нормально. Але чому пам’ять не звільняється після закінчення масової вставки?

Поки об'ємна вставка завершена, якщо ОС потрібна пам'ять, вона буде їй надана, але вона виділяє пам'ять багато, як додаток .NET, так що якщо вона потрібна, і ніхто інший не може отримати доступ до неї швидше.

Мій досвід перегляду суперечить цьому (див. Останню редакцію).
Мехді ЛАМРАНІ
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.