Kami memiliki database untuk produk yang berat-menulis. Kami baru saja membeli mesin server baru dengan SSD untuk membantu. Yang mengejutkan kami, pemasangannya tidak lebih cepat dari pada mesin lama kami dengan penyimpanan yang jauh lebih lambat. Selama benchmarking kami perhatikan bahwa tingkat IO yang ditunjukkan oleh proses SQL Server sangat rendah.
Misalnya, saya menjalankan skrip yang ditemukan di halaman ini , kecuali bahwa saya menambahkan BEGIN TRAN dan COMMIT di sekitar loop. Paling-paling saya bisa melihat penggunaan disk mencapai 7Mb / s, sementara CPU hampir tidak menyentuh 5%. Server telah menginstal 64Gb dan menggunakan 10. Waktu menjalankan total adalah 2 menit 15 detik untuk panggilan pertama turun menjadi sekitar 1 menit untuk panggilan berikutnya. Basis data sedang dalam pemulihan sederhana dan tidak digunakan selama pengujian. Saya menjatuhkan meja di antara setiap panggilan.
Mengapa skrip sederhana ini begitu lambat? Perangkat kerasnya hampir tidak digunakan sama sekali. Kedua alat pembandingan disk khusus dan SQLIO menunjukkan bahwa SSD berkinerja dengan benar dengan kecepatan hingga 500Mb / dtk untuk membaca dan menulis. Saya mengerti bahwa menulis acak lebih lambat dari menulis berurutan, tapi saya berharap insert sederhana seperti ini, ke tabel tanpa pengindeksan berkelompok, menjadi jauh lebih cepat.
Pada akhirnya skenario kami jauh lebih kompleks, tetapi saya merasa perlu memahami kasus sederhana terlebih dahulu. Singkatnya aplikasi kita menghapus data lama, kemudian menggunakan SqlBulkCopy untuk menyalin data baru ke staging tables, melakukan beberapa penyaringan, dan akhirnya menggunakan MERGE dan / atau INSERT INTO tergantung pada kasus untuk menyalin data ke tabel akhir.
-> EDIT 1: Saya mengikuti prosedur yang ditautkan oleh Martin Smith, dan saya mendapatkan hasil sebagai berikut:
[Wait Type] [Wait Count] [Total Wait (ms)] [T. Resource Wait (ms)] [T. Signal Wait (ms)]
NETWORK_IO 5008 46735 46587 148
LOGBUFFER 901 5994 5977 17
PAGELATCH_UP 40 866 865 1
SOS_SCHEDULER_YIELD 53279 219 121 98
WRITELOG 5 145 145 0
PAGEIOLATCH_UP 4 58 58 0
LATCH_SH 5 0 0 0
Saya merasa aneh NETWORK_IO mengambil sebagian besar waktu, mengingat tidak ada hasil untuk ditampilkan dan tidak ada data untuk ditransfer di mana pun selain ke file SQL. Apakah tipe NETWORK_IO mencakup semua IO?
-> EDIT 2: Saya membuat disk RAM 20Gb dan memasang basis data dari sana. Waktu terbaik yang saya miliki di SSD adalah 48 detik, dengan disk RAM turun menjadi 37 detik. NETWORK_IO masih menunggu terbesar. Kecepatan tulis maksimum ke disk RAM adalah sekitar 250Mb / s sementara itu mampu melakukan multi gigabytes per detik. Masih tidak menggunakan banyak CPU, jadi apa yang menahan SQL?
NETWORK_IO
mungkin dari 3 juta "1 baris (s) terpengaruh" pesan-pesan yang dikirim kembali. Apakah Anda mencoba menambahkan SET NOCOUNT ON
ke skrip?
EE_WaitStats*.xel
sehingga yang lama akan mencemari hasil Anda.
SET NOCOUNT ON
juga.