Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Кто быстрей LEFT или INNER JOIN  [new]
Reminator
Member

Откуда:
Сообщений: 11
Привет всем.
Помогите разобраться с JOIN.
Есть 2 таблицы, структура tab1 (id,id_tab2), tab2(id, name, и т.д.)
Таблица 2 это подмножество таблицы 1, в tab1 и tab2 по полю id создан уникальный кластерный индекс.

Вопрос что будет работать быстрее и почему?

Select tab1.id, tab2.id from tab1 inner join tab2 on tab1.id = tab2.id where tab1.id = 10
Select tab1.id, tab2.id from tab1 left join tab2 on tab1.id = tab2.id where tab1.id = 10

Количество возвращаемых строк будет всегда одинаковое.
18 апр 12, 08:33    [12430857]     Ответить | Цитировать Сообщить модератору
 Re: Кто быстрей LEFT или INNER JOIN  [new]
denis2710
Member

Откуда: Москва
Сообщений: 3384
Reminator,
А планы запросов лень посмотреть?
18 апр 12, 08:58    [12430911]     Ответить | Цитировать Сообщить модератору
 Re: Кто быстрей LEFT или INNER JOIN  [new]
iljy
Member

Откуда:
Сообщений: 8711
Reminator,

если таблица2 - подмножество таблицы1, то с какого перепугу количество возвращаемых строк будет одинаковое? Запросы ваши разные, дают разный результат, и сравнивать их - занятие достаточно глупое. Тем более, что у меня есть сильное подозрение, что вы их связываете не по тому полю, и таблица2 - никакое не подмножество, а связана по ВК.
18 апр 12, 09:11    [12430947]     Ответить | Цитировать Сообщить модератору
 Re: Кто быстрей LEFT или INNER JOIN  [new]
Reminator
Member

Откуда:
Сообщений: 11
iljy,

1. Согласен ошибся пока писал запрос связь tab1.id_tab2 = tab2.id
2. Нет, оба запроса всегда будут возвращать одинаковое количество записей.

План запроса не понимаю.
18 апр 12, 09:57    [12431136]     Ответить | Цитировать Сообщить модератору
 Re: Кто быстрей LEFT или INNER JOIN  [new]
gds
Member

Откуда: Железнодорожный
Сообщений: 1842
Блог
Reminator,

вы понимаете разницу между двумя операторами Left Join и Inner Join?
18 апр 12, 10:08    [12431199]     Ответить | Цитировать Сообщить модератору
 Re: Кто быстрей LEFT или INNER JOIN  [new]
iljy
Member

Откуда:
Сообщений: 8711
Reminator
iljy,

1. Согласен ошибся пока писал запрос связь tab1.id_tab2 = tab2.id
2. Нет, оба запроса всегда будут возвращать одинаковое количество записей.

Если это декларированная связь по ВК и поле id_tab2 не пустое - то запросы одинаковые, и планы скорее всего будут одинаковые. В другом случае запросы разные, и сервер может их по разному обработать.

Reminator
План запроса не понимаю.

Так изучайте, все ответы там.
18 апр 12, 10:12    [12431221]     Ответить | Цитировать Сообщить модератору
 Re: Кто быстрей LEFT или INNER JOIN  [new]
aleks2
Guest
В общем случае, при LEFT OUTER JOIN в 99.9% случаев будет сканирование ЛЕВОЙ таблицы.
Это возможность подтолкнуть оптимизатор к правильному поведению, если точно известно, что на ЛЕВОЙ таблице индексов нема.

ЗЫ. Возможное различие в результатах - это уже сказали.
18 апр 12, 10:18    [12431276]     Ответить | Цитировать Сообщить модератору
 Re: Кто быстрей LEFT или INNER JOIN  [new]
Reminator
Member

Откуда:
Сообщений: 11
Планы запросов одинаковые, но с left join используется меньше цпу. замеры верные, так как после каждого запроса сбрасывалась статистика, стопился сервек.
18 апр 12, 10:19    [12431279]     Ответить | Цитировать Сообщить модератору
 Re: Кто быстрей LEFT или INNER JOIN  [new]
aleks2
Guest
Reminator
Планы запросов одинаковые, но с left join используется меньше цпу

1. И гений, парадоксов друг!
2. Это как возможно?
18 апр 12, 10:25    [12431331]     Ответить | Цитировать Сообщить модератору
 Re: Кто быстрей LEFT или INNER JOIN  [new]
Reminator
Member

Откуда:
Сообщений: 11
aleks2
Reminator
Планы запросов одинаковые, но с left join используется меньше цпу

Это как возможно?


Мне тоже стало очень интересно как это возможно.
18 апр 12, 10:31    [12431382]     Ответить | Цитировать Сообщить модератору
 Re: Кто быстрей LEFT или INNER JOIN  [new]
iljy
Member

Откуда:
Сообщений: 8711
Reminator
aleks2
пропущено...

Это как возможно?


Мне тоже стало очень интересно как это возможно.

И можете репро привести?
18 апр 12, 10:41    [12431457]     Ответить | Цитировать Сообщить модератору
 Re: Кто быстрей LEFT или INNER JOIN  [new]
gds
Member

Откуда: Железнодорожный
Сообщений: 1842
Блог
Reminator
aleks2
пропущено...

Это как возможно?


Мне тоже стало очень интересно как это возможно.

Наверное из счет операции Hash Match, но это когда нет индексов.
create table #t (a int, text1 nvarchar(10));
insert into #t values(1,'Animals');
insert into #t values(2,'People');
insert into #t values(3,'Birds');
insert into #t values(4,'Pets');
go

create table #t1 (b int, a int,text2 nvarchar(10));
insert into #t1 values(1,1,'Tiger');
insert into #t1 values(2,1,'Leopard');
insert into #t1 values(3,3,'Eagle');
insert into #t1 values(4,4,'Cats');
insert into #t1 values(5,4,'Dogs');
insert into #t1 values(6,5,'h1n1');
insert into #t1 values(7,5,'e2e4');
go

-- join
select * from #t a
inner join #t1 b on a.a=b.a 
--where a.text1 = 'Animals'

-- Left join
select t.a,t.text1,t1.b,t1.text2 from #t as t
left join #t1 as t1 on t1.a = t.a
--where t.text1 = 'Animals'

Microsoft SQL Server 2008 R2 (SP1) - 10.50.2806.0 (X64)   Feb 14 2012 18:18:40   Copyright (c) Microsoft Corporation  Developer Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1) 
18 апр 12, 10:44    [12431479]     Ответить | Цитировать Сообщить модератору
 Re: Кто быстрей LEFT или INNER JOIN  [new]
наоборот
Guest
gds,

у него таблица-подмножество справа стоит, у Вас слева
18 апр 12, 10:58    [12431572]     Ответить | Цитировать Сообщить модератору
 Re: Кто быстрей LEFT или INNER JOIN  [new]
aleks2
Guest
  |--Hash Match(Inner Join, HASH:([a].[a])=([b].[a]), RESIDUAL:([tempdb].[dbo].[#t1].[a] as [b].[a]=[tempdb].[dbo].[#t].[a] as [a].[a]))
|--Table Scan(OBJECT:([tempdb].[dbo].[#t] AS [a]))
|--Table Scan(OBJECT:([tempdb].[dbo].[#t1] AS [b]))

  |--Nested Loops(Left Outer Join, WHERE:([tempdb].[dbo].[#t1].[a] as [t1].[a]=[tempdb].[dbo].[#t].[a] as [t].[a]))
|--Table Scan(OBJECT:([tempdb].[dbo].[#t] AS [t]))
|--Table Scan(OBJECT:([tempdb].[dbo].[#t1] AS [t1]))

Где ж оне одинаковы?
18 апр 12, 11:01    [12431604]     Ответить | Цитировать Сообщить модератору
 Re: Кто быстрей LEFT или INNER JOIN  [new]
gds
Member

Откуда: Железнодорожный
Сообщений: 1842
Блог
наоборот
gds,

у него таблица-подмножество справа стоит, у Вас слева

Ну переверните. Оптимизатор все равно построит план как ему удобнее.
для этих запросов планы то одинаковые
-- join
select * from #t1 a
inner join #t b on b.a=a.a 

-- join
select * from #t a
inner join #t1 b on a.a=b.a 

Или мы о разных вещах говорим?
18 апр 12, 11:09    [12431645]     Ответить | Цитировать Сообщить модератору
 Re: Кто быстрей LEFT или INNER JOIN  [new]
gds
Member

Откуда: Железнодорожный
Сообщений: 1842
Блог
aleks2
  |--Hash Match(Inner Join, HASH:([a].[a])=([b].[a]), RESIDUAL:([tempdb].[dbo].[#t1].[a] as [b].[a]=[tempdb].[dbo].[#t].[a] as [a].[a]))
|--Table Scan(OBJECT:([tempdb].[dbo].[#t] AS [a]))
|--Table Scan(OBJECT:([tempdb].[dbo].[#t1] AS [b]))

  |--Nested Loops(Left Outer Join, WHERE:([tempdb].[dbo].[#t1].[a] as [t1].[a]=[tempdb].[dbo].[#t].[a] as [t].[a]))
|--Table Scan(OBJECT:([tempdb].[dbo].[#t] AS [t]))
|--Table Scan(OBJECT:([tempdb].[dbo].[#t1] AS [t1]))

Где ж оне одинаковы?

вот и я говорю что они разные
gds
Наверное из счет операции Hash Match, но это когда нет индексов.
18 апр 12, 11:12    [12431675]     Ответить | Цитировать Сообщить модератору
 Re: Кто быстрей LEFT или INNER JOIN  [new]
iljy
Member

Откуда:
Сообщений: 8711
gds
для этих запросов планы то одинаковые

Естественно они одинаковые, inner join - коммутативная операция. А left join - нет.
18 апр 12, 11:25    [12431822]     Ответить | Цитировать Сообщить модератору
 Re: Кто быстрей LEFT или INNER JOIN  [new]
Reminator
Member

Откуда:
Сообщений: 11
В общем не кто не может объяснить почему inner тяжелее.
18 апр 12, 15:21    [12433619]     Ответить | Цитировать Сообщить модератору
 Re: Кто быстрей LEFT или INNER JOIN  [new]
Ivan Durak
Member

Откуда: Minsk!!!
Сообщений: 3752
Планы у них разные....
А ТАК???!!
gds
-- join
select * from #t a
inner hash join #t1 b on a.a=b.a
--where a.text1 = 'Animals'

-- Left join
select t.a,t.text1,t1.b,t1.text2 from #t as t
left hash join #t1 as t1 on t1.a = t.a
--where t.text1 = 'Animals'

[/src]
18 апр 12, 15:28    [12433677]     Ответить | Цитировать Сообщить модератору
 Re: Кто быстрей LEFT или INNER JOIN  [new]
iljy
Member

Откуда:
Сообщений: 8711
Reminator
В общем не кто не может объяснить почему inner тяжелее.

Я не кто, но я могу: потому что планы разные.
18 апр 12, 15:29    [12433692]     Ответить | Цитировать Сообщить модератору
 Re: Кто быстрей LEFT или INNER JOIN  [new]
Glory
Member

Откуда:
Сообщений: 104751
Reminator
В общем не кто не может объяснить почему inner тяжелее.

Тяжелее не inner
Тяжелее та или иная стратегия соединения.
А inner или outer просто влияют на выбор этой стратегии соединения.
18 апр 12, 15:40    [12433768]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить