2010-03-05 94 views
1

使用Delphi 2009 + Firebird 2.1.3。Firebird 2.1 + EXISTS =查詢錯誤?

數據庫是ODS 11.1,默認字符集是UTF8。

我準備好的查詢如下:

SELECT 
    a.po_id, a.po_no 
FROM 
    purchase_order a 
WHERE EXISTS 
    (SELECT 1 
    FROM 
    sales_order_item z1 
    JOIN 
    purchase_order_item z2 
    ON 
    z2.so_item_id = z1.so_item_id 
    AND 
    z2.po_id = a.po_id 
    WHERE z1.so_id = :soid) 
ORDER BY a.po_no 

現在,當我這個循環說1000次,因爲我有1000×so_id,CPU使用率得到100%的FBSERVER.EXE

遇到的任何人這個問題?

回答

2

試試這個:

SELECT po.po_id, 
     po.po_no 
    FROM PURCHASE_ORDER po 
    JOIN PURCHASE_ORDER_ITEM poi ON poi.po_id = po.po_id 
    JOIN SALES_ORDER_ITEM soi ON soi.so_item_id = poi.so_item_id 
          AND soi.so_id = :soid 
ORDER BY po.po_no 
+0

使用此查詢,我可以得到重複的PO_NOs。我可以添加DISTINCT,但是這對CPU來說會很昂貴嗎? – Atlas 2010-03-05 05:10:41

+0

@Atlas:更正 - 我誤讀了連接。 – 2010-03-05 05:34:46

+0

在SELECT的變體中,您從外部選擇引用「a.po_id」,並強制Firebird對「purchase_order」表中的每行運行第二個查詢(查看查詢計劃)。刪除「z2.po_id = a.po_id」可能會有所幫助,允許Firebird首先運行第二個查詢,對其進行排序,緩存結果,然後運行第一個查詢並在該結果集中進行查找。如果您使用OMG的變體並使用「DISTINCT」,則您允許Firebird查詢優化器做到最好,然後Firebird將對結果集進行排序,您會沒事的。 – 2010-05-17 05:40:08

0

不要從你databes一個gstat -h,看到最早的事務和下一步交易的區別。

這兩個數字之間的區別是haw許多transacrtions是開放的。

  • 如果你看到很多人,你的問題可能比你沒有提交他們。

  • 它也可能比你打開一個交易並干擾其他交易。

最後,你可以在只讀事務中做這個SELECT