Збільшена оперативна пам'ять, гірша продуктивність


9

Налаштування:

  • Windows Server 2008 R2
  • SQL Server 2008 R2 SP1
  • 240 Гб оперативної пам’яті
  • TempDB - це файли даних 8х16 ГБ без автоматичного зростання (всього 128 ГБ)
  • Фізичний / автономний сервер

Цей сервер використовується для обробки ETL. Ми щойно встановили на цьому сервері більше оперативної пам’яті на загальну 240 Гб оперативної пам’яті. Служби SQL Server - це єдині реальні речі.

Пам'ять добре відображається в BIOS, OpenManage та Windows.

Якщо я налаштую SQL Server на використання мінімальної / максимальної пам’яті 70/100 Гб, у нас немає проблем. Однак, коли я збільшую його до 120/150 ГБ, я отримую таку помилку, коли запускаю один з наших ETL-процесів:

Не вдалося виділити простір для об'єкта '<тимчасовий системний об'єкт: 422234507706368>' у базі даних 'tempdb', оскільки група файлів 'PRIMARY' заповнена. Створіть простір на диску, видаливши непотрібні файли, видаливши об’єкти у групі файлів, додавши додаткові файли до групи файлів або встановивши автоматичний ріст для існуючих файлів у групі файлів. (Msg 1105, стан 2, процедура невідома, рядок 1)

Ми ніколи не стикалися з цим питанням до зміни конфігурації пам'яті. Після повторної конфігурації до оригінального 70/100 Гб ми не отримаємо цю помилку.

Те, що я спробував:

  1. Встановіть файли даних TempDB для автоматичного зростання. Це просто призводить до того, що файли автоматично зростають, поки не буде досягнуто ємності диска, а потім не вийде з ладу.
  2. Додайте більше файлів даних TempDB. Та сама помилка, як показано.
  3. Збільшити розмір TempDB до 8x32GB (всього 256GB)

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


2
Чи збалансована пам’ять у NUMA-вузлах? Як щодо ваших процесорів? Чи показує журнал SQL Server, скільки процесорів використовується під час запуску?
Аарон Бертран

1
Що ви використовуєте для процесів ETL? SSIS чи якийсь подібний інструмент? Якщо це інструмент поза SQL Server, чи запускаєте ви його на тому ж сервері, що і ваш екземпляр SQL Server?
Майк Фаль

1
Це хороший момент @Mike, якщо процес ETL не в змозі захопити достатньо пам’яті, щоб зробити свою справу, оскільки SQL Server використовує занадто багато, то, можливо, доведеться підштовхнути роботу до tempdb.
Аарон Бертран

1
Ось хороший запуск для моніторингу використання tempdb: msdn.microsoft.com/en-us/library/ms176029(v=SQL.105).aspx . Це має дати вам уявлення про те, що відбувається.
Томас Стрінгер

2
Ви зробили якийсь аналіз того, що насправді працює, коли ви TempDB насправді розширюєте? Простий sp_who2 / sp_whoisactive? Мені це здається, що у вас є кілька тривалих операцій, які можна було б краще керувати, але важко сказати. Особисто я б не приєднався до зміни пам’яті, але спочатку подивіться на код і побачите, чи працює це правильно.
Майк Фаль

Відповіді:


3

Дякую всім за допомогу.

Після розробки деяких планів виконання, виявляється, є JOIN, який обробляється по-різному, виходячи з кількості доступної оперативної пам’яті. При меншій кількості оперативної пам’яті він оцінює її за допомогою хешу; з більшою кількістю оперативної пам'яті, вона використовує ряд об'єднань.

В основному це зводилося до погано написаного T-SQL, який я зараз перетворюю.


4
Це досить протилежно інтуїтивно, оскільки хеш-з'єднання вимагає надання пам’яті, тоді як злиття - не. Чи є додаткова операція сортування для підтримки об'єднання злиття?
Мартін Сміт

1

Це не відповідь на питання, просто якийсь код, який я не хотів публікувати в коментарі. Щоб побачити баланс ваших планувальників і пам'яті в NUMA-вузлах (а також перевірити, чи якісь вузли не видно в Інтернеті):

SELECT 
  parent_node_id, 
  [status],
  AVG(current_tasks_count) AS avg_tasks_count, 
  AVG(load_factor) AS avg_load_factor,
  scheduler_count = COUNT(*)
FROM sys.dm_os_schedulers
GROUP BY parent_node_id, [status];

SELECT 
  memory_node_id, 
  name, 
  SUM(single_pages_kb + multi_pages_kb) AS memory_kb
FROM sys.dm_os_memory_clerks
GROUP BY memory_node_id, name;

(У SQL Server 2012 останнє SUMповинно бути, SUM(pages_kb)оскільки більше немає окремих одно- та багатосторінкових розподільників.)

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