Mengapa kueri SQL Server tidak menggunakan disk I / O lebih dari 7MB / detik

11

Saya memiliki SSD yang, menggunakan tes IOmeter, menunjukkan kinerja lebih dari 200MB / s. Namun ketika saya menjalankan kueri SQL apa pun dari mesin lokal, monitor sumber daya windows tidak pernah menampilkan disk IO di atas 7MB / detik. Ini berlaku bahkan untuk kueri yang membutuhkan waktu lebih dari 2 menit untuk dijalankan. Apa yang bisa menjadi hambatannya yaitu hanya menggunakan 7MB / detik dari SSD?

Saya sedang berlari:

  • Windows Server 2012 Standard
  • SQL server 2008 r2
  • Intel i7 3820
  • 32GB ram
  • SSD sandisk
Dean MacGregor
sumber
2
mungkin data sudah dalam RAM dan tidak ada akses disk diperlukan?
gbn
1
@DeanMacGregor - Bagaimana Anda mengonsumsi hasilnya? Jika di SSMS bagaimana jika Anda mencoba opsi untuk membuang hasilnya. Apakah itu mengubah sesuatu? Anda juga dapat mencoba melihat sys.dm_os_waiting_taskssementara kueri berjalan untuk melihat apakah ada jenis menunggu lain yang dihadapi.
Martin Smith
1
Apakah 200 MB / s untuk pembacaan akses acak (pembacaan acak untuk 4 blok KB)? Saya kira inilah yang biasanya dilakukan oleh basis data. Apakah kueri menulis ke disk (file sementara, set hasil sementara atau tabel)?
2
@DeanMacGregor - Jadi untuk mengeluarkannya dari persamaan, Anda dapat menetapkan hasilnya ke variabel skalar (contoh kueri). DECLARE @Name VARCHAR(10), @High int; SELECT @Name=name, @High = high FROM master..spt_values. Jadi tidak ada hasil yang dikirim kembali ke klien tetapi rencana dan IO masih akan sama.
Martin Smith
4
Misalkan Anda menafsirkan ASYNC_NETWORK_IO menunggu untuk berarti bahwa masalahnya terkait dengan jaringan? (Biasanya) tidak. Kemungkinan besar seperti @MartinSmith telah menyarankan (dua kali) bahwa SSMS atau aplikasi yang Anda gunakan tidak mengkonsumsi hasil secepat SQL melayani mereka. Ikuti salah satu cara yang disarankan untuk menghilangkan konsumsi baris dan Anda akan mendapatkan gambar (r) sebenarnya dari throughput IO maksimum.
Mark Storey-Smith

Jawaban:

7

Dari rantai komentar, sepertinya Anda mengartikan ASYNC_NETWORK_IOmenunggu untuk berarti bahwa masalahnya terkait dengan jaringan. (Biasanya) tidak.

Seperti @MartinSmith mengisyaratkan (dua kali) penjelasan yang paling mungkin untuk itu adalah SSMS atau aplikasi yang Anda gunakan tidak mengkonsumsi hasil secepat SQL Server melayani mereka. Ikuti salah satu metode yang disarankan untuk menghapus konsumsi baris dari pengukuran Anda dan Anda akan mendapatkan gambar (r) sebenarnya dari throughput IO maksimum:

Jika Anda belum melakukannya, Anda harus DBCC DROPCLEANBUFFERSmemastikan bahwa data benar-benar dibaca dari disk daripada buffer cache. Peringatan biasa "saat tes saja, jangan lakukan ini di lingkungan aktif yang aktif" dll berlaku.

Menghormati beberapa komentar Anda yang lain:

Saat menjalankan kueri yang mengembalikan 9 juta baris penggunaan CPU akan tetap sekitar 13% dengan 9% disebabkan oleh sqlserver ... bukankah mengembalikan hasil lebih cepat dari 3 menit jika semua data dalam RAM?

Apa sebenarnya yang kami uji di sini, bagaimana dan mengapa? Jika permintaan 9 juta baris Anda adalah selain dari SELECT * FROM dbo.SomeTablemaka ada 1001 faktor yang ikut dimainkan, selain hanya throughput IO mentah.

Anda Intel i7-3820 adalah prosesor 4-core. Jika kueri pengujian Anda tidak menghasilkan rencana paralel, saya akan terkejut jika Anda dapat menggunakan lebih dari 20% pemanfaatan CPU dari sistem.

3 menit untuk mengembalikan 9 juta baris sangat mencurigakan dan menyarankan kami tidak mendapatkan gambaran lengkap tentang pengujian Anda. Dugaan saya adalah ini adalah kasus rencana kueri sub-optimal (non-paralel), diisi penuh dengan loop operator menarik jutaan baris yaitu bukan hanya satu tabel SELECTuntuk memverifikasi konsumsi IO.

Saya menyarankan:

  1. SELECT *untuk menguji hanya IO melalui SQL Server.
  2. Pertanyaan baru dengan rencana eksekusi permintaan Anda jika Anda ingin menggali mengapa itu tidak memenuhi IO.
Mark Storey-Smith
sumber
Sebenarnya itu hanya pilih * dari dbo.sometable. Maaf saya tidak menyebutkan itu lebih cepat; yang saya maksudkan adalah saya bisa menjalankan kueri itu dari tabel mana saja. Asal usul pertanyaan saya adalah bahwa saya perhatikan IO disk saya jauh lebih sedikit daripada yang saya harapkan bahkan dari kueri "beri saya banyak data" sederhana. Perhatian utama saya adalah jika disk IO sangat rendah, kinerja dapat ditingkatkan jika akar penyebab disk IO rendah di-root.
Dean MacGregor