Переключение на Главную Страницу Страницы: 1 [2] 3 4 5 ОтправитьПечать
Очень популярная тема (более 25 ответов) Выгрузка из ТЗ во временную таблицу (курсор) (число прочтений - 22533 )
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Выгрузка из ТЗ во временную таблицу (курсор)
Ответ #15 - 08. Октября 2007 :: 07:12
Печать  
Переписал  INSERT  без параметризации - результ значительно лучше
Код
Выбрать все
	rc = СоздатьОбъект("ODBCRecordSet");
	sql = СоздатьОбъект("ODBCDatabase");
	Имя0 = "sqlite_1c";
	//Имя_sql_bd = ":memory:";
	Стр_Открыть = "DSN=sqlite_1c;Driver=SQLite3 ODBC Driver;Database=" + Имя_sql_bd + ";" ;
	Фл1 = sql.Соединение(Стр_Открыть);
	Если Фл1 = 0 Тогда
		Сообщить("Не смогли открыть DSN = " + Имя0);
		Сообщить("Ошибка = " +  sql.ПолучитьОписаниеОшибки() );
		return;
	КонецЕсли;
	rc.УстБД(sql);
	Стр_0 = "CREATE TEMP  TABLE IF NOT EXISTS TmpTable(ID CHAR ,Descr  CHAR)";
	rc.ВыполнитьИнструкцию(Стр_0);
	КоличествоЭлементов=10000;



	ВремяНачалоЗапроса=_GetPerformanceCounter();
		ID="   12G   ";
		Descr="15-034 MOTOR SUB									";
	ТекстЗапроса="INSERT INTO TmpTable (ID,Descr )   VALUES ('"+ ID + "','"+ Descr+ "')";

	Для ИИ=1 По КоличествоЭлементов Цикл   //
		rc.ВыполнитьСкалярный(ТекстЗапроса);
	КонеЦЦикла;  
    ВремяКонецЗапроса=_GetPerformanceCounter();
	ВремяЗапроса=ВремяКонецЗапроса-ВремяНачалоЗапроса;
	Сообщить("без параметра Запрос вставки "+(ВремяЗапроса/1000)+"с");

	// 2. Тест выборки
	ВремяНачалоЗапроса=_GetPerformanceCounter();
	ТЗ = rc.ВыполнитьИнструкцию("SELECT  WW.ID,WW.Descr  from TmpTable as WW  ");
	ВремяКонецЗапроса=_GetPerformanceCounter();
	ВремяЗапроса=ВремяКонецЗапроса-ВремяНачалоЗапроса;
	Сообщить("Запрос выборки длился "+(ВремяЗапроса/1000)+"с");

	//Просмотр ТЗ
	Сообщить("Кол строк "+ТЗ.КоличествоСтрок());
	ТЗ.ВыбратьСтроку();

	rc.Закрыть();
	sql.Закрыть();

 

« Последняя редакция: 08. Октября 2007 :: 08:13 - Z1 »  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Выгрузка из ТЗ во временную таблицу (курсор)
Ответ #16 - 08. Октября 2007 :: 07:21
Печать  
kiruha писал(а) 08. Октября 2007 :: 07:02:
[quote author=Z1 link=1191570663/0#13 date=1191823552]Прогнал тот же тест на sqlite odbc
В вставке, может, нужно столбцы типизировать(типа CHAR (9)), в SQLLite это возможно ? И работает ли полноценно параметризованный запрос в SQLLite?

sqlite слабая типитизация - можно считать что ее вообще нет.
далее параметризированный запрос -  здесь получается лишним по тому что три вызова из 1с добпараметр(1),добпараметр(2),Выполнить гороздо хуже
чем один вызов ВыполнитьСкалярный().
Полноценно параметризованный запрос работает по крайней мере
если делать не через odbc , а через liteX
« Последняя редакция: 08. Октября 2007 :: 09:43 - Z1 »  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Выгрузка из ТЗ во временную таблицу (курсор)
Ответ #17 - 08. Октября 2007 :: 07:27
Печать  
(kiruha) выложи пожалуста сравнение теста для fox и моего второго варианта
выполненого на одном компьютере
или скажи выложи полностью твой тест с установкой соеденения oledb ( тогда
я твой тест прогоню у себя)
Полностью поддерживаю твою идею о временных быстрых локальных
таблицах ( жедательно настраиваемые на разные бд fox,sqlite и.т.д).
Если граммотно это развить (интегрировать в 1с++) получим  быструю трехзвенку на 1с++.
  
Наверх
 
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: Выгрузка из ТЗ во временную таблицу (курсор)
Ответ #18 - 08. Октября 2007 :: 07:38
Печать  
Да у меня все стандартно.
Код
Выбрать все
	глОлеДБ = СоздатьОбъект("OLEDBData");
	Рез=глОлеДБ.Соединение("
	|Provider=VFPOLEDB.1;
	|Deleted=Yes;
	|Null = Yes;
	|Exclusive = No;
	|SourceType = DBF;
	|Data Source=" + КаталогИБ() + ";
	|Mode=ReadWrite;
	|Extended Properties="""";
	|User ID="""";
	|Password="""";
	|Mask Password=False;
	|Collating Sequence=MACHINE;
	|DSN=""""");
 


Далее Тест().

P.S. На всякий случай.
Должен быть установлен драйвер vfpoledb.dll (скачивается инсталлятор c Майкрософт, далее подменяется
патченным драйвером от Uzhast)

P.S.Насчет трехзвенной архитектуры не понял.
Реляц ИТЗ нужна мне для более эффективной группировки (rollup в Fox е отсутствует) , а
также очень понравилась идея обмена при помощи баз данных.
  
Наверх
 
IP записан
 
spock
1c++ developer
1c++ moderator
Отсутствует



Сообщений: 822
Местоположение: Новосибирск
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Выгрузка из ТЗ во временную таблицу (курсор)
Ответ #19 - 08. Октября 2007 :: 07:54
Печать  
АХТУНГ!
Думаю, что пока проверку работы параметризированных запросов стоит отложить.
Благодаря этому обсуждению нашел идеологическю ошибку.
  

InsertingTest.ert ( 36 KB | Загрузки )
Наверх
ICQ  
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: Выгрузка из ТЗ во временную таблицу (курсор)
Ответ #20 - 08. Октября 2007 :: 08:01
Печать  
spock писал(а) 08. Октября 2007 :: 07:54:
АХТУНГ!
Думаю, что пока проверку работы параметризированных запросов стоит отложить.
Благодаря этому обсуждению нашел идеологическю ошибку.


Ок Улыбка
Для не знакомых с обсуждением sqllite
http://www.1cpp.ru/forum/YaBB.pl?num=1187844655/0
  
Наверх
 
IP записан
 
spock
1c++ developer
1c++ moderator
Отсутствует



Сообщений: 822
Местоположение: Новосибирск
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Выгрузка из ТЗ во временную таблицу (курсор)
Ответ #21 - 08. Октября 2007 :: 09:30
Печать  
Заметил, если устранить идеологическую ошибку, то будет где-то так:

Цитата:
Кол-во строк: 100000 (выполняем три раза)
Запрос вставки (парам. запросом):
- 5.694сек.
- 5.931сек.
- 5.611сек.
Запрос вставки (без парам. запроса):
- 9.26сек.
- 8.623сек.
- 9.401сек.
  
Наверх
ICQ  
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Выгрузка из ТЗ во временную таблицу (курсор)
Ответ #22 - 08. Октября 2007 :: 09:41
Печать  
(spock) Т.е. после появления новых ночных сборок параметризированный запрос будет работать значительно быстрее.
  
Наверх
 
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: Выгрузка из ТЗ во временную таблицу (курсор)
Ответ #23 - 08. Октября 2007 :: 10:11
Печать  
spock писал(а) 08. Октября 2007 :: 09:30:
Заметил, если устранить идеологическую ошибку, то будет где-то так:

Цитата:
Кол-во строк: 100000 (выполняем три раза)
Запрос вставки (парам. запросом):
- 5.694сек.
- 5.931сек.
- 5.611сек.
Запрос вставки (без парам. запроса):
- 9.26сек.
- 8.623сек.
- 9.401сек.


Для OLE? 100 000? Быстрее выборки?
Когда можно качать сборку?

Остался невыясненным вопрос - почему вставка в Sqllite так медленно.
  
Наверх
 
IP записан
 
spock
1c++ developer
1c++ moderator
Отсутствует



Сообщений: 822
Местоположение: Новосибирск
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Выгрузка из ТЗ во временную таблицу (курсор)
Ответ #24 - 08. Октября 2007 :: 11:12
Печать  
Z1 писал(а) 08. Октября 2007 :: 09:41:
(spock) Т.е. после появления новых ночных сборок параметризированный запрос будет работать значительно быстрее.

угумс
  
Наверх
ICQ  
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Выгрузка из ТЗ во временную таблицу (курсор)
Ответ #25 - 08. Октября 2007 :: 11:43
Печать  
(spock) Еще есть вопрос по sqlite и BinaryData.Может тоже легко исправить?
Запрос по извлечению данных из 1с+mssql+BinaryData успешно проходит.
Точно такой же Запрос по извлечению данных из 1с+sqlite+BinaryData
вываливается по ошибке
Поле агрегатного объекта не обнаружено (СохранитьВФайл)
Тестовый пример :
Код
Выбрать все
	rc = СоздатьОбъект("ODBCRecordSet");
	sql = СоздатьОбъект("ODBCDatabase");
	Имя0 = "SQLite3 ODBC Driver";
	Стр_Открыть = "DSN=sqlite_1c;Driver=SQLite3 ODBC Driver;Database=" + Имя_sql_bd + ";" ;
	Фл1 = sql.Соединение(Стр_Открыть);
	Если Фл1 = 0 Тогда
		Сообщить("Не смогли открыть DSN = " + Имя0);
		Сообщить("Ошибка = " +  sql.ПолучитьОписаниеОшибки() );
		return;
	КонецЕсли;
	rc.УстБД(sql);
///
	Данные=СоздатьОбъект("BinaryData");
	Стр_0 = " select image  FROM book WHERE numb = 106 ";
	Данные=rc.ВыполнитьСкалярный(Стр_0);
	ИмяФайла = "c:\test1.jpg";
	Если ФС.СуществуетФайл(ИмяФайла) = 1 Тогда
		ФС.УдалитьФайл(ИмяФайла);
	КонецЕсли;
	Данные.СохранитьВФайл(ИмяФайла);
 

  
Наверх
 
IP записан
 
spock
1c++ developer
1c++ moderator
Отсутствует



Сообщений: 822
Местоположение: Новосибирск
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Выгрузка из ТЗ во временную таблицу (курсор)
Ответ #26 - 09. Октября 2007 :: 06:19
Печать  
Народ, вы зря не качайте ночную сборку (если ждете этих изменений).
Я когда залью, то свистну.
А то я вчера на новом компе пока wincvs, python, docutils поставил + шашкой размахался уже и третий час наступил.
  
Наверх
ICQ  
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: Выгрузка из ТЗ во временную таблицу (курсор)
Ответ #27 - 09. Октября 2007 :: 17:34
Печать  
spock писал(а) 09. Октября 2007 :: 06:19:
Народ, вы зря не качайте ночную сборку (если ждете этих изменений).
Я когда залью, то свистну.
А то я вчера на новом компе пока wincvs, python, docutils поставил + шашкой размахался уже и третий час наступил.


Кирилл, не могу эффективно "ПолучитьСтроку()"  из временной таблицы. ВыполнитьИнструкцию() создает
каждый раз ТЗ - т.е. на перебор 10 000 строк временной таблицы создается 10 000 ТЗ.

А нельзя ли получать данные не возвращая ТЗ, т.е. чтобы
аналог ВыполнитьИнструкцию(ТекстSQL, ТаблицаРезультатов)
все результаты получал в ТаблицаРезультатов, не создавая новой ТЗ ?
Т.е. у метода Выполнить() был необязательный параметр  [ТаблицаРезультатов]?

Или чтобы результат запроса мог возвращать результат простого типа?
А не только ТЗ с колонкой "return_value"
  
Наверх
 
IP записан
 
Uzhast
1c++ power user
Отсутствует



Сообщений: 1341
Зарегистрирован: 30. Августа 2006
Пол: Мужской
Re: Выгрузка из ТЗ во временную таблицу (курсор)
Ответ #28 - 10. Октября 2007 :: 03:03
Печать  
kiruha писал(а) 09. Октября 2007 :: 17:34:
Кирилл, не могу эффективно "ПолучитьСтроку()"  из временной таблицы. ВыполнитьИнструкцию() создает
каждый раз ТЗ - т.е. на перебор 10 000 строк временной таблицы создается 10 000 ТЗ.

Во! Здесь как раз могут быть полезны те изменения, что я внес в OLE DB. Теперь можно создать некий объект (например, "РезультатЗапросаOLEDB"), которым можно будет обходить результат запроса без создания ТЗ.
  
Наверх
 
IP записан
 
spock
1c++ developer
1c++ moderator
Отсутствует



Сообщений: 822
Местоположение: Новосибирск
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Выгрузка из ТЗ во временную таблицу (курсор)
Ответ #29 - 10. Октября 2007 :: 04:59
Печать  
kiruha писал(а) 09. Октября 2007 :: 17:34:
А нельзя ли получать данные не возвращая ТЗ, т.е. чтобы
аналог ВыполнитьИнструкцию(ТекстSQL, ТаблицаРезультатов)
все результаты получал в ТаблицаРезультатов, не создавая новой ТЗ ?

http://www.1cpp.ru/docum/html/oledb.html#executestatement
  
Наверх
ICQ  
IP записан
 
Переключение на Главную Страницу Страницы: 1 [2] 3 4 5
ОтправитьПечать