Переключение на Главную Страницу Страницы: [1]  ОтправитьПечать
Горячая тема (более 10 ответов) Помогите разобраться со временем выполнения. (число прочтений - 6123 )
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 записан
 
infossa
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 53
Зарегистрирован: 29. Мая 2006
Re: Помогите разобраться со временем выполнения.
Ответ #15 - 22. Ноября 2007 :: 06:49
Печать  
Цитата:
Но как получить тогда нужное мне представление недели. Например: "№неделиВГоду НачНедели-КонНедели". Или делать это уже при выводе на экран?

Да, абсолютно верно !!!

Для полугодия используй кварталы ( quarter ).
И еще не стесняйся в сложных запросах использовать
Код
Выбрать все
CASE input_expression
    WHEN when_expression THEN result_expression
        [ ...n ]
    [
        ELSE else_result_expression
    ]
END
 



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



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Помогите разобраться со временем выполнения.
Ответ #16 - 22. Ноября 2007 :: 07:08
Печать  
+ или всё это один раз в Хранимую процедуру вынести и всё!
  
Наверх
 
IP записан
 
kiruha
1c++ power user
Отсутствует



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

alex_gol писал(а) 19. Ноября 2007 :: 14:31:
А размер бызы за период с июня по ноябрь вырос с 19Гб до 21Гб.


Тихо выпадаю в осадок...
А нужно ли такое вообще "лечить"?
  
Наверх
 
IP записан
 
alex_gol
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 27
Зарегистрирован: 13. Марта 2007
Re: Помогите разобраться со временем выполнения.
Ответ #18 - 22. Ноября 2007 :: 21:50
Печать  
kiruha писал(а) 22. Ноября 2007 :: 08:04:
Тихо выпадаю в осадок...
А нужно ли такое вообще "лечить"?


Будь добр, поясни свою мысль...

Если ты на счет объема базы, то попытаюсь пролить свет. База наполняется не пользователями, а втягивается автоматически в режиме онлайн. Есть торговая фирма, которая торгует через много торговых точек (ТТ). Сегодня их около 70, скоро возрастет до 200. Каждый день эти ТТ сливают свои данные о продажах и об остатках в офис. А база их автоматически втягивает в реальном времени (втягивание идет круглосуточно). Продажи получаются 50-100 позиций в день, а остатки 3000-50000 позиций в день по каждому магазину. Вот поэтому такой немаленький рост базы. Сейчас в ней данные за 2 года.
  
Наверх
 
IP записан
 
Вадимко
God Member
*****
Отсутствует


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

Сообщений: 1048
Местоположение: Минск
Зарегистрирован: 24. Мая 2006
Пол: Мужской
Re: Помогите разобраться со временем выполнения.
Ответ #19 - 22. Ноября 2007 :: 22:00
Печать  
Кирюха, наверное, намекал, что рост происходит по причине акуительного регистра (мот их с десяток таких к тому же) + его, наверное, где-то возможно... и незакрытости... вот
  

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


I Love YaBB 2!

Сообщений: 27
Зарегистрирован: 13. Марта 2007
Re: Помогите разобраться со временем выполнения.
Ответ #20 - 22. Ноября 2007 :: 22:21
Печать  
Цитата:
Кирюха, наверное, намекал, что рост происходит по причине акуительного регистра (мот их с десяток таких к тому же) + его, наверное, где-то возможно... и незакрытости... вот


Такой регситр все-таки 1. Если говорить  о незакрытости, возможно ты прав, спорить не буду и измерения, связанные с временными интервалами повыкидываю. Но незакрытость может быть в таблице остатков "RG",  а я запрос строю к таблице с оборотами "RA". И все-таки, если вернуться к истокам: ведь база в таком состоянии уже давно и за одни периоды расчет происходит быстро, а за другие во много раз (несоизмеримо с ростом базы) медленнее. Вот в чем вопрос.
  
Наверх
 
IP записан
 
alex_gol
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 27
Зарегистрирован: 13. Марта 2007
Re: Помогите разобраться со временем выполнения.
Ответ #21 - 22. Ноября 2007 :: 22:27
Печать  
Вот тут уже всякие домыслы в голову приходят. Если при проведении документов значения некоторых ресурсов регистра не заполняются, то в базе они остаются значением NULL, так ведь? Возможно, что если их на каком-то участке много станет, то именно при выборе этого участка тормоза происходят? Или я ошибаюсь?
  
Наверх
 
IP записан
 
Вадимко
God Member
*****
Отсутствует


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

Сообщений: 1048
Местоположение: Минск
Зарегистрирован: 24. Мая 2006
Пол: Мужской
Re: Помогите разобраться со временем выполнения.
Ответ #22 - 22. Ноября 2007 :: 22:56
Печать  
Вот и посмотри что там '     0   ' или NULL Улыбка
Раз полез в прямые запросы - надоть представлять где что лежит и как закрывается (это, кстати, даже в тесте на спеца требуют)
  

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


I Love YaBB 2!

Сообщений: 27
Зарегистрирован: 13. Марта 2007
Re: Помогите разобраться со временем выполнения.
Ответ #23 - 22. Ноября 2007 :: 23:45
Печать  
Цитата:
Вот и посмотри что там '     0   ' или NULL Улыбка
Раз полез в прямые запросы - надоть представлять где что лежит и как закрывается (это, кстати, даже в тесте на спеца требуют)



Да нету у меня сертификатов, вот поэтому и прошу советов у профессионалов.
  
Наверх
 
IP записан
 
alex_gol
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 27
Зарегистрирован: 13. Марта 2007
Re: Помогите разобраться со временем выполнения.
Ответ #24 - 23. Ноября 2007 :: 00:22
Печать  
УраУлыбка!!! Наконец-то разгадка. Нужно было просто переиндексировать базу. Но сделал я это средствами SQL-сервера. С помощью команды:
Код
Выбрать все
EXEC _1sp_DBReindex
 

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

Большое спасибоУлыбка  всем монстрам за идеи Улыбка, здоровую критику Улыбка в мой адрес и стильное общениеУлыбка.
Все хорошие идеи я воплощу в жизнь.
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: [1] 
ОтправитьПечать