2012-11-13 165 views
0

我正在嘗試優化在此處使用頻率非常高的Crystal報表。我成功地優化了大量查詢,但仍然有最後一個瓶頸:這是從報告中生成的主要查詢。Sybase 12 LEFT JOIN CrystalReports的性能問題

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秒才能完成(從計劃查看器統計)。我確定了三個似乎有問題的連接。如果我從查詢中刪除E,F,G,它變得幾乎瞬間(來自同一統計0.0009s)

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)

表都對的PK-FKS索引。 視圖E,F,G都將[FK | N]作爲列返回一個或不包含行,所以生成的列爲NULL或數字。

你知道我怎麼能使這個查詢快?

PS:如果我更換由內左外連接,連接的主查詢變快...: -/

或者試圖分裂這個查詢到多個查詢該報告將是一個更好的解決辦法?

謝謝!

回答

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 = #### 
+0

非常好的謝謝你!我的報告現在快得多,我不必更改報告本身,只需將它的請求嵌入到使這些函數調用的視圖中;-) –

0

問題可能是因爲您正在創建一個5張桌子的巨大笛卡爾積,所有這些產品都以某種方式加入了AAD只會爲該產品貢獻一個記錄)。擁有這樣一個大笛卡爾產品將在Sybase內部消耗相當多的內存。您的查詢很可能是錯誤的。

+0

是的,查詢是錯誤的,但它會自動生成... –