2016-04-08 8 views
0

異なるクエリに基づいて、複数のテーブルのデータを表示する必要があるプログラムの一部があります。これまでのところ、それは次のようになります(後続のすべてのSELECTは、我々はAから得た何かに基づいていることに注意してください)その後複数のSQL SelectをC#で最適化

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 ... 

、私は結果を取得し、別のオブジェクトを作成したり、それらと異なるフィールドに入れます。 ボタンをクリックしてからウィンドウを表示するまでに、約2秒の遅延があります。 これは数百万のレコードを持つ非常に大きなデータベースです。残念ながら、DBの変更は問題になりません。 私はプライマリキーだけで検索しているので、それ以上の検索を制限する方法はありません。

接続は最初から開いていますが、各文の後には閉じたり開いたりしません。 表Aと表Bの結合には、2つの異なる選択よりも長く、最長で1.5秒、順次選択を実行すると約300msになります。 最初のクエリがDBMSで約53ミリ秒で実行されることを考えると、かなり長い時間がかかることがわかります。

私はC#、Net Framework 4でODBCドライバを使用していますが、データベース自体はDB2ですが、DB2ネイティブドライバを使用すると、私たちに多大な問題を与えてしまいました。

また、私はいくつかのフィールドだけを選択しても、それらを使って必要なオブジェクトを作成し、残りはデフォルトで残しています。

これを改善する方法はありますか? は、事前に アンドレイ

編集ありがとう:

--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の変更が問題になっていると言えば、私はあなたがテーブル構造を変更することを意味していると思います。新しいインデックスを作成できますか? – Brad

+0

@ブラッド、残念なことに、同じ製品の古いバージョンもDB上で動作し、すべてが元のままであることを前提としているため、DBを何らかの方法で変更することはできません。一般に、繰り返されなかったフィールドは主キーとして追加されました。 –

答えて

0

クエリ文字列を構築し、それを実行にオーバーヘッドがあります:診断ツールは、行の中で何かを言います。複数の類似したクエリを実行する場合は、それらが一度コンパイルされ、実行計画が再利用されていることを確認する必要があります。

ただし、複数の列を返す単一のクエリを作成することをお勧めします。しかし、join sがleft joinのかもしれない

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

:単純に、これは次のようになります。デカルト積を生成する可能性のある異なる次元に沿って結合する場合、クエリはより複雑になる可能性があります。

重要な点は、SQLクエリがデータベース内のクエリを最適化することです。これは、複数の異なるクエリを構築するよりも(一般的に)効率的です。

+0

Gordonに返信していただきありがとうございます。しかし、最初の2つのテーブルだけで内部結合をしようとするうちに、残りのものになる前に、DBMS自体の内部で1秒のクエリ時間が発生し、C#では約1.5秒になりました。 DBMSは実際にすべての結合を最初に作成してから実際に結果をフィルタリングするのに時間がかかります。私が持っているもう一つの問題は、いくつかのフィールドが空であるかもしれないということです。私はプログラムでフィルタリングしますが、クエリでは実行できません。 –