Kami memiliki database SQL Server 2005, temp database telah penuh. Dengan masuk ke SQL Server Management Studio saya bisa melihat semua tabel sementara di tempdb. Apakah mungkin untuk memberitahu sesi mana yang memegang tabel temp yang mana? Idealnya kueri yang akan mencantumkan tabel temp yang digunakan oleh setiap sesi.
Terima kasih,
sql-server
sql-server-2005
tempdb
SQLMIKE
sumber
sumber
Jawaban:
Saya meminta sesuatu untuk dibangun kembali pada tahun 2007, di Connect. Ini ditolak untuk rilis 2008, dan kemudian diabaikan, sampai Connect meninggal beberapa tahun yang lalu. Saya mencoba untuk menemukannya di situs umpan balik baru untuk SQL Server , tetapi pencarian itu adalah api tempat sampah mutlak. Judul permintaan saya adalah "dmv untuk memetakan tabel temp ke session_id" - karena pencarian hanya dapat melakukan ATAU, "peta temp table" mengembalikan 118 halaman hasil. Google tampaknya menyarankan item tersebut tidak memotong ketika mereka membunuh Connect .
Sementara itu, untuk SQL Server 2005 dan 2008, Anda harus dapat menarik informasi ini dari jejak default:
Tanpa malu-malu diangkat dari posting blog Jonathan Kehayias ini .
Untuk menentukan penggunaan ruang, Anda dapat lebih lanjut meningkatkannya untuk bergabung dalam data dari tampilan seperti
sys.db_db_partition_stats
- misalnya:Masalahnya di sini adalah mencoba menghubungkan nama tabel dengan teks kueri; ini tidak praktis, karena sebagian besar waktu, pengguna masih tidak menjalankan kueri terhadap tabel itu (apalagi masih menjalankan yang membuat / mengisi itu).
Namun, dan ini untuk pembaca lain (atau untuk Anda saat Anda meningkatkan), jejak default di 2012+ tidak lagi melacak pembuatan objek temp table , jika tabel #temp adalah heap. Tidak yakin apakah itu kebetulan atau terkait langsung dengan fakta bahwa mulai tahun 2012 semua tabel temp sekarang memiliki negatif
object_id
. Anda tentu saja dapat pindah ke Acara yang Diperpanjang untuk membantu Anda mengumpulkan dan melacak informasi ini, tetapi itu mungkin banyak pekerjaan manual (dan saya hanya memverifikasi bahwa ini tidak lagi dilacak dalam jejak - Anda mungkin tidak dapat mengambilnya di Extended Events juga). Jejak default akan mengambil tabel #temp yang dibuat dengan PK atau kendala lainnya, atau dengan kendala atau indeks ditambahkan setelah acara pembuatan, tetapi kemudian Anda harus melonggarkan pembatasan berbasis waktu di atas (indeks dapat dibuat lebih dari 100 ms setelah penciptaan).Beberapa jawaban lain di situs ini yang mungkin berguna:
Bagaimana cara mengidentifikasi kueri mana yang mengisi log transaksi tempdb?
Masalah dengan file mdf TempDB semakin meningkat
Temukan transaksi yang mengisi toko versi
Saya juga membuat blog tentang hal ini, dengan sesi Acara yang diperluas khusus untuk melacak informasi ini di SQL Server 2012 dan lebih tinggi:
Dan Paul White telah menulis blog tentang membaca halaman secara langsung (tidak hanya untuk orang yang lemah hati, juga tidak mudah untuk diotomatisasi dengan cara apa pun):
sumber
Inilah kueri yang akan membantu Anda memulai mencari informasi yang Anda cari:
Kueri ini menarik informasi berguna untuk 10 tugas teratas, seperti halaman yang dialokasikan / tidak dialokasikan, teks SQL tugas (jika tersedia), dll.
DMV ini penuh dengan informasi hebat, jadi jika Anda memerlukan lebih banyak data maka Anda dapat mencampur dan mencocokkan dengan apa yang Anda tarik. Tetapi ini harus menjadi titik awal untuk pemecahan masalah tugas-tugas konsumsi tempdb saat ini.
sumber
tempdb.sys.dm_db_partition_stats
. Sayangnya, Anda tidak dapat benar-benar mengetahui salinan#some_table_name
milik pengguna mana, juga Anda tidak selalu dapat menarik teks pernyataan yang merujuk tabel itu pada waktu tertentu - yang mungkin bukan kueri yang sedang dijalankan pengguna. Anda mungkin ingin melihat ini dan ini