0

私には問題があり、今はアイデアがありません。

データベース アプリケーションの最適化を行っています。この種のクエリを実行する数百回呼び出されるメソッド (Method_A) があります。

SELECT 
A.a,
ISNULL(A.b, 'Nothing') As alias_b
ISNULL(B.a, 'N/A') as alias_c
FROM A
LEFT JOIN B on A.fk=B.fk AND B.a = 'SOME_KEY'
WHERE A.c = 'SOME_OTHER_KEY'

次のような1行になります。

[a      ][alias_b][  alias_c  ]
[ val_a ][ val_b ][val_c|'N/A'] 

コードを最適化するためにやりたいことは、Method_A の前に単一のリクエストを作成し、すべてのデータを取得して Method_A がクライアント側でフィルター処理するようにすることです。(これは .NET でコーディングされています。OleDBConnection を DataSet に置き換えています)

どうすればこの種の動作を達成できますか? クライアント側の条件でフィルタリングすると、結合が何も返さない場合に「N/A」を取得するのではなく、行を取得しないだけであり、まだ val_a と val_b が必要なため、これは問題です。

ご協力ありがとうございました!

4

1 に答える 1

0

これを試すことができます。基本的に、一致しないB要素がある場合と一致する場合(および内部結合を行う場合)の2つのケースを分割すると、よりクリーンな実行プランが得られる可能性があります。

(SELECT A.a,
        ISNULL(A.b, 'Nothing') As alias_b
        'N/A' as alias_c
 FROM A 
 WHERE A.c = 'SOME_OTHER_KEY' and
  not exists (select B.fk FROM B WHERE A.fk=B.fk AND B.a = 'SOME_KEY')
)
UNION ALL
(SELECT A.a
        ISNULL(A.b, 'Nothing') As alias_b
        B.a as alias_c
 FROM A, B
 WHERE A.c = 'SOME_OTHER_KEY' and 
       A.fk= B.fk and 
       B.a = 'SOME_KEY'
)

次のインデックスが必要であることに注意してください。

  • 交流)
  • A(fk)
  • B(fk)
  • B(fk、a)
  • A(fk、c)
于 2012-12-13T23:44:05.620 に答える