1

使用 Delphi 2009 + Firebird 2.1.3。

数据库为 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 x so_id 而循环这个说 1000 次时,FBSERVER.EXE 的 CPU 使用率达到 100%

有人遇到过这个问题吗?

4

2 回答 2

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
于 2010-03-05T05:05:03.300 回答
0

从你的数据库中做一个gstat -h,看看最旧的交易和下一个交易之间的区别。

这两个数字之间的区别在于有多少交易是开放的。

  • 如果你看到很多人,你的问题可能是你没有提交他们。

  • 也可能是您打开一项交易并干扰其他交易。

最后,您能否SELECT在只读事务中执行此操作。

于 2010-05-16T08:35:25.760 回答