Pertengkaran TempDB

14

Kami memiliki database OLTP 40GB aktif di SQL Server 2014 SP1. Kueri ditemukan lambat dengan IO_Completion menunggu, Panjang Antrian Disk naik menjadi 900, dan SQL Server berhenti merespons. Apa yang kami coba:

  1. Mulai ulang contoh dan dengan dalam satu menit itu mulai berlaku dengan cara yang sama.

  2. Setelah restart kedua, kami mengubah ukuran awal setiap tempfb datafile (ada 16 file data yang dibuat) dan mulai berfungsi dengan benar.

Catatan: Kami menggunakan variabel tabel untuk set hasil menengah. Set hasil ini sangat kecil.

Itu terjadi dua kali dalam sebulan. Setiap kali saya menambahkan sedikit ruang secara manual ke file data, maka itu mulai bekerja secara normal. Yang lebih menarik adalah bahwa pengaturan yang sama (perangkat keras yang sama, pengaturan folder dan file yang sama, beban kerja yang sama) yang kita miliki di SQL Server 2008 R2 dan dan SQL Server 2012 bekerja dengan baik.

Mohon bantu kami untuk menemukan solusi permanen.

Ukuran awal semua file data adalah 1000MB yang sama, saat ini masing-masing 1500MB. Semuanya identik. Autogrowth masing-masing 100MB. Sebelum ini kami menghadapi pertentangan halaman PFS dan GAM dan kami bertambah menjadi 16 dan masalah teratasi. Kedua tanda jejak 1117 & 1118 diaktifkan. 24 core pada 2 NUMA node. Semua datafile berada pada volume yang sama. Disk sederhana, tidak ada SAN.

Mesin virtual ada di mesin fisik. Kueri dengan Tabel Variabel dan kueri dengan Hash Joins paling umum menghasilkan menunggu IO_Completion.


Jawaban terperinci oleh wBob mendorong kami untuk mencari lebih detail. Bagaimana kami melewatkannya sebelumnya:

Autogrow file 'templog' dalam database 'tempdb' dibatalkan oleh pengguna atau habis waktu setelah 7704 milidetik. Gunakan ALTER DATABASE untuk menetapkan nilai FILEGROWTH yang lebih kecil untuk file ini atau untuk secara eksplisit mengatur ukuran file baru.

Ini kami temukan di log ketika jenis masalah ini terjadi. Kami sedang memindahkan TempDB untuk memisahkan drive cepat.

aasim.abdullah
sumber

Jawaban:

6

Saya pikir Anda telah melakukan overfragmented tempdb Anda dan ada ketidakcocokan antara server CPU dan pengaturan disk, tetapi mari kita kumpulkan beberapa informasi lebih lanjut:

Pertanyaan / Informasi lebih lanjut diperlukan

  • Harap konfirmasi nama dan jenis prosesor (pada dasarnya saya mencoba menentukan apakah prosesor 2 x hex-core dengan HT). Gunakan informasi Sistem (mis. Panel Kontrol> Sistem dan Keamanan> Sistem pada Windows Server 2012 R2) dan / atau alat sistem CoreInfo untuk mengonfirmasi.
  • Harap konfirmasi server maxdop (mis EXEC sp_configure 'max degree of parallelism'.). Jika CPU hex-core, server maxdop harus paling banyak 6 (seperti di sini ), atau bisa dibilang lebih rendah pada sistem OLTP. Saya biasanya menyimpan file tempdb saya sesuai dengan DOP server saya hingga maksimal 8 tetapi kami akan membahasnya.
  • Harap konfirmasi total memori server pada kotak dan tutup memori SQL Server (mis EXEC sp_configure 'max server memory (MB)'.).
  • Harap konfirmasi jika ada layanan lain yang berjalan pada kotak (mis. SSIS, SSAS, SSRS, aplikasi, iTunes dll)
  • Harap konfirmasi Inisialisasi File Instan diaktifkan untuk akun layanan SQL Server. (Cara mengujinya di sini ).
  • Mengapa ada perbedaan besar antara CPU (setup NUMA 2 node berdaging) verus satu disk (PC rumah)? Pertimbangkan untuk menambahkan disk, striping, SSD untuk tempdb (walaupun menghindari reaksi berlebihan:) .
  • Harap tambahkan rencana eksekusi aktual untuk salah satu kueri masalah. Anonim dengan SQL Sentry Plan Explorer jika diinginkan.
  • Hash bergabung dengan variabel tabel dalam sistem OLTP? Ini menunjukkan kurangnya pengindeksan pada variabel tabel, tabel utama atau keduanya. Apakah Anda mendeklarasikan variabel tabel Anda seperti ini (tanpa indeks)?

    DECLARE @t TABLE ( x INT )
  • Jangan berhemat pada definisi variabel tabel meskipun itu memegang hasil yang kecil. Itu selalu yang terbaik untuk memberikan pengoptimal sebanyak mungkin informasi sehingga eksplisit dengan nullability, keunikan, apakah indeks berkerumun atau tidak berkerumun, misalnya

    DECLARE @t TABLE ( x INT PRIMARY KEY )
    DECLARE @u TABLE ( x INT PRIMARY KEY NONCLUSTERED, u INT NOT NULL UNIQUE CLUSTERED, z INT NOT NULL UNIQUE, a CHAR(1) NULL ) -- not sure why you would do this but you can
    DECLARE @v TABLE ( x INT NOT NULL, y INT NOT NULL, PRIMARY KEY ( x, y ) )   -- multi-column primary key
  • Posting rencana eksekusi akan membantu mendiagnosis hal ini.

  • Periksa kode yang mencegah caching variabel tabel seperti di sini , di sini . Saya pikir SQL dinamis dan proc dieksekusi DENGAN RECOMPILE adalah satu-satunya yang mempengaruhi variabel tabel.

    DECLARE @u TABLE ( x INT )
    
    INSERT @u
    EXEC('DECLARE @t TABLE ( x INT ); INSERT INTO @t VALUES ( 1 ); SELECT x FROM @t;' )
    
    SELECT *
    FROM @u
  • Periksa SQL Server Log (Obyek Explorer> Manajemen> Log SQL Server) untuk pesan, misalnya peringatan IO.

  • Periksa Windows Event Viewer
  • Ada beberapa build yang dirilis sejak SP1. Tinjau perbaikan CU yang dimasukkan sejak SP1 . Mungkin saja ada bug di SP1 yang diperbaiki pada CU berikutnya, misalnya FIX: Urutkan operator yang menumpahkan ke tempdb di SQL Server 2012 atau SQL Server 2014 ketika perkiraan jumlah baris dan ukuran baris sudah benar https://support.microsoft.com/en- us / kb / 3088480
  • Menetapkan ini adalah penyebab Anda sebelum menerapkan hotfix apa pun, meskipun lebih penting untuk tetap mendapatkan informasi terbaru dengan CU dengan SQL Server 2014, karena banyaknya fitur baru (dalam memori OLTP, toko kolom berkerumun).
  • Akhirnya, kebutuhan akan satu file tempdb per core adalah mitos dan melihat setup disk Anda, dugaan saya tempdb terlalu terfragmentasi. Saya punya perasaan mengganggu Anda memiliki satu disk-head, tempdb memiliki satu filegroup, banyak file.

Namun lupakan apa yang kita pikir kita tahu; buat rig uji yang mereproduksi masalah Anda, dan bereksperimen dengan mengurangi jumlah file temp ... mulai dari 1, 2, 4, 6 dll mengumpulkan informasi, untuk membuat keputusan berdasarkan bukti. Sekarang ini adalah bagian yang lebih sulit karena masalah Anda tampaknya terputus-putus dan Anda mungkin tidak dapat mengacaukan pengaturan tempdb Anda, tetapi itulah cara saya akan mendekati ini.

Semoga berhasil. Beri tahu kami bagaimana caranya.

wBob
sumber
2
Terima kasih banyak, jawaban detail Anda mendorong kami untuk mencari lebih detail. Bagaimana kami melewatkannya sebelum "Autogrow file 'templog' dalam database 'tempdb' dibatalkan oleh pengguna atau habis waktu setelah 7704 milidetik. Gunakan ALTER DATABASE untuk menetapkan nilai FILEGROWTH yang lebih kecil untuk file ini atau untuk secara eksplisit mengatur ukuran file baru. " Ini kami temukan di log ketika jenis masalah ini terjadi. Kami sedang memindahkan TempDB untuk memisahkan drive cepat.
aasim.abdullah
2
Baru-baru ini kami menemukan bahwa, TempDB masih di bawah tekanan dan ini terjadi karena kami menggunakan "Contains Table" dan SQL Server membuat Hash Join pada setiap eksekusi. Pada dasarnya bug di SQL Server 2014. Diperbaiki dengan menggunakan CU terbaru dan masalah teratasi. support.microsoft.com/en-us/kb/2999809
aasim.abdullah