我正在尝试优化这里经常使用的水晶报表。我成功地优化了许多查询,但我还有最后一个瓶颈:这是从报告生成的主查询。
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 统计信息)。我确定了三个看起来有问题的连接。如果我从查询中删除 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.0009s)
表都有关于 PKs-FKs 的索引。视图 E、F、G 都返回一行或不返回以 [FK|N] 作为列的行,因此结果列是 NULL 或数字。
你知道我怎样才能快速完成这个查询吗?
PS:如果我用 INNER JOINS 替换 LEFT OUTER JOINS,主查询会变得很快...... :-/
或者尝试将此查询拆分为报表上的多个查询会是更好的解决方案?
谢谢!