Lingkungan:
Kami memiliki dua mesin Windows Server 2003 R2 32-bit yang menjalankan SQL Server 2005. Konfigurasi perangkat keras adalah server yang identik dengan CPU Xeon 5160, RAM 4GB, dan 13GB RAID0. Bendera AWE dan / 3GB tidak diaktifkan.
Server-server diatur berdampingan menggunakan daftar periksa instalasi yang telah ditentukan, dan SEMUA perangkat lunak yang diinstal sama di kedua mesin.
Setiap pengaturan instalasi SQL server dan tingkat tambalan yang kita ketahui untuk diperiksa identik. Salah satu perbedaannya adalah bahwa TEMPDB adalah 400MB pada mesin cepat, dan 1.2GB pada mesin lambat. Namun, dalam kedua kasus, kami tidak melihat alokasi TEMPDB terjadi.
Masalah:
Ada prosedur tersimpan yang berjalan dalam 2 detik pada satu, tetapi 15 menit pada yang lain. Selama 15 menit tambahan, ada sedikit atau tidak ada aktivitas disk, tidak ada perubahan penggunaan memori, tetapi satu inti CPU disematkan pada 100% sepanjang waktu.
Perilaku ini tetap ada bahkan ketika database didukung dari satu dan dikembalikan ke yang lain.
Karena ini adalah prosedur tersimpan, monitor aktivitas dan profiler tidak menunjukkan kepada kami detail tentang di mana dalam prosedur tersimpan, aktivitas CPU tinggi ini terjadi.
Pertanyaan:
Apa lagi yang harus kita perhatikan?
Mengikuti:
Kelambatan terjadi dalam pernyataan FETCH BERIKUTNYA untuk definisi kursor berikut:
DECLARE C CURSOR FOR
SELECT X, Y
FROM dbo.A
WHERE X NOT IN (SELECT X FROM dbo.B)
AND Z <=0
...
<snip>
...
FETCH NEXT FROM C INTO @X, @Y
FETCH NEXT FROM C INTO @X, @Y
...
Setiap pernyataan FETCH - di atas meja yang hanya berisi sekitar 1000 baris - membutuhkan sekitar 7,25 menit. (Tidak, saya tidak tahu mengapa ia melakukan dua berturut-turut, perlu bertanya kepada pengembang, tetapi itu berjalan dengan benar di kedua server).
Saya sedikit curiga dengan "TIDAK DI (PILIH ...)", karena sepertinya Baca Virtual benar-benar tinggi.