Sql Firebird 2.1+存在=查询错误?

Sql Firebird 2.1+存在=查询错误?,sql,delphi,firebird,firebird2.1,Sql,Delphi,Firebird,Firebird2.1,使用Delphi2009+Firebird 2.1.3 数据库是ODS11.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_ite

使用Delphi2009+Firebird 2.1.3

数据库是ODS11.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,FBSERVER.EXE的CPU使用率为100%

有人遇到此问题吗?

请尝试以下方法:

  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
从您的数据库中执行gstat-h,查看最早的事务和下一个事务之间的差异

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

如果你看到很多人,你的问题可能会比你没有承诺他们

它也可能比你打开一个交易,它会干扰其他交易


最后,您可以在只读事务中执行此选择操作。

通过此查询,我可以获得重复的采购订单号。我可以添加DISTINCT,但这对CPU来说会很昂贵,对吗?在SELECT的变体中,您引用的是外部SELECT中的.PO\u id,这迫使Firebird对purchase\u order表中的每一行运行第二次查询查看查询计划。删除z2.po_id=a.po_id可能会有所帮助,允许Firebird首先运行第二个查询,对其进行排序,缓存结果,然后运行第一个查询并在该结果集中进行查找。如果您使用OMG的变体并使用DISTINCT,那么您就可以让Firebird查询优化器发挥最佳效果,Firebird将对结果集进行排序,这样您就没事了。