TOP 1 SEÇ sorgu performansına zarar verir; bunun üstesinden gelmek için dba erişilebilir bir yol var mı?


13

Bir üretim uygulamasında (C #, SQL Server 2014 Standard ile konuşurken), aşağıdaki gibi görünen bir sorgu var. Çoğu zaman milisaniye olarak çalışır. Ancak bazen (belirli değerleri için @Id), çıldırır ve bir dakika kadar sürer. Bu, uygulama zaman aşımından daha uzundur, bu nedenle uygulama kullanıcı için başarısız olur.

"Çıldırıyor" vakalarında, döndürülen sonuç kümesi, diğer tüm durumlarda olmasa da birçok durumda olduğu gibi doğru şekilde boştur.

Neyse ki bu hem üretim hem de geliştirme ortamlarında tekrarlanabilir.

Geliştirici, sorgudan "TOP 1" ifadesini kaldırdıktan sonra uygulamanın sonuç kümesinin fazladan satırlarını tükettiğinden emin olarak performans sorununu ortadan kaldırdığını söylüyor.

Sorgu planlayıcısı TOP 1mevcut olduğunda hiçbir dizin önermez . (dev).

Sorguyu değiştirme ve uygulamayı düzeltme işlemi devam ediyor. Sunum biraz zaman alıyor.

Benim sorum: Yeni sorgu ile uygulama değişikliği başlamadan önce bu sorunun üstesinden gelmek için üretim SQL Server örneği ayarlamak veya ayarlamak için DBA erişilebilir bir yolu var mı?

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;

Alt sorgu olarak denediniz mi? Örneğin, ilk 1 abonelik_kodunu seçin ([sorgunuzun geri kalanını top1 olmadan]]
SeanR

Belki bazı "normal" sorgu ayarlama işe yarayabilir? Dizinler yeterince çekici ise, taramalar kaybolur. Bu bir plan rehberinden daha az invaziv.
usr

Peki aynı değerleri @ID her zaman "çıldırmak" yapar mı? Öyleyse, bu değerlerden birini kullanarak test edin ve gerçek sorgu planını yakalayın. Bu size neyin yanlış gittiğini söyleyecektir. "Kötü" değerler tutarlı değilse, bunun parametre ya da koklama (bkz. @ MartinSmith'in çözüm cevabı) ya da istemcinin sonuç kümesini gerçekte nasıl istediği ve tükettiğini içeren bir kilitleme problemi olduğu anlaşılmaktadır.
RBarryYoung

Yanıtlar:


12

Sorguyu değiştiremezseniz bir plan kılavuzu kullanabilirsiniz.

Sorgunun performansını ile test edin OPTION (QUERYTRACEON 4138)(bunu sysadmindenemek için izinleri olan birine ihtiyacınız olacaktır ).

Bu tatmin edici bir performans sağlıyorsa, bunu bir plan kılavuzuyla uygulayabilirsiniz. Eğer tatmin edici bir performans üretmezse, işe yarayan bir ipucu bulmaya çalışın. Muhtemelen OPTION (HASH JOIN, MERGE JOIN)uygunsuz iç içe döngüler halinde sorundur. USE PLAN N'...'İpucuna başvurmanız gerekebilir .

Öğrendikten sonra ipucu (ler) bilgileri kullanarak uygulayabilirsiniz gerekli burada .


OPTION (QUERYTRACEON 4138)hile yaptı. Teşekkürler. Şimdi plan rehberlerini sıralamaya başladık.
O. Jones

0

sırıtışlar için bunu deneyin
` >>> olarak değiştirilir, yani tam olarak aynı sorgu değil

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;

"Sorguyu değiştirmek ve uygulamayı düzeltmek devam ediyor. Rollout biraz zaman alıyor." OP, performansı "olduğu gibi" düzelten bir çözüm arıyor.
Martin Smith

@MartinSmith Ve bir düzeltme yaptıkları zaman bu daha iyi bir düzeltme olabilir. Uygulamanın ekstra satırları tüketmesi diğer program değişiklikleri olacaktır.
paparazzo
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.