Имя: Пароль:
1C
1С v8
Выполнение запроса в клиент серверном варианте в сотни раз длительнее файлового
0 Joshim
 
08.04.14
10:30
Один и тот же запрос выполняемый в файловом варианте меньше чем за 1 минуту - в клиент серверном варианте выполняется больше трех часов.

Запрос вызывается при проведении документа Расчет себестоимости. Запрос типовой.
Обслуживание базы данных средствами SQL выполняется ежедневно - перестроение индекса, обновление статистики.
1 Joshim
 
08.04.14
10:31
Прошу помочь найти причину
2 Joshim
 
08.04.14
10:32
УПП 1.3 для Украины
MS SQL 2012
1С:Предприятие 8.2 (8.2.19.83)
3 Красный рассвет
 
08.04.14
10:33
(1) Я вряд ли помогу, но точно ли именно запрос?
Отладчик в каких местах показывает такое дикое время?
4 Joshim
 
08.04.14
10:33
(3) РезультатЗапроса = Запрос.Выполнить();
5 Красный рассвет
 
08.04.14
10:34
И в копии тоже?
6 Joshim
 
08.04.14
10:37
(5) да
7 alexei366
 
08.04.14
11:01
А нас самом скуле статистику не смотрел?
8 Joshim
 
08.04.14
11:05
(7) сформировал встроенный отчет "Физическая статистика индекса"- изучаю, есть некоторые рекомендации по перестроению индекса. Попробую отпишусь. Что еще посмотреть?
9 х86
 
08.04.14
11:08
давай текст запроса
10 Joshim
 
08.04.14
11:11
(9)
Текст запроса (в отладчике):
ВЫБРАТЬ
    РегЗатраты.Затрата,
    РегЗатраты.ХарактеристикаЗатраты,
    РегЗатраты.СерияЗатраты,
    РегЗатраты.Подразделение,
    РегЗатраты.НоменклатурнаяГруппа,
    РегЗатраты.СтатьяЗатрат,
    РегЗатраты.Продукция,
    РегЗатраты.ХарактеристикаПродукции,
    РегЗатраты.СерияПродукции,
    РегЗатраты.Спецификация,
    РегЗатраты.Заказ,
     РегЗатраты.СчетУчета,
     РегЗатраты.НалоговоеНазначение,

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

    ЛЕВОЕ СОЕДИНЕНИЕ (
        ВЫБРАТЬ
            РегВыпуск.Подразделение,
            РегВыпуск.Продукция,
            РегВыпуск.ХарактеристикаПродукции,
            РегВыпуск.СерияПродукции,
            РегВыпуск.Спецификация,
            РегВыпуск.НоменклатурнаяГруппа,
            РегВыпуск.Заказ,
             РегВыпуск.СчетУчетаНЗП,
              РегВыпуск.НалоговоеНазначение,
            СУММА(РегВыпуск.Количество) КАК КоличествоВыпуск
        ИЗ
            РегистрНакопления.ВыпускПродукцииБухгалтерскийУчет КАК РегВыпуск
        ГДЕ
            РегВыпуск.Период МЕЖДУ &НачДата И &КонДата
            И РегВыпуск.КодОперации <> &КодФиксСтоим
             И РегВыпуск.Организация = &Организация

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

        ) КАК РегВыпуск
    ПО
        РегВыпуск.Подразделение = РегЗатраты.Подразделение
         И РегВыпуск.НоменклатурнаяГруппа = РегЗатраты.НоменклатурнаяГруппа
         И РегВыпуск.Продукция = РегЗатраты.Продукция
         И РегВыпуск.ХарактеристикаПродукции = РегЗатраты.ХарактеристикаПродукции
         И РегВыпуск.СерияПродукции = РегЗатраты.СерияПродукции
         И РегВыпуск.Спецификация = РегЗатраты.Спецификация
        И РегВыпуск.Заказ = РегЗатраты.Заказ
          И РегВыпуск.СчетУчетаНЗП = РегЗатраты.СчетУчета
  И ((РегВыпуск.НалоговоеНазначение = РегЗатраты.НалоговоеНазначение) ИЛИ
  (РегЗатраты.СтатьяЗатрат.СтатусМатериальныхЗатрат = ЗНАЧЕНИЕ

(Перечисление.СтатусыМатериальныхЗатратНаПроизводство.ПринятыеВПереработку)
  И РегЗатраты.НалоговоеНазначение = ЗНАЧЕНИЕ(Справочник.НалоговыеНазначенияАктивовИЗатрат.ПустаяСсылка)))


ГДЕ
    РегЗатраты.Период МЕЖДУ &НачДата И &КонДата
    И РегЗатраты.Активность
    И РегЗатраты.КодОперации В (&КодыОпераций)
    И (РегВыпуск.КоличествоВыпуск = 0 ИЛИ РегВыпуск.КоличествоВыпуск Есть NULL)
    И (РегЗатраты.Количество <> 0 ИЛИ РегЗатраты.Сумма <> 0
     ИЛИ РегЗатраты.СуммаНУ <> 0
     ИЛИ РегЗатраты.НДСВходящий <> 0
     ИЛИ РегЗатраты.НДСКредит <> 0
   )
     И РегЗатраты.Организация = &Организация

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

УПОРЯДОЧИТЬ ПО
    РегЗатраты.Затрата,
    РегЗатраты.ХарактеристикаЗатраты,
    РегЗатраты.СерияЗатраты,
    РегЗатраты.Подразделение,
    РегЗатраты.Продукция,
    РегЗатраты.ХарактеристикаПродукции,
    РегЗатраты.СерияПродукции,
    РегЗатраты.Спецификация,
    РегЗатраты.ДокументВыпуска,
    РегЗатраты.СтатьяЗатрат,
    РегЗатраты.НоменклатурнаяГруппа,
     РегЗатраты.СчетУчета,
     РегЗатраты.НалоговоеНазначение,
    РегЗатраты.Заказ
11 Heckfy
 
08.04.14
11:11
Очистка процедурного кэша-перестроение индексов-обновление статистики делал? Какая модель базы? Шринк и все такое....
12 Heckfy
 
08.04.14
11:11
Скуль по памяти как настроен?
13 Joshim
 
08.04.14
11:13
+(10) запрос типовой, пробовал переделать на временные таблицы - ждал более часа, запрос не выполнился.
14 Chai Nic
 
08.04.14
11:14
Отлавливай запрос в том виде, как его исполняет sql, и смотри план запроса. Скорее всего, там что-то вроде nested loop при соединении с большой неселективной выборкой..
15 Chai Nic
 
08.04.14
11:14
Временные таблицы могут здорово ускорить, но надо не забывать индексировать поля связей.
16 Joshim
 
08.04.14
11:16
(11) шринк и Очистка процедурного кэша не делается, остальное по расписанию ежедневно
17 Joshim
 
08.04.14
11:17
(15) попробую с индексом, отпишусь
18 jsmith82
 
08.04.14
11:17
сколько памяти сжирает при этом?
индекс тут по ходу не причём
19 Смешарик
 
08.04.14
11:18
(0) Запусти по сети запрос в файловом варианте
20 vi0
 
08.04.14
11:19
странный запрос не использующий виртуальные таблицы
при этом у одного регистра фильтруются записи по Активности, у второго нет
21 DexterMorgan
 
08.04.14
11:20
с сетью чета
22 vi0
 
08.04.14
11:22
и вот такие условия по неиндексированным полям гарантируют полный скан таблицы (я так понимаю ресурсы неиндексированы)

   ИЛИ РегЗатраты.СуммаНУ <> 0
     ИЛИ РегЗатраты.НДСВходящий <> 0
     ИЛИ РегЗатраты.НДСКредит <> 0
23 х86
 
08.04.14
11:22
(0)запрос чуть поправить нужно,
вложенный запрос из левого соединения во времянку нужно
24 DexterMorgan
 
08.04.14
11:23
(22) ресурсы неиндексированы

чиво, чиво ???
25 jsmith82
 
08.04.14
11:23
(15)(23)(13)
26 vi0
 
08.04.14
11:28
(24) что конкретно смущает?
27 alexei366
 
08.04.14
11:28
Скулю может оперативы не хватает, как ктото выше писал,
Помню у меня с этим проблема была, правда разница не с минуты в 3 часа, а с 0.2 сек до 1.5 сек)
28 alexei366
 
08.04.14
11:29
(27) В итоге добавили оперативы (и физически и в скуле) и стало < 0.1
29 Зойч
 
08.04.14
11:31
план запроса пробовал строить?
30 Joshim
 
08.04.14
11:34
(27) оперативы хватает, 40 гб скулю
31 Joshim
 
08.04.14
11:34
(29) нет, как это?
32 vi0
 
08.04.14
12:14
(31) в профайлере во время выполнения запроса
нужно отловить событие Perfomance/Showplan statictic profile
и Perfomance/Showplan text (который ты можешь показать здесь)
33 Joshim
 
08.04.14
14:02
(32) трассировку с указанными событиями запустил, как отловить нужные? их там очень много
34 Joshim
 
08.04.14
14:03
(25) создание временной таблицы с индексированием полей связи результата ощутимого не принесли, запрос по прежнему выполняется в часах
35 vi0
 
08.04.14
14:18
(33) способы разные есть
один из - понять какой у тебя SPID и либо заранее накладывать фильтр на SPID либо потом просматривать

один из простых способов получить SPID
выполнить в консоли что то типа
ВЫБРАТЬ    11222333
найти строку 11222333 и посмотреть какой там SPID
36 Maxus43
 
08.04.14
14:32
(35) я по имени базы обычно фильтрую, ибо такой садомией занимаюсь на тестовых базах, там окромя меня никого нет)
37 vi0
 
08.04.14
14:34
(35) +
только это можно увидеть в событиях RPC:Completed или SQL:BAtchCompleted
38 vi0
 
08.04.14
14:34
(36) ну я грю, что способы зависят от ситуации
39 Joshim
 
09.04.14
16:09
Переделал все типовые тормозящие запросы на запросы с временными таблицами с индексированием всех полей временных таблиц, проблема производительности запросов в СУБД MS SQL исчезла. Насколько я понял, проблема была в том, что оптимизатор запроса SQL не может корректно составить план выполнения запроса в котором используются соединения с подзапросами. Использование в запросах временных таблицы с индексированием полей решают эту проблему
40 AlexTim03
 
09.04.14
16:31
(39)
Именно про это недавно на курсах говорили: скуль не может оценить объем данных вложенного запроса и строит неверный план запроса. С временной таблицей скулю проще.
41 Chai Nic
 
09.04.14
16:42
(40) По идее, здесь должна платформа 1с подключаться. Ввели бы опцию на уровне сервера 1с "по возможности подавлять nested loop", чтобы сервер 1с выдавал нужные хинты при формировании запросов к sql-серверу..
42 Chai Nic
 
09.04.14
16:43
(41) Ну или эвристику придумать какую-нибудь..
43 alexhtn
 
09.04.14
20:02
(0) Можно попробовать сделать дополнительные индексы средствами sql сервера
1. В SQL server management studio открываешь activity monitor
2. Разворачиваешь recent expensive queries
3. Сортируешь по полю average duration
4. На самом длительном запросе нажимаешь правой кнопкой и выбираешь show execution plan
5. Ищешь действия у которых большая стоимость (cost)
6. Нажимаешь на них правой кнопкой и там обычно есть "missing index detail" (если нет - то уже есть необходимый индекс) и у тебя появляется текст запроса для создания индекса, который облегчит выполнение этого запроса.
44 jsmith82
 
09.04.14
20:05
просто у разрабов платформы И у разрабов конфиг непонятки друг с другом
45 jsmith82
 
09.04.14
20:07
видимо, там дело не в индексах было, а в левом соединении
походу он как-то в трансляции жахнул не на левое а на В (Таблица)
46 jsmith82
 
09.04.14
20:08
индексы в целом не так страшно, как кривая трансляция
47 Gepard
 
09.04.14
20:08
КодКонвертации,  Организация - есть индексы?
48 Joshim
 
16.04.14
14:46
(43) при нажатии show execution plan SQL management studio сначала "задумывается секунд на 10", затем завершается ошибкой. Наверное очень огромный план
49 Зойч
 
16.04.14
14:53
для сбора плана проще всего воспользоваться
http://www.gilev.ru/querytj/
50 krbIso
 
16.04.14
14:59
было бы интересно как этот запрос  обработал оптимизатор в 2014
http://www.brentozar.com/archive/2014/04/sql-2014-cardinality-estimator-eats-bad-tsql-breakfast/
51 Леша1с
 
16.04.14
15:00
(0)" Расчет себестоимости. Запрос типовой."
что-то не припомню расчет себестоимости "за минуту".
Сколкьо документов? Какой период? Точно уверены, что в файловом себестоимость рассчитывает, а не иммитирует загрузку процессора?
Проблемы невозможно решaть нa том же уровне компетентности, нa котором они возникaют. Альберт Эйнштейн