2016-04-14 27 views
1

Raporlama yapmam gereken Fatura verilerini içeren bir üçüncü taraf veritabanım var. Miktar ve Tutar Alanları, "fatura" nın bir Alacak Dekontu veya gerçek Fatura olup olmadığına bakılmaksızın Olumlu sayılar olarak saklanır. "I" = Fatura, "R" = Kredi türünü içeren tek bir karakter alanı vardır.SQL Fatura Sorgu Performansı Kredileri negatif sayılara dönüştürme

1,4 milyon kayıtla eşdeğer bir raporda, bu verileri toplamalıyım, böylece Krediler toplam ve Faturaların toplamından çıkarılır ve raporda 8 farklı sütun için bunu yapmam gerekir (CurrentYear , ÖncekiYıl, vb.)

Sorunum, bunu başarmanın birçok farklı yolunun performansı.

En iyi performans şöyle denklemin içinde CASE deyimi kullanıyor görünüyor: Ben 8 farklı sütunlara yapmak zorunda beri

Case WHEN ARH.AccountingYear - 2 = @iCurrentYear THEN ARL.ShipQuantity * (CASE WHEN InvoiceType = 'R' THEN -1 ELSE 1 END) ELSE 0 END as PPY_INVOICED_QTY 

Ama kod okunabilir akıllı, bu süper çirkin, performans iyidir , 16 saniyede tüm 1.4M kayıtlarına karşı çalışır. Bir Skaler UDF Kullanma

performans

Case WHEN ARH.AccountingYear - 2 = @iCurrentYear THEN ARL.ShipQuantity * dbo.fn_GetMultiplier(ARH.InvoiceType) ELSE 0 END as PPY_INVOICED_QTY 

neredeyse 5 dakika sürer öldürür. Yani bunu yapamazsın. Aklıma

Diğer seçenekler olacaktır: Görüntüleme

  1. Çoklu düzeyleri, daha sonra, bir Çarpan sütunu eklemek bundan SEÇ ve yeni sütun
  2. Oluştur kullanarak çarpma yapmak için yeni bir görünümü kullanmak 2 sütun ve 2 kayıt, R, -1 ve I, 1 içeren bir tablo ve InvoiceType'ı temel alarak buna katıl, ancak bu aşırı görünüyor.

Eksik olduğum başka fikirlerim veya bu tür şeyler için en iyi uygulama önerileri? Üçüncü taraf uygulaması tarafından kurulan depolanmış verileri değiştiremiyorum.

+0

Şemayu değiştirip fatura türüne göre hesaplanmış bir sütun ekleyebilir misiniz? Daha okunabilir olmasını sağlar, ancak performansı da artırabilir. – Igor

+0

Maalesef, üçüncü taraf tablolarını, destek sözleşmesini geçersiz kılmaksızın hiçbir şekilde değiştirmem mümkün değil. – Earthworm

+0

Bu durumda, bir veya daha fazla Görünüm muhtemelen en iyi bahistir. Dahil ettiğiniz şeye bağlı olarak, size bir [İndeksli görünüm] (https://msdn.microsoft.com/en-us/library/ms191432 (v = sql.110) .aspx) sağlayabilirsiniz. hafif performans artışı. – Igor

cevap

0

Igor'un önerdiği gibi çoklu görünümlere gitmeye karar verdim, aslında yuvalanmış sürümü kullanıyordum, okunabilirlik düşük olsa bile, bakım sadece 2 yerine 2 görünümünden daha kolay. Performans 8 farklı durum ifadesine benziyor Bu yüzden genel olarak 20 saniyenin altında çalışıyor.

İçgörüler için teşekkürler.