Вход | Регистрация
 

Отличается план запроса и текст запроса в профайлере

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

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

В тексте запроса куча левых соединений со всеми видами регистраторов, в плане запроса только с таблицей заказов
   H A D G E H O G s
 
2 - 01.06.20 - 17:31
Оптимизатор подумал за вас.
   H A D G E H O G s
 
3 - 01.06.20 - 17:31
Хотя, странно.
   H A D G E H O G s
 
4 - 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
   H A D G E H O G s
 
6 - 01.06.20 - 17:36
T1._RecorderTRef = 0x00007EC4
T1._RecorderTRef = 0x00011C30 
T1._RecorderTRef = 0x000000D1

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

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

    ДокЗаказ.Дата КАК РегистраторДата

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

//ГДЕ

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


Список тем форума
 
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Тема не обновлялась длительное время, и была помечена как архивная. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.