|
насколько недопустимо делать такие условия соединения? | ☑ | ||
---|---|---|---|---|
0
КошерныйТролль
17.02.14
✎
18:57
|
База скульная.
Есть многоэтажный запрос с временными таблицами. Если параметр1 равен Ложь, то часть запросов нужна с пустым результатом, иначе с нормальным. Пример: Таб.поле1, Таб.Поле... Внутреннее Соединение РегистрСведениий.Паппап как Таб2 По (&Параметр1 = Истина) И УсловияСоединенияТаблиц... Скуль поймет оптимально, что при Параметр1=Ложь соединять, собственно, нечего? Или тупо будет соединять таблицы? |
|||
1
viktor_vv
17.02.14
✎
19:00
|
Не знаю как с соединениями, но в ГДЕ такую штуку оптимально понимает.
|
|||
2
КошерныйТролль
17.02.14
✎
19:00
|
Так то тестил по времени, разница огромная, вроде скуль понимает....
|
|||
3
МихаилМ
17.02.14
✎
19:03
|
такие запросы не сохраняются в кэше планов запросов.
и что мешает проверить : соберите статистику технологического журнала с планом выполнения. |
|||
4
Torquader
17.02.14
✎
19:04
|
А смысл этого ?
Не проще ли вообще тело запроса править вместо того, чтобы параметр вводить ? |
|||
5
КошерныйТролль
17.02.14
✎
19:05
|
(3) в данной ситуации это мне и не нужно. Формирую запросом набор записей для регистра.
|
|||
6
КошерныйТролль
17.02.14
✎
19:06
|
(4) смысл в том, что или писать три страницы кода с копроразбором текста запроса или так.
|
|||
7
Torquader
17.02.14
✎
19:12
|
(6) Тогда пиши ГДЕ (&Параметр=Истина) и будет лучше.
|
|||
8
Лефмихалыч
17.02.14
✎
19:16
|
(0) лучше разные тексты запросов формировать. Особенно, если эти, которые пустыми нужны, являются временными таблицами, поскольку тогда условие на параметр надо в них тоже засовывать, а это геморрой с кулак при сопровождении.
Еще можно быть мужиком, юзать СКД с необязательными соединениями и просто не включать ненужные поля. Но это надо стальные яйцы |
|||
9
КошерныйТролль
17.02.14
✎
19:38
|
(8) дык если скуль понимает, то смысл дублировать и поддерживать разные тексты запросов?
|
|||
10
КошерныйТролль
17.02.14
✎
19:39
|
(7) это скуль стопудово понимает и забивает на все соединения с таблицами?
|
|||
11
КошерныйТролль
17.02.14
✎
19:40
|
Надо по ходу на форуме скульщиков такой ворос задавать...
|
|||
12
КошерныйТролль
17.02.14
✎
20:08
|
Задал вопрос скульщикам.... вдруг, смеяться не будут :-)
http://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1077939&msg=15579375 |
|||
13
МихаилМ
17.02.14
✎
20:08
|
(11)
только не пишите, что 1с-ник. не уважают 1-ников тру прогерры. |
|||
14
МихаилМ
17.02.14
✎
20:11
|
(12)
для современных субд это равносильный запрос. а для vs sql 2000 - 1 вариант предпочтительней |
|||
15
КошерныйТролль
17.02.14
✎
20:15
|
Ответили. Все нормально, скуль поймет :-)
|
|||
16
МихаилМ
17.02.14
✎
20:20
|
(15)
и так очевидно что "поймет". Вопрос , будет ли , зная параметры , строить план запроса с лишними соединениями. Я думаю - будет. |
|||
17
КошерныйТролль
17.02.14
✎
20:25
|
(16) думаю, что план запроса строить будет, т.к. указаны поля из соединяемой таблицы, но выбирать из таблицы строки не будет.
|
|||
18
Лефмихалыч
17.02.14
✎
20:34
|
+(16) ну, и рассчитывать на то, что MSSQL будет всегда - это кагбэ не сильно правильно. Пусть даже сейчас и кажется, что так будет всегда
|
|||
19
КошерныйТролль
17.02.14
✎
20:36
|
(18) так будет всегда :-)
|
|||
20
МихаилМ
17.02.14
✎
20:41
|
(18)
конечно правильней обсуждать в рамках конкретных версий субд. |
|||
21
КошерныйТролль
17.02.14
✎
20:42
|
(20) вопрос волнует именно применительно к субд на скуле
|
|||
22
МихаилМ
17.02.14
✎
20:43
|
(17)
будет. как же не выбирать, соединять . если заменить соединение на объединение, тогда может и не будет . нужно анализировать планы запроса |
|||
23
КошерныйТролль
17.02.14
✎
20:45
|
(22) план запроса - это итоговый запрос к бд, который генерит скуль на основе запроса разработчика?
|
|||
24
КошерныйТролль
17.02.14
✎
20:46
|
(22) а что находится на уровне после плана запроса?
|
|||
25
КошерныйТролль
17.02.14
✎
20:49
|
(22) имхо, не думаю, что двоичный код скуля будет тупо перебирать таблицу, не смотря на то, что результат известен заранее и равен ЛОЖЬ.
Скорее всего, запрос выберет имена соединяемых колонок и напишет в них Null |
|||
26
МихаилМ
17.02.14
✎
20:49
|
(23)
этому Вас должны были в институте научить. wiki:%CF%EB%E0%ED_%E2%FB%EF%EE%EB%ED%E5%ED%E8%FF_%E7%E0%EF%F0%EE%F1%E0 и поисковыми системами интернет пользоваться. |
|||
27
Bww_
17.02.14
✎
20:50
|
Соединение отработает на "ура".
Основа для анализа и критики - суть запроса и её понимание. Здесь автор явно в тупике. --*** А то, что экзотика... В сложных вещах и логика не проста. |
|||
28
КошерныйТролль
17.02.14
✎
20:51
|
(26) не все институты заканчивали, некоторые Родине служили, пока Родина в них нуждалась :-)
|
|||
29
КошерныйТролль
17.02.14
✎
20:54
|
(27) почему тогда соединение с гигантской таблицей по условию параметра, равного ЛОЖЬ выполняется так же быстро, как если написать "Выбрать 0 как Поле"?
|
|||
30
viktor_vv
17.02.14
✎
20:58
|
(29) Потому что там соединение с таким параметром вообще не выполняется, ИМХО. Тупо пустой результат возвращает.
|
|||
31
Bww_
17.02.14
✎
20:58
|
Что такое "Выбрать 0 как Поле" я не понимаю, но если в условии применяется соединение не с "Внутреннее Соединение РегистрСведениий.Паппап как Таб2", а например, какой то ВТ, где записей, как раз 1, или со спец.регистром, с помощью которого нужно "размножить" записи запроса, то все "Ок".
|
|||
32
КошерныйТролль
17.02.14
✎
20:59
|
(30) а колонки откуда берет?
|
|||
33
КошерныйТролль
17.02.14
✎
21:01
|
Хотя тип колонки содержит в себе и Null тоже...
Думаю, что тупо выбираются имена и типы колонок соединяемой таблицы, не остальное скуль забивает. |
|||
34
Bww_
17.02.14
✎
21:02
|
SQL не может "забить" на INNER JOIN
|
|||
35
viktor_vv
17.02.14
✎
21:03
|
(32) В (0) не вижу колонок из второй таблицы. Равно как и при соединении по параметру Истина, если в Выбрать не будет колонок из второй таблицы, то и соединении выполняться не будет.
|
|||
36
КошерныйТролль
17.02.14
✎
21:04
|
(34) он и не забивает. Селектит имена колонок, типы и все... Наверно....
|
|||
37
Prog2014
17.02.14
✎
21:04
|
(0)замер производительности рулит
|
|||
38
КошерныйТролль
17.02.14
✎
21:05
|
(35) представь, что они там есть. Если колонка указана в соединении, значит она есть.
|
|||
39
Bww_
17.02.14
✎
21:06
|
INNER просто "отсечет" не удовлетворяющие записи. NULL выводит LEFT/RIGHT JOIN.
|
|||
40
viktor_vv
17.02.14
✎
21:07
|
*Соединение.
(34) Чего это ? Утверждать не буду, но на левое забивает, если нет в Выбрать полей из второй таблицы. (38) В условиях соединения, это не одно и тоже, что в Выбрать. |
|||
41
КошерныйТролль
17.02.14
✎
21:08
|
(39) сколько заплатишь если я сделаю null в одинесном внутреннем соединении?
|
|||
42
Bww_
17.02.14
✎
21:13
|
Если сделаешь в "классике" то сколько угодно. Если будешь пытаться сделать по другому, например, объединениями, то и двух копеек не дам.
К слову, и в армии служили, и в институтах учились и Родина нас не забывает :) |
|||
43
КошерныйТролль
17.02.14
✎
21:15
|
(42) нас тоже родина не забывает, но военное образование далеко от гражданских институтов.... максимум бейсик раньше был :-)
|
|||
44
КошерныйТролль
17.02.14
✎
21:16
|
И жесткий диск размером с целый зал :-)
|
|||
45
КошерныйТролль
17.02.14
✎
21:22
|
(40) согласно определению из желтой книжки, у всех соединений принцип общий: две таблицы преобразовываются в третью, которая и есть результат.
Так что, с точки зрения двоичного кода, скулю монопенисуально, левое это или внутреннее соединение. |
|||
46
Bww_
17.02.14
✎
21:23
|
Не излечим.
|
|||
47
КошерныйТролль
17.02.14
✎
21:24
|
(46) ты с желтой книжкой хочешь поспорить?
|
|||
48
КошерныйТролль
17.02.14
✎
21:38
|
Дык допустимо такое в угоду удобоваримости и читабельности кода или грубое нарушение постулатов?
|
|||
49
viktor_vv
17.02.14
✎
21:39
|
(36) Ну таки забивает, колонки берет из некоторой внутренней таблицы, в которой наверное просто поля и типы полей.
Select ДокШапкаРасчет.IDDOC as Док , Ж.Date_Time_IDDOC From dh7749 as ДокШапкаРасчет (nolock) inner join _1Sjourn as Ж (nolock) on (1=0) and (Ж.Date_Time_IDDOC between '20140101' and '20140131Z' and Ж.IDDOC = ДокШапкаРасчет.IDDOC) В плане запроса просто Scanning an internal table of constants и select. |
|||
50
КошерныйТролль
17.02.14
✎
21:41
|
(49) Ура! Спасибо, ты не представляешь как я счастлив, что могу с чистой совестью писать такие запросы как в (0) :-)
|
|||
51
МихаилМ
17.02.14
✎
21:44
|
(49)
условие константа сравнение константе (заранее известно на этапе анализа) не равно условию с переменная сравнивается с константой |
|||
52
КошерныйТролль
17.02.14
✎
21:46
|
(51) блин, это отменяет (50)?
|
|||
53
МихаилМ
17.02.14
✎
21:56
|
(52)
проще всего проверить соедините таблицу с саму с собой 10-20 раз по PK и условию аналогичному (12) если выборок из соединяемых таблиц не будет, то скорость выборки 1 и 10 отличаться не будет. |
|||
54
viktor_vv
17.02.14
✎
23:08
|
(51) Мне таки кажется, что из 1С на скуль уйдет нечто подобное (49), так как подстановка значения параметра (&Параметр1 = Истина) произойдет при трансляции запроса в T-SQL.
|
|||
55
Torquader
18.02.14
✎
15:10
|
(54) Если всё работает через Prepare-Execute, то сначала будет Prepare, где вместо параметра будет вопрос, а потом будет Set parameter и уже после этого Execute.
Вопрос в том - допрёт ли sql-server до того, что условие всегда ложно до сканирования таблицы или нет. |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |