суббота, 24 октября 2015 г.

1С: Эксперт. Решение билета №5.

Вопрос 5.1 Обработчик проведения документа содержит следующий код:
Запрос.Текст = 
"ВЫБРАТЬ Товары.Номенклатура КАК Номенклатура,
| Товары.КоличествоНаСписание КАК Количество,
| Остатки.КоличествоОстаток КАК Остаток
|ИЗ (ВЫБРАТЬ Товары.Номенклатура КАК Номенклатура,
| СУММА(Товары.Количество) КАК Количество
| ИЗ Документ.Реализация.Товары КАК Товары
| ГДЕ Товары.Ссылка = &ДокументСсылка
| СГРУППИРОВАТЬ ПО| Товары.Номенклатура) КАК Товары
|ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Остатки(, Склад = &Склад) КАКОстатки
| ПО Остатки.Номенклатура = Товары.Номенклатура|ДЛЯ ИЗМЕНЕНИЯ РегистрНакопления.ТоварыНаСкладах.Остатки";
Запрос.УстановитьПараметр("ДокументСсылка", ТекущийДокумент);Запрос.УстановитьПараметр("Склад",СпрСклады.НайтиПоНаименованию("Основной"));
ВыборкаОстатков = Запрос.Выполнить() .Выбрать();
Пока (ВыборкаОстатков.Следующий()) Цикл
// Контроль остатков
Если (ВыборкаОстатков.Остаток - ВыборкаОстатков.Количество <= 0) 
ТогдаСообщить ("На складе нехватате товара!");Отказ = Истина;
КонецЕсли;
КонецЦикла;// Увеличим счетчик проведенных документов на 1
Константы.СчетчикДокументов.Установить(Константы.СчетчикДокументов.Получить)

Укажите на неоптимальные решения и предложите более оптимальный вариант.
Ответ:
1) Изменение константы в обработке проведения -грубая ошибка.
Если нужно в системе учитывать количество проведенных документов, то для этого следует использовать к примеру  регистр сведений.
2) Соединение с виртуальной. таблицей. Следует заменить на соединение с врем. таб. 
3) В запросе лучше сразу задать условие на количество, чтобы в цикле не делать проверку.


Вопрос 5.2. В коде конфигурации описан сложный запрос текст которого состоит из нескольких сотен строк. Запрос содержит множество подзапросов большой вложенности и соединений с подзапросами.  При выполнении MSSQL выбирает план содержащий операции "table scan" и "nested loops". Все необходимые индексы для запроса определены. Обновление статистики не дает результатов. Предложите варианты решения этой проблемы.

Ответ:
1) Избавится от соединений с подзапросами, заменив подзапросы на временные таблицы. Это должно решить проблему "nested loops".
2) Если все необходимые индексы для запроса определены, а оптимизатор выбирает план со сканированием необходимо задать условия так, чтобы индекс мог быть использован.
3) Вообще  "table scan" - используется в основном с ВТ и не являются узким местом, поэтому возможно имелось в виду "index scan"  или "clusrered index scan".

Вопрос 5.3. Что такое транзакция. Что такое блокировка данных. Как блокировка данных связана с транзакцией.

Транзакция - это последовательность действий которые выполняются либо полностью либо не выполняются совсем.
Транзакция обладает свойствами
  • Атомарность
  • Изолированность
  • Надежность
  • Согласованность
Блокировка это информация о том что некоторый ресурс заблокирован.
Блокировка возможна только в транзакции, вне ее блокировка не возможна.
Во время транзакции блокировки накапливаются, так как в основном блокировки длятся до конца транзакции, за исключением транзакций с уровнем изоляции read committed.

Комментариев нет:

Отправить комментарий