Toplu SQL SELECT İfadelerinde NE ZAMAN Tekrarlayan CASE

Düzenli olarak kullandığım bir sorgunun maliyetini ve boyutunu azaltmaya çalışıyorum, işleri yapmanın en etkili yolu olamayacak kadar tekrarlı görünüyor.

Basitleştirilmiş bir sunum aşağıda görülebilir:

SELECT [Year],
       [Month],
       COUNT(CASE WHEN Type = 'Quotation' THEN clientID ELSE NULL END),
       COUNT(CASE WHEN Type = 'Purchase' THEN ClientID ELSE NULL END),
       SUM(CASE WHEN Type = 'Purchase' THEN Cost ELSE NULL END)
       ...           
FROM dbo.Example
GROUP BY [Year],[Month]

NEDEN NE OLDUĞUNDAN ... DAHA FAZLA NULL SONU SONLANDIR 's, boyut ve maliyet açısından kesebilmem gerektiğini düşünüyorum. Herhangi bir tavsiye?

SQL Server 2008 R2 kullanıyorum, Teşekkürler.

0
"boyut açısından" ... neyin boyutu ?, yazılanlar?
katma yazar Lamak, kaynak
Bu durumda, kodun uzunluğunu azaltmada pek bir nokta yok, ELSE NULL bölümünü kaldırabilirsiniz, ancak bu yol daha açık
katma yazar Lamak, kaynak
Bu durumda, kodun uzunluğunu azaltmada pek bir nokta yok, ELSE NULL bölümünü kaldırabilirsiniz, ancak bu yol daha açık
katma yazar Lamak, kaynak
Gerçek kod, bu CASE ifadelerinin toplamlarının satırlarını ve satırlarını içerir. Kod boyutunu azaltmanın bir yolu olması gerektiğinden eminim (evet yazılı karakter)
katma yazar Rhys, kaynak
Gerçek kod, bu CASE ifadelerinin toplamlarının satırlarını ve satırlarını içerir. Kod boyutunu azaltmanın bir yolu olması gerektiğinden eminim (evet yazılı karakter)
katma yazar Rhys, kaynak
@JFPicard, ne yazık ki, izinlerim çok "salt okunur"
katma yazar Rhys, kaynak
@JFPicard, ne yazık ki, izinlerim çok "salt okunur"
katma yazar Rhys, kaynak

8 cevap

Bu kadar karmaşık bir şeye sahip olduğunuzda, çok sayıda koşullu topluluğa sahip olduğunuzda, benim deneyimime göre, aşamalı bir şekilde yaparsanız daha hızlı ve daha net. Diğer bir deyişle, gerekli veri yapısına sahip bir tablo değişkenine sahip olun ve CASE ifadelerini kullanmaktan kaçınan bireysel sorgularla kayıt ekleyin ve (umarım) dizine alınmış sütunlara dayanarak kayıt seçimini yapın.

Dolayısıyla, @TypeTotals adlı bir tablo değişkeniniz varsa, (basitleştirilmiş örneğinizi kullanarak) şöyle bir şey yapabilirsiniz:

 INSERT INTO @TypeTotals
    SELECT [Year],
           [Month],
           [Type],
           COUNT(ClientID),
           Null,
           Null
    FROM   dbo.Example
    WHERE  [Type] = 'Quotation'
    GROUP BY
           [Year], [Month]

 INSERT INTO @TypeTotals
    SELECT [Year],
           [Month],
           [Type],
           Null,
           COUNT(ClientID),
           SUM(Cost)
    FROM   dbo.Example
    WHERE  [Type] = 'Purchase'
    GROUP BY
           [Year], [Month]

... etc ...

Daha sonra @TypeTotals içeriğini özetleyebilirsiniz.

Hızlandırmanın anahtarı, bu CASE ifadelerinden kaçınmak (daha önce düşündüğünüz gibi) ve dizinlerden ne kadar faydalanabileceğinizi belirlemektir.

Ve deney yapmak için. Profiler’dan faydalanın, çünkü uygulama planları her zaman elde edeceğiniz hızları temsil etmez.

0
katma

Bu kadar karmaşık bir şeye sahip olduğunuzda, çok sayıda koşullu topluluğa sahip olduğunuzda, benim deneyimime göre, aşamalı bir şekilde yaparsanız daha hızlı ve daha net. Diğer bir deyişle, gerekli veri yapısına sahip bir tablo değişkenine sahip olun ve CASE ifadelerini kullanmaktan kaçınan bireysel sorgularla kayıt ekleyin ve (umarım) dizine alınmış sütunlara dayanarak kayıt seçimini yapın.

Dolayısıyla, @TypeTotals adlı bir tablo değişkeniniz varsa, (basitleştirilmiş örneğinizi kullanarak) şöyle bir şey yapabilirsiniz:

 INSERT INTO @TypeTotals
    SELECT [Year],
           [Month],
           [Type],
           COUNT(ClientID),
           Null,
           Null
    FROM   dbo.Example
    WHERE  [Type] = 'Quotation'
    GROUP BY
           [Year], [Month]

 INSERT INTO @TypeTotals
    SELECT [Year],
           [Month],
           [Type],
           Null,
           COUNT(ClientID),
           SUM(Cost)
    FROM   dbo.Example
    WHERE  [Type] = 'Purchase'
    GROUP BY
           [Year], [Month]

... etc ...

Daha sonra @TypeTotals içeriğini özetleyebilirsiniz.

Hızlandırmanın anahtarı, bu CASE ifadelerinden kaçınmak (daha önce düşündüğünüz gibi) ve dizinlerden ne kadar faydalanabileceğinizi belirlemektir.

Ve deney yapmak için. Profiler’dan faydalanın, çünkü uygulama planları her zaman elde edeceğiniz hızları temsil etmez.

0
katma

Erm, neyin yanlış:

SELECT [Year],
       [Month],
       [Type],
       COUNT(ClientID) "Count",
       SUM(Cost) "TotalCost",
       ...           
FROM dbo.Example
GROUP BY [Year],[Month],[Type]

Yapma şekliniz onu normalleştiriyor. Bu yüzden performans bu kadar zayıf. Elbette, Type = 'Quotation' olduğunda SUM (Maliyet) oluşturuyorsunuz ve buna ihtiyacınız olmayabilir, ancak ekleme işlemi genellikle sorgu performansı için sınırlayıcı bir faktör değildir.

Her [Yıl], [Ay] için tek bir kaydın olmasının bir nedeni var mı?

0
katma

Erm, neyin yanlış:

SELECT [Year],
       [Month],
       [Type],
       COUNT(ClientID) "Count",
       SUM(Cost) "TotalCost",
       ...           
FROM dbo.Example
GROUP BY [Year],[Month],[Type]

Yapma şekliniz onu normalleştiriyor. Bu yüzden performans bu kadar zayıf. Elbette, Type = 'Quotation' olduğunda SUM (Maliyet) oluşturuyorsunuz ve buna ihtiyacınız olmayabilir, ancak ekleme işlemi genellikle sorgu performansı için sınırlayıcı bir faktör değildir.

Her [Yıl], [Ay] için tek bir kaydın olmasının bir nedeni var mı?

0
katma

Bir tabloyu 'döndürmek' için önerilen yol bu olduğunu düşünüyorum.

Check this article from Microsoft -> https://support.microsoft.com/en-us/kb/175574

Probably the cost is in the 'Type' column, maybe you can index that -> How to create an index for a string column in sql?

0
katma

Bir tabloyu 'döndürmek' için önerilen yol bu olduğunu düşünüyorum.

Check this article from Microsoft -> https://support.microsoft.com/en-us/kb/175574

Probably the cost is in the 'Type' column, maybe you can index that -> How to create an index for a string column in sql?

0
katma

Türüne göre bir görünüm yapmaya ne dersiniz? (Teklif, satın alma vb.) Bu şekilde görünümü görüntüleyerek en iyi duruma getirebilir ve istediğinizi elde etmek için bir birleştirme sorgusu yapabilirsiniz.

0
katma

Türüne göre bir görünüm yapmaya ne dersiniz? (Teklif, satın alma vb.) Bu şekilde görünümü görüntüleyerek en iyi duruma getirebilir ve istediğinizi elde etmek için bir birleştirme sorgusu yapabilirsiniz.

0
katma