За последние 24 часа нас посетили 17413 программистов и 1724 робота. Сейчас ищет 1481 программист ...

Непонятки при выполнении запроса

Тема в разделе "PostgreSQL", создана пользователем sir Genry, 19 янв 2011.

  1. sir Genry

    sir Genry Активный пользователь

    С нами с:
    24 сен 2010
    Сообщения:
    61
    Симпатии:
    0
    Адрес:
    Новосибирск
    Добрый день, веселая минутка.
    Коллеги, столкнулся с такой проблемой: запрос в EMS и в pgAdmin выполняется быстро (60-100 миллисекунд), а из скрипта PHP неприемлемо долго (3-4 секунды). Замеры в PHP производил функцией microtime. Но она работает криво (уже гуглил - венда зараза глючит). Так что по сути замерял секундомером. Задержек по сети нет - все на локалхосте.
    Собственно запрос:
    [sql]
    WITH RECURSIVE Tmp ("ComponentID","ParentID","Name", LVL, SRT, "Amount","ComponentType",num) AS (
    SELECT T1."ComponentID",T1."ParentID", T1."Name", 1,
    (CASE WHEN T1."ComponentType"=1 THEN 'И-'
    WHEN T1."ComponentType"=2 THEN 'У-'
    ELSE 'Д-'
    END) || TRIM(to_char(T1."Num",'000')),
    T1."Amount",T1."ComponentType",trim(to_char(T1."Num",'000')) AS num
    FROM "OrderComponents" AS T1 WHERE (T1."ParentID" = 0) AND (T1."OrderID"=1)
    UNION
    SELECT T2."ComponentID", T2."ParentID", T2."Name", LVL + 1,
    SRT ||'/'||
    (CASE WHEN T2."ComponentType"=1 THEN 'И-'
    WHEN T2."ComponentType"=2 THEN 'У-'
    ELSE 'Д-'
    END) || TRIM(to_char(T2."Num",'000')),
    T2."Amount",T2."ComponentType",trim(to_char(T2."Num",'000')) AS num
    FROM "OrderComponents" AS T2 INNER JOIN Tmp ON (Tmp."ComponentID"= T2."ParentID"))
    SELECT *, (SELECT MAX(LVL) FROM Tmp) AS MaxLvl FROM Tmp ORDER BY SRT;
    [/sql]
    Подскажите где грабли, какие настройки крутить.
     
  2. Gromo

    Gromo Активный пользователь

    С нами с:
    24 май 2010
    Сообщения:
    2.786
    Симпатии:
    2
    Адрес:
    Ташкент
    народ глянул, отписывается :)

    если сам запрос выполняется быстро, значит дело не в движке БД и не в запросе.
    надо замерить время:
    - подключения к бд
    - какого-либо простейшего запроса
    - запроса без обработки результатов
    - запроса с обработкой результатов

    так можно будет посмотреть в бутылочное горлышко
     
  3. sir Genry

    sir Genry Активный пользователь

    С нами с:
    24 сен 2010
    Сообщения:
    61
    Симпатии:
    0
    Адрес:
    Новосибирск
    Gromo
    Спасибо, дружище! :) Я знал что ты глянешь )
    В том то и дело, что другие запросы выполняются нормально. Это не первая моя форма. И даже уже не первый проект. И подобный рекурсивный запос у меня отрабатывает нормально в предыдущем проекте. Вобщем мистика какая-то...
    А не подскажешь, чем можно производить замеры? Может есть системы которые оценивают загрузку. Сэмплинг там какой-нибудь, профилирование. Ну и всякое такое. На крйняк я конечно на линуксе буду microtime-ом пользоваться, но может есть что-нибудь специальное?
    P.S. комп у меня дохлый пень4 1,4ггц, 512 мозгов
     
  4. Gromo

    Gromo Активный пользователь

    С нами с:
    24 май 2010
    Сообщения:
    2.786
    Симпатии:
    2
    Адрес:
    Ташкент
    тем же microtime. просто нужно каждый замер производить по отдельности.
    в данном случае разница не будет большой. просто обновляй страницу
    несколько раз и бери результат последнего замера.

    это конечно всё неточно, но по крайней мере поможет указать более точно место торможения
     
  5. sir Genry

    sir Genry Активный пользователь

    С нами с:
    24 сен 2010
    Сообщения:
    61
    Симпатии:
    0
    Адрес:
    Новосибирск
    Разобрался. Дело было не в бобине. Тормозит-глючит эксплорер. Конкретно в данном случае следующее:
    [js]
    Orders.Components.startWait = function() {
    if (!Orders.Components.waitBox) {
    var pos = getElementPosition(Orders.Components.Container);
    Orders.Components.waitBox = document.createElement("DIV");
    Orders.Components.waitBox.style.zIndex = getMaxZIndex();
    Orders.Components.waitBox.className = "light-overlay";
    Orders.Components.waitBox.style.width = pos.width + "px";
    Orders.Components.waitBox.style.height = pos.height + "px";
    Orders.Components.waitBox.style.left = (pos.left+2) + "px";
    Orders.Components.waitBox.style.top = (pos.top+2) + "px";
    Orders.Components.waitBox.innerHTML="<img src='img/activityanimation.gif'>";
    document.body.appendChild(Orders.Components.waitBox);
    }
    }
    [/js]
    а точнее сказать вот это: Orders.Components.waitBox.innerHTML="<img src='img/activityanimation.gif'>";