Чи записи в TempDB завжди призводять до фактичного фізичного запису на диск, або TempDB записує кешування на SQL Server для затримки запису, як у кеші файлової системи Windows?
Вони завжди? Більшість точно не. Вони коли-небудь? Так, але не в результаті типового механізму. Посилання тут: Що робить контрольна точка для tempdb? .
У системі "добре поводиться" записи до файлу бази даних користувачів відбуваються на контрольній точці. У погано поведеній системі запис також виникатиме тоді, коли лінивий автор повинен видалити сторінки з буферного пулу, щоб звільнити місце для інших сторінок.
Контрольна точка робиться для tempdb лише тоді, коли файл журналу tempdb досягає 70% заповнення - це запобігає зростанню журналу tempdb, якщо це взагалі можливо (зауважте, що тривала транзакція все ще може по суті утримувати заручники журналу та запобігати його очищенню. , як і в базі даних користувачів).
Але не потрібно видаляти tempdb на диск, оскільки відновлення після збоїв ніколи не виконується на tempdb, воно завжди відтворюється під час запуску.
Tempdb не відновлюється в разі збоїв, і тому немає необхідності змушувати брудні сторінки tempdb на диск, за винятком випадків, коли процес lazywriter (частина буферного пулу) повинен створити місце для сторінок з інших баз даних.
Це надзвичайно (для мене це було несподіванкою) - єдиний механізм, за допомогою якого сторінки tempdb будуть записані на диск. Якщо тиск в буферному пулі є, сторінки tempdb можуть бути передані на диск. Якщо цього немає, воно не повинно відбуватися.
Редагувати: Суперечливо, чи "погано поводився" - це відповідний опис для бази даних користувачів, яка пише сторінки поза КПП. Незвичайне, нетипове чи, можливо, не ідеальне?
Додаткове редагування (наступні коментарі / чат з @PaulWhite):
Яскравий недолік вище, що тимчасові таблиці не є єдиним джерелом трафіку tempdb. Цитуючи інформацію про події хешу, сортування та обміну розливів :
Окремі операції виконання запитів SQL Server калібруються для найкращого використання, використовуючи (дещо) великий об'єм пам'яті як проміжне сховище. Оптимізатор запитів вибере план і оцінить вартість, виходячи з цих операторів, використовуючи цю подряпину пам'яті. Але це, звичайно, лише оцінка. При виконанні оцінки можуть виявитися неправильними, і план повинен продовжуватися, не маючи достатньої кількості пам'яті. У такому випадку ці оператори розливаються на диск.
Я неправильно припускав, що механізм фізичного запису для операції розливу був точно таким же, як описано раніше, тобто лінивець примушує сторінки tempdb до диска внаслідок тиску на пуфер буфера (викликаного розливом).
@PaulWhite пояснив, де я помилявся (дякую Пол!):
Я думаю, ви запитуєте, чому фізична активність tempdb виникає, коли запит перевищує грант пам’яті робочої області, а не просто використання tempdb в пам’яті. Якщо це було зроблено, запит використовував би більше пам’яті, ніж його грант, перемагаючи точку обмеження пам’яті. гранти в першу чергу.
Проливання справді є особливими в письмовій формі до зберігання. Фізична активність tempdb спостерігається на розливі, навіть перед обличчям вільної пам'яті та нульового тиску на tempdb.
Пол також вказав мені на свою публікацію в блозі Advanced TSQL Tuning: Why Internals Knowledge Matters, яка включає приклади скриптів для демонстрації розливів, для тих, хто хоче заглибитись глибше.