Имя: Пароль:
1C
1С v8
v8: Разная скорость выполнения элементарного запроса в построителе и обычном запросе [Решено]
0 Vladal
 
06.02.13
14:14
Тестовая база - реплика боевой, обе находятся на SQL. Запрос элементарный - выбор номенклатуры из иерархии корневой группы.

ПостроительУТ.Параметры.Вставить("ДатаОтчета", КонецДня(ДатаОтчета));
ПостроительУТ.Текст =
   "ВЫБРАТЬ
   |    ТоварыНаСкладахОстатки.Склад.Подразделение КАК Подразделение,
   |    ТоварыНаСкладахОстатки.Номенклатура КАК Номенклатура,
   |    ТоварыНаСкладахОстатки.ХарактеристикаНоменклатуры КАК ХарактеристикаНоменклатуры,
   |    0 КАК ОстРозн,
   |    ТоварыНаСкладахОстатки.КоличествоОстаток КАК ОстТорг
   |ИЗ
   |    РегистрНакопления.ТоварыНаСкладах.Остатки(&ДатаОтчета, {(Номенклатура).* КАК Номенклатура, (Склад).* КАК Склад}) КАК ТоварыНаСкладахОстатки";
ПостроительУТ.ЗаполнитьНастройки();
ПостроительУТ.Выполнить();
Результат = ПостроительУТ.Результат.Выгрузить();

На копии запрос выполняется за 2-3 секунды плюс выгрузка результата в ТЗ примерно столько же, итого 5-6 секунд.
В рабочей базе этот же запрос выполняется 500+ секунд. Причём если запрос выполнить в консоли запросов, то выполняется за 2-3 секунды.
Но если его выполнить в консоли отчетов на построителе (типовая, отчеты/универсальные), то также - 10 минут ждём, пока не начнётся вывод в таблицу.

Что может быть?
Есть подозрение на индексы либо кэш статистики SQL-сервера
1 Vladal
 
06.02.13
14:15
Для чистоты эксперимента в консоли отчетов не использовал отбор.
2 Vladal
 
06.02.13
16:06
Экспериментировал с СКД (платформа 8.1.15.14)
В обеих базах работает быстро.

Что же с построителем?
3 alex-pro
 
06.02.13
16:22
Вообще - Построитель - прошлый век. Юзай СКД или УниверсальныйОтчет на крайняк)))))
Ну либо запрос напрямую.
Но с другой стороны, когда-то давным-давно я им часто пользовался, таких проблем не замечал...

"Есть подозрение на индексы либо кэш статистики SQL-сервера"
но ведь в боевой сам запрос быстро выполняется... значит, с sql все ок
4 H A D G E H O G s
 
06.02.13
16:29
(3) Ты не поверишь.
5 dmpl
 
06.02.13
16:30
(0) Ну а вытяни реально исполняемый текст запроса из построителя - что получается?
6 Vladal
 
06.02.13
16:36
(5) Реально исполняемый текст запроса я привёл в (0). Если помещаю его в консоль запросов - 2-3 сек, консоль отчетов - тупняк.

(3) Почему построитель - я в него помещаю отборы из плана обмена. Понимаю, что это прошлый век, но УниверсальныйОтчет на построителе. запрос напрямую - каменный век, если вравнивать с построителем и СКД.
_____________________________________________________

Вот я подозреваю, что дело в индексах самого скуля. Ведь моя база при копировании из рабочей реинициализировалась, и кэш запросов, вроде небольшой. А в рабочей скорее всего он большой и его следует как-то реорганизовать. Это  я так, верхушек нахватался. А чтобы переосмыслить процесс?
7 Vladal
 
06.02.13
16:40
Нагуглил об очистке кэша команды

DBCC DROPCLEANBUFFERS WITH NO_INFOMSGS
DBCC FREEPROCCACHE WITH NO_INFOMSGS

Но ест сомнение, не на все ли базы они распространяются или только на текущую? В мануале ничего вразумительного или у меня тупняк.
8 H A D G E H O G s
 
06.02.13
16:40
(7) Бида
9 H A D G E H O G s
 
06.02.13
16:41
(7) Давай я помогу тебе пользоваться гуглом
10 dmpl
 
06.02.13
16:41
(6) Ну а запрос-то с построителя (полученный через ПолучитьЗапрос()) сколько выполняется?
11 Vladal
 
06.02.13
16:42
(9) Помоги. Премного благодарен.
12 H A D G E H O G s
 
06.02.13
16:42
13 H A D G E H O G s
 
06.02.13
16:44
Иногда (иногда) ПостроительОтчета может загнать адски

v8: Сложности отладки временных таблиц. :-)
14 H A D G E H O G s
 
06.02.13
16:44
(13) Сок в (21)
15 Vladal
 
06.02.13
16:49
(10) Там он прилепил параметры В Иерархии. Ничего нового.

ВЫБРАТЬ
   ТоварыНаСкладахОстатки.Склад.Подразделение КАК Подразделение,
   ТоварыНаСкладахОстатки.Номенклатура КАК Номенклатура,
   ТоварыНаСкладахОстатки.ХарактеристикаНоменклатуры КАК ХарактеристикаНоменклатуры,
   0 КАК ОстРозн,
   ТоварыНаСкладахОстатки.КоличествоОстаток КАК ОстТорг
ИЗ
   РегистрНакопления.ТоварыНаСкладах.Остатки(
           &ДатаОтчета,
           Номенклатура В ИЕРАРХИИ (&Параметр1)
               И Склад В ИЕРАРХИИ (&Параметр2)) КАК ТоварыНаСкладахОстатки
____________________________________________________________

(14) Чет про сок не понял, перечитываю ветку.
16 H A D G E H O G s
 
06.02.13
16:52
(15) ПостроительОтчета строил адское CrossJoin соединение на с таблицей счет фактур, хотя я просил Левое.
17 H A D G E H O G s
 
06.02.13
16:53
Номенклатура В ИЕРАРХИИ (&Параметр1)
               И Склад В ИЕРАРХИИ (&Параметр2)

Это печально
18 H A D G E H O G s
 
06.02.13
16:53
Построй 2 ВТ таблицы ОтобранныеСклады, ОтобранныеНоменклатуры и их суй!
19 Vladal
 
06.02.13
16:57
(16) Нехорошка он. Вот и у меня иерархию приплёл.

Дык! У вечером и ночером, когда в базе нет никто, точно так же...

06.02.2013 03:58:31 Начало.
06.02.2013 04:08:09 Торговля. 49 920 строк. От начала прошло 578 с
06.02.2013 04:17:00 Розница.  49 840 строк. От начала прошло 1 109 с
06.02.2013 04:17:10 Объединение. 80 строк. От начала прошло 1 119 с

А в копии всё пучком - первый этап 5-6 секунд, второй - 65-69 (отнимает время получение представление ВСтрокуВнутр) и третий - на 70-73й секунде завершается.

(18) Была такая идея, я так передаю в потустороннюю базу по COM. Пропробую такой же фокус и с тутошней.
20 Vladal
 
06.02.13
17:05
(10) Продолжая эксперименты с иерархией...

Отключил отборы и получил сво
21 Vladal
 
06.02.13
17:06
(10) Продолжая эксперименты с иерархией...

Отключил отборы и получил свой изначальный запрос -

ВЫБРАТЬ
   ТоварыНаСкладахОстатки.Склад.Подразделение КАК Подразделение,
   ТоварыНаСкладахОстатки.Номенклатура КАК Номенклатура,
   ТоварыНаСкладахОстатки.ХарактеристикаНоменклатуры КАК ХарактеристикаНоменклатуры,
   0 КАК ОстРозн,
   ТоварыНаСкладахОстатки.КоличествоОстаток КАК ОстТорг
ИЗ
   РегистрНакопления.ТоварыНаСкладах.Остатки(&ДатаОтчета, ) КАК ТоварыНаСкладахОстатки

Работает быстро и красиво. Всю малину портит иерархия.
Но как оптимизировать рабочую базу?
хм.
22 H A D G E H O G s
 
06.02.13
17:08
(21) Ну а ВременныеТаблицы че?
23 Vladal
 
06.02.13
17:09
(22) Еще не делал, минут...
24 H A D G E H O G s
 
06.02.13
17:11
Как то так

ВЫБРАТЬ
   Номенклатура.Ссылка
ПОМЕСТИТЬ НужнаяНоменклатура
ИЗ
   Справочник.Номенклатура КАК Номенклатура
ГДЕ
   Номенклатура.ЭтоГруппа = ЛОЖЬ
{ГДЕ
   Номенклатура.Ссылка.*}
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
   ТоварыНаСкладахОстатки.Склад,
   ТоварыНаСкладахОстатки.Номенклатура,
   ТоварыНаСкладахОстатки.КоличествоОстаток
ИЗ
   РегистрНакопления.ТоварыНаСкладах.Остатки(
           ,
           Номенклатура В
               (ВЫБРАТЬ
                   НужнаяНоменклатура.Ссылка
               ИЗ
                   НужнаяНоменклатура КАК НужнаяНоменклатура)) КАК ТоварыНаСкладахОстатки
;

////////////////////////////////////////////////////////////////////////////////
УНИЧТОЖИТЬ НужнаяНоменклатура
25 Vladal
 
06.02.13
17:20
(24) Чародей... 2 секунды в рабочей базе... А я делал левое соединение в ВТ, и оно мне тупило.
26 H A D G E H O G s
 
06.02.13
17:23
ВЫБРАТЬ
   ТоварыНаСкладахОстатки.Склад.Подразделение КАК Подразделение,


Тоже плохо.

Пихай ТоварыНаСкладахОстатки.Склад......

в ВТ.

И потом уже из ВТ выбирай
ВТТоварыНаСкладахОстатки.Склад.Подразделение
27 GANR
 
06.02.13
17:24
(0) Чтобы узнать, какой запрос выполняет построитель с учетом настроек отборов и прочего, сделай так:

Запрос = ТвойПостроитель.ПолучитьЗапрос();
28 H A D G E H O G s
 
06.02.13
17:25
Кстати, в Статье Гилева нет ничего про
1) Перезагрузку SQL (tempdb при этом режется)
либо
2) Шринк tempdb

Со временем у меня темпДБ вырос один раз до пары гиг, несмертельно, но seek по 2 гигабайтам и seek по паре мегабайт все же отличается.
29 Vladal
 
06.02.13
17:26
(27) Пасибки, было в (10), оттуда вытянул гадостное В ИЕРАРХИИ
30 acsent
 
06.02.13
17:28
(24) не верю что до сих пор не оптимизировали В ИЕРАРХИИ, хотя бы до уровня того что ты написал
31 Vladal
 
06.02.13
17:29
(30) Да он тоже не верил в сверхоптимизацию в v8: Сложности отладки временных таблиц. :-)
32 H A D G E H O G s
 
06.02.13
17:30
(30) Хуже не будет :-)
33 GANR
 
06.02.13
17:31
(29) Это ж циклическое сканирование таблицы. А если к этому ещё и присоединяется что-то - бе... в квадрате.
34 Vladal
 
06.02.13
17:32
(32) Всё работает! Класс!

// но где-то зудит вопрос из (7)
35 acsent
 
06.02.13
17:33
(32) сомнительно. писать лишинй код. зачем? может ты еще и циклы разворачиваешь для ускорения?
36 Vladal
 
06.02.13
17:35
(35) Понятно, некотрое извращение в обход глюков. Но разница какая! запрос в 500+ секунд и 2 секунды, что быстрее моего 5 секунд.
37 H A D G E H O G s
 
06.02.13
17:35
38 H A D G E H O G s
 
06.02.13
17:35
(35) Анатолий, отстаньте.
39 acsent
 
06.02.13
17:36
кто нибудь проводил эксперимент, что же делает в иерархии?
40 Vladal
 
06.02.13
17:37
(39) Ну раз пошла волна, нужно.
41 acsent
 
06.02.13
17:38
может индекс на вт создается платформой для более быстрого поиска и он все время отъедает?
43 acsent
 
06.02.13
17:39
а то что платформа сама делает вт для в иерархии - это давно известно
44 Vladal
 
06.02.13
17:40
(43) Но она его как-тго по-особому его делает... Или соединяет. Где глянуть?
45 acsent
 
06.02.13
17:41
в профайлере конечно же
46 Vladal
 
06.02.13
17:45
(45) Пни, каким макаром? SQL Mangement Studio?
47 acsent
 
06.02.13
17:45
(46) рано тебе еще такими вещами заниматься
48 Vladal
 
06.02.13
17:47
(47) Ну пока папка не видит, что делать-то?
49 acsent
 
06.02.13
17:47
прфайлер это отдельное приложение
50 Vladal
 
06.02.13
17:49
51 H A D G E H O G s
 
06.02.13
17:52
(50) Нет.
Профайлер входит в поставку SQL
52 H A D G E H O G s
 
06.02.13
17:53
Кроме Express Edition
53 Vladal
 
06.02.13
18:23
(51) Спасибо.
SQL 2008 Entrprise Edition.
Нашел в меню Пуск, средства производительности, профайлер.
Буду разбираться
54 Vladal
 
06.02.13
18:25
Побежало много букв, всё не успеваю читать.
Куда тыкать, чтобы увидеть свой запрос из 1С?
55 Vladal
 
06.02.13
18:31
Вопрос решён. На сегодня есть, что переваривать.
Спасибо!
56 Vladal
 
06.02.13
18:35
Про профайлер нашёл у Гилёва http://www.gilev.ru/1c/81/index/optimquery.htm#Индексы