使用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
遇到的任何人這個問題?
使用此查詢,我可以得到重複的PO_NOs。我可以添加DISTINCT,但是這對CPU來說會很昂貴嗎? – Atlas 2010-03-05 05:10:41
@Atlas:更正 - 我誤讀了連接。 – 2010-03-05 05:34:46
在SELECT的變體中,您從外部選擇引用「a.po_id」,並強制Firebird對「purchase_order」表中的每行運行第二個查詢(查看查詢計劃)。刪除「z2.po_id = a.po_id」可能會有所幫助,允許Firebird首先運行第二個查詢,對其進行排序,緩存結果,然後運行第一個查詢並在該結果集中進行查找。如果您使用OMG的變體並使用「DISTINCT」,則您允許Firebird查詢優化器做到最好,然後Firebird將對結果集進行排序,您會沒事的。 – 2010-05-17 05:40:08