Dalam aplikasi produksi (C # berbicara dengan SQL Server 2014 Standard) ada permintaan yang terlihat seperti ini, di bawah ini. Sebagian besar waktu berjalan dalam milidetik. Tetapi kadang-kadang (untuk nilai-nilai tertentu @Id
), ia menjadi gila dan membutuhkan satu menit atau lebih. Ini lebih lama dari batas waktu aplikasi, jadi aplikasi gagal untuk pengguna.
Dalam kasus "pergi gila", set hasil yang dikembalikan benar kosong, seperti dalam banyak tetapi tidak semua kasus lainnya.
Untungnya ini dapat direproduksi baik di lingkungan produksi dan pengembangan.
Pengembang mengatakan menghapus "TOP 1" dari kueri, lalu memastikan aplikasi mengkonsumsi baris tambahan dari set hasil, membereskan masalah kinerja.
Perencana kueri menyarankan tidak ada indeks kapan TOP 1
ada. (dalam dev).
Mengubah kueri dan memperbaiki aplikasi sedang berlangsung. Peluncuran membutuhkan waktu.
Pertanyaan saya: Apakah ada cara yang dapat diakses DBA untuk menyetel atau mengubah contoh SQL Server produksi untuk mengatasi masalah ini sebelum perubahan aplikasi dengan kueri baru diluncurkan?
SELECT TOP 1
subscription_id
FROM subscription AS sub
JOIN billing_info AS bi ON bi.billing_info_id = sub.billing_info_id
JOIN person_group AS apg ON apg.person_id = bi.person_id
JOIN pplan ON pplan.plan_id = sub.plan_id
JOIN product ON product.product_id = [plan].product_id
JOIN product_attribute ON product_attribute.product_id = product.product_id
WHERE apg.group_id = @Id
AND apg.start_date < GETDATE()
AND (apg.end_date IS NULL OR apg.end_date > GETDATE())
AND (sub.end_date IS NULL OR sub.end_date > GETDATE())
AND product_attribute.attribute_type = 'special feature'
AND product_attribute.attribute_data = '1'
ORDER BY sub.start_date ASC;
sumber
@ID
selalu membuatnya "gila"? Jika demikian, maka uji menggunakan salah satu dari nilai-nilai itu dan tangkap rencana kueri yang sebenarnya. Itu akan memberi tahu Anda apa yang salah. Jika nilai-nilai "buruk" tidak konsisten, maka sepertinya ini adalah sniffing parameter (lihat jawaban @ MartinSmith untuk solusi), atau masalah penguncian yang melibatkan bagaimana klien benar-benar meminta dan mengkonsumsi set hasil.Jawaban:
Jika Anda tidak dapat mengubah kueri, Anda dapat menggunakan panduan paket.
Uji kinerja permintaan dengan
OPTION (QUERYTRACEON 4138)
(akan membutuhkan seseorang dengansysadmin
izin untuk mencoba ini).Jika itu menghasilkan kinerja yang memuaskan Anda dapat menerapkan ini dengan panduan rencana. Jika itu tidak menghasilkan kinerja yang memuaskan cobalah dan temukan petunjuk yang bisa. Mungkin
OPTION (HASH JOIN, MERGE JOIN)
jika loop bersarang tidak tepat adalah masalahnya. Anda mungkin perlu menggunakanUSE PLAN N'...'
petunjuk.Setelah mengetahui petunjuk yang diperlukan, Anda dapat menerapkannya menggunakan informasi di sini .
sumber
OPTION (QUERYTRACEON 4138)
melakukan trik. Terima kasih. Sekarang untuk memilah panduan rencana.untuk nyengir beri ini coba
`> diubah ke> = jadi tidak sama persis permintaan
sumber