Переключение на Главную Страницу Страницы: [1] 2 3  ОтправитьПечать
Очень популярная тема (более 25 ответов) Запрос из 1С к SQL не 1С. (число прочтений - 12228 )
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 записан
 
Переключение на Главную Страницу Страницы: [1] 2 3 
ОтправитьПечать