Имя: Пароль:
1C
1С v8
Помогите переписать (оптимизировать) запрос...
0 ДенисЧ
 
19.08.11
15:04
Вот такой идиотский запрос:

   |Выбрать *
   |Поместить ВремТаб
   |из &тч Как ТЧ;
   |
   |Выбрать УникальныйНомерРазмера,
   |    Сумма(КоличествоВыпущено) Как КоличествоВыпущено,
   |    Сумма(КоличествоПродано) Как КоличествоПродано,
   |    Сумма(КоличествоБрак) Как КоличествоБрак,
   |    Сумма(КоличествоВозврат) Как КоличествоВозврат
   |из (
   |Выбрать
   |    док.СерияПродукции Как УникальныйНомерРазмера, док.Количество Как КоличествоВыпущено, 0 как КоличествоПродано, 0 Как КоличествоБрак, 0 Как КоличествоВозврат
   |Из Документ.ОтчетПроизводстваЗаСмену.Продукция Док, ВремТаб
   |Где док.Ссылка.Проведен = &Ист
   |И док.СерияПродукции.Код = ВремТаб.НомерРазмера
   |
   |Объединить Все
   |
   |Выбрать док.СерияНоменклатуры Как УникальныйНомерРазмера, 0 Как КоличествоВыпущено, док.Количество Как КоличествоПродано, 0 Как КоличествоБрак, 0 Как КоличествоВозврат
   |Из Документ.РеализацияТоваровУслуг.Товары Док, ВремТаб
   |Где док.Ссылка.Проведен = &Ист
   |И док.СерияНоменклатуры.Код = ВремТаб.НомерРазмера
   |
   |Объединить Все
   |
   |Выбрать док.СерияНоменклатуры Как УникальныйНомерРазмера, 0 Как КоличествоВыпущено, 0 как КоличествоПродано, док.Количество Как КоличествоБрак, 0 Как КоличествоВозврат
   |Из Документ.ТребованиеНакладная.Материалы Док, ВремТаб
   |Где док.Ссылка.Проведен = &Ист
   |И док.СерияНоменклатуры.Код = ВремТаб.НомерРазмера
   |И док.СчетЗатрат = &СчетБрак
   |И док.Номенклатура = док.Продукция
   |
   |Объединить Все
   |
   |Выбрать док.СерияНоменклатуры Как УникальныйНомерРазмера, 0 Как КоличествоВыпущено, 0 как КоличествоПродано, 0 Как КоличествоБрак, док.Количество Как КоличествоВозврат
   |Из Документ.ВозвратТоваровОтПокупателя.Товары Док, ВремТаб
   |Где док.Ссылка.Проведен = &Ист
   |И док.СерияНоменклатуры.Код = ВремТаб.НомерРазмера
   |) Как ТабРез
   |Сгруппировать по УникальныйНомерРазмера


Опой чувствую, что кривой донельзя... Занимает половину времени заполнения данных...
Как бы его переделать?
1 Ёпрст
 
19.08.11
15:07
(0) Продать все СП, нанять вминяемых гастробайтеров-кодеров из Индии за вырученные деньги.
Самому в отпуск.
2 mirosh
 
19.08.11
15:08
(0) ну попробуй чтоли сначала каждый запрос сгруппировать - поместить во временную таблицу, а потом уже их объединит. Если нужно - по результирующему запросу опять сгруппировать.
3 Ёпрст
 
19.08.11
15:09
>>>док.СерияНоменклатуры.Код  это условие вынеси во внешний запрос везде.
4 Inform
 
19.08.11
15:11
(3) если во внешний вынести сначала будут объединяться большие таблицы, а затем на большую выборку будет накладываться условие, так что перенос условия в основной запрос только усугубит работу.
5 ДенисЧ
 
19.08.11
15:12
(3) ты предлагаешь выбрать всю кучу данных, а потом её фильтровать?
(2) Временные... Можно попробовать...
(1) не вариант, к сожалению...
6 Axel2009
 
19.08.11
15:14
(0) выбери все серии с нужным кодом в ВТ, проиндексируй ВТ и соединяй. и еще реквизит серия номенклатуры проиндексировать в каждом из документов.
7 DrHiHi
 
19.08.11
15:16
%)))

   |Выбрать *
   |Поместить ВремТаб
   |из &тч Как ТЧ;
   |
   |Выбрать УникальныйНомерРазмера,
   |    Сумма(КоличествоВыпущено) Как КоличествоВыпущено,
   |    Сумма(КоличествоПродано) Как КоличествоПродано,
   |    Сумма(КоличествоБрак) Как КоличествоБрак,
   |    Сумма(КоличествоВозврат) Как КоличествоВозврат
   |из (
   |Выбрать
   |    док.СерияПродукции Как УникальныйНомерРазмера, док.Количество Как КоличествоВыпущено, 0 как КоличествоПродано, 0 Как КоличествоБрак, 0 Как КоличествоВозврат
   |Из Документ.ОтчетПроизводстваЗаСмену.Продукция Док
   |Где док.Ссылка.Проведен
   |
   |Объединить Все
   |
   |Выбрать док.СерияНоменклатуры Как УникальныйНомерРазмера, 0 Как КоличествоВыпущено, док.Количество Как КоличествоПродано, 0 Как КоличествоБрак, 0 Как КоличествоВозврат
   |Из Документ.РеализацияТоваровУслуг.Товары Док
   |Где док.Ссылка.Проведен
   |
   |Объединить Все
   |
   |Выбрать док.СерияНоменклатуры Как УникальныйНомерРазмера, 0 Как КоличествоВыпущено, 0 как КоличествоПродано, док.Количество Как КоличествоБрак, 0 Как КоличествоВозврат
   |Из Документ.ТребованиеНакладная.Материалы Док
   |Где док.Ссылка.Проведен
   |И док.СчетЗатрат = &СчетБрак
   |И док.Номенклатура = док.Продукция
   |
   |Объединить Все
   |
   |Выбрать док.СерияНоменклатуры Как УникальныйНомерРазмера, 0 Как КоличествоВыпущено, 0 как КоличествоПродано, 0 Как КоличествоБрак, док.Количество Как КоличествоВозврат
   |Из Документ.ВозвратТоваровОтПокупателя.Товары Док
   |Где док.Ссылка.Проведен
   |) Как ТабРез
   |ГДЕ ТабРез.СерияНоменклатуры.Код В (ВЫБРАТЬ РАЗЛИЧНЫЕ ВремТаб.НомерРазмера из ВремТаб)
   |Сгруппировать по УникальныйНомерРазмера
8 DrHiHi
 
19.08.11
15:17
(7) поправка
ГДЕ ТабРез.УникальныйНомерРазмера.Код В (ВЫБРАТЬ РАЗЛИЧНЫЕ ВремТаб.НомерРазмера из ВремТаб)
9 ДенисЧ
 
19.08.11
15:18
(8) см (5).1
10 ДенисЧ
 
19.08.11
15:19
Попробую через временные...
11 DrHiHi
 
19.08.11
15:22
(10) у тебя ошибка с

   |Из Документ.ОтчетПроизводстваЗаСмену.Продукция Док, ВремТаб
   |Где док.Ссылка.Проведен = &Ист
   |И док.СерияПродукции.Код = ВремТаб.НомерРазмера
тогда лучше сделать внутренне соединение с ВремТаб
по док.СерияПродукции.Код = ВремТаб.НомерРазмера
или в условие док.СерияПродукции.Код В (Выбрать РАзличные ВремТаб.НомерРазмера из ВремТаб)
12 Inform
 
19.08.11
15:25
ВЫБРАТЬ
   ТЧ.НомерРазмера
ПОМЕСТИТЬ ВремТаб
ИЗ
   &тч КАК ТЧ
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
   ТабРез.УникальныйНомерРазмера,
   СУММА(ТабРез.КоличествоВыпущено) КАК КоличествоВыпущено,
   СУММА(ТабРез.КоличествоПродано) КАК КоличествоПродано,
   СУММА(ТабРез.КоличествоБрак) КАК КоличествоБрак,
   СУММА(ТабРез.КоличествоВозврат) КАК КоличествоВозврат
ИЗ
   (ВЫБРАТЬ
       Док.СерияПродукции КАК УникальныйНомерРазмера,
       Док.Количество КАК КоличествоВыпущено,
       0 КАК КоличествоПродано,
       0 КАК КоличествоБрак,
       0 КАК КоличествоВозврат
   ИЗ
       Документ.ОтчетПроизводстваЗаСмену.Продукция КАК Док
           ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВремТаб КАК ВремТаб
           ПО Док.СерияПродукции.Код = ВремТаб.НомерРазмера
               И (Док.Ссылка.Проведен)
   
   ОБЪЕДИНИТЬ ВСЕ
   
   ВЫБРАТЬ
       Док.СерияНоменклатуры,
       0,
       Док.Количество,
       0,
       0
   ИЗ
       Документ.РеализацияТоваровУслуг.Товары КАК Док
           ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВремТаб КАК ВремТаб
           ПО Док.СерияНоменклатуры.Код = ВремТаб.НомерРазмера
               И (Док.Ссылка.Проведен)
   
   ОБЪЕДИНИТЬ ВСЕ
   
   ВЫБРАТЬ
       Док.СерияНоменклатуры,
       0,
       0,
       Док.Количество,
       0
   ИЗ
       Документ.ТребованиеНакладная.Материалы КАК Док
           ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВремТаб КАК ВремТаб
           ПО Док.СерияПродукции.Код = ВремТаб.НомерРазмера
               И (Док.Номенклатура = Док.Продукция)
               И (Док.СчетЗатрат = &СчетБрак)
               И (Док.Ссылка.Проведен)
   
   ОБЪЕДИНИТЬ ВСЕ
   
   ВЫБРАТЬ
       Док.СерияНоменклатуры,
       0,
       0,
       0,
       Док.Количество
   ИЗ
       Документ.ВозвратТоваровОтПокупателя.Товары КАК Док
           ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВремТаб КАК ВремТаб
           ПО Док.СерияНоменклатуры.Код = ВремТаб.НомерРазмера
               И (Док.Ссылка.Проведен)) КАК ТабРез

СГРУППИРОВАТЬ ПО
   ТабРез.УникальныйНомерРазмера
13 mirosh
 
19.08.11
15:27
(12) забыл удалить и проиндексировать временную таблицу
14 Ёпрст
 
19.08.11
15:27
(4) неправда.
15 Ёпрст
 
19.08.11
15:27
(5) да.
Это быстрее, чем присоединять каждый раз таблицу справочника.
16 mirosh
 
19.08.11
15:27
(14) ну может СУБД и найдет оптимальный план выполнения запроса. Но это не гарантировано.
17 Ёпрст
 
19.08.11
15:30
(16) это очевидно, юнион олл всегда быстрее декартова произведения.
18 Ёпрст
 
19.08.11
15:31
(0) Давай, замеряй.. не ленись, все варианты :)
19 ДенисЧ
 
19.08.11
15:31
Сделал внутреннее соединение...
План запроса в скуле ухудшился...

Вот самый тяжёлый предикат
[upp1].[dbo].[_Document565_VT16136].[_Fld16160RRef] as [T10].[_Fld16160RRef]=[@P3] AND [upp1].[dbo].[_Document565_VT16136].[_Fld16145RRef] as [T10].[_Fld16145RRef]=[upp1].[dbo].[_Document565_VT16136].[_Fld16149RRef] as [T10].[_Fld16149RRef] AND PROBE([Bitmap1094],[upp1].[dbo].[_Document565_VT16136].[_Fld16150RRef] as [T10].[_Fld16150RRef])
20 ДенисЧ
 
19.08.11
15:32
Попробую условие на серию вынести наружу...
21 Inform
 
19.08.11
15:34
(13) В исходном запросе выбирается "*" из ТЗ, там надо по месту смотреть и индексировать.
А удалять ВТ смысла нет они живут пока выполняется пакет. Времена менеджера временных таблиц давно прошли...
22 mirosh
 
19.08.11
15:35
(21) "А удалять ВТ смысла нет они живут пока выполняется пакет." - Это не так. Методисты 1С советуют ВСЕГДА удалять временные таблицы, т.к. они могут "оставаться в памяти".
23 ДенисЧ
 
19.08.11
15:35
(21) в той ТЗ одна колонка. И на каждое выполнение там в среднем не больше 20 записей...
+(20) Вынес... Ускорение - 1%
24 Ёпрст
 
19.08.11
15:37
(23)
1%, маловато..
код то покажи, результриующий
25 ДенисЧ
 
19.08.11
15:38
(24)
   |Выбрать *
   |Поместить ВремТаб
   |из &тч Как ТЧ;
   |
   |Выбрать УникальныйНомерРазмера,
   |    Сумма(КоличествоВыпущено) Как КоличествоВыпущено,
   |    Сумма(КоличествоПродано) Как КоличествоПродано,
   |    Сумма(КоличествоБрак) Как КоличествоБрак,
   |    Сумма(КоличествоВозврат) Как КоличествоВозврат
   |из (
   |Выбрать
   |    док.СерияПродукции Как УникальныйНомерРазмера, док.Количество Как КоличествоВыпущено, 0 как КоличествоПродано, 0 Как КоличествоБрак, 0 Как КоличествоВозврат
   |Из Документ.ОтчетПроизводстваЗаСмену.Продукция Док
   |Где док.Ссылка.Проведен = &Ист
   |
   |Объединить Все
   |
   |Выбрать док.СерияНоменклатуры Как УникальныйНомерРазмера, 0 Как КоличествоВыпущено, док.Количество Как КоличествоПродано, 0 Как КоличествоБрак, 0 Как КоличествоВозврат
   |Из Документ.РеализацияТоваровУслуг.Товары Док
   |Где док.Ссылка.Проведен = &Ист
   |
   |Объединить Все
   |
   |Выбрать док.СерияНоменклатуры Как УникальныйНомерРазмера, 0 Как КоличествоВыпущено, 0 как КоличествоПродано, док.Количество Как КоличествоБрак, 0 Как КоличествоВозврат
   |Из Документ.ТребованиеНакладная.Материалы Док
   |Где док.Ссылка.Проведен = &Ист
   |И док.СчетЗатрат = &СчетБрак
   |И док.Номенклатура = док.Продукция
   |
   |Объединить Все
   |
   |Выбрать док.СерияНоменклатуры Как УникальныйНомерРазмера, 0 Как КоличествоВыпущено, 0 как КоличествоПродано, 0 Как КоличествоБрак, док.Количество Как КоличествоВозврат
   |Из Документ.ВозвратТоваровОтПокупателя.Товары Док
   |Где док.Ссылка.Проведен = &Ист
   |) Как ТабРез, ВремТаб
   |Где ТабРез.УникальныйНомерРазмера.Код = ВремТаб.НомерРазмера
   |Сгруппировать по УникальныйНомерРазмера
26 Axel2009
 
19.08.11
15:39
(25) индексы то по сериям есть???
27 mirosh
 
19.08.11
15:39
(23) ну а вместо соединения, ты не написал, что
ГДЕ док.СерияНоменклатуры.Код В (Выбрать РАзличные ВремТаб.НомерРазмера из ВремТаб)?
И так везде - обязательно
28 mirosh
 
19.08.11
15:39
+(27) то есть не вместо, а в условия запихнуть
29 ДенисЧ
 
19.08.11
15:40
(26) есть. В ТрН проиндексировал поля Серия, номенклатура, Продукция, СчетЗатрат.
30 Axel2009
 
19.08.11
15:40
(29) тогда попробуй сначала ВТ сформировать по нужным сериям с индексом по полю. и соединять с таблицами. выборки то большие получаются??
31 Axel2009
 
19.08.11
15:41
_Document565 - это какой документ?
32 ДенисЧ
 
19.08.11
15:42
(27) заменил в (25) условие на
|ГДЕ ТабРез.УникальныйНомерРазмера.Код В (Выбрать РАзличные ВремТаб.НомерРазмера из ВремТаб)

Стало ещё хуже. Попробую внутрь впихать...
Хотя Различные не нужно по постановке задачи.
33 Inform
 
19.08.11
15:42
(29) Попробуй запрос из (12)
(22) Раньше скорее всего рекомендовали, когда использовался МенеджерВременныхТаблиц в явном виде. Вот тут М. Радченко объясняет как уничтожаются ВТ:
http://devtrainingforum.v8.1c.ru/forum/thread.jsp?id=555964&threadtype=0
34 ДенисЧ
 
19.08.11
15:42
(30) в смысле - из справочника серий выдрать, а потом уже с ним сравнивать? Попробую...
(31) требование-накладная
35 Axel2009
 
19.08.11
15:43
(32) фигней не занимайся. в худшем случае он из время таб как ИЛИ все разфигачит. в лучшем случае будет равнозначно что есть сейчас.
36 DrHiHi
 
19.08.11
15:43
(25) мама, роди меня обратно
   |) Как ТабРез, ВремТаб
   |Где ТабРез.УникальныйНомерРазмера.Код = ВремТаб.НомерРазмера
(32) еще убери ", ВремТаб"
37 ДенисЧ
 
19.08.11
15:43
(33) ТО же самое вплоть до плана запроса в sql
38 mirosh
 
19.08.11
15:43
(32) ну я имею в виду, что каждый запрос в объединить должен быть как ВТ. Внутрь каждой ВТ ставить условие, что СерияНоменклатуры.Код В (Выбрать ВремТаб.НомерРазмера из ВремТаб)
39 Reaper_1c
 
19.08.11
15:44
+(36) почему не используешь внутреннее соединение? Зачем тут декартово произведение?
40 DrHiHi
 
19.08.11
15:44
(39)
я выше писал
41 Axel2009
 
19.08.11
15:45
(39) какое декартово произведение?
42 Inform
 
19.08.11
15:46
(37) быть не может, в (12) внутреннее соединение и все условия в условия соединения таблиц перенесены
43 Reaper_1c
 
19.08.11
15:46
44 Ёпрст
 
19.08.11
15:47
(43) у него иннер джоин, если что
45 DrHiHi
 
19.08.11
15:47
(39) в некоторых случаях замечал, что в условии быстрее работает, чем при внутреннем соединении
46 Axel2009
 
19.08.11
15:47
(43) планы запроса то смотрел, чтобы говорить про это произведение?
47 Ёпрст
 
19.08.11
15:47
+44 дальше условие where идёт
48 Axel2009
 
19.08.11
15:48
(45) не верю =)
49 Ёпрст
 
19.08.11
15:49
(0)
пробуй так..

во ВремТаб соедини с табличкой справочника и поимей в ВремТаб сразу ссылку на УникальныйНомерРазмера, затем в основном запросе втыкай условие уже на серию, а не на её код.
50 Reaper_1c
 
19.08.11
15:49
(46) Нет. Тащи, поглядим. Не верю я, что 1С транслирует такую конструкцию в нормальное соединение.
51 Axel2009
 
19.08.11
15:50
(50) транслирует
52 ДенисЧ
 
19.08.11
15:51
(49) уже. Чуть побыстрее стало. Но всё равно ощутима задержка...

вот такой получился

   |Выбрать *
   |Поместить ВремТаб
   |из &тч Как ТЧ;
   |
   |Выбрать Различные Ссылка Как Серия
   |Поместить ВремСерии
   |Из Справочник.СерииНоменклатуры
   |Где Код В (Выбрать РАзличные ВремТаб.НомерРазмера из ВремТаб);
   |
   |Выбрать УникальныйНомерРазмера,
   |    Сумма(КоличествоВыпущено) Как КоличествоВыпущено,
   |    Сумма(КоличествоПродано) Как КоличествоПродано,
   |    Сумма(КоличествоБрак) Как КоличествоБрак,
   |    Сумма(КоличествоВозврат) Как КоличествоВозврат
   |из (
   |Выбрать
   |    док.СерияПродукции Как УникальныйНомерРазмера, док.Количество Как КоличествоВыпущено, 0 как КоличествоПродано, 0 Как КоличествоБрак, 0 Как КоличествоВозврат
   |Из Документ.ОтчетПроизводстваЗаСмену.Продукция Док
   |Где док.Ссылка.Проведен = &Ист
   |
   |Объединить Все
   |
   |Выбрать док.СерияНоменклатуры Как УникальныйНомерРазмера, 0 Как КоличествоВыпущено, док.Количество Как КоличествоПродано, 0 Как КоличествоБрак, 0 Как КоличествоВозврат
   |Из Документ.РеализацияТоваровУслуг.Товары Док
   |Где док.Ссылка.Проведен = &Ист
   |
   |Объединить Все
   |
   |Выбрать док.СерияНоменклатуры Как УникальныйНомерРазмера, 0 Как КоличествоВыпущено, 0 как КоличествоПродано, док.Количество Как КоличествоБрак, 0 Как КоличествоВозврат
   |Из Документ.ТребованиеНакладная.Материалы Док
   |Где док.Ссылка.Проведен = &Ист
   |И док.СчетЗатрат = &СчетБрак
   |И док.Номенклатура = док.Продукция
   |
   |Объединить Все
   |
   |Выбрать док.СерияНоменклатуры Как УникальныйНомерРазмера, 0 Как КоличествоВыпущено, 0 как КоличествоПродано, 0 Как КоличествоБрак, док.Количество Как КоличествоВозврат
   |Из Документ.ВозвратТоваровОтПокупателя.Товары Док
   |Где док.Ссылка.Проведен = &Ист
   |) Как ТабРез, ВремСерии
   |ГДЕ ТабРез.УникальныйНомерРазмера = ВремСерии.Серия
   |Сгруппировать по УникальныйНомерРазмера
53 Aprobator
 
19.08.11
15:51
(0) ВремТаб из за одной колонки? Массив и условие В не катит?
54 ДенисЧ
 
19.08.11
15:51
(50) вот такой получается

SELECT
T6._Fld14315RRef AS Fld14315RRef,
CAST(@P1 AS NUMERIC(15, 3)),
T6._Fld14303 AS Fld14303_,
CAST(@P1 AS NUMERIC(15, 3)),
CAST(@P1 AS NUMERIC(15, 3))
FROM _Document527_VT14297 T6 WITH(NOLOCK)
INNER JOIN #tt1 T7 WITH(NOLOCK)
ON 1=1
LEFT OUTER JOIN _Document527 T8 WITH(NOLOCK)
ON T6._Document527_IDRRef = T8._IDRRef
LEFT OUTER JOIN _Reference210 T9 WITH(NOLOCK)
ON T6._Fld14315RRef = T9._IDRRef
WHERE (T8._Posted = @P2) AND (T9._Code = T7._Q_000_F_000)

То есть транслирует
55 ДенисЧ
 
19.08.11
15:52
(53) Может, и катит... Просто там одна колонка осталась в процесс рефакторинга :-) До этого было больше.
56 Aprobator
 
19.08.11
15:55
И кстати. Условие, по своей сути, функция возвращающая булево значение. Посему реквизиты типа булево не имеет смысла с чем либо сравнивать. Т.е. вместо: док.Ссылка.Проведен = &Ист достаточно док.Ссылка.Проведен.
57 Reaper_1c
 
19.08.11
15:57
(54) *присвистнул* Мать честная, поумнела платформа! спасибо, буду знать.

Он кстати, подлец, условие на проведение документов вообще вовне вынес, что печально...
58 ДенисЧ
 
19.08.11
16:01
(56) Да, спасибо. Не подумал.
59 Reaper_1c
 
19.08.11
16:05
Ах ты ж етит твою налево, нифига она не поумнела. от этого

INNER JOIN #tt1 T7 WITH(NOLOCK)
ON 1=1

легче никогда не станет.
Переделай в 1Се на внтреннее соединение - ну должен он тогда честно все построить.
60 Axel2009
 
19.08.11
16:06
(57) а при чем тут платформа? раньше запросы были через кроссджоины и условия в ГДЕ. скуль это умеет еще с версии 6.0
61 Reaper_1c
 
19.08.11
16:08
(60) Да я ее и не виню - я с самого начала предлагал от декартова произведения избавиться.
62 DrHiHi
 
19.08.11
16:12
(48) протестируй
ВЫБРАТЬ
   1 КАК число
ПОМЕСТИТЬ ВТЧисла

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
   2

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
   3

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
   4

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
   5

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
   6

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
   7

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
   8

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
   9

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
   0
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
   ВТЧисла.число * 10000 + ВТЧисла1.число * 1000 + ВТЧисла2.число * 100 + ВТЧисла3.число * 10 + ВТЧисла4.число КАК Поле1
ПОМЕСТИТЬ ВТВрем
ИЗ
   ВТЧисла КАК ВТЧисла,
   ВТЧисла КАК ВТЧисла1,
   ВТЧисла КАК ВТЧисла2,
   ВТЧисла КАК ВТЧисла3,
   ВТЧисла КАК ВТЧисла4
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
   ВТВрем.Поле1
ИЗ
   ВТВрем КАК ВТВрем
       ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТВрем КАК ВТВрем1
       ПО ВТВрем.Поле1 = ВТВрем1.Поле1
//ГДЕ
//    ВТВрем.Поле1 В
//            (ВЫБРАТЬ РАЗЛИЧНЫЕ
//                ВТВрем1.Поле1
//            ИЗ
//                ВТВрем КАК ВТВрем1)
63 Axel2009
 
19.08.11
16:14
(61) внезапно
select * from t t1 cross join t t2

(строк обработано: 1)

StmtText
------------------------------------------
 |--Nested Loops(Inner Join)
      |--Table Scan(OBJECT:(t AS [t2]))
      |--Table Scan(OBJECT:(t AS [t1]))

(строк обработано: 3)

StmtText
----------------------------------------

select * from t t1 join t t2 on 1=1

(строк обработано: 1)

StmtText
------------------------------------------
 |--Nested Loops(Inner Join)
      |--Table Scan(OBJECT:(t AS [t2]))
      |--Table Scan(OBJECT:(t AS [t1]))

(строк обработано: 3)

StmtText
------------------------------------------------------------

select * from t t1 join t t2 on 1=1
where t1.i = t2.i

(строк обработано: 1)

StmtText
----------------------------------------------------------------------------------------------------------
 |--Hash Match(Inner Join, HASH:([t2].[i])=([t1].[i]), RESIDUAL:(t.[i] as [t2].[i]=t.[i] as [t1].[i]))
      |--Table Scan(OBJECT:(t AS [t2]))
      |--Table Scan(OBJECT:(t AS [t1]))

(строк обработано: 3)
64 ДенисЧ
 
19.08.11
16:19
Переделал на явные соединения - выигрыш по скорости - 0.15 сек из 2х...
65 Ёпрст
 
19.08.11
16:23
(64) остается только совет из (1)
66 Inform
 
19.08.11
16:24
(64) явные - внутренние?
67 ДенисЧ
 
19.08.11
16:26
(66) Угу. Типа

   |Выбрать док.СерияНоменклатуры Как УникальныйНомерРазмера, 0 Как КоличествоВыпущено, 0 как КоличествоПродано, док.Количество Как КоличествоБрак, 0 Как КоличествоВозврат
   |Из Документ.ТребованиеНакладная.Материалы Док
   |Внутреннее Соединение ВремСерии
   |    по Док.СерияНоменклатуры = ВремСерии.Серия
   |Где док.Ссылка.Проведен
   |И док.СчетЗатрат = &СчетБрак
   |И док.Номенклатура = док.Продукция
68 ДенисЧ
 
19.08.11
16:26
(65) не... Я сам хочу пог*внокодить :-)
69 Inform
 
19.08.11
16:27
(67) сделай:
           ПО Док.СерияПродукции.Код = ВремСерии.НомерРазмера
               И (Док.Номенклатура = Док.Продукция)
               И (Док.СчетЗатрат = &СчетБрак)
               И (Док.Ссылка.Проведен)

вместо:

|    по Док.СерияНоменклатуры = ВремСерии.Серия
   |Где док.Ссылка.Проведен
   |И док.СчетЗатрат = &СчетБрак
   |И док.Номенклатура = док.Продукция
70 Aprobator
 
19.08.11
16:28
(68) поддерживаю Свои шишки лучше запоминаются. А уж "добрых" людей, готовых чем нибудь в тебя кинуть за г*код, на мисте предостаточно.
71 Reaper_1c
 
19.08.11
16:28
(64) пробуй перед соединением обе таблицы сделать временными с индексами по полям соединения и только после этого соединять.
72 ДенисЧ
 
19.08.11
16:40
(69) сделал...

SELECT
T8._Fld16150RRef AS Fld16150RRef,
CAST(@P1 AS NUMERIC(15, 3)),
CAST(@P1 AS NUMERIC(15, 3)),
T8._Fld16142 AS Fld16142_,
CAST(@P1 AS NUMERIC(15, 3))
FROM _Document565_VT16136 T8 WITH(NOLOCK)
INNER JOIN #tt2 T9 WITH(NOLOCK)
ON (T8._Fld16150RRef = T9._Q_001_F_000RRef)
LEFT OUTER JOIN _Document565 T10 WITH(NOLOCK)
ON T8._Document565_IDRRef = T10._IDRRef
WHERE T10._Posted = @P2 AND (T8._Fld16160RRef = @P3) AND (T8._Fld16145RRef = T8._Fld16149RRef)
73 ДенисЧ
 
19.08.11
16:42
(71) там основное время занимает предикат

[upp1].[dbo].[_Document565_VT16136].[_Fld16160RRef] as [T8].[_Fld16160RRef]=[@P3] AND [upp1].[dbo].[_Document565_VT16136].[_Fld16145RRef] as [T8].[_Fld16145RRef]=[upp1].[dbo].[_Document565_VT16136].[_Fld16149RRef] as [T8].[_Fld16149RRef]

Так что индексы во временных таблицах не помогут ничем.
74 Axel2009
 
19.08.11
16:42
(72) мои советы пробовал или игнорировал?
75 ДенисЧ
 
19.08.11
16:44
(74) пробовал.
76 Aprobator
 
19.08.11
16:46
так какой вариант самый шустрый оказался?
77 Axel2009
 
19.08.11
16:46
(75) а планы выполнения кинь в файл и прицепи куданить
и кинь структуру таблицы _Document565_VT16136 из структурыхраненияинформационнойбазы чтобы было понятно что какое поле значит
78 ДенисЧ
 
19.08.11
16:48
(76) такой

   |Выбрать *
   |Поместить ВремТаб
   |из &тч Как ТЧ;
   |
   |Выбрать Различные Ссылка Как Серия
   |Поместить ВремСерии
   |Из Справочник.СерииНоменклатуры
   |Где Код В (Выбрать РАзличные ВремТаб.НомерРазмера из ВремТаб);
   |
   |Выбрать УникальныйНомерРазмера,
   |    Сумма(КоличествоВыпущено) Как КоличествоВыпущено,
   |    Сумма(КоличествоПродано) Как КоличествоПродано,
   |    Сумма(КоличествоБрак) Как КоличествоБрак,
   |    Сумма(КоличествоВозврат) Как КоличествоВозврат
   |из (
   |Выбрать
   |    док.СерияПродукции Как УникальныйНомерРазмера, док.Количество Как КоличествоВыпущено, 0 как КоличествоПродано, 0 Как КоличествоБрак, 0 Как КоличествоВозврат
   |Из Документ.ОтчетПроизводстваЗаСмену.Продукция Док, ВремСерии
   |Где док.Ссылка.Проведен
   |И док.СерияПродукции = ВремСерии.Серия
   |
   |Объединить Все
   |
   |Выбрать док.СерияНоменклатуры Как УникальныйНомерРазмера, 0 Как КоличествоВыпущено, док.Количество Как КоличествоПродано, 0 Как КоличествоБрак, 0 Как КоличествоВозврат
   |Из Документ.РеализацияТоваровУслуг.Товары Док, ВремСерии
   |Где док.Ссылка.Проведен
   |И док.СерияНоменклатуры = ВремСерии.Серия
   |
   |Объединить Все
   |
   |Выбрать док.СерияНоменклатуры Как УникальныйНомерРазмера, 0 Как КоличествоВыпущено, 0 как КоличествоПродано, док.Количество Как КоличествоБрак, 0 Как КоличествоВозврат
   |Из Документ.ТребованиеНакладная.Материалы Док
   |Внутреннее Соединение ВремСерии
   |    по (Док.СерияНоменклатуры = ВремСерии.Серия)
   |    И док.Ссылка.Проведен
   |    И (док.СчетЗатрат = &СчетБрак)
   |    И (док.Номенклатура = док.Продукция)
   |
   |Объединить Все
   |
   |Выбрать док.СерияНоменклатуры Как УникальныйНомерРазмера, 0 Как КоличествоВыпущено, 0 как КоличествоПродано, 0 Как КоличествоБрак, док.Количество Как КоличествоВозврат
   |Из Документ.ВозвратТоваровОтПокупателя.Товары Док, ВремСерии
   |Где док.Ссылка.Проведен
   |И док.СерияНоменклатуры = ВремСерии.Серия
   |) Как ТабРез
   |Сгруппировать по УникальныйНомерРазмера
79 ДенисЧ
 
19.08.11
16:49
(77) структуру лень вытягивать :-)

Про (73) я и так скажу
_Fld16160RRef - СчетЗатрат
_Fld16145RRef - Номенклатура
_Fld16149RRef - Продукция
80 Axel2009
 
19.08.11
16:50
(док.Номенклатура = док.Продукция) сколько совпадений?
81 ДенисЧ
 
19.08.11
16:50
А план... 145КБ xml - оно тебе нужно? :-)
82 Axel2009
 
19.08.11
16:50
[upp1].[dbo].[_Document565_VT16136].[_Fld16160RRef] as [T8].[_Fld16160RRef]=[@P3] AND [upp1].[dbo].[_Document565_VT16136].[_Fld16145RRef] as [T8].[_Fld16145RRef]=[upp1].[dbo].[_Document565_VT16136].[_Fld16149RRef] as [T8].[_Fld16149RRef]
это как отображается в плане? и оно идет раньше чем соединение с сериями или позже?
83 ДенисЧ
 
19.08.11
16:51
(80) ~25-30% от всей массы
84 Axel2009
 
19.08.11
16:51
(81) план в тексте вывести. там не xml получится
85 Axel2009
 
19.08.11
16:51
индекс по продукции и номенклатуре есть?
86 ДенисЧ
 
19.08.11
16:52
(82) вот так отображается

http://pics.rsh.ru/img/plan_unjdi.jpg
Идёт позже
87 ДенисЧ
 
19.08.11
16:52
(84) мне предлагает только .sqlplan, а это xml...
88 ДенисЧ
 
19.08.11
16:53
(85) Я уже писал выше. Есть.
89 Axel2009
 
19.08.11
16:57
(88)
Выбрать ДокНом.СерияНоменклатуры Как УникальныйНомерРазмера, 0 Как КоличествоВыпущено, 0 как КоличествоПродано, ДокНом.Количество Как КоличествоБрак, 0 Как КоличествоВозврат
   Из Документ.ТребованиеНакладная.Материалы КАК ДокНом
   ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.ТребованиеНакладная.Материалы КАК ДокПрод
   ПО ДокНом.Ссылка = ДокПрод.Ссылка И ДокНом.Номенклатура = ДокПрод.Продукция
   ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВремСерии
   ПО ДокНом.СерияНоменклатуры = ВремСерии.Серия
ГДЕ ДокНом.Ссылка.Проведен
       И (ДокНом.СчетЗатрат = &СчетБрак)
?
90 ДенисЧ
 
19.08.11
16:57
ойблин... Сейчас попробую...
91 Axel2009
 
19.08.11
16:57
мм еще по НомерСтроки соединить наверное лучше
92 ДенисЧ
 
19.08.11
17:01
не... Хуже стало
93 Axel2009
 
19.08.11
17:04
а данных по ТРН выдается сколько? строк. и сколько в принципе там строк?
94 ДенисЧ
 
19.08.11
17:04
Основной затык по-прежнему на Номенклатура=Продукция...

Наверное, надо принцип получения данных менять...
95 ДенисЧ
 
19.08.11
17:05
(93) Всего Трнов в базе порядочно. А в результате запроса и фильтрации остаётся не больше 3-4...
96 Axel2009
 
19.08.11
17:06
3-4 строки??
97 Axel2009
 
19.08.11
17:06
Выбрать док.СерияНоменклатуры Как УникальныйНомерРазмера, 0 Как КоличествоВыпущено, 0 как КоличествоПродано, док.Количество Как КоличествоБрак, 0 Как КоличествоВозврат
   Из Документ.ТребованиеНакладная.Материалы Док
   Внутреннее Соединение ВремСерии
       по (Док.СерияНоменклатуры = ВремСерии.Серия)
       И док.Ссылка.Проведен
       И (док.СчетЗатрат = &СчетБрак)
сколько выполняется?
98 Stim213
 
19.08.11
17:07
фига вы тут нафлудили..
99 ДенисЧ
 
19.08.11
17:12
(97) Общий запрос с такой конструкцией - 1.45 сек на всё про всё.
(96) Ага. Требований дофига, а нужных мне мало.
100 Stim213
 
19.08.11
17:13
сотке
101 ДенисЧ
 
19.08.11
17:13
Правда, там идеологически неверно, запросы в циклах и тд :-))

А нужные номера серий получаются из другой базы... Наверное, буду на следующей неделе переделывать полностью, ибо текущий вариант - это калька с 77шного, писанного до меня...
102 Axel2009
 
19.08.11
17:18
(99) а скока строк выводится при этом?
103 ДенисЧ
 
19.08.11
17:19
(102) по всему запросу (до сворачивания) - от 1 до 50и
104 Axel2009
 
19.08.11
17:19
(103) то что в 97
105 ДенисЧ
 
19.08.11
17:20
(104) на тех данных, что я сейчас кручу - от 0 до 3. На один номер продукции так много брака пока нет :-)
106 Axel2009
 
19.08.11
17:22
(105) вот. а по колонке СчетЗатрат есть индекс??
107 ДенисЧ
 
19.08.11
17:23
(106) И опять же говорил :-) Есть
108 ДенисЧ
 
19.08.11
17:23
А скуль всё равно по кластерному индексу бегает...
109 Ёпрст
 
19.08.11
17:35
вот такой сколько выполняется ?

Выбрать *
   |Поместить ВремТаб
   |из &тч Как ТЧ;
   |
   |Выбрать Различные Ссылка Как Серия
   |Поместить ВремСерии
   |Из Справочник.СерииНоменклатуры
   |Где Код В (Выбрать ВремТаб.НомерРазмера из ВремТаб);
   |
   |Выбрать УникальныйНомерРазмера,
   |    Сумма(КоличествоВыпущено) Как КоличествоВыпущено,
   |    Сумма(КоличествоПродано) Как КоличествоПродано,
   |    Сумма(КоличествоБрак) Как КоличествоБрак,
   |    Сумма(КоличествоВозврат) Как КоличествоВозврат
   |из (
   |Выбрать
   |    док.СерияПродукции Как УникальныйНомерРазмера, док.Количество Как КоличествоВыпущено, 0 как КоличествоПродано, 0 Как КоличествоБрак, 0 Как КоличествоВозврат
   |Из Документ.ОтчетПроизводстваЗаСмену.Продукция Док
   |Где док.Ссылка.Проведен
   |
   |Объединить Все
   |
   |Выбрать док.СерияНоменклатуры,0,док.Количество,0,0
   |Из Документ.РеализацияТоваровУслуг.Товары Док
   |Где док.Ссылка.Проведен
   |И док.СерияНоменклатуры = ВремСерии.Серия
   |
   |Объединить Все
   |
   |Выбрать док.СерияНоменклатуры,0,0,док.Количество,0
   |Из Документ.ТребованиеНакладная.Материалы Док
   |Где
   |    И док.Ссылка.Проведен
   |    И (док.СчетЗатрат = &СчетБрак)
   |    И (док.Номенклатура = док.Продукция)
   |
   |Объединить Все
   |
   |Выбрать док.СерияНоменклатуры,0,0,0,док.Количество
   |Из Документ.ВозвратТоваровОтПокупателя.Товары Док
   |Где док.Ссылка.Проведен
   |) Как ТабРез
   |Внутреннее Соединение ВремСерии
   |    по ТабРез.УникальныйНомерРазмера = ВремСерии.Серия
   |Сгруппировать по ТабРез.УникальныйНомерРазмера
110 artbear
 
19.08.11
17:38
(0) А если по одной таблице документов оставить и посмотреть, какой док самый тормозной? ну или в плане изучить?
Какой?
111 Ёпрст
 
19.08.11
17:39
(110) у него Документ.ТребованиеНакладная.Материалы , там где
условие на док.Номенклатура = док.Продукция
112 artbear
 
19.08.11
17:41
(109) ИМХО вместо док.Ссылка.Проведен нужно явно прописать соединение
да и по Булевскому значению индекс никакой, поэтому тупой поиск :(
т.е. это условие вообще юзать только в конце нужно :(
сначала что-то более подробное.
113 artbear
 
19.08.11
17:47
(All) Небольшой ОФФ.
Периодически я задаюсь вопросом: почему 1С не выполнила денормализацию основной таблицы документа и табличных частей в  плане Проведен и Даты.
Ведь практически любые запросы по ТЧ документов юзают эти два реквизиты, т.е. постоянные соединения.
Дата еще сойдет, по ней индекс нормально может строиться,
но вот Проведен только через поиск работает :(
Понятно, что сложность работы напрямую с таблицами возрастает, типа нужно помнить, что при обновлении основной таблицы и таб.части нужно обновлять.
Но и это можно было загнать в доку и всех обязать юзать.
Или я сильно не прав? :(
114 DrHiHi
 
19.08.11
17:49
это на всех так пятница влияет или луна??
115 ДенисЧ
 
19.08.11
21:16
(112) "сначала что-то более подробное"
Что именно?
116 artbear
 
20.08.11
09:41
(115) Я говорил о реквизитах, значений которых больше, и по которым скуль будет юзать индекс, а не тупой поиск.
Например, отбор по товару и т.п.
а уже после этого можно заюзать Проведен
117 artbear
 
20.08.11
09:54
Т.е., например, сделать так
[code]
Выбрать * ИЗ (Выбрать док.Ссылка, док.СерияНоменклатуры,0,0,док.Количество,0
   |Из Документ.ТребованиеНакладная.Материалы Док
   |Где
   |    (док.СчетЗатрат = &СчетБрак)
   |    И (док.Номенклатура = док.Продукция)
) КАК Таблица
ЛЕВОЕ СОЕДИНЕНИЕ Документ.ТребованиеНакладная КАК Док
По Таблица.Ссылка = Док.Ссылка
ГДЕ
  док.Проведен
[/code]
Возможно, что и счет затрат можно выкинуть во внешний запрос
118 artbear
 
20.08.11
09:56
ОФФ забыл, как оформлять код :(
В правилах НИФИГА нету, помню, что Asmody показывал на форуме, что и как, но ветку не найду :(
Тест
<code>Тестовый код 1</code>
124 artbear
 
20.08.11
10:04
(117) +
Т.е., например, сделать так

Выбрать * ИЗ (Выбрать док.Ссылка, док.СерияНоменклатуры,0,0,док.Количество,0
   |Из Документ.ТребованиеНакладная.Материалы Док
   |Где
   |    (док.СчетЗатрат = &СчетБрак)
   |    И (док.Номенклатура = док.Продукция)
) КАК Таблица
ЛЕВОЕ СОЕДИНЕНИЕ Документ.ТребованиеНакладная КАК Док
По Таблица.Ссылка = Док.Ссылка
ГДЕ
  док.Проведен
125 artbear
 
20.08.11
10:07
(124) 1. Можно и Счет затрат перенести во внешний запрос
2. А можно и внутреннее соединение сделать по условию

Выбрать * ИЗ (Выбрать док.Ссылка, док.СерияНоменклатуры,0,0,док.Количество,0
   Из Документ.ТребованиеНакладная.Материалы Док
   Где
       //(док.СчетЗатрат = &СчетБрак) И
       (док.Номенклатура = док.Продукция)
) КАК Таблица
ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.ТребованиеНакладная КАК Док
По Таблица.Ссылка = Док.Ссылка
И   док.Проведен
Где
  (Таблица.СчетЗатрат = &СчетБрак)

В общем, нужно проверять быстродействие.
ИМХО Один из этих способов точно быстрее твоего :)
126 ДенисЧ
 
20.08.11
10:10
Так.сЪ.
Продираясь сквозь попытки.
У меня соединяются несколько документов.Счёт затрат есть только в одном. Так что выносить не получиться
127 ДенисЧ
 
20.08.11
10:11
(116) Всех данных у меня на момент запроса - только номер серии. Можно выдирать номенклатуру по ней, но уже сделал выдирание серии. Сомневаюсь, что можно ещё повысисть скорость.
128 artbear
 
20.08.11
10:12
(126) 1. Я разложил один твой запрос из вложенного, добавив еще один уровень вложенности.
2. Если (док.Номенклатура = док.Продукция) часто выполняется, то выносить нужно его, а не счетБрака
129 artbear
 
20.08.11
10:14
По серии все правильно, но можно еще попробовать ускориться.
Если Документ.ТребованиеНакладная.Материалы самая большая таблица, изучи условия по ней.
Например, сделай группировки по Ссылка.Проведен, СчетЗатрат и Док.Номенклатура = Док.Продукция и посчитай количество элементов по их различным значениям.
Там, где больше всего разных вариантов или меньше элементов, и можно делать внутреннее условие, а потом уже остальные во внешнем
130 artbear
 
20.08.11
10:17
(129) +
Ну т.е упрощенно

Выбрать Количество(Таблица.Ссылка), Таблица.СчетЗатрат
Из Документ.ТребованиеНакладная.Материалы КАК Таблица
ГРУППИРОВАТЬ ПО Таблица.СчетЗатрат

и по остальным условия сделать аналогичные запросы
131 ДенисЧ
 
20.08.11
10:18
(128) если ты не заметил, то номенклатура=продукция проверяется только для одного вида документов. И выносить это во внешнее условие - ни никакого смысла нет.
132 artbear
 
20.08.11
10:18
(127) Жду ответа на поставленные вопросы :)
133 ДенисЧ
 
20.08.11
10:19
(129) уже приводил проценты.
Проведён - 95%
Счет затрат - 75%
номенклатура=Продукция = 25%
134 artbear
 
20.08.11
10:19
Ты пропустил историю маленько :)
110 Я (0) А если по одной таблице документов оставить и посмотреть, какой док самый тормозной? ну или в плане изучить?
Какой?
111 Ёпрст3
111 - 19.08.11 - 17:39
(110) у него Документ.ТребованиеНакладная.Материалы , там где
условие на док.Номенклатура = док.Продукция
===
Вот я и начал изучать работу по этой таблице :)
отсюда и рекомендации
135 ДенисЧ
 
20.08.11
10:20
(134) дык отсюда и пляшу. Причём смотрю планы запроса по sql. Это всё выше есть.
136 Jofa
 
20.08.11
10:23
Откуда у тебя тч берётся??
137 ДенисЧ
 
20.08.11
10:24
(136) из внешнего запроса к ораклю.
Нет, на .14 переходить пока не собираюсь.
Выдирается через ADO/
138 artbear
 
20.08.11
10:25
(133) (134) 1Это я видел
2. смотри, у тебя во вложенном запросе есть код
Объединить Все
   
   Выбрать док.СерияНоменклатуры,0,0,док.Количество,0
   Из Документ.ТребованиеНакладная.Материалы Док
   Где
       И док.Ссылка.Проведен
       И (док.СчетЗатрат = &СчетБрак)
       И (док.Номенклатура = док.Продукция)

Попробуй заменить его на следующий
Объединить Все
   
   Выбрать док.СерияНоменклатуры,0,0,док.Количество,0
   ИЗ (Выбрать док.Ссылка, док.СерияНоменклатуры,док.Количество
   Из Документ.ТребованиеНакладная.Материалы Док
   Где
       (док.Номенклатура = док.Продукция)
) КАК Таблица
)КАК Док
ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.ТребованиеНакладная КАК ДокШапка
По Таблица.Ссылка = ДокШапка.Ссылка
И   ДокШапка.Проведен
Где
  (док.СчетЗатрат = &СчетБрак)
139 ДенисЧ
 
20.08.11
10:25
(138) А где я тебе счет затрат возьму в ОПзС? И зачем он там?
140 ДенисЧ
 
20.08.11
10:26
Стоп, понял. Нет. Это будет ещё хуже.
141 ДенисЧ
 
20.08.11
10:26
Хотя бы потому, что я ссылку на документ наружу не тащу, не нужен он там, на руже.
142 artbear
 
20.08.11
10:28
(139) Упс, счетЗатрат забыл в таблицу добавить :)
(140) (141) не понял :(
(140) Напомни, какой запрос у тебя сейчас самый быстрый по результатам (общий запрос) ?
143 ДенисЧ
 
20.08.11
10:31
(142)
3. (78)
2. Объединяются 4 документа. Из них наружу вытаскиваются только количества. Вытаскивать ещё что-то не нужно. Зачем ещё одно условие и ещё один вложенный запрос? Скульное предложение я показал. В 77 я бы сделал руками ещё индекс и алды. А тут...
144 artbear
 
20.08.11
10:36
(143) Значит, самый тормоз здесь? ты же таблицы по отдельности тестил?

Выбрать док.СерияНоменклатуры Как УникальныйНомерРазмера, 0 Как КоличествоВыпущено, 0 как КоличествоПродано, док.Количество Как КоличествоБрак, 0 Как КоличествоВозврат
   Из Документ.ТребованиеНакладная.Материалы Док
   Внутреннее Соединение ВремСерии
       по (Док.СерияНоменклатуры = ВремСерии.Серия)
       И док.Ссылка.Проведен
       И (док.СчетЗатрат = &СчетБрак)
       И (док.Номенклатура = док.Продукция)

Интересно, как 1С транслирует запрос с Внутренним соединением по одной таблице и неявным левым соединением по другой?
145 ДенисЧ
 
20.08.11
10:38
(144) ага, здесь. Выше приведены тормозные предикаты из плана запроса.
Если исключаю ТрН, то всё летает.
Хотя полторы секунды на заполнение таблицы - не то время, чтобы рвать *опу, но хочется сделать красиво.
146 Jofa
 
20.08.11
10:40
Может стоит сперва документы выбрать поместить их в ВТ а уже потом делать внутринее соеденение.
147 ДенисЧ
 
20.08.11
10:42
(146) какие все? По сериям? Или как?
148 Jofa
 
20.08.11
10:45
Выбрать
док.СерияНоменклатуры Как УникальныйНомерРазмера,
док.Количество Как КоличествоБрак,
0 Как КоличествоВыпущено,
0 как КоличествоПродано,
0 Как КоличествоВозврат
ПОместитю ВТ_Док1
Из Документ.ТребованиеНакладная.Материалы Док
   ГДЕ
       И док.Ссылка.Проведен
       И док.СчетЗатрат = &СчетБрак
       И док.Номенклатура = док.Продукция
149 artbear
 
20.08.11
10:45
Тогда сначала выбери материалы из ТРН по сериям (внутреннее соединение) (там много совпадений?) во внутреннем запросе, а во внешнем уже проверяй условия по продукции, счету и проведению

Выбрать док.СерияНоменклатуры Как УникальныйНомерРазмера, 0 Как КоличествоВыпущено, 0 как КоличествоПродано, док.Количество Как КоличествоБрак, 0 Как КоличествоВозврат
ИЗ (
Выбрать док.СерияНоменклатуры Как УникальныйНомерРазмера, док.Количество, док.Ссылка, док.СчетЗатрат, док.Номенклатура, док.Продукция
   Из Документ.ТребованиеНакладная.Материалы Док
   Внутреннее Соединение ВремСерии
       по (Док.СерияНоменклатуры = ВремСерии.Серия)) КАК Док
ГДЕ
       док.Ссылка.Проведен
       И (док.СчетЗатрат = &СчетБрак)
       И (док.Номенклатура = док.Продукция)
150 artbear
 
20.08.11
10:46
(148) Не прав, автор уже писал, что как раз это запрос и есть самый тормоз :(
151 ДенисЧ
 
20.08.11
10:47
(149) мда...
Попробую в понедрельник...

Но такое через*опие...

И нафига я на это подписался...
152 ДенисЧ
 
20.08.11
10:47
Спасибо за советы :-)
153 Jofa
 
20.08.11
10:47
Хотя Серии можно выгрузить в массив и подставлять в документы как условие :

Выбрать
док.СерияНоменклатуры Как УникальныйНомерРазмера,
док.Количество Как КоличествоБрак,
0 Как КоличествоВыпущено,
0 как КоличествоПродано,
0 Как КоличествоВозврат

ПОместитю ВТ_Док1
Из Документ.ТребованиеНакладная.Материалы Док
   ГДЕ
       И док.Ссылка.Проведен
       И док.СчетЗатрат = &СчетБрак
       И док.Номенклатура = док.Продукция
       И Док.СерияНоменклатуры В (&Серии)
154 Asirius
 
20.08.11
10:47
(0) замени условие

где док.СерияНоменклатуры.Код = ВремТаб.НомерРазмера

на что-то типа

где док.СерияНоменклатуры в СписокСерий
155 ДенисЧ
 
20.08.11
10:48
(149) Про совпадения. Как я уже писал :-), совпадений не много. Не так уж и много брака у нас.
Уже думаю, может, доп признак-реквизит вводить...
156 ДенисЧ
 
20.08.11
10:49
(154) "всю ветку не читал, но скажу мнение"?
Уже сделано.
157 Jofa
 
20.08.11
10:50
Ну как работает??
158 artbear
 
20.08.11
10:50
(156) Проверь трансляцию (144) в скуль, ИМХО будет что-то очень корявое :(
159 artbear
 
20.08.11
10:51
(155) ты же писал, что СчетБрака 75% ? или как раз 25 это брак, все остальное нет?
160 ДенисЧ
 
20.08.11
10:51
Все проверки в понедельник.
Из дома мне не хочется лезть в это *овно... Да и некомфортно это делать по удалёнке...

Продолжим дискуссию через 46 часов...
161 ДенисЧ
 
20.08.11
10:52
(159) 75% - брак не готовой продукции, то есть Номенклатура != продукция.
162 ДенисЧ
 
20.08.11
10:53
хотя... Блин, вспомнил, там же меняться будет всё...

Ой, геморрой на мою голову...

Вообще все условия менять придётся для брака :-(((
163 artbear
 
20.08.11
10:54
(161) А я спрашивал про группировки немного другое -
сколько процентов об общего числа записей в ТРН.Материалы занимается вариант группировку по Счету = СчетБрака?
164 artbear
 
20.08.11
10:55
Если брака мало, значит, самый внутренний запрос делаем по нему, а во внешнем проверяем все остальные условия
165 ДенисЧ
 
20.08.11
10:55
(163) процентов 10, если мне склероз не изменяет. Может, чуть меньше. Надо запросы писать и ОТК спрашивать.
166 artbear
 
20.08.11
10:56
(164) + если брака много, пишем служебку и кого-нибудь наказываем :)
167 ДенисЧ
 
20.08.11
10:56
(164) хм.... А это вариант... Надо будет проверить, как до базы доберусь...
168 ДенисЧ
 
20.08.11
10:56
(166) это и без меня делается :-)
Работяги уже стонут и так от наказаний...
169 artbear
 
20.08.11
10:56
(165) а индекс по счету есть в таблице?
170 ДенисЧ
 
20.08.11
10:58
(169) И опять же :-))))
Есть по всем полям, которые участвуют в запросе
171 artbear
 
20.08.11
10:59
(167) я потому и спрашивал про группировки и количества в (129) и (130)
группируем вариант все отдельно (
1 запрос = проведен (Истина,Ложь)
2 запрос = счет (все варианты)
3 запрос = товар = продукция (Истина, Ложь)
и смотрим, сколько процентов приходится в 1 и 3 на Истину, а в 2 на наш счет брака
172 ДенисЧ
 
20.08.11
11:00
(171) ну, эти цифры известны
1. 98%
2. 25%
3. 10%

И что это даст?
173 artbear
 
20.08.11
11:01
Наверное, лучше такие запросы сделать

Выбрать Количество(Таблица.Ссылка) / ТабОбщая.Количество КАК Процент,
//каждый вариант условия в отдельном запросе
Таблица.СчетЗатрат
Из Документ.ТребованиеНакладная.Материалы КАК Таблица
ГРУППИРОВАТЬ ПО Таблица.СчетЗатрат
ЛЕВОЕ СОЕДИНЕНИЕ
(
Выбрать Количество(Таблица.Ссылка) КАК Количество
Из Документ.ТребованиеНакладная.Материалы КАК Таблица
) КАК ТабОбщая
По Истина
174 ДенисЧ
 
20.08.11
11:02
(173) зачем? Я представляю себе общуюю статистику по базе...
175 artbear
 
20.08.11
11:04
(172) вот отсюда и делаем выбор.
п.1 (проведен) сразу откидываем во внешний запрос, он совсем тормоз и будет тупой поиск
п.2 (счет затрат) очень интересен, всего 25% и простейшее условие - поле = константе, идеал для скуля
п.3 (товар = продукция) - совпадений мало, но здесь нужно уже смотреть, как скуль выполнит это условие.
Итог во внутренний запрос кидаем п.2 или 3, а во внешнем проверяем все остальное.
я склоняюсь все-таки к проверке счета.
176 artbear
 
20.08.11
11:04
(174) Представление часто расходится с точным значением,
лучше проверь лишний раз :)
тем более, это несложно и очень быстро
177 ДенисЧ
 
20.08.11
11:07
(175) я уже согласился с твоими предложениями :-) В понедельник проверю
(176) не, тут не расходится. В последнее время мне много пришлось потрахаться с браками, поэтому я имею представление.
178 artbear
 
20.08.11
11:08
(175) (на всякий случай уточню) + т.е. я больше склоняюсь к варианту
во вложенном запросе идет внутреннее соединение по сериям и проверка на счет затра, а во вложенном - проведен и товар = номенклатура
и это результат объединяем через Объединить все
179 ДенисЧ
 
20.08.11
11:09
(178) угу. Логично. У меня мозги замылились и не видят, казалось бы, очевидных вариантов. Спасибо за советы. Проверим.
180 artbear
 
20.08.11
11:10
Еще напомню: напиши, плиз, как 1С транслирует в скуль твой текущий вариант

Выбрать Док.*
Из Документ.ТребованиеНакладная.Материалы Док
   |Внутреннее Соединение ВремСерии
   |    по (Док.СерияНоменклатуры = ВремСерии.Серия)
   |    И док.Ссылка.Проведен
   |    И (док.СчетЗатрат = &СчетБрак)
   |    И (док.Номенклатура = док.Продукция)

интересно посмотреть на работу 1С по генерации кода скуля для таких случаев :)
181 artbear
 
20.08.11
11:12
(179) Кстати, чем смотришь запрос скуля и планы? консолью с трассировкой (есть на ИС) или еще как?
182 ДенисЧ
 
20.08.11
11:12
(180) Это я смотрел, ничего интересного. 3 юниона.
183 artbear
 
20.08.11
11:14
(182) а подробнее? какие юнионы? по каким условиям? что с чем?
184 ДенисЧ
 
20.08.11
11:16
(183) шапка документа с таблицей, таблица с справочником серий и таблица сама с собой
(181) ентерпрайз-манагером, вылавливая запросы через профайлер.
185 artbear
 
20.08.11
11:17
(184) ИМХО Это долго и уже устарело :(
лучше на ИС возьми консоль с трассировкой (в поиск с таким названием), все будет просто и удобно.
Рекомендую.
186 Jofa
 
20.08.11
11:19
(185) ЧТо можно там позыреть в общем
187 Jofa
 
20.08.11
11:19
+ ИС = ИТС??
188 ДенисЧ
 
20.08.11
11:20
189 artbear
 
20.08.11
11:20
Как раз планы и можно посмотреть! очень удобно :)
+ код, генерируемый 1С.
фактически то же самое, что вручную смотрим в профайлере.
если юзать в рабочей базе, то будут видны все запросы других пользователей.
190 ДенисЧ
 
20.08.11
11:21
191 Jofa
 
20.08.11
11:22
(189) Крута .. Нада по юзать
192 artbear
 
20.08.11
11:22
(188) нет, другая - http://infostart.ru/public/56973/
вот еще интересная статья по индексам, где приводится пример ее использования - http://infostart.ru/public/81694/
193 ДенисЧ
 
20.08.11
11:23
(192) хм... Обязательно проверю...
194 Jofa
 
20.08.11
11:27
Она могет просматривать ВТ ??
195 Axel2009
 
20.08.11
11:58
(0) в общем у меня тока один вариант. заходишь в скуль и рисуешь составной индекс на поля счетзатрат, серия..

скока выполняется запрос
Выбрать КОЛИЧЕСТВО(*)
  Из Документ.ТребованиеНакладная.Материалы Док
  Внутреннее Соединение ВремСерии
       по (Док.СерияНоменклатуры = ВремСерии.Серия)
       И док.Ссылка.Проведен
?
и
Выбрать КОЛИЧЕСТВО(*)
  Из Документ.ТребованиеНакладная.Материалы Док
ГДЕ док.Ссылка.Проведен
       И (док.СчетЗатрат = &СчетБрак)
196 ДенисЧ
 
20.08.11
12:00
(195) допиндексы составлять -пока не вариант. 8ка идёт на стадии разработки и внедрения.
А так - я бы даже не парился...

Проверить на скорость запрос - только в понедельник.
197 ILM
 
гуру
20.08.11
19:34
Думал, сами найдете самое быстрое решение, но вижу скоро пойдете на третью сотню...
Пока даю подсказку: СУММА() - это агрегатная функция!!!
198 ДенисЧ
 
20.08.11
19:36
(197) гениально!!
199 ILM
 
гуру
20.08.11
19:42
Ага - засунь его во внутрь его!!!
Записей будет намно-о-о-го меньше)))
200 ILM
 
гуру
20.08.11
19:48
ВЫБРАТЬ ТЧ;
ВЫБРАТЬ СЕРИЯ, СУММА(), СУММА(), СУММА()
ИЗ
(ВЫБРАТЬ СЕРИЯ, СУММА(), 0, 0
ИЗ ...
СГРУППИРОВАТЬ ПО СЕРИЯ
ОБЪЕДЕНИТЬ ВСЕ
ВЫБРАТЬ СЕРИЯ, 0, СУММА(), 0
ИЗ ...
СГРУППИРОВАТЬ ПО СЕРИЯ
ОБЪЕДЕНИТЬ ВСЕ
ВЫБРАТЬ СЕРИЯ, 0, 0, СУММА()
ИЗ ...
СГРУППИРОВАТЬ ПО СЕРИЯ
КАК
)
СГРУППИРОВАТЬ ПО СЕРИЯ


Гаранитирую прирост 300%
201 ДенисЧ
 
20.08.11
19:50
(200) ты тоже не читал всю тему целиком?
202 ILM
 
гуру
20.08.11
19:54
(201) По диагонали прокрутил, если на что-то не обратил внимание, то ткни пальцем в нужное сообщение.
Счас посомотрел повнимательнее... То что по ADO из оракла тянешь? Так и тяни сразу суммы... Или что-то другое?
203 ДенисЧ
 
20.08.11
19:57
(2020 из оракла тянутся номера серий. Всё остальное - из 1с. И самые тормоза там, где описано выше.

Мне надавали советов, в понедельник испытаю
204 ILM
 
гуру
20.08.11
20:15
Good Luck))
205 Ёпрст
 
22.08.11
08:23
(200) group by одна из самых тормозных операций, если че..
206 artbear
 
22.08.11
10:47
(0) Автор, есть результаты?
(205) +1
207 artbear
 
23.08.11
16:20
(0) Автор, ау!