Переключение на Главную Страницу Страницы: [1] 2 3 ... 5 ОтправитьПечать
Очень популярная тема (более 25 ответов) Сравнение с методом ВыбратьПоЗначению(...) (число прочтений - 13953 )
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 записан
 
Переключение на Главную Страницу Страницы: [1] 2 3 ... 5
ОтправитьПечать