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


1C++ rocks!

Сообщений: 272
Местоположение: Санкт-Петербург
Зарегистрирован: 24. Января 2009
Пол: Мужской
Сравнение с методом ВыбратьПоЗначению(...)
22. Марта 2009 :: 08:23
Печать  
Дано: vfp oledb
Сравниваю с методом документа ВыбратьПоЗначению(Дата1,Дата2,ИдОтбора,ЗнОтбора)
и не могу даже приблизиться к этому методу по скорости при применении прямых запросов.
для этого метода получаются результаты

Цитата:
время по ВыбратьПоЗначению: 149
Кол. применения метода: 197 (в том числе учтены циклы выборок после метода)


для прямых запросов использовал несколько вариантов

самый быстрый получился

Код
Выбрать все
select
Док.Iddoc,$Док.Договор
from $Документ.РасходнаяНакладная Док
where $Док.Договор=:Договор    
 



Цитата:
время запроса: ~550 - в лучшем случае
КолЗапросов: 197


все остальные варианты -
с применением 1scrdoc, 1sjourn применения всевозможных индексов в этих таблицах
давали еще большее время. - уже ближе к 2000 - 4000

В чем я ошибаюсь ? Почему такой проигрыш во времени ?

  
Наверх
ICQ  
IP записан
 
leshik
1c++ donor
Отсутствует



Сообщений: 820
Местоположение: Пятигорск
Зарегистрирован: 22. Апреля 2007
Пол: Мужской
Re: оптимизация запроса
Ответ #1 - 22. Марта 2009 :: 08:29
Печать  
Покажи текст запроса с использованием _1scrdoc - я думаю что там некорректно индексы используются.
  
Наверх
IP записан
 
ol
Senior Member
****
Отсутствует


1C++ rocks!

Сообщений: 272
Местоположение: Санкт-Петербург
Зарегистрирован: 24. Января 2009
Пол: Мужской
Re: Сравнение с методом ВыбратьПоЗначению(...)
Ответ #2 - 22. Марта 2009 :: 08:34
Печать  
Код
Выбрать все
select
Отбор.CHILDID
from 1scrdoc Отбор
where
Отбор.MDID+Отбор.PARENTVAL+DTOS(Отбор.CHILDDATE)+Отбор.CHILDTIME+Отбор.CHILDID BETWEEN $ГрафаОтбора.Договор+'B1'+$ВидСправочника36.Договоры+:Договор+'"+Стр111+"' and $ГрафаОтбора.Договор+'B1'+$ВидСправочника36.Договоры+:Договор+'"+Стр222+"'

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

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


1C++ rocks!

Сообщений: 272
Местоположение: Санкт-Петербург
Зарегистрирован: 24. Января 2009
Пол: Мужской
Re: Сравнение с методом ВыбратьПоЗначению(...)
Ответ #3 - 22. Марта 2009 :: 08:36
Печать  
197 таких запросов дает результат порядка ~1050
  
Наверх
ICQ  
IP записан
 
Вадимко
God Member
*****
Отсутствует


Нам бы чего про ОдноЦэ...

Сообщений: 1048
Местоположение: Минск
Зарегистрирован: 24. Мая 2006
Пол: Мужской
Re: Сравнение с методом ВыбратьПоЗначению(...)
Ответ #4 - 22. Марта 2009 :: 15:47
Печать  
Вот как делает 1С + SQL

Select JOURN.* from _1SJOURN JOURN(NOLOCK INDEX=ACDATETIME), _1SCRDOC CRDOC(NOLOCK INDEX=PARENT) where JOURN.DATE_TIME_IDDOC=CRDOC.CHILD_DATE_TIME_IDDOC and CRDOC.MDID=@P1 and CRDOC.PARENTVAL=@P2 and CRDOC.CHILD_DATE_TIME_IDDOC>=@P3 and CRDOC.CHILD_DATE_TIME_IDDOC<=@P4 order by CRDOC.MDID, CRDOC.PARENTVAL, CRDOC.CHILD_DATE_TIME_IDDOC
  

Кампутер, кофе и сигареты - это очень плохо для моего здоровья...
Наверх
IP записан
 
ol
Senior Member
****
Отсутствует


1C++ rocks!

Сообщений: 272
Местоположение: Санкт-Петербург
Зарегистрирован: 24. Января 2009
Пол: Мужской
Re: Сравнение с методом ВыбратьПоЗначению(...)
Ответ #5 - 22. Марта 2009 :: 18:38
Печать  
неа, в oledb не прокатывает конструкция
1SCRDOC CRDOC(NOLOCK INDEX=PARENT)

Цитата:
FAILED! ICommandText::Execute(): Command contains unrecognized phrase/keyword
  
Наверх
ICQ  
IP записан
 
Вадимко
God Member
*****
Отсутствует


Нам бы чего про ОдноЦэ...

Сообщений: 1048
Местоположение: Минск
Зарегистрирован: 24. Мая 2006
Пол: Мужской
Re: Сравнение с методом ВыбратьПоЗначению(...)
Ответ #6 - 22. Марта 2009 :: 19:12
Печать  
Ну дык это для примера из SQL
Нолок с индексом не прокатит канечна, надо убрать + поля отличаются в DBF формате
Зато можно посмотреть какие индексы используются (поэтому оставил)
  

Кампутер, кофе и сигареты - это очень плохо для моего здоровья...
Наверх
IP записан
 
ol
Senior Member
****
Отсутствует


1C++ rocks!

Сообщений: 272
Местоположение: Санкт-Петербург
Зарегистрирован: 24. Января 2009
Пол: Мужской
Re: Сравнение с методом ВыбратьПоЗначению(...)
Ответ #7 - 22. Марта 2009 :: 19:28
Печать  
в запросе используется индекс "PARENT".
есть ли шанс ускорить этот запрос ? ведь выбратьпозначению как то работает ?
  
Наверх
ICQ  
IP записан
 
Вадимко
God Member
*****
Отсутствует


Нам бы чего про ОдноЦэ...

Сообщений: 1048
Местоположение: Минск
Зарегистрирован: 24. Мая 2006
Пол: Мужской
Re: Сравнение с методом ВыбратьПоЗначению(...)
Ответ #8 - 22. Марта 2009 :: 23:06
Печать  
Посмотри какие индексы предусмотрела 1С в ДБФ и попадай
Медленнее не должно быть если попадешь Улыбка
  

Кампутер, кофе и сигареты - это очень плохо для моего здоровья...
Наверх
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: Сравнение с методом ВыбратьПоЗначению(...)
Ответ #9 - 23. Марта 2009 :: 02:20
Печать  
1)ВыбратьПоЗначению - эквивалент "позиционирования головки" на первую запись индекса.
Общая же выборка вероятно несколько сотен записей.
Если документов 1000, то собственно операция позиционирования - 1/1000 общего времени считывания.

Нужно получать все документы или первый ?

2) Странно что запрос в (3) медленней чем в (1)
Вряд ли документов по клиенту больше чем всех расходных
Проверь такой код
Код
Выбрать все
Рез=глОлеДБ.Соединение("
	|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=""""");

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

ТабОтбор = "
|select
|Отбор.CHILDID
|from 1scrdoc Отбор
|where
|Отбор.MDID+Отбор.PARENTVAL+DTOS(Отбор.CHILDDATE)+Отбор.CHILDTIME+Отбор.CHILDID BETWEEN
|    $ГрафаОтбора.Договор+:ДлинныйДоговор+'"+Стр111+"'
|and $ГрафаОтбора.Договор+:ДлинныйДоговор+'"+Стр222+"'
|";

ОлеДБКоманда = глОлеДБ.СоздатьКоманду();
глМД = СоздатьОбъект("MetaDataWork");
ДлинныйДоговор=глМД.ЗначениеВСамуюДлиннуюСтрокуБД(Договор);
ОлеДБКоманда.УстановитьТекстовыйПараметр("ДлинныйДоговор",ДлинныйДоговор);
тзДокументы=ОлеДБКоманда.ВыполнитьИнструкцию(ТабОтбор );

  


При задании дат область поиска естестественно можно сузить


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


1C++ rocks!

Сообщений: 272
Местоположение: Санкт-Петербург
Зарегистрирован: 24. Января 2009
Пол: Мужской
Re: Сравнение с методом ВыбратьПоЗначению(...)
Ответ #10 - 23. Марта 2009 :: 08:24
Печать  
Код
Выбрать все
select
Отбор.CHILDID
from 1scrdoc Отбор
where
Отбор.MDID+Отбор.PARENTVAL+DTOS(Отбор.CHILDDATE)+Отбор.CHILDTIME+Отбор.CHILDID BETWEEN ' CR5'+'B1  34   30HП					   ' and ' CR5'+'B1  34   30HП	    ZZZZZZZZZZZZZZZZZZZZZZZ'
 




вот что показывает отладчик.

соотношения времен остались прежние, т.е. примерно:
4*ВыбратьПоЗначению = 2 * select $Документ.РасходнаяНакладная
= select 1scrdoc

Цитата:
2) Странно что запрос в (3) медленней чем в (1)
Вряд ли документов по клиенту больше чем всех расходных


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

ps Строка соединения используется аналогичная

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



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Сравнение с методом ВыбратьПоЗначению(...)
Ответ #11 - 23. Марта 2009 :: 08:32
Печать  
А если измерить скорость одного ВыбратьПоЗначению и одного ВыполнитьИнструкцию(ТекстЗапроса)?
Если надо выполнять много раз, то может стоит подготовить запрос?
  
Наверх
 
IP записан
 
ol
Senior Member
****
Отсутствует


1C++ rocks!

Сообщений: 272
Местоположение: Санкт-Петербург
Зарегистрирован: 24. Января 2009
Пол: Мужской
Re: Сравнение с методом ВыбратьПоЗначению(...)
Ответ #12 - 23. Марта 2009 :: 08:46
Печать  
JohnyDeath писал(а) 23. Марта 2009 :: 08:32:
А если измерить скорость одного ВыбратьПоЗначению и одного ВыполнитьИнструкцию(ТекстЗапроса)?
Если надо выполнять много раз, то может стоит подготовить запрос?


если один раз:
время по $Документ.РасходнаяНакладная: 4
время по ВыбратьПоЗначению: 0
время по 1scrdoc (индекс PARENT): 4

подготавливать не пробовал пока.

ктстати, будут ли отличаться условия по скорости выполнения:

Отбор.MDID+Отбор.PARENTVAL+DTOS(Отбор.CHILDDATE)+Отбор.CHILDTIME+Отбор.CHILDID BETWEEN ' CR5'+'B1  34   30HП                                 ' and ' CR5'+'B1  34   30HП          ZZZZZZZZZZZZZZZZZZZZZZZ'

и

Отбор.MDID+Отбор.PARENTVAL+DTOS(Отбор.CHILDDATE)+Отбор.CHILDTIME+Отбор.CHILDID BETWEEN ' CR5'+'B1  34   30HП' and ' CR5'+'B1  34   30HП          ZZZZZZZZZZZZZZZZZZZZZZZ'


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



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: Сравнение с методом ВыбратьПоЗначению(...)
Ответ #13 - 23. Марта 2009 :: 08:57
Печать  
Полный аналог (3) с использование графы будет несколько другой
Код
Выбрать все
ТабОтбор = "
|select
|Отбор.CHILDID
|from 1scrdoc Отбор
|left join 1SJourn as Жур on Жур.iddoc=Отбор.CHILDID
|where
 BETWEEN
|    $ГрафаОтбора.Договор+:ДлинныйДоговор+'"+Стр111+"'
|and $ГрафаОтбора.Договор+:ДлинныйДоговор+'"+Стр222+"')
|and Жур.IDDOCDEF=$ВидДокумента.РасходнаяНакладная
|";

 



ВыбратьПоЗначению - надо замерить со всеми Получить()

Проверить используется ли индекс можно так

Код
Выбрать все
ТабОтбор = "
|select
|Отбор.CHILDID
|from 1scrdoc Отбор
|where
|Отбор.MDID+Отбор.PARENTVAL+DTOS(Отбор.CHILDDATE)+Отбор.CHILDTIME+Отбор.CHILDID BETWEEN
|    $ГрафаОтбора.Договор+:ДлинныйДоговор+DTOS(:НачДата~~)+'"+Стр111+"'
|and $ГрафаОтбора.Договор+:ДлинныйДоговор+DTOS(:НачДата~~)+'"+Стр222+"'
|";
//где
Стр111=Формат("","с15");
Стр222=СтрЗаменить(Стр111," ","Z");
 


здесь добавлен отбор еще на дату - должен выполнять практически мгновенно - 0.001-0.010 сек
  
Наверх
 
IP записан
 
ol
Senior Member
****
Отсутствует


1C++ rocks!

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

попробую последний предложенный вариант, и напишу.

А что означает

Цитата:
Полный аналог (3) ...


не совсем понял, аналог чего
  
Наверх
ICQ  
IP записан
 
ol
Senior Member
****
Отсутствует


1C++ rocks!

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

поскольку параметризированный в dbf не работает, то видимо переплюнуть ВыбратьПоЗначению все таки не удасться.
Потом стало интересно хотя бы прийти к подобному времени.

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


1C++ rocks!

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

а замер запросов - с проверкой, есть ли в результирующей таблице строки, т.е. еще строка

ЕстьДоки=?(табЗапроса.Количество.Строк()>0,1,0);


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


1C++ rocks!

Сообщений: 272
Местоположение: Санкт-Петербург
Зарегистрирован: 24. Января 2009
Пол: Мужской
Re: Сравнение с методом ВыбратьПоЗначению(...)
Ответ #17 - 23. Марта 2009 :: 10:15
Печать  
Код
Выбрать все
select
Отбор.CHILDID
from 1scrdoc Отбор
where
Отбор.MDID+Отбор.PARENTVAL+DTOS(Отбор.CHILDDATE)+Отбор.CHILDTIME+Отбор.CHILDID BETWEEN
    ' CR5'+'B1  34   30HП	    '+DTOS({d '2009-03-23'})+'		   '
and ' CR5'+'B1  34   30HП	    '+DTOS({d '2009-03-23'})+'ZZZZZZZZZZZZZZZ'

 



сия конструкция выполнялась порядка 560 мс

выбратьпозначению (вместе с ПолучитьДокумент()), проверкой его вида, проведенности - меньше 100 мс

при том, что в методе было задано так:

ДокОбщ.ВыбратьПоЗначению(,,"Договор",Договор);
т.е. без ограничения по датам

(имеется в виду 197 вызовов метода и выполнения запроса)

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


1C++ rocks!

Сообщений: 272
Местоположение: Санкт-Петербург
Зарегистрирован: 24. Января 2009
Пол: Мужской
Re: Сравнение с методом ВыбратьПоЗначению(...)
Ответ #18 - 23. Марта 2009 :: 10:20
Печать  
в общем, всех запарил с этим dbf-ом (
  
Наверх
ICQ  
IP записан
 
Igor-bts
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 103
Зарегистрирован: 14. Июля 2006
Re: Сравнение с методом ВыбратьПоЗначению(...)
Ответ #19 - 23. Марта 2009 :: 10:50
Печать  
select
Отбор.CHILDID TOP 1
from 1scrdoc Отбор
where
Отбор.MDID+Отбор.PARENTVAL+DTOS(Отбор.CHILDDATE)+Отбор.CHILDTIME+Отбор.CHILDID BETWEEN
    ' CR5'+'B1  34   30HП          '+DTOS({d '2009-03-23'})+'               '
and ' CR5'+'B1  34   30HП          '+DTOS({d '2009-03-23'})+'ZZZZZZZZZZZZZZZ'

Быстрей не будет?
  
Наверх
ICQ  
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: Сравнение с методом ВыбратьПоЗначению(...)
Ответ #20 - 23. Марта 2009 :: 10:52
Печать  
Ощущение, что индекс не работает.
Хз почему.

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

ну это через подчиненные намного быстрее, а не через графу.
Или даже заводят спец спр для ускорения, если отображать надо в журнале



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


1C++ rocks!

Сообщений: 272
Местоположение: Санкт-Петербург
Зарегистрирован: 24. Января 2009
Пол: Мужской
Re: Сравнение с методом ВыбратьПоЗначению(...)
Ответ #21 - 23. Марта 2009 :: 11:01
Печать  
Цитата:
ну это через подчиненные намного быстрее, а не через графу.
Или даже заводят спец спр для ускорения, если отображать надо в журнале


ну у меня типовая бухгалтерия; скажем так - не хочу ее менять сильно.
а там у документа Счет нет подчиненных документов.
в ней вообще как то с подчиненными плохо, в типовой БУ
связывается все по договорам

Цитата:
select
Отбор.CHILDID TOP 1
...


пробовал; тоже не особо ускорило
  
Наверх
ICQ  
IP записан
 
ol
Senior Member
****
Отсутствует


1C++ rocks!

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


может быть со строкой подключения еще поиграть...

  
Наверх
ICQ  
IP записан
 
Igor-bts
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 103
Зарегистрирован: 14. Июля 2006
Re: Сравнение с методом ВыбратьПоЗначению(...)
Ответ #23 - 23. Марта 2009 :: 12:36
Печать  
еще вариант
попробовать избавится от betwin на ">" "<"
удалить DTOS

Отбор.MDID = ' CR5' AND Отбор.PARENTVAL = 'B1  34   30HП          ' AND Отбор.CHILDDATE+Отбор.CHILDTIME+Отбор.CHILDID >=
DTOS({d '2009-03-23'})+'               ' and  Отбор.CHILDDATE+Отбор.CHILDTIME+Отбор.CHILDID <=DTOS({d '2009-03-23'})+'ZZZZZZZZZZZZZZZ'

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


1C++ rocks!

Сообщений: 272
Местоположение: Санкт-Петербург
Зарегистрирован: 24. Января 2009
Пол: Мужской
Re: Сравнение с методом ВыбратьПоЗначению(...)
Ответ #24 - 23. Марта 2009 :: 13:04
Печать  
Igor-bts писал(а) 23. Марта 2009 :: 12:36:
еще вариант
попробовать избавится от betwin на ">" "<"
удалить DTOS

Отбор.MDID = ' CR5' AND Отбор.PARENTVAL = 'B1  34   30HП          ' AND Отбор.CHILDDATE+Отбор.CHILDTIME+Отбор.CHILDID >=
DTOS({d '2009-03-23'})+'               ' and  Отбор.CHILDDATE+Отбор.CHILDTIME+Отбор.CHILDID <=DTOS({d '2009-03-23'})+'ZZZZZZZZZZZZZZZ'




так мы точно играем мимо индекса
  
Наверх
ICQ  
IP записан
 
ol
Senior Member
****
Отсутствует


1C++ rocks!

Сообщений: 272
Местоположение: Санкт-Петербург
Зарегистрирован: 24. Января 2009
Пол: Мужской
Re: Сравнение с методом ВыбратьПоЗначению(...)
Ответ #25 - 23. Марта 2009 :: 13:05
Печать  
а вот избавиться от between  - это идея.
  
Наверх
ICQ  
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: Сравнение с методом ВыбратьПоЗначению(...)
Ответ #26 - 23. Марта 2009 :: 13:13
Печать  
да, интересно, если
а)
Отбор.MDID+Отбор.PARENTVAL+DTOS(Отбор.CHILDDATE)+Отбор.CHILDTIME+Отбор.CHILDID
б)
Отбор.MDID+Отбор.PARENTVAL+DTOS(Отбор.CHILDDATE)+Отбор.CHILDTIME
(мимо)

будут ли отличия по времени?
  
Наверх
 
IP записан
 
ol
Senior Member
****
Отсутствует


1C++ rocks!

Сообщений: 272
Местоположение: Санкт-Петербург
Зарегистрирован: 24. Января 2009
Пол: Мужской
Re: Сравнение с методом ВыбратьПоЗначению(...)
Ответ #27 - 23. Марта 2009 :: 13:14
Печать  
Код
Выбрать все
Отбор.MDID+Отбор.PARENTVAL+DTOS(Отбор.CHILDDATE)+Отбор.CHILDTIME+Отбор.CHILDID >=
 $ГрафаОтбора.Договор+:ДлинныйДоговор+DTOS(:НачДата~~)+'"+_Стр111+"'
and Отбор.MDID+Отбор.PARENTVAL+DTOS(Отбор.CHILDDATE)+Отбор.CHILDTIME+Отбор.CHILDID <=
$ГрафаОтбора.Договор+:ДлинныйДоговор+DTOS(:НачДата~~)+'"+_Стр222+"'

 



без between - тоже самое; м. только замедлилось еще чуток
  
Наверх
ICQ  
IP записан
 
ol
Senior Member
****
Отсутствует


1C++ rocks!

Сообщений: 272
Местоположение: Санкт-Петербург
Зарегистрирован: 24. Января 2009
Пол: Мужской
Re: Сравнение с методом ВыбратьПоЗначению(...)
Ответ #28 - 23. Марта 2009 :: 13:16
Печать  
kiruha писал(а) 23. Марта 2009 :: 13:13:
да, интересно, если
а)
Отбор.MDID+Отбор.PARENTVAL+DTOS(Отбор.CHILDDATE)+Отбор.CHILDTIME+Отбор.CHILDID
б)
Отбор.MDID+Отбор.PARENTVAL+DTOS(Отбор.CHILDDATE)+Отбор.CHILDTIME
(мимо)

будут ли отличия по времени?


в том то и дело, что отличия то есть - если писать точно индексное выражение - то все работает несколько быстрее; примерно ускоряется раза в 2 максимум
  
Наверх
ICQ  
IP записан
 
Igor-bts
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 103
Зарегистрирован: 14. Июля 2006
Re: Сравнение с методом ВыбратьПоЗначению(...)
Ответ #29 - 23. Марта 2009 :: 13:22
Печать  
Есть еще одна мысль для чего делать: DTOS(Отбор.CHILDDATE) можно ли его заменить на Отбор.CHILDDATE? По идее в этот момент мы конвертируем дату в строку, лишнее преобразование и, возможно, не попадаем в индекс.
  
Наверх
ICQ  
IP записан
 
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 записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: Сравнение с методом ВыбратьПоЗначению(...)
Ответ #45 - 24. Марта 2009 :: 21:13
Печать  
Попробую но днем Улыбка
  
Наверх
 
IP записан
 
ol
Senior Member
****
Отсутствует


1C++ rocks!

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


I Love YaBB 2!

Сообщений: 896
Зарегистрирован: 20. Мая 2006
Re: Сравнение с методом ВыбратьПоЗначению(...)
Ответ #47 - 25. Марта 2009 :: 05:47
Печать  
Что-то странные результаты. Почему-то не совпадает количество через 1С и 1sqlite.
Можешь тестовую базу выслать?
можно на orefkovСобакаgmail.com
  
Наверх
 
IP записан
 
ol
Senior Member
****
Отсутствует


1C++ rocks!

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


I Love YaBB 2!

Сообщений: 896
Зарегистрирован: 20. Мая 2006
Re: Сравнение с методом ВыбратьПоЗначению(...)
Ответ #49 - 25. Марта 2009 :: 06:33
Печать  
Поставил демобух. Правда там всего два счета вбито и одна накладная с договором из счета. Поэтому прогонял в цикле 1000 раз.
Запрос исправил в плане проверки проведенных документов. Код теста:

Код
Выбрать все
Функция лайтИнит()
	ЗагрузитьВнешнююКомпоненту("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 & 1 = 1
	|) [ЕстьОтгрузки :Число.1.0]
	|");
	Возврат запросПоДоговорамРН;
КонецФункции	// лайтИнит

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

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

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

 



База локальная.
Результаты:
В немонопольном режиме:
Код
Выбрать все
Количество запросов 1С = 2000
Время по ВыбратьПоЗначению: 679 Количество доков с отгрузкой = 1000
Количество запросов лайт = 2000
Время по лайт: 474 Количество доков с отгрузкой = 1000
 



В монопольном:
Код
Выбрать все
Количество запросов 1С = 2000
Время по ВыбратьПоЗначению: 434 Количество доков с отгрузкой = 1000
Количество запросов лайт = 2000
Время по лайт: 184 Количество доков с отгрузкой = 1000
 


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


1C++ rocks!

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

результаты в монополном
Цитата:
Время по ВыбратьПоЗначению: 55 Количество доков с отгрузкой = 107
Время по лайт: 97 Количество доков с отгрузкой = 107
Время по ВыбратьПоЗначению: 55 Количество доков с отгрузкой = 107
Время по лайт: 93 Количество доков с отгрузкой = 107
Время по ВыбратьПоЗначению: 59 Количество доков с отгрузкой = 107
Время по лайт: 91 Количество доков с отгрузкой = 107
Время по ВыбратьПоЗначению: 59 Количество доков с отгрузкой = 107
Время по лайт: 90 Количество доков с отгрузкой = 107
Время по ВыбратьПоЗначению: 55 Количество доков с отгрузкой = 107
Время по лайт: 93 Количество доков с отгрузкой = 107


в немонопольном (подключились два пользователя)

Цитата:
Время по ВыбратьПоЗначению: 66 Количество доков с отгрузкой = 108
Время по лайт: 74 Количество доков с отгрузкой = 108
Время по ВыбратьПоЗначению: 56 Количество доков с отгрузкой = 108
Время по лайт: 72 Количество доков с отгрузкой = 108
Время по ВыбратьПоЗначению: 57 Количество доков с отгрузкой = 108
Время по лайт: 73 Количество доков с отгрузкой = 108
Время по ВыбратьПоЗначению: 59 Количество доков с отгрузкой = 108
Время по лайт: 75 Количество доков с отгрузкой = 108
Время по ВыбратьПоЗначению: 60 Количество доков с отгрузкой = 108
Время по лайт: 76 Количество доков с отгрузкой = 108
  
Наверх
ICQ  
IP записан
 
ol
Senior Member
****
Отсутствует


1C++ rocks!

Сообщений: 272
Местоположение: Санкт-Петербург
Зарегистрирован: 24. Января 2009
Пол: Мужской
Re: Сравнение с методом ВыбратьПоЗначению(...)
Ответ #51 - 25. Марта 2009 :: 08:19
Печать  
результаты на реальной базе перевешивают  Улыбка
  
Наверх
ICQ  
IP записан
 
ol
Senior Member
****
Отсутствует


1C++ rocks!

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

Цитата:
Время по ВыбратьПоЗначению: 583 Количество доков с отгрузкой = 1080
Время по лайт: 679 Количество доков с отгрузкой = 1080
Время по ВыбратьПоЗначению: 571 Количество доков с отгрузкой = 1080
Время по лайт: 676 Количество доков с отгрузкой = 1080
Время по ВыбратьПоЗначению: 567 Количество доков с отгрузкой = 1080
Время по лайт: 687 Количество доков с отгрузкой = 1080
  
Наверх
ICQ  
IP записан
 
orefkov
1c++ developer
1c++ moderator
Отсутствует


I Love YaBB 2!

Сообщений: 896
Зарегистрирован: 20. Мая 2006
Re: Сравнение с методом ВыбратьПоЗначению(...)
Ответ #53 - 25. Марта 2009 :: 09:25
Печать  
Странные результаты. А можешь в отладчике с замером времени запустить и лог кинуть?
  
Наверх
 
IP записан
 
ol
Senior Member
****
Отсутствует


1C++ rocks!

Сообщений: 272
Местоположение: Санкт-Петербург
Зарегистрирован: 24. Января 2009
Пол: Мужской
Re: Сравнение с методом ВыбратьПоЗначению(...)
Ответ #54 - 25. Марта 2009 :: 12:47
Печать  
замер при запущенном отладчике:
Цитата:
Время по ВыбратьПоЗначению: 837 Количество доков с отгрузкой = 1080
Время по лайт: 787 Количество доков с отгрузкой = 1080
Время по ВыбратьПоЗначению: 838 Количество доков с отгрузкой = 1080
Время по лайт: 786 Количество доков с отгрузкой = 1080


замер без отладчика:
Цитата:
Время по ВыбратьПоЗначению: 532 Количество доков с отгрузкой = 1080
Время по лайт: 641 Количество доков с отгрузкой = 1080
Время по ВыбратьПоЗначению: 534 Количество доков с отгрузкой = 1080
Время по лайт: 639 Количество доков с отгрузкой = 1080


так что замер в отладчике не поможет  Печаль

но лог все равно положу
  

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



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: Сравнение с методом ВыбратьПоЗначению(...)
Ответ #55 - 25. Марта 2009 :: 16:21
Печать  
Написал хранимые - но на демо результат слабее 1С.
Видимо на столь быстрых запрсах много времени уходит на хранимую
  
Наверх
 
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: Сравнение с методом ВыбратьПоЗначению(...)
Ответ #56 - 25. Марта 2009 :: 16:22
Печать  
Собственно тест, кому интересно написание хранимых
Код
Выбрать все
Процедура СоздатьПроцедуру(ТекстПроцедуры,ИмяПроцедуры)
	ПутьККаталогу=КаталогИБ();
	ИмяФайлаПроцедуры=ИмяПроцедуры+".prg";
	Если ФС.СуществуетФайл(ПутьККаталогу+ИмяФайлаПроцедуры)=1 Тогда
		Возврат;
	КонецЕсли;
	ФайлТекст=СоздатьОбъект("Текст");
	Для ИИ=1 По  СтрКоличествоСтрок(ТекстПроцедуры) Цикл
		СтрокаТекста=	 СтрПолучитьСтроку(ТекстПроцедуры,ИИ);
		ФайлТекст.ДобавитьСтроку(СтрокаТекста);
	КонецЦикла;
	ФайлТекст.Записать(ИмяФайлаПроцедуры);
КонецПроцедуры

Функция ФоксИнит()  
	ОлеДБ = СоздатьОбъект("OLEDBData");  
	Рез=ОлеДБ.Соединение("  
	|Provider=VFPOLEDB.1;  
	|Data Source=" + КаталогИБ() + ";  
	|Null = Yes;
	|Exclusive = No;
	|SourceType = DBF;
	|Mode=ReadWrite;  
	|ANSI= 0;
	|EXACT=0;
	|NEAR -1;  
	|REFRESH TO 0,-1;
	|REPROCESS TO 60 SECONDS;
	|TABLEVALIDATE 0;
    |Collating Sequence=MACHINE;
	|");
	ТекстПроцедурыОткрытия="
	|SET NEAR ON
	|USE 1SCRDOC IN 1 ALIAS OTBOR
	|USE 1SJOURN IN 2 ALIAS JUR
	|SELECT JUR
	|SET ORDER TO TAG IDDOC OF  '1SJOURN.CDX'
	|SELECT OTBOR
	|SET RELATION TO CHILDID INTO JUR
	|SET ORDER TO TAG PARENT OF  '1SCRDOC.CDX'
	|";
	ТекстПроцедурыПоиска="
	|LPARAMETERS dogovor,grapha,VIDRash
	|GO TOP IN OTBOR
	|IndexValue=grapha+dogovor
	|SEEK (IndexValue)
	|IF NOT FOUND()  THEN
	|	Return 0  
	|ENDIF    
	|KolDoc=0
	|DO WHILE  (OTBOR.MDID==grapha)AND(OTBOR.PARENTVAL==dogovor)
	|	IF(JUR.CLOSED==5)AND(JUR.IDDOCDEF==VIDRash)THEN
	|		KolDoc=KolDoc+1
	|      	RETURN KolDoc
	|        
	|	ENDIF
	|	SKIP 1
	|	IF EOF()OR BOF() THEN
	|		RETURN KolDoc
	|	ENDIF      
	|ENDDO
	|RETURN KolDoc
	|";  

    СоздатьПроцедуру(ТекстПроцедурыОткрытия,"OpenTabKolDoc");
    СоздатьПроцедуру(ТекстПроцедурыПоиска,"GetKolDoc");


	Возврат ОлеДБ
КонецФункции
//*******************************************
Процедура Сформировать()
     Если ЗагрузитьВнешнююКомпоненту(КаталогИБ()+"1CPP.dll")=0 Тогда
	//	Если ЗагрузитьВнешнююКомпоненту("1CPP.dll")=0 Тогда
			Предупреждение("Не удалось обнаружить компоненту 1CPP.dll!",20);

			Возврат;
	//	КонецЕсли;
    КонецЕсли;

	глМД = СоздатьОбъект("MetaDataWork");

	ГрафаОтбораДоговор=глМД.ОбрМетаСКЛ("$ГрафаОтбора.Договор");
	ВидДокРасх=глМД.ОбрМетаСКЛ("$ВидДокумента.РасходнаяНакладная");
	ОлеДБ = ФоксИнит();  
    локОлеДБКоманда = ОлеДБ.СоздатьКоманду();
	локОлеДБКоманда.Выполнить("OpenTabKolDoc()");
	ТЗ=СоздатьОбъект("ТаблицаЗначений");
	ТЗ.НоваяКолонка("return_value");

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

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

	КолЗапросов = 0;
	счетнач	= _GetPerformanceCounter();
	Для Номер = 1 По 1000 Цикл
		Док.ВыбратьДокументы();
		Пока Док.ПолучитьДокумент() = 1 цикл
			Если ПустоеЗначение(Док.Договор)=1 тогда продолжить КонецЕсли;
			  КолЗапросов=КолЗапросов+1;  
			  ДлинныйДоговор="'"+глМД.ЗначениеВСамуюДлиннуюСтрокуБД(Док.Договор)+"'";
			  ТЗ.УдалитьСтроки();
			 Договор+","+ВидДокРасх+")",ТЗ,0);
			  Кол=ТЗ.ПолучитьЗначение(1,"return_value");

			  КолДоковСОтгрузкойЛайт = КолДоковСОтгрузкойЛайт + Кол;

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


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


1C++ rocks!

Сообщений: 272
Местоположение: Санкт-Петербург
Зарегистрирован: 24. Января 2009
Пол: Мужской
Re: Сравнение с методом ВыбратьПоЗначению(...)
Ответ #57 - 25. Марта 2009 :: 16:48
Печать  
ага, kiruha, спасибо за пример!  буду изучать
  
Наверх
ICQ  
IP записан
 
ol
Senior Member
****
Отсутствует


1C++ rocks!

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


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


1C++ rocks!

Сообщений: 272
Местоположение: Санкт-Петербург
Зарегистрирован: 24. Января 2009
Пол: Мужской
Re: Сравнение с методом ВыбратьПоЗначению(...)
Ответ #59 - 25. Марта 2009 :: 17:45
Печать  
возможно, из-за того, что хранимая процедура в файле и приходится его много раз читать; вот если разместить ее в курсоре - где то я наталкивался
  
Наверх
ICQ  
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: Сравнение с методом ВыбратьПоЗначению(...)
Ответ #60 - 25. Марта 2009 :: 17:49
Печать  
ol писал(а) 25. Марта 2009 :: 17:45:
возможно, из-за того, что хранимая процедура в файле и приходится его много раз читать; вот если разместить ее в курсоре - где то я наталкивался


+ Еще не параметризована.
Но даже после ряда оптимизаций наверно 1С выборка будет быстрее.

Пока итог -
видимо все таки для счетов лучше завести спец справочник где хранить - есть ли отгрузка или нет Улыбка
С реквизитом счет и отбором по реквизиту.
  
Наверх
 
IP записан
 
ol
Senior Member
****
Отсутствует


1C++ rocks!

Сообщений: 272
Местоположение: Санкт-Петербург
Зарегистрирован: 24. Января 2009
Пол: Мужской
Re: Сравнение с методом ВыбратьПоЗначению(...)
Ответ #61 - 25. Марта 2009 :: 18:13
Печать  
самое смешное в этой теме, то что собственно необходимость использования альтернативы ВыбратьПоЗначению не материализована; т.е. я еще не устанавливал на рабочей базе этого показа наличия отгрузки в журнале. Возможно, что будет нормально и без всяких извратов
  
Наверх
ICQ  
IP записан
 
Переключение на Главную Страницу Страницы: [1] 
ОтправитьПечать