Saya ingin tahu cara mengidentifikasi permintaan yang tepat atau simpanan tersimpan yang sebenarnya mengisi log transaksional dari basis data TEMPDB.
65
Saya ingin tahu cara mengidentifikasi permintaan yang tepat atau simpanan tersimpan yang sebenarnya mengisi log transaksional dari basis data TEMPDB.
Jawaban:
Dari http://www.sqlservercentral.com/scripts/tempdb/72007/
SUNTING
Seperti yang ditunjukkan Martin dalam komentar, ini tidak akan menemukan transaksi aktif yang menempati ruang di tempdb, itu hanya akan menemukan permintaan aktif yang saat ini menggunakan ruang di sana (dan kemungkinan penyebab untuk penggunaan log saat ini). Jadi mungkin ada transaksi terbuka tetapi permintaan sebenarnya yang menyebabkan masalah tidak lagi berjalan.
Anda bisa mengubah
inner join
padasys.dm_exec_requests
keleft outer join
, maka Anda akan kembali baris untuk sesi yang saat ini tidak aktif menjalankan query.Permintaan Martin diposting ...
... akan mengidentifikasi
session_id
dengan transaksi aktif yang menempati ruang log, tetapi Anda tidak akan selalu dapat menentukan permintaan aktual yang menyebabkan masalah, karena jika itu tidak berjalan sekarang tidak akan ditangkap dalam permintaan di atas untuk permintaan aktif. Anda mungkin dapat memeriksa secara reaktif kueri terkini menggunakanDBCC INPUTBUFFER
tetapi itu mungkin tidak memberi tahu Anda apa yang ingin Anda dengar. Anda dapat bergabung dengan luar dengan cara yang sama untuk menangkap mereka yang aktif berjalan, misalnya:Anda juga dapat menggunakan DMV
sys.dm_db_session_space_usage
untuk melihat pemanfaatan ruang secara keseluruhan berdasarkan sesi (tetapi sekali lagi Anda mungkin tidak mendapatkan kembali hasil yang valid untuk kueri; jika kueri tidak aktif, apa yang Anda dapatkan mungkin bukan penyebab sebenarnya).Dengan semua pertanyaan ini yang Anda inginkan, Anda harus dapat mempersempit siapa yang menggunakan tempdb dan bagaimana, terutama jika Anda menangkapnya saat beraksi.
beberapa tips untuk meminimalkan pemanfaatan tempdb
SORT_IN_TEMPDB
opsi jika tidak diperlukanAnda juga dapat mempertimbangkan bahwa penggunaan log tempdb Anda mungkin disebabkan oleh proses internal yang Anda sedikit atau tidak memiliki kontrol atas - misalnya surat basis data, pemberitahuan acara, pemberitahuan permintaan dan broker layanan semua menggunakan tempdb dalam beberapa cara. Anda dapat berhenti menggunakan fitur-fitur ini, tetapi jika Anda menggunakannya, Anda tidak dapat menentukan bagaimana dan kapan mereka menggunakan tempdb.
sumber
session_id
muncul dengan permintaan berikutSELECT database_transaction_log_bytes_reserved,session_id FROM sys.dm_tran_database_transactions tdt JOIN sys.dm_tran_session_transactions tst ON tdt.transaction_id = tst.transaction_id WHERE database_id = 2
. Permintaan yang saya harapkan akan ditemukan adalah setelah menjalankan yang berikutBEGIN TRAN CREATE TABLE #T(X CHAR(8000)) INSERT INTO #T SELECT name FROM sys.objects
@@SPID
adalah<>
tidak=
.dm_db_task_space_usage
laporan0
untuk spid dengan transaksi terbuka untuk semua kolom untuk saya. Bertanya-tanya apakah Anda perlu menanyakannya ketika permintaan benar-benar mengeksekusi daripada menganggur dengan transaksi terbuka.https://social.msdn.microsoft.com/Forums/sqlserver/en-US/17d9f862-b9ae-42de-ada0-4229f56712dc/tempdb-log-filling-cannot-find-how-or-what?forum=sqldatabaseengine
sumber
Terima kasih untuk posting ini, mungkin satu-satunya dari jenisnya. Pengujian saya sederhana, buat tabel temp dan pastikan itu muncul ketika saya menjalankan salah satu pertanyaan dari posting ini ... hanya satu atau dua yang benar-benar berhasil. Saya memperbaikinya untuk bergabung dengan T-SQL, dioptimalkan untuk berjalan lebih lama dan membuatnya sangat berguna. Beri tahu saya jika saya melewatkan sesuatu tetapi sejauh ini Anda mendapatkan skrip otomatis / berulang. Ini memberikan cara menilai kueri / SPID mana yang merupakan pelaku selama periode waktu tertentu dengan menggunakan kueri deviasi standar (STDEV) di bawah ini.
Ini berjalan setiap 3 menit selama 40 kali, jadi 2 jam. Ubah parameter sesuai keinginan Anda.
Ada WHERE> 50 halaman filter di bawah ini yang orang mungkin ingin menghapus kalau-kalau Anda memiliki banyak tabel kecil. Kalau tidak, Anda tidak akan menangkap nuansa itu dengan ...
Nikmati!
sumber
Sayangnya log tempDB tidak dapat dilacak langsung ke sessionID dengan melihat proses yang sedang berjalan.
Kecilkan file log tempDB ke titik di mana ia akan tumbuh secara signifikan lagi. Kemudian buat acara diperpanjang untuk menangkap pertumbuhan log. Setelah itu tumbuh lagi Anda dapat memperluas acara yang diperluas dan melihat file paket acara. Buka file, tambahkan filter waktu, filter tipe file (Anda tidak ingin hasil file data dimasukkan), dan kemudian kelompokkan dengan id sesi di SSMS. Ini akan membantu Anda menemukan pelakunya saat Anda mencari id sesi dengan kelompok terbanyak oleh. Tentu saja Anda perlu mengumpulkan apa yang sedang berjalan di sesi id melalui proses atau alat lain. Mungkin seseorang tahu cara mendapatkan kueri dari kolom query_hash dan akan berbaik hati untuk mengirim solusinya.
Hasil acara diperpanjang:
Script untuk membuat acara yang diperluas:
sumber