Изучая систему стандартов по оптимизации условий запроса из ИТС (https://its.1c.ru/db/v8std/content/658/hdoc), не могу понять необходимо ли индексировать поля виртуальной таблицы.
Например есть таблица значений которое помещается в виртуальную, затем соединяется с таблицой регистра штрихкодов:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ТаблицаДанных.Номенклатура КАК Номенклатура,
| ТаблицаДанных.Характеристика КАК Характеристика
|ПОМЕСТИТЬ ВиртуальнаяТаблица
|ИЗ
| &ТаблицаДанных КАК ТаблицаДанных
|
|ИНДЕКСИРОВАТЬ ПО
| Номенклатура,
| Характеристика
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ВиртуальнаяТаблица.Номенклатура КАК Номенклатура,
| ВиртуальнаяТаблица.Характеристика КАК Характеристика,
| ШтрихкодыНоменклатуры.Штрихкод КАК Штрихкод
|ИЗ
| ВиртуальнаяТаблица КАК ВиртуальнаяТаблица
|
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ШтрихкодыНоменклатуры КАК ШтрихкодыНоменклатуры
| ПО ВиртуальнаяТаблица.Номенклатура = ШтрихкодыНоменклатуры.Номенклатура
| И ВиртуальнаяТаблица.Характеристика = ШтрихкодыНоменклатуры.Характеристика";
Запрос.УстановитьПараметр("ТаблицаДанных", ТаблицаДанных);
Показать
В регистре штрихкодов поля Номенклатура и Характеристика индексированы, порядок верен.
Так как во втором пакете виртуальная таблица является основной, необходимо ли ее поля индексировать, для оптимального выполнения условия соединения?
А как мы все знаем - в запрос нельзя передать нетипизированную ТЗ
Нельзя, зато можно вот так:
Запрос = Новый Запрос();
Запрос.Текст = "ВЫБРАТЬ Поле1, Поле2 Поместить ВТ ИЗ &ТЗ как ТЗ; Выбрать Вт.* ИЗ ВТ КАК ВТ";
тз = Новый ТаблицаЗначений();
тз.Колонки.Добавить("Поле1", Новый ОписаниеТипов("СправочникСсылка.Пользователи, Строка", ,
Новый КвалификаторыСтроки(0, ДопустимаяДлина.Переменная)));
тз.Колонки.Добавить("Поле2", Новый ОписаниеТипов("Число",
Новый КвалификаторыЧисла(0, 0, ДопустимыйЗнак.Любой)));
новСтр = тз.Добавить();
новСтр.Поле1 = "Привет";
новСтр.Поле2 = 12;
новСтр = тз.Добавить();
новСтр.Поле1 = ПараметрыСеанса.ТекущийПользователь;
новСтр.Поле2 = 22;
Запрос.УстановитьПараметр("ТЗ", тз);
резЗапроса = Запрос.Выполнить();
выборка = резЗапроса.Выбрать();
Пока выборка.Следующий() Цикл
Сообщить(Строка(Выборка.Поле1) + "" + Строка(Выборка.Поле2));
КонецЦикла;
Показать
И не надо уверять, что, например, характеристика номенклатуры никогда не станет составным типом.
В общем, я рекомендую не пренебрегать "Выразить" для полей, что будут потом использоваться в условиях.
Ибо в боевой базе попадали на неприятные последствия.
Причем в реальных запросах все тоже далеко не так очевидно.
И потом были разборки типа "караул, запрос стал работать в n раз медленнее, я я точно ничего не трогал, сами можете убедиться".
Ну да. Прекрасная типизированная таблица. В чем проблема-то? Ну будет NULL на слове "Привет"...
И не надо уверять, что, например, характеристика номенклатуры никогда не станет составным типом.
Вы так сейчас договоритесь до того, что во ВСЕХ запросах придется использовать ВЫРАЗИТЬ()!!
Ну а вдруг со временем какое-то поле в таблице станет составным...
Вы так сейчас договоритесь до того, что во ВСЕХ запросах придется использовать ВЫРАЗИТЬ()
Это вы, конечно правы, надо сиё чудо не всегда, но забывать про такое не стоит.
А в моем пример, так и вообще Выразить для составного поля в тз must have should we could :)
Потому, что залезть в ТЗ и чей-то там поправить (можно неявно -добавили новый вид документа в обработку заполнения, выгрузили таб. часть в тз, чтобы чей-то там допилить кодом, и все, вроде как, работает, тесты проходит, а нагрузочное тестирование на каждый чих мало кто делает) куда как легче чем согласовать изменение структуры метаданных.
(9) Я выражаюсь на языке понятном нашим союзникам, например, китайцам. У нас же есть союзники, которые не знают русского, зато знают английский? :)
Правда, да, "язык НАТО" они точно не знают.