Показать сообщение отдельно
Старый 16.03.2010, 17:53   #8  
Ace of Database is offline
Ace of Database
Участник
Аватар для Ace of Database
 
870 / 637 (23) +++++++
Регистрация: 14.10.2004
Цитата:
Сообщение от belugin Посмотреть сообщение
Можете написать скрипт, который воспроизведет такое поведение?
Вы наверное испытывате желание подловить меня на чем-то? То, что я предлагаю, работает лишь на сложных запросах. Найти стандартный пример я вам не могу, т.к. это зависит от многих условий, и на разных базах один и тот же запрос будет работать очень быстро или очень медленно.

Вот недавно оптимизированный в моей базе запрос, который зависал.

Запрос до оптимизации
PHP код:
static void Job296(Args _args)
{
    
someLine                            someLine;
    
someTable                           someTable;
    
WMSJournalTrans                     WMSJournalTrans;
    
purchLine                           purchLine;
    
boolean                             _OnlyPosted true;
    ;
        
Select Sum(NetWeight), Sum(InventQtyBoxes), Sum(InventQtyUnitsFrom 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(InventQtyUnitsFrom 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);

За это сообщение автора поблагодарили: Logger (3).