[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: помогите оптимизировать
olgatcpip
Здравствуйте.
Помогите вот такой огромнейший код оптимизировать. Запрос как вы понимаете ростет с увелиением количества элементов в $arrKeysDeals. это ужасно.
PHP
function getValuesLast10DealsCheck($arrKeysDeals, $db){
    if(!$arrKeysDeals) return;
    $z='';
    foreach($arrKeysDeals as $id)
    {
        
         
// собираем и сообщения о проверках родителя
        $dql .= $z."(select 
            buyword.f_find_deal_parent(m.id_order) as parent ,
            m.id_order,m.state,m.time,m.display 
            from routine.tbl_check_deals_messages m
            where   m.id_order=$id or m.id_order=buyword.f_find_deal_parent($id)
            order by time desc limit 10)"
;
        $z=' UNION ';
    }
    if(count($arrKeysDeals)>1)
    $dql .= " order by time desc ";
    //echo "<!-- $dql -->"; 
    $resurs = $db->fetchAssoc($dql);
    $arrValues=array();
    foreach($resurs as $result)    
    
{    if(!is_array($arrValues[$result['id_order']]))
            $arrValues[$result['id_order']]=array();
        array_push($arrValues[$result['id_order']],$result);
    }

    foreach($arrValues as $key=>$deal){
        if($arrValues[$deal[0]['parent']])
        {    
            foreach
($arrValues[$deal[0]['parent']] as $parent){
                array_push($arrValues[$key],$parent);
            }
        }
    }

    return $arrValues;
}

таблица routine.tbl_check_deals_messages такая, которую я прикрепила.

привожу функцию buyword.f_find_deal_parent она находит ид родителя.
Код
BEGIN
select b.id_parent
into _id_parent
from buyword.tbl_mon_buyword_blocked b
where b.order_id=_order_id;
return _id_parent;
END;




Спустя 12 минут, 40 секунд (28.07.2009 - 11:48) sergeiss написал(а):
Судя по запросу, находим не более 10 элементов с определенными условиями, затем еще, еще и еще...

А задачу можно озвучить словестно, что надо делать?


Спустя 4 минуты, 5 секунд (28.07.2009 - 11:52) isergi написал(а):
Ну для начала можно избавиться от двойного форича:

PHP
foreach($arrValues as $key=>$deal){
        if(
$arrValues[$deal[0]['parent']])
        {    
            foreach(
$arrValues[$deal[0]['parent']] as $parent){
                
array_push($arrValues[$key],$parent);
            }
        }
    }


Заменить на

PHP
foreach($arrValues as $key=>$deal){
        if(
$arrValues[$deal[0]['parent']])
        {    
            
$arrValues[$key] = array_merge($arrValues[$key], $arrValues[$deal[0]['parent']]);
        }
    }



Спустя 34 секунды (28.07.2009 - 11:52) isergi написал(а):
Если я правильно понял задачу.

Спустя 21 минута, 34 секунды (28.07.2009 - 12:14) olgatcpip написал(а):
isergi
не получится, потому то $arrValues[$deal[0]['parent']] ещё может не появиться.
Цитата
А задачу можно озвучить словестно, что надо делать?

нужно взять по 10 проверок каждой сделки
но если у сделки к примеру только одна проверка, то взять у родителя проверки (инфу о проверке).
брать из табицы проверок.

Или более понятно нужно объяснить?

Спустя 7 минут, 6 секунд (28.07.2009 - 12:21) Sylex написал(а):
olgatcpip
более понятно надо smile.gif)

Спустя 9 минут, 29 секунд (28.07.2009 - 12:30) isergi написал(а):
Цитата (olgatcpip 28.07.2009 - 09:14)

не получится, потому то $arrValues[$deal[0]['parent']] ещё может не появиться.


Дык, вон оно чо Михалыч! Тут же проверка стоит на появляеммость.

PHP
if($arrValues[$deal[0]['parent']])
        {

Спустя 16 минут, 19 секунд (28.07.2009 - 12:47) olgatcpip написал(а):
есть таблица.
id_order time state display
эта таблица о проверках неких сделок. важно то, что id_order допустим 532 может быть записан много раз, например 25 раз. И есть сделка с номером id_order = 489 тоже может быть записана много раз, например 20 раз

Вопрос: как взять из таблицы одним запросом (один запрос экономичнее чем много запросов?) 10 записей с id_order=532 и 10 записей с id_order=489.
Это задача минимум.

Задача максимум. Те же условия, но допустим есть id_order=600 их 3 записи. Нужно получить 3 записи id_order=600 + 7 записей родителя. Получить ид родителя можно с помощью buyword.f_find_deal_parent. Представим что у 600го родитель 532, тогда итого нам нужно получить:
3 записи id_order=600 + 7 записей 532
10 записей с id_order=489

Примечание: в массиве $arrKeysDeals только те идентификаторы, сделки которых не имеют потомков. Т.е. если 532 имеет потомка 600, то в массиве $arrKeysDeals елемента равного 532 не будет.


Надеюсь теперь лучше смогла объяснить?



Спустя 10 минут, 45 секунд (28.07.2009 - 12:57) olgatcpip написал(а):
isergi, а если

Свернутый текст
PHP
есть
 array
(
    [469] => Array
        
(
            [0] => Array
                
(
                    [parent] => 
                    
[id_order] => 469
                    
[state] => t
                    
[time] => 2009-07-23 22:00:01.562166
                    
[display] => t
                
)

            [1] => Array
                
(
                    [parent] => 
                    
[id_order] => 469
                    
[state] => t
                    
[time] => 2009-07-22 20:30:01.821388
                    
[display] => t
                
)

            [2] => Array
                
(
                    [parent] => 
                    
[id_order] => 469
                    
[state] => t
                    
[time] => 2009-07-21 19:30:02.206537
                    
[display] => t
                
)
        )
    [533] => Array
        
(
            [0] => Array
                
(
                    [parent] => 469
                    
[id_order] => 533
                    
[state] => t
                    
[time] => 2009-07-28 03:20:01.859409
                    
[display] => t
                
)

        )
    )
    
    я получаю вот такой массив 
(такой мне нужно)
    [533] => Array
        
(
            [0] => Array
                
(
                    [parent] => 469
                    
[id_order] => 533
                    
[state] => t
                    
[time] => 2009-07-28 03:20:01.859409
                    
[display] => t
                
)

            [1] => Array
                
(
                    [parent] => 
                    
[id_order] => 469
                    
[state] => t
                    
[time] => 2009-07-23 22:00:01.562166
                    
[display] => t
                
)

            [2] => Array
                
(
                    [parent] => 
                    
[id_order] => 469
                    
[state] => t
                    
[time] => 2009-07-22 20:30:01.821388
                    
[display] => t
                
)

            [3] => Array
                
(
                    [parent] => 
                    
[id_order] => 469
                    
[state] => t
                    
[time] => 2009-07-21 19:30:02.206537
                    
[display] => t
                
)
        )
    с помощью array_merge получится так 
    
[533] => Array
        
(
            [0] => Array
                
(
                    [parent] => 
                    
[id_order] => 469
                    
[state] => t
                    
[time] => 2009-07-23 22:00:01.562166
                    
[display] => t
                
)

            [1] => Array
                
(
                    [parent] => 
                    
[id_order] => 469
                    
[state] => t
                    
[time] => 2009-07-22 20:30:01.821388
                    
[display] => t
                
)

            [2] => Array
                
(
                    [parent] => 
                    
[id_order] => 469
                    
[state] => t
                    
[time] => 2009-07-21 19:30:02.206537
                    
[display] => t
                
)
        )
        
        один элемент будет потерян 
[0] => Array
                
(
                    [parent] => 469
                    
[id_order] => 533
                    
[state] => t
                    
[time] => 2009-07-28 03:20:01.859409
                    
[display] => t
                
)



Спустя 1 минута, 48 секунд (28.07.2009 - 12:59) olgatcpip написал(а):
народ как мне скрыть так много текста?

Спустя 5 минут, 31 секунда (28.07.2009 - 13:05) sergeiss написал(а):
Тогда еще один вопрос.

Алгоритм нелинейный, просто так выборку (одним простым запросом) сделать нельзя.
Чем же не нравится используемый алгоритм? Он долго работает, или просто есть желание пооптимизировать?

Спустя 6 минут, 14 секунд (28.07.2009 - 13:11) isergi написал(а):
Цитата (olgatcpip 28.07.2009 - 09:57)

а если


Ну после того как глянул на массив то понятно.

Цитата (olgatcpip 28.07.2009 - 09:59)

народ как мне скрыть так много текста? 


Он и так вроде свернутый smile.gif

Спустя 11 минут, 53 секунды (28.07.2009 - 13:23) olgatcpip написал(а):
sergeiss, есть желание оптимизировать, потому, что кол-во сделок таки может стать ооочень много и запрос будет выполняться.. не знаю, но думаю долго.
И возможно ли реализовать лучше, например с помощью функции в БД?

isergi, по началу не был свёрнут biggrin.gif


Спустя 20 минут, 41 секунда (28.07.2009 - 13:44) olgatcpip написал(а):
Может мне привести пример то как выглядит запрос в итоге? чтоб мы все немного ужаснулись? tongue.gif

Спустя 6 минут, 2 секунды (28.07.2009 - 13:50) sergeiss написал(а):
Цитата (olgatcpip @ 28.07.2009 - 14:23)
по началу не был свёрнут

Ну, это я его свернул... rolleyes.gif

Вопрос еще вот какой. Судя по кодам, "родитель" находится просто как поле из записи, безо всяких сложных многоступенчатых алгоритмов. Это я про функцию buyword.f_find_deal_parent. Я правильно понял? Если так, то зачем она вообще нужна???

Ну приведи пример, конечно. Хотя меня не напугаешь, наверное wink.gif

Спустя 18 минут, 5 секунд (28.07.2009 - 14:08) Sylex написал(а):
Цитата (olgatcpip @ 28.07.2009 - 15:47)
(один запрос экономичнее чем много запросов?

не всегда

в твоем случае я бы использовл UNION для получения сделок, а потом вторым запросом выбрал родителей (опять если надо через UNION)


_____________
Ласковое слово и кошке приятно... Плюсик в карму сойдет wink.gif
*smarty дока - новая любовь
Моё рукотворение ругайте, хвалите smile.gif
Веду маленький блог
в этом блоге публикую новые работы
WMR217126627282 wink.gif

Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.