Имя: Пароль:
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
    (ВЫРАЗИТЬ(ЗаказыКлиентов.Регистратор КАК Документ.ЗаказКлиента)).Дата КАК РегистраторДата
ИЗ
    РегистрНакопления.ЗаказыКлиентов КАК ЗаказыКлиентов
ГДЕ
    ЗаказыКлиентов.Регистратор ССЫЛКА Документ.ЗаказКлиента
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство. Фредерик Брукс-младший