Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Обычная тема Объясните поведение объекта RecordSet, плз... (число прочтений - 1897 )
Mikeware
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 262
Зарегистрирован: 27. Июля 2006
Пол: Мужской
Объясните поведение объекта RecordSet, плз...
05. Марта 2007 :: 14:09
Печать  
Есть процедура - аналог ТиСовской глВернутьЦену()
Код
Выбрать все
Функция глВернутьЦенуSQL(Номенклатура,ТипЦен)
	ТекстЗапросаЦеныЦены ="select top 1  value as [Цена] from _1sconst where id=324 and objid=:Цена
	| and  date <= :Дата
	|order by date desc";
	ТекстЗапросаЕдиницыЦены ="select top 1  value as [Единица]  from _1sconst where id=321 and objid= :Цена
	| and  date <= :Дата
	|order by date desc";
	ТекстЗапросаЦены ="select id [id], id [Цена $Справочник.Цены], sp6681 [Валюта $Справочник.Валюты], sp6682 [Наценка]  from sc319 where parentext=:Номенклатура and sp327=:ТипЦены";
	ЗапросЦены=СоздатьОбъект("ODBCRecordSet");
	ТЗЦены=СоздатьОбъект("ТаблицаЗначений");
	ЗапросЦены.УстановитьТекстовыйПараметр("Номенклатура",Номенклатура);
	ЗапросЦены.УстановитьТекстовыйПараметр("ТипЦены",ТипЦен);
	ТЗЦены=ЗапросЦены.ВыполнитьИнструкцию(ТекстЗапросаЦены);

	ТЗЦены.ВыбратьСтроки();
	ТЗЦены.ПолучитьСтроку();

	ЗапросЦеныЦены=СоздатьОбъект("ODBCRecordSet");
	ЗапросЦеныЦены.УстановитьТекстовыйПараметр("Дата",ДатаЦены);
	ЗапросЦеныЦены.УстановитьТекстовыйПараметр("Цена",ТЗЦены.id);
	ЦенаЦены=ЗапросЦеныЦены.ВыполнитьСкалярный(ТекстЗапросаЦеныЦены);
	ЗапросЕдиницыЦены=СоздатьОбъект("ODBCRecordSet");
	ЗапросЕдиницыЦены.УстановитьТекстовыйПараметр("Дата",ДатаЦены);
	ЗапросЕдиницыЦены.УстановитьТекстовыйПараметр("Цена",ТЗЦены.id);
	ЕдиницаЦены=ЗапросЕдиницыЦены.ВыполнитьСкалярный(ТекстЗапросаЕдиницыЦены);
	Возврат ЦенаЦены;
КонецФункции
 


Работает. Отпрофилировал. Не понравилось, что много времени тратится на      ЗапросХХХХ=СоздатьОбъект("ODBCRecordSet");   
т.к. Функция в глобальнке - объявил эти переменные в глобальнике, создал объекты и т.п.... Время выполнения процедуры - увеличилось. Причем практически на порядок.... Почему? Чего я не понимаю?
  
Наверх
ICQ  
IP записан
 
DmitrO
1c++ power user
Отсутствует


ex developer

Сообщений: 579
Местоположение: г. Киров
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: Объясните поведение объекта RecordSet, плз...
Ответ #1 - 05. Марта 2007 :: 17:09
Печать  
Объяснению не поддается, не может такого быть. Вероятнее всего изменились другие факторы (БД, сервер, загрузка сервера/БД).

Замечания/рекомендации:
1. Можно выполнять разные запросы на одном объекте, т.е. совершенно очевидно что вместо 3-х объектов можно создавать 1;
2. Начиная с версии 1.8.1.6 создание объектов значительно ускорено, так что время создания объекта никак не может стать причиной описанного рефакторинга кода;
3. К данной задаче как нельзя лучше подходит применение режима RPC или параметризированных запросов, время выполнения может уменьшиться в разы.
  
Наверх
ICQ  
IP записан
 
Mikeware
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 262
Зарегистрирован: 27. Июля 2006
Пол: Мужской
Re: Объясните поведение объекта RecordSet, плз...
Ответ #2 - 06. Марта 2007 :: 04:46
Печать  
2 DmitrO: Другие факторы не менялись. Тестировалось таким образом - пробегалась вся номенклатура, и вызывались в одном цикле глВернутьЦену,  в другом - глВернутьЦенуSQL.  так 8 раз в разном сочетании (). Измерялось не только время (_GetPerfCounter), но и отношение времен исполнения стандартного/прямыми запросами. Оно упало с 35 до 4.
1.Создавая 3 объекта - да, тормознул Улыбка Исправлюсь.
2.  Версия компоенты - старше чем 1.8.1.6 -  2.0.2.2 Которая последняя перед разделением.
3. С параметризироваными понял, попробую - а вот RPC - можно примерчик?, в БОЛ не понял...


  
Наверх
ICQ  
IP записан
 
DmitrO
1c++ power user
Отсутствует


ex developer

Сообщений: 579
Местоположение: г. Киров
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: Объясните поведение объекта RecordSet, плз...
Ответ #3 - 06. Марта 2007 :: 05:26
Печать  
3. У ODBCRecrodset нужно просто включить режим RPC.
Код
Выбрать все
ЗапросЦены.РежимRPC(1); 

  
Наверх
ICQ  
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать