Показать сообщение отдельно
Старый 20.03.2012, 21:15   #8  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,712 / 1201 (44) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Вы сделали распространенную ошибку, решив что на 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<>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 
Если посмотреть его план выполнения, то Вы увидите, что он принципиально отличается от первоначального варианта
__________________
- Может, я как-то неправильно живу?!
- Отчего же? Правильно. Только зря...
За это сообщение автора поблагодарили: AlGol (1), Romb (1), malex (1), Alexanderis.ua (1).