Kami memiliki proses yang menghasilkan laporan inventaris. Di sisi klien, proses memisahkan sejumlah utas pekerja yang dapat dikonfigurasi untuk membangun sepotong data untuk laporan yang sesuai dengan satu penyimpanan dari banyak (berpotensi ribuan, biasanya lusinan). Setiap utas pekerja memanggil layanan web yang menjalankan prosedur tersimpan.
Proses basis data untuk memproses setiap chunk mengumpulkan banyak data ke dalam tabel #T Temporary. Pada akhir setiap potongan pemrosesan, data ditulis ke tabel permanen di tempdb. Akhirnya, pada akhir proses, satu utas di sisi klien meminta semua data dari tabel tempdb permanen.
Semakin banyak pengguna yang menjalankan laporan ini, semakin lambat hasilnya. Saya menganalisis aktivitas dalam database. Pada satu titik, saya melihat 35 permintaan terpisah semua diblokir pada satu titik dalam proses. Semua SPID ini memiliki urutan 50 ms menunggu jenis LATCH_EX
sumber daya METADATA_SEQUENCE_GENERATOR (00000010E13CA1A8)
. Satu SPID memiliki sumber ini, dan yang lainnya memblokir. Saya tidak menemukan apa pun tentang sumber daya tunggu ini di pencarian web.
Tabel di tempdb yang kami gunakan memang memiliki IDENTITY(1,1)
kolom. Apakah SPID ini menunggu kolom IDENTITAS? Metode apa yang bisa kita gunakan untuk mengurangi atau menghilangkan pemblokiran?
Server adalah bagian dari sebuah cluster. Server menjalankan 64-bit SQL Server 2012 Standard Edition SP1 pada 64-bit Windows 2008 R2 Enterprise. Server memiliki 64 GB RAM dan 48 prosesor, tetapi database hanya dapat menggunakan 16 karena ini adalah edisi standar.
(Perhatikan bahwa saya tidak senang dengan desain menggunakan tabel permanen di tempdb untuk menampung semua data ini. Mengubah itu akan menjadi tantangan teknis dan politik yang menarik, tapi saya terbuka untuk saran.)
PEMBARUAN 4/23/2013
Kami telah membuka kasing dukungan dengan Microsoft. Saya akan terus memperbarui pertanyaan ini saat kami mempelajari lebih lanjut.
UPDATE 5/10/2013
Insinyur dukungan SQL Server setuju bahwa menunggu disebabkan oleh kolom IDENTITAS. Menghapus IDENTITAS menghilangkan menunggu. Kami tidak dapat menduplikasi masalah pada SQL 2008 R2; itu terjadi hanya pada SQL 2012.