Цитата:
Сообщение от
belugin
Можете написать скрипт, который воспроизведет такое поведение?
Вы наверное испытывате желание подловить меня на чем-то? То, что я предлагаю, работает лишь на сложных запросах. Найти стандартный пример я вам не могу, т.к. это зависит от многих условий, и на разных базах один и тот же запрос будет работать очень быстро или очень медленно.
Вот недавно оптимизированный в моей базе запрос, который зависал.
Запрос до оптимизации
PHP код:
static void Job296(Args _args)
{
someLine someLine;
someTable someTable;
WMSJournalTrans WMSJournalTrans;
purchLine purchLine;
boolean _OnlyPosted = true;
;
Select Sum(NetWeight), Sum(InventQtyBoxes), Sum(InventQtyUnits) From someLine
Where someLine.ItemId == "ItemId"
exists join someTable
//group by TableId
Where
(someTable.SomeType == SomeEnum::FirstVariant ||
someTable.SomeType == SomeEnum::SecondVariant ||
someTable.SomeType == SomeEnum::ThirdVariant) &&
!someTable.IsCanceled &&
someTable.RecId == someLine.ParentRecId //индексированное поле, уникальное для someTable
exists join WMSJournalTrans
//group by TableId
Where
(WMSJournalTrans.fPosted || !_OnlyPosted) &&
WMSJournalTrans.someTableRecId == someTable.RecId &&
WMSJournalTrans.inventTransId == purchLine.InventTransId //индексированное поле
;
}
Запрос после оптимизации
PHP код:
static void Job296(Args _args)
{
someLine someLine;
someTable someTable;
WMSJournalTrans WMSJournalTrans;
purchLine purchLine;
boolean _OnlyPosted = true;
;
Select Sum(NetWeight), Sum(InventQtyBoxes), Sum(InventQtyUnits) From someLine
Where someLine.ItemId == "ItemId"
exists join someTable
//group by TableId
Where
someTable.RecId == someLine.ParentRecId && //индексированное поле, уникальное для someTable
(someTable.SomeType == SomeEnum::FirstVariant ||
someTable.SomeType == SomeEnum::SecondVariant ||
someTable.SomeType == SomeEnum::ThirdVariant) &&
!someTable.IsCanceled
exists join WMSJournalTrans
//group by TableId
Where
WMSJournalTrans.inventTransId == purchLine.InventTransId && //индексированное поле
WMSJournalTrans.someTableRecId == someTable.RecId &&
(WMSJournalTrans.fPosted || !_OnlyPosted);
}