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



Сообщений: 536
Зарегистрирован: 10. Июля 2006
Re: Не работает ВыполнитьSQL_ИзТЗ
Ответ #30 - 07. Сентября 2010 :: 07:10
Печать  
Продолжение:

Код
Выбрать все
Функция ЗаписатьТаблица_ИзТЗ (пКолвоСтрок)

	лВремяНачалоДействия = _GetPerformanceCounter();

	Мета = СоздатьОбъект("MetaDataWork");
	рс = СоздатьОбъект("ODBCRecordset");
	лТекущийДокумент = мКонтекст.ТекущийДокумент();

	лТЗ = СоздатьОбъект("ТаблицаЗначений");
	лТЗ.НоваяКолонка("iddoc");
	лТЗ.НоваяКолонка("lineno_");
	лТЗ.НоваяКолонка("ТЧ_ГУИД");
	лТЗ.НоваяКолонка("id");
	лТЗ.НоваяКолонка("address");
	лТЗ.НоваяКолонка("Адрес");
	лТЗ.НоваяКолонка("Область");
	лТЗ.НоваяКолонка("Город");
	лТЗ.НоваяКолонка("Улица");
	лТЗ.НоваяКолонка("ЕстьУлица");
	лТЗ.НоваяКолонка("Дом");
	лТЗ.НоваяКолонка("ЕстьДом");
	лТЗ.НоваяКолонка("МногоквартирныйДом");
	лТЗ.НоваяКолонка("ДомНулеваяСтрока");
	лТЗ.НоваяКолонка("Квартира");
	лТЗ.НоваяКолонка("КвартираНулеваяСтрока");
	лТЗ.НоваяКолонка("НеУказанаКвартираВМногоквартирномДоме");
	лТЗ.НоваяКолонка("ЕстьКвартира");
	лТЗ.НоваяКолонка("Физлицо");
	лТЗ.НоваяКолонка("ПризнакФизлица");

	мТабТаблица.Выбратьстроки();
	Пока мТабТаблица.ПолучитьСтроку() = 1 Цикл
		лТЗ.НоваяСтрока();
		лТЗ.iddoc 		= лТекущийДокумент;
		лТЗ.lineno_		= лТЗ.НомерСтроки;
		лТЗ.ТЧ_ГУИД 	= лТекущийДокумент.ГУИД;
		лТЗ.id 			= мТабТаблица.id;
		лТЗ.address 	= мТабТаблица.address;
		лТЗ.Адрес 		= мТабТаблица.Адрес;
		лТЗ.Область		= мТабТаблица.Область;
		лТЗ.Город 		= мТабТаблица.Город;
		лТЗ.Улица 		= мТабТаблица.Улица;
		лТЗ.ЕстьУлица 	= мТабТаблица.ЕстьУлица;
		лТЗ.Дом 		= мТабТаблица.Дом;
		лТЗ.ЕстьДом 			= мТабТаблица.ЕстьДом;
		лТЗ.МногоквартирныйДом 	= мТабТаблица.МногоквартирныйДом;
		лТЗ.ДомНулеваяСтрока 	= мТабТаблица.ДомНулеваяСтрока;
		лТЗ.Квартира 								= мТабТаблица.Квартира;
		лТЗ.КвартираНулеваяСтрока 					= мТабТаблица.КвартираНулеваяСтрока;
		лТЗ.НеУказанаКвартираВМногоквартирномДоме 	= мТабТаблица.НеУказанаКвартираВМногоквартирномДоме;
		лТЗ.ЕстьКвартира 							= мТабТаблица.ЕстьКвартира;
		лТЗ.Физлицо 		= мТабТаблица.Физлицо;
		лТЗ.ПризнакФизлица 	= мТабТаблица.ПризнакФизлица;
	КонецЦикла;

    лВремяКонецДействия =_GetPerformanceCounter();
	лВремяДействия = лВремяКонецДействия - лВремяНачалоДействия;
	лВремяДействияВСек = лВремяДействия / 1000;
	//Сообщить("Время подготовки таблицы: " + лВремяДействияВСек + "с");

	//Сообщить("Удаляем строки");
	ЗаписатьТаблица_УдалитьСтроки(рс, лТекущийДокумент);

	//-------------------------------------------
	// записываем
	//

	лВремяНачалоДействия = _GetPerformanceCounter();

	лТекстЗапроса = "insert into $ДокументСтроки.Таблица.Таблица (
			|
			|iddoc,
			|LINENO_,
			|
			|$ДокументСтроки.Таблица.Реквизит.ТЧ_ГУИД,
			|$ДокументСтроки.Таблица.Реквизит.id,
			|$ДокументСтроки.Таблица.Реквизит.address,
			|$ДокументСтроки.Таблица.Реквизит.Адрес,
			|$ДокументСтроки.Таблица.Реквизит.Область,
			|$ДокументСтроки.Таблица.Реквизит.Город,
			|$ДокументСтроки.Таблица.Реквизит.Улица,
			|$ДокументСтроки.Таблица.Реквизит.ЕстьУлица,
			|$ДокументСтроки.Таблица.Реквизит.Дом,
			|$ДокументСтроки.Таблица.Реквизит.ЕстьДом,
			|$ДокументСтроки.Таблица.Реквизит.МногоквартирныйДом,
			|$ДокументСтроки.Таблица.Реквизит.ДомНулеваяСтрока,
			|$ДокументСтроки.Таблица.Реквизит.Квартира,
			|$ДокументСтроки.Таблица.Реквизит.КвартираНулеваяСтрока,
			|$ДокументСтроки.Таблица.Реквизит.НеУказанаКвартираВМногоквартирномДоме,
			|$ДокументСтроки.Таблица.Реквизит.ЕстьКвартира,
			|$ДокументСтроки.Таблица.Реквизит.Физлицо,
			|$ДокументСтроки.Таблица.Реквизит.ПризнакФизлица)
			|
			|values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
	лТекстЗапроса = ПодготовитьТекстЗапроса(лТекстЗапроса);

 	рс.ДобПараметр(1,14,9,0);
 	рс.ДобПараметр(1,3,0,0);
 	рс.ДобПараметр(1,14,50,0);
 	рс.ДобПараметр(1,14,10,0);
 	рс.ДобПараметр(1,14,100,0);
 	рс.ДобПараметр(1,14,512,0);
 	рс.ДобПараметр(1,14,99,0);
 	рс.ДобПараметр(1,14,99,0);
 	рс.ДобПараметр(1,14,99,0);
 	рс.ДобПараметр(1,14,1,0);
 	рс.ДобПараметр(1,14,10,0);
 	рс.ДобПараметр(1,4,1,0);
 	рс.ДобПараметр(1,4,1,0);
 	рс.ДобПараметр(1,4,1,0);
 	рс.ДобПараметр(1,14,10,0);
 	рс.ДобПараметр(1,4,1,0);
 	рс.ДобПараметр(1,4,1,0);
 	рс.ДобПараметр(1,4,1,0);
 	рс.ДобПараметр(1,14,9,0);
 	рс.ДобПараметр(1,4,1,0);

 	лРез = 0;
 	Попытка
 		рс.Подготовить(лТекстЗапроса);
 		рс.ExeSQL_FromTV(лТЗ, пКолвоСтрок);
 		лРез = 1;
 	Исключение
 	КонецПопытки;

 	Если лРез <> 1 Тогда
 		Предупреждение("Ошибка при записи документа!" + РазделительСтрок + рс.ПолучитьОписаниеОшибки());
 		Возврат 0;
 	КонецЕсли;

    лВремяКонецДействия =_GetPerformanceCounter();
	лВремяДействия = лВремяКонецДействия - лВремяНачалоДействия;
	лВремяДействияВСек = лВремяДействия / 1000;
	Сообщить(Шаблон("Время записи таблицы соответсвия документа при помощи ExeSQL_FromTV (кол-во строк = [пКолвоСтрок]): ") + лВремяДействияВСек + "с");

	Возврат 1;

КонецФункции


Функция ЗаписатьТаблица()

	Сообщить("Записываем Таблица...");

	лРез = ЗаписатьТаблица_ПоЗаписям();

	лРез = ЗаписатьТаблица_ИзТЗ(0);
	лРез = ЗаписатьТаблица_ИзТЗ(10);
	лРез = ЗаписатьТаблица_ИзТЗ(100);
	лРез = ЗаписатьТаблица_ИзТЗ(200);
	лРез = ЗаписатьТаблица_ИзТЗ(500);
	лРез = ЗаписатьТаблица_ИзТЗ(1000);
	лРез = ЗаписатьТаблица_ИзТЗ(2000);
	лРез = ЗаписатьТаблица_ИзТЗ(5000);

	Возврат лРез;

КонецФункции
 


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



Сообщений: 536
Зарегистрирован: 10. Июля 2006
Re: Не работает ВыполнитьSQL_ИзТЗ
Ответ #31 - 07. Сентября 2010 :: 07:13
Печать  
Процедуру "ПодготовитьТекстЗапроса" я сделал для того, чтобы можно было в запросе писать понятные названия таблиц. Там по коду все понятно. На выполнение запроса она не должна повлиять.

Возможно у меня какие-то проблемы с сетевым соединением. Но тогда почему при записи по строкам это не заметно?
  
Наверх
ICQ  
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Не работает ВыполнитьSQL_ИзТЗ
Ответ #32 - 07. Сентября 2010 :: 07:26
Печать  
(es3000)
Речь о втором тесте.Так у тебя все время уходит на заполнение промежуточной таблицы. Поставь время еще сколько создается промежуточная таблица а также поставь время "чистого"
рс.ExeSQL_FromTV(лТЗ, пКолвоСтрок)
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Не работает ВыполнитьSQL_ИзТЗ
Ответ #33 - 07. Сентября 2010 :: 07:29
Печать  
Также во втором тесте ты заполняешь все строки сколько есть а
insert даешь на столько строк сколько нужно.
  
Наверх
 
IP записан
 
es3000
God Member
*****
Отсутствует



Сообщений: 536
Зарегистрирован: 10. Июля 2006
Re: Не работает ВыполнитьSQL_ИзТЗ
Ответ #34 - 07. Сентября 2010 :: 07:33
Печать  
Z1 писал(а) 07. Сентября 2010 :: 07:26:
(es3000)
Речь о втором тесте.Так у тебя все время уходит на заполнение промежуточной таблицы. Поставь время еще сколько создается промежуточная таблица а также поставь время "чистого"
рс.ExeSQL_FromTV(лТЗ, пКолвоСтрок)


У меня там два замера: один выполняется при заполнении промежуточной таблицы, второй выполняется прямо перед текстом запроса.
И в результат выводится именно второй замер.
Так что результат замера правильный

Кроме того, я до этого замерял отдельно заполнение промежуточной таблицы: от 1 до 4 сек. Что по сравнению с общим временем незначительно
  
Наверх
ICQ  
IP записан
 
es3000
God Member
*****
Отсутствует



Сообщений: 536
Зарегистрирован: 10. Июля 2006
Re: Не работает ВыполнитьSQL_ИзТЗ
Ответ #35 - 07. Сентября 2010 :: 07:37
Печать  
Z1 писал(а) 07. Сентября 2010 :: 07:29:
Также во втором тесте ты заполняешь все строки сколько есть а
insert даешь на столько строк сколько нужно.


не понял...

Я заполняю ТЗ, вызваю метод ВыполнитьSQL_ИзТЗ, и указываю ему какими порциями передавать данные на сервер. Получается что независимо от размера порции, время выполнения больше чем построчно
  
Наверх
ICQ  
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Не работает ВыполнитьSQL_ИзТЗ
Ответ #36 - 07. Сентября 2010 :: 07:50
Печать  
es3000 писал(а) 07. Сентября 2010 :: 07:37:
Z1 писал(а) 07. Сентября 2010 :: 07:29:
Также во втором тесте ты заполняешь все строки сколько есть а
insert даешь на столько строк сколько нужно.


не понял...

Я заполняю ТЗ, вызваю метод ВыполнитьSQL_ИзТЗ, и указываю ему какими порциями передавать данные на сервер. Получается что независимо от размера порции, время выполнения больше чем построчно

это я неправильно думал о втором параметре.( я думал что это колво строк всего ).

Тогда ставь второй параметр в  1. Передавая слишком большой пакет сразу что ты выиграешь ?
Все равно все insert (ы)  будут выполняться по одному.
Скорее всего при  передаче больших пакетов происходит больше ошибок и tcp тратит время на передачу ошибочных пакетов заново.
также маленький запрос в одном пакете и он сразу выполняется а большой запрос из многих пакетов надо еще получить и выстроить в нужном порядке.
Все сказаное мое ИХМО.
  
Наверх
 
IP записан
 
es3000
God Member
*****
Отсутствует



Сообщений: 536
Зарегистрирован: 10. Июля 2006
Re: Не работает ВыполнитьSQL_ИзТЗ
Ответ #37 - 07. Сентября 2010 :: 07:54
Печать  
Если запустить тест на сервере, то результат такой:


Время записи таблицы  документа построчно: 12.146с
Время записи таблицы  документа при помощи ExeSQL_FromTV (кол-во строк = 0): 7.361с
Время записи таблицы  документа при помощи ExeSQL_FromTV (кол-во строк = 10): 7.218с
Время записи таблицы  документа при помощи ExeSQL_FromTV (кол-во строк = 100): 6.597с
Время записи таблицы  документа при помощи ExeSQL_FromTV (кол-во строк = 200): 7.397с
Время записи таблицы  документа при помощи ExeSQL_FromTV (кол-во строк = 500): 6.722с
Время записи таблицы  документа при помощи ExeSQL_FromTV (кол-во строк = 1000): 6.499с
Время записи таблицы  документа при помощи ExeSQL_FromTV (кол-во строк = 2000): 7.66с
Время записи таблицы  документа при помощи ExeSQL_FromTV (кол-во строк = 5000): 6.71с


Здесь есть прирост производительности.
Данные по сети передавать не нужно.
Получается, что при работе в сети пользоваться "ExeSQL_FromTV" непроизводительно
  
Наверх
ICQ  
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Не работает ВыполнитьSQL_ИзТЗ
Ответ #38 - 07. Сентября 2010 :: 07:55
Печать  
es3000 писал(а) 07. Сентября 2010 :: 07:54:
Если запустить тест на сервере, то результат такой:


Время записи таблицы  документа построчно: 12.146с
Время записи таблицы  документа при помощи ExeSQL_FromTV (кол-во строк = 0): 7.361с
Время записи таблицы  документа при помощи ExeSQL_FromTV (кол-во строк = 10): 7.218с
Время записи таблицы  документа при помощи ExeSQL_FromTV (кол-во строк = 100): 6.597с
Время записи таблицы  документа при помощи ExeSQL_FromTV (кол-во строк = 200): 7.397с
Время записи таблицы  документа при помощи ExeSQL_FromTV (кол-во строк = 500): 6.722с
Время записи таблицы  документа при помощи ExeSQL_FromTV (кол-во строк = 1000): 6.499с
Время записи таблицы  документа при помощи ExeSQL_FromTV (кол-во строк = 2000): 7.66с
Время записи таблицы  документа при помощи ExeSQL_FromTV (кол-во строк = 5000): 6.71с


Здесь есть прирост производительности.
Получается, что при работе в сети пользоваться "ExeSQL_FromTV" непроизводительно

это потому что tcp пакеты не передаются по сети и потерь их нет.
или может у тебя sql2005 и на сервере sql соеденен по другому протоколу.
  
Наверх
 
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3051
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Не работает ВыполнитьSQL_ИзТЗ
Ответ #39 - 07. Сентября 2010 :: 07:56
Печать  
es3000 писал(а) 07. Сентября 2010 :: 06:56:
Почему отрицательное число выскочило - х\з

значит компьютер проработал без выключения примерно 50 суток или кратно этому
  

1&&2&&3
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Не работает ВыполнитьSQL_ИзТЗ
Ответ #40 - 07. Сентября 2010 :: 07:56
Печать  
es3000 писал(а) 07. Сентября 2010 :: 07:54:
Если запустить тест на сервере, то результат такой:

Здесь есть прирост производительности.
Данные по сети передавать не нужно.
Получается, что при работе в сети пользоваться "ExeSQL_FromTV" непроизводительно

немного не так чем лучше сеть(физическая) тем больше может быть передаваемый запрос без потери производительности ( производительность имеется ввиду производительность сетевого протокола
  
Наверх
 
IP записан
 
es3000
God Member
*****
Отсутствует



Сообщений: 536
Зарегистрирован: 10. Июля 2006
Re: Не работает ВыполнитьSQL_ИзТЗ
Ответ #41 - 07. Сентября 2010 :: 08:03
Печать  
trad писал(а) 07. Сентября 2010 :: 07:56:
es3000 писал(а) 07. Сентября 2010 :: 06:56:
Почему отрицательное число выскочило - х\з

значит компьютер проработал без выключения примерно 50 суток или кратно этому


этот тест выполнился за несколько минут
  
Наверх
ICQ  
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3051
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Не работает ВыполнитьSQL_ИзТЗ
Ответ #42 - 07. Сентября 2010 :: 08:05
Печать  
es3000 писал(а) 07. Сентября 2010 :: 08:03:
trad писал(а) 07. Сентября 2010 :: 07:56:
es3000 писал(а) 07. Сентября 2010 :: 06:56:
Почему отрицательное число выскочило - х\з

значит компьютер проработал без выключения примерно 50 суток или кратно этому


этот тест выполнился за несколько минут

замечательно.

но компьютер работает (и счетчик тикает) даже если тест не выполняется.
  

1&&2&&3
Наверх
 
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3051
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Не работает ВыполнитьSQL_ИзТЗ
Ответ #43 - 07. Сентября 2010 :: 08:23
Печать  
es3000 писал(а) 07. Сентября 2010 :: 07:54:
Получается, что при работе в сети пользоваться "ExeSQL_FromTV" непроизводительно

интересно.
надо будет проверит.
и еще сетевой протокол какой используется? посмотри в cliconfg.
  

1&&2&&3
Наверх
 
IP записан
 
es3000
God Member
*****
Отсутствует



Сообщений: 536
Зарегистрирован: 10. Июля 2006
Re: Не работает ВыполнитьSQL_ИзТЗ
Ответ #44 - 07. Сентября 2010 :: 09:08
Печать  
trad писал(а) 07. Сентября 2010 :: 08:23:
es3000 писал(а) 07. Сентября 2010 :: 07:54:
Получается, что при работе в сети пользоваться "ExeSQL_FromTV" непроизводительно

интересно.
надо будет проверит.
и еще сетевой протокол какой используется? посмотри в cliconfg.


Нету cliconfig, не устанавливал компоненты SQL-сервера
Но в Activity Monitor видно, что протокол - TCP\IP


Если проверишь, отпиши пожалуйста по результатам. Очень интересно. Может быть проблему в сети надо искать
  
Наверх
ICQ  
IP записан
 
Переключение на Главную Страницу Страницы: 1 2 [3] 4 5 
ОтправитьПечать