Переключение на Главную Страницу Страницы: [1] 2 3 ... 5 ОтправитьПечать
Очень популярная тема (более 25 ответов) Выгрузка из ТЗ во временную таблицу (курсор) (число прочтений - 22523 )
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Выгрузка из ТЗ во временную таблицу (курсор)
05. Октября 2007 :: 07:51
Печать  
Продолжение.
Начало http://www.1cpp.ru/forum/YaBB.pl?num=1190523570/74

spock писал(а) 05. Октября 2007 :: 07:32:
а ты пробовал параметризированным запросом укладывать данные в курсор?


Нет. Вообще не понимаю как это может помочь  Печаль
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

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



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: Выгрузка из ТЗ во временную таблицу (курсор)
Ответ #2 - 05. Октября 2007 :: 09:09
Печать  
А параметризованные запросы в OLEDB у кого нибудь работают?
Цитата:
ОлеДБКоманда.Подготовить(ТекстЗапроса);
... : Поле агрегатного объекта не обнаружено (Подготовить)

Такое впечатление - не видит метод Печаль

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



Сообщений: 822
Местоположение: Новосибирск
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Выгрузка из ТЗ во временную таблицу (курсор)
Ответ #3 - 05. Октября 2007 :: 09:15
Печать  
бери свежее сборку.
  
Наверх
ICQ  
IP записан
 
spock
1c++ developer
1c++ moderator
Отсутствует



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



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: Выгрузка из ТЗ во временную таблицу (курсор)
Ответ #5 - 05. Октября 2007 :: 10:25
Печать  
Да, вроде с параметризованным запросом только в 2 раза медленнее.(наверно из за цикла). Улыбка
- это не критично.
По тестам получается 30 000 записей по 2 поля (размер 9 и 50) в сек. на нормальной машине.

Тогда получается - что теперь Fox можно использовать для промежуточных вычислений вместо ИТЗ Улыбка
Интересно будет сравнить производительность.

P.S. По тестам - это пока предварительные данные.
  
Наверх
 
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


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

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Выгрузка из ТЗ во временную таблицу (курсор)
Ответ #6 - 05. Октября 2007 :: 10:58
Печать  
kiruha писал(а) 05. Октября 2007 :: 10:25:
Да, вроде с параметризованным запросом только в 2 раза медленнее.(наверно из за цикла). Улыбка
- это не критично.
По тестам получается 30 000 записей по 2 поля (размер 9 и 50) в сек. на нормальной машине.

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

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



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: Выгрузка из ТЗ во временную таблицу (курсор)
Ответ #7 - 05. Октября 2007 :: 12:40
Печать  
Тест
Код
Выбрать все
Процедура Тест()
перем КоличествоЭлементов;
    КоличествоЭлементов=10000;

	ОлеДБКоманда = глОлеДБ.СоздатьКоманду();

	// Создаем курсор с полями ID и  Descr
	ТЗ = ОлеДБКоманда.ВыполнитьИнструкцию("EXECSCRIPT('CREATE CURSOR TmpTable (ID Character(9) ,Descr Character(70)) ')");

	//1. Тест вставки
	ОлеДБКоманда = глОлеДБ.СоздатьКоманду();
	ВремяНачалоЗапроса=_GetPerformanceCounter();
	ТекстЗапроса="INSERT INTO TmpTable (ID,Descr )   VALUES (?,?)";

	ОлеДБКоманда.ДобПараметр(1,129,9,0,);
	ОлеДБКоманда.ДобПараметр(1,129,70,0,);
	ОлеДБКоманда.Подготовить(ТекстЗапроса);
	Для ИИ=1 По КоличествоЭлементов Цикл   //
		ID="   12G   ";
		Descr="15-034 MOTOR SUB									";
		ОлеДБКоманда.УстановитьПараметр(1, ID);
		ОлеДБКоманда.УстановитьПараметр(2, Descr);
		ОлеДБКоманда.Выполнить();
	КонеЦЦикла;
    ВремяКонецЗапроса=_GetPerformanceCounter();
	ОлеДБКоманда.ОтменитьПодготовку();
	ВремяЗапроса=ВремяКонецЗапроса-ВремяНачалоЗапроса;
	Сообщить("Запрос вставки "+(ВремяЗапроса/1000)+"с");

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

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

	//Очищение памяти от временной таблицы
	ОлеДБКоманда.Выполнить("EXECSCRIPT('USE IN TmpTable ')");
КонецПроцедуры	 



Результат
Цитата:
Запрос вставки 0.6с
Запрос выборки длился 0.365с
Кол строк 10000


P.S> Хотел сразу написать универсальную выгрузку - но не успел.
ДобПараметр() требует 5 параметров, а не 4.
  
Наверх
 
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: Выгрузка из ТЗ во временную таблицу (курсор)
Ответ #8 - 05. Октября 2007 :: 12:52
Печать  
На 50 000 записях
Цитата:
Запрос вставки 4.498с
Запрос выборки длился 6.506с


На 1 000
Цитата:
Запрос вставки 0.054с
Запрос выборки длился 0.015с


Т.е. чем больше элементов тем вставка эффективнее
  
Наверх
 
IP записан
 
Arta
1c++ power user
Отсутствует



Сообщений: 2537
Местоположение: Нижний Новгород
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Выгрузка из ТЗ во временную таблицу (курсор)
Ответ #9 - 06. Октября 2007 :: 08:46
Печать  
kiruha писал(а) 05. Октября 2007 :: 10:25:
Тогда получается - что теперь Fox можно использовать для промежуточных вычислений вместо ИТЗ Улыбка
Интересно будет сравнить производительность.


Объекты 1С не сохранишь в отличии от ИТЗ. Или увеличение времени на ЗначениеВСтроку.
  
Наверх
 
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: Выгрузка из ТЗ во временную таблицу (курсор)
Ответ #10 - 06. Октября 2007 :: 09:57
Печать  
Arta писал(а) 06. Октября 2007 :: 08:46:
kiruha писал(а) 05. Октября 2007 :: 10:25:
Тогда получается - что теперь Fox можно использовать для промежуточных вычислений вместо ИТЗ Улыбка
Интересно будет сравнить производительность.


Объекты 1С не сохранишь в отличии от ИТЗ. Или увеличение времени на ЗначениеВСтроку.


На самом деле реальными "объектами" являются именно записи таблиц.
Неявное обращение к записям происходят во всех методах 1С объектов.
Соответственно неоткуда взяться значительной задержке.
  
Наверх
 
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: Выгрузка из ТЗ во временную таблицу (курсор)
Ответ #11 - 06. Октября 2007 :: 10:14
Печать  
Более того - большие ТЗ в базе  могут появиться только в результате запросов - в этом случае такие FoxProТаблица образуются вообще мгновенно (по крайней мере для ДБФ,  вычисления то можно проводить и в SQL варианте, но в этом случае придется тратить время на выгрузки).
В классе FoxProТаблица можно реализовать методы Индексированной таблицы.
Тогда эти выгрузки вообще будут нужны только для совместимости кода.
  
Наверх
 
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: Выгрузка из ТЗ во временную таблицу (курсор)
Ответ #12 - 06. Октября 2007 :: 12:21
Печать  
Кстати - в монопольном режиме тоже работает.
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Выгрузка из ТЗ во временную таблицу (курсор)
Ответ #13 - 08. Октября 2007 :: 06:05
Печать  
Прогнал тот же тест на sqlite odbc
Код
Выбрать все
	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();
	ТекстЗапроса="INSERT INTO TmpTable (ID,Descr )   VALUES (?,?)";

	rc.ДобПараметр(1,14,9,0,);
	rc.ДобПараметр(1,14,70,0,);
	rc.Подготовить(ТекстЗапроса);
	Для ИИ=1 По КоличествоЭлементов Цикл   //
		ID="   12G   ";
		Descr="15-034 MOTOR SUB									";
		rc.УстПараметр(1, ID);  
		rc.УстПараметр(2, Descr);
		rc.Выполнить();
	КонеЦЦикла;  
    ВремяКонецЗапроса=_GetPerformanceCounter();
	ВремяЗапроса=ВремяКонецЗапроса-ВремяНачалоЗапроса;
	Сообщить("Запрос вставки "+(ВремяЗапроса/1000)+"с");

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

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

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

 



Результаты :
Запрос вставки 195.541с
Запрос выборки длился 0.211с
Кол строк 50000

Запрос вставки 39.102с
Запрос выборки длился 0.038с
Кол строк 10000

убрал параметризацию при вставке
(все через Выполнитьскалярный() )

без параметра Запрос вставки 10.501с
Запрос выборки длился 0.208с
Кол строк 50000

без параметра Запрос вставки 1.932с
Запрос выборки длился 0.036с
Кол строк 10000
  
Наверх
 
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: Выгрузка из ТЗ во временную таблицу (курсор)
Ответ #14 - 08. Октября 2007 :: 07:02
Печать  
Z1 писал(а) 08. Октября 2007 :: 06:05:
Прогнал тот же тест на sqlite odbc

Результаты :
Запрос вставки 195.541с
Запрос выборки длился 0.211с
Кол строк 50000

Запрос вставки 39.102с
Запрос выборки длился 0.038с
Кол строк 10000


Озадачен
Выборка - очень быстрая, вставка наоборот.
Вроде в выборке - основное время должно затрачиваться на перенос данных в ТЗ, а не на запрос....

В вставке, может, нужно столбцы типизировать(типа CHAR (9)), в SQLLite это возможно ? И работает ли полноценно параметризованный запрос в SQLLite?

Пока что, если тесты верны, вроде более предпочтительно строить реляционную ИТЗ на Fox-е.
Но все таки думаю, что где то неоптимизирована вставка в SQLLite - по крайней мере мои
первые опыты вставки на Foxe показывали весьма плачевные результаты.

  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: [1] 2 3 ... 5
ОтправитьПечать