Apakah menulis ke TempDB selalu menghasilkan tulis fisik yang sebenarnya ke disk, atau menulis TempDB di-cache oleh SQL Server untuk penulisan yang tertunda seperti di cache sistem file Windows?
Apakah mereka selalu Jelas tidak. Apakah mereka pernah melakukannya? Ya tapi tidak karena mekanisme tipikal. Referensi di sini adalah Apa yang dilakukan pemeriksaan untuk tempdb? .
Dalam sistem "berperilaku baik", menulis ke file database pengguna terjadi di pos pemeriksaan. Dalam sistem yang berperilaku buruk, penulisan juga akan terjadi ketika lazywriter perlu menyiram halaman dari kumpulan buffer untuk memberi ruang bagi halaman lain.
Sebuah pos pemeriksaan hanya dilakukan untuk tempdb ketika file log tempdb mencapai 70% penuh - ini adalah untuk mencegah berkembangnya tempdb log jika memungkinkan (perhatikan bahwa transaksi jangka panjang pada dasarnya masih dapat menahan sandera log dan mencegahnya membersihkan log , seperti dalam basis data pengguna).
Tetapi tidak perlu mem-flaps tempdb ke disk, karena pemulihan crash tidak pernah berjalan pada tempdb, itu selalu diciptakan kembali pada startup.
Tempdb tidak dipulihkan jika terjadi kerusakan, sehingga tidak perlu memaksa halaman tempdb kotor ke disk, kecuali dalam kasus di mana proses lazywriter (bagian dari buffer pool) harus membuat ruang untuk halaman dari database lain.
Ini luar biasa (itu mengejutkan saya) adalah satu-satunya mekanisme dimana halaman tempdb akan ditulis ke disk. Jika ada tekanan buffer pool, halaman tempdb dapat dialihkan ke disk. Jika tidak ada, seharusnya tidak terjadi.
Sunting: Dapat diperdebatkan apakah "berperilaku buruk" adalah deskripsi yang sesuai untuk database pengguna yang menulis halaman di luar pos pemeriksaan. Mungkin tidak biasa, atipikal, atau tidak ideal?
Suntingan tambahan (mengikuti komentar / obrolan dengan @PaulWhite):
Kelalaian mencolok di atas adalah bahwa tabel sementara bukan satu-satunya sumber lalu lintas tempdb. Mengutip dari Memahami Hash, Sortir, dan Tukar Acara Tumpahan :
Operasi eksekusi kueri SQL Server tertentu dikalibrasi untuk berkinerja terbaik dengan menggunakan (agak) sejumlah besar memori sebagai penyimpanan perantara. Pengoptimal Permintaan akan memilih paket dan memperkirakan biaya berdasarkan pada operator ini menggunakan memori awal ini. Tapi ini, tentu saja, hanya perkiraan. Pada pelaksanaan, estimasi dapat terbukti salah dan rencana harus dilanjutkan meskipun tidak memiliki memori yang cukup. Dalam kejadian seperti itu, operator ini tumpah ke disk.
Saya telah salah berasumsi bahwa mekanisme di balik penulisan fisik untuk operasi tumpahan persis sama seperti yang dijelaskan sebelumnya yaitu lazywriter yang memaksa halaman tempdb ke disk sebagai akibat dari tekanan pada buffer pool (disebabkan oleh tumpahan).
@PaulWhite menjelaskan di mana saya salah (terima kasih Paul!):
Saya pikir Anda bertanya mengapa aktivitas tempdb fisik terjadi ketika kueri melebihi hibah memori ruang kerjanya, daripada hanya menggunakan tempdb-in-memory. Jika melakukannya, kueri akan menggunakan lebih banyak memori daripada hibahnya, mengalahkan titik membatasi memori. hibah di tempat pertama.
Tumpahan memang istimewa secara tertulis hingga penyimpanan. Aktivitas tempdb fisik terlihat pada tumpahan, bahkan dalam menghadapi jumlah besar memori bebas dan tekanan nol pada tempdb.
Paul juga menunjuk saya ke posting blognya Advanced TSQL Tuning: Mengapa Internal Pengetahuan Penting yang mencakup contoh skrip untuk menunjukkan tumpahan, bagi mereka yang ingin menggali lebih dalam.