ここで非常に頻繁に使用される Crystal Report を最適化しようとしています。多くのクエリを最適化することに成功しましたが、最後のボトルネックが 1 つあります。これは、レポートから生成されたメイン クエリです。
SELECT
A.*,
B.*,
C.*,
D.*,
E."N",
F."N",
G."N"
FROM
A
LEFT OUTER JOIN B ON
A."PK" = B."FK"
LEFT OUTER JOIN C ON
A."PK" = C."FK"
LEFT OUTER JOIN D ON
A."FK" = D."PK"
LEFT OUTER JOIN E ON
A."PK" = E."FK"
LEFT OUTER JOIN F ON
A."PK" = F."FK"
LEFT OUTER JOIN G ON
A."PK" = G."FK"
WHERE A.PK = ####
A、B、C、D はテーブルです。E、F、G は単純なビューです。
ご覧のとおり、レポートは複数の LEFT JOINS を生成しました。このクエリが完了するまでに 2.28 秒かかります (Plan Viewer 統計より)。問題と思われる結合を 3 つ特定しました。クエリから E、F、G を削除すると、ほぼ瞬時になります (同じ統計から 0.0009 秒)。
SELECT
A.*,
B.*,
C.*,
D.*
FROM
A
LEFT OUTER JOIN B ON
A."PK" = B."FK"
LEFT OUTER JOIN C ON
A."PK" = C."FK"
LEFT OUTER JOIN D ON
A."FK" = D."PK"
WHERE A.PK = ####
ビューが遅いのかもしれないと思いましたが、たとえばそうすると...
SELECT *
FROM E
WHERE E.FK = ####
... それもほぼ瞬時 (0.0009 秒)
すべてのテーブルには、PK-FK のインデックスがあります。ビュー E、F、G はすべて、列として [FK|N] を含む行を 1 つ返すか、まったく返さないため、結果の列は NULL または数値になります。
このクエリを高速化する方法を知っていますか?
PS: LEFT OUTER JOINS を INNER JOINS に置き換えると、メインクエリが高速になります... :-/
または、このクエリをレポートで複数のクエリに分割しようとする方が良い解決策でしょうか?
ありがとうございました!