Переключение на Главную Страницу Страницы: [1] 2  ОтправитьПечать
Очень популярная тема (более 25 ответов) Запрос прямой и черный (число прочтений - 6700 )
Kondarat
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 83
Зарегистрирован: 21. Декабря 2007
Запрос прямой и черный
11. Августа 2009 :: 07:22
Печать  
Много читал про преимущества прямых запросов к ИБ 1С. Но наверное не внимательно или не все понял, т. к. не могу увидеть этого преимущества.
Попытался сам создать два варианта запроса: один "черный" другой  "прямой" с использованием 1sqlite (база ДБФ):

Код
Выбрать все
	Время1 = _GetPerformanceCounter();
	тЗап = "//{{ЗАПРОС(Сформировать)
	|Период с ДатаНачала по ДатаКонца;
	|ДатаДок = Документ.ЗаказНаряд.ДатаДок;
	|НомерДок = Документ.ЗаказНаряд.НомерДок;
	|ТекущийДокумент = Документ.ЗаказНаряд.ТекущийДокумент;
	|Подразделение = Документ.ЗаказНаряд.Подразделение;
	|Количество = Документ.ЗаказНаряд.Количество;
	|Функция КоличествоСумма = Сумма(Количество);
	|Группировка ТекущийДокумент Упорядочить по ТекущийДокумент.ДатаДок;
	|Условие (Подразделение = ВыбПодразделение);
	|";//}}ЗАПРОС

	Зап = СоздатьОбъект("Запрос");
	Зап.Выполнить(тЗап);
	Зап.Выгрузить(тзНаФорме,1,0);
	Время2 = _GetPerformanceCounter();
	Сообщить("1. Прошло = " + (Время2-Время1));
	Сообщить("Документов = " + тзНаформе.КоличествоСтрок());
 



и

Код
Выбрать все
	Время1 = _GetPerformanceCounter();
	Запрос.Подставлять("ДатаНачала", ДатаНачала);
	Запрос.Подставлять("ДатаКонца", ДатаКонца);
	Запрос.Подставлять("Подразделение", ВыбПодразделение);

	ТекстЗапроса = "
	|SELECT
	|	Жур.DATE AS [ДатаДок $Дата]
	|	,Жур.DOCNO AS НомерДок
	|	,Жур.IDDOC AS [Документ $Документ.ЗаказНаряд]
	|	,Подр.ID AS [Подразделение $Справочник.Подразделения]
	|	,SUM(ДокСтроки.Количество) AS Количество
	|FROM
	|	Журнал AS Жур
	|LEFT JOIN
	|	ДокументСтроки_ЗаказНаряд AS ДокСтроки
	|ON
	|	ДокСтроки.IDDOC = Жур.IDDOC
	|LEFT JOIN
	|	Документ_ЗаказНаряд AS ЗН
	|ON
	|	ЗН.IDDOC = Жур.IDDOC
	|LEFT JOIN
	|	Справочник_Подразделения AS Подр
	|ON
	|	ЗН.Подразделение = Подр.ID
	|WHERE
	|	Жур.DATE BETWEEN :ДатаНачала AND :ДатаКонца
	|AND
	|	Подр.ID = :Подразделение AND
	|	Жур.CLOSED = 1
	|GROUP BY
	|	ДокСтроки.IDDOC
	|ORDER BY
	|	Жур.DATE
	|";

	//Запрос.Отладка(1);
	ТЗ = Запрос.ВыполнитьЗапрос(ТекстЗапроса);
	ТЗ.Выгрузить(тзНаФорме);
	Время2 = _GetPerformanceCounter();
	Сообщить("2. Прошло = " + (Время2-Время1));
	Сообщить("Документов = " + тзНаформе.КоличествоСтрок());
 



И не получается прямым обогнать черный. Может в прямом запросе я написал что-то не так?  или использование прямых запросов оправдано не во всех ситуациях?
  
Наверх
 
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3051
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Запрос прямой и черный
Ответ #1 - 11. Августа 2009 :: 07:35
Печать  
соединение со справочником подразделений не нужно
  

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



Сообщений: 3051
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Запрос прямой и черный
Ответ #2 - 11. Августа 2009 :: 07:35
Печать  
итога по колонке "количество" нет?
если есть, то соединение с ДокументСтроки_ЗаказНаряд тоже лишнее.
  

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



Сообщений: 3051
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Запрос прямой и черный
Ответ #3 - 11. Августа 2009 :: 07:38
Печать  
что бы прямой запрос полностью соответствовал "черному" убери условие Жур.CLOSED = 1
  

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



Сообщений: 3051
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Запрос прямой и черный
Ответ #4 - 11. Августа 2009 :: 07:39
Печать  
и еще знатоки дбф-ных индексов что-нибудь могут сказать про Жур.DATE BETWEEN :ДатаНачала AND :ДатаКонца
  

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


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

Сообщений: 2487
Местоположение: Уфа
Зарегистрирован: 18. Июля 2007
Пол: Мужской
Re: Запрос прямой и черный
Ответ #5 - 11. Августа 2009 :: 07:40
Печать  
Ну во первых, ты делаешь суммирование по таблице строк документа, при этом проверь, если есть галка ИтогПоКолонке = 1 тогда использовать аналогичную колонку только в таблице шапки документа.
Во вторых я не понял зачем ты соединяешься с таблицей справочника... только в целях фильтрации?
Может переписать запрос таким образом:
Код
Выбрать все
ВЫБРАТЬ
	$Жур.ДатаДокумента КАК Дата
	,$Жур.НомерДокумента КАК Номер
	,$Жур.ТекущийДокумент КАК [Документ $Документ.ЗаказНаряд]
	,$Док.Подразделение КАК [Подразделение $Справочник.Подразделения]
	,$Док.Количество КАК Количество
ИЗ
	ЖурналДокументов КАК Жур $nolock
ЛЕВОЕ СОЕДИНЕНИЕ
	Документ.ЗаказНаряд КАК Док $nolock
ПО
	$Док.ТекущийДокумент = СРЕД($Жур.ПозицияДокумента,15,9)
ГДЕ
	$Жур.ПозицияДокумента МЕЖДУ :ДатаНачала И :ДатаКонца
И
	$Док.Подразделение = :Подразделение
УПОРЯДОЧИТЬ
	$Жур.ДатаДокумента 



Извините что пишу на привычном мне диалекте КОП ПрямойЗапрос...
Пы.Сы. это не реклама... мне так удобнее
  

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


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

Сообщений: 2487
Местоположение: Уфа
Зарегистрирован: 18. Июля 2007
Пол: Мужской
Re: Запрос прямой и черный
Ответ #6 - 11. Августа 2009 :: 07:43
Печать  
Вообще надо в данном случае включать режим отладки + _GetPerformanceCounter() и замерять
Вполне возможно что
Жур.idx_DATE_TIME_IDDOC BETWEEN ... AND ...
и соответственно соединение по вырезанной части индекса будет быстрее чем соединение по IDDOC и фильтр по DATE BETWEEN.
Я чет как то не замерял

Пы.сы. автору на заметку... может и так и так попробуешь расскажешь как получится?
  

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


I Love YaBB 2!

Сообщений: 83
Зарегистрирован: 21. Декабря 2007
Re: Запрос прямой и черный
Ответ #7 - 11. Августа 2009 :: 07:44
Печать  
trad писал(а) 11. Августа 2009 :: 07:35:
соединение со справочником подразделений не нужно

И как отобрать по конкретному подразделению;

trad писал(а) 11. Августа 2009 :: 07:35:
итога по колонке "количество" нет?
если есть, то соединение с ДокументСтроки_ЗаказНаряд тоже лишнее.


Итога по колонке нет.

trad писал(а) 11. Августа 2009 :: 07:35:
что бы прямой запрос полностью соответствовал "черному" убери условие Жур.CLOSED = 1


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


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

Сообщений: 2487
Местоположение: Уфа
Зарегистрирован: 18. Июля 2007
Пол: Мужской
Re: Запрос прямой и черный
Ответ #8 - 11. Августа 2009 :: 07:47
Печать  
Цитата:
И как отобрать по конкретному подразделению;

Док.Подразделение = :Подразделение

Цитата:
Итога по колонке нет.

Тогда поставь Смех шучу... тогда да + соединение с таб строки + сумма с группировкой по IDDOC

Цитата:
Но тогда черный выберет только проведенные, а прямой - все.

А у тя в черном запросе нет условий по проведенным или не проведенным документам  Подмигивание
  

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


I Love YaBB 2!

Сообщений: 83
Зарегистрирован: 21. Декабря 2007
Re: Запрос прямой и черный
Ответ #9 - 11. Августа 2009 :: 07:50
Печать  
vandalsvq писал(а) 11. Августа 2009 :: 07:47:
Цитата:
И как отобрать по конкретному подразделению;

Док.Подразделение = :Подразделение

Цитата:
Итога по колонке нет.

Тогда поставь Смех шучу... тогда да + соединение с таб строки + сумма с группировкой по IDDOC

Цитата:
Но тогда черный выберет только проведенные, а прямой - все.

А у тя в черном запросе нет условий по проведенным или не проведенным документам  Подмигивание


Черному если ничего не указывать выберет только проведенные.
  
Наверх
 
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3051
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Запрос прямой и черный
Ответ #10 - 11. Августа 2009 :: 07:52
Печать  
Kondarat писал(а) 11. Августа 2009 :: 07:44:
Но тогда черный выберет только проведенные, а прямой - все.

согласен. забыл что по умолчанию действует: ОбрабатыватьДокументы Проведенные;
  

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


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

Сообщений: 2487
Местоположение: Уфа
Зарегистрирован: 18. Июля 2007
Пол: Мужской
Re: Запрос прямой и черный
Ответ #11 - 11. Августа 2009 :: 07:54
Печать  
Каюсь.... вслед за trad, я тоже забыл... а может и не знал  Очень довольный

плохо когда не знал, да еще и забыл  Смех
  

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



Сообщений: 3051
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Запрос прямой и черный
Ответ #12 - 11. Августа 2009 :: 07:56
Печать  
vandalsvq
ты лучше расскажи как грамотно попасть в индекс DOCTYPE
  

1&&2&&3
Наверх
 
IP записан
 
Kondarat
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 83
Зарегистрирован: 21. Декабря 2007
Re: Запрос прямой и черный
Ответ #13 - 11. Августа 2009 :: 07:57
Печать  
vandalsvq писал(а) 11. Августа 2009 :: 07:43:
Вообще надо в данном случае включать режим отладки + _GetPerformanceCounter() и замерять
Вполне возможно что
Жур.idx_DATE_TIME_IDDOC BETWEEN ... AND ...
и соответственно соединение по вырезанной части индекса будет быстрее чем соединение по IDDOC и фильтр по DATE BETWEEN.
Я чет как то не замерял

Пы.сы. автору на заметку... может и так и так попробуешь расскажешь как получится?


Не понял (опыта маловато). Речь идет об этой части запроса:
     |LEFT JOIN
     |      Документ_ЗаказНаряд AS ЗН
     |ON
     |      ЗН.IDDOC = Жур.IDDOC
     |WHERE
     |      Жур.idx_DATE_TIME_IDDOC BETWEEN :ДатаНачала AND :ДатаКонца
     |AND
     |      ЗН.Подразделение = :Подразделение AND
     |      Жур.CLOSED = 1
     |GROUP BY
     |      ДокСтроки.IDDOC
     |ORDER BY
     |      Жур.DATE      


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


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

Сообщений: 2487
Местоположение: Уфа
Зарегистрирован: 18. Июля 2007
Пол: Мужской
Re: Запрос прямой и черный
Ответ #14 - 11. Августа 2009 :: 07:57
Печать  
2 trad
в SQLite или где?
  

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