Переключение на Главную Страницу Страницы: [1] 2  ОтправитьПечать
Горячая тема (более 10 ответов) Помогите разобраться со временем выполнения. (число прочтений - 6122 )
alex_gol
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 27
Зарегистрирован: 13. Марта 2007
Помогите разобраться со временем выполнения.
19. Ноября 2007 :: 02:07
Печать  
Выполняю по очереди 2 одинаковых (довольно сложных) запроса к регистру к одной и той же базе, отличаются они только заданными периодами (т.е. при прочих равных условиях).
1. Период - 1 месяц. Возвращается около 11000 строк. Время выполнения - около 3 минут.
2. Период - 1 день. Возвращается около 1000 строк. Время выполнеия - около 5 минут.
Количество записей в регистре за этот день (в случае 2) меньше чем количество записей за месяц (в случае 1).
Прогнал оба запроса через QA. В первом случае получил разбивку на этапы в процентах, а во втором все проценты равны 0.
Что же такого могло случиться с базой, что в другом периоде отчеты работают в сотню (а может тысячю) раз медленнее?
Тестирование и исправление ИБ делал - не помогло, при этом ошибок не было.
  
Наверх
 
IP записан
 
Nick
God Member
*****
Отсутствует



Сообщений: 1599
Местоположение: г.Новокузнецк
Зарегистрирован: 21. Февраля 2007
Пол: Мужской
Re: Помогите разобраться со временем выполнения.
Ответ #1 - 19. Ноября 2007 :: 02:40
Печать  
alex_gol писал(а) 19. Ноября 2007 :: 02:07:
Выполняю по очереди 2 одинаковых (довольно сложных) запроса к регистру к одной и той же базе, отличаются они только заданными периодами (т.е. при прочих равных условиях).
1. Период - 1 месяц. Возвращается около 11000 строк. Время выполнения - около 3 минут.
2. Период - 1 день. Возвращается около 1000 строк. Время выполнеия - около 5 минут.
Количество записей в регистре за этот день (в случае 2) меньше чем количество записей за месяц (в случае 1).
Прогнал оба запроса через QA. В первом случае получил разбивку на этапы в процентах, а во втором все проценты равны 0.
Что же такого могло случиться с базой, что в другом периоде отчеты работают в сотню (а может тысячю) раз медленнее?
Тестирование и исправление ИБ делал - не помогло, при этом ошибок не было.


Если ты используешь виртуальные таблицы то для разных периодов он может генирировать разные запросы
  
Наверх
ICQ  
IP записан
 
alex_gol
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 27
Зарегистрирован: 13. Марта 2007
Re: Помогите разобраться со временем выполнения.
Ответ #2 - 19. Ноября 2007 :: 09:09
Печать  
Виртуальные таблицы не использую. Запрос строится только к одной таблице регистра - таблице движений, ну  и соединения со справочниками.
  
Наверх
 
IP записан
 
leshik
1c++ donor
Отсутствует



Сообщений: 820
Местоположение: Пятигорск
Зарегистрирован: 22. Апреля 2007
Пол: Мужской
Re: Помогите разобраться со временем выполнения.
Ответ #3 - 19. Ноября 2007 :: 09:14
Печать  
Показывай текст запроса...
я думаю - не оптимальное соединение..
  
Наверх
IP записан
 
alex_gol
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 27
Зарегистрирован: 13. Марта 2007
Re: Помогите разобраться со временем выполнения.
Ответ #4 - 19. Ноября 2007 :: 09:27
Печать  
Код
Выбрать все
SELECT
$Рег.Товар as [Товар $Справочник.Номенклатура],
GROUPING ($Рег.Товар) as ИтогПоТовару

	,SUM($Рег.Количество) as Количество
	,SUM($Рег.СуммаБезНДС) as СуммаБезНДС
	,SUM($Рег.СуммаСНДС) as СуммаСНДС
	,SUM($Рег.НДС) as НДС
	,SUM($Рег.Доход) as Доход
	,SUM($Рег.СуммаБезСкидки) as СуммаБезСкидки
	,SUM($Рег.Скидка) as Скидка

,MAX(ПодзапросТовар.НаименованиеТовар) as НаименованиеТовар
,MAX(ПодзапросТовар.КоличествоТовар) as КоличествоТовар
,MAX(ПодзапросТовар.СуммаСНДСТовар) as СуммаСНДСТовар
,MAX(ПодзапросТовар.СкидкаТовар) as СкидкаТовар

FROM
	$Регистр.Остатки as Рег

LEFT JOIN
	$Справочник.Номенклатура as СпрТовары ON СпрТовары.ID  = $Рег.Товар

LEFT JOIN
(
SELECT

$Рег.Товар Товар,

SUM($Рег.Количество) as КоличествоТовар
,SUM($Рег.Скидка) as СкидкаТовар
,SUM($Рег.СуммаСНДС) as СуммаСНДСТовар
,MAX(СпрТовары.Descr) as НаименованиеТовар

FROM
	$Регистр.Остатки as Рег

LEFT JOIN
	$Справочник.Номенклатура as СпрТовары ON СпрТовары.ID  = $Рег.Товар

WHERE
   Рег.Date_Time_IDDoc BETWEEN :НачДата AND :КонДата~
	AND
	Рег.DEBKRED=1
GROUP BY

$Рег.Товар
WITH ROLLUP
) AS ПодзапросТовар
ON

ПодзапросТовар.Товар=$Рег.Товар
WHERE
   Рег.Date_Time_IDDoc BETWEEN :НачДата AND :КонДата~
	AND
	Рег.DEBKRED=1
	AND
GROUP BY
$Рег.Товар
	WITH ROLLUP
ORDER BY
ИтогПоТовару DESC,
НаименованиеТовар,
$Рег.Товар
 



Вложенный подзапрос использую для получения сортировки по нужному мне полю. В данном примере указанна только одна группировка. А вообще управление группировками вынесено на форму отчета. Так что их количество и очередность может меняться.
  
Наверх
 
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: Помогите разобраться со временем выполнения.
Ответ #5 - 19. Ноября 2007 :: 11:27
Печать  
Этот подзапрос :
Код
Выбрать все
SELECT

$Рег.Товар Товар,

SUM($Рег.Количество) as КоличествоТовар
,SUM($Рег.Скидка) as СкидкаТовар
,SUM($Рег.СуммаСНДС) as СуммаСНДСТовар

FROM
	$Регистр.Остатки as Рег

WHERE
   Рег.Date_Time_IDDoc BETWEEN :НачДата AND :КонДата~
	AND
	Рег.DEBKRED=1
GROUP BY

$Рег.Товар 



Сколько выполняется?
И сколько элементов в спр Номенклатура?
  
Наверх
 
IP записан
 
alex_gol
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 27
Зарегистрирован: 13. Марта 2007
Re: Помогите разобраться со временем выполнения.
Ответ #6 - 19. Ноября 2007 :: 14:31
Печать  
kiruha писал(а) 19. Ноября 2007 :: 11:27:
Этот подзапрос :

Сколько выполняется?
И сколько элементов в спр Номенклатура?


Я не знаю как выделить время на выполнение подзапроса, но весь запрос в целом за более ранние периоды выполняется за 4-5 минут если брать период месяц (например июнь 2007г.) - это еще и с выводом таблицы на экран, а если взять период 01.11.2007-05.11.2007 то просто дождаться не возможно, приходится снимать задачу.
В справочнике номенклатура около 100000 позиций.
А размер бызы за период с июня по ноябрь вырос с 19Гб до 21Гб.
  
Наверх
 
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: Помогите разобраться со временем выполнения.
Ответ #7 - 19. Ноября 2007 :: 16:01
Печать  
То что я привел - запрос.
Есго нужно запустить и замерить время выполнения
Код
Выбрать все
ВремяНачалоЗапроса=_GetPerformanceCounter();

ТЗ=Команда.ВыполнитьИнструкцию(ТекстЗапроса);

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


Просто так трудно понять - где тормозит.
Нужно отсечь все лишнее - вывод на экран, группирование, соединение со справочником.

Пока что у тебя навскидку - один лишний запрос ,соединение по несгруппированным
записям к справочнику, осутствие представлений.
  
Наверх
 
IP записан
 
Вадимко
God Member
*****
Отсутствует


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

Сообщений: 1048
Местоположение: Минск
Зарегистрирован: 24. Мая 2006
Пол: Мужской
Re: Помогите разобраться со временем выполнения.
Ответ #8 - 20. Ноября 2007 :: 20:56
Печать  
Какая цель запроса? Что-то не вкуривается никак...  Ужас
  

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


I Love YaBB 2!

Сообщений: 27
Зарегистрирован: 13. Марта 2007
Re: Помогите разобраться со временем выполнения.
Ответ #9 - 20. Ноября 2007 :: 22:51
Печать  
Цитата:
Какая цель запроса? Что-то не вкуривается никак...  Ужас

Самый обычный отчет по продажам. У регистра "Остатки" несколько измерений: Товар, Магазин, Покупатель, Продавец, Месяц (значением является справочник "Месяцы"), Неделя (значением является справочник "Недели") и т.д. (их уже больше 10). И вот клиент хочет видеть продажи (т.е. оброты по этому регистру) в разных разрезах и, естественно, с любыми возможными итогами и сложной сортировкой по любому из измерений. Вот и пришлось выкинуть все возможные группировки и сортировки на форму отчета в списки значений с возможностью управлять этими списками, а текст запроса генерится на лету. Вот в данном примере я выбрал всего одну группировку по товару с сортировкой по наименованию по возрастанию.
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Помогите разобраться со временем выполнения.
Ответ #10 - 21. Ноября 2007 :: 05:34
Печать  
alex_gol писал(а) 20. Ноября 2007 :: 22:51:
Самый обычный отчет по продажам. У регистра "Остатки" несколько измерений: Товар, Магазин, Покупатель, Продавец, Месяц (значением является справочник "Месяцы"), Неделя (значением является справочник "Недели") и т.д. (их уже больше 10). И вот клиент хочет видеть продажи (т.е. оброты по этому регистру)

Что то не понял в измерениях регистра остатки используешь справочники
месяц, неделя - тогда одно из двух
либо у тебя этот регистр не будет закрываться ( со всеми вытекающими )
либо у тебя будет слишком сложный расход по этому регистру.

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



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Помогите разобраться со временем выполнения.
Ответ #11 - 21. Ноября 2007 :: 07:28
Печать  
alex_gol писал(а) 20. Ноября 2007 :: 22:51:
Цитата:
Какая цель запроса? Что-то не вкуривается никак...  Ужас

Самый обычный отчет по продажам. У регистра "Остатки" несколько измерений: Товар, Магазин, Покупатель, Продавец, Месяц (значением является справочник "Месяцы"), Неделя (значением является справочник "Недели") и т.д. (их уже больше 10). И вот клиент хочет видеть продажи (т.е. оброты по этому регистру) в разных разрезах и, естественно, с любыми возможными итогами и сложной сортировкой по любому из измерений. Вот и пришлось выкинуть все возможные группировки и сортировки на форму отчета в списки значений с возможностью управлять этими списками, а текст запроса генерится на лету. Вот в данном примере я выбрал всего одну группировку по товару с сортировкой по наименованию по возрастанию.

В данном случае я б тебе посоветовал посмотреть в сторону OLAP. Вот тут лежит "Консоль запросов 1С++", и тут ещё немного можно почитать.
  
Наверх
 
IP записан
 
Вадимко
God Member
*****
Отсутствует


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

Сообщений: 1048
Местоположение: Минск
Зарегистрирован: 24. Мая 2006
Пол: Мужской
Re: Помогите разобраться со временем выполнения.
Ответ #12 - 21. Ноября 2007 :: 11:05
Печать  
alex_gol писал(а) 20. Ноября 2007 :: 22:51:
У регистра "Остатки" несколько измерений: Товар, Магазин, Покупатель, Продавец, Месяц (значением является справочник "Месяцы"), Неделя (значением является справочник "Недели") и т.д. (их уже больше 10).


Переделывай эту хрень срочно! Тупость полнейшая (имхо)
Заведи оборотный регистр продажи... и периоды там не нужны наверное все же...
  

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


I Love YaBB 2!

Сообщений: 53
Зарегистрирован: 29. Мая 2006
Re: Помогите разобраться со временем выполнения.
Ответ #13 - 21. Ноября 2007 :: 19:30
Печать  
Цитата:
У регистра "Остатки" несколько измерений: Товар, Магазин, Покупатель, Продавец, Месяц (значением является справочник "Месяцы"), Неделя (значением является справочник "Недели") и т.д. (их уже больше 10).

Хоть убей не пойму зачем ты измерений "месяц", "неделя" натолкал в регистр.
Ведь можно же использовать функцию DATEPART, т.е  что-то примерно так
- для месяца
Код
Выбрать все
DATEPART(month,CAST(LEFT(Жур.Date_Time_IDDoc, 8) as DateTime)) as Период 


- для недели
Код
Выбрать все
DATEPART(week,CAST(LEFT(Жур.Date_Time_IDDoc, 8) as DateTime)) as Период 


- для дня
Код
Выбрать все
DATEPART(dayofyear,CAST(LEFT(Жур.Date_Time_IDDoc, 8) as DateTime)) as Период 




А так ты раздул регистр абсолютно зря, да еще наверно он у тебя не закрывается.  
Да еще нужно и справочники (Месяц, Неделя)  заполнять.
Помоему, это полный бред.
  
Наверх
 
IP записан
 
alex_gol
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 27
Зарегистрирован: 13. Марта 2007
Re: Помогите разобраться со временем выполнения.
Ответ #14 - 22. Ноября 2007 :: 00:08
Печать  
Цитата:
Переделывай эту хрень срочно! Тупость полнейшая (имхо)
Заведи оборотный регистр продажи... и периоды там не нужны наверное все же...


На счет оборотного регистра - не получится, т.к. есть приход товара и в другом отчете расчитываются остатки. А вот убрать периоды - думаю идея хороша. Но как получить тогда нужное мне представление недели. Например: "№неделиВГоду НачНедели-КонНедели". Или делать это уже при выводе на экран?
И еще: не нашел применения функции DATEPART для полугодия.
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: [1] 2 
ОтправитьПечать