Имя: Пароль:
1C
1С v8
Тормозит обработка ПодборНоменклатуры УПП 1.2 + SQL Server 2008 R2
, ,
0 Grobik
 
18.01.17
16:04
Доброго дня. Нужна помощь.
Имеется УПП 1.2 2007 года. Переписанная. Работает на sql server 2008 r2 developer/enterprise x64. 16 ядер / 32 потока, 192 Гбайт рама. Проц не грузит, память всю не ест.
Тормозит обработка ПодборНоменклатуры для самописного документа, самописной подсистемы. Текст запроса:

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

ИНДЕКСИРОВАТЬ ПО
    Номенклатура
;

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

СГРУППИРОВАТЬ ПО
    ЕдиницыИзмерения.Владелец

ИНДЕКСИРОВАТЬ ПО
    Номенклатура
;

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

ИНДЕКСИРОВАТЬ ПО
    Номенклатура
;

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

ИНДЕКСИРОВАТЬ ПО
    Номенклатура
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ЦеныНоменклатурыСрезПоследних.Номенклатура КАК Номенклатура,
    ЦеныНоменклатурыСрезПоследних.Цена
ПОМЕСТИТЬ втЦены
ИЗ
    РегистрСведений.ЦеныНоменклатуры.СрезПоследних(
            &Дата,
            ТипЦен = &ТипЦен
                И Номенклатура В
                    (ВЫБРАТЬ
                        втНоменклатура.Номенклатура
                    ИЗ
                        втНоменклатура КАК втНоменклатура)) КАК ЦеныНоменклатурыСрезПоследних

ИНДЕКСИРОВАТЬ ПО
    Номенклатура
;

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

ИНДЕКСИРОВАТЬ ПО
    Номенклатура
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ПродажиОбороты.Номенклатура КАК Номенклатура,
    ВЫБОР
        КОГДА ПродажиОбороты.КоличествоОборот > 0
            ТОГДА ИСТИНА
        ИНАЧЕ ЛОЖЬ
    КОНЕЦ КАК флЕстьПродажа
ПОМЕСТИТЬ втПродажи
ИЗ
    РегистрНакопления.Продажи.Обороты(
            &ДатаНачалаПродажи,
            &Дата,
            ,
            Контрагент = &Контрагент
                И Номенклатура В
                    (ВЫБРАТЬ
                        втНоменклатура.Номенклатура
                    ИЗ
                        втНоменклатура КАК втНоменклатура)) КАК ПродажиОбороты

ИНДЕКСИРОВАТЬ ПО
    Номенклатура
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    втНоменклатура.Номенклатура.Код КАК Код,
    втНоменклатура.Номенклатура.Артикул КАК Артикул,
    втНоменклатура.Номенклатура.ЭтоГруппа КАК ЭтоГруппа,
    втНоменклатура.Номенклатура.ПометкаУдаления КАК ПометкаУдаления,
    втНоменклатура.Номенклатура.Набор КАК Набор,
    втНоменклатура.Номенклатура.Услуга КАК Услуга,
    втНоменклатура.Номенклатура,
    втНоменклатура.Номенклатура.Бренд КАК Бренд,
    втНоменклатура.Номенклатура.Родитель КАК Родитель,
    ЕСТЬNULL(втТоварыНаСкладах.КоличествоОстаток, 0) - ЕСТЬNULL(втТоварыВРезервеНаСкладах.КоличествоРезерв, 0) КАК КоличествоСвободныйОстаток,
    0 КАК КоличествоОстатокОрганизации,
    втЦены.Цена,
    втЦеныОптовые.ЦенаОптовая,
    втНоменклатура.Номенклатура.ЕдиницаХраненияОстатков КАК ЕдиницаИзмерения,
    втУпаковки.ОптоваяУпаковка,
    ЗНАЧЕНИЕ(Справочник.ХарактеристикиНоменклатуры.ПустаяСсылка) КАК ХарактеристикаНоменклатуры,
    ЗНАЧЕНИЕ(Справочник.Качество.Новый) КАК Качество,
    ЛОЖЬ КАК ФлагУсловийПоставки,
    ПРЕДСТАВЛЕНИЕ(втНоменклатура.Номенклатура) КАК ПредставлениеНоменклатура,
    ПРЕДСТАВЛЕНИЕ(втНоменклатура.Номенклатура.ЕдиницаХраненияОстатков) КАК ПредставлениеЕдиницаИзмерения,
    ПРЕДСТАВЛЕНИЕ(ЗНАЧЕНИЕ(Справочник.ХарактеристикиНоменклатуры.ПустаяСсылка)) КАК ПредставлениеХарактеристикаНоменклатуры,
    ПРЕДСТАВЛЕНИЕ(ЗНАЧЕНИЕ(Справочник.Качество.Новый)) КАК ПредставлениеКачество,
    ВЫБОР
        КОГДА втНоменклатура.Номенклатура.ЭтоГруппа
            ТОГДА "Группа"
        ИНАЧЕ ПРЕДСТАВЛЕНИЕ(втНоменклатура.Номенклатура.НоменклатурнаяГруппа)
    КОНЕЦ КАК ПредставлениеНоменклатурнаяГруппа,
    ЛОЖЬ КАК ПереходитьВверх,
    втПродажи.флЕстьПродажа
ИЗ
    втНоменклатура КАК втНоменклатура
        ЛЕВОЕ СОЕДИНЕНИЕ втТоварыНаСкладах КАК втТоварыНаСкладах
        ПО втНоменклатура.Номенклатура = втТоварыНаСкладах.Номенклатура
        ЛЕВОЕ СОЕДИНЕНИЕ втТоварыВРезервеНаСкладах КАК втТоварыВРезервеНаСкладах
        ПО втНоменклатура.Номенклатура = втТоварыВРезервеНаСкладах.Номенклатура
        ЛЕВОЕ СОЕДИНЕНИЕ втЦены КАК втЦены
        ПО втНоменклатура.Номенклатура = втЦены.Номенклатура
        ЛЕВОЕ СОЕДИНЕНИЕ втЦеныОптовые КАК втЦеныОптовые
        ПО втНоменклатура.Номенклатура = втЦеныОптовые.Номенклатура
        ЛЕВОЕ СОЕДИНЕНИЕ втУпаковки КАК втУпаковки
        ПО втНоменклатура.Номенклатура = втУпаковки.Номенклатура
        ЛЕВОЕ СОЕДИНЕНИЕ втПродажи КАК втПродажи
        ПО втНоменклатура.Номенклатура = втПродажи.Номенклатура
ГДЕ
    (ЕСТЬNULL(втТоварыНаСкладах.КоличествоОстаток, 0) - ЕСТЬNULL(втТоварыВРезервеНаСкладах.КоличествоРезерв, 0) > 0
            ИЛИ втНоменклатура.Номенклатура.ПризнакНоменклатуры = ЗНАЧЕНИЕ(Справочник.ПризнакиНоменклатуры.ПодЗаказ)
            ИЛИ втНоменклатура.Номенклатура.Услуга
            ИЛИ втНоменклатура.Номенклатура.ЭтоГруппа
            ИЛИ втНоменклатура.Номенклатура.Набор
            ИЛИ втНоменклатура.Номенклатура.Комплект)

УПОРЯДОЧИТЬ ПО
    ЭтоГруппа УБЫВ,
    втНоменклатура.Номенклатура.Наименование

Проблема вот в чем: При выборе &Родитель — достаточно большая группа товаров. Первый раз выполняется 25 секунд (в копии, в боевой базе от 25 до 90-120 и более, если совсем не повезет). Второй раз и все последующие (даже через час или два) Время- 2.165, Время- 2.146, Время- 2.156.

Или группа поменьше. Первый Время- 25.905. Дальше Время- 1.546, Время- 1.538 и т.д. Маленькая группа Время- 11.067, Время- 0.873, Время- 0.877, Время- 0.879.

Продолжу на примере первой группы.
Таблицы ВТ строк:
втНоменклатура    466
втУпаковки    433
втТоварыНаСкладах    138
втТоварыВРезервеНаСкладах    34
втЦены    161
втЦеныОптовые    300

Убираем выборку из ВТ (со всеми некрасивыми соединениями через точку) Время- 2.065, то есть не меняется вообще.
Убираем ТоварыВРезерве Время- 1.806, что уже немного получше. Убираем ТоварыНаСкладах Время- 1.665. То есть обрезанием этих регистров можно сэкономить 1/8 запроса, что не особо чувствительно.

Возвращаем все взад, убираем запрос к РегистрСведений.ЦеныНоменклатуры.СрезПоследних имеем Время- 0.489/0.490 стабильно.
Попробовал выбрать РС.ЦеныНоменклатуры &Дата, ТипЦен = &ТипЦен (без отбора по номенклатуре. ВЫШЛО 3422 СЕКУНДЫ. Номенклатуры порядка 160 000 позиций.

Начал изучать таблицы в скуле.

N    Имя метаданных    Назначение метаданных    Данные (КБ)    Индексы (КБ)    Свободно (КБ)    Зарезервировано всего (КБ)
    Имя таблицы SQL    Кол-во строк                
7    РегистрНакопления.ТоварыВРезервеНаСкладах    Основная    4 695 104    4 835 200    11 664    9 541 968
    _AccumRg13980    32 834 054                
16    РегистрНакопления.ТоварыНаСкладах    Основная    2 158 328    1 247 600    728    3 406 656
    _AccumRg14040    14 022 291                
20    РегистрСведений.ЦеныНоменклатуры    Основная    1 557 512    2 829 728    4 440    4 391 680
    _InfoRg12489    10 116 446                

Затем запустил несколько скриптов с http://catalog.mista.ru/public/308762/ SQL сервер 2008: обслуживание, анализ производительности
Результаты Степень фрагментации индексов
Первый запрос показывает текущую фрагментацию индексов базы
Было у всех трех регистров в районе 22%-24%, после отработки скриптов Реорганизация/Перестроение индексов из данной статьи (поменял только 30 на 20, чтобы нужным мне регистры тоже перестроились). Вышло 1,2%-1,4%. НО! Заметно скорость не поменялась. Все так-же первый запрос выполняется на порядок медленнее последующих.

DatbaseName    TableName    IndexName    type_desc    Fragmentation    page_count    partition_number    sql    Records count

copy20160627    _InfoRg12489    _InfoR12489_ByRecorder_RN    NONCLUSTERED    1,21    45 302    1    alter index [_InfoR12489_ByRecorder_RN] on [dbo].[_InfoRg12489] REBUILD with(maxdop = 4,  SORT_IN_TEMPDB = on)    1

copy20160627    _AccumRg14040    _Accum14040_ByRecorder_RN    NONCLUSTERED    1,28    62 976    1    alter index [_Accum14040_ByRecorder_RN] on [dbo].[_AccumRg14040] REBUILD with(maxdop = 4,  SORT_IN_TEMPDB = on)    1

copy20160627    _AccumRg13980    _Accum13980_ByDims14581_RTRN    NONCLUSTERED    1,56    232 920    1    alter index [_Accum13980_ByDims14581_RTRN] on [dbo].[_AccumRg13980] REBUILD with(maxdop = 4,  SORT_IN_TEMPDB = on)    1

Скачал последнюю УПП. Настройки РС. ЦеныНоменклатуры такие-же. В частности Измерение Номенклатура — Ведущее, Не индексировать.

Тогда из той-же статьи прогнал  Отсутствующие индексы, вызывающие высокие издержки:
                                        
Результат запроса ADODB: 29 записей    
Из интересующих регистров только:
TotalCost    avg_user_impact    TableName    EqualityUsage    InequalityUsage    IncludeCloumns    Records count

428 603    72,7    [copy20160627].[dbo].[_InfoRg12489]    [_Active], [_Fld12490RRef]        [_Period], [_RecorderTRef], [_RecorderRRef], [_LineNo], [_Fld12491RRef], [_Fld12492RRef]    1    

На четвертой позиции. Выше (на первых трех) не интересные мне пока регистры подсистему интеграции с АТС.

Что можете подсказать в данной ситуации?
1 H A D G E H O G s
 
18.01.17
16:14
Убрать Индексировать везде
2 H A D G E H O G s
 
18.01.17
16:16
Цены получать одинм запросом
3 H A D G E H O G s
 
18.01.17
16:20
убедиться, что indexscan по ценам номенклатуры, почесать лоб и
1) махнуть рукой
2) перепилить ценыноменклатуры по методике Ненавижу1С и отказаться от СрезПоследних
4 Grobik
 
18.01.17
16:27
"Убрать Индексировать везде" не влияет никак.

"Цены получать одинм запросом" сделаю, чуть попозже, т.к. и один запрос тормозит. И тормозит в первый раз в 10 более раз сильнее, чем при повторных.

"перепилить ценыноменклатуры по методике Ненавижу1С и отказаться от СрезПоследних" можно не разжевать, но хоть направить в нужном направлении. Т.к. и сам думаю в эту сторону. Думал их копировать раз/два в день в отдельный регистр. Но нужны оперативные данные.
5 ДемонМаксвелла
 
18.01.17
16:31
(0) есть же консоль запроса с временем выполнения по каждой ВТ. Туда закидываешь запрос и смотришь, что конкретно тормозит. "Инструменты разработчика" - вот это посмотри, и других консолей тоже полно.
6 mehfk
 
18.01.17
16:33
(4) Без последнего запроса тоже тормозит?
7 Grobik
 
18.01.17
16:35
РегистрСведений.ЦеныНоменклатуры тормозит.
Почему при первом запросе тормозит в 10 и более раз сильнее?

(6) "Убираем выборку из ВТ (со всеми некрасивыми соединениями через точку) Время- 2.065, то есть не меняется вообще. " в (0)
8 Grobik
 
18.01.17
16:35
вопрос " Отсутствующие индексы, вызывающие высокие издержки". Может это затормаживать? И нужно ли с этим бороться?
9 mehfk
 
18.01.17
16:36
(7) Там еще и SELECT через точку, а не только соединение.
10 Grobik
 
18.01.17
16:39
(9) последний запрос ничего не занимает. Номенклатура + ЕдиницыИзмерени + Последний = ничего. В любой раз. Остатки и Резервы ~ 1/8 времени. Остальное ЦеныНоменклатуры.
11 H A D G E H O G s
 
18.01.17
16:42
(8) План запроса в XML зафотай по Ценам.
12 ДемонМаксвелла
 
18.01.17
16:43
а дата в срезе последних по ценам реально нужна?
13 Grobik
 
18.01.17
16:47
(11) Чем получить? К скулю на сервере доступа нет. С локального компа к серверу доступа нет. Есть логин и пароль скуля к моей базе с копией.
14 Grobik
 
18.01.17
16:49
(12) Как? Без даты быстрее будет?
15 H A D G E H O G s
 
18.01.17
16:50
(14) Без даты в 8.3 можно сключить хранение итогов по СрезуПоследних
16 ДемонМаксвелла
 
18.01.17
16:50
(14) Должно. И обычно цены нужны только последние.
17 H A D G E H O G s
 
18.01.17
16:50
включить и использовать.
Оперативный СрезПоследних, "расчитанный" и хранящийся в базе в отдельной табличке.
18 Grobik
 
18.01.17
16:50
Вот выбрал другую группу:
Имя таблицы    Количество строк    Результат запроса
втНоменклатура    41    ТаблицаЗначений
втУпаковки    37    ТаблицаЗначений
втЦены    24    ТаблицаЗначений
втЦеныОптовые    33    ТаблицаЗначений

Первый раз 6,5 секунды. 2,3,4,5,6 выполняется 0,45-0,46 с.
19 Grobik
 
18.01.17
16:51
(15) Платформа (8.2.19.130). На 8.3 переехать не взлетело.
20 H A D G E H O G s
 
18.01.17
16:52
(18) У тебя IndexScan к гадалке не ходи. А еще страшнее - какой-нибудь lazyspool
21 H A D G E H O G s
 
18.01.17
16:53
(19) Собирай план запроса. Получай доступ к SQL, хотя бы пусть дадут доступ к Enterprise manager/ ms sql profiler
22 H A D G E H O G s
 
18.01.17
16:55
Ну или пилить
http://naf2000.blogspot.ru/2013/09/1-8_11.html

Я у себя в продакшн использовал - все работает на сотнях предприятий по всей России матушке.
23 Grobik
 
18.01.17
16:55
(21) С консоли вытянуть нельзя? Есть Консоль запросов MS SQL v02-01 Автор: Селюкин Александр Юрьевич (sau)

Чтобы на локальном компе втянуть и разбираться?
24 H A D G E H O G s
 
18.01.17
16:58
(23) Не знаю. У меня всегда есть доступ к SQL.
25 Grobik
 
18.01.17
16:59
(22) Спасибо. Буду думать, может поможет.
26 Grobik
 
18.01.17
16:59
Ну я на новое место пришел, недели не прошло. Еще нету.
27 ptiz
 
18.01.17
17:12
(0) Например, так:
1) При открытии родителя работает простой запрос (без цен и других тяжелых частей).
2) Подключаем в форме ОбработкуОжидания("ПолныйРасчет", , 1)
3) В функции "ПриПолученииДанных" постоянно собираем товары в массив и запоминаем, когда в последний момент это делали.
4) В процедуре "ПолныйРасчет" - как только видим, что прошло больше 1 секунды с момента последнего обращения к процедуре ПриПолученииДанных(), выполняем тяжелый запрос по товарам из собранного массива. Результат - в ТЗ, и выводим его на экран (если табполе связано с ТЗ или ТЧ - просто заполняем нужные строки, иначе делаем ТабПоле.ОбновитьСтроки() - и в той же ПриПолученииДанных() выводим всю нужную информацию).

Тогда при быстром листании никаких задержек не будет, остановились - выполнился расчет.
28 Grobik
 
18.01.17
17:27
(27) Тормозит не листание, а первый вход в группу.
29 ptiz
 
18.01.17
17:29
(28) Это понятно, я просто предложил вариант, который помогает в тех случаях, когда запрос ускорить невозможно.
30 Grobik
 
18.01.17
17:42
(29) Понял, спасибо.

Без срезаПоследних работает быстрее 0,1 секунды.
Но 1 выбирает тысячи значений вместо пары десятков. Это с них еще последнее вылавливать надо.

НО 2! первый выбор по группе все равно больше 2 секунд для группы в 71 позицию. Больше 4 секунд, при 190 позициях.

Может можно эти жалкие 5 гигабайт вручную в кеш скуля поднять, что-бы регистр все время висел и не подгружался.
31 Grobik
 
19.01.17
17:54
Подняли мне свежую копию. Было РегистрСведений.ЦеныНоменклатуры 10 млн записей. Через 6 месяцев уже 21 млн записей. Все стало в 4 раза грустнее. Потерянных индексов и фрагментации нет.
32 piter3
 
19.01.17
17:55
(31)а они нужны?может в сторонку старые убрать,не?
33 H A D G E H O G s
 
19.01.17
18:03
(31) Доступ к профайлеру дали?
34 Grobik
 
19.01.17
18:19
(33) К сожалению нет. А на локальном компе база не вместится.
35 Grobik
 
20.01.17
15:53
Скачал какую-то студенческую поделку ExpressProfiler22wAddinSigned. Ее xml profiler есть отказывается. Может так можно понять?

Остатки и резервы почти не тормозят. Запрос в ВТ цен:
Первый заход по группе.
exec sp_executesql N'INSERT INTO #tt5(_Q_001_F_000RRef, _Q_001_F_001)SELECT#V8TblAli1_Q_001_T_001._Fld12491RRef AS _Q_001_F_000RRef,#V8TblAli1_Q_001_T_001._Fld12494 AS _Q_001_F_001FROM(SELECT_InfoRg12489_IR12._Fld12491RRef AS _Fld12491RRef,_InfoRg12489_IR12._Fld12494 AS _Fld12494FROM(SELECT#V8TblAli1_IR1._Fld12490RRef AS _Fld12490RRef,#V8TblAli1_IR1._Fld12491RRef AS _Fld12491RRef,#V8TblAli1_IR1._Fld12492RRef AS _Fld12492RRef,#V8TblAli1_IR1._MAXPERIOD AS _MAXPERIOD,SUBSTRING(MAX(_InfoRg12489_IR2._RecorderTRef + _InfoRg12489_IR2._RecorderRRef), 1, 4) AS _MAXRECORDERTRef,SUBSTRING(MAX(_InfoRg12489_IR2._RecorderTRef + _InfoRg12489_IR2._RecorderRRef), 5, 16) AS _MAXRECORDERRRefFROM(SELECT_InfoRg12489._Fld12490RRef AS _Fld12490RRef,_InfoRg12489._Fld12491RRef AS _Fld12491RRef,_InfoRg12489._Fld12492RRef AS _Fld12492RRef,MAX(_InfoRg12489._Period) AS _MAXPERIODFROM_InfoRg12489 WITH(NOLOCK)WHERE_InfoRg12489._Period <= P1 AND _InfoRg12489._Active = @P2 AND _InfoRg12489._Fld12490RRef = @P3 AND _InfoRg12489._Fld12492RRef = @P4 AND _InfoRg12489._Fld12491RRef IN (SELECT#T04155dafe3644984966d2fbc5545c695_Q_002_T_001._Q_000_F_000RRef AS _Q_002_F_000RRefFROM#tt1 #T04155dafe3644984966d2fbc5545c695_Q_002_T_001 WITH(NOLOCK))GROUP BY_InfoRg12489._Fld12490RRef,_InfoRg12489._Fld12491RRef,_InfoRg12489._Fld12492RRef) #V8TblAli1_IR1INNER JOIN _InfoRg12489 _InfoRg12489_IR2 WITH(NOLOCK)ON #V8TblAli1_IR1._Fld12490RRef = _InfoRg12489_IR2._Fld12490RRef AND #V8TblAli1_IR1._Fld12491RRef = _InfoRg12489_IR2._Fld12491RRef AND #V8TblAli1_IR1._Fld12492RRef = _InfoRg12489_IR2._Fld12492RRef AND #V8TblAli1_IR1._MAXPERIOD = _InfoRg12489_IR2._PeriodWHERE_InfoRg12489_IR2._Active = @P5 AND _InfoRg12489_IR2._Fld12490RRef = @P6 AND _InfoRg12489_IR2._Fld12492RRef = @P7 AND _InfoRg12489_IR2._Fld12491RRef IN (SELECT#T04155dafe3644984966d2fbc5545c695_Q_002_T_001._Q_000_F_000RRef AS _Q_002_F_000RRefFROM#tt1 #T04155dafe3644984966d2fbc5545c695_Q_002_T_001 WITH(NOLOCK))GROUP BY#V8TblAli1_IR1._Fld12490RRef,#V8TblAli1_IR1._Fld12491RRef,#V8TblAli1_IR1._Fld12492RRef,#V8TblAli1_IR1._MAXPERIOD) #V8TblAli1_IR11INNER JOIN _InfoRg12489 _InfoRg12489_IR12 WITH(NOLOCK)ON #V8TblAli1_IR11._Fld12490RRef = _InfoRg12489_IR12._Fld12490RRef AND #V8TblAli1_IR11._Fld12491RRef = _InfoRg12489_IR12._Fld12491RRef AND #V8TblAli1_IR11._Fld12492RRef = _InfoRg12489_IR12._Fld12492RRef AND #V8TblAli1_IR11._MAXPERIOD = _InfoRg12489_IR12._Period AND #V8TblAli1_IR11._MAXRECORDERTRef = _InfoRg12489_IR12._RecorderTRef AND #V8TblAli1_IR11._MAXRECORDERRRef = _InfoRg12489_IR12._RecorderRRef) #V8TblAli1_Q_001_T_001
CREATE INDEX TmpInd5 ON #tt5 (_Q_001_F_000RRef)',N'P1 datetime2(3),@P2 varbinary(1),@P3 varbinary(16),@P4 varbinary(16),@P5 varbinary(1),@P6 varbinary(16),@P7 varbinary(16)','2017-01-13 00:00:00',0x01,0xAB5D4061862E59BA11E46E70F2A5FC2C,0x00000000000000000000000000000000,0x01,0xAB5D4061862E59BA11E46E70F2A5FC2C,0x00000000000000000000000000000000
go

Время выполнения 35 151 мс, 174 216 чтений.
Время второго захода 328 мс, 129 359 чтений. Последующие +- как второй. Даже если через пару часов зайти в базу другим пользователем.
Второй заход.
exec sp_executesql N'INSERT INTO #tt5(_Q_001_F_000RRef, _Q_001_F_001)SELECT#V8TblAli1_Q_001_T_001._Fld12491RRef AS _Q_001_F_000RRef,#V8TblAli1_Q_001_T_001._Fld12494 AS _Q_001_F_001FROM(SELECT_InfoRg12489_IR12._Fld12491RRef AS _Fld12491RRef,_InfoRg12489_IR12._Fld12494 AS _Fld12494FROM(SELECT#V8TblAli1_IR1._Fld12490RRef AS _Fld12490RRef,#V8TblAli1_IR1._Fld12491RRef AS _Fld12491RRef,#V8TblAli1_IR1._Fld12492RRef AS _Fld12492RRef,#V8TblAli1_IR1._MAXPERIOD AS _MAXPERIOD,SUBSTRING(MAX(_InfoRg12489_IR2._RecorderTRef + _InfoRg12489_IR2._RecorderRRef), 1, 4) AS _MAXRECORDERTRef,SUBSTRING(MAX(_InfoRg12489_IR2._RecorderTRef + _InfoRg12489_IR2._RecorderRRef), 5, 16) AS _MAXRECORDERRRefFROM(SELECT_InfoRg12489._Fld12490RRef AS _Fld12490RRef,_InfoRg12489._Fld12491RRef AS _Fld12491RRef,_InfoRg12489._Fld12492RRef AS _Fld12492RRef,MAX(_InfoRg12489._Period) AS _MAXPERIODFROM_InfoRg12489 WITH(NOLOCK)WHERE_InfoRg12489._Period <= P1 AND _InfoRg12489._Active = @P2 AND _InfoRg12489._Fld12490RRef = @P3 AND _InfoRg12489._Fld12492RRef = @P4 AND _InfoRg12489._Fld12491RRef IN (SELECT#T10b5d97408f042f8a9e6106aa4203a94_Q_002_T_001._Q_000_F_000RRef AS _Q_002_F_000RRefFROM#tt1 #T10b5d97408f042f8a9e6106aa4203a94_Q_002_T_001 WITH(NOLOCK))GROUP BY_InfoRg12489._Fld12490RRef,_InfoRg12489._Fld12491RRef,_InfoRg12489._Fld12492RRef) #V8TblAli1_IR1INNER JOIN _InfoRg12489 _InfoRg12489_IR2 WITH(NOLOCK)ON #V8TblAli1_IR1._Fld12490RRef = _InfoRg12489_IR2._Fld12490RRef AND #V8TblAli1_IR1._Fld12491RRef = _InfoRg12489_IR2._Fld12491RRef AND #V8TblAli1_IR1._Fld12492RRef = _InfoRg12489_IR2._Fld12492RRef AND #V8TblAli1_IR1._MAXPERIOD = _InfoRg12489_IR2._PeriodWHERE_InfoRg12489_IR2._Active = @P5 AND _InfoRg12489_IR2._Fld12490RRef = @P6 AND _InfoRg12489_IR2._Fld12492RRef = @P7 AND _InfoRg12489_IR2._Fld12491RRef IN (SELECT#T10b5d97408f042f8a9e6106aa4203a94_Q_002_T_001._Q_000_F_000RRef AS _Q_002_F_000RRefFROM#tt1 #T10b5d97408f042f8a9e6106aa4203a94_Q_002_T_001 WITH(NOLOCK))GROUP BY#V8TblAli1_IR1._Fld12490RRef,#V8TblAli1_IR1._Fld12491RRef,#V8TblAli1_IR1._Fld12492RRef,#V8TblAli1_IR1._MAXPERIOD) #V8TblAli1_IR11INNER JOIN _InfoRg12489 _InfoRg12489_IR12 WITH(NOLOCK)ON #V8TblAli1_IR11._Fld12490RRef = _InfoRg12489_IR12._Fld12490RRef AND #V8TblAli1_IR11._Fld12491RRef = _InfoRg12489_IR12._Fld12491RRef AND #V8TblAli1_IR11._Fld12492RRef = _InfoRg12489_IR12._Fld12492RRef AND #V8TblAli1_IR11._MAXPERIOD = _InfoRg12489_IR12._Period AND #V8TblAli1_IR11._MAXRECORDERTRef = _InfoRg12489_IR12._RecorderTRef AND #V8TblAli1_IR11._MAXRECORDERRRef = _InfoRg12489_IR12._RecorderRRef) #V8TblAli1_Q_001_T_001
CREATE INDEX TmpInd5 ON #tt5 (_Q_001_F_000RRef)',N'P1 datetime2(3),@P2 varbinary(1),@P3 varbinary(16),@P4 varbinary(16),@P5 varbinary(1),@P6 varbinary(16),@P7 varbinary(16)','2017-01-13 00:00:00',0x01,0xAB5D4061862E59BA11E46E70F2A5FC2C,0x00000000000000000000000000000000,0x01,0xAB5D4061862E59BA11E46E70F2A5FC2C,0x00000000000000000000000000000000
go
36 Grobik
 
20.01.17
16:04
Сравнение  текстов показывает одинаковые различие в трех местах.
SELECT#T04155dafe3644984966d2fbc5545c695_Q_002_T_001. в долгом
SELECT#T10b5d97408f042f8a9e6106aa4203a94_Q_002_T_001. в быстром.
37 Grobik
 
20.01.17
16:07
https://yadi.sk/d/dzrMYRVn39zCXd

выгрузка в хмл
38 H A D G E H O G s
 
20.01.17
16:14
(37) Периодичность - по позиции регистратора штоле?
39 Grobik
 
20.01.17
16:28
ДА, я на где-то написал, а тут забыл.
40 H A D G E H O G s
 
20.01.17
16:31
(39) Странно, это нетиповая хрень. Зачем? Цены меняются по несколько раз в секунду?
41 Вафель
 
20.01.17
16:33
включи срез последник по регстру цен ну и дату всегда передавай пустую
42 H A D G E H O G s
 
20.01.17
16:35
(41) У него 8.2 пез вариантов
43 Вафель
 
20.01.17
16:35
тогда руками делать таблицу итогов
44 Grobik
 
20.01.17
16:35
На скуле писал
Я писал "Скачал последнюю УПП. Настройки РС. ЦеныНоменклатуры такие-же. В частности Измерение Номенклатура — Ведущее, Не индексировать." На самом деле есть отличие. В стандартной УПП периодичность "В течение дня". У меня периодичность по позиции регистратора.

(40) Цены ставятся автоматом по документам прихода и еще по чем-то. С приходом работает несколько человек. Плюс там еще какие-то навороты. Документы Документ.н01_УстановкаИндивидуальныхСкидокКонтрагента.ТабличнаяЧ занимают больше 8 гиг, Документ.УстановкаЦенНоменклатуры.ТабличнаяЧасть.Товары больше 5 гиг. Записей в регистре ЦеныНоменклатуры на начало года больше 21 млн.
45 Grobik
 
20.01.17
16:36
(43) Чьими руками? Цены в подборе должны быть актуальными на текущий момент.
46 H A D G E H O G s
 
20.01.17
16:38
(45) Отдельный регистрсведений с теми же измерениями, непериодический.

В него надо в ПриЗаписи регистра ЦеныНоменклатуры переписывать изменяющиеся цены
47 H A D G E H O G s
 
20.01.17
16:39
И, первоначально, заполнить СрезПоследним без фильтров. Как раз работка серверу на выходные
48 Grobik
 
20.01.17
16:45
Поомеедленне пожалуйста. Я записываю.

ПриЗаписи всех документов, которые с ним работают?

Сейчас гляну сколько их.
49 H A D G E H O G s
 
20.01.17
16:46
(48) ПриЗаписи в модуле набора записей регистра ЦеныНоменклатуры
50 H A D G E H O G s
 
20.01.17
16:48
Пока можно просто скорировать этот регистр, назвать копию ЦеныНоменклатурыАктуальные в конфигурации, убрать подчиненность регистратору в этом новом регистре и заполнить его СрезомПоследних из основного регистра.

И попробовать выполнить к нему запрос без всяких срезов последних.
51 Grobik
 
20.01.17
16:48
Не было и нету там ПриЗаписи. В смысле в Процедура ВыполнитьДвижения() Экспорт добавить? Копирование записываемой записи в свой регистр. Тогда там будет по каждому измерению только одна запись. Так штоле?
52 Grobik
 
20.01.17
16:49
(50) Летать будет, что пробовать?
53 H A D G E H O G s
 
20.01.17
16:50
**facepalm
54 H A D G E H O G s
 
20.01.17
16:51
забей
55 Grobik
 
20.01.17
16:58
(53) Попробую конечно оно не трудно.
(54) На кого?

Спасибо.
я в (51) не так написал что?
56 H A D G E H O G s
 
20.01.17
16:59
(55) ПриЗаписи ты должен добавить сам.
57 H A D G E H O G s
 
20.01.17
17:00
Вот проще самому сделать за 5 минут, чем объяснить.
58 TormozIT
 
гуру
20.01.17
17:02
Я тут
59 Grobik
 
24.01.17
12:40
РС цены победил. Создал новый непериодический РС ЦеныНоменклатурыТекущие забил в них текущие цены через корректировку записей регистра. Добавил в ПриЗаписи РС ЦеныНоменклатуры запись в этот регистр.

Большое спасибо H A D G E H O G s

Теперь тормозит РегистрНакопления.ТоварыВРезервеНаСкладах.Остатки.
Без него 0,2 секунды. С ним 6,5-7 секунд.
Какие есть идеи на эту тему?
60 H A D G E H O G s
 
24.01.17
12:56
(59) эээ, брать оперативные остатки.
61 H A D G E H O G s
 
24.01.17
12:57
Набор измерений этого регистра, в том порядке, в котором они идут в конфигураторе - скинь.
62 Grobik
 
24.01.17
13:58
ТоварыВРезервеНаСкладах.Период,
    ТоварыВРезервеНаСкладах.Регистратор,
    ТоварыВРезервеНаСкладах.НомерСтроки,
    ТоварыВРезервеНаСкладах.Активность,
    ТоварыВРезервеНаСкладах.ВидДвижения,
Измерения
    ТоварыВРезервеНаСкладах.Склад,
    ТоварыВРезервеНаСкладах.ДокументРезерва,
    ТоварыВРезервеНаСкладах.Номенклатура,
    ТоварыВРезервеНаСкладах.ХарактеристикаНоменклатуры,
    ТоварыВРезервеНаСкладах.СерияНоменклатуры
Ресурсы
    ТоварыВРезервеНаСкладах.Количество
63 Grobik
 
24.01.17
14:07
Висит на

exec sp_executesql N'INSERT INTO #tt3(_Q_001_F_000RRef, _Q_001_F_001)SELECT#V8TblAli1_Q_001_T_001._Fld13983RRef AS _Q_001_F_000RRef,#V8TblAli1_Q_001_T_001._Fld13985Balance AS _Q_001_F_001FROM(SELECT#V8TblAli1_T._Fld13983RRef AS _Fld13983RRef,CAST(SUM(#V8TblAli1_T._Fld13985Balance) AS NUMERIC(33,3)) AS _Fld13985BalanceFROM(SELECT_AccumRgT13988._Fld13983RRef AS _Fld13983RRef,CAST(SUM(_AccumRgT13988._Fld13985) AS NUMERIC(27,3)) AS _Fld13985BalanceFROM_AccumRgT13988 WITH(NOLOCK)WHERE_AccumRgT13988._Period = P1 AND _AccumRgT13988._Fld13981RRef = @P2 AND _AccumRgT13988._Fld13984RRef = @P3 AND _AccumRgT13988._Fld20783RRef = @P4 AND _AccumRgT13988._Fld13983RRef IN (SELECT#T6efccf4913724000aa161161263761a0_Q_002_T_001._Q_000_F_000RRef AS _Q_002_F_000RRefFROM#tt1 #T6efccf4913724000aa161161263761a0_Q_002_T_001 WITH(NOLOCK))GROUP BY_AccumRgT13988._Fld13983RRefHAVINGCAST(SUM(_AccumRgT13988._Fld13985) AS NUMERIC(27,3)) <> CAST(@P5 AS NUMERIC(1,0))UNION ALLSELECT_AccumRg13980._Fld13983RRef AS _Fld13983RRef,CAST(CAST(SUM(CASEWHEN _AccumRg13980._RecordKind = CAST(0. AS NUMERIC(1,0))THEN - _AccumRg13980._Fld13985ELSE _AccumRg13980._Fld13985END) AS NUMERIC(21,3)) AS NUMERIC(28,3)) AS _Fld13985BalanceFROM_AccumRg13980 WITH(NOLOCK)WHERE_AccumRg13980._Period >= @P6 AND _AccumRg13980._Period < @P7 AND _AccumRg13980._Active = @P8 AND _AccumRg13980._Fld13981RRef = @P9 AND _AccumRg13980._Fld13984RRef = P10 AND _AccumRg13980._Fld20783RRef = P11 AND _AccumRg13980._Fld13983RRef IN (SELECT#T6efccf4913724000aa161161263761a0_Q_002_T_001._Q_000_F_000RRef AS _Q_002_F_000RRefFROM#tt1 #T6efccf4913724000aa161161263761a0_Q_002_T_001 WITH(NOLOCK))GROUP BY_AccumRg13980._Fld13983RRefHAVINGCAST(SUM(CASEWHEN _AccumRg13980._RecordKind = CAST(0. AS NUMERIC(1,0))THEN - _AccumRg13980._Fld13985ELSE _AccumRg13980._Fld13985END) AS NUMERIC(21,3)) <> CAST(P12 AS NUMERIC(1,0))) #V8TblAli1_TGROUP BY#V8TblAli1_T._Fld13983RRefHAVINGCAST(SUM(#V8TblAli1_T._Fld13985Balance) AS NUMERIC(33,3)) <> CAST(P13 AS NUMERIC(1,0))) #V8TblAli1_Q_001_T_001
CREATE INDEX TmpInd4 ON #tt3 (_Q_001_F_000RRef)',N'P1 datetime2(3),@P2 varbinary(16),@P3 varbinary(16),@P4 varbinary(16),@P5 numeric(10),@P6 datetime2(3),@P7 datetime2(3),@P8 varbinary(1),@P9 varbinary(16),P10 varbinary(16),P11 varbinary(16),P12 numeric(10),P13 numeric(10)','3999-11-01 00:00:00',0x97320013D4C1378811DC230B3208A700,0x00000000000000000000000000000000,0x00000000000000000000000000000000,0,'2017-01-24 00:00:00','3999-11-01 00:00:00',0x01,0x97320013D4C1378811DC230B3208A700,0x00000000000000000000000000000000,0x00000000000000000000000000000000,0,0
go
64 Grobik
 
24.01.17
14:08
N    Имя метаданных    Назначение метаданных    Данные (КБ)    Индексы (КБ)    Свободно (КБ)    Зарезервировано всего (КБ)
    Имя таблицы SQL    Кол-во строк                

РегистрНакопления.ТоварыВРезервеНаСкладах    Итоги    1 382 736    2 318 584    248    3 701 568
_AccumRgT13988    11 926 040
65 Grobik
 
24.01.17
14:15
РегистрНакопления.ТоварыВРезервеНаСкладах    Основная    5 095 960    5 186 256    344    10 282 560
_AccumRg13980    35 671 670
66 H A D G E H O G s
 
24.01.17
14:35
передвинуть Измерение Номенклатура на позицию выше БЫ, НО....
ХЗ, как это отыграется на других запросах.
Но можно ткнуть палкой.
67 H A D G E H O G s
 
24.01.17
14:37
И в УПП1.3 они так и сделали, передвинув Номенклатуру и Характеристику выше ДокументаРезерва, но, в УПП1.2 могли быть кривые запросы, завязанные на то, что ДокументРезерва выше, однако, в те далекие времена на это никто не морфировал.
Поэтому я бы передвинул. Вместе с характеристикой.
68 H A D G E H O G s
 
24.01.17
14:39
Хотя, с другой стороны, если в группе 100500 номенклатур, sql сделает mergejoin и наша телодвижуха окажется бессмысленна.
69 Grobik
 
24.01.17
14:39
Спасибо. Буду думать.
70 H A D G E H O G s
 
24.01.17
14:39
ткнуть! ткнуть! ткнуть!
писсофкэйк!
71 Grobik
 
24.01.17
14:40
Больше 100500 в два раза сейчас пока. Но быстро растет.
72 Grobik
 
24.01.17
15:51
ДокументаРезерва составной. Ссылки на 10 документов.
73 Grobik
 
24.01.17
17:31
Вопрос СвободныеОстатки в новых УППхах шустро работают?

Кто нибудь переносил этот механизЪм в старые УПП?
74 H A D G E H O G s
 
24.01.17
21:40
(73) Не проще перейти на УПП1.3 ?
75 Grobik
 
25.01.17
10:11
(74) "Имеется УПП 1.2 2007 года."

3 программиста денно и ношно 10 лет её пилили. Думаю не проще. Хотя такие мысли слышал. В любом случае не завтра.