Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 8 общая

Как исключить выполнение подзапроса из "ОБЪЕДИНИТЬ ВСЕ"

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

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

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


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

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



Если НадоУдалять Тогда
ТекстЗапроса = УдалитьСекциюСПараметром("&Флаг1")
Иначе
ТекстЗапроса = СтрЗаменить(ТекстЗапроса,"&Флаг1",Истина)
КонецЕсли
   vi0
 
10 - 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 млн
   Конструктор1С
 
13 - 18.08.20 - 12:12
(9) а зачем удалять? Достаточно в параметрах установить Ложь или Истина
   Конструктор1С
 
14 - 18.08.20 - 12:13
(2) сработает
   rudnitskij
 
15 - 18.08.20 - 12:56
(6) <code>Выбрать Т1.Поле1 как Поле ИЗ Т1
Где &ОтбиратьДанныеИзТ1</code>
и зачем там выбор? В параметр истину или ложь передавайте
   LLIaMaH
 
16 - 18.08.20 - 17:35
(15) да это сокращенная версия случая когда вместо ИСТИНА отбор какой то вставляется
   vi0
 
17 - 18.08.20 - 17:51
(11) чето я не понял тебя
кто мимо чего?
   Жан Пердежон
 
18 - 18.08.20 - 18:49
(17) то что спрашивал (4) в первой части обзора и как раз для этого случая (constant scan) все оптимизаторы ведут себя примерно одинаково;
у тебя же ссылка на вторую часть, а там в WHERE уже не совсем константа
   vi0
 
19 - 18.08.20 - 19:27
(18) ТС спрашивал про ГДЕ ложь, по ссылке рассматриваются т.н. бессмысленные условия типа WHERE 1 = 1
и я не пойму что ты несешь
   Жан Пердежон
 
20 - 18.08.20 - 19:52
(19) ну прочитай еще раз что ли, там они как раз НЕ рассматриваются, а упоминаются
   youalex
 
21 - 18.08.20 - 23:42
(2) >>Ну то есть он не пойдет шуровать по базе с проверкой каждой строки

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


Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.