Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.07.2014, 09:02   #1
5cek
Форумчанин
 
Регистрация: 04.07.2013
Сообщений: 118
Вопрос Большое время выполнения запроса

Здравствуйте, вообще проблема такова, работаю с базой через UniDac а именно UniQuery, в базе данных (PostgreSQL) есть представление, вызов представления из pgadmin происходит около 80-150 милисекунд, в то время как в Delphi когда я вызываю его, программа висит около 4-6 секунд, что является не позволительной роскошью, все не как не пойму в чем причина такой "скорости"?

Запрос на вызов представления:
Код:
SELECT *
  FROM plan_and_bid_and_fact_view 
  WHERE id_uch=4 
            AND date='04.04.2014'
5cek вне форума Ответить с цитированием
Старый 25.07.2014, 09:25   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

не работал с UniDac, поэтому, предположим, что косяк не в нём, а в том, что Delphi очень должно получает результат выборки!

Сколько полей в одной записи? Нет ли длинных (blob или varchar(xxxxx)) полей?
Сколько записей возвращается в результате (может 100000 имеет id_uch=4 и нужную дату)?

попробуйте такой запрос для определения количества записей (и проверьте, сколько он выполняется):
Код:
SELECT count(*)
  FROM plan_and_bid_and_fact_view 
  WHERE id_uch=4 
            AND date='04.04.2014'
попробуйте такой запрос для исключения проблем с большим объёмом данных (и проверьте, сколько он выполняется)
Код:
SELECT id_uch
  FROM plan_and_bid_and_fact_view 
  WHERE id_uch=4 
            AND date='04.04.2014'

p.s. для даты лучше использовать не константы, а параметрические запросы, где дата передаётся в запрос в качестве параметра.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 25.07.2014, 09:25   #3
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

а если выполнить запрос второй раз (не закрывая программу) ?
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 25.07.2014, 09:36   #4
5cek
Форумчанин
 
Регистрация: 04.07.2013
Сообщений: 118
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
[I]
попробуйте такой запрос для определения количества записей (и проверьте, сколько он выполняется):
Код:
SELECT count(*)
  FROM plan_and_bid_and_fact_view 
  WHERE id_uch=4 
            AND date='04.04.2014'
попробуйте такой запрос для исключения проблем с большим объёмом данных (и проверьте, сколько он выполняется)
Код:
SELECT id_uch
  FROM plan_and_bid_and_fact_view 
  WHERE id_uch=4 
            AND date='04.04.2014'
Попробовал оба запроса, время осталось не изменым. Вообще у меня связка DBGridEh + UniQuery, другие запросы выполняются быстро, но это больше относится к тем которые не являются вызовом представления.

Цитата:
Сообщение от evg_m Посмотреть сообщение
а если выполнить запрос второй раз (не закрывая программу) ?
А я как раз для того что бы написать время выполнения и вызывал запрос несколько раз подряд, разница +/- 1секунда.
5cek вне форума Ответить с цитированием
Старый 25.07.2014, 09:37   #5
5cek
Форумчанин
 
Регистрация: 04.07.2013
Сообщений: 118
По умолчанию

Больше склоняюсь к тому что это представление, хотя не очень понятно почему оно тормозит только при вызове из Delphi.
Код представления:
Код:
 SELECT pbf.date, pbf.id_class, pbf.category, pbf.id_uch, pbf.half1, pbf.half2, 
    pbf.fact_half1, pbf.fact_half2, pbf.plan_half1, pbf.plan_half2, 
    pbf.food_view, class.time_to_close, class.date_open_for_food
   FROM ( SELECT COALESCE(t.date, z.date) AS date, 
            COALESCE(t.id_class, z.id_class) AS id_class, 
            COALESCE(t.category, z.category) AS category, 
            COALESCE(t.id_uch, z.id_uch) AS id_uch, 
            COALESCE(t.half1, 0::bigint) AS half1, 
            COALESCE(t.half2, 0::bigint) AS half2, 
            COALESCE(t.fact_half1, 0::bigint) AS fact_half1, 
            COALESCE(t.fact_half2, 0::bigint) AS fact_half2, 
            COALESCE(z.plan_half1, 0::bigint) AS plan_half1, 
            COALESCE(z.plan_half2, 0::bigint) AS plan_half2, 
            COALESCE(z.food_view::smallint, 0::smallint) AS food_view
           FROM ( SELECT COALESCE(b.date, f.date) AS date, 
                    COALESCE(b.id_class, f.id_class) AS id_class, 
                    COALESCE(b.id_uch, f.id_uch) AS id_uch, 
                    COALESCE(b.category, f.category) AS category, 
                    COALESCE(b.half1, 0::bigint) AS half1, 
                    COALESCE(b.half2, 0::bigint) AS half2, 
                    COALESCE(f.fact_half1, 0::bigint) AS fact_half1, 
                    COALESCE(f.fact_half2, 0::bigint) AS fact_half2
                   FROM schemefood.bid_itog_view b
              FULL JOIN schemefood.fact_itog_view f ON b.date = f.date AND b.id_class = f.id_class AND b.category = f.category AND b.id_uch = f.id_uch) t
      FULL JOIN schemefood.plan_itog_view z ON t.date = z.date AND t.id_class = z.id_class AND t.category = z.category) pbf, 
    schemefood.class
  WHERE pbf.id_class = class.id;
Суть его следющая, есть ещё три небольших представления (bid_itog_view, fact_itog_view, plan_itog_view) каждый из которых считает свои колонки, в данном представлении отображаются все вычисляемые колонки из трех представлений.

Кстати говоря забыл упомянуть что данных представление возвращает не много 107 строк.

Вообщем, нашел проблему, проблема была именно в TUniConnection, в настройках я указал схему в базе данных, без схемы, работает мгновенно, со схемой опять двадцать пять.

Последний раз редактировалось Stilet; 25.07.2014 в 10:49.
5cek вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Большое время ожидания ответа сервера pest11 БД в Delphi 9 29.03.2012 08:16
Как можно уменьшить время выполнения запроса. ajevgen PHP 4 07.09.2011 15:55
Ошибка выполнения запроса Maks57 БД в Delphi 1 01.06.2010 01:12
Ошибка выполнения запроса Maks57 Помощь студентам 0 31.05.2010 23:44
время выполнения SOAP запроса hotman Java для Web (EE, Servlet, JSP, Tomcat, Spring MVC) 0 04.06.2009 13:32