|
Как правильнее сделать этот простой запрос? И почему | ☑ | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0
D_Pavel
05.12.12
✎
06:55
|
Запрос упростил для понятности, на самом деле он гораздо больше.
Первый вариант: ВЫБРАТЬ
Второй: ВЫБРАТЬ
Третий: ВЫБРАТЬ
|
||||||||||||||||
1
Sammo
05.12.12
✎
06:59
|
В первом варианте не левое, а внутреннее
Третий в любом случае будет скулем преобразован в первый Второй чушь, имхо |
||||||||||||||||
2
D_Pavel
05.12.12
✎
07:07
|
Точно в первом внутреннее? Мне такой запрос поставщик дал как образец.
|
||||||||||||||||
3
D_Pavel
05.12.12
✎
07:12
|
Третий точно будет не дольше чем первый? Не будет на каждую запись из ТЧ выбираться каждый раз заново запись из таблицы документов? 100%?
И чем второй плох? Дополнительный отбор по дате не уменьшит количество выбранных во второй таблице записей и не ускорит? |
||||||||||||||||
4
Sammo
05.12.12
✎
07:16
|
При обращении ПриходнаяТТНТовары.Ссылка.Дата скуль добавит соединение с таблицей Документ.ПриходнаяТТН. Т.е. первый вариант - это просто вариант, который в явном виде даст скулю понять, что нужно сделать.
Во втором варианте на Документ.ПриходнаяТТН дважды накладывается одно и то же условие. Зачем? |
||||||||||||||||
5
D_Pavel
05.12.12
✎
07:23
|
(4) А если выбирать не только ПриходнаяТТНТовары.Ссылка.Номер, но и ПриходнаяТТНТовары.Ссылка.Клиент, и ПриходнаяТТНТовары.Ссылка.Склад, и другие поля, скуль не будет на каждое поле добавлять соединение с таблицей Документ.ПриходнаяТТН?
Во втором варианте условие накладывается на разные выборки. Как если бы выбрали из таблицы Документ.ПриходнаяТТН два раза с разными условиями. Я же во втором условии могу другие даты указать. |
||||||||||||||||
6
rs_trade
05.12.12
✎
07:25
|
(0) смотри планы запросов и все понятно будет.
|
||||||||||||||||
7
D_Pavel
05.12.12
✎
07:26
|
(6) это не ответ.
|
||||||||||||||||
8
D_Pavel
05.12.12
✎
07:26
|
Короче нужно использовать третий вариант и не париться?
|
||||||||||||||||
9
mzelensky
05.12.12
✎
07:56
|
(8) первый вариант рабочий в том случае, когда тебе надо выбрать шапку документа, а тч дока пустая!
Если тч дока пустая, то третий запрос ничего не даст, а первый вернет шапку (но ток в случае левого соединения. Если будет внутреннее, то тоже ничего не даст) Поэтому тут вопрос в том, как это применять! |
||||||||||||||||
10
mzelensky
05.12.12
✎
07:57
|
(8) ток я бы опять таки поменял местами Табличы в первом запросе. Т.е. не шапку к ТЧ цеплял ,а наоборот ТЧ к шапке.
|
||||||||||||||||
11
D_Pavel
05.12.12
✎
08:05
|
(10) То есть правое соединение?
|
||||||||||||||||
12
rs_trade
05.12.12
✎
08:10
|
(7) это нормальный подход специалиста.
|
||||||||||||||||
13
mzelensky
05.12.12
✎
08:22
|
(11) если сделаешь в конструкторе, то система все-равно перекрутит все на левое соединение!
А вообще я же уже сказал - тут все зависит от задачи! Нужна тебе шапка без в случае пустой ТЧ это один запрос. Нужна шапка ТОЛЬКО при наличии заполненой ТЧ это другой запрос. А еще может быть шапка + 2 объединенные ТЧ (например товары и услуги) - это уже третий запрос! |
||||||||||||||||
14
D_Pavel
05.12.12
✎
08:22
|
(12) Вопрос задан конкретный, а ответ не по теме. Я же не спрашивал "Как мне научиться правильно работать?"
|
||||||||||||||||
15
ЧашкаЧая
05.12.12
✎
08:25
|
1) Смотря от задачи как (13) сказал.
2) Имхо, бред 3) То же что и 1) только он преобразуется во внутренее соединение. И кстати по возможности лучше делать левое (если это не противоречит логике алгоритма) чем внутреннее. |
||||||||||||||||
16
D_Pavel
05.12.12
✎
08:28
|
(13) Если в конструкторе, то да.
Мне нужна шапка ТОЛЬКО при наличии заполненой ТЧ. Но вопрос в том, как на быстродействии отразится то что я во втором запросе сделал дополнительное условие на вторую таблицу. А в третьем таблицу документов выбираю через тчасть, это не увеличит выборку реквизитов документа если в тчасть будет много записей? |
||||||||||||||||
17
dmpl
05.12.12
✎
08:33
|
(3) 3-й вариант даже быстрее первого может быть, ведь в его случае гарантированно сработает оптимизация, т.к. система знает, что ты от нее хочешь. Особенно это заметно будет в случае километровых запросов, когда автооптимизация может и не сработать после определенного предела косяков.
(12) Специалист не надеется на какие-то планы, которые, к тому же, могут поменяться как при обновлении платформы, так и при обновлении SQL. |
||||||||||||||||
18
dmpl
05.12.12
✎
08:46
|
А вообще, 1-й вариант лучше делать так:
Это на случай, если оптимизация не сработает, и сначала выполнится соединение по всем документам, и только потом будет наложено условие на период. Плюс чем меньше реквизитов выбираешь - тем быстрее работает запрос. А при большой выборке (когда запрос хотя бы секунду исполняется) будет лучше
Оговорка про большую выборку связана с тем, что создание временной таблицы по времени довольно затратно (0,2-0,3 с независимо от ее размера), а потому, например, в обработчике ПриПолученииДанных() или ПриВыводеСтроки() запросы с временными таблицами лучше не использовать. Свой вариант. |
||||||||||||||||
19
mzelensky
05.12.12
✎
08:47
|
(16) как говорил представитель 1С на выездном тренинге - разработчки 8.1 рекомендовали делать доступ к шапке через ТЧ. Разработчики 8.2. рекомендуют отдельно выбирать шапку, отдельно ТЧ и потом соединять. НО тут много зависит от версии базы (серверная или файловая. Если серверная, то от конкретной СУБД) + от тех данных, которые выбираются запросом!
В общем они сами не знают как лучше...уж больно субъективный момент - каждый запрос это частный случай. Поэтому я не сильно заморачиваюсь и если шапка нужна ток при наличии ТЧ - делаю через ТЧ с точкой |
||||||||||||||||
20
mzelensky
05.12.12
✎
08:49
|
(18) а на сколько критично еще и уничтожение временной таблицы???
Ведь они накапливаются во временной базе скуля. Если делать в конце запроса "Уничтожить ВТДокументы" - данные из темповской базы будут удаляться? |
||||||||||||||||
21
mzelensky
05.12.12
✎
08:50
|
|||||||||||||||||
22
dmpl
05.12.12
✎
08:51
|
(20) А вот фиг знает. По логике, если не создаешь МенеджерВременныхТаблиц, то все временные таблицы должны автоматом уничтожаться после выполнения запроса (ведь дальше их использовать невозможно). А при наличии МенеджерВременныхТаблиц - при вызове деструктора этого самого менеджера. Только вот кто знает, когда он вызывается, и вызывается ли вообще.
|
||||||||||||||||
23
mzelensky
05.12.12
✎
08:54
|
(22) просто я стараюсь в запросах удалять временные таблицы. Т.е. создал таблицу, отработал ее и в самом конце запроса удаляю ее...вот думаю нужно это делать или нет.
|
||||||||||||||||
24
dmpl
05.12.12
✎
08:54
|
(23) Ну, хуже-то не будет.
|
||||||||||||||||
25
D_Pavel
05.12.12
✎
09:08
|
(21) Почитал.
Буду использовать третий вариант. Пусть будет как будет. |
||||||||||||||||
26
D_Pavel
05.12.12
✎
09:15
|
Еще вопрос.
Как лучше? ПриходнаяТТНТовары.Товар КАК Номенклатура Или ПриходнаяТТНТовары.Товар.Ссылка КАК Номенклатура |
||||||||||||||||
27
mzelensky
05.12.12
✎
09:17
|
по мне лучше явно:
ПриходнаяТТНТовары.Товар.Ссылка КАК Номенклатура т.к. была у меня проблема при использовании "ВЫРАЗИТЬ". после этого если нужна ссылка всегда явно указываю! |
||||||||||||||||
28
mzelensky
05.12.12
✎
09:18
|
(27) по крайней мере если писпользуешь в выборке
т.е. Выбрать ПриходнаяТТНТовары.Товар Можно и так А вот если делаешь соединения по этому полю, то наверное лучше все-таки ПриходнаяТТНТовары.Товар.Ссылка КАК Номенклатура |
||||||||||||||||
29
D_Pavel
05.12.12
✎
09:32
|
Спасибо
|
||||||||||||||||
30
SUA
05.12.12
✎
09:50
|
ПриходнаяТТНТовары.Товар.Ссылка
подтянет еще одну таблицу (номенклатуры, если не составной тип) - нафига? |
||||||||||||||||
31
Sammo
05.12.12
✎
09:53
|
(26) Если ПриходнаяТТНТовары.Товар простой тип, то лучше брать просто его.
Если составной, включая примитивные типы, то вместо ПриходнаяТТНТовары.Товар, имхо, лучше выразить как нужный тип |
||||||||||||||||
32
sergeante
05.12.12
✎
10:19
|
лучше всего конечно ПриходнаяТТНТовары.Товар.Ссылка.Ссылка.Ссылка для надёжности, да
|
||||||||||||||||
33
МихаилМ
05.12.12
✎
10:23
|
при обращении к таблице тч
1с все равно делает джоин с таблицей документа. но в будущем могут и исправить. 3. |
||||||||||||||||
34
Sammo
05.12.12
✎
10:24
|
+31 Всегда обращение через точку - join с таблицей. Особенно пикантно получается, если тип реквизита составной с ДокументСсылка
|
||||||||||||||||
35
Лефмихалыч
05.12.12
✎
10:31
|
результат одинаковый, по этому выбирать надо тот запрос, которые читабельнее и понятнее. Конечно есть исключения - когда доказано, что нечитабельный вариант дает ощутимый прирост производительности
3. |
||||||||||||||||
36
cw014
05.12.12
✎
10:32
|
Ибо на первые два сервер создаст еще по 2 временные таблицы, на последнем - только 1
3. |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |