Устранение неявных преобразований типов в соединениях запросов 1С
- СУБД выполняет сканирование индекса (Index Scan) вместо точечного поиска (Index Seek) даже при наличии точного индекса.
- Высокая загрузка CPU при операциях соединения таблиц по строковым или составным полям.
- В планах SQL Server присутствует предупреждение
CONVERT_IMPLICITв секции Seek Predicate.
1. Суть проблемы неявного приведения типов
В платформе 1С поля ссылочного типа имеют строгую типизацию (UUID/Binary), а составные типы данных хранятся в виде нескольких колонок (тип + ссылка). Если в условии соединения сравниваются несовместимые типы (например, строка фиксированной длины Строка(10) и переменной Строка(неограниченная), либо число и строка), СУБД накладывает функцию приведения на каждую строку таблицы, полностью отключая использование индекса.
2. Типичная ошибка в коде запроса 1С
// НЕПРАВИЛЬНО: Соединение по полям разной длины или типов
ВЫБРАТЬ Заказ.Ссылка
ИЗ Документ.ЗаказКлиента КАК Заказ
ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК Ном
ПО Заказ.Комментарий = Ном.Наименование; // Комментарий - неограниченная строка!3. Исправление через явное приведение типов (ВЫРАЗИТЬ)
// ПРАВИЛЬНО: Приведение к фиксированной длине для использования индексов
ВЫБРАТЬ Заказ.Ссылка
ИЗ Документ.ЗаказКлиента КАК Заказ
ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК Ном
ПО ВЫРАЗИТЬ(Заказ.Комментарий КАК СТРОКА(150)) = Ном.Наименование;4. Соединение составных типов данных через проверку типа
// Ограничение составного типа до конкретной таблицы
ВЫБРАТЬ Движения.Сумма
ИЗ РегистрБухгалтерии.Хозрасчетный.ДвиженияССубконто КАК Движения
ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Контрагенты КАК Контр
ПО Движения.Субконто1 = Контр.Ссылка
И Движения.Субконто1 ССЫЛКА Справочник.Контрагенты; Частые вопросы (FAQ)
Что такое CONVERT_IMPLICIT в планах MS SQL?
Это внутреннее преобразование одного типа данных в другой по правилам приоритета типов SQL (например, VARCHAR в NVARCHAR), делающее невозможным быстрый поиск по B-Tree индексу.
Почему нельзя использовать поля неограниченной длины в соединениях?
Поля неограниченной длины (TEXT/NVARCHAR(MAX)) не могут быть проиндексированы стандартными B-деревьями и всегда приводят к полному сканированию таблицы.
Зачем указывать конструкцию 'ССЫЛКА Справочник.Имя' для составных типов?
Она позволяет платформе 1С отфильтровать только нужный тип метаданных на уровне SQL без выполнения тяжелых объединений (UNION) со всеми возможными таблицами типа.
Влияет ли регистр символов при сравнении строк на производительность?
Если база данных создана с регистрозависимой коллацией (CS), а запрос ищет без учета регистра через ВРЕГ(), индекс перестает работать.