Имя: Пароль:
1C
1С v8
Оптимизация запроса по табчастям реализации
0 Roman Igorevich
 
18.04.13
11:08
ВЫБРАТЬ
   РеализацияТоваровУслугУслуги.Номенклатура КАК Номенклатура,
   СУММА(РеализацияТоваровУслугУслуги.Сумма) КАК Сумма,
   СУММА(РеализацияТоваровУслугУслуги.СуммаНДС) КАК СуммаНДС,
   РеализацияТоваровУслугУслуги.Ссылка КАК Документ
ИЗ
   Документ.РеализацияТоваровУслуг.Услуги КАК РеализацияТоваровУслугУслуги
ГДЕ
   РеализацияТоваровУслугУслуги.Ссылка.Дата МЕЖДУ &ДатаНачала И &ДатаКонца
   И РеализацияТоваровУслугУслуги.Ссылка.Проведен = ИСТИНА
   И ВЫБОР
           КОГДА &Номенклатура ЕСТЬ NULL
               ТОГДА ИСТИНА
           ИНАЧЕ РеализацияТоваровУслугУслуги.Номенклатура = &Номенклатура
       КОНЕЦ
   И ВЫБОР
           КОГДА &НоменклатурнаяГруппа ЕСТЬ NULL
               ТОГДА ИСТИНА
           ИНАЧЕ РеализацияТоваровУслугУслуги.Номенклатура.НоменклатурнаяГруппа = &НоменклатурнаяГруппа
       КОНЕЦ

СГРУППИРОВАТЬ ПО
   РеализацияТоваровУслугУслуги.Номенклатура,
   РеализацияТоваровУслугУслуги.Ссылка

Как ускорить/оптимизировать запрос?
По сотням документов работает пол минуты...
1 ДенисЧ
 
18.04.13
11:09
индексацию по полям поставь...
2 Лефмихалыч
 
18.04.13
11:10
(0)
1. удалить его нахрен
2. Написать правильно
3. PROFIT!
3 sapphire
 
18.04.13
11:11
(0)
И РеализацияТоваровУслугУслуги.Ссылка.Проведен = ИСТИНА
   И ВЫБОР
           КОГДА &Номенклатура ЕСТЬ NULL
               ТОГДА ИСТИНА
           ИНАЧЕ РеализацияТоваровУслугУслуги.Номенклатура = &Номенклатура
       КОНЕЦ
   И ВЫБОР
           КОГДА &НоменклатурнаяГруппа ЕСТЬ NULL
               ТОГДА ИСТИНА
           ИНАЧЕ РеализацияТоваровУслугУслуги.Номенклатура.НоменклатурнаяГруппа = &НоменклатурнаяГруппа
       КОНЕЦ

Бред
4 sapphire
 
18.04.13
11:11
(2) Согласен
5 Roman Igorevich
 
18.04.13
11:12
Результат - документы, сгруппированные по номенклатуре.

(1) Если без изменений конфигурации?
6 sapphire
 
18.04.13
11:12
(1) Что даст индекс по полю "Проведен"?
Даже если оный включить насильно в кластерный ндекс селективность по этому полю будет плохая.
7 sapphire
 
18.04.13
11:13
(5) Научись писать запросы правильно.
8 ДенисЧ
 
18.04.13
11:13
(6) А причём тут Проведен? У него много других условий.
9 Лефмихалыч
 
18.04.13
11:13
вот такого в табличной части быть не может
КОГДА &Номенклатура ЕСТЬ NULL
               ТОГДА ИСТИНА
  И ВЫБОР
           КОГДА &НоменклатурнаяГруппа ЕСТЬ NULL
10 Maxus43
 
18.04.13
11:13
>>Результат - документы, сгруппированные по номенклатуре.

в одном документе всё равно только одна строка с конкретной номенклатурой, зачем группировать вобще?
11 Roman Igorevich
 
18.04.13
11:16
(3) (9)
Это проверка установки отбора, параметры устанавливаются перед компоновкой результата СКД. Как иначе?

(10)
У нас в одном документе может быть несколько строк разных услуг.
12 sapphire
 
18.04.13
11:16
(8) Ага, куча неявных и ненужных join-ов
13 sapphire
 
18.04.13
11:17
(11) Ты не знаешь как СКД работает с отборами?
14 Maxus43
 
18.04.13
11:17
(11) разных, а не одинаковых
15 Roman Igorevich
 
18.04.13
11:19
(13)
Пользователь устанавливает отбор либо но номенклатуре, либо по номенклатурной группе (либо то, либо то). Я реализовал так. Как лучше?

   Параметр = КомпоновщикНастроекДанных.Настройки.ПараметрыДанных.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("Номенклатура"));
   Если ЗначениеЗаполнено(Отчет.Номенклатура) И ТипЗнч(Отчет.Номенклатура) = Тип("СправочникСсылка.Номенклатура") Тогда
       Параметр.Значение = Отчет.Номенклатура;
   Иначе
       Параметр.Значение = NULL;
   КонецЕсли;
   Параметр.Использование = Истина;
   
   Параметр = КомпоновщикНастроекДанных.Настройки.ПараметрыДанных.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("НоменклатурнаяГруппа"));
   Если ЗначениеЗаполнено(Отчет.Номенклатура) И ТипЗнч(Отчет.Номенклатура) = Тип("СправочникСсылка.НоменклатурныеГруппы") Тогда
       Параметр.Значение = Отчет.Номенклатура;
   Иначе
       Параметр.Значение = NULL;
   КонецЕсли;
   Параметр.Использование = Истина;
16 Roman Igorevich
 
18.04.13
11:21
(14) Не понял
17 Maxus43
 
18.04.13
11:23
(16) группировать не надо, вот и всё
18 Roman Igorevich
 
18.04.13
11:25
(17) Ошибка получения информации набора данных
по причине:
Ошибка в запросе набора данных
по причине:
{(2, 2)}: Поле не входит в группу "РеализацияТоваровУслугУслуги.Номенклатура"
<<?>>РеализацияТоваровУслугУслуги.Номенклатура КАК Номенклатура,
19 GANR
 
18.04.13
11:26
Вот из-за этого
ГДЕ
...
ВЫБОР
           КОГДА &Номенклатура ЕСТЬ NULL
               ТОГДА ИСТИНА
           ИНАЧЕ РеализацияТоваровУслугУслуги.Номенклатура = &Номенклатура
       КОНЕЦ
   И ВЫБОР
           КОГДА &НоменклатурнаяГруппа ЕСТЬ NULL
               ТОГДА ИСТИНА
           ИНАЧЕ РеализацияТоваровУслугУслуги.Номенклатура.НоменклатурнаяГруппа = &НоменклатурнаяГруппа
       КОНЕЦ

индексы идут лесом!
20 Maxus43
 
18.04.13
11:26
(18) на закладке группировка надо всё вычистить
21 Maxus43
 
18.04.13
11:27
вобще конечно это не очень сильно влияет, надо переделывать Выбор когда...
22 Roman Igorevich
 
18.04.13
11:28
ВЫБРАТЬ
   РеализацияТоваровУслугУслуги.Номенклатура КАК Номенклатура,
   СУММА(РеализацияТоваровУслугУслуги.Сумма) КАК Сумма,
   СУММА(РеализацияТоваровУслугУслуги.СуммаНДС) КАК СуммаНДС,
   РеализацияТоваровУслугУслуги.Ссылка КАК Документ
ИЗ
   Документ.РеализацияТоваровУслуг.Услуги КАК РеализацияТоваровУслугУслуги
ГДЕ
   РеализацияТоваровУслугУслуги.Ссылка.Дата МЕЖДУ &ДатаНачала И &ДатаКонца
   И РеализацияТоваровУслугУслуги.Ссылка.Проведен = ИСТИНА

СГРУППИРОВАТЬ ПО
   РеализацияТоваровУслугУслуги.Номенклатура,
   РеализацияТоваровУслугУслуги.Ссылка

Удалить вообще условия, на которые все так ругаются на форуме. Не увидел ни капли ускорения формирования.
23 Roman Igorevich
 
18.04.13
11:29
(20) Я когда удаляю с закладки - она снова эти строки вставляет. Когда удаляю вручную - возникает ошибка.
24 palpetrovich
 
18.04.13
11:30
(15) открой для себя "В ИЕРАРХИИ (&Номенклатура)"
25 Maxus43
 
18.04.13
11:30
(23) СУММА( - тоже надо удалять.
(22) да потому что тяни из регистра оборотного вобще, а не из документов
26 Лефмихалыч
 
18.04.13
11:31
(22)  сколько документов и строк в ТЧ?
27 Roman Igorevich
 
18.04.13
11:32
(25) Точно! Заметил уже! А насчет регистра - если так дело пойдет, так и сделаю. Переделываю отчет из 2.0 чужой, там было по документам, решил не разбираться зачем такое условие сделали - хотел повторить.
28 GANR
 
18.04.13
11:36
(22) А если попробовать это

ВЫБРАТЬ
   РеализацияТоваровУслуг.Ссылка
ПОМЕСТИТЬ НужныеДокументы
ИЗ
   Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
ГДЕ
   РеализацияТоваровУслуг.Проведен
   И РеализацияТоваровУслуг.Дата МЕЖДУ &ДатаНачала И &ДатаКонца
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
   РеализацияТоваровУслугУслуги.Ссылка КАК Документ,
   РеализацияТоваровУслугУслуги.Номенклатура КАК Номенклатура,
   СУММА(РеализацияТоваровУслугУслуги.Сумма) КАК Сумма,
   СУММА(РеализацияТоваровУслугУслуги.СуммаНДС) КАК СуммаНДС
ИЗ
   Документ.РеализацияТоваровУслуг.Услуги КАК РеализацияТоваровУслугУслуги
ГДЕ
   РеализацияТоваровУслугУслуги.Ссылка В
           (ВЫБРАТЬ
               а.Ссылка
           ИЗ
               НужныеДокументы КАК а)
   И РеализацияТоваровУслугУслуги.Номенклатура = &Номенклатура
   И РеализацияТоваровУслугУслуги.Номенклатура.НоменклатурнаяГруппа = &НоменклатурнаяГруппа

СГРУППИРОВАТЬ ПО
   РеализацияТоваровУслугУслуги.Номенклатура,
   РеализацияТоваровУслугУслуги.Ссылка
29 Maxus43
 
18.04.13
11:38
(28) если доков много - проиндексировать можно ещё, я обычно соединение юзаю, вложенные запросы могут дать неправильный план. Тут замерять надо
30 GANR
 
18.04.13
11:42
А если вот так?

ВЫБРАТЬ
   РеализацияТоваровУслуг.Ссылка КАК Ссылка
ПОМЕСТИТЬ НужныеДокументы
ИЗ
   Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
ГДЕ
   РеализацияТоваровУслуг.Проведен
   И РеализацияТоваровУслуг.Дата МЕЖДУ &ДатаНачала И &ДатаКонца

ИНДЕКСИРОВАТЬ ПО
   Ссылка
;

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

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
   РеализацияТоваровУслугУслуги.Ссылка КАК Документ,
   РеализацияТоваровУслугУслуги.Номенклатура КАК Номенклатура,
   СУММА(РеализацияТоваровУслугУслуги.Сумма) КАК Сумма,
   СУММА(РеализацияТоваровУслугУслуги.СуммаНДС) КАК СуммаНДС
ИЗ
   Документ.РеализацияТоваровУслуг.Услуги КАК РеализацияТоваровУслугУслуги
ГДЕ
   РеализацияТоваровУслугУслуги.Номенклатура В
           (ВЫБРАТЬ
               а.Ссылка
           ИЗ
               НоменклатураПоГруппе КАК а)
   И РеализацияТоваровУслугУслуги.Ссылка В
           (ВЫБРАТЬ
               а.Ссылка
           ИЗ
               НужныеДокументы КАК а)

СГРУППИРОВАТЬ ПО
   РеализацияТоваровУслугУслуги.Номенклатура,
   РеализацияТоваровУслугУслуги.Ссылка
31 Рыжий Лис
 
18.04.13
11:43
(0) Переписать запрос на получение данных из регистра продажи.
32 Roman Igorevich
 
18.04.13
11:47
(26) Итого без отбора за пол минуты формирует около ~2500 документов сгруппированных по ~30 номенклатурам/ном.группам. В каждом доке от 1 до 3 услуг.
33 Roman Igorevich
 
18.04.13
11:48
(31)
В регистре Реализация нет номенклатуры, только ном.группа.
В регистре НДС Продажи нет инфы по номенклатуре.
34 GANR
 
18.04.13
11:50
(33) запросы из (28)(30) дают что-нибудь????
35 Roman Igorevich
 
18.04.13
11:52
Сейчас тестирую
36 Roman Igorevich
 
18.04.13
11:59
(34)
Запрос из (28) офигенно работает! Это то что нужно, спасибо большое! Подправил только условия номенклатуры и ном.группы под те, на которые все ругаются (ВЫБОР, Есть Null и т.д.) - т.к. пользователю в основном нужно без отбора формировать. 2500 документов обработаны за 5 секунд!
37 Roman Igorevich
 
18.04.13
12:04
(34) Готов символически отблагодарить, написал на e-mail
38 GANR
 
18.04.13
12:09
(37) Хотел написать: если (30) не поможет - разбей пакет запросов на разные запросы и замерь время каждого из подзапросов - задача будет локализована. Примерно так: http://ximage.ru/data/imgs/1366272523.jpg.
Оптимист верит, что мы живем в лучшем из миров. Пессимист боится, что так оно и есть.