SELECT TOP 1 merusak kinerja kueri; apakah ada cara dba-diakses untuk mengatasi ini?

13

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 1ada. (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;
O. Jones
sumber
Sudahkah Anda mencobanya sebagai subquery? Misalnya pilih 1 teratas berlangganan_id dari (pilih [sisa permintaan Anda tanpa top1]
SeanR
Mungkin penyetelan permintaan "normal" akan berfungsi? Jika indeks cukup menarik, pemindaian akan hilang. Itu kurang invasif daripada panduan rencana.
usr
Jadi apakah nilai yang sama @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.
RBarryYoung

Jawaban:

12

Jika Anda tidak dapat mengubah kueri, Anda dapat menggunakan panduan paket.

Uji kinerja permintaan dengan OPTION (QUERYTRACEON 4138)(akan membutuhkan seseorang dengan sysadminizin 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 menggunakan USE PLAN N'...'petunjuk.

Setelah mengetahui petunjuk yang diperlukan, Anda dapat menerapkannya menggunakan informasi di sini .

Martin Smith
sumber
OPTION (QUERYTRACEON 4138)melakukan trik. Terima kasih. Sekarang untuk memilah panduan rencana.
O. Jones
0

untuk nyengir beri ini coba
`> diubah ke> = jadi tidak sama persis permintaan

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 
       AND apg.group_id = @Id
       AND apg.start_date < GETDATE()
       AND isnnull(apg.end_date, GETDATE()) >= GETDATE()             
  JOIN pplan 
        ON pplan.plan_id = sub.plan_id
       AND isnnull(sub.end_date, GETDATE()) >= GETDATE()
  JOIN product 
        ON product.product_id = [plan].product_id 
  JOIN product_attribute 
        ON product_attribute.product_id = product.product_id 
       AND product_attribute.attribute_type = 'special feature' 
       AND product_attribute.attribute_data = '1' 
 ORDER BY sub.start_date ASC;
paparazzo
sumber
"Mengubah permintaan dan memperbaiki aplikasi sedang berlangsung. Peluncuran membutuhkan waktu." OP sedang mencari solusi yang memperbaiki kinerja "apa adanya".
Martin Smith
@ MartinSmith Dan ketika mereka melakukan perbaikan, ini mungkin perbaikan yang lebih baik. Membuat aplikasi mengkonsumsi baris tambahan akan menjadi perubahan program lainnya.
paparazzo