![]() |
|
Отличается план запроса и текст запроса в профайлере | ☑ | ||
---|---|---|---|---|
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
(ВЫРАЗИТЬ(ЗаказыКлиентов.Регистратор КАК Документ.ЗаказКлиента)).Дата КАК РегистраторДата ИЗ РегистрНакопления.ЗаказыКлиентов КАК ЗаказыКлиентов ГДЕ ЗаказыКлиентов.Регистратор ССЫЛКА Документ.ЗаказКлиента |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |