Вы сделали распространенную ошибку, решив что на SQL-сервере выполняется напрямую SQL-запрос. На самом деле это не так. Там создается
курсор, в который и "оборачивает" SQL-запрос. А вот у курсора и "чистого" запроса планы исполнения могут отличаться. Причем, как правило, отличия возникают именно при объединении по Exists Join.
Т.е. у Вас два варианта решения проблемы
1. Отказаться от Exists Join в пользу Inner Join. Поскольку у Вас ведущей является таблица строк накладных расходов, то связь получится по типу много-к-одному. Т.е. здесь даже не надо проверять на возможные дубли. Их и так не будет
2. Можно заняться оптимизацией. НО! Оптимизацией не того запроса, что Вы выцепили из профайлера, а обернутого в курсор. Т.е. Вам надо оптимизировать вот это
PHP код:
DECLARE cursor1 CURSOR FOR
SELECT *
FROM MARKUPTRANS A
WHERE (A.DATAAREAID='exp' AND A.CUSTVENDPOSTED_RU<>0 AND A.ITEMPOSTED_RU=0) AND
EXISTS (SELECT 'x' FROM CUSTINVOICETRANS B
WHERE (B.DATAAREAID='exp' AND
((A.TRANSTABLEID=64 AND A.TRANSRECID=B.RECID AND B.SALESID='РКЗП-00032212' AND B.INVOICEID='14294-11' AND
B.INVOICEDATE='2012-03-13 00:00:00.000' AND B.NUMBERSEQUENCEGROUP='ТД') OR
(A.TRANSTABLEID=62 AND A.TRANSRECID=5637435947) )))
OPEN cursor1
FETCH NEXT FROM cursor1
CLOSE cursor1
DEALLOCATE cursor1
Если посмотреть его план выполнения, то Вы увидите, что он принципиально отличается от первоначального варианта