Переключение на Главную Страницу Страницы: [1]  ОтправитьПечать
Очень популярная тема (более 25 ответов) Запрос из 1С к SQL не 1С. (число прочтений - 13079 )
KARLSON
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 21
Зарегистрирован: 27. Января 2007
Запрос из 1С к SQL не 1С.
27. Января 2007 :: 18:51
Печать  
Очень долго происходит перебор результатов ~ 6800 строк за 34 мнуты...
     Запрос = "SELECT
     |    ARTIKLS.ANUMB AS ARTICLE_PROF,
     |    ARTSVST.ASKL1 AS ARTICLE_SKLAD,
     |    ARTSVST.ASKL2 AS ARTICLE_1C,
     |    ARTIKLS.ANAME AS NOMNAME,
     |    ARTSVST.CLPRV AS TARIF_ED_IZM,
     |    COLSLST.CNAME AS CVET_TEKSTURI,
     |    COLSLST.CNAMP AS CVET_ARTICLE,
     |    ARTSVST.CLPRC AS TARIF_OSN_TEKSTURI,
     |    ARTSVST.CLPR1 AS TARIF_VNUTR_TEKSTURI,
     |    ARTSVST.CLPR2 AS TARIF_VNESHN_TEKSTURI,
     |    ARTSVST.CLPRA AS TARIF_DVUHSTORONNEY_TEKSTURI,
     |    GRUPART.MNAME AS NOMGRUPNAME,
     |    GRUPART.MUNIC AS GRUPUNICNOMER,
     |    ARTIKLS.NUNIC AS KATEGORYUNICNOMER,
     |    ARTIKLS.APREF AS KATEGORY,
     |    ARTIKLS.ANAMP AS NOMNAMECONTR,
     |    CORRENC.CNAME AS VALUTE,
     |    CASE
     |        WHEN ARTIKLS.ATYPI = 1 THEN 'пог.м.'
     |        WHEN ARTIKLS.ATYPI = 2 THEN 'м.кв.'
     |        WHEN ARTIKLS.ATYPI = 3 THEN 'шт'
     |        WHEN ARTIKLS.ATYPI = 5 THEN 'компл.'
     |        ELSE 'неизвестно'
     |    END AS ED_IZM
     |
     |   FROM COLSLST
     |   RIGHT OUTER JOIN ARTSVST ON (COLSLST.CNUMB = ARTSVST.CLNUM)
     |   RIGHT OUTER JOIN ARTIKLS ON (ARTSVST.ANUMB = ARTIKLS.ANUMB)
     |   LEFT OUTER JOIN CORRENC ON (ARTIKLS.CNUMB = CORRENC.CNUMB)
     |   LEFT OUTER JOIN GRUPART ON (ARTIKLS.MUNIC = GRUPART.MPREF)
     |";
     
     
   //Загружаем компоненту
   Если ЗагрузитьВнешнююКомпоненту(КаталогПрограммы() + "1CPP.DLL")=0 Тогда
       ок=0;
   КонецЕсли;
     
     Попытка
           ЛокDB = СоздатьОбъект("ODBCDataBase");
     Исключение
           Сообщить(ОписаниеОшибки());
           Сообщить("Компонента 1С++ не обнаружена","!!");
           Возврат;
     КонецПопытки;
     ЛокODBC = СоздатьОбъект("ODBCRecordSet");
     Сообщить("Начало соединения: " + ТекущееВремя());  
     ЛокDB.Соединение("driver={Firebird/Interbase(r) \BASE.gdb");    
     
     Если ЛокDB.ЕстьСоединение() = 1 Тогда
           Сообщить("Конец соединения: " + ТекущееВремя());
     Иначе
           Возврат;
     КонецЕсли;
     
     ЛокODBC.УстБД(ЛокDB);
     Сообщить("Начало выполнения запроса: " + ТекущееВремя());
     Если ЛокODBC.Открыть(Запрос) = 0 Тогда
           Сообщить("Запрос не выполнен!", "!!!");
           Возврат;
     КонецЕсли;

     Если ЛокODBC.ВыборкаОткрыта() = 0 Тогда
           Сообщить("Выборка не открыта", "!!!");
     КонецЕсли;
     
     Сообщить("Начало проход по запросу: " + ТекущееВремя());
     ВсегоСтрок = 0;
     Пока ЛокODBC.След() = 1 Цикл
           ВсегоСтрок = ВсегоСтрок + 1;
           Состояние(ВсегоСтрок);
     КонецЦикла;                    
     Сообщить("Всего строк: " + ВсегоСтрок, "!!!");
     Сообщить("Конец прохода по запросу: " + ТекущееВремя());
     
     //ЛокODBC.ВыполнитьИнструкцию(Запрос, ТЗSQL, 1);
     Сообщить("Конец подготовки запроса: " + ТекущееВремя());
     

     Сообщить("Конец : " + ТекущееВремя());
     ЗначениеВФайл(КаталогИБ() + "Профстрой", ТЗSQL, 1);
     ЛокDB.Закрыть();
« Последняя редакция: 29. Января 2007 :: 07:38 - KARLSON »  
Наверх
 
IP записан
 
Arta
1c++ power user
Отсутствует



Сообщений: 2537
Местоположение: Нижний Новгород
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Запрос из 1С к SQL не 1С.
Ответ #1 - 27. Января 2007 :: 19:35
Печать  
ЛокODBC.След() и т.д. - использовать не рекоммендуется...

Пользуй ТЗ = RS.ВыполнитьИнструкцию(ТекстЗапроса, , 1);

и играйся уже с ТЗ.
  
Наверх
 
IP записан
 
KARLSON
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 21
Зарегистрирован: 27. Января 2007
Re: Запрос из 1С к SQL не 1С.
Ответ #2 - 28. Января 2007 :: 10:26
Печать  
В таблицу выгружает тоже 34 минуты...
  
Наверх
 
IP записан
 
Arta
1c++ power user
Отсутствует



Сообщений: 2537
Местоположение: Нижний Новгород
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Запрос из 1С к SQL не 1С.
Ответ #3 - 28. Января 2007 :: 18:22
Печать  
Так индексы расставь.
  
Наверх
 
IP записан
 
KARLSON
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 21
Зарегистрирован: 27. Января 2007
Re: Запрос из 1С к SQL не 1С.
Ответ #4 - 28. Января 2007 :: 20:29
Печать  
Поясните пожалуйста....какие индексы?
  
Наверх
 
IP записан
 
Arta
1c++ power user
Отсутствует



Сообщений: 2537
Местоположение: Нижний Новгород
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Запрос из 1С к SQL не 1С.
Ответ #5 - 28. Января 2007 :: 21:08
Печать  
KARLSON писал(а) 28. Января 2007 :: 20:29:
Поясните пожалуйста....какие индексы?


так... сперва нужны азы. идешь на www.sql.ru, и читаешь факи.
Индексы нужны на:
COLSLST.CNUMB, ARTSVST.CLNUM
ARTSVST.ANUMB, ARTIKLS.ANUMB
ARTIKLS.CNUMB, CORRENC.CNUMB
ARTIKLS.MUNIC, GRUPART.MPREF


Время выполнения такого запроса при попадении в индекс от силы доля секунды.
  
Наверх
 
IP записан
 
KARLSON
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 21
Зарегистрирован: 27. Января 2007
Re: Запрос из 1С к SQL не 1С.
Ответ #6 - 28. Января 2007 :: 21:13
Печать  
Время выполнения запроса минимально.
Очень долго обрабатывается результат запроса. Т.е. сперва выхватыват 104 строки, потом еще 30 потом еще несколько десятков и т.д.
  
Наверх
 
IP записан
 
Arta
1c++ power user
Отсутствует



Сообщений: 2537
Местоположение: Нижний Новгород
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Запрос из 1С к SQL не 1С.
Ответ #7 - 29. Января 2007 :: 07:30
Печать  
Я еще раз образу твое внимание на ВыполнитьИнструкцию(). Этот метод получает данные одним махом. Никаких обходов выборки не нужно.
Тебе нужно оставить:

Код
Выбрать все
RS = СоздатьОбъект("ODBCRecorset");
// Если база на том же сервере что и 1С, и пользователь имеет права на доступ к твоей базе,
// то обращение позможно так: Select from [НазваниеБазы].[dbo].ИмяТаблицы
// Т.е. достаточно только создать рекордсет.
ТекстЗапроса = "Бла бла бла";
ТЗ = RS.ВыполнитьИнструкцию(ТекстЗапроса,  , 1);
 


  
Наверх
 
IP записан
 
KARLSON
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 21
Зарегистрирован: 27. Января 2007
Re: Запрос из 1С к SQL не 1С.
Ответ #8 - 29. Января 2007 :: 07:31
Печать  
Я пробовал этим методом...отличий вообще нет...те же 34 минуты...
Может это из-за того что база на Firebird?
  
Наверх
 
IP записан
 
Arta
1c++ power user
Отсутствует



Сообщений: 2537
Местоположение: Нижний Новгород
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Запрос из 1С к SQL не 1С.
Ответ #9 - 29. Января 2007 :: 07:37
Печать  
Я сообщение обновил, не знал что разговор идет про firebird.

Тогда перед RS сперва подключишь DB.

Если ВыполнитьИнструкцию выполняется долго, значит проблема в индексах.
  
Наверх
 
IP записан
 
Arta
1c++ power user
Отсутствует



Сообщений: 2537
Местоположение: Нижний Новгород
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Запрос из 1С к SQL не 1С.
Ответ #10 - 29. Января 2007 :: 07:39
Печать  
Код
Выбрать все
DB = СоздатьОбъект("ODBCDatabase");
DB.Соединение("driver={Firebird/Interbase(r)
\BASE.gdb");
RS = СоздатьОбъект("ODBCRecordSet");
RS.SetDatabase(DB);

ТекстЗапроса = "Бла бла бла";
ТЗ = ВыполнитьИнструкцию(ТекстЗапроса, , 1);
ТЗ.ВыбратьСтроку();

 

  
Наверх
 
IP записан
 
KARLSON
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 21
Зарегистрирован: 27. Января 2007
Re: Запрос из 1С к SQL не 1С.
Ответ #11 - 29. Января 2007 :: 07:39
Печать  
Начало соединения: 00:42:54
Конец соединения: 00:42:54
Начало выполнения запроса: 00:42:54
Начало проход по запросу: 00:43:13
100 : 00:43:26
200 : 00:43:26
300 : 00:45:00
400 : 00:45:05
500 : 00:45:10
600 : 00:45:17
700 : 00:45:49
800 : 00:45:56
900 : 00:46:00
1000 : 00:46:01
1100 : 00:46:03
1200 : 00:46:09
1300 : 00:46:13
1400 : 00:47:09
1500 : 00:47:10
1600 : 00:47:12
1700 : 00:47:14
1800 : 00:47:16
1900 : 00:47:19
2000 : 00:47:28
2100 : 00:47:30
2200 : 00:47:42
2300 : 00:47:44
2400 : 00:47:46
2500 : 00:47:48
2600 : 00:47:50
2700 : 00:47:51
2800 : 00:48:50
2900 : 00:49:26
3000 : 00:49:29
3100 : 00:49:33
3200 : 00:49:35
3300 : 00:49:36
3400 : 00:49:39
3500 : 00:50:32
3600 : 00:52:02
3700 : 00:53:40
3800 : 00:56:12
3900 : 00:58:13
4000 : 00:59:34
4100 : 01:01:46
4200 : 01:02:21
4300 : 01:04:16
4400 : 01:04:20
4500 : 01:04:29
4600 : 01:04:51
4700 : 01:04:55
4800 : 01:06:44
4900 : 01:08:27
5000 : 01:08:52
5100 : 01:08:54
5200 : 01:08:55
5300 : 01:08:57
5400 : 01:08:59
5500 : 01:09:03
5600 : 01:09:05
5700 : 01:09:06
5800 : 01:09:14
5900 : 01:11:52
6000 : 01:12:19
6100 : 01:13:28
6200 : 01:13:30
6300 : 01:13:32
6400 : 01:14:01
6500 : 01:14:23
6600 : 01:16:44
6700 : 01:16:51
6800 : 01:17:00
Всего строк: 6877
Конец прохода по запросу: 01:17:00
Конец : 01:17:00
  
Наверх
 
IP записан
 
KARLSON
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 21
Зарегистрирован: 27. Января 2007
Re: Запрос из 1С к SQL не 1С.
Ответ #12 - 29. Января 2007 :: 07:41
Печать  
Сам запрос выполняется за 19 сек...
Объясните что за индексы
  
Наверх
 
IP записан
 
Arta
1c++ power user
Отсутствует



Сообщений: 2537
Местоположение: Нижний Новгород
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Запрос из 1С к SQL не 1С.
Ответ #13 - 29. Января 2007 :: 07:44
Печать  
Я выше написал, как нужно написать код, попробуй...
  
Наверх
 
IP записан
 
KARLSON
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 21
Зарегистрирован: 27. Января 2007
Re: Запрос из 1С к SQL не 1С.
Ответ #14 - 29. Января 2007 :: 08:13
Печать  
Делаю по вашему коду (до этого тоже делал...но для чистоты эксперимента) 1С -ка висит уже 28 мин...еще 6 мин и все будет сделано ))...так что это не выход. Может еще какие варианты?
  
Наверх
 
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Запрос из 1С к SQL не 1С.
Ответ #15 - 29. Января 2007 :: 08:16
Печать  
Покажи полный код работы через ТаблицуЗначений, наподобие того, что ты дал в первом сообщении.
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer && tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
KARLSON
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 21
Зарегистрирован: 27. Января 2007
Re: Запрос из 1С к SQL не 1С.
Ответ #16 - 29. Января 2007 :: 08:19
Печать  
Процедура ЗагрКомпоненту()
    //Загружаем компоненту
    Если ЗагрузитьВнешнююКомпоненту(КаталогПрограммы() + "1CPP.DLL")=0 Тогда
       ок=0;
    КонецЕсли;
КонецПроцедуры
//*******************************************
Процедура  Сформировать()
     
     ТЗSQL = СоздатьОбъект("ТаблицаЗначений");
     
     Запрос = "SELECT 
     |    ARTIKLS.ANUMB AS ARTICLE_PROF,
     |    ARTSVST.ASKL1 AS ARTICLE_SKLAD,
     |    ARTSVST.ASKL2 AS ARTICLE_1C,
     |    ARTIKLS.ANAME AS NOMNAME,
     |    ARTSVST.CLPRV AS TARIF_ED_IZM,
     |    COLSLST.CNAME AS CVET_TEKSTURI,
     |    COLSLST.CNAMP AS CVET_ARTICLE,
     |    ARTSVST.CLPRC AS TARIF_OSN_TEKSTURI,
     |    ARTSVST.CLPR1 AS TARIF_VNUTR_TEKSTURI,
     |    ARTSVST.CLPR2 AS TARIF_VNESHN_TEKSTURI,
     |    ARTSVST.CLPRA AS TARIF_DVUHSTORONNEY_TEKSTURI,
     |    GRUPART.MNAME AS NOMGRUPNAME,
     |    GRUPART.MUNIC AS GRUPUNICNOMER,
     |    ARTIKLS.NUNIC AS KATEGORYUNICNOMER,
     |    ARTIKLS.APREF AS KATEGORY,
     |    ARTIKLS.ANAMP AS NOMNAMECONTR,
     |    CORRENC.CNAME AS VALUTE,
     |    CASE
     |        WHEN ARTIKLS.ATYPI = 1 THEN 'пог.м.'
     |        WHEN ARTIKLS.ATYPI = 2 THEN 'м.кв.'
     |        WHEN ARTIKLS.ATYPI = 3 THEN 'шт'
     |        WHEN ARTIKLS.ATYPI = 5 THEN 'компл.'
     |        ELSE 'неизвестно'
     |    END AS ED_IZM
     |
     |   FROM COLSLST
     |   RIGHT OUTER JOIN ARTSVST ON (COLSLST.CNUMB = ARTSVST.CLNUM)
     |   RIGHT OUTER JOIN ARTIKLS ON (ARTSVST.ANUMB = ARTIKLS.ANUMB)
     |   LEFT OUTER JOIN CORRENC ON (ARTIKLS.CNUMB = CORRENC.CNUMB)
     |   LEFT OUTER JOIN GRUPART ON (ARTIKLS.MUNIC = GRUPART.MPREF)
     |";
     
     
     
     Попытка
           ЛокDB = СоздатьОбъект("ODBCDataBase");
     Исключение
           Сообщить(ОписаниеОшибки());
           Сообщить("Компонента 1С++ не обнаружена","!!");
           Возврат;
     КонецПопытки;
     ЛокODBC = СоздатьОбъект("ODBCRecordSet");
     Сообщить("Начало соединения: " + ТекущееВремя());   
     ЛокDB.Соединение("DRIVER={Gemini InterBase ODBC Driver 2.0};uid=SYSDBA;pwd=masterkey;database=C:\ProfSegment\Profstroy3\BASE.gdb");   
     
     Если ЛокDB.ЕстьСоединение() = 1 Тогда
           Сообщить("Конец соединения: " + ТекущееВремя());
     Иначе
           Сообщить(ЛокODBC.ПолучитьОписаниеОшибки());
           Возврат;
     КонецЕсли;
     
     ЛокODBC.УстБД(ЛокDB);
     ТЗSQL = ЛокODBC.ВыполнитьИнструкцию(Запрос, , 1);
     Сообщить("В ТЗSQL находится " + Строка(ТЗSQL.КоличествоСтрок()) + " строк.");
     Сообщить("Конец : " + ТекущееВремя());
     ЗначениеВФайл(КаталогИБ() + "Профстрой", ТЗSQL, 1);
     ЛокDB.Закрыть();
  
Наверх
 
IP записан
 
KARLSON
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 21
Зарегистрирован: 27. Января 2007
Re: Запрос из 1С к SQL не 1С.
Ответ #17 - 29. Января 2007 :: 08:24
Печать  
Скорость выполнения даже меньше, чем простым перебором...
Начало работы в 10-44 сейчас 11-20 и еще не конец...
  
Наверх
 
IP записан
 
RaiN
YaBB Newbies
*
Отсутствует


I Love YaBB 2!

Сообщений: 10
Зарегистрирован: 26. Января 2007
Re: Запрос из 1С к SQL не 1С.
Ответ #18 - 29. Января 2007 :: 08:27
Печать  
KARLSON писал(а) 29. Января 2007 :: 08:19:
....
     
     ЛокODBC.УстБД(ЛокDB);
     ТЗSQL = ЛокODBC.ВыполнитьИнструкцию(Запрос, , 1);
     Сообщить("В ТЗSQL находится " + Строка(ТЗSQL.КоличествоСтрок()) + " строк.");
     Сообщить("Конец : " + ТекущееВремя());
     ЗначениеВФайл(КаталогИБ() + "Профстрой", ТЗSQL, 1);
     ЛокDB.Закрыть();


А где код который выдаёт вот эту красоту?

Код
Выбрать все
Начало соединения: 00:42:54
Конец соединения: 00:42:54
Начало выполнения запроса: 00:42:54
Начало проход по запросу: 00:43:13
100 : 00:43:26
200 : 00:43:26
300 : 00:45:00
400 : 00:45:05
500 : 00:45:10
600 : 00:45:17
...
 

  
Наверх
 
IP записан
 
KARLSON
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 21
Зарегистрирован: 27. Января 2007
Re: Запрос из 1С к SQL не 1С.
Ответ #19 - 29. Января 2007 :: 08:31
Печать  
Обработка была возвращена в исходное состояние т.е. без ТЗSQL и восстанавливал в окошке форума.
Эту крастоту в таком контексте не выдаш т.к. не перебора по строкам сразу в ТЗ...
Начало соединения: 10:44:37
Конец соединения: 10:44:37
Начало выполнения запроса: 10:44:37
Конец : 11:19:04
  
Наверх
 
IP записан
 
villy
Senior Member
****
Отсутствует



Сообщений: 287
Зарегистрирован: 24. Мая 2006
Пол: Мужской
Re: Запрос из 1С к SQL не 1С.
Ответ #20 - 29. Января 2007 :: 08:31
Печать  
KARLSON ты это сообщение прочитал или воплотил в жизнь?

Arta писал(а) 28. Января 2007 :: 21:08:
KARLSON писал(а) 28. Января 2007 :: 20:29:
Поясните пожалуйста....какие индексы?


так... сперва нужны азы. идешь на www.sql.ru, и читаешь факи.
Индексы нужны на:
COLSLST.CNUMB, ARTSVST.CLNUM
ARTSVST.ANUMB, ARTIKLS.ANUMB
ARTIKLS.CNUMB, CORRENC.CNUMB
ARTIKLS.MUNIC, GRUPART.MPREF


Время выполнения такого запроса при попадении в индекс от силы доля секунды.

  
Наверх
IP записан
 
KARLSON
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 21
Зарегистрирован: 27. Января 2007
Re: Запрос из 1С к SQL не 1С.
Ответ #21 - 29. Января 2007 :: 08:36
Печать  
Это сообщение прочитал. В жизнь не воплотил т.к. скорость выполнения запроса устраивает 19 сек.
  
Наверх
 
IP записан
 
RaiN
YaBB Newbies
*
Отсутствует


I Love YaBB 2!

Сообщений: 10
Зарегистрирован: 26. Января 2007
Re: Запрос из 1С к SQL не 1С.
Ответ #22 - 29. Января 2007 :: 08:37
Печать  
Цитата:
KARLSON ты это сообщение прочитал или воплотил в жизнь?

Arta писал(а) 28. Января 2007 :: 21:08:
KARLSON писал(а) 28. Января 2007 :: 20:29:
Поясните пожалуйста....какие индексы?


так... сперва нужны азы. идешь на www.sql.ru, и читаешь факи.
Индексы нужны на:
COLSLST.CNUMB, ARTSVST.CLNUM
ARTSVST.ANUMB, ARTIKLS.ANUMB
ARTIKLS.CNUMB, CORRENC.CNUMB
ARTIKLS.MUNIC, GRUPART.MPREF


Время выполнения такого запроса при попадении в индекс от силы доля секунды.




Присоединяюсь, т.к. проблема с базой. Если строк в исходных таблица несколько десятков тысяч, то 19 мин. нормальное время выполнения запроса.
  
Наверх
 
IP записан
 
KARLSON
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 21
Зарегистрирован: 27. Января 2007
Re: Запрос из 1С к SQL не 1С.
Ответ #23 - 29. Января 2007 :: 08:40
Печать  
19 СЕКУНД.
     Сообщить("Начало выполнения запроса: " + ТекущееВремя());
     Если ЛокODBC.Открыть(Запрос) = 0 Тогда
           Сообщить("Запрос не выполнен!", "!!!");
           Возврат;
     //Иначе
     //      Сообщить("В запрос попало " + ЛокODBC.СтрокОбработанно());
     КонецЕсли;
     Если ЛокODBC.ВыборкаОткрыта() = 0 Тогда
           Сообщить("Выборка не открыта", "!!!");
     КонецЕсли;
     
     Сообщить("Начало проход по запросу: " + ТекущееВремя());
Начало выполнения запроса: 00:42:54
Начало проход по запросу: 00:43:13
  
Наверх
 
IP записан
 
RaiN
YaBB Newbies
*
Отсутствует


I Love YaBB 2!

Сообщений: 10
Зарегистрирован: 26. Января 2007
Re: Запрос из 1С к SQL не 1С.
Ответ #24 - 29. Января 2007 :: 08:43
Печать  
KARLSON писал(а) 29. Января 2007 :: 08:40:
19 СЕКУНД.
     Сообщить("Начало выполнения запроса: " + ТекущееВремя());
     Если ЛокODBC.Открыть(Запрос) = 0 Тогда
           Сообщить("Запрос не выполнен!", "!!!");
           Возврат;
     //Иначе
     //      Сообщить("В запрос попало " + ЛокODBC.СтрокОбработанно());
     КонецЕсли;
     Если ЛокODBC.ВыборкаОткрыта() = 0 Тогда
           Сообщить("Выборка не открыта", "!!!");
     КонецЕсли;
     
     Сообщить("Начало проход по запросу: " + ТекущееВремя());
Начало выполнения запроса: 00:42:54
Начало проход по запросу: 00:43:13



И какой код дальше?
  
Наверх
 
IP записан
 
KARLSON
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 21
Зарегистрирован: 27. Января 2007
Re: Запрос из 1С к SQL не 1С.
Ответ #25 - 29. Января 2007 :: 08:44
Печать  
В первом посте
  
Наверх
 
IP записан
 
Arta
1c++ power user
Отсутствует



Сообщений: 2537
Местоположение: Нижний Новгород
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Запрос из 1С к SQL не 1С.
Ответ #26 - 29. Января 2007 :: 08:50
Печать  
Я ничего не понял. Перечел с момента моего последнего поста и ничего не понял.
то запрос выполняется с 10:44 до 11:20, то 19 секунд. То устраивает, то нет...

Данные с сервера получил? За 19 сек? Это тебя устраивает? /меня бы не устроили такие тормоза/
В чем проблема теперь?
  
Наверх
 
IP записан
 
Arta
1c++ power user
Отсутствует



Сообщений: 2537
Местоположение: Нижний Новгород
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Запрос из 1С к SQL не 1С.
Ответ #27 - 29. Января 2007 :: 08:52
Печать  
И зачем ты пользуешь:
ЛокODBC.Открыть(Запрос), ЛокODBC.ВыборкаОткрыта()?

Я нужный код тебе написал. Остается его только доделать под выгрузку и все.
  
Наверх
 
IP записан
 
KARLSON
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 21
Зарегистрирован: 27. Января 2007
Re: Запрос из 1С к SQL не 1С.
Ответ #28 - 29. Января 2007 :: 08:58
Печать  
Он скорее всего(т.к. если закрыть в ТаскМанагере FBSERV.exe ТЗSQL выйдет с тем количеством строк  которое успела получить) везде выполняется 19 секунд.

Только если мы не грузим в ТаблицуЗначений можно узнать за сколько выполнился запрос т.к. запрос выполняется, а потом начинается процесс получения данных (Который и тормозит т.е. ~34 минуты).


ЛокODBC.Открыть(Запрос);
~19 сек.
Пока ЛокODBC.След() = 1 Цикл
и т.д.

При методе
ТЗSQL = ЛокODBC.ВыполнитьИнструкцию(Запрос, , 1);
Запрос выполняется и начинается заполнение ТЗSQL и я не могу сказать время выполнения запроса т.к. 1С в это время висит
  
Наверх
 
IP записан
 
KARLSON
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 21
Зарегистрирован: 27. Января 2007
Re: Запрос из 1С к SQL не 1С.
Ответ #29 - 29. Января 2007 :: 09:00
Печать  
Я воспользовался Вашим советом, но ничего не поменялось

    Попытка
          ЛокDB = СоздатьОбъект("ODBCDataBase");
     Исключение
          Сообщить(ОписаниеОшибки());
          Сообщить("Компонента 1С++ не обнаружена","!!");
          Возврат;
     КонецПопытки;
     ЛокODBC = СоздатьОбъект("ODBCRecordSet");
     Сообщить("Начало соединения: " + ТекущееВремя());   
     ЛокDB.Соединение("DRIVER={Gemini InterBase ODBC Driver 2.0};uid=SYSDBA;pwd=masterkey;database=C:\ProfSegment\Profstroy3\BASE.gdb");    
     
     Если ЛокDB.ЕстьСоединение() = 1 Тогда
          Сообщить("Конец соединения: " + ТекущееВремя());
     Иначе 
          Сообщить(ЛокODBC.ПолучитьОписаниеОшибки());
          Возврат;
     КонецЕсли; 
     
     ЛокODBC.УстБД(ЛокDB);
     ТЗSQL = ЛокODBC.ВыполнитьИнструкцию(Запрос, , 1); 
Выполняется такое же количество времени...
  
Наверх
 
IP записан
 
Arta
1c++ power user
Отсутствует



Сообщений: 2537
Местоположение: Нижний Новгород
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Запрос из 1С к SQL не 1С.
Ответ #30 - 29. Января 2007 :: 09:01
Печать  
Т.е. 34 минуты занимает именно передача данных???
1CPP тут уже не виновата, это драйвер ODBC. Или у тебя сервер по 19200 подключен через компорт? Подмигивание
  
Наверх
 
IP записан
 
villy
Senior Member
****
Отсутствует



Сообщений: 287
Зарегистрирован: 24. Мая 2006
Пол: Мужской
Re: Запрос из 1С к SQL не 1С.
Ответ #31 - 29. Января 2007 :: 09:02
Печать  
имхо, создать индексы и юзать "ТЗSQL = ЛокODBC.ВыполнитьИнструкцию(Запрос, , 1);". еще лучше было бы использовать ms sql server вместо interbase.
  
Наверх
IP записан
 
KARLSON
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 21
Зарегистрирован: 27. Января 2007
Re: Запрос из 1С к SQL не 1С.
Ответ #32 - 29. Января 2007 :: 09:05
Печать  
Кстати из Фака на sql.ru цитата:

Оказывается, при выполнении запроса сервер выдает записи клиенту (приложению) по очереди и по одной записи. Причем только "сверху вниз". Как только записи на сервере кончились, сервер сообщает клиенту об этом сигналом EOF вместо выдачи очередной записи. Конечно, в некоторых современных серверах есть произвольное позиционирование и проход по выборке не только сверху вниз но и в обратном порядке, но это требует от сервера достаточно больших ресурсов.

  
Наверх
 
IP записан
 
KARLSON
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 21
Зарегистрирован: 27. Января 2007
Re: Запрос из 1С к SQL не 1С.
Ответ #33 - 29. Января 2007 :: 09:06
Печать  
Цитата:
имхо, создать индексы и юзать "ТЗSQL = ЛокODBC.ВыполнитьИнструкцию(Запрос, , 1);". еще лучше было бы использовать ms sql server вместо interbase.


Драйверами для SQL, Firebird база не открывается. И я не могу править базу на FireBird....
  
Наверх
 
IP записан
 
villy
Senior Member
****
Отсутствует



Сообщений: 287
Зарегистрирован: 24. Мая 2006
Пол: Мужской
Re: Запрос из 1С к SQL не 1С.
Ответ #34 - 29. Января 2007 :: 09:10
Печать  
KARLSON писал(а) 29. Января 2007 :: 09:06:
Цитата:
имхо, создать индексы и юзать "ТЗSQL = ЛокODBC.ВыполнитьИнструкцию(Запрос, , 1);". еще лучше было бы использовать ms sql server вместо interbase.


Драйверами для SQL, Firebird база не открывается. И я не могу править базу на FireBird....


я не про драйверы, я про серверы
  
Наверх
IP записан
 
Arta
1c++ power user
Отсутствует



Сообщений: 2537
Местоположение: Нижний Новгород
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Запрос из 1С к SQL не 1С.
Ответ #35 - 29. Января 2007 :: 09:11
Печать  
1. Перечисли индекы. Как их смотреть - погугли.
2. Используй ТОЛЬКО выполнитьинструкцию()

Время выполнения такого запроса с правильно расставленными индексами с получением данных на клиента несколько секунд.
  
Наверх
 
IP записан
 
Arta
1c++ power user
Отсутствует



Сообщений: 2537
Местоположение: Нижний Новгород
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Запрос из 1С к SQL не 1С.
Ответ #36 - 29. Января 2007 :: 09:12
Печать  
KARLSON писал(а) 29. Января 2007 :: 09:05:
Кстати из Фака на sql.ru цитата:

Оказывается, при выполнении запроса сервер выдает записи клиенту (приложению) по очереди и по одной записи. Причем только "сверху вниз". Как только записи на сервере кончились, сервер сообщает клиенту об этом сигналом EOF вместо выдачи очередной записи. Конечно, в некоторых современных серверах есть произвольное позиционирование и проход по выборке не только сверху вниз но и в обратном порядке, но это требует от сервера достаточно больших ресурсов.


Очереденость данных задают индексы. Так что как ни крути тебе придется учить мат.часть  Смех
  
Наверх
 
IP записан
 
KARLSON
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 21
Зарегистрирован: 27. Января 2007
Re: Запрос из 1С к SQL не 1С.
Ответ #37 - 29. Января 2007 :: 09:18
Печать  
Arta писал(а) 29. Января 2007 :: 09:12:
KARLSON писал(а) 29. Января 2007 :: 09:05:
Кстати из Фака на sql.ru цитата:

Оказывается, при выполнении запроса сервер выдает записи клиенту (приложению) по очереди и по одной записи. Причем только "сверху вниз". Как только записи на сервере кончились, сервер сообщает клиенту об этом сигналом EOF вместо выдачи очередной записи. Конечно, в некоторых современных серверах есть произвольное позиционирование и проход по выборке не только сверху вниз но и в обратном порядке, но это требует от сервера достаточно больших ресурсов.


Очереденость данных задают индексы. Так что как ни крути тебе придется учить мат.часть  Смех


Я написал про принцип работы BDE или ODBC... Цитата отсюда:
http://www.ibase.ru/devinfo/bde.htm
  
Наверх
 
IP записан
 
KARLSON
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 21
Зарегистрирован: 27. Января 2007
Re: Запрос из 1С к SQL не 1С.
Ответ #38 - 29. Января 2007 :: 09:22
Печать  
Пошел учить мат часть...в IBExpert запрос делается не 19 секунд...
Если кто сможет помоч каким-нить советом буду очень благодарен. Т.к. сроки поджимают
  
Наверх
 
IP записан
 
RaiN
YaBB Newbies
*
Отсутствует


I Love YaBB 2!

Сообщений: 10
Зарегистрирован: 26. Января 2007
Re: Запрос из 1С к SQL не 1С.
Ответ #39 - 29. Января 2007 :: 09:32
Печать  
Arta писал(а) 29. Января 2007 :: 09:12:
KARLSON писал(а) 29. Января 2007 :: 09:05:
Кстати из Фака на sql.ru цитата:

Оказывается, при выполнении запроса сервер выдает записи клиенту (приложению) по очереди и по одной записи. Причем только "сверху вниз". Как только записи на сервере кончились, сервер сообщает клиенту об этом сигналом EOF вместо выдачи очередной записи. Конечно, в некоторых современных серверах есть произвольное позиционирование и проход по выборке не только сверху вниз но и в обратном порядке, но это требует от сервера достаточно больших ресурсов.


Очереденость данных задают индексы. Так что как ни крути тебе придется учить мат.часть  Смех


Без мат части, последний вариант, это скачать сторонний драйвер и попробовать с ним.

PS: Случайно сталкивался с профстроем. Если говорят что 1С тормозит, то Профстрой вообще не работает. Так что там, наверняка, проблема со структурой базы данных.
  
Наверх
 
IP записан
 
KARLSON
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 21
Зарегистрирован: 27. Января 2007
Re: Запрос из 1С к SQL не 1С.
Ответ #40 - 29. Января 2007 :: 10:36
Печать  
SELECT
    ARTIKLS.ANUMB AS ARTICLE_PROF,
    ARTSVST.ASKL1 AS ARTICLE_SKLAD,
    ARTSVST.ASKL2 AS ARTICLE_1C,
    ARTIKLS.ANAME AS NOMNAME,
    ARTSVST.CLPRV AS TARIF_ED_IZM,
    COLSLST.CNAME AS CVET_TEKSTURI,
    COLSLST.CNAMP AS CVET_ARTICLE,
    ARTSVST.CLPRC AS TARIF_OSN_TEKSTURI,
    ARTSVST.CLPR1 AS TARIF_VNUTR_TEKSTURI,
    ARTSVST.CLPR2 AS TARIF_VNESHN_TEKSTURI,
    ARTSVST.CLPRA AS TARIF_DVUHSTORONNEY_TEKSTURI,
    GRUPART.MNAME AS NOMGRUPNAME,
    GRUPART.MUNIC AS GRUPUNICNOMER,
    ARTIKLS.NUNIC AS KATEGORYUNICNOMER,
    ARTIKLS.APREF AS KATEGORY,
    ARTIKLS.ANAMP AS NOMNAMECONTR,
    CORRENC.CNAME AS VALUTE,
    CASE
       WHEN ARTIKLS.ATYPI = 1 THEN 'ïîã.ì.'
       WHEN ARTIKLS.ATYPI = 2 THEN 'ì.êâ.'
       WHEN ARTIKLS.ATYPI = 3 THEN 'øò'
       WHEN ARTIKLS.ATYPI = 5 THEN 'êîìïë.'
       ELSE 'íåèçâåñòíî'
    END AS ED_IZM

      FROM COLSLST
      RIGHT OUTER JOIN ARTSVST ON (COLSLST.CNUMB = ARTSVST.CLNUM)
      RIGHT OUTER JOIN ARTIKLS ON (ARTSVST.ANUMB = ARTIKLS.ANUMB)
      LEFT OUTER JOIN CORRENC ON (ARTIKLS.CNUMB = CORRENC.CNUMB)
    LEFT OUTER JOIN GRUPART ON (ARTIKLS.MUNIC = GRUPART.MPREF)


Plan
PLAN JOIN (JOIN (JOIN (ARTIKLS NATURAL,JOIN (ARTSVST NATURAL,COLSLST NATURAL)),CORRENC NATURAL),GRUPART INDEX (RDB$PRIMARY8))

Adapted Plan
PLAN JOIN (JOIN (JOIN (ARTIKLS NATURAL,JOIN (ARTSVST NATURAL,COLSLST NATURAL)),CORRENC NATURAL),GRUPART INDEX (IGRUPART))

------ Performance info ------
Prepare time = 0ms
Execute time = 19s 531ms
Avg fetch time = 1 085,06 ms
Current memory = 753 304
Max memory = 843 240
Memory buffers = 2 048
Reads from disk to cache = 859
Writes from cache to disk = 0
Fetches from cache = 30 923 245
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: [1] 
ОтправитьПечать