Цитата:
Сообщение от
SHiSHok
но вот сиквел на нашей базе начал интересный план придумывать
Дык, и разберитесь с сиквелом.
Цитата:
Сообщение от
SHiSHok
Пришлось явно сиквелу сказать что делать: для первого запроса наилучшую селективность обеспечивает MARKUPTRANS, для второго карта CUSTINVOICETRANS - имеем:
Во-первых, с чего вы взяли, что так будет всегда и у всех.
Во-вторых, явные хинты требуют постоянного административного внимания.
В-третьих, с какой стати у вас сиквел сам этого не понимает? Разберитесь именно с этим.
В-четвертых, где-то в блогах, по-моему, Еременко писал, что условия после всех join'ов в Аксапте работает медленнее, чем условия внутри.
Про recId и TableId тоже писали. Суть в том, что TableId - аксаптовское поле, не хранимое в базе СКЛе. Это значит, что использование TableId может привести к тому, что таблица исчезнет из SQL-запроса.
Т.е. нужно делать примерно так
X++:
// Header markups
// SHiSHok.FRA_Optimize -->
factureJour.clear();
while select RecId from markupTrans
where markupTrans.TransRecId == this.RecId
&& markupTrans.TransTableId == this.TableId
join RecId from factureTrans
where factureTrans.MarkupRefRecId == markupTrans.RecId
&& factureTrans.Module == module
&& factureTrans.FactureLineType == FactureLineType_RU::Markup
join * from factureJour index CustVendModuleIdx
where factureJour.FactureId == factureTrans.FactureId
&& factureJour.Module == module
&& factureJour.CustVendInvoiceAccount == this.InvoiceAccount
Обратите внимание на порядок полей в условиях.
1. Порядок полей должен по возможности совпадать с порядком полей в индексе (в противном случае SQL должен выполнить доп-работу)
2. Если у вас задействуется несколько индексов, то сначала укажите самый селективный (см. factureTrans)
3. Обратите внимание на проверку на модуль. Лучше сравните с константой, нежели поля таблиц
В общем, разберитесь с тем как работает запрос в Аксапте и что происходит в момент выполнения.
Перестаньте насиловать Аксапту и СКЛ. Помните: ласку, чистоту и смазку.