Razacharovan

Lepsik
Дата: 04.05.2015 22:16:18
чисто теоритический вопрос - почему при выполнении не откидываются заведомо неиспользуемые части запроса. Я бы так предпологал что план запроса :

select name from dbo.t1
       left join dbo.t2 on t1.id = t2.id
       left join dbo.t3 on t1.id = t3.id


должен показывать только
select name from dbo.t1
invm
Дата: 04.05.2015 22:35:46
Lepsik
должен показывать только
select name from dbo.t1
В общем случае не должен. Если t2.id и t3.id PK или для них есть ограничения уникальности, то оптимизатор исключит эти таблицы из плана выполнения.
Lepsik
Дата: 04.05.2015 23:48:23
забыл запостить таблицы.

Идея в том что в запросе я указываю только поля из таблицы t1 и мне собственно все равно что есть такие-же id в t2, t3.

create table t1 ( id int not null primary key, name sysname)
insert into t1 SELECT id, name FROM (VALUES (1, 'a'), (2, 'b'), (3, 'c'), (4, 'd'), (5, 'e')) x(id, name);
create table t2 ( id int not null primary key, code int)
insert into t2 SELECT id, code FROM (VALUES (1, 11), (2, 22), (3, 33), (4, 44)) x(id, code);
create table t3 ( id int not null primary key, field real)
insert into t3 SELECT id, field FROM (VALUES (2, 2.1), (3, 3.3), (4, 42.), (5, 5.4)) x(id, field);
invm
Дата: 05.05.2015 01:36:39
Мда. Ваш же пример:
create table t1 ( id int not null primary key, name sysname)
insert into t1 SELECT id, name FROM (VALUES (1, 'a'), (2, 'b'), (3, 'c'), (4, 'd'), (5, 'e')) x(id, name);
create table t2 ( id int not null primary key, code int)
insert into t2 SELECT id, code FROM (VALUES (1, 11), (2, 22), (3, 33), (4, 44)) x(id, code);
create table t3 ( id int not null primary key, field real)
insert into t3 SELECT id, field FROM (VALUES (2, 2.1), (3, 3.3), (4, 42.), (5, 5.4)) x(id, field); 

set statistics xml on;

select name from dbo.t1
       left join dbo.t2 on t1.id = t2.id
       left join dbo.t3 on t1.id = t3.id

set statistics xml off;

drop table t1, t2, t3;
Lepsik
Дата: 05.05.2015 04:00:40
да с PK это так, а если индексы то не так.
Сон Веры Павловны
Дата: 05.05.2015 07:02:52
Lepsik
да с PK это так, а если индексы то не так.

use tempdb
go
create table t1 ( id int not null, name sysname)
insert into t1 SELECT id, name FROM (VALUES (1, 'a'), (2, 'b'), (3, 'c'), (4, 'd'), (5, 'e')) x(id, name);
create unique nonclustered index idx#t1 on t1 (id asc) include (name);

create table t2 ( id int not null, code int)
insert into t2 SELECT id, code FROM (VALUES (1, 11), (2, 22), (3, 33), (4, 44)) x(id, code);
create unique nonclustered index idx#t2 on t2 (id asc) include (code);

create table t3 ( id int not null, field real)
insert into t3 SELECT id, field FROM (VALUES (2, 2.1), (3, 3.3), (4, 42.), (5, 5.4)) x(id, field); 
create unique nonclustered index idx#t3 on t3 (id asc) include (field);

set statistics xml on;

select name from dbo.t1
       left join dbo.t2 on t1.id = t2.id
       left join dbo.t3 on t1.id = t3.id

set statistics xml off;

drop table t1, t2, t3;
alexeyvg
Дата: 05.05.2015 08:45:24
Lepsik
да с PK это так, а если индексы то не так.
Вы показывайте, показывайте ваши варианты, когда "не так".

Думаю, сервер достаточно умён, что бы отсечь ненужные джойны - но только если это не влияет на результат.
invm
Дата: 05.05.2015 10:08:50
Lepsik
а если индексы то не так
Конечно не так, если индекс не уникальный.
Вы почему-то считаете, что в случае left join из правой таблицы всегда берется не более одной строки.
Akina
Дата: 05.05.2015 10:14:33
Lepsik, а как, по-Вашему, без использования таблиц t2 и t3 сервер определит, сколько копий для каждой записи из t1 следует подать в выходной поток?
MasterZiv
Дата: 05.05.2015 11:14:58
Lepsik
чисто теоритический вопрос - почему при выполнении не откидываются заведомо неиспользуемые части запроса.


А Оракл, цука, хитрый, он откидывает...

я согласен, что это далеко не самая нужная вещь оптимизатору, но все же...