Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Как лучше писать сабквери?  [new]
G_UNIT
Guest
Доброго времени суток уважаемые господа,
нужен Ваш совет по сабквери, как лучше организовать?
Есть 3 вариант, подскажите какой выбрать
1.
+
select name from table1
where rec_id = (select id from table2 where type = 1)


2.
+
select name from table1 t1
inner join (select id from table2 where type = 1) t2 ON t1.rec_id = t2.id


3.
+
declare @tbl1 TABLE
(id int)

insert into @tbl1
select id from table2 where type = 1

select name from table1 t1
inner join @tbl1 t2 ON t1.rec_id = t2.id
25 сен 14, 14:58    [16621457]     Ответить | Цитировать Сообщить модератору
 Re: Как лучше писать сабквери?  [new]
G_UNIT
Guest
что будет работать быстрее?
25 сен 14, 14:59    [16621463]     Ответить | Цитировать Сообщить модератору
 Re: Как лучше писать сабквери?  [new]
Glory
Member

Откуда:
Сообщений: 104751
G_UNIT
как лучше организовать?

лучше для чего ?
25 сен 14, 15:00    [16621470]     Ответить | Цитировать Сообщить модератору
 Re: Как лучше писать сабквери?  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
варианты не все :)
Быстрее - ето вы планы и профайлер смотрите.... никто кроме вас не знает что у вас в таблицах то
25 сен 14, 15:01    [16621476]     Ответить | Цитировать Сообщить модератору
 Re: Как лучше писать сабквери?  [new]
Glory
Member

Откуда:
Сообщений: 104751
G_UNIT
что будет работать быстрее?

Ничего, что в общем случае запросы могут вернуть разные результаты ?
Тот результат, что выполнится быстрее и будет правильным ?
25 сен 14, 15:03    [16621496]     Ответить | Цитировать Сообщить модератору
 Re: Как лучше писать сабквери?  [new]
G_UNIT
Guest
в ообщем время их выполнения очень похожы, особой разницы нет, но какой вариант лучше выбрать?
25 сен 14, 15:10    [16621537]     Ответить | Цитировать Сообщить модератору
 Re: Как лучше писать сабквери?  [new]
Glory
Member

Откуда:
Сообщений: 104751
G_UNIT
в ообщем время их выполнения очень похожы, особой разницы нет

Кроме времени выполнения существуют еще
- план выполнения
- статистика чтений
25 сен 14, 15:11    [16621546]     Ответить | Цитировать Сообщить модератору
 Re: Как лучше писать сабквери?  [new]
iap
Member

Откуда: Москва
Сообщений: 47083
Glory
G_UNIT
в ообщем время их выполнения очень похожы, особой разницы нет

Кроме времени выполнения существуют еще
- план выполнения
- статистика чтений
- и требующийся результат
25 сен 14, 15:14    [16621562]     Ответить | Цитировать Сообщить модератору
 Re: Как лучше писать сабквери?  [new]
mittagswind
Member

Откуда:
Сообщений: 133
G_UNIT
select name from table1
where rec_id = (select id from table2 where type = 1)

Учтите потенциальные грабли - вложенный запрос может вернуть больше одной строки и все свалится:
Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.

G_UNIT
время их выполнения очень похожы, особой разницы нет

Это лишь означает что вы, скорее всего, проверяете свои запросы на маленьких объемах данных. Набейте тестовые таблицы несколькими десятками миллионов записей - картина изменится, "я гарантирую это" (с)
25 сен 14, 15:37    [16621675]     Ответить | Цитировать Сообщить модератору
 Re: Как лучше писать сабквери?  [new]
_stas_k_
Member

Откуда:
Сообщений: 46
Подзапросы - зло...

select name
from table1 t1
join table2 t2 on t2.id = t1.rec_id and t2.type = 1
25 сен 14, 22:07    [16623212]     Ответить | Цитировать Сообщить модератору
 Re: Как лучше писать сабквери?  [new]
virtuOS
Member

Откуда: большая деревня
Сообщений: 266
_stas_k_
Подзапросы - зло...

select name
from table1 t1
join table2 t2 on t2.id = t1.rec_id and t2.type = 1

Мне кажется, или на больших таблицах этот запрос проиграет варианту №2 топикстартера?
26 сен 14, 09:03    [16623933]     Ответить | Цитировать Сообщить модератору
 Re: Как лучше писать сабквери?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31863
virtuOS
_stas_k_
Подзапросы - зло...

select name
from table1 t1
join table2 t2 on t2.id = t1.rec_id and t2.type = 1


Мне кажется, или на больших таблицах этот запрос проиграет варианту №2 топикстартера?
Планы будут одинаковые, это в принципе одинаковые запросы, просто по разному записаны.
26 сен 14, 09:08    [16623950]     Ответить | Цитировать Сообщить модератору
 Re: Как лучше писать сабквери?  [new]
iap
Member

Откуда: Москва
Сообщений: 47083
_stas_k_
Подзапросы - зло...
Подзапросы - добро!
26 сен 14, 12:22    [16625170]     Ответить | Цитировать Сообщить модератору
 Re: Как лучше писать сабквери?  [new]
o-o
Guest
iap
_stas_k_
Подзапросы - зло...
Подзапросы - добро!

а давайте дадим слово Ицику Бен-Гану!

...You might wonder why you wouldn’t implement this task by using a join instead of subqueries...
Similarly, you are likely to stumble into many other querying problems that you can solve with
either subqueries or joins. In my experience, there’s no reliable rule of thumb that says that a subquery
is better than a join.
In some cases, the database engine interprets both types of queries the
same way. Sometimes joins perform better than subqueries, and sometimes the opposite is true. My
approach is to first write the solution query for the specified task in an intuitive form, and if performance
is not satisfactory, one of my tuning approaches is to try query revisions. Such query revisions
might include using joins instead of subqueries or using subqueries instead of joins.
26 сен 14, 12:52    [16625358]     Ответить | Цитировать Сообщить модератору
 Re: Как лучше писать сабквери?  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4831
G_UNIT
Доброго времени суток уважаемые господа,
нужен Ваш совет по сабквери, как лучше организовать?
Есть 3 вариант, подскажите какой выбрать


Вы про CTE забыли и про OUTER/CROSS APPLY
26 сен 14, 12:55    [16625378]     Ответить | Цитировать Сообщить модератору
 Re: Как лучше писать сабквери?  [new]
iap
Member

Откуда: Москва
Сообщений: 47083
o-o
iap
пропущено...
Подзапросы - добро!

а давайте дадим слово Ицику Бен-Гану!

...You might wonder why you wouldn’t implement this task by using a join instead of subqueries...
Similarly, you are likely to stumble into many other querying problems that you can solve with
either subqueries or joins. In my experience, there’s no reliable rule of thumb that says that a subquery
is better than a join.
In some cases, the database engine interprets both types of queries the
same way. Sometimes joins perform better than subqueries, and sometimes the opposite is true. My
approach is to first write the solution query for the specified task in an intuitive form, and if performance
is not satisfactory, one of my tuning approaches is to try query revisions. Such query revisions
might include using joins instead of subqueries or using subqueries instead of joins.
И где же тут про зло?
А давайте вообще запретим подзапросы в SQL! Это же зло!
Ну и Бен-Ган - это не Моисей, чтобы ссылаться на него, как на Библию.
26 сен 14, 13:03    [16625434]     Ответить | Цитировать Сообщить модератору
 Re: Как лучше писать сабквери?  [new]
o-o
Guest
iap,
вы сегодня не с той ноги встали или с инглишем проблемы?

он говорит, добро или зло -- на месте выясняется, в каждом конкретном.
в каких-то случаях быстрее соединения, в каких-то подзапросы.
и на библию он не претендует, где вы вычитали-то???
My approach is = IMHO

говорит, я сперва пишу в наиболее интуитивном виде, если производительность не устраивает,
пробую переписать другими способами.

казалось бы, более мирный ответ и не придумать...

мой ответ был не Вам конкретно,
(когда я к кому-то обращаюсь, пишу сперва его имя и запятой отделяю, ок?)
то была безуспешная попытка положить конец спору добро/зло.
спорьте дальше на здоровье!!!
26 сен 14, 13:16    [16625536]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить