Ada banyak hal yang terjadi di sini, dan sebagian besar sangat luas dan tidak jelas.
2008R2 RTM keluar pada 21 April 2010. Ini benar-benar di luar dukungan. Anda akan ingin memprioritaskan mendapatkan Paket Layanan terbaru, yang keluar sekitar 3 tahun yang lalu. Dengan begitu Anda akan dilindungi jika Anda menabrak bug aneh atau sesuatu. Buka di sini untuk mencari tahu apa yang perlu Anda unduh.
Karena Anda menambahkan vCPU (dari 1 ke 4) dan tidak mengubah pengaturan apa pun, kueri Anda sekarang dapat berjalan paralel. Saya tahu ini terdengar seperti mereka semua akan lebih cepat, tapi tunggu dulu!
Anda mungkin telah menambahkan RAM, tetapi Anda mungkin belum mengubah Memori Server Maks sehingga server Anda dapat memanfaatkannya.
Cari tahu apa yang menunggu server Anda. Proyek open source yang saya kerjakan menyediakan skrip gratis untuk membantu Anda mengukur SQL Server Anda. Kepala di sini jika Anda ingin mencoba mereka.
Anda akan ingin mengambil sp_BlitzFirst untuk memeriksa statistik tunggu server Anda. Anda dapat menjalankannya dengan beberapa cara.
Ini akan menunjukkan kepada Anda apa yang server Anda sudah tunggu sejak dimulai.
EXEC dbo.sp_BlitzFirst @SinceStartup = 1;
Ini akan menunjukkan kepada Anda pertanyaan apa yang sedang menunggu sekarang, selama jendela 30 detik.
EXEC dbo.sp_BlitzFirst @Seconds = 30, @ExpertMode = 1;
Setelah Anda mengetahui pertanyaan apa yang menunggu (ada banyak hal yang ditulis tentang statistik menunggu di luar sana), Anda dapat mulai membuat perubahan untuk mengendalikan keadaan.
Jika Anda melihat mereka menunggu CXPACKET
, itu berarti pertanyaan Anda berjalan paralel, dan mungkin saling menginjak. Jika Anda menekan ini, Anda mungkin ingin mempertimbangkan untuk menabrak Ambang Batas Biaya untuk Paralelisme hingga 50, dan mungkin menurunkan MAXDOP menjadi 2.
Setelah langkah ini adalah ketika Anda ingin menggunakan sesuatu seperti sp_WhoIsActive atau sp_BlitzWho (yang terakhir ada di repo GitHub dari sebelumnya) untuk mulai mengambil rencana kueri. Selain dari statistik menunggu, mereka adalah salah satu hal paling penting yang dapat Anda lihat untuk mencari tahu apa yang salah.
Anda mungkin juga ingin memeriksa artikel ini oleh Jonathan Kehayias tentang Penghitung VMWare untuk memeriksa sehubungan dengan SQL Server.
Memperbarui
Meninjau statistik tunggu dan bocah itu aneh. Pasti ada sesuatu dengan CPU. Server Anda kebanyakan duduk bosan, tetapi ketika segalanya memanas, segalanya menjadi buruk. Saya akan mencoba memecah ini dengan mudah.
Anda memukul menunggu racun disebut THREADPOOL
. Anda tidak memiliki banyak, tetapi itu masuk akal karena server Anda tidak terlalu aktif. Saya akan menjelaskan mengapa sebentar lagi.
Anda memiliki rata-rata lama menunggu SOS_SCHEDULER_YIELD
dan CXPACKET
. Anda menggunakan VM, jadi Anda ingin memastikan bahwa SQL Server memiliki reservasi, atau bahwa kotak itu tidak terlalu langganan. Tetangga yang berisik benar-benar dapat merusak hari Anda di sini. Anda juga akan ingin memastikan bahwa server / VM guest / VM host tidak berjalan dalam mode Balanced Power. Ini membuat CPU Anda berputar ke kecepatan rendah yang tidak perlu, dan mereka tidak segera kembali ke kecepatan penuh.
Bagaimana mereka mengikat? Dengan 4 CPU Anda memiliki 512 utas pekerja. Perlu diingat, Anda memiliki jumlah yang sama dengan satu CPU, tetapi sekarang setelah kueri Anda bisa paralel, mereka dapat mengkonsumsi lebih banyak utas pekerja. Dalam kasus Anda 4 utas per cabang paralel dari permintaan paralel.
Apa yang terjadi paralel? Kemungkinan besar semuanya. Ambang Batas Biaya default untuk Paralelisme adalah 5. Angka itu dijadikan default pada akhir 90-an yang bekerja pada desktop yang terlihat seperti ini .
Memang, perangkat keras Anda lebih kecil dari kebanyakan laptop, tetapi Anda masih sedikit di depan hal itu.
Ketika banyak pertanyaan paralel berjalan, Anda kehabisan utas pekerja tersebut. Ketika itu terjadi, pertanyaan hanya duduk menunggu thread untuk pergi. Di situlah juga SOS_SCHEDULER_YIELD
masuk. Kueri sedang melangkah keluar dari CPU dan tidak kembali untuk waktu yang lama. Saya tidak melihat menunggu pemblokiran, jadi Anda kemungkinan besar hanya semua diisi pada paralelisme intra-query menunggu.
Apa yang bisa kau lakukan?
- Pastikan tidak ada dalam mode Daya Seimbang
- Ubah MAXDOP ke 2
- Ubah ambang biaya untuk paralelisme menjadi 50
- Ikuti artikel Jon K. di atas untuk memvalidasi kesehatan VM
- Gunakan skrip yang dipanggil
sp_BlitzIndex
untuk mencari permintaan indeks yang hilang.
Untuk pemecahan masalah yang lebih menyeluruh, lihat whitepaper yang saya tulis untuk Google tentang ukuran perangkat keras di cloud.
Semoga ini membantu!