Ketika terhubung ke server produksi kami (SQL Server 2008, mesin yang sangat kuat), pernyataan SELECT ini membutuhkan waktu 2 detik , meludahkan kembali semua bidang (total data 4 MB).
SELECT TOP (30000) *
FROM person
WITH(NOLOCK);
Dari kotak lain di jaringan yang sama (menghubungkan menggunakan otentikasi SQL atau Windows Authentication), permintaan yang sama membutuhkan waktu 1 menit, 8 detik .
Saya menguji dengan pernyataan yang sangat sederhana ini untuk menggambarkan bahwa itu bukan masalah pengindeksan atau masalah terkait permintaan. (Kami memiliki masalah kinerja dengan semua permintaan saat ini ...)
Baris datang dalam potongan, dan tidak sekaligus. Saya mendapatkan baris pertama saya secara instan, dan kemudian menunggu lebih dari 1 menit untuk kumpulan baris masuk.
Berikut adalah Statistik Klien dari kueri, ketika dijalankan dari kotak jauh:
Query Profile Statistics
Number of INSERT, DELETE and UPDATE statements 0
Rows affected by INSERT, DELETE, or UPDATE statements 0
Number of SELECT statements 2
Rows returned by SELECT statements 30001
Number of transactions 0
Network Statistics
Number of server roundtrips 3
TDS packets sent from client 3
TDS packets received from server 1216
Bytes sent from client 266
Bytes received from server 4019800
Time Statistics
Client processing time 72441 ms (72 seconds)
Total execution time 72441 ms
Wait time on server replies 0
Kita dapat melihat bahwa "Waktu Pemrosesan Klien" sama dengan total waktu eksekusi.
Adakah yang tahu langkah apa yang bisa saya ambil untuk mendiagnosis mengapa transfer data aktual memakan waktu lama?
Apakah ada parameter konfigurasi SQL yang membatasi atau membatasi kecepatan transfer data antara mesin?
sumber
Jawaban:
Masalah Anda pasti terkait jaringan, berdasarkan info Anda. Karena itu, harus berurusan dengan profesional jaringan (saya bukan orangnya).
Hal-hal yang mungkin membantu:
Apakah server web di sub-net yang sama dengan server SQL?
Apakah ada router / jembatan dll di antara mereka?
Tidak banyak kemungkinan perubahan pada SQL server:
Anda menggunakan ukuran default: lihat statistik Anda: "Paket TDS diterima dari server 1216" (4MB / 1K = 4KB). Ya, ukuran buffer TDS dapat diubah: lihat di google: "ukuran batch protokol TDS"
Diskusi yang bagus tentang topik: "apakah ukuran paket jaringan sql benar-benar menentukan lalu lintas perjalanan pulang pergi?"
Namun, mengubah ukuran paket TDS akan (pasti) memiliki efek yang tidak dapat diprediksi dan hanya akan digunakan dalam produksi dalam kasus luar biasa.
Mengubah arsitektur atau pengenalan caching data pada mid-tier juga akan membantu.
sumber
Masalah ini sekarang telah diatasi.
Itu adalah masalah jaringan, dan kotak SQL menggunakan kartu NIC 100 MB / s , bukannya kartu NIC 10 GB / s ...
Perubahan konfigurasi jaringan untuk menggunakan kartu jaringan yang benar telah menyelesaikan masalah. Sekarang kami mendapatkan kinerja yang sama untuk semua permintaan dari kotak SQL Produksi dan dari kotak lain di jaringan.
Terima kasih semuanya atas bantuan Anda.
sumber
Pada pembacaan awal sepertinya Anda mengalami beberapa masalah latensi jaringan. Sudahkah Anda melihat beberapa penghitung Network Perfmon? Itu mungkin memberi Anda beberapa indikasi tentang apa yang terjadi dengan jaringan.
Kutipan dari Penghitung Perfmon apa yang harus saya monitor dan apa artinya masing-masing?
sumber
Beberapa pertanyaan awal: 1) Server memiliki klien SQL di Prod. mesin server diatur, kan? Jadi, jika Anda membuat permintaan yang sama dari klien yang berada di mesin yang sama, itu akan selesai dalam 2 detik? Apakah Anda mencoba melakukan ini? Apakah ini benar-benar 2 detik? 2) Anda menyebutkan bahwa konfigurasi lingkungan produksi Anda telah diubah (atau server produksi dipindahkan ke jaringan lain / total pembangunan kembali server), kan? Berapa waktu konsumsi permintaan di lingkungan produksi lama?
Karena penasaran: ini adalah contoh dari permintaan? atau kata-kata persis dari query? Query benar-benar TIDAK mengandung klausa WHERE? Setuju dengan saya bahwa ini sangat tidak biasa .. Tabel ini memiliki indeks berkerumun atau heap? Tabel berisi berapa banyak baris semuanya? Meja terpecah-pecah? Karena penasaran: sudah mengapa SELECT TOP NNN? Mengapa tidak MENETAPKAN ROWCOUNT NNN - lalu SELECT *? Permintaan ini dikeluarkan berapa kali oleh klien per hari? 1? 100? 1MLN? Data yang mendasarinya statis atau dinamis dan banyak berubah? Berapa (0,01 persen per hari? 1 persen per hari? 10 persen per hari?) Output permintaan diproses secara programatik? (bukan oleh pengguna?) Mengapa tidak di-cache / tidak disimpan di mid-tier? terima kasih, Alexei
sumber