Имя: Пароль:
1C
1С v8
Запрос на MS SQL висит, в файловой версии летит.
0 pozdeev-artem
 
08.03.14
14:05
Добрый день.
Подскажите пожалуйста, по какой причине запрос выполняется в файловой версии (8.2.15.301) несколько секунд, а на сервере MS SQL + серьезная железка, выполняется неопределенно долго (точно не знаю, больше 30 минут не ждал)?
Еще м:мент. Вчера этот запрос на этом сервере выполнялся от 3 до 4 минут.

На всякий случай текст запроса:

ВЫБРАТЬ РАЗРЕШЕННЫЕ
    НачислениеАмортизацииБухгалтерскийУчетСрезПоследних.ОсновноеСредство,
    ПРЕДСТАВЛЕНИЕ(НачислениеАмортизацииБухгалтерскийУчетСрезПоследних.ОсновноеСредство) КАК ОсновноеСредствоПредставление,
    НачислениеАмортизацииБухгалтерскийУчетСрезПоследних.ОсновноеСредство.Код КАК Код,
    СтоимостьОСОстатки_СтоимостьАмортизацияОСНачалоПериода.СчетУчетаБУ КАК СчетУчетаБУ,
    СтоимостьОСОстатки_СтоимостьАмортизацияОСНачалоПериода.СчетНачисленияАмортизацииБУ КАК СчетНачисленияАмортизацииБУ,
    СтоимостьОСОстатки_СтоимостьАмортизацияОСНачалоПериода.Склад КАК Склад,
    СтоимостьОСОстатки_СтоимостьАмортизацияОСНачалоПериода.МОЛ КАК МОЛ,
    СтоимостьОСОстатки_СтоимостьАмортизацияОСНачалоПериода.ПодразделениеОрганизации КАК ПодразделениеОрганизации,
    ЕСТЬNULL(СтоимостьОСОстатки_СтоимостьАмортизацияОСНачалоПериода.СтоимостьОстаток, 0) КАК СтоимостьНачальныйОстаток,
    ЕСТЬNULL(СтоимостьОСОстатки_СтоимостьАмортизацияОСКонецПериода.СтоимостьОстаток, 0) КАК СтоимостьКонечныйОстаток,
    ЕСТЬNULL(СтоимостьОСОстатки_СтоимостьАмортизацияОСНачалоПериода.АмортизацияОстаток, 0) КАК АмортизацияНачальныйОстаток,
    ЕСТЬNULL(СтоимостьОСОстатки_СтоимостьАмортизацияОСКонецПериода.АмортизацияОстаток, 0) КАК АмортизацияКонечныйОстаток,
    ЕСТЬNULL(СтоимостьОСОбороты_АмортизацияОСОбороты.АмортизацияПриход, 0) КАК АмортизацияОборот,
    ЕСТЬNULL(ВыработкаОСОбороты.КоличествоОборот, 0) КАК Количество,
    ЕСТЬNULL(ПараметрыАмортизацииОСБухгалтерскийУчетСрезПоследних.СрокИспользованияДляВычисленияАмортизации, 0) КАК СрокИспользованияДляВычисленияАмортизации,
    ЕСТЬNULL(ПараметрыАмортизацииОСБухгалтерскийУчетСрезПоследних.СтоимостьДляВычисленияАмортизации, 0) КАК СтоимостьДляВычисленияАмортизации,
    ЕСТЬNULL(ПараметрыАмортизацииОСБухгалтерскийУчетСрезПоследних.ОбъемПродукцииРаботДляВычисленияАмортизации, 0) КАК ОбъемПродукцииРаботДляВычисленияАмортизации,
    ЕСТЬNULL(ПараметрыАмортизацииОСБухгалтерскийУчетСрезПоследних.КоэффициентАмортизации, 0) КАК КоэффициентАмортизации,
    ЕСТЬNULL(ПараметрыАмортизацииОСБухгалтерскийУчетСрезПоследних.КоэффициентУскорения, 0) КАК КоэффициентУскорения,
    ПараметрыАмортизацииОСБухгалтерскийУчетСрезПоследних.Период КАК Период,
    ГрафикиАмортизацииБухгалтерскийУчетСрезПоследних.ГрафикАмортизации КАК ГрафикАмортизации,
    СтоимостьОСОстатки_СтоимостьАмортизацияОСНачалоПериода.СчетУчетаБУ КАК СчетУчета,
    СтоимостьОСОстатки_СтоимостьАмортизацияОСНачалоПериода.СчетНачисленияАмортизацииБУ КАК СчетНачисленияАмортизации,
    ПервоначальныеСведенияОбОсновныхСредствахОрганизацийСрезПоследних.ИнвентарныйНомер КАК ИнвентарныйНомер,
    ПервоначальныеСведенияОбОсновныхСредствахОрганизацийСрезПоследних.СпособНачисленияАмортизации КАК СпособНачисленияАмортизации,
    ЕСТЬNULL(ПервоначальныеСведенияОбОсновныхСредствахОрганизацийСрезПоследних.ПервоначальнаяСтоимость, 0) КАК ПервоначальнаяСтоимость,
    СпособыОтраженияРасходовПоАмортизацииОСБухгалтерскийУчетСрезПоследних.СпособыОтраженияРасходовПоАмортизации КАК СпособыОтраженияРасходовПоАмортизации,
    ЕСТЬNULL(СтоимостьОСОстатки_СтоимостьАмортизацияНаНачалоГода.СтоимостьОстаток, 0) - ЕСТЬNULL(СтоимостьОСОстатки_СтоимостьАмортизацияНаНачалоГода.АмортизацияОстаток, 0) КАК СтоимостьНаНачалоГода
ИЗ
    РегистрСведений.НачислениеАмортизацииОСБухгалтерскийУчет.СрезПоследних(
            &НачалоПериода,
            Организация = &Организация
                И НЕ ОсновноеСредство В
                        (ВЫБРАТЬ
                            СостоянияОСОрганизаций.ОсновноеСредство
                        ИЗ
                            РегистрСведений.СостоянияОСОрганизаций КАК СостоянияОСОрганизаций
                        ГДЕ
                            СостоянияОСОрганизаций.Состояние = &СнятоСУчета
                            И СостоянияОСОрганизаций.ДатаСостояния < &Период
                            И СостоянияОСОрганизаций.Организация = &Организация )) КАК НачислениеАмортизацииБухгалтерскийУчетСрезПоследних
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ПервоначальныеСведенияОСБухгалтерскийУчет.СрезПоследних(
                &НачалоПериода,
                Организация = &Организация
                    И ПорядокПогашенияСтоимости = &НачислениеАмортизации) КАК ПервоначальныеСведенияОбОсновныхСредствахОрганизацийСрезПоследних
        ПО НачислениеАмортизацииБухгалтерскийУчетСрезПоследних.ОсновноеСредство = ПервоначальныеСведенияОбОсновныхСредствахОрганизацийСрезПоследних.ОсновноеСредство
            И (НачислениеАмортизацииБухгалтерскийУчетСрезПоследних.НачислятьАмортизацию = ИСТИНА)
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ПараметрыАмортизацииОСБухгалтерскийУчет.СрезПоследних(&НачалоПериода, Организация = &Организация ) КАК ПараметрыАмортизацииОСБухгалтерскийУчетСрезПоследних
        ПО НачислениеАмортизацииБухгалтерскийУчетСрезПоследних.ОсновноеСредство = ПараметрыАмортизацииОСБухгалтерскийУчетСрезПоследних.ОсновноеСредство
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ГрафикиАмортизацииОСБухгалтерскийУчет.СрезПоследних(&НачалоПериода, Организация = &Организация ) КАК ГрафикиАмортизацииБухгалтерскийУчетСрезПоследних
        ПО НачислениеАмортизацииБухгалтерскийУчетСрезПоследних.ОсновноеСредство = ГрафикиАмортизацииБухгалтерскийУчетСрезПоследних.ОсновноеСредство
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СпособыОтраженияРасходовПоАмортизацииОСБухгалтерскийУчет.СрезПоследних(&НачалоПериода, Организация = &Организация ) КАК СпособыОтраженияРасходовПоАмортизацииОСБухгалтерскийУчетСрезПоследних
        ПО НачислениеАмортизацииБухгалтерскийУчетСрезПоследних.ОсновноеСредство = СпособыОтраженияРасходовПоАмортизацииОСБухгалтерскийУчетСрезПоследних.ОсновноеСредство
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ВыработкаОС.Обороты(&НачалоПериода, &КонецПериода, Месяц, ) КАК ВыработкаОСОбороты
        ПО НачислениеАмортизацииБухгалтерскийУчетСрезПоследних.ОсновноеСредство = ВыработкаОСОбороты.ОсновноеСредство
            И (ПервоначальныеСведенияОбОсновныхСредствахОрганизацийСрезПоследних.ПараметрВыработки = ВыработкаОСОбороты.ПараметрВыработки)
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.СтоимостьОС.Остатки(&НачалоПериода, Организация = &Организация ) КАК СтоимостьОСОстатки_СтоимостьАмортизацияОСНачалоПериода
        ПО НачислениеАмортизацииБухгалтерскийУчетСрезПоследних.ОсновноеСредство = СтоимостьОСОстатки_СтоимостьАмортизацияОСНачалоПериода.ОсновноеСредство
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.СтоимостьОС.Остатки(&КонецПериода, Организация = &Организация ) КАК СтоимостьОСОстатки_СтоимостьАмортизацияОСКонецПериода
        ПО НачислениеАмортизацииБухгалтерскийУчетСрезПоследних.ОсновноеСредство = СтоимостьОСОстатки_СтоимостьАмортизацияОСКонецПериода.ОсновноеСредство
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.СтоимостьОС.Обороты(&НачалоПериода, &КонецПериода, Период, Организация = &Организация ) КАК СтоимостьОСОбороты_АмортизацияОСОбороты
        ПО НачислениеАмортизацииБухгалтерскийУчетСрезПоследних.ОсновноеСредство = СтоимостьОСОбороты_АмортизацияОСОбороты.ОсновноеСредство
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.СтоимостьОС.Остатки(&НачалоГода, Организация = &Организация ) КАК СтоимостьОСОстатки_СтоимостьАмортизацияНаНачалоГода
        ПО НачислениеАмортизацииБухгалтерскийУчетСрезПоследних.ОсновноеСредство = СтоимостьОСОстатки_СтоимостьАмортизацияНаНачалоГода.ОсновноеСредство
1 Aleksey
 
08.03.14
14:10
РЛС включен?
Права полные?
Привилегированный режим включал?
2 pozdeev-artem
 
08.03.14
14:14
РЛС отключен.
Запускаю под пользователем с полными правами.
Запрос исполняю из консоли запросов, а т.ж. из общего модуля "Управление внеоборотными активами" (База БП 1.6 (старая, сильно переделанная под учет в другом государстве)
3 pozdeev-artem
 
08.03.14
14:17
Интуитивно чувствую, что проблема в MS SQL. Но в чем именно она может быть, и куда стукнуть, чтобы понять больше - не знаю.
4 erp20
 
08.03.14
16:09
Проблема скорее всего в запросе или актуальности статистики.

Можно раздробить запрос на составные части, выделить основную таблицу "НачислениеАмортизацииБухгалтерскийУчетСрезПоследних" и постепенно присоединяя к ней доп. таблицы ловить то соединение, которое сводит оптимизатор запросов SQL с ума.
Но вообще, лично я бы этот запрос переписал - при росте объема ОС и записей в регистре "ВыработкаОС" очень нестабильно будет себя вести.

Если дашь cf могу свой вариант выложить (в БП 2.0 не хватает таблиц), если нет то попробуй след. реализацию:

1) Основную таблицу "НачислениеАмортизацииБухгалтерскийУчетСрезПоследних" клади во временную таблицу.
2) В основной таблице сразу фильтруй по "НачислятьАмортизацию = ИСТИНА"
3) Индексируй основную таблицу по колонке "Основное средство"
4) Подумай можно ли изменить фильтр "НЕ ОсновноеСредство". Конструкция НЕ в отборах негативно влияет на производительность (см. kb.1c.ru). Если основных средств много (и измерение ОсновноеСредство в регистрах "ПервоначальныеСведенияОСБухгалтерскийУчет", "НачислениеАмортизацииБухгалтерскийУчетСрезПоследних" идет первым или проиндексировано, лучше результаты запроса:
ВЫБРАТЬ
СостоянияОСОрганизаций.ОсновноеСредство
ИЗ
РегистрСведений.СостоянияОСОрганизаций КАК СостоянияОСОрганизаций
ГДЕ
СостоянияОСОрганизаций.Состояние = &СнятоСУчета И СостоянияОСОрганизаций.ДатаСостояния < &Период И СостоянияОСОрганизаций.Организация = &Организация

поместить во временную таблицу и ИНДЕКСИРОВАТЬ по колонке "ОсновноеСредство"

5) Таблицу "ВыработкаОСОбороты" так же выноси во временную. Добавляй к ней фильтр по Основным средствам. Список можешь получить из виртуальной таблицы, которую сделал в пункте 4. Индексируем по колонкам Основное средство и Параметры выборки.
6) Таблицу "ПервоначальныеСведенияОбОсновныхСредствахОрганизацийСрезПоследних" выносим во временную. При выборке данных накладываем доп. фильтры по колонкам "ОсновныеСредства" и "ПараметрыВыборки", таблицу по которым берем из виртуальной таблицы созданной нами в пункте 4.
7) Дальше работаем со временными таблицами, к которым присоединяем все, что необходимо.
5 МихаилМ
 
09.03.14
14:29
заменить у срезов
соединение объединением.

поможет, даже если  max_dop = 1

возможно представление заменить на конкретное значение и уточнением типа.
6 pozdeev-artem
 
09.03.14
18:41
(4), (5) спасибо за идеи. Попробую сделать так. О результате расскажу.
7 pozdeev-artem
 
10.03.14
09:12
Получилось!
(4) - применил сразу все пункты, эффект отличный.
(5) - т.к. предыдущие действия возымели эффект, то дальше идти не стал, в силу ограничения во времени. И, если можно пару вопросов:
1 - в контексте вышеозначенной проблемы, какое преимущество может иметь объединение над соединением?
2 - что такое max_drop = 1?

Большое спасибо за помощь!
8 МихаилМ
 
10.03.14
11:43
2)
какой "max_drop"
я писал про "max_dop".

max degree of parallelism. дальше в яндекс

1) ms sql union части запросов пятается выполнять параллельно.
Здесь можно обсудить любую тему при этом оставаясь на форуме для 1Сников, который нужен для работы. Ymryn