Имя: Пароль:
1C
 
Отличается план запроса и текст запроса в профайлере
0 ДНН
 
01.06.20
17:17
Добрый день.
Если в профайлере отличается план запроса и текст запроса, то кому верить? В тексте запроса куча левых соединений, в плане запроса - одно.
Спасибо.
1 ДНН
 
01.06.20
17:30
Запрос простейший:

ВЫБРАТЬ ПЕРВЫЕ 10
    ЗаказыКлиентов.Регистратор.Дата КАК РегистраторДата
ИЗ
    РегистрНакопления.ЗаказыКлиентов КАК ЗаказыКлиентов
ГДЕ
    ЗаказыКлиентов.Регистратор ССЫЛКА Документ.ЗаказКлиента

В тексте запроса куча левых соединений со всеми видами регистраторов, в плане запроса только с таблицей заказов
2 H A D G E H O G s
 
01.06.20
17:31
Оптимизатор подумал за вас.
3 H A D G E H O G s
 
01.06.20
17:31
Хотя, странно.
4 H A D G E H O G s
 
01.06.20
17:32
В условиях соединения ничего нет?
5 ДНН
 
01.06.20
17:34
(4)  вроде есть что-то

exec sp_executesql N'SELECT TOP 10
CASE WHEN T1._RecorderTRef = 0x00007E39 THEN T2._Date_Time WHEN T1._RecorderTRef = 0x00007EC4 THEN T3._Date_Time WHEN T1._RecorderTRef = 0x000000E1 THEN T4._Date_Time WHEN T1._RecorderTRef = 0x00007DCB THEN T5._Date_Time WHEN T1._RecorderTRef = 0x000000D9 THEN T6._Date_Time WHEN T1._RecorderTRef = 0x0000010B THEN T7._Date_Time WHEN T1._RecorderTRef = 0x00011C30 THEN T8._Date_Time WHEN T1._RecorderTRef = 0x00007E3D THEN T9._Date_Time WHEN T1._RecorderTRef = 0x000000C2 THEN T10._Date_Time WHEN T1._RecorderTRef = 0x000000D1 THEN T11._Date_Time WHEN T1._RecorderTRef = 0x00007DC6 THEN T12._Date_Time ELSE CAST(NULL AS DATETIME) END
FROM dbo._AccumRg10156 T1
LEFT OUTER JOIN dbo._Document32313 T2
ON (T1._RecorderTRef = 0x00007E39 AND T1._RecorderRRef = T2._IDRRef) AND (T2._Fld547 = P1)
LEFT OUTER JOIN dbo._Document32452 T3
ON (T1._RecorderTRef = 0x00007EC4 AND T1._RecorderRRef = T3._IDRRef) AND (T3._Fld547 = @P2)
LEFT OUTER JOIN dbo._Document225 T4
ON (T1._RecorderTRef = 0x000000E1 AND T1._RecorderRRef = T4._IDRRef) AND (T4._Fld547 = @P3)
LEFT OUTER JOIN dbo._Document32203 T5
ON (T1._RecorderTRef = 0x00007DCB AND T1._RecorderRRef = T5._IDRRef) AND (T5._Fld547 = @P4)
LEFT OUTER JOIN dbo._Document217 T6
ON (T1._RecorderTRef = 0x000000D9 AND T1._RecorderRRef = T6._IDRRef) AND (T6._Fld547 = @P5)
LEFT OUTER JOIN dbo._Document267 T7
ON (T1._RecorderTRef = 0x0000010B AND T1._RecorderRRef = T7._IDRRef) AND (T7._Fld547 = @P6)
LEFT OUTER JOIN dbo._Document72752 T8
ON (T1._RecorderTRef = 0x00011C30 AND T1._RecorderRRef = T8._IDRRef) AND (T8._Fld547 = @P7)
LEFT OUTER JOIN dbo._Document32317 T9
ON (T1._RecorderTRef = 0x00007E3D AND T1._RecorderRRef = T9._IDRRef) AND (T9._Fld547 = @P8)
LEFT OUTER JOIN dbo._Document194 T10
ON (T1._RecorderTRef = 0x000000C2 AND T1._RecorderRRef = T10._IDRRef) AND (T10._Fld547 = @P9)
LEFT OUTER JOIN dbo._Document209 T11
ON (T1._RecorderTRef = 0x000000D1 AND T1._RecorderRRef = T11._IDRRef) AND (T11._Fld547 = P10)
LEFT OUTER JOIN dbo._Document32198 T12
ON (T1._RecorderTRef = 0x00007DC6 AND T1._RecorderRRef = T12._IDRRef) AND (T12._Fld547 = P11)
WHERE ((T1._Fld547 = P12)) AND ((T1._RecorderTRef = 0x000000D1))',N'P1 numeric(10),@P2 numeric(10),@P3 numeric(10),@P4 numeric(10),@P5 numeric(10),@P6 numeric(10),@P7 numeric(10),@P8 numeric(10),@P9 numeric(10),P10 numeric(10),P11 numeric(10),P12 numeric(10)',0,0,0,0,0,0,0,0,0,0,0,0
6 H A D G E H O G s
 
01.06.20
17:36
T1._RecorderTRef = 0x00007EC4
T1._RecorderTRef = 0x00011C30
T1._RecorderTRef = 0x000000D1

Ну вот за тебя и подумали
7 H A D G E H O G s
 
01.06.20
17:37
Но я бы не надеялся на это и сделал через ВЫРАЗИТЬ()
8 ДНН
 
01.06.20
17:45
(7) SQL запрос формирует платформа 1С? То есть когда я добавляю ВЫРАЗИТЬ 1С сама откинет лишние таблицы?
9 ДНН
 
01.06.20
17:46
То есть в профайлере SQL запрос всегда совпадает с тем, который сформировала платформа 1С, а уже оптимизатор может поправить его для выполнения?
10 fisher
 
01.06.20
17:50
(8) Да. Основное назначение ВЫРАЗИТЬ - как раз в этом.
(9) Текст запроса - это декларация того, какой в итоге должен получиться результат. А вовсе не то, как он должен достигаться. Для многих это открытие. Хотя часто одно действительно довольно похоже на другое.
План выполнения запроса - это именно схема действий, которые СУБД решила выполнить чтобы достичь этого результата. И "решалка" у нее довольно продвинутая. Делать СУБД будет именно то, что показывает в плане выполнения.
11 VladZ
 
01.06.20
17:53
(0) Смешной вопрос: "Кому верить".
Сервер 1с, по твоему, обладает ИИ или у него есть чувство юмора?

Что программист написал - то сервер 1с и транслировать в запрос к базе.
12 ДНН
 
01.06.20
17:56
(7) (10) спасибо
13 Cthulhu
 
01.06.20
19:16
точки виноваты...
14 ДенисЧ
 
01.06.20
19:17
(1) В тексте запроса я не вижу вообще соединений... Черепашка?
15 H A D G E H O G s
 
01.06.20
20:17
(14) ага
16 palsergeich
 
01.06.20
20:24
(0) Сервер 1с всего лишь переводит со своего языка на диалект SQL.
Причем делает это в лоб, без всяких оптимизаций и ТД.
В конкретно в этом примере - поле составного типа - это абстракция уровня 1с, в терминах SQL нет такого понятия, там тупо 3 колонки.
Вот именно этим и занимается сервер 1с - с абстракции 1с переводит на уровень SQL.
Эти 3 колонки являются ключем записи в какой то таблице и сервер, что бы ничего не потерять, соединяется со всеми возможными таблицами типов этих колонок.
Единственное, как это можно органичить - Выразить. Это прямой приказ не думать, а соединиться только с чем то конкретным
17 Mikeware
 
01.06.20
20:25
(14) что за ЧерепПашка?
(0) как вариант -
ВЫБРАТЬ ПЕРВЫЕ 10
//    ЗаказыКлиентов.Регистратор.Дата КАК РегистраторДата
    ДокЗаказ.Дата КАК РегистраторДата

ИЗ
    РегистрНакопления.ЗаказыКлиентов КАК ЗаказыКлиентов
Внутреннее соединение Документ.ЗаказКлиента как ДокЗаказ по ДокЗаказ.Ссылка=ЗаказыКлиентов.Регистратор

//ГДЕ
//    ЗаказыКлиентов.Регистратор ССЫЛКА Документ.ЗаказКлиента
УПОРЯДОЧИТЬ ПО ...
18 palsergeich
 
01.06.20
20:26
(17) Тоже годный вариант.
19 Mikeware
 
01.06.20
20:27
(18) а Выразить() вочо выразится?
20 palsergeich
 
01.06.20
20:27
Но в типовых есть регистр ДанныеПервичныхДокументов.
Можно с ним соединится и получить оттуда дату)
21 palsergeich
 
01.06.20
20:28
(19) В один лефт джойн.
Или несколько при использовании конструкции Выбрать когда...
22 Mikeware
 
01.06.20
20:29
(20) где вообще про идеологию типовых почитать?
а то от этих механизЪмов уже крыша едет...
23 Mikeware
 
01.06.20
20:31
(21) но тогда будет левое соединение и отбор. что быстрее - левое, и отбор, или внутреннее?
24 ДенисЧ
 
01.06.20
20:32
(22) Почитай отца своего^W^W
Сорри... Учебник Корсакова С.С. почитай
25 palsergeich
 
01.06.20
20:34
(23) В таких простых случаях - разница на уровне погрешности.
Но внутреннее приводит к потере данных в левой таблице, а левое нет.
По этому сервер и пихает левое.
Я предпочитаю внутреннее, но и Выразить не брезгую, в каждом конкретно случае по разному
26 Mikeware
 
01.06.20
20:37
(24) так я лишь узнаю причину, почему они так писали. Может, из учебника Н.Н.Иванца  я узнаю, что их побудило так писать.
Но хочу-то я разобраться в том, что они написали... Мне не важна причина, мне важен результат...
27 Mikeware
 
01.06.20
20:39
(25) сенкс.
28 Cyberhawk
 
01.06.20
21:43
(14) Как это не видишь, вот же: Регистратор.Дата
29 Ёпрст
 
гуру
01.06.20
23:24
(28) вот что продажа СП делает с человеком! Продал лишнего
30 Ненавижу 1С
 
гуру
02.06.20
07:20
ВЫБРАТЬ ПЕРВЫЕ 10
    (ВЫРАЗИТЬ(ЗаказыКлиентов.Регистратор КАК Документ.ЗаказКлиента)).Дата КАК РегистраторДата
ИЗ
    РегистрНакопления.ЗаказыКлиентов КАК ЗаказыКлиентов
ГДЕ
    ЗаказыКлиентов.Регистратор ССЫЛКА Документ.ЗаказКлиента