Переключение на Главную Страницу Страницы: 1 [2]  ОтправитьПечать
Очень популярная тема (более 25 ответов) Запрос прямой и черный (число прочтений - 6704 )
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3051
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Запрос прямой и черный
Ответ #15 - 11. Августа 2009 :: 07:59
Печать  
vandalsvq писал(а) 11. Августа 2009 :: 07:57:
2 trad
в SQLite или где?

ну я не знаю где там у вас дбф-щиков это делается Улыбка
  

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


Я всего лишь als-особиратель
;-)

Сообщений: 2487
Местоположение: Уфа
Зарегистрирован: 18. Июля 2007
Пол: Мужской
Re: Запрос прямой и черный
Ответ #16 - 11. Августа 2009 :: 08:13
Печать  
Вот примеры с расчетом времени выполнения

Код
Выбрать все
SELECT Жур.*
FROM Журнал AS Жур
LEFT JOIN Документ_АвансовыйОтчет AS ДокАвансовыйОтчет
ON Жур.IDDOC = ДокАвансовыйОтчет.IDDOC
WHERE Жур.idx_IDDOCDEF_DATE_TIME_IDDOC BETWEEN ' A2L'||'20070101' AND ' A2L'||'20080101'
Подбор индекса для таблицы 1SJOURN:
	Ограничения: DOCTYPE[dx_IDDOCDEF_DATE_TIME_IDDOC]>=; DOCTYPE[dx_IDDOCDEF_DATE_TIME_IDDOC]<=;
	Найдено в кэше
	Выбран индекс DOCTYPE: IDDOCDEF+DTOS(DATE)+TIME+IDDOC
	Стоимость: 18
Подбор индекса для таблицы DH13053:
	Ограничения: IDDOC=;
	Найдено в кэше
	Выбран индекс ID: IDDOC
	Стоимость: 14
Время подготовки запроса: 32 мс, время выполнения запроса: 226 мс. 



Код
Выбрать все
SELECT Жур.*
FROM Журнал AS Жур
LEFT JOIN Документ_АвансовыйОтчет AS ДокАвансовыйОтчет
ON Жур.IDDOC = ДокАвансовыйОтчет.IDDOC
WHERE Жур.IDDOCDEF = ' A2L'
AND Жур.DATE BETWEEN '20070101' AND '20080101'
Подбор индекса для таблицы 1SJOURN:
	Ограничения: IDDOCDEF=; DATE>=; DATE<=;
	Найдено в кэше
	Выбран индекс DOCTYPE: IDDOCDEF+DTOS(DATE)+TIME+IDDOC
	Стоимость: 36
Подбор индекса для таблицы DH13053:
	Ограничения: IDDOC=;
	Найдено в кэше
	Выбран индекс ID: IDDOC
	Стоимость: 14
Время подготовки запроса: 30 мс, время выполнения запроса: 231 мс. 



Как видим разница не значительна. SQLite и в том и в другом случае выбирает индекс DOCTYPE, правда цена его использования несколько разная, и если приписать к датам '     0     0   ' то будет еще капельку эффективнее. В общем вот  Улыбка
  

Отхожу от дел. Долго и мучительно.
Наверх
IP записан
 
Kondarat
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 83
Зарегистрирован: 21. Декабря 2007
Re: Запрос прямой и черный
Ответ #17 - 11. Августа 2009 :: 08:55
Печать  
В моем случае результаты следующие:
Код
Выбрать все
	|LEFT JOIN
	|	Документ_ЗаказНаряд AS ЗН
	|ON
	|	ЗН.IDDOC = Жур.IDDOC
	|WHERE
//	|   Жур.IDDOCDEF = :ВидДокумента.ЗаказНаряд AND
//	|	Жур.DATE BETWEEN :ДатаНачала AND :ДатаКонца
	|	idx_IDDOCDEF_DATE_TIME_IDDOC BETWEEN :ВидДокумента.ЗаказНаряд||:ДатаНачала AND :ВидДокумента.ЗаказНаряд||:ДатаКонца~
	|AND
	|	ЗН.Подразделение = :Подразделение AND
	|	Жур.CLOSED = 1
	|GROUP BY
	|	ДокСтроки.IDDOC
	|ORDER BY
	|	Жур.DATE
	|";

 



Черный -  Прошло = 102
Документов = 36
Прямой - Прошло = 83
Документов = 36

Код
Выбрать все
	|ON
	|	ЗН.IDDOC = Жур.IDDOC
	|WHERE
	|   Жур.IDDOCDEF = :ВидДокумента.ЗаказНаряд AND
	|	Жур.DATE BETWEEN :ДатаНачала AND :ДатаКонца
//	|	idx_IDDOCDEF_DATE_TIME_IDDOC BETWEEN :ВидДокумента.ЗаказНаряд||:ДатаНачала AND :ВидДокумента.ЗаказНаряд||:ДатаКонца~
	|AND
	|	ЗН.Подразделение = :Подразделение AND
	|	Жур.CLOSED = 1
	|GROUP BY
	|	ДокСтроки.IDDOC
	|ORDER BY
	|	Жур.DATE
	|";

 



Черный -  Прошло = 101
Документов = 36
Прямой - Прошло = 84
Документов = 36

Значит использование
Код
Выбрать все
	|   Жур.IDDOCDEF = :ВидДокумента.ЗаказНаряд AND
	|	Жур.DATE BETWEEN :ДатаНачала AND :ДатаКонца
 



или

Код
Выбрать все
idx_IDDOCDEF_DATE_TIME_IDDOC BETWEEN ...
 



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

Код
Выбрать все
	|LEFT JOIN
	|	Документ_ЗаказНаряд AS ЗН
	|ON
	|	ЗН.IDDOC = Жур.IDDOC
	|WHERE
//	|   Жур.IDDOCDEF = :ВидДокумента.ЗаказНаряд AND
	|	Жур.DATE BETWEEN :ДатаНачала AND :ДатаКонца
//	|	idx_IDDOCDEF_DATE_TIME_IDDOC BETWEEN :ВидДокумента.ЗаказНаряд||:ДатаНачала AND :ВидДокумента.ЗаказНаряд||:ДатаКонца~
	|AND
	|	ЗН.Подразделение = :Подразделение AND
	|	Жур.CLOSED = 1
	|GROUP BY
	|	ДокСтроки.IDDOC
	|ORDER BY
	|	Жур.DATE
	|";

Черный -  Прошло = 109
Документов = 36
Прямой - Прошло = 147
Документов = 36
 



Выходит не зависимо от типизации в полях выборки и соединения с таблицей документа, отбор в журнале по виду документа является предпочтительным?


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


Я всего лишь als-особиратель
;-)

Сообщений: 2487
Местоположение: Уфа
Зарегистрирован: 18. Июля 2007
Пол: Мужской
Re: Запрос прямой и черный
Ответ #18 - 11. Августа 2009 :: 09:07
Печать  
В последнем варианте скорее всего выбран индекс DATE_TIME_IDDOC? Посмотри в отладке... если нет, попробуй принудительно указать. Хотя скорее всего выигрыш будет маленьким. Вероятнее всего проблема именнов CLOSED = 1 и Подразделение = :Подразделение поскольку по обоим данным полям индекса нет.

А если интересно, можно перекинуть конфу на SQL посмотреть какой запрос пойдет в профайлере, может что поумнее 1С придумает там Улыбка  Подмигивание
  

Отхожу от дел. Долго и мучительно.
Наверх
IP записан
 
Kondarat
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 83
Зарегистрирован: 21. Декабря 2007
Re: Запрос прямой и черный
Ответ #19 - 11. Августа 2009 :: 10:15
Печать  
vandalsvq писал(а) 11. Августа 2009 :: 09:07:
В последнем варианте скорее всего выбран индекс DATE_TIME_IDDOC? Посмотри в отладке... если нет, попробуй принудительно указать. Хотя скорее всего выигрыш будет маленьким. Вероятнее всего проблема именнов CLOSED = 1 и Подразделение = :Подразделение поскольку по обоим данным полям индекса нет.

А если интересно, можно перекинуть конфу на SQL посмотреть какой запрос пойдет в профайлере, может что поумнее 1С придумает там Улыбка  Подмигивание



Насчет индекса так и есть
Подбор индекса для таблицы 1SJOURN:
     Ограничения: CLOSED=; DATE>=; DATE<=;
     Найдено в кэше
     Выбран индекс ACDATETIM: DTOS(DATE)+TIME+IDDOC
     Стоимость: 54
Подбор индекса для таблицы DT4373:
     Ограничения: IDDOC=;
     Найдено в кэше
     Выбран индекс IDLINE: IDDOC+STR(LINENO,4)
     Стоимость: 36
Подбор индекса для таблицы DH4373:
     Ограничения: IDDOC=;
     Найдено в кэше
     Выбран индекс ID: IDDOC
     Стоимость: 16

Если убрать отбор по подразделению, прямой обгоняет черный, однако запрос без отбора теряет весь смысл.

Перекинуть конфу на SQL  не могу ввиду отсутствия последнего.
  
Наверх
 
IP записан
 
vandalsvq
1c++ power user
Отсутствует


Я всего лишь als-особиратель
;-)

Сообщений: 2487
Местоположение: Уфа
Зарегистрирован: 18. Июля 2007
Пол: Мужской
Re: Запрос прямой и черный
Ответ #20 - 11. Августа 2009 :: 10:54
Печать  
Если честно случаи когда прямой запрос проигрывает 1С-вскому встречаются в природе. Но в общем и целом статистика на самом деле не в пользу 1С, совсем не в пользу 1С.
Я бы даже сказал что на столько не в пользу, что я даже не знаю синтаксис 7-шного объекта запрос...  Смех для меня его просто не существует
  

Отхожу от дел. Долго и мучительно.
Наверх
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Запрос прямой и черный
Ответ #21 - 11. Августа 2009 :: 11:51
Печать  
ИМХО было что-то про виртуальные индексы у Саши Орефкова Улыбка
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer &amp;&amp; tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
vandalsvq
1c++ power user
Отсутствует


Я всего лишь als-особиратель
;-)

Сообщений: 2487
Местоположение: Уфа
Зарегистрирован: 18. Июля 2007
Пол: Мужской
Re: Запрос прямой и черный
Ответ #22 - 11. Августа 2009 :: 11:57
Печать  
artbear писал(а) 11. Августа 2009 :: 11:51:
ИМХО было что-то про виртуальные индексы у Саши Орефкова Улыбка

В какой то старой теме когда sqlite только раскручивалось Александр объяснял очень подробно многие вещи. Счас уже все точно не помню.
  

Отхожу от дел. Долго и мучительно.
Наверх
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Запрос прямой и черный
Ответ #23 - 11. Августа 2009 :: 12:10
Печать  
А на фоксовом провайдере, не замерял ?
Улыбка
  
Наверх
 
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: Запрос прямой и черный
Ответ #24 - 13. Августа 2009 :: 12:37
Печать  
Eprst писал(а) 11. Августа 2009 :: 12:10:
А на фоксовом провайдере, не замерял ?
Улыбка

+5

У SqlLite
1. Проблема с масштабируемостью
2. Агрегирование и Join в случае отсутствия индекса происходит по алгоритму последовательного перебора -
что весьма небыстро на больших выборках
  
Наверх
 
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Запрос прямой и черный
Ответ #25 - 13. Августа 2009 :: 13:29
Печать  
kiruha писал(а) 13. Августа 2009 :: 12:37:
У SqlLite
1. Проблема с масштабируемостью

Это как?
  
Наверх
 
IP записан
 
vandalsvq
1c++ power user
Отсутствует


Я всего лишь als-особиратель
;-)

Сообщений: 2487
Местоположение: Уфа
Зарегистрирован: 18. Июля 2007
Пол: Мужской
Re: Запрос прямой и черный
Ответ #26 - 02. Сентября 2009 :: 13:51
Печать  
Да.... kiruha расскажи-ка про проблемы с масштабируемостью.
А вообще про join и агрегирование я давно понял.

Пы.сы. А еще он inner join делает плохо, и есть еще кое-какие проблемы. Но все-таки выигрыш порой весьма хорош. Хотя иногда и "проигрывать" приходиться.
  

Отхожу от дел. Долго и мучительно.
Наверх
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Запрос прямой и черный
Ответ #27 - 02. Сентября 2009 :: 17:43
Печать  
У фокса тоже своих проблем хватает. И самая главная - это то, что приходется делать подбор индекса каждый раз ручками + условия становятся вообще нечитаемыми. А до универсальности вообще далеко. Пробовал как-то делать ВТ по регистрам для фокса, потом бросил, т.к. построение оптимального запроса происходило дольше чем выполнение самого запроса. Конечно, я много вещей не знаю, поэтому делал как мог.
Ну и не забываем про поставщика для ТП и монопольный режим (патч не предлагать) Подмигивание
  
Наверх
 
IP записан
 
orefkov
1c++ developer
1c++ moderator
Отсутствует


I Love YaBB 2!

Сообщений: 896
Зарегистрирован: 20. Мая 2006
Re: Запрос прямой и черный
Ответ #28 - 08. Сентября 2009 :: 05:28
Печать  
Вот скорее всего быстрее чем этот вариант выжать не получится.

Код
Выбрать все
|SELECT
|	Жур.DATE AS [ДатаДок :Дата]
|	,Жур.DOCNO AS НомерДок
|	,Жур.IDDOC AS [Документ :Документ.ЗаказНаряд]
|	,ЗН.Подразделение AS [Подразделение :Справочник.Подразделения]
|	,(SELECT SUM(ЗНС.Количество)
|		FROM ДокументСтроки_ЗаказНаряд ЗНС WHERE ЗНС.IDDOC=Жур.IDDOC)
|	AS [Количество :Число.15.3]
|FROM
|	Журнал AS Жур
|INNER JOIN
|	Документ_ЗаказНаряд AS ЗН
|ON
|	ЗН.IDDOC = Жур.IDDOC
|WHERE
|	Жур.DATE BETWEEN :ДатаНачала AND :ДатаКонца
|	AND Жур.IDDOCDEF = :ВидДокумента.ЗаказНаряд
|	AND
|	ЗН.Подразделение = :Подразделение AND
|	Жур.CLOSED = 1
|ORDER BY
|	Жур.DATE 

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


Я всего лишь als-особиратель
;-)

Сообщений: 2487
Местоположение: Уфа
Зарегистрирован: 18. Июля 2007
Пол: Мужской
Re: Запрос прямой и черный
Ответ #29 - 11. Сентября 2009 :: 03:24
Печать  
В целом вариант хороший. Но с левым еще чуток малость поэффективнее. По крайней мере на моих замерах так. И.... конечно SQLite позволяет не указывать группировку, но все таки наверное это немного не правильно, с точки зрения синтаксиса... или я ошибаюсь?
  

Отхожу от дел. Долго и мучительно.
Наверх
IP записан
 
Переключение на Главную Страницу Страницы: 1 [2] 
ОтправитьПечать