Имя: Пароль:
1C
 
Запрос через АДО и в квери аналайзере выполняется с разной скоростью
Ø
0 blackoperator
 
31.01.06
09:40
> Время выполнения прямого запроса к базе на МССКЛ сервере через квери аналайзер и АДО различается в десятки раз, причем эффект стабильнейший, и от загрузки сервера мало зависит.
> Запрос в квери аналайзере выполняется за 2 секунды, а через АДО - застывает, и через 2-3 минуты вываливается сообщение TimeOut Expired.
> В течение всей осени такого не было, эти скорости практически не различались.
> Другой запрос через АДО в этой же обработке выполняется нормально в обоих случаях.
В чем может быть причина?
1 МаксРулит
 
31.01.06
09:43
(0)Код в студию! Текст запроса и код в котором ты дергаешь его с помощью АДО, текст строки подключения тож (кстати версию АДО тож неплохо бы узнать).
2 Vladis
 
31.01.06
09:47
Наверное база выросла.
Установи CommandTimeout например
3 blackoperator
 
31.01.06
09:54
(1)Щас код запроса представлю, код обработки весь сюда закинуть невозможно (800 строк), представлю избранные места. Добавлю, что на серваке, где это происходит, не только эти глюки, идут какие-то непонятные блокировки таблиц, вызываемые самописными программами, написанными на делфях, наши программеры сейчас с этим разбираются.
Но, повторюсь, запрос в квери аналайзере несмотря на это работает.
4 blackoperator
 
31.01.06
09:57
(2)CommandTimeout установлен, но причем здесь это, в квери аналайзере запрос выполняется в д_е_с_я_т_к_и раз быстрее, чем через АДО
(1)Код запроса:
SELECT 'tovar' AS vidtov , 0 AS kodtov ,
vi.id_vendor, vig.nds,
CAST(SUM(vig.cen_buy * vig.kol_vo) AS FLOAT) AS summ,
CAST(SUM(vig.kol_vo) AS FLOAT) AS kol_vo
  FROM vendor_income vi
  INNER JOIN vendor_income_goods vig
    ON vi.id = vig.id_income
  INNER JOIN spr_goods sg
    ON vig.kod_goods = sg.id_kod
  INNER JOIN kateg kt
    ON sg.id_kateg = kt.id
  LEFT JOIN vendor_info_public vip
    ON vi.id_vendor = vip.id_vendor
  WHERE (vi.date_prih BETWEEN '20051001 00:00:00.000' AND '20051001 23:59:59.998')
    AND vi.delete_marker=0 AND vi.draft=0
    AND vi.id_vendor NOT IN (1389, 13505, 17665, 35841, 73344, 85696, 127360, 127424, 127680, 131136, 135680, 137792, 148672, 154176, 154944, 158130, 158237, 158285, 158337, 158367, 158383, 158399, 158400, 158403, 158405, 158415, 158418, 158429, 158430, 158434, 158436, 158437, 158445, 158449, 158458, 158463, 158464, 158474, 158535, 158555, 158588, 158590, 158602, 158667, 158690, 158700, 158706, 158735, 158736, 158741, 158757, 158777, 158788, 158810, 158848, 158963, 159090, 159105, 159156, 159199, 159428, 159481, 159482, 159532, 159546, 159608, 159680, 159737, 159747, 159772, 159901, 159913, 159919, 159951, 159985, 160010, 160032, 160058, 160123, 160212, 160227, 160254, 160261, 160282, 160378, 160428, 160545, 160596, 160677, 160727, 160790, 160854, 160864, 160866, 160868, 160869, 160870, 160873, 160878)
    AND kt.nom <> 31
    AND sg.id_kod NOT IN(552020, 552029, 599931, 599932, 599933, 599940)
GROUP BY vi.id_vendor, vig.nds
UNION
SELECT 'paket' AS vidtov , sg.kod AS kodtov ,
vi.id_vendor, vig.nds,
CAST(SUM(vig.cen_buy * vig.kol_vo) AS FLOAT) AS summ,
CAST(SUM(vig.kol_vo) AS FLOAT) AS kol_vo
  FROM vendor_income vi
  INNER JOIN vendor_income_goods vig
    ON vi.id = vig.id_income
  INNER JOIN spr_goods sg
    ON vig.kod_goods = sg.id_kod
  INNER JOIN kateg kt
    ON sg.id_kateg = kt.id
  LEFT JOIN vendor_info_public vip
    ON vi.id_vendor = vip.id_vendor
  WHERE (vi.date_prih BETWEEN '20051001 00:00:00.000' AND '20051001 23:59:59.998')
    AND vi.delete_marker=0 AND vi.draft=0
    AND vi.id_vendor NOT IN (1389, 13505, 17665, 35841, 73344, 85696, 127360, 127424, 127680, 131136, 135680, 137792, 148672, 154176, 154944, 158130, 158237, 158285, 158337, 158367, 158383, 158399, 158400, 158403, 158405, 158415, 158418, 158429, 158430, 158434, 158436, 158437, 158445, 158449, 158458, 158463, 158464, 158474, 158535, 158555, 158588, 158590, 158602, 158667, 158690, 158700, 158706, 158735, 158736, 158741, 158757, 158777, 158788, 158810, 158848, 158963, 159090, 159105, 159156, 159199, 159428, 159481, 159482, 159532, 159546, 159608, 159680, 159737, 159747, 159772, 159901, 159913, 159919, 159951, 159985, 160010, 160032, 160058, 160123, 160212, 160227, 160254, 160261, 160282, 160378, 160428, 160545, 160596, 160677, 160727, 160790, 160854, 160864, 160866, 160868, 160869, 160870, 160873, 160878)
    AND sg.kod IN(599931, 599932, 599933, 599940)
GROUP BY sg.kod, vi.id_vendor, vig.nds
5 Волшебник
 
31.01.06
09:57
<><>•ЬЁЧЄљЋЧИЦЇЖВС©ЧыЖШУПСщ”§д›з?Јјз«еКтд
6 Vladis
 
31.01.06
10:09
К скорости выполнения это конечно не относиться, но запрос хоть вываливаться не будет
7 blackoperator
 
31.01.06
10:16
(6) Сейчас он равен 180. Есть обстоятельства, которые не позволяют делать его больше.
(1) Фрагменты из кода 1С:
//Установка соединения с сервером:
Процедура СвершитьКоннект(ConnectionString , conn , cmd)
  conn=createObject("ADODB.Connection");
  cmd=createObject("ADODB.Command");
  conn.ConnectionTimeOut=600; //время ожидания до соединения
  conn.CommandTimeOut=180; //время ожидания результата запроса
  conn.CursorLocation=3;
  try
    conn.Open(ConnectionString);
  except
    return;
  endTry;
  status("Activating connection...");
  cmd.activeConnection=conn;
  cmd.commandType=1; //T-SQL query
КонецПроцедуры //СвершитьКоннект()
//получение рекордсета:
Функция ПолучитьРС(ТекстЗапроса,КомандаАДО)
  КомандаАДО.commandText=ТекстЗапроса;
  rs=createObject("ADODB.RecordSet");
  status("Executing query...");
  rs=КомандаАДО.Execute;
  Возврат rs;
КонецФункции
//в одной из функций - вызов функции ПолучитьРС:
Возврат ПолучитьРС(queryText,cmdP);
(queryText - см. текст запроса выше)
//строка инициализации:
"driver={SQL Server}; server=myserver; user id=myid; pwd=mypwd; Database=mydb"
Программист всегда исправляет последнюю ошибку.