Имя: Пароль:
1C
 
Немного занятного о получении представлении ссылки
0 H A D G E H O G s
 
05.03.25
16:07
Дня доброго.
Давненько тут не писал, но вот надо бы.

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

Есть у нас справочник на 10000 элементов с одним реквизитом
реквизит1, из которого берется представление в виде:

Процедура ОбработкаПолученияПолейПредставления(Поля, СтандартнаяОбработка)
	СтандартнаяОбработка=Ложь;
	Поля.Добавить("Реквизит1");
КонецПроцедуры


И есть у нас простой запрос вида:

ВЫБРАТЬ
	Справочник1.Представление КАК Представление
ИЗ
	Справочник.Справочник1 КАК Справочник1


отловив его через профайлер, мы увидим понятную картинку:

SELECT T1._Fld72
FROM dbo._Reference71 T1


но, поменяв вроде бы запрос на такой же:

ВЫБРАТЬ
	ПРЕДСТАВЛЕНИЕ(Справочник1.Ссылка) КАК Представление
ИЗ
	Справочник.Справочник1 КАК Справочник1


мы увидим вот такой запрос:

SELECT T2._Fld72
FROM dbo._Reference71 T1
LEFT OUTER JOIN dbo._Reference71 T2
   ON T1._IDRRef = T2._IDRRef


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

Смысл этого левого соединения очевиден - функция ПРЕДСТАВЛЕНИЕ() может быть применена не к реквизиту Ссылка, а, например, к реквизиту "Автор" другого справочника, а 1С поленилась сделать исключение для реквизита Ссылка.

Вот такие пироги на ровном месте бывают, я вот этого не знал.
1 mikecool
 
05.03.25
13:45
(0) про ссылку в конце не понял
перечитал еще пару раз и дошло ))
2 mikecool
 
05.03.25
13:35
+1 или реквизит1 - ссылочный тип?
3 H A D G E H O G s
 
05.03.25
13:39
(2) нет
4 H A D G E H O G s
 
05.03.25
13:43
(1)
Добавим в справочник реквизит Автор с типом Справочник.Пользователи. Выполним запрос

ВЫБРАТЬ
Справочник1.Ссылка,
Представление(Справочник1.Автор),
Представление(Справочник1.Ссылка)

чтобы получить представление автора Представление(Справочник1.Автор) - нужно к основной таблице пристегнуть таблицу Справочник.Пользователи.

чтобы получить представление ссылки Представление(Справочник1.Ссылка) - НЕ нужно к основной таблице пристегнуть таблицу Справочник.Справочник1.

Но 1С-ники не стали заморачиваться по 2 пункту и запилили универсально.
5 Garykom
 
гуру
05.03.25
13:43
(0) Теоретически СУБД должна такое сама разрулить
Просадок практически не будет, особенно с учетом левого и первичного ключа (который индексирован)
6 АНДР
 
05.03.25
16:08
(0) Покажи планы запроса
SELECT T2._Fld72
FROM dbo._Reference71 T1
LEFT OUTER JOIN dbo._Reference71 T2
   ON T1._IDRRef = T2._IDRRef
7 H A D G E H O G s
 
05.03.25
14:29
(6) 2 indexscan и merge
8 Волшебник
 
05.03.25
18:24
(0) и эти же люди запрещают нам использовать несколько точек в запросе!...