Почему тормозит запрос
Пытаюсь оптимизировать код. Самым тяжелым при проведении оказался этот запрос (контроль свободного остатка на складе):
Что здесь не так? Возможно из за блокировки для изменения?
Запрос.Текст = "ВЫБРАТЬ
| РеализацияТоваровУслугТовары.Ссылка.Склад,
| РеализацияТоваровУслугТовары.Номенклатура,
| СУММА(РеализацияТоваровУслугТовары.Количество * РеализацияТоваровУслугТовары.Коэффициент) КАК Необходимо,
| СУММА(ТоварыВРезервеНаСкладахОстатки.КоличествоОстаток) КАК ВРезерве,
| СУММА(ТоварыНаСкладахОстатки.КоличествоОстаток) КАК НаСкладе
|ИЗ
| Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыВРезервеНаСкладах.Остатки(
| &ДатаДок,
| Склад = &Склад
| И Организация = &Организация) КАК ТоварыВРезервеНаСкладахОстатки
| ПО РеализацияТоваровУслугТовары.Номенклатура = ТоварыВРезервеНаСкладахОстатки.Номенклатура
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Остатки(
| &ДатаДок,
| Склад = &Склад
| И Организация = &Организация) КАК ТоварыНаСкладахОстатки
| ПО РеализацияТоваровУслугТовары.Номенклатура = ТоварыНаСкладахОстатки.Номенклатура
|ГДЕ
| РеализацияТоваровУслугТовары.Ссылка = &Ссылка
|
|СГРУППИРОВАТЬ ПО
| РеализацияТоваровУслугТовары.Номенклатура,
| РеализацияТоваровУслугТовары.Ссылка.Склад,
| РеализацияТоваровУслугТовары.НомерСтроки
|
|ДЛЯ ИЗМЕНЕНИЯ";
ПоказатьЧто здесь не так? Возможно из за блокировки для изменения?
По теме из базы знаний
- Как можно "положить" SQL сервер с помощью обычной консоли запросов 1С
- [T-SQL] Почему разыменование - это плохо?
- Планы запросов - это просто! Разбор оптимизаций запросов PostgreSQL на живых примерах
- Смотрим запросы 1С через Microsoft SQL Profiler по следам ошибок разработчиков, приводящих к проблемам производительности
- MS SQL Server: ваши статистики не работают! Так ли все плохо на самом деле?
Ответы
В избранное
Подписаться на ответы
Сортировка:
Древо развёрнутое
Свернуть все
(1) попробуйте
ВЫБРАТЬ
РеализацияТоваровУслугТовары.Номенклатура,
СУММА(РеализацияТоваровУслугТовары.Количество * РеализацияТоваровУслугТовары.Коэффициент) КАК Необходимо,
РеализацияТоваровУслугТовары.НомерСтроки
ПОМЕСТИТЬ тТовары
ИЗ
Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары
ГДЕ
РеализацияТоваровУслугТовары.Ссылка = &Ссылка
СГРУППИРОВАТЬ ПО
РеализацияТоваровУслугТовары.Номенклатура,
РеализацияТоваровУслугТовары.НомерСтроки
;
//////////////////////////////////////////////////////////// ////////////////////
ВЫБРАТЬ
тТовары.НомерСтроки КАК НомерСтроки,
тТовары.Номенклатура,
&Склад,
тТовары.Необходимо КАК Необходимо,
СУММА(ЕСТЬNULL(ТоварыВРезервеНаСкладахОстатки.КоличествоОстаток, 0)) КАК ВРезерве,
СУММА(ЕСТЬNULL(ТоварыНаСкладахОстатки.КоличествоОстаток, 0)) КАК НаСкладе
ИЗ
тТовары КАК тТовары
ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыВРезервеНаСкладах.Остатки(
&ДатаДок,
Склад = &Склад
И Номенклатура В
(ВЫБРАТЬ
т.Номенклатура
ИЗ
тТовары КАК т)) КАК ТоварыВРезервеНаСкладахОстатки
ПО тТовары.Номенклатура = ТоварыВРезервеНаСкладахОстатки.Номенклатура
ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Остатки(
&ДатаДок,
Склад = &Склад
И Номенклатура В
(ВЫБРАТЬ
т.Номенклатура
ИЗ
тТовары КАК т)) КАК ТоварыНаСкладахОстатки
ПО тТовары.Номенклатура = ТоварыНаСкладахОстатки.Номенклатура
СГРУППИРОВАТЬ ПО
тТовары.Номенклатура,
тТовары.НомерСтроки,
тТовары.Необходимо
УПОРЯДОЧИТЬ ПО
НомерСтроки
Показать
(7) вроде ускорить должно просто
У меня с ценами так было. С одним видом цен не тормозило сильно. А когда подцеплял еще раз регистр цен для другого вида цен то все тормозило. Сделал предварительный отбор только нужных колонок и полетело.
Левое соединение (Выбрать только нужные колонки.....) КАК
У меня с ценами так было. С одним видом цен не тормозило сильно. А когда подцеплял еще раз регистр цен для другого вида цен то все тормозило. Сделал предварительный отбор только нужных колонок и полетело.
Сначала временная таблица - выборка товаров из ТЧ,
за тем временные таблицы из Виртуальных с фильтрацией по Товарам из ТЧ
за тем - соединения. Обычно так делаю, так и на экзамене Спеца по платформе Гончаров требовал :)
за тем временные таблицы из Виртуальных с фильтрацией по Товарам из ТЧ
за тем - соединения. Обычно так делаю, так и на экзамене Спеца по платформе Гончаров требовал :)
Спасибо всем огромнейшее за обсуждение. Удалось сдвинуть этот запрос с почетного первого на четвертое место. Объективно на сколько ускорилось сказать не могу - на разных выборках тестировала.
Учла (2) и (3). и частично (12). Получилось так:
(12), режим управления блокировками НЕ автоматический. Наверное действительно стоит задуматься над изменением технологии контроля остатков.
Всем огромнейшее спасибо за советы и обсуждение.
Учла (2) и (3). и частично (12). Получилось так:
"ВЫБРАТЬ
| РеализацияТоваровУслугТовары.Номенклатура КАК Номенклатура,
| СУММА(РеализацияТоваровУслугТовары.Количество * РеализацияТоваровУслугТовары.Коэффициент) КАК Необходимо
|ПОМЕСТИТЬ РН
|ИЗ
| Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары
|ГДЕ
| РеализацияТоваровУслугТовары.Ссылка = &Ссылка
|
|СГРУППИРОВАТЬ ПО
| РеализацияТоваровУслугТовары.Номенклатура,
| РеализацияТоваровУслугТовары.НомерСтроки
|
|ИНДЕКСИРОВАТЬ ПО
| Номенклатура
|;
|
|//////////////////////////////////////////////////////////// ////////////////////
|ВЫБРАТЬ
| ТоварыВРезервеНаСкладахОстатки.Номенклатура КАК Номенклатура,
| СУММА(ТоварыВРезервеНаСкладахОстатки.КоличествоОстаток) КАК ВРезерве
|ПОМЕСТИТЬ Зарезервировано
|ИЗ
| РегистрНакопления.ТоварыВРезервеНаСкладах.Остатки(
| &ДатаДок,
| Склад = &Склад
| И Организация = &Организация
| И Номенклатура В
| (ВЫБРАТЬ
| РН.Номенклатура
| ИЗ
| РН КАК РН)) КАК ТоварыВРезервеНаСкладахОстатки
|
|СГРУППИРОВАТЬ ПО
| ТоварыВРезервеНаСкладахОстатки.Номенклатура
|
|ИНДЕКСИРОВАТЬ ПО
| Номенклатура
|;
|
|//////////////////////////////////////////////////////////// ////////////////////
|ВЫБРАТЬ
| ТоварыНаСкладахОстатки.Номенклатура КАК Номенклатура,
| СУММА(ТоварыНаСкладахОстатки.КоличествоОстаток) КАК НаСкладе
|ПОМЕСТИТЬ ТоварыНаСкладе
|ИЗ
| РегистрНакопления.ТоварыНаСкладах.Остатки(
| &ДатаДок,
| Склад = &Склад
| И Организация = &Организация
| И Номенклатура В
| (ВЫБРАТЬ
| РН.Номенклатура
| ИЗ
| РН КАК РН)) КАК ТоварыНаСкладахОстатки
|
|СГРУППИРОВАТЬ ПО
| ТоварыНаСкладахОстатки.Склад,
| ТоварыНаСкладахОстатки.Номенклатура
|
|ИНДЕКСИРОВАТЬ ПО
| Номенклатура
|;
|
|//////////////////////////////////////////////////////////// ////////////////////
|ВЫБРАТЬ
| РН.Номенклатура,
| РН.Необходимо КАК Необходимо,
| Зарезервировано.ВРезерве КАК ВРезерве,
| ТоварыНаСкладе.НаСкладе КАК НаСкладе
|ИЗ
| РН КАК РН
| ЛЕВОЕ СОЕДИНЕНИЕ Зарезервировано КАК Зарезервировано
| ПО РН.Номенклатура = Зарезервировано.Номенклатура
| ЛЕВОЕ СОЕДИНЕНИЕ ТоварыНаСкладе КАК ТоварыНаСкладе
| ПО РН.Номенклатура = ТоварыНаСкладе.Номенклатура
|
|ДЛЯ ИЗМЕНЕНИЯ";
Показать(12), режим управления блокировками НЕ автоматический. Наверное действительно стоит задуматься над изменением технологии контроля остатков.
Всем огромнейшее спасибо за советы и обсуждение.
(13)
В случае управляемых блокировок у вас не действует ДЛЯ ИЗМЕНЕНИЯ в запросе. Блокировки не будет. Поэтому при такой схеме контроля остатков вам нужно ОБЯЗАТЕЛЬНО ставить управляемую блокировку на регистры накопления руками. В противном случае вы можете уйти в минус даже с этим контролем остатков.
Наверное действительно стоит задуматься над изменением технологии контроля остатков
В случае управляемых блокировок у вас не действует ДЛЯ ИЗМЕНЕНИЯ в запросе. Блокировки не будет. Поэтому при такой схеме контроля остатков вам нужно ОБЯЗАТЕЛЬНО ставить управляемую блокировку на регистры накопления руками. В противном случае вы можете уйти в минус даже с этим контролем остатков.
(4)Что вы ерунду пишете. "ДЛЯ ИЗМЕНЕНИЯ" не может тормозить. Это флаг, накладывающий блокировку обновления.
(2)Владимир прав. Нельзя соединять реальные таблицы с виртуальными, а так же виртуальные с виртуальными. Нужно все помещать во временные таблицы.
"ДЛЯ ИЗМЕНЕНИЯ" также нужно доработать.
Нужно указывать только те таблицы, по которым в последующем будут делаться движения - что бы блокировались только они.
(2)Владимир прав. Нельзя соединять реальные таблицы с виртуальными, а так же виртуальные с виртуальными. Нужно все помещать во временные таблицы.
"ДЛЯ ИЗМЕНЕНИЯ" также нужно доработать.
Нужно указывать только те таблицы, по которым в последующем будут делаться движения - что бы блокировались только они.
Скорее всего тормозят регистры, попробуйте загнать данные ТЧ документа в временную таблицу, а в отборе для регистров добавьте
номенклатура в (выбрать ВТЗ.номенклатура из ВТЗ сгруппировать по ВТЗ.Номенклатура), т.е. выберете только записи по нужной номенклатуре, а так он остатки по всей номенклатуре получает, а потом левое делает что долго.
номенклатура в (выбрать ВТЗ.номенклатура из ВТЗ сгруппировать по ВТЗ.Номенклатура), т.е. выберете только записи по нужной номенклатуре, а так он остатки по всей номенклатуре получает, а потом левое делает что долго.
1. Режим управления блокировкой данных - точно автоматический? Если да, то продолжаем, если нет - то зачем используется контроль остатков в таком виде? пишите движения и потом проверяйте остатки по регистрам, быстрее будет
2. Если режим управления блокировкой автоматический, то вам нужен обязательно отбор по номенклатуре в остатках регистров накопления, иначе вы установите излишнюю блокировку, которая может привести к ожиданиям либо у проводимого документа либо у тех кто будет что-то делать с регистром по тем же организации и складу
3. В зависимости от ожидаемого количества позиций в реализации - остатки во временные таблицы и соединяться уже с ними.
2. Если режим управления блокировкой автоматический, то вам нужен обязательно отбор по номенклатуре в остатках регистров накопления, иначе вы установите излишнюю блокировку, которая может привести к ожиданиям либо у проводимого документа либо у тех кто будет что-то делать с регистром по тем же организации и складу
3. В зависимости от ожидаемого количества позиций в реализации - остатки во временные таблицы и соединяться уже с ними.
Вакансии
Аналитик 1С / Бизнес-аналитик
Нижний Новгород
зарплата от 100 000 руб. до 250 000 руб.
Временный (на проект)
Нижний Новгород
зарплата от 100 000 руб. до 250 000 руб.
Временный (на проект)