|
Запрос на 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 части запросов пятается выполнять параллельно. |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |