Имя: Пароль:
1C
1С v8
Как исключить выполнение подзапроса из "ОБЪЕДИНИТЬ ВСЕ"
,
0 LLIaMaH
 
18.08.20
10:14
Общий вопрос про запросы. Может кто знает какую хитрость. Есть объединение запросов. Хочу некоторые запросы исключить из общего запроса при разных настройках и отборах, что бы в интересах производительности исключить в принципе обращение к ненужным данным. Обычно я делал сборку текста запроса из кусков, но это жутко не удобно для отладки и редактирования текста запроса в конструкторе и консоли, не то чтобы я не мог это все сделать просто редактирую текст запроса руками, но хотелось бы что бы текст был одной простыней. Есть ли какой то хитрый хинт который позволял бы это сделать, например передав просто параметр в запрос

Выбрать Т1.Поле1 как Поле ИЗ Т1
Объединить все
Выбрать Т2.Поле2 ИЗ Т2
Объединить все
Выбрать Т3.Поле3 ИЗ Т3

Как сделать так чтобы текст остался целым, но обращение к Т2 при выполнении запроса не происходило или происходило, но без выборок и прочего, может чего хитрого в ГДЕ написать или еще как.
1 Ёпрст
 
18.08.20
10:17
ГДЕ Ложь
2 LLIaMaH
 
18.08.20
10:19
(1) А точно сработает? Ну то есть он не пойдет шуровать по базе с проверкой каждой строки на просто ЛОЖЬ.
3 Ёпрст
 
18.08.20
10:21
(2) какой строке ?
4 LLIaMaH
 
18.08.20
10:28
Я просто не понимаю принци работы такогой конструкции, я начитался всякого про оптимизацию и приципы но могу и приврать в своих рассуждениях, скажем если мы выбираем таблицу, ГДЕ нет, СУБД просто помещает всю таблицу в выборку, если ГДЕ есть и отбор по индексированному реквизиту, то выполняется ИндекСеек или ИндекСкан, если в ГДЕ неидексированный реквизит то просто начинается полный скан таблицы, а что происходит в случае если в ГДЕ стоит ЛОЖЬ? Я протестировал на таблице с 10 миллионами документов Консоль показывает какито затраты на запрос но это в пределах погрешности.
5 бомболюк
 
18.08.20
10:38
не нравится ГДЕ Ложь - делай ВЫБРАТЬ ПЕРВЫЕ 0
6 LLIaMaH
 
18.08.20
10:51
(5) не, не пойдет "ВЫБРАТЬ Первые &Кол" не работает, чтобы вставить 0 выходит придется из кусков запрос собирать.


с хинтом в ГДЕ можно так написать:

Выбрать Т1.Поле1 как Поле ИЗ Т1
Где Выбор Когда &ОтбиратьДанныеИзТ1 Тогда ИСТИНА Иначе Ложь Конец
7 LLIaMaH
 
18.08.20
10:54
+(6) ну то есть написать всю простыню в одном месте, тестировать, отлаживать, редактировать в конструкторе, копировать туда сюда удобно, просто добавить установку лишнего параметра в запросе.
8 Жан Пердежон
 
18.08.20
10:59
можно еще со схемой запроса по*работать
9 vde69
 
18.08.20
11:04
где &Флаг1



Если НадоУдалять Тогда
ТекстЗапроса = УдалитьСекциюСПараметром("&Флаг1")
Иначе
ТекстЗапроса = СтрЗаменить(ТекстЗапроса,"&Флаг1",Истина)
КонецЕсли
10 vi0
 
18.08.20
11:18
(4) как говорится, зависит от
статья от 2017 про разные субд
https://javarush.ru/groups/posts/331-kljevihe-optimizacii-sql-ne-zavisjajshie-ot-stoimostnoy-modeli-chastjh-2
11 Жан Пердежон
 
18.08.20
11:36
(10) немного мимо - там про константы в первой части и вроде как все оптимизаторы справляются
12 Ёпрст
 
18.08.20
11:59
(4) меньш читай всякого. открой уже qa и посмотри реальный план выполнения данного запроса, 0ms если че, на табличке в 132 млн
13 Конструктор1С
 
18.08.20
12:12
(9) а зачем удалять? Достаточно в параметрах установить Ложь или Истина
14 Конструктор1С
 
18.08.20
12:13
(2) сработает
15 rudnitskij
 
18.08.20
12:56
(6) <code>Выбрать Т1.Поле1 как Поле ИЗ Т1
Где &ОтбиратьДанныеИзТ1</code>
и зачем там выбор? В параметр истину или ложь передавайте
16 LLIaMaH
 
18.08.20
17:35
(15) да это сокращенная версия случая когда вместо ИСТИНА отбор какой то вставляется
17 vi0
 
18.08.20
17:51
(11) чето я не понял тебя
кто мимо чего?
18 Жан Пердежон
 
18.08.20
18:49
(17) то что спрашивал (4) в первой части обзора и как раз для этого случая (constant scan) все оптимизаторы ведут себя примерно одинаково;
у тебя же ссылка на вторую часть, а там в WHERE уже не совсем константа
19 vi0
 
18.08.20
19:27
(18) ТС спрашивал про ГДЕ ложь, по ссылке рассматриваются т.н. бессмысленные условия типа WHERE 1 = 1
и я не пойму что ты несешь
20 Жан Пердежон
 
18.08.20
19:52
(19) ну прочитай еще раз что ли, там они как раз НЕ рассматриваются, а упоминаются
21 youalex
 
18.08.20
23:42
(2) >>Ну то есть он не пойдет шуровать по базе с проверкой каждой строки

емнип, в t-sql (ms sql) - если в условии будут литералы (where 1=0) - не "пойдет".
А если переменная (declare t tinyint = 1 ... where t = 0) - то "пойдет"
Есть два вида языков, одни постоянно ругают, а вторыми никто не пользуется.