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
в транзакции только для чтения.