|
Запросы. Как лучше внутреннее соединение или подзапрос в условии? | ☑ | ||
---|---|---|---|---|
0
Puzoter
23.12.16
✎
09:53
|
Допустим, есть список договоров. В периодическом РС нужно отобрать накладные оформленные по договору из этого списка.
Есть три варианта: 1) внутреннее соединение списка договоров с "выбрать последние" 2) указать в параметрах виртуальной таблицы условие типа "Договор в (подзапрос к списку договоров)" 3) Указать условие в предложении "Где" - Договор в (подзапрос к списку договоров) Какой вариант предпочтительнее в плане быстродействия? |
|||
1
Cool_Profi
23.12.16
✎
09:55
|
1с не рекомендует соединяться виртуальным таблицам с поддзапросами..
|
|||
2
ERWINS
23.12.16
✎
09:56
|
я тестировал пару лет назад, баш на баш
|
|||
3
vi0
23.12.16
✎
10:12
|
выбранное решение может варьироватся в зависимость от объема данных, но общая рекомендация от 1с, что условия нужно пихать в условия виртуальной таблицы
|
|||
4
vi0
23.12.16
✎
10:13
|
протестируй разные варианты на своих данных
добавляй индексы и т.д. |
|||
5
mistеr
23.12.16
✎
10:43
|
(0) Если Договор это измерение в РС, то 2)
|
|||
6
pavlika
23.12.16
✎
10:50
|
||||
7
Vladal
23.12.16
✎
10:50
|
(1) Нерекомендацию в студию. Левое соединение с подзапросом - да, видел недавно.
|
|||
8
Vladal
23.12.16
✎
10:50
|
(6) О. она.
|
|||
9
Cool_Profi
23.12.16
✎
10:50
|
||||
10
Вафель
23.12.16
✎
10:51
|
постгре от соединения со срезом последних умрет 146%
|
|||
11
mistеr
23.12.16
✎
20:13
|
(9) А насколько это все актуально сейчас, кто может сказать? Со времен 8.0-8.1 оптимизатор скуля (да и других СУБД) шагнул вперед. В частности, с определением кардинальности подзапроса (из-за чего, как я понимаю, весь сыр-бор) справляется вроде неплохо.
|
|||
12
Cool_Profi
23.12.16
✎
20:34
|
(11) недавно переделал запрос по партиям в упп (поиск рулит)
Скорость возросла в 4 раза. |
|||
13
Лефмихалыч
23.12.16
✎
21:00
|
(0) запусти оба на практике, посмотри планы запроса и, который дешевле, тот и выбирай.
Но в общем случае, я бы подзапрос даже не рассматривал. |
|||
14
youalex
23.12.16
✎
22:50
|
(0) Статистика - рулит. В случае вложенного запроса - статистика может захромать, в случае темпов - нет.
|
|||
15
youalex
23.12.16
✎
22:53
|
+ в случае Внутренного соединения - можно писать просто СОЕДИНЕНИЕ. Ибо это - по JOIN по умолчанию
|
|||
16
mistеr
24.12.16
✎
00:46
|
(14) Статистика по временным таблицам всегда собирается автоматически?
|
|||
17
ТупойЖадный
24.12.16
✎
03:57
|
(12) Как лучше, внутреннее соединение или подзапрос в условии?
|
|||
18
youalex
24.12.16
✎
06:23
|
(16) полагаю, что дело тут не в "автоматически", а в том, что темпы по определению меньше живут (максимум в пределах одного сеанса), и статистика по ним просто не успевает деградировать. В 1С, где функционал темпов ограничен SELECT INTO и DROP TABLE (нет ни добавления ни обновления записей) - и подавно.
|
|||
19
ERWINS
24.12.16
✎
11:35
|
(16) полагаю что вообще не собирается
видел пример когда соединение вложенных запросов работало быстрее чем создание 2х временных таблиц и их соединение. причем именно из за статистики. |
|||
20
mistеr
24.12.16
✎
11:41
|
(18) Я имел в виду другое. После создания ВТ через ПОМЕСТИТЬ статистика у нее будет? Если данных в ней много и они скошенные, оптимизатор не может ошибиться так же, как с подзапросом?
|
|||
21
ERWINS
24.12.16
✎
11:51
|
(20) нет
|
|||
22
ERWINS
24.12.16
✎
11:51
|
статистики не будет
имя таблицы что то типа #673 |
|||
23
Cool_Profi
24.12.16
✎
12:08
|
(20) Будет статистика. Она создаётся при создании таблицы.
|
|||
24
youalex
24.12.16
✎
14:48
|
(20) Согласен с (23)
Немного заяндексил, наткнулся на любопытную статью: http://www.sql.ru/articles/mssql/2005/081301statisticsinsqlserver2005.shtml Сильно пока не вникал, но понятно, что статистика для темпов - есть) Упоминаются параметры БД AUTO_CREATE_STATISTICS и AUTO_UPDATE_STATISTICS |
|||
25
wertyu
24.12.16
✎
15:25
|
(6) Использование логического ИЛИ в условиях
а сами его используют в исправлении Получение данных через точку от полей составного типа |
|||
26
ERWINS
24.12.16
✎
15:31
|
(24)
ошибся может, спутал с табличными переменными, но когда смотрел планы запроса, они не зависели от содержания таблиц К тому же кеш планов запросов все равно работать не будет. а время компиляции запроса может быть больше работы с ним если там десяток строк http://billibook.blogspot.ru/2012/07/blog-post_21.html |
|||
27
vi0
24.12.16
✎
16:05
|
(25) Покажи пример где они ИЛИ используют
|
|||
28
vde69
24.12.16
✎
17:04
|
добавлю яда против ВТ
ВТ часто хромает неопределенным или сборным типом (например регистратор), в этом случае соединение с ВТ приводит к дополнительному соединения с таблицами метаданных и запрос умирает... а вот соединение с вложенным запросом не умирает... по этому при построении соединения запросе нужно понимать 2 вещи 1. все-ли типы параметров имеют явно приведённую типизацию 2. условие в соединение позволяет или нет использовать индексы все остальное - фигня, все эти рекомендации 1с (из 6) это для чайников... так сказать "общий случай" |
|||
29
youalex
24.12.16
✎
17:05
|
(26) Спасибо за ссылку, разложено всё грамотно, сжато и по существу. Из того, что понял, ну да, все так и есть) Интересно, что в личной оценке применимости табличных переменных - четко попал))
Но, мы немного уклонились, кажется. Спич не о том, как работают вт (свидетельствую - нормально работают), а о том, почему неэффективны вложенные запросы (коими являются все вирт. таблицы 1С). |
|||
30
youalex
24.12.16
✎
17:06
|
(28) *ВТ часто хромает неопределенным или сборным типом (например регистратор)*
Это никоим образом не является проблемой ВТ. Это проблема исключительно кривых рук. |
|||
31
vde69
24.12.16
✎
17:08
|
(30) это проблема когда все без разбора пихают в ВТ...
а когда руки прямые - глубоко пофиг что это будет ВТ или подзапрос... не надо увлекается ни одним ни другим, истина она где-то по середине... |
|||
32
youalex
24.12.16
✎
17:13
|
(31)
Доводы, которые вы привели, не имеют абсолютно никакого отношения к выбору между вт и вложенными запросами. Потому что - типизация - определяет текст запроса (количество соединений) - который построит платформа 1С при выполнении своего запроса (диалекта 1С) Это тема из другой оперы вроде как. *а когда руки прямые - глубоко пофиг что это будет ВТ или подзапрос... * Это да, потому что прямые руки всегда будут использовать наиболее эффективный способ. |
|||
33
youalex
24.12.16
✎
17:26
|
(32) + Касаемо т.н. разыменования полей, которое неминуемо превращается в проблему неявных соединений- я считаю это зло. Потому что РегистраторТочкаНомер - это зло. Разработчик должен четко понимать какие таблицы он цепляет в свой нетленный запрос и для чего.
|
|||
34
wertyu
24.12.16
✎
17:49
|
(27)
Запрос.Текст = "ВЫБРАТЬ | ВЫБОР | КОГДА Продажи.Регистратор ССЫЛКА Документ.РеализацияТоваровУслуг | ТОГДА ВЫРАЗИТЬ(Продажи.Регистратор КАК Документ.РеализацияТоваровУслуг).Номер | КОГДА Продажи.Регистратор ССЫЛКА Документ.ЗаказПокупателя | ТОГДА ВЫРАЗИТЬ(Продажи.Регистратор КАК Документ.ЗаказПокупателя).Номер | КОНЕЦ ВЫБОРА КАК Номер, | ВЫБОР | КОГДА Продажи.Регистратор ССЫЛКА Документ.РеализацияТоваровУслуг | ТОГДА ВЫРАЗИТЬ(Продажи.Регистратор КАК Документ.РеализацияТоваровУслуг).Дата | КОГДА Продажи.Регистратор ССЫЛКА Документ.ЗаказПокупателя | ТОГДА ВЫРАЗИТЬ(Продажи.Регистратор КАК Документ.ЗаказПокупателя).Дата | КОНЕЦ ВЫБОРА КАК Дата, | Продажи.Контрагент, | Продажи.Количество, | Продажи.Стоимость |ИЗ | РегистрНакопления.Продажи КАК Продажи |ГДЕ | Продажи.Регистратор ССЫЛКА Документ.РеализацияТоваровУслуг | ИЛИ Продажи.Регистратор ССЫЛКА Документ.ЗаказыПокупателя"; |
|||
35
vi0
24.12.16
✎
17:59
|
(34) я так полагаю это не все параметры и там будут еще условия по периоду и еще что-то, а это уже другая тема
|
|||
36
wertyu
24.12.16
✎
18:06
|
(35) есть текст, в нём противоречие, остальное домыслы
|
|||
37
youalex
24.12.16
✎
18:15
|
(34) лично я (имхо) - вместо выразить(.Номер) - сделал бы явные соединения с таблицами, и поле запроса было бы isnull(ДокРеализация.Номер, ДокЗаказ.Номер). Было бы гораздо нагляднее, что куда цепляется и что откуда берется. Жаль, что coalesce - 1с не умеет.
|
|||
38
wertyu
24.12.16
✎
18:18
|
(37) тут про ИЛИ в ГДЕ, одно исправили, а запрос не разбили:
Не следует использовать ИЛИ в секции ГДЕ запроса. Это может привести к тому, что СУБД не сможет использовать индексы таблиц и будет выполнять сканирование, что увеличит время работы запроса и вероянтность возникновения блокировок. Вместо этого следует разбить один запрос на несколько и объединить результаты. |
|||
39
vi0
24.12.16
✎
18:31
|
(36) этого текста мало
скорее всего это текст из отчета на СКД, и конечный запрос будет другой |
|||
40
wertyu
24.12.16
✎
18:39
|
(39) это конечный запрос
|
|||
41
vi0
24.12.16
✎
18:45
|
(40) если конечный, то в чем конкретно проблема?
не теоретически, а на рабочей базе какая проблема? |
|||
42
youalex
24.12.16
✎
18:49
|
(38) не очень понятно, причем здесь блокировки, это уже частный случай.
В целом - согласен, конечно. Опыт был, когда запрос с ИЛИ тупил, и банальное разбиение оного на ОБЪЕДИНИТЬ - ускорило выполнение в разы. Но, опять же, это не имеет отношения к теме. Если есть желание обсудить оптимальность запросов - можно затронуть непростую тему списков с отборами. |
|||
43
wertyu
24.12.16
✎
18:54
|
(41) (42) прочтите оба уже по ссылке из (6)
|
|||
44
youalex
24.12.16
✎
18:57
|
(43) Ссылка известная. Конкретизируйте пожалуйста свой пассаж.
|
|||
45
vi0
24.12.16
✎
18:57
|
(43) так я тебя не про теорию спрашивал, а в чем у тебя была проблема с этим запросом?
какое назначение этого запроса? |
|||
46
wertyu
24.12.16
✎
19:00
|
(44) (45) мы обсуждаем текст из (6), в котором противоречие
|
|||
47
youalex
24.12.16
✎
19:01
|
(46) В чем заключается это противоречие?
|
|||
48
vi0
24.12.16
✎
19:01
|
(46) ответа у тебя нет, я понял
|
|||
49
youalex
24.12.16
✎
19:03
|
(47) + наверное в этом: "Следует соединять друг с другом только объекты метаданных или временные таблицы."
Только - это ключевое слово. Похоже на то, что одинэсы реально упоролись со своим разыменованием |
|||
50
wertyu
24.12.16
✎
19:10
|
(49) я уже написал в чём противоречие, в одном месте указали как ошибку, в другом использовали как исправление
(48) ответа на что? есть методичка в (6), в ней ошибка, что тебе ещё объяснить? |
|||
51
vi0
24.12.16
✎
19:13
|
(50) в методичке сказано, что ИЛИ не позволит испоьлзовать индексы
а какие индексы предполагалось использовать в запросе (34) и предполагалось ли? |
|||
52
youalex
24.12.16
✎
19:15
|
(50) на этой странице есть четыре вхождения слова "противоречие" одно из них моё, это был вопрос. И три - ваши. Все три - без конкретики. Личн я не воспринимаю слово "противоречие" - как мантру, как заклятие, как молитву. Для меня это конкрентное слово с определенным смыслом. Хотелось бы, чтобы вы конкретизировали (или указали конкретный пост) - к чему вы это слово употребили.
|
|||
53
wertyu
24.12.16
✎
19:15
|
(51) а про это написано там же, но чуть выше в "Несоответствие индексов и условий запроса"
|
|||
54
wertyu
24.12.16
✎
19:16
|
(52) см (25)
|
|||
55
youalex
24.12.16
✎
19:16
|
(54) причем здесь противоречие???
|
|||
56
vi0
24.12.16
✎
19:17
|
(53) я и спрашиваю - предполагалось ли использовать индексы в этом запросе?
какую задачу решает этот запрос? |
|||
57
youalex
24.12.16
✎
19:17
|
(55) + это банальность. Вы же говорите о противоречии. Противоречие - Чего с чем?
|
|||
58
wertyu
24.12.16
✎
19:19
|
(55) в "Получение данных через точку от полей составного типа" они не разбили "правильный" запрос на два, как рекомендовали в "Использование логического ИЛИ в условиях"
|
|||
59
youalex
24.12.16
✎
19:26
|
(58) пока еще не сильно вдаваясь, но по примеру:
ВЫБРАТЬ Товар.Наименование ИЗ Справочник.Товары КАК Товар ГДЕ Артикул = "001" ИЛИ Артикул = "002"
Наглая ложь. Потому что ИЛИ деградирует план запроса только если оно касается РАЗНЫХ полей. Этот же запрос оптимизатор легко преобразует в Артикул В ('001', '002'). Все имеющиеся индексы будут задействованы. |
|||
60
youalex
24.12.16
✎
19:27
|
(58) конкретную цитату можете привести?
|
|||
61
wertyu
24.12.16
✎
19:35
|
(60) см (38)
|
|||
62
youalex
24.12.16
✎
19:38
|
(61) см (60)
|
|||
63
youalex
24.12.16
✎
19:42
|
(61) +
Я уже понял, что вы настойчиво отправляете нас к этой ссылке. Хотелось бы услышать, зачем вы это делаете, какую мысль вы пытаетесь донести. Непонятно. |
|||
64
wertyu
24.12.16
✎
19:44
|
(63) потому что я писал именно про неё
|
|||
65
youalex
24.12.16
✎
19:45
|
(64) Про неё? Она - это кто?
|
|||
66
wertyu
24.12.16
✎
19:46
|
(65) ссылка в (6)
|
|||
67
youalex
24.12.16
✎
19:47
|
(66) понятно. Твоя ссылка - г_вно.
|
|||
68
wertyu
24.12.16
✎
19:48
|
(67) это не моя ссылка, а 1с
|
|||
69
youalex
24.12.16
✎
19:50
|
(68) Ты эту ссылку привел, а значит эта ссылка - твоя. Ты на нее - сослался (вот тоже слово блин) как минимум.
|
|||
70
youalex
24.12.16
✎
19:56
|
(69)
+ я не вижу твоего мнения за этой ссылкой. Понятно, что одноэсы - рекомендуют, блин, использовать вт. Конечно рекомендуют. Потому что у них нет ни табличных переменных, ни боже спаси, табличных выражений. |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |