Имя: Пароль:
1C
1С v8
Оптимизация запроса
0 mrd2006
 
30.12.11
11:26
Посоветуйте способы оптимизации для запроса:
ВЫБРАТЬ
   ВложенныйЗапрос.НомГруппа КАК НомГруппа,
   ВложенныйЗапрос.ПрямыеКосвенные КАК ПрямыеКосвенные,
   ВложенныйЗапрос.СтатьяЗатрат КАК СтатьяЗатрат,
   ВложенныйЗапрос.Счет КАК Счет,
   ВложенныйЗапрос.КорСчет КАК КорСчет,
   ВложенныйЗапрос.Сумма КАК Сумма
ИЗ
   (ВЫБРАТЬ
       ВложенныйЗапрос.НомГруппа КАК НомГруппа,
       ВложенныйЗапрос.ПрямыеКосвенные КАК ПрямыеКосвенные,
       ВложенныйЗапрос.СтатьяЗатрат КАК СтатьяЗатрат,
       ВложенныйЗапрос.Счет КАК Счет,
       ВложенныйЗапрос.КорСчет КАК КорСчет,
       ВложенныйЗапрос.Сумма КАК Сумма
   ИЗ
       (ВЫБРАТЬ
           ХозрасчетныйОбороты.Субконто1 КАК НомГруппа,
           "Косвенные" КАК ПрямыеКосвенные,
           ХозрасчетныйОбороты.КорСубконто1 КАК СтатьяЗатрат,
           ХозрасчетныйОбороты.Счет КАК Счет,
           ХозрасчетныйОбороты.КорСчет КАК КорСчет,
           ХозрасчетныйОбороты.СуммаОборотДт КАК Сумма
       ИЗ
           РегистрБухгалтерии.Хозрасчетный.Обороты(
                   &ДатаНачала,
                   &ДатаОкончания,
                   ,
                   Счет.Код = "20.01",
                   &НомГруппы,
                   Субконто1 В
                       (ВЫБРАТЬ РАЗЛИЧНЫЕ
                           ХозрасчетныйОбороты.Субконто1
                       ИЗ
                           РегистрБухгалтерии.Хозрасчетный.Обороты(&ДатаНачала, &ДатаОкончания, , Счет.Код = "90.02.1", &НомГр, , КорСчет.Код = "20.01", ) КАК ХозрасчетныйОбороты),
                   КорСчет.Код = "25"
                       ИЛИ КорСчет.Код = "26",
                   &СтатьиЗатрат) КАК ХозрасчетныйОбороты) КАК ВложенныйЗапрос
   
   ОБЪЕДИНИТЬ ВСЕ
   
   ВЫБРАТЬ
       ВложенныйЗапрос.НомГруппа,
       ВложенныйЗапрос.ПрямыеКосвенные,
       ВложенныйЗапрос.СтатьяЗатрат,
       ВложенныйЗапрос.Счет,
       ВложенныйЗапрос.КорСчет,
       ВложенныйЗапрос.Сумма
   ИЗ
       (ВЫБРАТЬ
           ХозрасчетныйОбороты.Субконто1 КАК НомГруппа,
           "Прямые" КАК ПрямыеКосвенные,
           ХозрасчетныйОбороты.Субконто2 КАК СтатьяЗатрат,
           ХозрасчетныйОбороты.Счет КАК Счет,
           ХозрасчетныйОбороты.КорСчет КАК КорСчет,
           ХозрасчетныйОбороты.СуммаОборотДт КАК Сумма
       ИЗ
           РегистрБухгалтерии.Хозрасчетный.Обороты(
                   &ДатаНачала,
                   &ДатаОкончания,
                   ,
                   Счет.Код = "20.01",
                   ,
                   Субконто1 В
                       (ВЫБРАТЬ РАЗЛИЧНЫЕ
                           ХозрасчетныйОбороты.Субконто1
                       ИЗ
                           РегистрБухгалтерии.Хозрасчетный.Обороты(&ДатаНачала, &ДатаОкончания, , Счет.Код = "90.02.1", &НомГр, , КорСчет.Код = "20.01", ) КАК ХозрасчетныйОбороты),
                   КорСчет.Код <> "25"
                       И КорСчет.Код <> "26",
                   ) КАК ХозрасчетныйОбороты) КАК ВложенныйЗапрос
   
   ОБЪЕДИНИТЬ ВСЕ
   
   ВЫБРАТЬ
       ВложенныйЗапрос.НомГруппа,
       ВложенныйЗапрос.ПрямыеКосвенные,
       ВложенныйЗапрос.СтатьяЗатрат,
       ВложенныйЗапрос.Счет,
       ВложенныйЗапрос.КорСчет,
       ВложенныйЗапрос.Сумма
   ИЗ
       (ВЫБРАТЬ
           ХозрасчетныйОбороты.Субконто1 КАК НомГруппа,
           "Прямые" КАК ПрямыеКосвенные,
           ХозрасчетныйОбороты.КорСубконто1 КАК СтатьяЗатрат,
           ХозрасчетныйОбороты.Счет КАК Счет,
           ХозрасчетныйОбороты.КорСчет КАК КорСчет,
           ХозрасчетныйОбороты.СуммаОборотДт КАК Сумма
       ИЗ
           РегистрБухгалтерии.Хозрасчетный.Обороты(
                   &ДатаНачала,
                   &ДатаОкончания,
                   ,
                   Счет.Код = "90.02.1",
                   &НомГруппы,
                   (НЕ Субконто1 В
                           (ВЫБРАТЬ РАЗЛИЧНЫЕ
                               ХозрасчетныйОбороты.Субконто1
                           ИЗ
                               РегистрБухгалтерии.Хозрасчетный.Обороты(&ДатаНачала, &ДатаОкончания, , Счет.Код = "90.02.1", &НомГр, , КорСчет.Код = "20.01", ) КАК ХозрасчетныйОбороты)),
                   КорСчет.Код = "20.01",
                   &СтатьиЗатрат) КАК ХозрасчетныйОбороты) КАК ВложенныйЗапрос
   
   ОБЪЕДИНИТЬ ВСЕ
   
   ВЫБРАТЬ
       ВложенныйЗапрос.НомГруппа,
       ВложенныйЗапрос.ПрямыеКосвенные,
       ВложенныйЗапрос.СтатьяЗатрат,
       ВложенныйЗапрос.Счет,
       ВложенныйЗапрос.КорСчет,
       ВложенныйЗапрос.Сумма
   ИЗ
       (ВЫБРАТЬ
           ХозрасчетныйОбороты.Субконто1 КАК НомГруппа,
           "Прямые" КАК ПрямыеКосвенные,
           ВЫБОР
               КОГДА ХозрасчетныйОбороты.КорСчет.Код = "43"
                   ТОГДА &Материалы
               ИНАЧЕ ХозрасчетныйОбороты.КорСубконто1
           КОНЕЦ КАК СтатьяЗатрат,
           ХозрасчетныйОбороты.Счет КАК Счет,
           ХозрасчетныйОбороты.КорСчет КАК КорСчет,
           ХозрасчетныйОбороты.СуммаОборотДт КАК Сумма
       ИЗ
           РегистрБухгалтерии.Хозрасчетный.Обороты(
                   &ДатаНачала,
                   &ДатаОкончания,
                   ,
                   Счет.Код = "90.02.1",
                   &НомГруппы,
                   ,
                   ПОДСТРОКА(КорСчет.Код, 1, 2) = "41"
                       ИЛИ КорСчет.Код = "43",
                   ) КАК ХозрасчетныйОбороты) КАК ВложенныйЗапрос
   
   ОБЪЕДИНИТЬ ВСЕ
   
   ВЫБРАТЬ
       ВложенныйЗапрос.НомГруппа,
       ВложенныйЗапрос.ПрямыеКосвенные,
       ВложенныйЗапрос.СтатьяЗатрат,
       ВложенныйЗапрос.Счет,
       ВложенныйЗапрос.КорСчет,
       ВложенныйЗапрос.Сумма
   ИЗ
       (ВЫБРАТЬ
           ХозрасчетныйОбороты.Субконто1 КАК НомГруппа,
           "Прямые" КАК ПрямыеКосвенные,
           ХозрасчетныйОбороты.КорСубконто1 КАК СтатьяЗатрат,
           ХозрасчетныйОбороты.Счет КАК Счет,
           ХозрасчетныйОбороты.КорСчет КАК КорСчет,
           ХозрасчетныйОбороты.СуммаОборотДт КАК Сумма
       ИЗ
           РегистрБухгалтерии.Хозрасчетный.Обороты(
                   &ДатаНачала,
                   &ДатаОкончания,
                   ,
                   Счет.Код = "90.02.1",
                   &НомГруппы,
                   ,
                   КорСчет.Код = "23"
                       ИЛИ КорСчет.Код = "29",
                   &СтатьиЗатрат) КАК ХозрасчетныйОбороты) КАК ВложенныйЗапрос) КАК ВложенныйЗапрос

УПОРЯДОЧИТЬ ПО
   ПрямыеКосвенные,
   СтатьяЗатрат,
   Счет,
   КорСчет
ИТОГИ
   СУММА(Сумма)
ПО
   ОБЩИЕ,
   НомГруппа,
   ПрямыеКосвенные,
   СтатьяЗатрат,
   Счет,
   КорСчет
АВТОУПОРЯДОЧИВАНИЕ
1 GROOVY
 
30.12.11
11:29
Советую вместо 8ми запросов к таблице оборотов регистра написать 1.
2 GROOVY
 
30.12.11
11:29
Условия по счетам делать не с использованием кода, а по ссылкам.
3 GROOVY
 
30.12.11
11:31
Отбор по субконто делать с использованием временной таблицы.
4 Reaper_1c
 
30.12.11
11:32
Использовать таблицу ОборотыДтКт
5 МихаилМ
 
30.12.11
12:24
(0)

на мс скл этот запрос самозаблокируется.
6 acsent
 
30.12.11
12:26
Счет.Код = "90.02.1" вот так не надо делать
7 rs_trade
 
30.12.11
12:31
(6) да ладна! это же зе бест практикс )))
8 mrd2006
 
30.12.11
12:40
Чего-то не соображу как исхитриться, чтобы отбор по субконто делать с использованием временной таблицы
9 Dmitrii
 
гуру
30.12.11
14:16
Ниже то, что сразу бросается в глаза. Не вникал, но уверен, что в объединении можно обойтись меньшим количеством запросов.

ВЫБРАТЬ РАЗЛИЧНЫЕ
  ХозрасчетныйОбороты.Субконто1 КАК НоменклатурнаяГруппа
ПОМЕСТИТЬ НоменклатурныеГруппы
ИЗ
 РегистрБухгалтерии.Хозрасчетный.Обороты(&ДатаНачала, &ДатаОкончания, , Счет = ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.СебестоимостьПродажНеЕНВД), ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыСубконтоХозрасчетные.НоменклатурныеГруппы), , КорСчет = ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.ОсновноеПроизводство), ) КАК ХозрасчетныйОбороты
ИНДЕКСИРОВАТЬ ПО
  НоменклатурнаяГруппа
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
  ХозрасчетныйОбороты.Субконто1 КАК НомГруппа,
  "Косвенные" КАК ПрямыеКосвенные,
  ХозрасчетныйОбороты.КорСубконто2 КАК СтатьяЗатрат,
  ХозрасчетныйОбороты.Счет КАК Счет,
  ХозрасчетныйОбороты.КорСчет КАК КорСчет,
  ХозрасчетныйОбороты.СуммаОборотДт КАК Сумма
ИЗ
  РегистрБухгалтерии.Хозрасчетный.Обороты(
    &ДатаНачала,
    &ДатаОкончания,
    ,
    Счет = ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.ОсновноеПроизводство),
    ,
    Субконто1 В
     (ВЫБРАТЬ
        НоменклатурныеГруппы.НоменклатурнаяГруппа КАК НоменклатурнаяГруппа
      ИЗ
        НоменклатурныеГруппы КАК НоменклатурныеГруппы),
    КорСчет = ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.ОбщепроизводственныеРасходы)
     ИЛИ КорСчет = ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.ОбщехозяйственныеРасходы),
     ) КАК ХозрасчетныйОбороты

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

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

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

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

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

ВЫБРАТЬ
  ХозрасчетныйОбороты.Субконто1,
  "Прямые",
  ВЫБОР
    КОГДА ХозрасчетныйОбороты.КорСчет = ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.ГотоваяПродукция)
    ТОГДА &Материалы
    ИНАЧЕ ХозрасчетныйОбороты.КорСубконто1
  КОНЕЦ,
  ХозрасчетныйОбороты.Счет,
  ХозрасчетныйОбороты.КорСчет,
  ХозрасчетныйОбороты.СуммаОборотДт
ИЗ
  РегистрБухгалтерии.Хозрасчетный.Обороты(&ДатаНачала, &ДатаОкончания,
     ,
     Счет = ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.СебестоимостьПродажНеЕНВД),
     ,
     ,
     КорСчет В ИЕРАРХИИ (ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.Товары))
       ИЛИ КорСчет = ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.ГотоваяПродукция),
     ) КАК ХозрасчетныйОбороты

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

ВЫБРАТЬ
  ХозрасчетныйОбороты.Субконто1,
  "Прямые",
  ХозрасчетныйОбороты.КорСубконто1,
  ХозрасчетныйОбороты.Счет,
  ХозрасчетныйОбороты.КорСчет,
  ХозрасчетныйОбороты.СуммаОборотДт
ИЗ
  РегистрБухгалтерии.Хозрасчетный.Обороты(&ДатаНачала, &ДатаОкончания,
     ,
     Счет = ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.СебестоимостьПродажНеЕНВД),
     ,
     ,
     КорСчет = ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.ВспомогательныеПроизводства)
       ИЛИ КорСчет = ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.ОбслуживающиеПроизводства),
     &СтатьиЗатрат) КАК ХозрасчетныйОбороты

УПОРЯДОЧИТЬ ПО
  ПрямыеКосвенные,
  СтатьяЗатрат,
  Счет,
  КорСчет
ИТОГИ
  СУММА(Сумма)
ПО
  ОБЩИЕ,
  НомГруппа,
  ПрямыеКосвенные,
  СтатьяЗатрат,
  Счет,
  КорСчет
10 kabanoff
 
30.12.11
17:01
Из того, что не сказали:
1. В полях составных типов по возможности использовать конструкцию ВЫРАЗИТЬ().
2. Не использовать сложные запросы в параметрах виртуальной таблицы: выше вероятность того, что СУБД построит неоптимальный запрос к БД.
3. Одинаковые запросы запихнуть во временную таблицу.
11 Nutsiiam
 
30.12.11
17:06
(0) мужик, ты просто взгляни хотя бы на один живой запрос из БП 2.0. Зачем ты городишь миллиард запросов по объединить, если можно использовать ОДИН с условием по выбираемым счетам? Твои условия по корсчетам можно легко запихнуть в Выбор. То что ты сгородил - это пестец.
12 kabanoff
 
30.12.11
17:11
(8) Ну как-то так:


ВЫБРАТЬ
  ...
ПОМЕСТИТЬ ВТ_Моя
ИЗ ...
ИНДЕКСИРОВАТЬ ПО ...
;


А вообще вот этот кусок запроса - бред какой-то, взаимоисключающие параграфы:

РегистрБухгалтерии.Хозрасчетный.Обороты(
                   &ДатаНачала,
                   &ДатаОкончания,
                   ,
                   Счет.Код = "90.02.1",
                   &НомГруппы,
                   (НЕ Субконто1 В
                           (ВЫБРАТЬ РАЗЛИЧНЫЕ
                               ХозрасчетныйОбороты.Субконто1
                           ИЗ
                               РегистрБухгалтерии.Хозрасчетный.Обороты(&ДатаНачала, &ДатаОкончания, , Счет.Код = "90.02.1", &НомГр, , КорСчет.Код = "20.01", ) КАК ХозрасчетныйОбороты)),
                   КорСчет.Код = "20.01",
                   &СтатьиЗатрат) КАК ХозрасчетныйОбороты
13 Nutsiiam
 
30.12.11
17:13
Объясните, в чем смысл конструкции:

Выбрать * Из (Выбрать * из Что-то) ВложенныйЗапрос

Зачем оборачивать во вложенный запрос выборку, если дальнейшие действия с ней вообще никакие не предполагаются - тут тебе ни где, ни агрегатных функций - вообще ничего. Ну просто поверх обернул...ЗАЧЕМ?
14 Рыцарь
 
30.12.11
17:20
(13) Чтобы было наверно :)
15 Neco
 
30.12.11
17:40
(4) вирт.таблица ОборотыДтКт тормознутая, лучше ей не пользоваться.
16 rs_trade
 
30.12.11
17:41
(13) именно данная конструкция без условий конечно смысла не имеет. но и хуже от нее не станет. возможно раньше условие стояло, потом убрали.
17 Nutsiiam
 
30.12.11
18:24
я делаю вывод такой, поправьте меня, если я не прав:
1. человек пришел из 7.7
2. человек в глаза не видел типовую БП
3. человек очень плохо представляет, как работать с вирт.таблице оборотов регистра бухгалтерии.

И правильный ответ на вопрос в (0) видимо будет: мужик, ничего личного - но нужно чутка поучиться. Твои мега-портянки никто не будет оптимизировать за ТЕБЯ. В этой ветке тебе практически все сказали. Запиши все эти пункты и устрани их. И будет тебе прямая оптимизация.
18 zak555
 
30.12.11
18:26
(17)

какая разница на чём писать ?
Компьютеры — прекрасное средство для решения проблем, которых до их появления не было.