Переключение на Главную Страницу Страницы: 1 [2] 3 4 5 ОтправитьПечать
Очень популярная тема (более 25 ответов) Инспекция прямого запроса (число прочтений - 20682 )
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: Инспекция прямого запроса
Ответ #15 - 14. Декабря 2007 :: 11:38
Печать  
Ну если совсем лень,то предполагая что рег Заявки типовой
Код
Выбрать все
Функция L_(нн)
	 ВозврСтр="'";

	 Для ИИ=1 По нн Цикл
		   ВозврСтр=ВозврСтр+"_";
	 КонецЦикла;
	 ВозврСтр=ВозврСтр+"'";
	 Возврат ВозврСтр;
КонецФункции
//*******************************************
Процедура Сформировать()

	ОлеДБ = СоздатьОбъект("OLEDBData");

	Рез=ОлеДБ.Соединение("
	|Provider=VFPOLEDB.1;
	|Null = Yes;
	|Exclusive = No;
	|SourceType = DBF;
	|Data Source=" + КаталогИБ() + ";
	|Mode=ReadWrite;
	|Extended Properties="""";
	|User ID="""";
	|Password="""";
	|Mask Password=False;
	|Collating Sequence=MACHINE;
	|DSN=""""");
	// Это ВАЖНО !!! соединение Collating Sequence=MACHINE

	Запрос=ОлеДБ.СоздатьКоманду();

	ТекстЗапроса = "
	|SELECT
	| т.Заявка as [Заявка $Документ.ЗаявкаПокупателя],
	| т.Договор as [Договор $Справочник.Договоры],
	| т.Фирма as [Фирма $Справочник.Фирмы],
	| т.Склад as [Склад $Справочник.Склады],
	| т.ДатаОтгрузки as ДатаОтгрузки,
	| т.Контрагент as [Контрагент $Справочник.Контрагенты],
	| т.Менеджер as [Менеджер $Справочник.Пользователи],
	| т.Количество as КонОстК,
	| т.Сумма as КонОстС,
	| т.Флаг as Флаг
	|FROM(
	|SELECT
	| РегЗаявки.ЗаявкаПокупателя as Заявка,
	| РегЗаявки.ДоговорПокупателя as Договор,
	| РегЗаявки.Фирма as Фирма,
	| $Док.Склад as Склад,
	| $Док.ДатаОтгрузки as ДатаОтгрузки,
	| Спр1.id as Контрагент,
	| $Спр1.БВК_Менеджер as Менеджер,
	| SUM(РегЗаявки.КоличествоРасход) as Количество,
	| SUM(РегЗаявки.СтоимостьРасход) as Сумма,
	| IIF(:ДатаРаботы~~ >$Док.ДатаОтгрузки,1,0) as Флаг
	|FROM
	| (
	| SELECT
	| $Рег.ЗаявкаПокупателя as ЗаявкаПокупателя,
	| $Рег.ДоговорПокупателя as ДоговорПокупателя,
	| $Рег.Фирма as Фирма,
	| $Рег.КоличествоРасход as КоличествоРасход,
	| $Рег.СтоимостьРасход as СтоимостьРасход
	|FROM
	| $РегистрИтоги.Заявки as Рег
	|  WHERE Покупателя
	|	   LIKE (DTOS(:ДатуТА~~ )+"+L_(9+9+9+9)+")
	| ) as РегЗаявки
	//	| $РегистрИтоги.Заявки as Рег
	| LEFT JOIN $Документ.ЗаявкаПокупателя Док on Док.IDDoc = Right(РегЗаявки.ЗаявкаПокупателя,9)
	| LEFT JOIN $Справочник.Договоры Спр on Спр.id = РегЗаявки.ДоговорПокупателя
	| LEFT JOIN $Справочник.Контрагенты Спр1 on Спр1.id = Спр.ParentExt
	| GROUP BY д,$Док.ДатаОтгрузки,Спр1.id,$Спр1.БВК_Менеджер) as т
//	| GROUP BY д,$Док.ДатаОтгрузки,Спр1.id) as т
	|WHERE
	| т.Сумма>0 AND т.Количество>0
    |";
	Если НАЙТИ(ВРЕГ(НазваниеНабораПрав()),"АДМИН")=0 Тогда
		ТекстЗапроса = ТекстЗапроса + "
		| and т.Менеджер = :ГлПользователь";
	КонецЕсли;
	Если парамРежимФормирования = -1
	Тогда //условий не накладываем, полный отчет
	Иначе
		ТекстЗапроса = ТекстЗапроса +"
		| and т.Флаг=:парамРежимФормирования";
	КонецЕсли;
	ТекстЗапроса = ТекстЗапроса +"
	| Order by т.Контрагент,т.Заявка";
//	ВыбДень=1;
	ДатаРаботы = ТекущаяДата()-ВыбДень;
	Запрос.УстановитьТекстовыйПараметр("ДатаРаботы" ,ДатаРаботы);
	Запрос.УстановитьТекстовыйПараметр("ГлПользователь" ,ГлПользователь);

	МД = СоздатьОбъект("MetaDataWork");
	ДатуТА=МД.ПолучитьНачПериода(ПолучитьДатуТА());

	Запрос.УстановитьТекстовыйПараметр("ДатуТА" ,НачМесяца(РабочаяДата()));
//	Запрос.УстановитьТекстовыйПараметр("парамРежимФормирования" ,парамРежимФормирования);
Сообщить(ТекстЗапроса);
	ТЗЗ = Запрос.ВыполнитьИнструкцию(ТекстЗапроса);
	ТЗЗ.ВыбратьСтроку();
КонецПроцедуры 



Только основная оптимизация. Остальные пункты сам.
Проверил на типовой - ОК.

Интерсны также будут результаты на живой(!) этого
и первоначального.
  
Наверх
 
IP записан
 
Вадимко
God Member
*****
Отсутствует


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

Сообщений: 1048
Местоположение: Минск
Зарегистрирован: 24. Мая 2006
Пол: Мужской
Re: Инспекция прямого запроса
Ответ #16 - 14. Декабря 2007 :: 12:12
Печать  
А зачем там 3 селекта фпринципе?
ЗЫ. В качестве апа
  

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


Ябба!

Сообщений: 317
Местоположение: г.Москва
Зарегистрирован: 14. Августа 2006
Пол: Мужской
Re: Инспекция прямого запроса
Ответ #17 - 15. Декабря 2007 :: 08:46
Печать  
ну, не знаю... мне казалось что я тут речь веду про фокспрошный драйвер и DBF
..злые вы все-таки...
  
Наверх
www  
IP записан
 
Злоп
Senior Member
****
Отсутствует


Ябба!

Сообщений: 317
Местоположение: г.Москва
Зарегистрирован: 14. Августа 2006
Пол: Мужской
Re: Инспекция прямого запроса
Ответ #18 - 15. Декабря 2007 :: 08:58
Печать  
2 kiruha:
Да, вот зачем тут три селекта - кратенько если можно?

ОШИБКИ (мое скромное имхо)
1.
+ условие
|WHERE т.Сумма>0 AND т.Количество>0 - неверное, может получиться так, что 1. количество =0, а сумма - висит... 2. количество (как и сумма) в определенных моментах может быть отрицательное
т.е. надо типа
|WHERE т.Сумма<>0 OR т.Количество<>0
2.
результаты кода
МД = СоздатьОбъект("MetaDataWork");
ДатуТА=МД.ПолучитьНачПериода(ПолучитьДатуТА());
в запросе не используются - т.е. есть шанс что на нестандартных периодах сохранения остатков - будет косячить..
  
Наверх
www  
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: Инспекция прямого запроса
Ответ #19 - 15. Декабря 2007 :: 10:20
Печать  
Цитата:
2 kiruha:
Да, вот зачем тут три селекта - кратенько если можно?

ОШИБКИ (мое скромное имхо)
1.
+ условие
|WHERE т.Сумма>0 AND т.Количество>0 - неверное, может получиться так, что 1. количество =0, а сумма - висит... 2. количество (как и сумма) в определенных моментах может быть отрицательное
т.е. надо типа
|WHERE т.Сумма<>0 OR т.Количество<>0
2.
результаты кода
МД = СоздатьОбъект("MetaDataWork");
ДатуТА=МД.ПолучитьНачПериода(ПолучитьДатуТА());
в запросе не используются - т.е. есть шанс что на нестандартных периодах сохранения остатков - будет косячить..


а. Насчет |WHERE т.Сумма<>0 OR т.Количество<>0 и других дополнений - как угодно, это же только костяк.

б. Условие на ДатуТА однозначно задается в Like :
|  WHERE DTOS(Рег.period)+$Рег.Фирма+$Рег.Номенклатура+$Рег.ДоговорПокупателя
+$Рег.ЗаявкаПокупателя
|         LIKE (DTOS(:ДатуТА~~ )+"+L_(9+9+9+9)+")

оно эквивалентно  WHERE Рег.period=:ДатуТА~~

в. "Много Select" . Fox не SQL, где отлично работает план выполнения запроса.
Ему нужны подсказки, в том числе о порядке выполнения и использования индексов.
Использование же вложенных запросов лишь на несколько процентов увеличивает время выполнения,
т.е. их можно делать сколько угодно без заметного падения производительности.

с.Вообще не понимаю дискуссии - сначала пытались объяснить - ответ : не надо, дайте готовый запрос.
Дали готовый запрос -теперь появилось "почему ".
Почему бы просто не запустить на клиенте и не замерить время выполнения 1 и 2 и потом привести
здесь цифры?
  
Наверх
 
IP записан
 
Злоп
Senior Member
****
Отсутствует


Ябба!

Сообщений: 317
Местоположение: г.Москва
Зарегистрирован: 14. Августа 2006
Пол: Мужской
Re: Инспекция прямого запроса
Ответ #20 - 15. Декабря 2007 :: 10:22
Печать  
РЕЗЮМЕ:
1. внедрил вариант kiruha
2. оставил старый вариант
3. 1 и 2 сделал максимально похожими (подправил условие попадания заявок в выборку, определение ДатуТА)

погонял старый и новый вариант: результаты идентичные (правильные)
ИТОГО:
старый вариант = 2.05 сек;
новый   вариант = 2.93 сек;
...спрашивается: ЭТО ОПТИМИЗАЦИЯ?
внизу выложены текстовки старого и нового
  
Наверх
www  
IP записан
 
Злоп
Senior Member
****
Отсутствует


Ябба!

Сообщений: 317
Местоположение: г.Москва
Зарегистрирован: 14. Августа 2006
Пол: Мужской
Re: Инспекция прямого запроса
Ответ #21 - 15. Декабря 2007 :: 10:25
Печать  
ИСХОДНЫЙ (СТАРЫЙ ЗАПРОС)
     ИначеЕсли ФлагСиквел = -1 Тогда
           Время1 = _GetPerformanceCounter();
           Попытка База            = СоздатьОбъект("OLEDBData");
                       Соединение      = "Provider=VFPOLEDB.1;Deleted=Yes;Data Source=" + КаталогИБ()+ ";Mode=ReadWrite;Extended Properties="";User ID="";Password="";Mask Password=False;Collating Sequence=MACHINE;DSN=""";
                       RS                  = База.Соединение(Соединение);
                       Запрос            = База.СоздатьКоманду();
           Исключение 
                       текОшибка            = ВРег(ОписаниеОшибки());
                       КритичнаяОшибка = 1;
                       Для ы = 1 По СЗнекритичныхОшибок.РазмерСписка() Цикл
                             Если Найти(текОшибка,СЗнекритичныхОшибок.ПолучитьЗначение(ы)) <> 0 Тогда
                                   КритичнаяОшибка = 0;
                                   ЗаписьЖурналаРегистрации("монопольно="+МонопольныйРежим()+", "+текОшибка,"Provider=VFPOLEDB.1","Ошибка времени выполнения");
                                   Прервать;
                             КонецЕсли;      
                       КонецЦикла;      
                     Если КритичнаяОшибка <> 0 Тогда
                             Предупреждение("Обнаружена ошибка: "+ОписаниеОшибки()+"      
                                                  |Сообщите программисту!");
                       КонецЕсли;
     
                       ФлагСиквел = 0;      
                       ВыполнитьТекстЗапросаБыстро(ТЗЗ,парамРежимФормирования,ФлагСиквел);
                       Возврат;
           КонецПопытки;
                       
           ТекстЗапроса = "
           |SELECT
           | т.Заявка                  as [Заявка $Документ.ЗаявкаПокупателя],
           | т.Договор            as [Договор $Справочник.Договоры],
           | т.Фирма                  as [Фирма $Справочник.Фирмы],
           | т.Склад                  as [Склад $Справочник.Склады],
           | т.ДатаОтгрузки      as ДатаОтгрузки,
           | т.Контрагент            as [Контрагент $Справочник.Контрагенты],
           | т.Менеджер            as [Менеджер $Справочник.Пользователи],
           | т.Количество            as КонОстК,
           | т.Сумма                  as КонОстС, 
           | т.Флаг                  as Флаг
           |FROM(
           |SELECT
           | $Рег.ЗаявкаПокупателя            as Заявка,
           | $Рег.ДоговорПокупателя            as Договор,
           | $Рег.Фирма                              as Фирма,
           | $Док.Склад                              as Склад,
           | $Док.ДатаОтгрузки                  as ДатаОтгрузки,
           | Спр1.id                                    as Контрагент,
           | $Спр1.БВК_Менеджер                  as Менеджер,
           | SUM($Рег.КоличествоРасход)      as Количество,
           | SUM($Рег.СтоимостьРасход)      as Сумма,
           | IIF(:ДатаРаботы~~  >$Док.ДатаОтгрузки,1,0) as Флаг
           |FROM
           |            $РегистрИтоги.Заявки as Рег
           | INNER JOIN $Документ.ЗаявкаПокупателя Док on Док.IDDoc  = Right($Рег.ЗаявкаПокупателя,9)
           | INNER JOIN $Справочник.Договоры Спр on Спр.id = $Рег.ДоговорПокупателя
           | INNER JOIN $Справочник.Контрагенты Спр1 on Спр1.id = Спр.ParentExt
           |WHERE  Рег.Period = :ДатуТА~~
           | GROUP BY узки,Спр1.id,$Спр1.БВК_Менеджер) as т
           |WHERE
           | т.Сумма<>0 OR т.Количество<>0";
           Если НАЙТИ(ВРЕГ(НазваниеНабораПрав()),"АДМИН")=0 Тогда                                                                      
                 ТекстЗапроса = ТекстЗапроса + "
                 |       and т.Менеджер = :ГлПользователь";
           КонецЕсли;

           Если  парамРежимФормирования = -1
           Тогда //условий не накладываем, полный отчет
           Иначе
                 ТекстЗапроса = ТекстЗапроса +"
                 |       and т.Флаг=:парамРежимФормирования";
           КонецЕсли;
           
           ТекстЗапроса = ТекстЗапроса +"
           | Order by т.Контрагент,т.Заявка";
           
           ДатаРаботы = ТекущаяДата()-ВыбДень;
           Попытка Запрос.УстановитьТекстовыйПараметр("ДатаРаботы"                        ,ДатаРаботы);
                       Запрос.УстановитьТекстовыйПараметр("ГлПользователь"                  ,ГлПользователь);
                       МД            = СоздатьОбъект("MetaDataWork");
                       ДатуТА      = МД.ПолучитьНачПериода(ПолучитьДатуТА());
                       Запрос.УстановитьТекстовыйПараметр("ДатуТА"                              ,ДатуТА);
                       Запрос.УстановитьТекстовыйПараметр("парамРежимФормирования"      ,парамРежимФормирования);
                       ТЗЗ = Запрос.ВыполнитьИнструкцию(ТекстЗапроса);
                       ЗатраченоВремени = " "+Окр((_getPerformanceCounter() - Время1)/1000,3,1)+" сек.";
                       //Форма.ТЗ.Видимость(1);
                       Возврат;
           Исключение
                       текОшибка            = ВРег(ОписаниеОшибки());
                       КритичнаяОшибка = 1;
                       Для ы = 1 По СЗнекритичныхОшибок.РазмерСписка() Цикл
                             Если Найти(текОшибка,СЗнекритичныхОшибок.ПолучитьЗначение(ы)) <> 0 Тогда
                                   КритичнаяОшибка = 0;
                                   ЗаписьЖурналаРегистрации("монопольно="+МонопольныйРежим()+", "+текОшибка,"Provider=VFPOLEDB.1","Ошибка времени выполнения");
                                   Прервать;
                             КонецЕсли;      
                       КонецЦикла;      
                     Если КритичнаяОшибка <> 0 Тогда
                             Предупреждение("Обнаружена ошибка: "+ОписаниеОшибки()+"      
                                                  |Сообщите программисту!");
                       КонецЕсли;

                       ФлагСиквел = 0;
                       ВыполнитьТекстЗапросаБыстро(ТЗЗ,парамРежимФормирования,ФлагСиквел);
                       Возврат;
           КонецПопытки;
  
Наверх
www  
IP записан
 
Злоп
Senior Member
****
Отсутствует


Ябба!

Сообщений: 317
Местоположение: г.Москва
Зарегистрирован: 14. Августа 2006
Пол: Мужской
Re: Инспекция прямого запроса
Ответ #22 - 15. Декабря 2007 :: 10:26
Печать  
НОВЫЙ ЗАПРОС (вариант kiruha):
     ИначеЕсли ФлагСиквел = -1 Тогда
           Время1 = _GetPerformanceCounter();
           Попытка База            = СоздатьОбъект("OLEDBData");
                       RS = База.Соединение("
                       |Provider=VFPOLEDB.1;
                       |Null = Yes;
                       |Exclusive = No;
                       |SourceType = DBF;
                       |Data Source=" + КаталогИБ() + ";
                       |Mode=ReadWrite;
                       |Extended Properties="""";
                       |User ID="""";
                       |Password="""";
                       |Mask Password=False;
                       |Collating Sequence=MACHINE;   
                       |DSN=""""");
                       //Это ВАЖНО !!! соединение Collating Sequence=MACHINE
                       Запрос = База.СоздатьКоманду();
           Исключение 
                       текОшибка            = ВРег(ОписаниеОшибки());
                       КритичнаяОшибка = 1;
                       Для ы = 1 По СЗнекритичныхОшибок.РазмерСписка() Цикл
                             Если Найти(текОшибка,СЗнекритичныхОшибок.ПолучитьЗначение(ы)) <> 0 Тогда
                                   КритичнаяОшибка = 0;
                                   ЗаписьЖурналаРегистрации("монопольно="+МонопольныйРежим()+", "+текОшибка,"Provider=VFPOLEDB.1","Ошибка времени выполнения");
                                   Прервать;
                             КонецЕсли;      
                       КонецЦикла;      
                     Если КритичнаяОшибка <> 0 Тогда
                             Предупреждение("Обнаружена ошибка: "+ОписаниеОшибки()+"      
                                                  |Сообщите программисту!");
                       КонецЕсли;
     
                       ФлагСиквел = 0;      
                       ВыполнитьТекстЗапросаБыстро(ТЗЗ,парамРежимФормирования,ФлагСиквел);
                       Возврат;
           КонецПопытки;
           
           ТекстЗапроса = "
           |SELECT
           | т.Заявка                  as [Заявка $Документ.ЗаявкаПокупателя],
           | т.Договор            as [Договор $Справочник.Договоры],
           | т.Фирма                  as [Фирма $Справочник.Фирмы],
           | т.Склад                  as [Склад $Справочник.Склады],
           | т.ДатаОтгрузки      as ДатаОтгрузки,
           | т.Контрагент            as [Контрагент $Справочник.Контрагенты],
           | т.Менеджер            as [Менеджер $Справочник.Пользователи],
           | т.Количество            as КонОстК,
           | т.Сумма                  as КонОстС,
           | т.Флаг                  as Флаг
           |FROM(
           |SELECT
           | РегЗаявки.ЗаявкаПокупателя                        as Заявка,
           | РегЗаявки.ДоговорПокупателя                        as Договор,
           | РегЗаявки.Фирма                                          as Фирма,
           | $Док.Склад                                                as Склад,
           | $Док.ДатаОтгрузки                                    as ДатаОтгрузки,
           | Спр1.id                                                      as Контрагент,
           | $Спр1.БВК_Менеджер                                    as Менеджер,
           | SUM(РегЗаявки.КоличествоРасход)                  as Количество,
           | SUM(РегЗаявки.СтоимостьРасход)                  as Сумма,
           | IIF(:ДатаРаботы~~ >$Док.ДатаОтгрузки,1,0) as Флаг
           |FROM
           | (
           | SELECT
           | $Рег.ЗаявкаПокупателя      as ЗаявкаПокупателя,
           | $Рег.ДоговорПокупателя      as ДоговорПокупателя,
           | $Рег.Фирма                        as Фирма,
           | $Рег.КоличествоРасход      as КоличествоРасход,
           | $Рег.СтоимостьРасход            as СтоимостьРасход
           |FROM
           | $РегистрИтоги.Заявки as Рег
           |  WHERE Покупателя
           |         LIKE (DTOS(:ДатуТА~~ )+"+L_(9+9+9+9)+")
           | ) as РегЗаявки
           | LEFT JOIN $Документ.ЗаявкаПокупателя Док on Док.IDDoc = Right(РегЗаявки.ЗаявкаПокупателя,9)
           | LEFT JOIN $Справочник.Договоры Спр on Спр.id = РегЗаявки.ДоговорПокупателя
           | LEFT JOIN $Справочник.Контрагенты Спр1 on Спр1.id = Спр.ParentExt
           | GROUP BY д,$Док.ДатаОтгрузки,Спр1.id,$Спр1.БВК_Менеджер) as т
           |WHERE
           | т.Сумма<>0 OR т.Количество<>0";

         Если НАЙТИ(ВРЕГ(НазваниеНабораПрав()),"АДМИН")=0 Тогда
                 ТекстЗапроса = ТекстЗапроса + "
                 | and т.Менеджер = :ГлПользователь";
           КонецЕсли;
           Если парамРежимФормирования = -1
           Тогда //условий не накладываем, полный отчет
           Иначе
                 ТекстЗапроса = ТекстЗапроса +"
                 | and т.Флаг=:парамРежимФормирования";
           КонецЕсли;
           ТекстЗапроса = ТекстЗапроса +"
           | Order by т.Контрагент,т.Заявка";

           ДатаРаботы = ТекущаяДата()-ВыбДень;
           Попытка Запрос.УстановитьТекстовыйПараметр("ДатаРаботы"                        ,ДатаРаботы);
                       Запрос.УстановитьТекстовыйПараметр("ГлПользователь"                  ,ГлПользователь);
                       МД            = СоздатьОбъект("MetaDataWork");
                       ДатуТА      = МД.ПолучитьНачПериода(ПолучитьДатуТА());
                       Запрос.УстановитьТекстовыйПараметр("ДатуТА",ДатуТА);
                       Запрос.УстановитьТекстовыйПараметр("парамРежимФормирования"      ,парамРежимФормирования);
                       ТЗЗ = Запрос.ВыполнитьИнструкцию(ТекстЗапроса);
                       ЗатраченоВремени = " "+Окр((_getPerformanceCounter() - Время1)/1000,3,1)+" сек.";
//                        //Форма.ТЗ.Видимость(1);
                       Возврат;
           Исключение
                       текОшибка            = ВРег(ОписаниеОшибки());
                       КритичнаяОшибка = 1;
                       Для ы = 1 По СЗнекритичныхОшибок.РазмерСписка() Цикл
                             Если Найти(текОшибка,СЗнекритичныхОшибок.ПолучитьЗначение(ы)) <> 0 Тогда
                                   КритичнаяОшибка = 0;
                                   ЗаписьЖурналаРегистрации("монопольно="+МонопольныйРежим()+", "+текОшибка,"Provider=VFPOLEDB.1","Ошибка времени выполнения");
                                   Прервать;
                             КонецЕсли;      
                       КонецЦикла;      
                     Если КритичнаяОшибка <> 0 Тогда
                             Предупреждение("Обнаружена ошибка: "+ОписаниеОшибки()+"      
                                                  |Сообщите программисту!");
                       КонецЕсли;

                       ФлагСиквел = 0;
                       ВыполнитьТекстЗапросаБыстро(ТЗЗ,парамРежимФормирования,ФлагСиквел);
                       Возврат;
           КонецПопытки;

  
Наверх
www  
IP записан
 
Злоп
Senior Member
****
Отсутствует


Ябба!

Сообщений: 317
Местоположение: г.Москва
Зарегистрирован: 14. Августа 2006
Пол: Мужской
Re: Инспекция прямого запроса
Ответ #23 - 15. Декабря 2007 :: 10:30
Печать  
> с.Вообще не понимаю дискуссии - сначала пытались объяснить - ответ:
> не надо, дайте готовый запрос.
> Дали готовый запрос -теперь появилось "почему ".
ну, вопрос звучит не "почему", а "если можно - объясните", если в лом объяснять - я и так прожую (или постучусь еще к кому-нибудь), не проблема Подмигивание

> Почему бы просто не запустить на клиенте и не замерить время выполнения 1 и 2 и потом привести  здесь цифры?
пока я писал гонял замеры и писал ответ с цифрами замеров - вы умудрились успеть этот вопрос запостить... Подмигивание
..
цифры замеров - стабильные...
вот тут я уже ХОТЕЛ БЫ задать вопрос "ПОЧЕМУ?" откуда такая "разбежка"? - это "не несколько процентов"...
  
Наверх
www  
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: Инспекция прямого запроса
Ответ #24 - 15. Декабря 2007 :: 10:49
Печать  
Приведи структуру рег Заявки из файла DD
Я исходил из стандартного :
Цитата:
#==TABLE no 150    : Регистр Заявки
# Name    |Descr                         |Type[A/S/U]|DBTableName|ReUsable 
T=RG4674  |Регистр Заявки                |A          |RG4674     |1         
#-----Fields-------
# Name      |Descr               |Type|Length|Precision
F=PERIOD    |Period Registr      |D   |8     |0       
F=SP4668    |(P)Фирма            |C   |9     |0       
F=SP4669    |(P)Номенклатура     |C   |9     |0       
F=SP4670    |(P)ДоговорПокупателя|C   |9     |0       
F=SP4671    |(P)ЗаявкаПокупателя |C   |9     |0       
F=SP4672    |(P)КоличествоРасход |N   |16    |5       
F=SP4673    |(P)СтоимостьРасход  |N   |16    |2       
#----Indexes------
# Name     |Descr         |Unique|Indexed fields                                              |DBName    
I=PROP     |PERIOD+PROP   |0     |PERIOD,SP4668,SP4669,SP4670,SP4671                          |PROP      
I=VIA4671  |VIA4671       |0     |PERIOD,SP4671                                               |VIA4671


Интересует индекс
I=PROP     |PERIOD+PROP   |0     |PERIOD,SP4668,SP4669,SP4670,SP4671                          |PROP

У тебя часом ЗаявкаПокупателя не произвольный документ?
  
Наверх
 
IP записан
 
Злоп
Senior Member
****
Отсутствует


Ябба!

Сообщений: 317
Местоположение: г.Москва
Зарегистрирован: 14. Августа 2006
Пол: Мужской
Re: Инспекция прямого запроса
Ответ #25 - 15. Декабря 2007 :: 10:55
Печать  
привожу:

#==TABLE no 166    : Регистр Заявки
# Name    |Descr                         |Type[A/S/U]|DBTableName|ReUsable 
T=RG4674  |Регистр Заявки                |A          |RG4674     |1         
#-----Fields-------
# Name      |Descr               |Type|Length|Precision
F=PERIOD    |Period Registr      |D   |8     |0       
F=SP4668    |(P)Фирма            |C   |9     |0       
F=SP4669    |(P)Номенклатура     |C   |9     |0       
F=SP4670    |(P)ДоговорПокупателя|C   |9     |0       
F=SP4671    |(P)ЗаявкаПокупателя |C   |9     |0       
F=SP4672    |(P)КоличествоРасход |N   |16    |5       
F=SP4673    |(P)СтоимостьРасход  |N   |16    |2       
#----Indexes------
# Name     |Descr         |Unique|Indexed fields                                              |DBName    
I=PROP     |PERIOD+PROP   |0     |PERIOD,SP4668,SP4669,SP4670,SP4671                          |PROP      
I=VIA4671  |VIA4671       |0     |PERIOD,SP4671                                               |VIA4671   
#
.. а если старый запрос попробуй у себя выполнить...? какие у тебя цифры получатся?
.. убегаю до вечера, интересно будет эту тему добить... не может быть чтобы явное указание "улучшающее выборку" так притормаживало...
  
Наверх
www  
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: Инспекция прямого запроса
Ответ #26 - 15. Декабря 2007 :: 12:08
Печать  
Проведи пожалуйста Тест
Код
Выбрать все
 Функция L_(нн)
	 ВозврСтр="'";

	 Для ИИ=1 По нн Цикл
		   ВозврСтр=ВозврСтр+"_";
	 КонецЦикла;
	 ВозврСтр=ВозврСтр+"'";
	 Возврат ВозврСтр;
КонецФункции

Процедура Тест()
	База		= СоздатьОбъект("OLEDBData");
	RS = База.Соединение("
	|Provider=VFPOLEDB.1;
	|Null = Yes;
	|Exclusive = No;
	|SourceType = DBF;
	|Data Source=" + КаталогИБ() + ";
	|Mode=ReadWrite;
	|Extended Properties="""";
	|User ID="""";
	|Password="""";
	|Mask Password=False;
	|Collating Sequence=MACHINE;
	|DSN=""""");
	//Это ВАЖНО !!! соединение Collating Sequence=MACHINE
	Запрос = База.СоздатьКоманду();

	ТекстЗапроса = "
	|SELECT
	| $Рег.ЗаявкаПокупателя	as ЗаявкаПокупателя,
	| $Рег.ДоговорПокупателя	as ДоговорПокупателя,
	| $Рег.Фирма				as Фирма,
	| $Рег.КоличествоРасход	as КоличествоРасход,
	| $Рег.СтоимостьРасход		as СтоимостьРасход
	|FROM
	| $РегистрИтоги.Заявки as Рег
	|  WHERE Рег.period= :ДатуТА~~
	|";


	ТекстЗапросаИндекс = "
	|SELECT
	| $Рег.ЗаявкаПокупателя	as ЗаявкаПокупателя,
	| $Рег.ДоговорПокупателя	as ДоговорПокупателя,
	| $Рег.Фирма				as Фирма,
	| $Рег.КоличествоРасход	as КоличествоРасход,
	| $Рег.СтоимостьРасход		as СтоимостьРасход
	|FROM
	| $РегистрИтоги.Заявки as Рег
	|  WHERE Покупателя
	|	   LIKE (DTOS(:ДатуТА~~ )+"+L_(9+9+9+9)+")
	|";

	МД		= СоздатьОбъект("MetaDataWork");
	ДатуТА	= МД.ПолучитьНачПериода(ПолучитьДатуТА());

	// Тест индекс
	Запрос = База.СоздатьКоманду();

	ВремяНачалоЗапроса=_GetPerformanceCounter();

	Запрос.УстановитьТекстовыйПараметр("ДатуТА",ДатуТА);
	ТЗЗ = Запрос.ВыполнитьИнструкцию(ТекстЗапросаИндекс);

	Запрос.УстановитьТекстовыйПараметр("ДатуТА",ДатуТА);
	ТЗЗ = Запрос.ВыполнитьИнструкцию(ТекстЗапросаИндекс);

	Запрос.УстановитьТекстовыйПараметр("ДатуТА",ДатуТА);
	ТЗЗ = Запрос.ВыполнитьИнструкцию(ТекстЗапросаИндекс);

	ВремяКонецЗапроса=_GetPerformanceCounter();
	ВремяЗапроса=ВремяКонецЗапроса-ВремяНачалоЗапроса;
	Сообщить("Запрос индекс  длился "+(ВремяЗапроса/1000)+"с");
	Запрос.Закрыть();
	ТЗЗ.ВыбратьСтроку();

	// Тест обычный
	Запрос = База.СоздатьКоманду();

	ВремяНачалоЗапроса=_GetPerformanceCounter();

	Запрос.УстановитьТекстовыйПараметр("ДатуТА",ДатуТА);
	ТЗЗ = Запрос.ВыполнитьИнструкцию(ТекстЗапроса);

	Запрос.УстановитьТекстовыйПараметр("ДатуТА",ДатуТА);
	ТЗЗ = Запрос.ВыполнитьИнструкцию(ТекстЗапроса);

	Запрос.УстановитьТекстовыйПараметр("ДатуТА",ДатуТА);
	ТЗЗ = Запрос.ВыполнитьИнструкцию(ТекстЗапроса);

	ВремяКонецЗапроса=_GetPerformanceCounter();
	ВремяЗапроса=ВремяКонецЗапроса-ВремяНачалоЗапроса;
	Сообщить("Запрос обычный длился "+(ВремяЗапроса/1000)+"с");
	Запрос.Закрыть();
	ТЗЗ.ВыбратьСтроку();



	// На всякий случай структу рег
	МетРег=Метаданные.Регистр("Заявки");
	СчетчикЦикла = 0;
	Для СчетчикЦикла = 1 По МетРег.Измерение() Цикл
		Изм=МетРег.Измерение(СчетчикЦикла);
		ИмяИзм=Изм.Идентификатор;
		ТипИзм=Изм.Тип;
		ВидИзм=Изм.Вид;
		ДлинаИзм=Изм.Длина;

		Сообщить(""+СчетчикЦикла+" "+ИмяИзм+" "+ТипИзм+"."+ВидИзм);

	КонецЦикла;


КонецПроцедуры 


Установил в Демо типовой 5 дней. К сожалению только локальная и с минимальными данными
Цитата:
Запрос индекс  длился 0.008с
Запрос обычный длился 0.037с
1 Фирма Справочник.Фирмы
2 Номенклатура Справочник.Номенклатура
3 ДоговорПокупателя Справочник.Договоры
4 ЗаявкаПокупателя Документ.ЗаявкаПокупателя


В мнгопользовательском режиме и больших данных (как у тебя) - разница должна быть в порядки больше
  
Наверх
 
IP записан
 
Злоп
Senior Member
****
Отсутствует


Ябба!

Сообщений: 317
Местоположение: г.Москва
Зарегистрирован: 14. Августа 2006
Пол: Мужской
Re: Инспекция прямого запроса
Ответ #27 - 15. Декабря 2007 :: 17:28
Печать  
Потестил дома варинты запросов, картина аналогичная:
старый запрос - 4.9 сек
новый запрос - 6.2 сек
..
сечас запущу предложенный тест..
  
Наверх
www  
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: Инспекция прямого запроса
Ответ #28 - 15. Декабря 2007 :: 18:53
Печать  
Кажется разобрался - забыл сгруппировать по номенклатуре.
Если у тебя индекс взлетел попробуй оконч вариант (убрал лишние Select по просьбе Вадимко)
Код
Выбрать все
ТекстЗапроса = "
|SELECT
| РегЗаявки.ЗаявкаПокупателя			     as [Заявка $Документ.ЗаявкаПокупателя]
| ,РегЗаявки.ДоговорПокупателя			    as  [Договор $Справочник.Договоры]
| ,РегЗаявки.Фирма					     as [Фирма $Справочник.Фирмы]
| ,$Док.Склад						    as [Склад $Справочник.Склады]
| ,$Док.ДатаОтгрузки						as ДатаОтгрузки
| ,Спр1.id							  as [Контрагент $Справочник.Контрагенты]
| ,$Спр1.БВК_Менеджер					    as [Менеджер $Справочник.Пользователи]
| ,РегЗаявки.Количество			as КонОстК
| ,РегЗаявки.Сумма			as КонОстС
| ,IIF(:ДатаРаботы~~ >$Док.ДатаОтгрузки,1,0) as Флаг
|FROM
| (
|SELECT
| $Рег.ЗаявкаПокупателя	as ЗаявкаПокупателя,
| $Рег.ДоговорПокупателя	as ДоговорПокупателя,
| $Рег.Фирма				as Фирма,
| SUM($Рег.КоличествоРасход)	as Количество,
| SUM($Рег.СтоимостьРасход)	as Сумма
|FROM
| $РегистрИтоги.Заявки as Рег
|  WHERE Покупателя
|	   LIKE (DTOS(:ДатуТА~~ )+"+L_(9+9+9+9)+")
|  GROUP BY ЗаявкаПокупателя,ДоговорПокупателя,Фирма
| ) as РегЗаявки
| LEFT JOIN $Документ.ЗаявкаПокупателя Док on Док.IDDoc = РегЗаявки.ЗаявкаПокупателя
| LEFT JOIN $Справочник.Договоры Спр on Спр.id = РегЗаявки.ДоговорПокупателя
| LEFT JOIN $Справочник.Контрагенты Спр1 on Спр1.id = Спр.ParentExt
|WHERE
| РегЗаявки.Сумма<>0 OR РегЗаявки.Количество<>0";
Если НАЙТИ(ВРЕГ(НазваниеНабораПрав()),"АДМИН")=0 Тогда
	ТекстЗапроса = ТекстЗапроса + "
	| and Спр1.БВК_Менеджер = :ГлПользователь";
КонецЕсли;
Если парамРежимФормирования = -1
Тогда //условий не накладываем, полный отчет
Иначе
	ТекстЗапроса = ТекстЗапроса +"
	| and Флаг=:парамРежимФормирования";
КонецЕсли;
ТекстЗапроса = ТекстЗапроса +"
| Order by Спр1.id ,РегЗаявки.ЗаявкаПокупателя "; 



оттестируй пожалуйста
  
Наверх
 
IP записан
 
Злоп
Senior Member
****
Отсутствует


Ябба!

Сообщений: 317
Местоположение: г.Москва
Зарегистрирован: 14. Августа 2006
Пол: Мужской
Re: Инспекция прямого запроса
Ответ #29 - 15. Декабря 2007 :: 19:08
Печать  
Отчистил машину - убрал антивирь и прочее..
потестил твой первый тест, 94 прогона, среднее время
запрос индекс длился 10.66
запрос обычный длился 10.45:
  
Наверх
www  
IP записан
 
Переключение на Главную Страницу Страницы: 1 [2] 3 4 5
ОтправитьПечать