0

我正在尝试优化这里经常使用的水晶报表。我成功地优化了许多查询,但我还有最后一个瓶颈:这是从报告生成的主查询。

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,主查询会变得很快...... :-/

或者尝试将此查询拆分为报表上的多个查询会是更好的解决方案?

谢谢!

4

2 回答 2

0

问题可能是因为您正在创建一个巨大的笛卡尔积,其中包含 5 个以A某种方式全部连接的表(A并且D只会为该产品贡献一条记录)。拥有如此大的笛卡尔积将在 Sybase 内部消耗相当多的内存。您的查询很可能是错误的。

于 2012-11-13T15:48:17.223 回答
0

我会创建函数来查找 E、F 和 G,而不是加入它们。这样,优化器就不太可能感到困惑并尝试做愚蠢的事情。

SELECT
    A.*,
    B.*,
    C.*,
    D.*,
    GET_E(A."PK"),
    GET_F(A."PK"),
    GET_G(A."PK")
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 = ####
于 2012-11-13T15:56:09.917 回答