![]() |
![]() |
![]() |
|
v8: Запросы.Оптимальность. Получение реквизитов объектов через точку или... | ☑ | ||
---|---|---|---|---|
0
mr_K
18.06.12
✎
14:13
|
Как кошернее: получать значения реквизитов через точку, вызывая неявное соединение или же явно прописывать все необходимые соединения?
Например (простенько): В документе есть реквизит Контрагент, тип справочник Контрагенты. У справочника Контрагенты есть реквизиты ИНН и КПП. Как лучше: 1.Выбрать Док.Контрагент.ИНН ИЗ Документ.МойДок или 2.Выбрать Контрагент.ИНН ИЗ Документ.МойДокумент КАК МД Левое соединение Справочник.Контрагенты КАК МК ПО МД.Контрагент = МК.Ссылка ? Если сие обсуждалось, можно дать ссылку )) |
|||
1
H A D G E H O G s
18.06.12
✎
14:14
|
Пофиг
|
|||
2
acsent
18.06.12
✎
14:16
|
дак это одно и тоже
|
|||
3
Попытка1С
18.06.12
✎
14:19
|
Явно прописывать.
|
|||
4
Попытка1С
18.06.12
✎
14:19
|
Чтобы это понять нужно воспользоваться профайлером.
|
|||
5
mr_K
18.06.12
✎
14:20
|
Я в принципе так же считал. Но С.Арутюнов из УЦ1 на одном из последних курсов сильно меня удивил, сказав что правильный, с точки зрения оптимальности - только вариант 2. И типа на Специалисте с вариантом 1 можно серьезно погореть. Специалист меня не сильно интересует, а вот оптимальность... Объяснение было таково, что все неявные соединения для интерпретатора на сервере - зло.
(3) Во-во, почему? |
|||
6
Fragster
гуру
18.06.12
✎
14:21
|
а вдруг Док.Контрагент ТипВсеСсылки?
|
|||
7
Попытка1С
18.06.12
✎
14:22
|
(5) Чтобы тупая 1с не строила из себя оптимизатора, у нее это плохо выходит)
|
|||
8
mr_K
18.06.12
✎
14:22
|
(6) Т.е. интерпретатор именно на это расчитывает, цепляя все возможные таблицы? Не верю ))
А защититься - ставь выразить, если такое в принципе возможно |
|||
9
H A D G E H O G s
18.06.12
✎
14:24
|
(6) Это проблемы индейцев.
|
|||
10
H A D G E H O G s
18.06.12
✎
14:25
|
(6) Тем более есть ВЫРАЗИТЬ(), вместо всяких там заумных левых соединений.
|
|||
11
mr_K
18.06.12
✎
14:26
|
(7) Риторический вопрос конечно, но зачем же тогда такую возможность дали? Я когда только начинал писать в восьмерке, по sql-му строил запросы, т.е. вариант 2. Потом расчухал, что можно использовать 1 вариант, и по тихоньку отказался от более трудоемкого варианта. Теперь выясняется, что 1с даже в таких простых ситуациях плозой оптимизатор ))
Прям абидна, да?1! |
|||
12
H A D G E H O G s
18.06.12
✎
14:27
|
(11) Надо хорошо изучить 1С и обидно не будет.
|
|||
13
Попытка1С
18.06.12
✎
14:27
|
(11) Незнаю, я как увидел разыменования в восмерошных запросах мне дурно стало, превратили язык запросов в какую то херомантию, которая еще и тупит на ровном месте.
|
|||
14
pumbaEO
18.06.12
✎
14:28
|
(11) любой ORM работает неоптимально, но удобно.
|
|||
15
Ненавижу 1С
гуру
18.06.12
✎
14:28
|
(11) ага, еще Неопределено ввели
|
|||
16
Feanor
18.06.12
✎
14:28
|
(4) да не будет тебе в тягость :)
|
|||
17
Попытка1С
18.06.12
✎
14:28
|
Я по привычке написания запросов в sql все явно указываю, целее будет.
|
|||
18
H A D G E H O G s
18.06.12
✎
14:28
|
1С пишет запросы оптимально.
|
|||
19
Irbis
18.06.12
✎
14:28
|
Пока не напрягает, можно и не оптимизировать. А вот когда за одно место прижмёт, быстро поймёшь что оптимальный по быстродействию далеко не самый оптимальный по написанию.
|
|||
20
Fragster
гуру
18.06.12
✎
14:29
|
(9) да я вообще мимо проходил, чО
|
|||
21
Ненавижу 1С
гуру
18.06.12
✎
14:30
|
(18) что оптимальней INNER или LEFT JOIN, если известно, что результат одинаковый? (например ссылка NOT NULL)
|
|||
22
H A D G E H O G s
18.06.12
✎
14:30
|
Табличка, в составном поле которой могут быть и Контрагенты и Организации. Как писать запрос? Пройтись по табличке 1 раз, чтобы понять, какие есть там есть по факту типы значений и построить оптимальный запрос с левым соединением по нужным табличкам, либо сразу соединить все таблички? 1С выбрали 2 вариант.
|
|||
23
H A D G E H O G s
18.06.12
✎
14:31
|
(21) По логике то Left, по факту - не знаю.
|
|||
24
Ненавижу 1С
гуру
18.06.12
✎
14:31
|
(23) вот я слышал оба мнения, правда на разных СУБД
|
|||
25
Ненавижу 1С
гуру
18.06.12
✎
14:32
|
+(24) да, важно - поля индексированные
|
|||
26
mzelensky
18.06.12
✎
14:32
|
(0) помница посещал выездные курсы 1С (тогда ток-ток 8.2 в массы выходила). Там задавали похожий вопрос. Специалист 1С ответил так:
Сперва 1С-разработчики рекомендовали пользоваться вариантом "1" (через точку) - типа очень удобно стоить запросы, все ништяк, все тип-топ. Но сейчас они же говорят ,что более оптималь делать по методу "2" через конкретные соединения, чтобы СКЛ-запросы были более конкретными и точными... |
|||
27
Лефмихалыч
18.06.12
✎
14:35
|
буду пользоваться вариантом 1, пока явно не понадобится добыть эти 0.00005msec дополнительного прироста производительности. И идут они в жеппу, эти разработчики.
На кой хрен тогда вообще предметная ориентированность платформы и программирования в ней, если мы будем явно эти сцаные соединения писать. |
|||
28
mzelensky
18.06.12
✎
14:36
|
(27) скажи это разработчикам ОРАКЛА :)
|
|||
29
H A D G E H O G s
18.06.12
✎
14:37
|
(27) +500
|
|||
30
mr_K
18.06.12
✎
14:38
|
(26-27) Я вообще не вижу откуда разница может появиться. Вот поясните мне, уважаемые гуру, если в тексте есть разъиенование - то 1Ска при построении sql запроса включит необходимое количество соединений сама. Тоже самое она сделает, когда я сам пропишу соединения. Т.е. код, который отправится в СУБД - будет один и тот же, так почему вариант 1 - не оптимальный?
|
|||
31
H A D G E H O G s
18.06.12
✎
14:38
|
(25) Встречный вопрос.
Почему в УПП СЛУ решаются методом простых итераций при расчете себестоимости выпуска. |
|||
32
Лефмихалыч
18.06.12
✎
14:38
|
(28) 1С <> оракл, по этому пусть разработчики вприпрыжку несутся в указанном направлении со своими рекомендациями огондошивать на корню сопровождение кода этими простынями запросов
|
|||
33
H A D G E H O G s
18.06.12
✎
14:38
|
(30) Это надо спросить у Попытка1С
|
|||
34
mr_K
18.06.12
✎
14:40
|
(30+) Единственно, что в голову приходит, что если в запросе будет например Док.Контрагент.ИНН, Док.КОнтрагент.КПП, и еще несколько полей из КОнтрагента, то 1С может сдуру завигачить столько соединений, сколько полей в запросе, вместо одного. НО это уже вопрос к разработчикам.
|
|||
35
Попытка1С
18.06.12
✎
14:42
|
"то 1Ска при построении sql запроса включит необходимое количество соединений сама."
я лично сталкавался когда при указании через точку 1с джонила все что можно и все что нельзя, причем какого черта хрен поймешь, поэтому нафиг. |
|||
36
ЧашкаЧая
18.06.12
✎
14:42
|
(27) Концентрированная истина.
|
|||
37
H A D G E H O G s
18.06.12
✎
14:44
|
(35) Составной реквизит, или ЛюбаяСсылка (адскэй кошмар, вообще такой тип запретить)
|
|||
38
mr_K
18.06.12
✎
14:44
|
(35) однако....
тогда стоит учитывать |
|||
39
H A D G E H O G s
18.06.12
✎
14:45
|
(34) Фигня. Вот такой запрос будет
SELECT T2._Fld19, T2._Fld20 FROM _Document17 T1 WITH(NOLOCK) LEFT OUTER JOIN _Reference16 T2 WITH(NOLOCK) ON T1._Fld18RRef = T2._IDRRef |
|||
40
Попытка1С
18.06.12
✎
14:46
|
(38) Щас пример попробую найти.
|
|||
41
Попытка1С
18.06.12
✎
14:47
|
Просто 1сники ленивые не хотят думать, легче точку поставить и все дела)
|
|||
42
Лефмихалыч
18.06.12
✎
14:49
|
(41) скроее это следствие того, что кто-то в транслятор запросов сервера приложений костылей из быдлокода понаколотил
|
|||
43
Feanor
18.06.12
✎
14:49
|
(41) а чо тут ещё думать нада? О.о
|
|||
44
mr_K
18.06.12
✎
14:52
|
(39) В таком случае я не могу представить случая, когда будут цепляться лишние таблицы, и появится разница между 1 и 2.
(40) Ждемс )) У меня через стол сидят матерые sql-ки. Поначалу они сильно стебались над запросами и кодом на русском, но когда я им показал запрос с раъименованием, они как-то притихли. )) Видать завидуют черной завистью. На самом деле - есть мнение, что истина в (27). Может где-то и будет ИЗМЕРИМАЯ разница между 1 и 2, но в 99.(9)% случаев - она насколько мала, что ею можно смело пренебречь |
|||
45
mr_K
18.06.12
✎
14:53
|
(44+) А прописать все необходимые соединения в здоровенном пакетном запросе - ну его. Пускай 1С жужжит
|
|||
46
Попытка1С
18.06.12
✎
14:54
|
(44) Матерые sql-ки, 1сникам в принципе завидовать не могут)) имхо
|
|||
47
H A D G E H O G s
18.06.12
✎
14:54
|
(44) Утешь их тем, что тут нет приведения типов, выполняемого кода, временных таблиц в памяти и много чего еще.
|
|||
48
mr_K
18.06.12
✎
14:55
|
(47) Зачем? ))
|
|||
49
Serg_1960
18.06.12
✎
14:55
|
Сорри, может не в тему: прежде чем говорить об "оптимальности" - надо вспомнить про РЛС. Кто знает как оно работает при "явном" и "неявном" соединении? Профайлер? :)
|
|||
50
H A D G E H O G s
18.06.12
✎
14:55
|
(44) Спроси их, что быстрее inner или left join.
|
|||
51
Ненавижу 1С
гуру
18.06.12
✎
14:55
|
(31) а каким надо?
|
|||
52
H A D G E H O G s
18.06.12
✎
14:55
|
(51) Гаусса-Зеделя. Не?
|
|||
53
H A D G E H O G s
18.06.12
✎
14:56
|
Зейделя.
|
|||
54
Ненавижу 1С
гуру
18.06.12
✎
14:59
|
(52) покопался...
ну... не знали они про него - взяли первый какой вспомнили |
|||
55
Ненавижу 1С
гуру
18.06.12
✎
15:00
|
||||
56
H A D G E H O G s
18.06.12
✎
15:03
|
(54) Они взяли самый забавный метод.
|
|||
57
H A D G E H O G s
18.06.12
✎
15:04
|
Приближенный. Он конечно будет линейно сходиться, если он будет вообще сходится. А вот метод Гаусса имеет решение всегда.
|
|||
58
Ненавижу 1С
гуру
18.06.12
✎
15:07
|
(57) метод Гаусса не надо путать с методом Гаусса-Зейделя
первый очень тяжелый в вычислениях, второй хорош именно для разряженных матриц, но тоже может не сходиться |
|||
59
H A D G E H O G s
18.06.12
✎
15:08
|
Хотя нет, и Гаусса Зеделя - тоже приближенный.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |