Вход | Регистрация


1С:Предприятие :: 1С:Предприятие 8 общая

Решение вопроса 6.1 по аттестации 1С Эксперт

Решение вопроса 6.1 по аттестации 1С Эксперт
Я
   regi1984
 
06.09.16 - 10:37
Помогите разобраться с решением билета 6.1.

Ясно, что:
- соединение с подзапросом необходимо вынести во врем. таблицу
- соединение с виртуальной таблицей - аналогично
- параметры временных таблиц указать, но тут возможны варианты
- индексация этих временных таблиц по полям соединений

Смущает: "для изменения" - задано своеобразно.

Не указаны таблицы, то есть блокируем все, но необходимо ли их блокировать не понятно мне по условию задачи. И не выпадут ли эти таблицы из запроса на уровне сервера приложений, вроде не влияют таблицы(ЛимитыОстатков, ЛимитыОтгрузкиСоСкладов) на результат запроса.

Оптимально ли тут применяется "" для изменения"?

Задача 6.1:

Документ РеализацияТоваров осуществляет движения по регистру ОстаткиНаСкладах, а именно списывает реализованное количество товаров со склада. В обработчике проведения документа выполняется проверка превышения лимитов - минимального допустимого остатка товара на складе и максимально допустимого размера отгрузки со склада. Запрос выглядит следующим образом:

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

Укажите неоптимальные решения в данном запросе и предложите варианты исправления.
 
 
   regi1984
 
1 - 06.09.16 - 10:39
* - параметры ВИРТУАЛЬНЫХ таблиц необхоодимо указать, но тут возможны варианты
   vi0
 
2 - 06.09.16 - 10:46
там управляемые блокировки?
   regi1984
 
3 - 06.09.16 - 10:47
(2) Про режим нет уточнения, поэтому отвечать необходимо для "Авто" думаю
   vi0
 
4 - 06.09.16 - 10:48
а варианты ответов какие?
   Spieluhr
 
5 - 06.09.16 - 10:49
1) Соединения с подзапросом здесь нет
2) Соединение с виртуальной таблицей - не факт, нужно знать структуру измерений этих регистров, чтобы поля соединения в индексы попадали
   vi0
 
6 - 06.09.16 - 10:49
можно уменьшить размер выборки если задать условия сразу в запросе
   xafavute
 
7 - 06.09.16 - 10:52
тут лимиты вообще не используются
   rifat
 
8 - 06.09.16 - 10:52
(3) по умолчанию в 1С управляемые блокировки, если не ошибаюсь
   xafavute
 
9 - 06.09.16 - 10:53
(8) Это же экзамен. Там по всем версиям спрашивают
   regi1984
 
10 - 06.09.16 - 10:53
(5) Прямого соединенипя нет, но есть соединение выборки из подзапроса. Если СКУЛЬ ошибся в подзапросе, то на более высоком уровне это сыграет свою роль. Не так?
 
 Рекламное место пустует
   xafavute
 
11 - 06.09.16 - 10:53
еще момент.
можно в фильтр по остаткам добавить номенклатуру
   regi1984
 
12 - 06.09.16 - 10:54
(7) Да, это и смущает.

В запросе нет, в условии есть. Как ответить?
   regi1984
 
13 - 06.09.16 - 10:55
(11) Да, это упомяналось:
параметры ВИРТУАЛЬНЫХ таблиц необхоодимо указать, но тут возможны варианты
   regi1984
 
14 - 06.09.16 - 11:00
Про параметры остатков тоже все двояко:

- условие "номенклатура в (выбрать...из ВТ)" само по себе не очень быстрое.

- оставлять без фильтра - значит получить все остатки, тоже не быстро.

Понятно что у SQL свое мнение и сделает он по своему в не зависимости от вашего выбора. А экзаменатору то как ответить?
   vi0
 
15 - 06.09.16 - 11:00
> условие "номенклатура в (выбрать...из ВТ)" само по себе не очень быстрое.
Откуда инфа?
   Spieluhr
 
16 - 06.09.16 - 11:01
(10) Не так. Если идет просто выборка из подзапроса, то ничего плохого в этом нет, будь их хоть 10 этажей.
Сам запрос то что выбирает в итоге? Кол-во из документа и остаток. Лимиты в выборку не попадают. Как их контролировать?
   rifat
 
17 - 06.09.16 - 11:03
(14) - условие "номенклатура в (выбрать...из ВТ)" само по себе не очень быстрое.
имхо побыстрее чем выбрать из подзапроса.
   Spieluhr
 
18 - 06.09.16 - 11:04
И еще ответьте сами себе на вопрос что будет заблокировано при выполнении запроса и насколько?
   PCcomCat
 
19 - 06.09.16 - 11:04
в запросе (0) ошибка "Товары.КоличествоНаСписание"? Нет в подзапросе такого поля.
   regi1984
 
20 - 06.09.16 - 11:04
(16) В данном запросе явно указано выбрать "Товары.Номенклатура И Остатки.КоличествоОстаток"

Товары - подзапрос!
Остатки - вирт. таблица(будем считать что иногда подзапрос)

т.е. подзапрос есть всегда. ЧЯДНТ?
   Spieluhr
 
21 - 06.09.16 - 11:08
(20) да ерунда это все. Ответ на (0) в (18)
   Lemkus
 
22 - 06.09.16 - 11:09
Если речь идет об экзамене, то отвечать надо строго по этому списку и ничего не выдумывать:
https://kb.1c.ru/articleView.jsp?id=44

Что касается ДЛЯ ИЗМЕНЕНИЯ, то я бы ответил просто то, что я знаю про эту команду. Скорее всего, для преподавателя это просто зацепка, чтобы переключится на более сложную тему.
   xafavute
 
23 - 06.09.16 - 11:10
(22) Я знаю про эту команду - это не ответ
   Lemkus
 
24 - 06.09.16 - 11:12
(23) Имею в виду, все мысли по поводу использования этой команды в запросе
   PCcomCat
 
25 - 06.09.16 - 11:13
У Хрусталевой рекомендуется товары выбрать во временную таблицу, остатки выбрать во временную таблицу, а потом соединять. Глава 4. Оптимизация запросов.
   regi1984
 
26 - 06.09.16 - 11:16
(21) Мой ответ: ТоварыНаСкладах - ю блокировкой,
с отбором по складу*, по номенклатуре* - смотря где задать условие. Но возможны варианты - не сказано ничего про наличие индексов, и не задана структура регистра. Тут расказать что-да как про кластерный индекс регистра.

Проблокировки регистров сведений тут трудно ответить, ведь в результате запроса их нет, а субд скорее всего и не будет их обрабатываь.

Spieluhr, так совсем не верно?
   PCcomCat
 
27 - 06.09.16 - 11:20
(25) + во временных таблицах индексировать поля дальнейшего соединения.
   H A D G E H O G s
 
28 - 06.09.16 - 11:20
Тут всего 2 действия:
1) Вынести подзапрос в ВТ
2) Условие по складу из параметров ВТ перенести в условия соединения.
   regi1984
 
29 - 06.09.16 - 11:20
(25) в одних источниках - остатки выбираем без отбора, в других - фильтруем по номенклатуры для уменьшения выборки. Какой вариант "более правильный"?
   Spieluhr
 
31 - 06.09.16 - 11:24
(26) Про блокировки регистров сведений надо ответить, если есть желание, чтобы экзамен продолжился дольше 30 сек
   Sammo
 
32 - 06.09.16 - 11:25
Мне кажется, что здесь неудачное соединение.
Судя по тому, что
ПО Остатки.Номенклатура = Товары.Номенклатура
внизу и по условиям соединений с лимитами, происходит соединение остатков с лимитами по номенклатуре и по складу. Зачем?
Имхо, соединять надо остатки с лимитами, тогда размер выборки будет меньше.
+ да, простой вложенный запрос не аукается, но уже более сложные варианты могут негативно аукаться на плане, поэтому мне лично было бы удобнее вынести табличную часть в отдельную временную таблицу и потом использовать ее.
+ для изменения в проведении. Насколько я помню сейчас общая рекомендация - списываем и потом смотрим, что получилось.
   PCcomCat
 
33 - 06.09.16 - 11:27
(29) Не знаю, как где. Читаю сейчас Хрусталеву.
Есть прям пример оптимизации:

Делаем выборку из табличной части документа во временную таблицу, далее получаем остатки, указывая в фильтре "Номенклатура В (ВЫБРАТЬ ... ИЗ ВременнойТаблицыТоваровТабЧасти)". В обеих индексируем Номенклатуру, т.к. по ней соединяем.
 
 
   H A D G E H O G s
 
34 - 06.09.16 - 11:27
(31) Что там надо ответить? Что никаких проблем с ней нет?
   Sammo
 
35 - 06.09.16 - 11:27
+32 на из забавного - ну приджоинили мы РС Лимиты, а дальше что? как они используются? Если вывода нет, суммирования нет, проверок в запросе нет
   H A D G E H O G s
 
36 - 06.09.16 - 11:29
(31) Тебя сами спросят, если захотят. А если это будет Морозов, то и не спросит, ему больше интересен кластер серверов и 100500 его настроек.
   regi1984
 
37 - 06.09.16 - 11:29
(35) да, в этом и вопрос. На каком этапе они отсеятся и дойдет до них блокировка?
   PCcomCat
 
38 - 06.09.16 - 11:29
Написано: "Вместо вложенных запросов в соединениях ВСЕГДА нужно использовать временные таблицы."
   H A D G E H O G s
 
39 - 06.09.16 - 11:31
(38) И тут я бы мог поспорить с 1С:-) Но не буду. В 99.9% они правы.
   PCcomCat
 
40 - 06.09.16 - 11:32
(39) К сожалению, экзамен - это знать то, что дает именно 1С.
   PCcomCat
 
41 - 06.09.16 - 11:34
+(38) Следующее предложение: "При этом их необходимо проиндексировать по полям, участвующим в условии соединения.".
   regi1984
 
42 - 06.09.16 - 11:35
(41) - индексация этих временных таблиц по полям соединений ,это в (0)
   Sammo
 
43 - 06.09.16 - 11:36
(38) Скажем так, в общем случае лучше так. И 41 тоже.
Но есть моменты, когда это не сыграет.
+ надо учитывать, что временные таблицы - это рост tempDB.
Кстати, я по старой памяти всегда делаю Уничтожить временную таблицу, хотя сейчас вроде последнее время не было с этим косяков.
   H A D G E H O G s
 
44 - 06.09.16 - 11:43
(43) "Но есть моменты, когда это не сыграет. "
В большинстве моментов это не сыграет.
Вы лучше отсортируйте эту ВТ по полям кластерного индекса той таблицы, с которой будете соединять.
   H A D G E H O G s
 
45 - 06.09.16 - 11:44
(44) Хотя нет. Лучше с ВТ ничего не делать вообще.
   PCcomCat
 
46 - 06.09.16 - 11:45
(43)я тоже уничтожаю.

(42) Вот что есть про ДЛЯ ИЗМЕНЕНИЯ:    
- Данная конструкция  игнорируется вне транзакции
- ДЛЯ ИЗМЕНЕНИЯ актуально ТОЛЬКО для автоматического режима управления блокировок (в режиме управляемых блокировок следует использовать объект БлокировкаДанных).
   H A D G E H O G s
 
47 - 06.09.16 - 11:46
(46) Неправильно.
Самое главное:
ДЛЯ ИЗМЕНЕНИЯ заставляет сервер SQL ставить x блокировку (вместо s) на прочитанные запросом 1С строки таблиц и индексов.
   regi1984
 
48 - 06.09.16 - 11:47
(45) Вы предлагаете все таки не выносить запрос к остаткам в отдельный пакет, соединять как есть?
   H A D G E H O G s
 
49 - 06.09.16 - 11:47
(48) Да.
 
 Рекламное место пустует
   vi0
 
50 - 06.09.16 - 11:47
(44)
+ надо учитывать, что временные таблицы - это рост tempDB.
   vi0
 
51 - 06.09.16 - 11:48
в данном случае не те размеры
т.е. учитывать это не нужно
   vi0
 
52 - 06.09.16 - 11:48
(43)
> Кстати, я по старой памяти всегда делаю Уничтожить временную таблицу, хотя сейчас вроде последнее время не было с этим косяков.
Это тоже лишнее, если не используется менеджер ВР
   regi1984
 
53 - 06.09.16 - 11:49
(47) U блокировку
(49) Тут может быть подзапрос, а мы на экзамене. В жизни то ясно что можно нарушать правила и иногда нужно
   vi0
 
54 - 06.09.16 - 11:49
*ВТ
   H A D G E H O G s
 
55 - 06.09.16 - 11:49
(48) На экзамене 1С вас за это могут предать анафеме, но если сможете доказать и объяснить, почему - то может прокатить.
   PCcomCat
 
56 - 06.09.16 - 11:49
Кстати, то, что в (46), в разделе "1С » Сертификация 1С » 1С Эксперт » ДЛЯ ИЗМЕНЕНИЯ в запросах 1С 8"
   H A D G E H O G s
 
57 - 06.09.16 - 11:49
(53) Да, простите, U. Ошибся. Главное, что не совместимую с S. Что защищает от деадлока.
   PCcomCat
 
58 - 06.09.16 - 11:51
(47) Там именно про U и сказано.
   vi0
 
59 - 06.09.16 - 11:52
(44) сортировать ничего не нужно
индексировать можно
   H A D G E H O G s
 
60 - 06.09.16 - 11:53
(59) Да, сортировать бессмысленно. Как и индексировать в 90% случаев.
   vi0
 
61 - 06.09.16 - 12:01
(60) почему 90?
   Sammo
 
62 - 06.09.16 - 12:05
(52) Помнится был релиз (правда еще 8.1, если мне не изменяет мой склероз), где очистка не работала при удалении менеджера. Так что лучше подстраховаться. А то будет очередной сюрприз. Но это сугубое имхо.

(60) Часто имеет смысл прикинуть - даст ли время потраченное на создание индекса соответствующий прирост производительности. В подобных простых ситуациях обычно не даёт. Имхо.
   regi1984
 
63 - 06.09.16 - 12:08
(62) + иногда бывает что индекс создан, а субд решил его не использовать.
   mistеr
 
64 - 06.09.16 - 12:09
(38) (41) (43) Причина таких рекомендаций простая. База это не всегда SQL Server. В каждой базе свои тараканы. А с ВТ везде будет работать гарантировано "неплохо". Хоть и не всегда оптимально.
   mistеr
 
65 - 06.09.16 - 12:11
Насчет блокировок. Если проверять и остатки и лимиты прямо в запросе, блокировки возможно вообще не потребуется.
   H A D G E H O G s
 
66 - 06.09.16 - 12:12
(61) Да, пожалуй во всех 100%.
ВТ должна быть больше РН, чтобы ее индекс имел смысл. Это десятки тысяч строк. Это дичь пихать эту выборку в ВТ.

Обычно это будет выглядеть, как перебор строк ВТ (nested loops) и поиск по индексу в РН. Индекс ВТ - не используется.

Иногда это будет выглядеть, как параллельный перебор строк ВТ и строк РН. (merge join) ВТ при этом будет предварительно отсортирована по строкам, аналогичным строкам кластерного индекса РН. При этом индекс ВТ будет не использован, либо, если он есть и порядок колонок в нем совпадают с порядком колонок кластерного индекса РН - SQL будет читать из него (не искать). Это, пожалуй, единственный случай его использования, вот почему я сказал, что проще ВТ отсортировать.
   H A D G E H O G s
 
67 - 06.09.16 - 12:13
(66) Ну и hashjoin - ВТ также будет прочитана предварительно, индекс ВТ использован не будет.
   Sammo
 
68 - 06.09.16 - 12:17
(66) Вариант - в документе реализация 99 тысяч строк.
   vi0
 
69 - 06.09.16 - 12:19
(66) временная таблица может быть значительно больше второй таблицы (тоже временной, например), и наличие этой большой ВР не будет дичью, если она используется несколько раз, и ее формирование трудоемко
сортировка там точно не нужна
   H A D G E H O G s
 
70 - 06.09.16 - 12:21
(69) Ну вот это и есть эти 10%. Как часто такое встречается?
Как долго живет такая таблица? Я думаю, она живет 5-6 чтений к ней. Делать ли в данном случае для нее индекс?
   H A D G E H O G s
 
71 - 06.09.16 - 12:22
(70) 5-6 чтений - это в очень лучшем случае. В большинстве - пару раз чтение - тут индекс однозначно не нужен.
   mistеr
 
72 - 06.09.16 - 12:25
(70) (71) См. (64)
   vi0
 
73 - 06.09.16 - 12:27
(70) почему 5-6 чтений? а не 10-20?
   H A D G E H O G s
 
74 - 06.09.16 - 12:28
(72) Я говорю за SQL. В других не разбираюсь.
   H A D G E H O G s
 
75 - 06.09.16 - 12:28
(73) Ну, значит вам повезло. Я с таким - не встречался (слава Гейтсу).
   vi0
 
76 - 06.09.16 - 12:38
(75) могу согласиться с 90%
в моей практике подобные примеры были при обменах конвертацией
когда есть большая временная таблицы и поиск в ней выполняется очень большое количество раз


Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Тема не обновлялась длительное время, и была помечена как архивная. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.
Рекламное место пустует