Переключение на Главную Страницу Страницы: 1 2 [3] 4 5  ОтправитьПечать
Очень популярная тема (более 25 ответов) Сравнение с методом ВыбратьПоЗначению(...) (число прочтений - 13981 )
ol
Senior Member
****
Отсутствует


1C++ rocks!

Сообщений: 272
Местоположение: Санкт-Петербург
Зарегистрирован: 24. Января 2009
Пол: Мужской
Re: Сравнение с методом ВыбратьПоЗначению(...)
Ответ #30 - 23. Марта 2009 :: 13:23
Печать  
хотя нет, соврал:

Код
Выбрать все
where
Отбор.MDID+Отбор.PARENTVAL+DTOS(Отбор.CHILDDATE)+Отбор.CHILDTIME BETWEEN
    $ГрафаОтбора.Договор+:ДлинныйДоговор+'"+_Стр111+"'
and $ГрафаОтбора.Договор+:ДлинныйДоговор+'"+_Стр222+"'


где
_Стр111=Формат("","с14");
_Стр222=СтрЗаменить(_Стр111," ","Z");

 



отрабатывал порядка 4000 мс, тогда как

Код
Выбрать все
where
Отбор.MDID+Отбор.PARENTVAL+DTOS(Отбор.CHILDDATE)+Отбор.CHILDTIME+Отбор.CHILDID BETWEEN
    $ГрафаОтбора.Договор+:ДлинныйДоговор+'"+_Стр111+"'
and $ГрафаОтбора.Договор+:ДлинныйДоговор+'"+_Стр222+"'


где
_Стр111=Формат("","с23");
_Стр222=СтрЗаменить(_Стр111," ","Z");

 



порядка 620 мс

да, все таки - принципиально указывать
именно _Стр111=Формат("","с23");
нельзя ли написать

_Стр111=Формат("","с50");
_Стр222=СтрЗаменить(_Стр111," ","Z");
_Стр111="";
, т.е. более универсальные такие строчки, независимо от вида индекса и его длинны ?
  
Наверх
ICQ  
IP записан
 
ol
Senior Member
****
Отсутствует


1C++ rocks!

Сообщений: 272
Местоположение: Санкт-Петербург
Зарегистрирован: 24. Января 2009
Пол: Мужской
Re: Сравнение с методом ВыбратьПоЗначению(...)
Ответ #31 - 23. Марта 2009 :: 13:38
Печать  
Igor-bts писал(а) 23. Марта 2009 :: 13:22:
Есть еще одна мысль для чего делать: DTOS(Отбор.CHILDDATE) можно ли его заменить на Отбор.CHILDDATE? По идее в этот момент мы конвертируем дату в строку, лишнее преобразование и, возможно, не попадаем в индекс.


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



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: Сравнение с методом ВыбратьПоЗначению(...)
Ответ #32 - 23. Марта 2009 :: 13:42
Печать  
ol писал(а) 23. Марта 2009 :: 13:23:
да, все таки - принципиально указывать
именно _Стр111=Формат("","с23");
нельзя ли написать

_Стр111=Формат("","с50");
_Стр222=СтрЗаменить(_Стр111," ","Z");
_Стр111="";
, т.е. более универсальные такие строчки, независимо от вида индекса и его длинны ?


Да наиболее просто писать
Код
Выбрать все
where
Отбор.MDID+Отбор.PARENTVAL+DTOS(Отбор.CHILDDATE)+Отбор.CHILDTIME+Отбор.CHILDID =
    $ГрафаОтбора.Договор+:ДлинныйДоговор 



только после создания OLEDBDATA надо один раз
Код
Выбрать все
ОлеДБКоманда.Выполнить("EXEC('SET ANSI OFF')");
 



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


I Love YaBB 2!

Сообщений: 896
Зарегистрирован: 20. Мая 2006
Re: Сравнение с методом ВыбратьПоЗначению(...)
Ответ #33 - 24. Марта 2009 :: 09:57
Печать  
Кинь код, что делается на языке 1С, попробую для 1sqlite забацать, сравним.
  
Наверх
 
IP записан
 
ol
Senior Member
****
Отсутствует


1C++ rocks!

Сообщений: 272
Местоположение: Санкт-Петербург
Зарегистрирован: 24. Января 2009
Пол: Мужской
Re: Сравнение с методом ВыбратьПоЗначению(...)
Ответ #34 - 24. Марта 2009 :: 11:23
Печать  
отчет - м. проверять в типовой БУ
  

________________________002.ert ( 47 KB | Загрузки )
Наверх
ICQ  
IP записан
 
orefkov
1c++ developer
1c++ moderator
Отсутствует


I Love YaBB 2!

Сообщений: 896
Зарегистрирован: 20. Мая 2006
Re: Сравнение с методом ВыбратьПоЗначению(...)
Ответ #35 - 24. Марта 2009 :: 12:54
Печать  
В обработке то варианты тестирования. Ты лучше напиши что реально нужно получить.

Правильно ли я понял - нужно получить табличку с колонками
Счет с непустым договором | Количество проведенных расходных накладных с таким же договором

или как? Если несколько счетов с одинаковым договором то как?

те
Цитата:
в журнале документов в текстовом поле показать, была ли отгрузка по счету и было желание ускориться при помощи прямых запросов

вот это можешь показать, как это делалось до прямых запросов?
  
Наверх
 
IP записан
 
ol
Senior Member
****
Отсутствует


1C++ rocks!

Сообщений: 272
Местоположение: Санкт-Петербург
Зарегистрирован: 24. Января 2009
Пол: Мужской
Re: Сравнение с методом ВыбратьПоЗначению(...)
Ответ #36 - 24. Марта 2009 :: 13:14
Печать  
задача простая - есть ли хоть одна проведенная РасходнаяНакладная с тем же договором, что и у счета


это функция из модуля формы списка журнала документов (вызывается из колонки типа Текст)

Код
Выбрать все
Функция ЕстьОтгрузка()


	Если ПустоеЗначение(ТекущийДокумент)=1 тогда возврат "" КонецЕсли;
	Если ПустоеЗначение(ТекущийДокумент.Договор)=1 тогда возврат "" КонецЕсли;


	ДокОбщ.ВыбратьПоЗначению(,,"Договор",ТекущийДокумент.Договор);
	Пока ДокОбщ.ПолучитьДокумент()=1 цикл
		Если ДокОбщ.Проведен()=0 тогда
		ИначеЕсли ДокОбщ.Вид()="РасходнаяНакладная" тогда
			возврат 1;

		КонецЕсли;
	КонецЦикла;
	возврат 0;

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

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


I Love YaBB 2!

Сообщений: 896
Зарегистрирован: 20. Мая 2006
Re: Сравнение с методом ВыбратьПоЗначению(...)
Ответ #37 - 24. Марта 2009 :: 13:59
Печать  
Попробуй с последней 1sqlite

Код
Выбрать все
// В начале модуля
.....
Перем запросПоДоговорамРН;
.....

// В ПриОткрытии
.....
ЗагрузитьВнешнююКомпоненту("1sqlite.dll");
база = СоздатьОбъект("SQLiteBase");
база.Открыть(":memory:");
запросПоДоговорамРН = база.НовыйЗапрос();
запросПоДоговорамРН.Подготовить("
|select exists(
|	select *
|	from __1S_crdoc cr inner join Журнал Ж on cr.childid = Ж.iddoc
|	where cr.mdid = :ГрафаОтбора.Договор and cr.parentval = @Договор
|	and Ж.iddocdef = :ВидДокумента.РасходнаяНакладная and Ж.closed > 0
|) [ЕстьОтгрузки :Число.1.0]
|");
.....

Функция ЕстьОтгрузка()
	Если ПустоеЗначение(ТекущийДокумент) = 1 Тогда
		Возврат ""
	ИначеЕсли ПустоеЗначение(ТекущийДокумент.Договор) = 1 Тогда
		Возврат ""
	КонецЕсли;
	запросПоДоговорамРН.УстановитьПараметр("@Договор", ТекущийДокумент.Договор, -1);
	Возврат запросПоДоговорамРН.Выполнить(0);
КонецФункции
 


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


I Love YaBB 2!

Сообщений: 896
Зарегистрирован: 20. Мая 2006
Re: Сравнение с методом ВыбратьПоЗначению(...)
Ответ #38 - 24. Марта 2009 :: 14:29
Печать  
Вот тест для сравнения производительности, типовой бухии у меня нет, проверьте ктонить.
Код
Выбрать все
Функция лайтИнит()
	ЗагрузитьВнешнююКомпоненту("1sqlite.dll");
	база = СоздатьОбъект("SQLiteBase");
	база.Открыть(":memory:");
	запросПоДоговорамРН = база.НовыйЗапрос();
	запросПоДоговорамРН.Подготовить("
	|select exists(
	|	select *
	|	from __1S_crdoc cr inner join Журнал Ж on cr.childid = Ж.iddoc
	|	where cr.mdid = :ГрафаОтбора.Договор and cr.parentval = @Договор
	|	and Ж.iddocdef = :ВидДокумента.РасходнаяНакладная and Ж.closed > 0
	|) [ЕстьОтгрузки :Число.1.0]
	|");
	Возврат запросПоДоговорамРН;
КонецФункции	// лайтИнит

Процедура Сформировать()
	ЗапросЛайт = лайтИнит();
	Док = СоздатьОбъект("Документ.Счет");
	КолДоковСОтгрузкой1С = 0;
	КолДоковСОтгрузкойЛайт = 0;
	КолЗапросов = 0;
	ДокОбщ = СоздатьОбъект("Документ");

	счетнач	= _GetPerformanceCounter();
	Док.ВыбратьДокументы();
	Пока Док.ПолучитьДокумент()=1 цикл
		Если ПустоеЗначение(Док.Договор)=1 тогда продолжить КонецЕсли;
		КолЗапросов=КолЗапросов+1;
		ДокОбщ.ВыбратьПоЗначению(,,"Договор",Док.Договор);
		Пока ДокОбщ.ПолучитьДокумент()=1 цикл
			Если ДокОбщ.Проведен()=0 тогда
			ИначеЕсли ДокОбщ.Вид()="РасходнаяНакладная" тогда
				КолДоковСОтгрузкой1С = КолДоковСОтгрузкой1С + 1;
				Прервать;
			КонецЕсли;
		КонецЦикла;
	КонецЦикла;
	счеткон=_GetPerformanceCounter();
	Сообщить("Количество запросов 1С = " + КолЗапросов);
	Сообщить("Время по ВыбратьПоЗначению: "+(счеткон-счетнач) +
		" Количество доков с отгрузкой = " + КолДоковСОтгрузкой1С);

	КолЗапросов = 0;
	счетнач	= _GetPerformanceCounter();
	Док.ВыбратьДокументы();
	Пока Док.ПолучитьДокумент() = 1 цикл
		Если ПустоеЗначение(Док.Договор)=1 тогда продолжить КонецЕсли;
		КолЗапросов=КолЗапросов+1;
		ЗапросЛайт.УстановитьПараметр("@Договор", Док.Договор, -1);
		КолДоковСОтгрузкойЛайт = КолДоковСОтгрузкойЛайт + ЗапросЛайт.Выполнить(0);
	КонецЦикла;
	счеткон=_GetPerformanceCounter();
	Сообщить("Количество запросов лайт = " + КолЗапросов);
	Сообщить("Время по лайт: "+(счеткон-счетнач) +
		" Количество доков с отгрузкой = " + КолДоковСОтгрузкойЛайт);
КонецПроцедуры

 

  
Наверх
 
IP записан
 
ol
Senior Member
****
Отсутствует


1C++ rocks!

Сообщений: 272
Местоположение: Санкт-Петербург
Зарегистрирован: 24. Января 2009
Пол: Мужской
Re: Сравнение с методом ВыбратьПоЗначению(...)
Ответ #39 - 24. Марта 2009 :: 16:25
Печать  
запускаю - ругается

Цитата:
ЗапросЛайт.УстановитьПараметр("@Договор", Док.Договор,-1);
{H:\HOME\NADY\PA\ТЕСТ ЗАПРОСА С 1SQLLITE.ERT(55)}: Слишком много параметров передано при вызове функции/процедуры объекта
  
Наверх
ICQ  
IP записан
 
ol
Senior Member
****
Отсутствует


1C++ rocks!

Сообщений: 272
Местоположение: Санкт-Петербург
Зарегистрирован: 24. Января 2009
Пол: Мужской
Re: Сравнение с методом ВыбратьПоЗначению(...)
Ответ #40 - 24. Марта 2009 :: 16:34
Печать  
я с sqllite не работал; подскажи, какой последний релиз, и где он находится ?
  
Наверх
ICQ  
IP записан
 
orefkov
1c++ developer
1c++ moderator
Отсутствует


I Love YaBB 2!

Сообщений: 896
Зарегистрирован: 20. Мая 2006
Re: Сравнение с методом ВыбратьПоЗначению(...)
Ответ #41 - 24. Марта 2009 :: 18:24
Печать  
  
Наверх
 
IP записан
 
ol
Senior Member
****
Отсутствует


1C++ rocks!

Сообщений: 272
Местоположение: Санкт-Петербург
Зарегистрирован: 24. Января 2009
Пол: Мужской
Re: Сравнение с методом ВыбратьПоЗначению(...)
Ответ #42 - 24. Марта 2009 :: 18:40
Печать  
ок, спасибо, заработало )
результаты следующие

Цитата:
Количество запросов 1С = 197
Время по ВыбратьПоЗначению: 215 Количество доков с отгрузкой = 107
Количество запросов лайт = 197
Время по лайт: 240 Количество доков с отгрузкой = 116
Количество запросов 1С = 197
Время по ВыбратьПоЗначению: 204 Количество доков с отгрузкой = 107
Количество запросов лайт = 197
Время по лайт: 261 Количество доков с отгрузкой = 116
Количество запросов 1С = 197
Время по ВыбратьПоЗначению: 206 Количество доков с отгрузкой = 107
Количество запросов лайт = 197
Время по лайт: 231 Количество доков с отгрузкой = 116
Количество запросов 1С = 197
Время по ВыбратьПоЗначению: 236 Количество доков с отгрузкой = 107
Количество запросов лайт = 197
Время по лайт: 230 Количество доков с отгрузкой = 116
Количество запросов 1С = 197
Время по ВыбратьПоЗначению: 201 Количество доков с отгрузкой = 107
Количество запросов лайт = 197
Время по лайт: 234 Количество доков с отгрузкой = 116
Количество запросов 1С = 197
Время по ВыбратьПоЗначению: 210 Количество доков с отгрузкой = 107
Количество запросов лайт = 197
Время по лайт: 234 Количество доков с отгрузкой = 116


в общем получше, чем с oledb; но ВыбратьПоЗначению все одно выигрывает
  
Наверх
ICQ  
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: Сравнение с методом ВыбратьПоЗначению(...)
Ответ #43 - 24. Марта 2009 :: 20:50
Печать  
Задача заточена под навигационный доступ
1С использует этот способ - поэтому выигрывает.

Обычные программы Fox  очень часто использует навигационный  доступ, но
fox oledb не очень приспособлен  для такого доступа  -
но все же можно написать хранимую процедуру  и посмотреть время с использование процедуры.

Также учти, что при многопользовательском доступе в 1с время может увеличиться в несколько раз,
Fox же только на несколько процентов (это относится правда, в большей части, к запросам).

P.S> Реляционный - это при помощи запроса
Навигационный - организовать выборку файла по индексу и двигаться по нему считывая последовательно данные
  
Наверх
 
IP записан
 
ol
Senior Member
****
Отсутствует


1C++ rocks!

Сообщений: 272
Местоположение: Санкт-Петербург
Зарегистрирован: 24. Января 2009
Пол: Мужской
Re: Сравнение с методом ВыбратьПоЗначению(...)
Ответ #44 - 24. Марта 2009 :: 21:11
Печать  
kiruha, не поможешь написать эту хранимую процедуру ? для примера, у меня в foxe знания нулевые (
  
Наверх
ICQ  
IP записан
 
Переключение на Главную Страницу Страницы: 1 2 [3] 4 5 
ОтправитьПечать