Firebird 2.1 + EXISTS = ошибка запроса?

Использование 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 раз, потому что у меня 1000 x so_id, загрузка процессора достигает 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

Сделать gstat -h из ваших данных и увидите разницу между самой старой транзакцией и следующей транзакцией.

Разница между этими двумя числами заключается в том, что многие транзакции открыты.

  • Если вы видите многих, ваша проблема может быть в том, что вы их не делаете.

  • Также может быть, что вы открываете одну транзакцию, и это мешает другим.

Наконец, вы могли бы сделать это SELECT в транзакции только для чтения.

Другие вопросы по тегам