Индексирование полей виртуальной таблицы

1. 22.09.22 18:30 Сейчас в теме
приветствую!

Изучая систему стандартов по оптимизации условий запроса из ИТС (https://its.1c.ru/db/v8std/content/658/hdoc), не могу понять необходимо ли индексировать поля виртуальной таблицы.

Например есть таблица значений которое помещается в виртуальную, затем соединяется с таблицой регистра штрихкодов:

Запрос = Новый Запрос;
Запрос.Текст = 
"ВЫБРАТЬ
|    ТаблицаДанных.Номенклатура КАК Номенклатура,
|    ТаблицаДанных.Характеристика КАК Характеристика
|ПОМЕСТИТЬ ВиртуальнаяТаблица
|ИЗ
|	&ТаблицаДанных КАК ТаблицаДанных
|
|ИНДЕКСИРОВАТЬ ПО
|	Номенклатура,
|	Характеристика
|;
|
|////////////////////////////////////////////////////////////­////////////////////
|ВЫБРАТЬ
|	ВиртуальнаяТаблица.Номенклатура КАК Номенклатура,
|	ВиртуальнаяТаблица.Характеристика КАК Характеристика,
|	ШтрихкодыНоменклатуры.Штрихкод КАК Штрихкод
|ИЗ
|	ВиртуальнаяТаблица КАК ВиртуальнаяТаблица
|	
|	ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ШтрихкодыНоменклатуры КАК ШтрихкодыНоменклатуры
|		ПО ВиртуальнаяТаблица.Номенклатура = ШтрихкодыНоменклатуры.Номенклатура
|		И ВиртуальнаяТаблица.Характеристика = ШтрихкодыНоменклатуры.Характеристика";

Запрос.УстановитьПараметр("ТаблицаДанных", ТаблицаДанных);
Показать


В регистре штрихкодов поля Номенклатура и Характеристика индексированы, порядок верен.
Так как во втором пакете виртуальная таблица является основной, необходимо ли ее поля индексировать, для оптимального выполнения условия соединения?
Ответы
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
2. RustamZz 22.09.22 22:01 Сейчас в теме
3. shaykhelov 23.09.22 12:41 Сейчас в теме
попадает в описание:
Для условий в ПО ЛЕВОГО соединения следует индексировать поля в правой таблице.
4. booksfill 23.09.22 16:43 Сейчас в теме
Индекс использован не будет, т.к. у вас имеет место полный перебор временной таблицы, а вот индекс РС будет, может быть (it depends).

Зато, что точно не повредит, так это явная типизация полей временной таблицы через Выразить.

Ну и план запроса смотрите, кто вас знает, может у вас статистика год не собиралась и оптимизатор полагает, что у вас в регистре две записи.

P.S.
Изучая стандарты, не забудьте посмотреть разницу между временной и виртуальной таблицами.

P.P.S.
И еще, вы точно уверены, что хотите оставить возможность получать NULL вместе с "нормальными" штрихкодами?
5. user1831019 23.09.22 17:03 Сейчас в теме
(4)
Зато, что точно не повредит, так это явная типизация полей временной таблицы через Выразить.
В данном случае временная таблица формируется из параметра типа ТаблицаЗначений. А как мы все знаем - в запрос нельзя передать нетипизированную ТЗ.
6. booksfill 23.09.22 17:27 Сейчас в теме
(5)
А как мы все знаем - в запрос нельзя передать нетипизированную ТЗ

Нельзя, зато можно вот так:
Запрос = Новый Запрос();
  Запрос.Текст = "ВЫБРАТЬ Поле1, Поле2 Поместить ВТ ИЗ &ТЗ как ТЗ; Выбрать Вт.* ИЗ ВТ КАК ВТ";
  тз = Новый ТаблицаЗначений();
  тз.Колонки.Добавить("Поле1", Новый ОписаниеТипов("СправочникСсылка.Пользователи, Строка", ,
                               Новый КвалификаторыСтроки(0, ДопустимаяДлина.Переменная)));
                               
  тз.Колонки.Добавить("Поле2", Новый ОписаниеТипов("Число",
                               Новый КвалификаторыЧисла(0, 0, ДопустимыйЗнак.Любой)));
  
  новСтр = тз.Добавить();
  новСтр.Поле1 = "Привет";
  новСтр.Поле2 = 12;
  
  новСтр = тз.Добавить();
  новСтр.Поле1 = ПараметрыСеанса.ТекущийПользователь;
  новСтр.Поле2 = 22;
  
  Запрос.УстановитьПараметр("ТЗ", тз);
  резЗапроса = Запрос.Выполнить();
  выборка = резЗапроса.Выбрать();
  Пока выборка.Следующий() Цикл
  	Сообщить(Строка(Выборка.Поле1) + "" + Строка(Выборка.Поле2));	
  КонецЦикла; 
Показать


И не надо уверять, что, например, характеристика номенклатуры никогда не станет составным типом.

В общем, я рекомендую не пренебрегать "Выразить" для полей, что будут потом использоваться в условиях.

Ибо в боевой базе попадали на неприятные последствия.
Причем в реальных запросах все тоже далеко не так очевидно.
И потом были разборки типа "караул, запрос стал работать в n раз медленнее, я я точно ничего не трогал, сами можете убедиться".
7. user1831019 23.09.22 17:35 Сейчас в теме
(6)
Нельзя, зато можно вот так:
Ну да. Прекрасная типизированная таблица. В чем проблема-то? Ну будет NULL на слове "Привет"...
И не надо уверять, что, например, характеристика номенклатуры никогда не станет составным типом.
Вы так сейчас договоритесь до того, что во ВСЕХ запросах придется использовать ВЫРАЗИТЬ()!!
Ну а вдруг со временем какое-то поле в таблице станет составным...

Да и вообще, "Защита от дурака" - это миф.
8. booksfill 23.09.22 17:46 Сейчас в теме
(7)
Вы так сейчас договоритесь до того, что во ВСЕХ запросах придется использовать ВЫРАЗИТЬ()


Это вы, конечно правы, надо сиё чудо не всегда, но забывать про такое не стоит.

А в моем пример, так и вообще Выразить для составного поля в тз must have should we could :)

Потому, что залезть в ТЗ и чей-то там поправить (можно неявно -добавили новый вид документа в обработку заполнения, выгрузили таб. часть в тз, чтобы чей-то там допилить кодом, и все, вроде как, работает, тесты проходит, а нагрузочное тестирование на каждый чих мало кто делает) куда как легче чем согласовать изменение структуры метаданных.
nikolasx; user1831019; +2 Ответить
9. user1831019 23.09.22 17:49 Сейчас в теме
(8)
must have should we could :)
Тут обычно банят иностранных агентов, выражающихся на вражеском языке НАТО...
10. booksfill 23.09.22 17:55 Сейчас в теме
(9) Я выражаюсь на языке понятном нашим союзникам, например, китайцам. У нас же есть союзники, которые не знают русского, зато знают английский? :)
Правда, да, "язык НАТО" они точно не знают.
11. user1831019 23.09.22 17:58 Сейчас в теме
(10) Лукашенко тебе союзник. И никто больше.
12. booksfill 23.09.22 18:01 Сейчас в теме
(11) Это тебе он союзник. А нам союзники все, кто не против нас, тут я согласен с В.И. Лениным.
Ладно, пятничный треп закончил.
13. shaykhelov 23.09.22 18:54 Сейчас в теме
(4)
Зато, что точно не повредит, так это явная типизация полей временной таблицы через Выразить.

Переданная таблица значений заранее типизирована. ВЫРАЗИТЬ здесь лишнее.


(4)
Изучая стандарты, не забудьте посмотреть разницу между временной и виртуальной таблицами.

Уточните что вы имеете ввиду под словом виртуальная таблица?


(4)
И еще, вы точно уверены, что хотите оставить возможность получать NULL вместе с "нормальными" штрихкодами?

Не стал нагружать запрос конструкциями не относящихся к смыслу вопроса)
Оставьте свое сообщение
Вакансии
Программист 1С
Электросталь
зарплата до 200 000 руб.
Полный день

Программист, аналитик, эксперт 1С
Санкт-Петербург
По совместительству

Автор новостей об 1С, налогах и бухучете на INFOSTART.RU
Санкт-Петербург
По совместительству

Программист 1С
Екатеринбург
зарплата от 50 000 руб.
По совместительству

Ведущий разработчик 1С (техлид внутреннего учета)
Новосибирск
зарплата от 230 000 руб.
Полный день