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'

导致一行看起来像这样:

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

为了优化我的代码,我想做的是在 Method_A 之前发出一个请求,检索所有数据并使 Method_A 过滤客户端。(它是用 .NET 编码的,我用 DataSet 替换了 OleDBConnection)

我怎么能达到这种行为?因为如果我使用客户端条件进行过滤,而不是在连接不返回任何内容的情况下得到“N/A”,我只是没有得到任何行,这是一个问题,因为我仍然需要 val_a 和 val_b

谢谢您的帮助!

4

1 回答 1

0

你可以试试这个,基本上把B元素不匹配和有匹配的两种情况分开(并做内连接),说不定会有更清晰的执行计划:

(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(c)
  • A(fk)
  • B(fk)
  • B(fk,a)
  • A(fk,c)
于 2012-12-13T23:44:05.620 回答