Какой запрос правильнее и какой обычно используете вы?

1. spezc 782 03.04.18 06:27 Сейчас в теме
Три запроса, позволяющие получить данные табчасти документа и его реквизитов.
Какой из этих запросов обычно вы напишите и какой по вашему мнению более православный (с точки зрения производительности, масштабируемости, феншуя)?

Запрос №1:
	Запрос.Текст = 
	"ВЫБРАТЬ
	|	ОприходованиеТоваровТовары.Номенклатура КАК Номенклатура,
	|	ОприходованиеТоваровТовары.Количество КАК Количество,
	|	ОприходованиеТоваровТовары.Цена КАК Цена,
	|	ОприходованиеТоваровТовары.Сумма КАК Сумма,
	|	ОприходованиеТоваровТовары.Ссылка.Склад КАК Склад,
	|	ОприходованиеТоваровТовары.Номенклатура.ВидНоменклатуры КАК ВидНоменклатуры
	|ИЗ
	|	Документ.ОприходованиеТоваров.Товары КАК ОприходованиеТоваровТовары
	|ГДЕ
	|	ОприходованиеТоваровТовары.Ссылка = &Ссылка";
Показать


Запрос №2:
	Запрос = Новый Запрос;
	Запрос.Текст = 
	"ВЫБРАТЬ
	|	ОприходованиеТоваровТовары.Номенклатура КАК Номенклатура,
	|	ОприходованиеТоваровТовары.Количество КАК Количество,
	|	ОприходованиеТоваровТовары.Цена КАК Цена,
	|	ОприходованиеТоваровТовары.Сумма КАК Сумма,
	|	ОприходованиеТоваров.Склад КАК Склад,
	|	СпрНоменклатура.ВидНоменклатуры КАК ВидНоменклатуры
	|ИЗ
	|	Документ.ОприходованиеТоваров.Товары КАК ОприходованиеТоваровТовары
	|		ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК СпрНоменклатура
	|		ПО ОприходованиеТоваровТовары.Номенклатура = СпрНоменклатура.Ссылка
	|		ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.ОприходованиеТоваров КАК ОприходованиеТоваров
	|		ПО ОприходованиеТоваровТовары.Ссылка = ОприходованиеТоваров.Ссылка
	|ГДЕ
	|	ОприходованиеТоваровТовары.Ссылка = &Ссылка";
Показать


Запрос №3:
	Запрос = Новый Запрос;
	Запрос.Текст = 
	"ВЫБРАТЬ
	|	ОприходованиеТоваровТовары.Номенклатура КАК Номенклатура,
	|	ОприходованиеТоваровТовары.Количество КАК Количество,
	|	ОприходованиеТоваровТовары.Цена КАК Цена,
	|	ОприходованиеТоваровТовары.Сумма КАК Сумма,
	|	ОприходованиеТоваров.Склад КАК Склад,
	|	СпрНоменклатура.ВидНоменклатуры КАК ВидНоменклатуры
	|ИЗ
	|	Документ.ОприходованиеТоваров.Товары КАК ОприходованиеТоваровТовары
	|		ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК СпрНоменклатура
	|		ПО ОприходованиеТоваровТовары.Номенклатура = СпрНоменклатура.Ссылка
	|			И (ОприходованиеТоваровТовары.Ссылка = &Ссылка)
	|		ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.ОприходованиеТоваров КАК ОприходованиеТоваров
	|		ПО ОприходованиеТоваровТовары.Ссылка = ОприходованиеТоваров.Ссылка
	|			И (ОприходованиеТоваровТовары.Ссылка = &Ссылка)";
Показать
По теме из базы знаний
Вознаграждение за ответ
Показать полностью

Как пишите и какой правильный.


Пишу 1, Правильный 1 (79.17%, 19 голосов)
79.17%
Пишу 1, Правильный 2 (4.17%, 1 голосов)
4.17%
Пишу 1, Правильный 3 (8.33%, 2 голосов)
8.33%
Пишу 2, Правильный 1 (0%, 0 голосов)
0%
Пишу 2, Правильный 2 (8.33%, 2 голосов)
8.33%
Пишу 2, Правильный 3 (0%, 0 голосов)
0%
Пишу 3, Правильный 1 (0%, 0 голосов)
0%
Пишу 3, Правильный 2 (0%, 0 голосов)
0%
Пишу 3, Правильный 3 (0%, 0 голосов)
0%

Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. DenisCh 03.04.18 06:36 Сейчас в теме
Зачем лезть в справочники, если потом не используешь?
Или у тебя в базе есть битые ссылки?
3. spezc 782 03.04.18 06:43 Сейчас в теме
(2) вы про запросы 2 и 3? в них я лезу в справочник Номенклатура, чтобы получить значение реквизита ВидНоменклатуры. Просто тут это в явном виде. В запросе 1 на самом деле точно такое же обращение будет, только его платформа сама допишет.
5. TODD22 18 03.04.18 07:33 Сейчас в теме
(3)
Просто тут это в явном виде. В запросе 1 на самом деле точно такое же обращение будет, только его платформа сама допишет.

Наверное надо смотреть в какие запросы будут преобразованы эти 3 варианта, а то как бы не оказалось что в итоге на СУБД будет выполнен один и тот же запрос, после преобразования.
7. spezc 782 03.04.18 07:35 Сейчас в теме
(5) ну в теории они и должны быть преобразованы в один и тот же запрос. но просто есть вероятность, при определенных условиях, вид запроса №1 который дойдет до БД может меняться.
4. dmt 66 03.04.18 07:09 Сейчас в теме
Пишу 1. Если производительность не устраивает переписываю.
корум; Bazil; nvv1970; +3 Ответить
8. TODD22 18 03.04.18 07:36 Сейчас в теме
А так делаю как в (4). Если не устраивает то переписываю.
6. ADirks 186 03.04.18 07:34 Сейчас в теме
Если рассматривать все три варианта, как они есть - то они конечно же идентичны.
Но всегда надо учитывать перспективы развития. Все неявности - это потенциальная угроза, и их надо избегать. Все ненужные повторы (это в варианте 3) - также потенциальная угроза.
9. spezc 782 03.04.18 07:36 Сейчас в теме
(6) ну как я чуть ваше ответил - они все-таки не идентичны.
10. nvv1970 03.04.18 07:41 Сейчас в теме
Точно не третий.
Условие в соединении (если СУБД не догадается внести условие в предикат) вынудит получить для мержа всю таблицу. И если у вас транзакция, то это или лишние s блокировки, или лишняя нагрузка на темп при rcsi. (Речь не про конкретно данный случай и mssql, а вообще про такой подход. Условия в ГДЕ - лучше, чем в соединении).
Что говорить.... Смотрите планы.

Первые два - без разницы. СУБД их выполнит одинаково.
Явные соединения нужны при составных типах. Остальное - нагрузка на руки и клавиатуру.
Писать нужно просто, чтобы код легко дорабатывался.

А для производительности - получите сертификат эксперта. Тогда все станет на свои места.
14. spezc 782 03.04.18 08:16 Сейчас в теме
(10) а отличие 2го и 3го - получается условие где накладывается вначале, а потом уже идет соединеие с другими таблицами?
15. nvv1970 03.04.18 08:19 Сейчас в теме
(14) нужно смотреть план запроса.
СУБД может не согласиться с задумками программиста или даже с самой 1с и сделать все по своему)) Мир полон неожиданностей)

Вообще, да. При первичном получении данных из индекса будут учтены только условия ГДЕ.
17. spezc 782 03.04.18 08:24 Сейчас в теме
(15) а, ну тогда вариант 3 точно лишний
11. pyrkin_vanya 488 03.04.18 07:45 Сейчас в теме
СУБД потом все равно преобразует этот запрос в SQL. В первом варианте это
    |    ОприходованиеТоваровТовары.Ссылка.Склад КАК Склад,
    |    ОприходованиеТоваровТовары.Номенклатура.ВидНоменклатуры КАК ВидНоменклатуры

будет дополнено к основному запросу левым соединением с таблицей склады и видом номенклатуры.
Остальные 2 лишняя нагрузка, третий вообще жесть. :)
Если нет никаких составных полей, то первый запрос норм. Если есть составные, то нужно использовать ВЫРАЗИТЬ.
12. t.v.s. 111 03.04.18 07:58 Сейчас в теме
Пишу так
   Запрос = Новый Запрос;
    Запрос.Текст = 
    "ВЫБРАТЬ
    |    ОприходованиеТоваровТовары.Номенклатура КАК Номенклатура,
    |    ОприходованиеТоваровТовары.Количество КАК Количество,
    |    ОприходованиеТоваровТовары.Цена КАК Цена,
    |    ОприходованиеТоваровТовары.Сумма КАК Сумма,
    |    ОприходованиеТоваров.Склад КАК Склад,
    |    СпрНоменклатура.ВидНоменклатуры КАК ВидНоменклатуры
    |ИЗ
    |    Документ.ОприходованиеТоваров КАК ОприходованиеТоваров 
    |    ЛЕВОЕ СОЕДИНЕНИЕ Документ.ОприходованиеТоваров.Товары КАК ОприходованиеТоваровТовары
    |        ПО ОприходованиеТоваровТовары.Ссылка = ОприходованиеТоваров.Ссылка
    |    ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК СпрНоменклатура
    |        ПО ОприходованиеТоваровТовары.Номенклатура = СпрНоменклатура.Ссылка
    |        
    |ГДЕ
    |    ОприходованиеТоваров .Ссылка = &Ссылка";
Показать
Infector; SlavaKron; +2 Ответить
13. VZyryanov 03.04.18 08:09 Сейчас в теме
ВНУТРЕННЕЕ СОЕДИНЕНИЕ работает быстрее, чем ЛЕВОЕ СОЕДИНЕНИЕ. Свои SQL базы проектирую так, чтобы не требовалось применять ЛЕВОЕ СОЕДИНЕНИЕ.
MariusUrsus; +1 Ответить
16. nvv1970 03.04.18 08:22 Сейчас в теме
(13) это не так. Все зависит от выбранного оператора соединения.
18. t.v.s. 111 03.04.18 08:33 Сейчас в теме
19. VZyryanov 03.04.18 08:46 Сейчас в теме
(18) Из жизненного опыта (Interbase. DB2, MS SQL).
24. пользователь 03.04.18 23:57
Сообщение было скрыто модератором.
...
20. plebedinskiy 50 03.04.18 09:56 Сейчас в теме
Мне кажется, что это простой пример, где прекрасно пройдет разыменование. И 1с разработчику удобно читать, и голову даю на отсечение, 1с справится с переводом этого запроса на SQL.
А вот давайте поговорим лучше про обращения к регистру накоплений с парочкой условий в самом регистре накоплений и условий на полученный результат. И мы тут замучаемся спорить)
21. spezc 782 03.04.18 10:16 Сейчас в теме
(20) конечно справится. только при условии того, что вы уверены, что сидит в поле номенклатура.
22. TODD22 18 03.04.18 10:43 Сейчас в теме
(21)А что там может быть кроме номенклатуры?
23. Vovan1975 13 03.04.18 12:45 Сейчас в теме
топикстартера повидимому Иван Белозерцев покусал.
корум; +1 Ответить
25. spezc 782 04.04.18 03:36 Сейчас в теме
(23) чур меня, тьфу тьфу тьфу, постучал по дереву
26. spezc 782 04.04.18 03:37 Сейчас в теме
(23) кстати, я же ни кого не лечу, просто самому интересна практика
27. МихаилМ 04.04.18 09:08 Сейчас в теме
(0)
замените внутренние соединение на левое.
triviumfan; +1 Ответить
28. triviumfan 93 08.04.18 22:52 Сейчас в теме
1. Зачем городить огород?
Если поле, к которому обращаюсь через "." ссылается на N таблиц, то использую соединение, либо через выразить. В остальных случаях не вижу проблем с обращением к таким полям, 1с интерпретирует как надо (https://its.1c.ru/db/metod8dev#content:2662:hdoc), это упрощает написание запросов, они становятся менее громоздкими и в следствие более читабельными.
Можно и несколько раз обращаться через точку, главное - чтобы это не было поле составного типа (а точнее - не ссылалось на N таблиц, ведь, если поле содержит, к примеру, ссылку или строку, то тут будет однозначность при обращении).
Vovan1975; +1 Ответить
29. пользователь 30.04.18 21:54
Сообщение было скрыто модератором.
...
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот