|
|
|
неизвестный заранее джойн: два разных запроса или один с переменной: чтобыстрей?
|
|||
|---|---|---|---|
|
#18+
Подскажите, пожалуйста! Вот если я сделала так: select * from tbl_table1 t1 JOIN tbl_table2 t2 on t1.Id=t2.id и теперь надо соединится с другой таблицей, но по условию. Условие у меня будет в переменной такой - If_valueexists и если она не null, то надо присодинять таблицу. Можно сделать это двумя запросами: if not If_valueexists is null begin select * from tbl_table1 t1 JOIN tbl_table2 t2 on t1.Id=t2.id end else begin select * from tbl_table1 t1 JOIN tbl_table2 t2 on t1.Id=t2.id JOIN tbl_table3 t3 on t2.Id_t = t3.id_t end А еще можно select * from tbl_table1 t1 JOIN tbl_table2 t2 on t1.Id=t2.id LEFT JOIN tbl_table3 t3 on t2.Id_t = t3.id_t and (If_valueexists is null or t3.id_t is not null) понятно, наверное? я могла сейчас ошибиться, но смысл в зависимости от переменной превратить left join в inner, убрав пустые строки. Что оптимизатор поймет лучше или ему без разницы? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.10.2014, 01:06:22 |
|
||
|
неизвестный заранее джойн: два разных запроса или один с переменной: чтобыстрей?
|
|||
|---|---|---|---|
|
#18+
ElenaTomskЧто оптимизатор поймет лучшепервое ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.10.2014, 06:36:11 |
|
||
|
неизвестный заранее джойн: два разных запроса или один с переменной: чтобыстрей?
|
|||
|---|---|---|---|
|
#18+
Очень странное условие Код: sql 1. Если t3.id_t is null , условие трансформируется в Код: sql 1. Итог - false, и записи третьей таблицы не присоединяются вне зависимости от If_valueexists. Если t3.id_t is not null , условие трансформируется в Код: sql 1. и записи третьей таблицы присоединяются вне зависимости от If_valueexists. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.10.2014, 09:07:24 |
|
||
|
неизвестный заранее джойн: два разных запроса или один с переменной: чтобыстрей?
|
|||
|---|---|---|---|
|
#18+
Akina, извините, я могла ошибиться там в условии, конечно. Вопрос не в этом, напишу правильно потом. Вопрос в том, что лучше для оптимизатора. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.10.2014, 11:53:34 |
|
||
|
неизвестный заранее джойн: два разных запроса или один с переменной: чтобыстрей?
|
|||
|---|---|---|---|
|
#18+
На ошибочный вопрос можно получить ошибочный ответ. Сначала напишите правильно. Потом будем думать, что решит оптимизатор, и как сделать, так, чтобы он решил правильно. Мне кажется, что при правильном тексте получится константное вычисление, результат которого будет влиять на план выполнения, в результате чего один запрос будет не хуже двух. С другой стороны, в зависимости от условия изменяется структура результата - а это свидетельствует о серьёзных проблемах архитектуры. Так что не об эффективности запроса должна голова болеть... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.10.2014, 12:27:24 |
|
||
|
неизвестный заранее джойн: два разных запроса или один с переменной: чтобыстрей?
|
|||
|---|---|---|---|
|
#18+
AkinaОчень странное условиеНу какая задача , такое и условие :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.10.2014, 13:05:43 |
|
||
|
неизвестный заранее джойн: два разных запроса или один с переменной: чтобыстрей?
|
|||
|---|---|---|---|
|
#18+
Akina, Ваша правда, я пока неочень опытная. :( Но мне кажется, что тут я не ошибаюсь. Поправите? Например, группа студентов. У них есть какой-нибудь необязательный признак. Например, второе гражданство. Страна с ним лежит в отдельной таблице На форме выбрка, получить всех студентов, если в выборке не указано второе гражданство. Другой вариант, если второе гражданство указано. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.10.2014, 14:00:40 |
|
||
|
неизвестный заранее джойн: два разных запроса или один с переменной: чтобыстрей?
|
|||
|---|---|---|---|
|
#18+
UsersНапример, группа студентов. У них есть какой-нибудь необязательный признак. Например, второе гражданство. Страна с ним лежит в отдельной таблице На форме выбрка, получить всех студентов, если в выборке не указано второе гражданство. Другой вариант, если второе гражданство указано. Минутку. Не понимаю, как ЭТО влияет на конечный РЕЗУЛЬТАТ. В любом случае гражданство на форму ВЫВОДИТСЯ. Следовательно, в любом случае оно в выходном наборе данных от сервера ПРИСУТСТВУЕТ. Следовательно, таблица гражданств в любом случае ПРИВЯЗЫВАЕТСЯ, то есть в источнике данных (запросе) ПРИСУТСТВУЕТ. Другое дело, будет ли оно использоваться при отборе данных или нет. Это уже определяется параметром, который передаст движку форма ввода фильтра. Посему - запрос всегда один и тот же. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.10.2014, 15:39:32 |
|
||
|
неизвестный заранее джойн: два разных запроса или один с переменной: чтобыстрей?
|
|||
|---|---|---|---|
|
#18+
AkinaUsersНапример, группа студентов. У них есть какой-нибудь необязательный признак. Например, второе гражданство. Страна с ним лежит в отдельной таблице На форме выбрка, получить всех студентов, если в выборке не указано второе гражданство. Другой вариант, если второе гражданство указано. Минутку. Не понимаю, как ЭТО влияет на конечный РЕЗУЛЬТАТ. В любом случае гражданство на форму ВЫВОДИТСЯ. Следовательно, в любом случае оно в выходном наборе данных от сервера ПРИСУТСТВУЕТ. Следовательно, таблица гражданств в любом случае ПРИВЯЗЫВАЕТСЯ, то есть в источнике данных (запросе) ПРИСУТСТВУЕТ. Другое дело, будет ли оно использоваться при отборе данных или нет. Это уже определяется параметром, который передаст движку форма ввода фильтра. Посему - запрос всегда один и тот же. есть прoмежуточный вариант для несложный случаев: запрос один но связка не всегда задействована, типа: Код: sql 1. 2. 3. 4. 5. 6. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.10.2014, 16:29:17 |
|
||
|
неизвестный заранее джойн: два разных запроса или один с переменной: чтобыстрей?
|
|||
|---|---|---|---|
|
#18+
Почему не просто Код: sql 1. ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.10.2014, 16:34:28 |
|
||
|
неизвестный заранее джойн: два разных запроса или один с переменной: чтобыстрей?
|
|||
|---|---|---|---|
|
#18+
AkinaПочему не просто Код: sql 1. ? любопытно (но лень проверять) Скорее всего WHERE (country = :filter) or (:filter is null) сначала всегда сделает джоин а потом проверит на НУЛЛ если не найдет (country = :filter) а вот WHERE (:filter is null) or (country = :filter) возможно не будет делать джоин если (:filter is null) И вообше: порядок выполнения операторов одного уровня слева направо в WHERE секции определен или нет? Кто нибудь знает? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.10.2014, 18:19:59 |
|
||
|
неизвестный заранее джойн: два разных запроса или один с переменной: чтобыстрей?
|
|||
|---|---|---|---|
|
#18+
ElenaTomskПодскажите, пожалуйста! Вот если я сделала так: select * from tbl_table1 t1 JOIN tbl_table2 t2 on t1.Id=t2.id и теперь надо соединится с другой таблицей, но по условию. Условие у меня будет в переменной такой - If_valueexists и если она не null, то надо присодинять таблицу. Можно сделать это двумя запросами: if not If_valueexists is null begin select * from tbl_table1 t1 JOIN tbl_table2 t2 on t1.Id=t2.id end else begin select * from tbl_table1 t1 JOIN tbl_table2 t2 on t1.Id=t2.id JOIN tbl_table3 t3 on t2.Id_t = t3.id_t end А еще можно select * from tbl_table1 t1 JOIN tbl_table2 t2 on t1.Id=t2.id LEFT JOIN tbl_table3 t3 on t2.Id_t = t3.id_t and (If_valueexists is null or t3.id_t is not null) понятно, наверное? я могла сейчас ошибиться, но смысл в зависимости от переменной превратить left join в inner, убрав пустые строки. Что оптимизатор поймет лучше или ему без разницы? иногда будет без разницы, но в принципе лучше всегда делать два запроса ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.10.2014, 18:31:55 |
|
||
|
неизвестный заранее джойн: два разных запроса или один с переменной: чтобыстрей?
|
|||
|---|---|---|---|
|
#18+
javajdbcAkinaПочему не просто Код: sql 1. ? любопытно (но лень проверять) Скорее всего WHERE (country = :filter) or (:filter is null) сначала всегда сделает джоин а потом проверит на НУЛЛ если не найдет (country = :filter) а вот WHERE (:filter is null) or (country = :filter) возможно не будет делать джоин если (:filter is null) И вообше: порядок выполнения операторов одного уровня слева направо в WHERE секции определен или нет? Кто нибудь знает? я знаю. не определен. порядок выполнения чего-либо в sql вообще не определен . в процедурном языке расширении наоборот строго определен. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.10.2014, 18:46:07 |
|
||
|
|

start [/forum/topic.php?fid=47&fpage=159&tid=1834090]: |
0ms |
get settings: |
9ms |
get forum list: |
20ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
83ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
44ms |
get tp. blocked users: |
1ms |
| others: | 217ms |
| total: | 392ms |

| 0 / 0 |
