2016-04-08 24 views
0

Farklı sorgulara bağlı olarak birden çok tablodaki verileri görüntülemek zorunda olan bir programın bir parçası var. Şimdiye kadar bu gibi görünüyor: Ben sonuçlarını almak ve farklı nesneler oluşturmak veya onlarla farklı alanlarda koymak Bundan sonraC# içinde çoklu SQL seçimleri optimize edin #

SELECT * FROM TABLE A WHERE ID = ... 
SELECT [8 fields] FROM TABLE B WHERE ... 
SELECT [5 fields] FROM TABLE C WHERE ... 
SELECT [1 field] FROM TABLE D WHERE ... 
SELECT [1 field] FROM TABLE E WHERE ... 
SELECT [1 field] FROM TABLE F WHERE ... 
SELECT [1 field] FROM TABLE G WHERE ... 
SELECT [1 field] FROM TABLE H WHERE ... 
SELECT [2 fields] FROM TABLE I WHERE ... 

(sonraki her SEÇ biz A'dan var şeye dayanır unutmayın). Şey, düğmeyi tıklatıp pencerenin gösterilmesi arasında, yaklaşık 2 saniye gecikme var. Unutmayın, bu milyonlarca kayıt ile çok büyük bir veritabanı. DB'yi değiştirmek maalesef sorunun dışında. Sadece Primary Keys ile arama yapıyorum, aramayı daha da kısıtlaman için bir yolum yok.

bağlantı baştan açıldığında, öyle yakın değil/Her cümleden sonra yeniden açın. Sadece Tablo A ve Tablo B'ye katılırken, iki farklı Seçimden 1,5 saniyeye kadar daha uzun bir süre geçilir, sıralı seçimler ise 300 ms'ye düşer. İlk sorgunun DBMS'de yaklaşık 53 ms sürdüğü göz önüne alındığında, oldukça uzun bir süre olduğunu hala görüyorum.

C#, Net Framework 4'te ODBC sürücüsünü kullanıyorum. Veritabanının kendisi bir DB2'dir, ancak DB2 yerel sürücüsü bize çok fazla sorun verdi ve IBM bu konuda daha az yardımcı oldu. Sadece birkaç alanları seçin whnever Ayrıca

, ben sadece bu kullanarak ve varsayılan kalanını bırakarak gerekli nesne oluşturmak.

Bunu geliştirmek herhangi bir yolu var mı? önceden Andrei

Edit teşekkür ederiz:

--Two queries in another part of the program, we can ignore these, as they are not usually there-- 0.31 s 
First query - 0.75 s 
Second query - 0.87s 
Third query - 0.95s 
Fourth query - 0.99s 
Fifth query - 1.00s 
Sixth query - 1.04s 
Seventh query - 1.08s 
Eighth query - 1.10s 
Ninth query - 1.12s 
Program output - 1.81s 
+0

DB'yi değiştirdiğinizde, tablonun yapısını değiştirmeyi kastettiğinizi varsaydığım soruların dışında kalıyorsunuz. Yeni endeksler oluşturabiliyor musunuz? – Brad

+0

@Brad, maalesef DB'nin de aynı ürünün daha eski bir versiyonunun DB üzerinde de çalıştığı ve her şeyin olduğu gibi olmasını beklediği için DB'yi hiçbir şekilde değiştiremeyiz. Genel olarak, tekrar edilmeyen alanlar birincil anahtar olarak eklenmiştir. –

cevap

0

sorgu dizeleri inşa ve bunları yürütme yükü vardır: teşhis aracı hatları arasında bir şeyler söylüyor. Birden çok benzer sorgu çalıştırırken, bir kez derlendiğinden ve sonra yürütme planının yeniden kullanıldığından emin olmak istersiniz.

Ancak, en iyi yaklaşım birden çok sütun iade tek sorgu oluşturmaktır olması muhtemeldir.

select . . . 
from a join 
    b 
    on . . . join 
    c 
    on . . . join 
    . . . 

Ancak join s left join ler olabilir: safça, şu şekilde görünecektir. Kartezyen ürünler üretebilecek farklı boyutlarda birleşiyorsanız, sorgu daha karmaşık olabilir.

Anahtar nokta, SQL sorgusunun numaralı veritabanındaki soruyu eniyileştirmesidir. Bu (genellikle), birden çok farklı sorgu oluşturmaktan daha verimlidir.

+0

Cevap vermek için zaman ayırdığınız için teşekkür ederim, Gordon. Ancak, geri kalanına gitmeden önce, sadece ilk iki tablo üzerinde bir iç birleştirme yapmaya çalışırken, sonuç DBMS içinde 1 saniyelik bir sorgulama süresine sahipti, bu da C# 'da 1,5 saniyeye indirdi. DBMS aslında ilk önce tüm birleşimleri oluşturur ve daha sonra sonuçları filtrelemek için zaman alır olabilir.Benim sahip olduğum diğer bir problem, bazı alanların boş olabileceğidir, bu programa filtre uygularım ancak bir sorguda yapamıyorum. –