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

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

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

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

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

Задача 6.1:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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