powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / PLAN - join/using
5 сообщений из 5, страница 1 из 1
PLAN - join/using
    #40097159
Gorynich
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FB Server 4.0.1.2580 / 2.5.9.27152

В запросе на соединение с использованием using или natural join по ключу не используется индекс.
"Это - норма"(с) ?


Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
CREATE TABLE T1 (
    MASTER_ID  INTEGER NOT NULL
);

CREATE TABLE T2 (
    MASTER_ID  INTEGER NOT NULL,
    DETAIL_ID  INTEGER NOT NULL
);

ALTER TABLE T1 ADD CONSTRAINT pk_T1 PRIMARY KEY (MASTER_ID);
ALTER TABLE T2 ADD CONSTRAINT pk_T2 PRIMARY KEY (MASTER_ID, DETAIL_ID);

CREATE INDEX T2_IDX1 ON T2 (DETAIL_ID);



select *
from T1 join T2 using (MASTER_ID)
where MASTER_ID = 1   

Plan
--------------------------------------------------------------------------------
PLAN JOIN (T1 NATURAL, T2 INDEX (PK_T2))




Если явно указать поле, то все ок.

Код: sql
1.
2.
3.
4.
5.
6.
7.
select *
from T1 join T2 using (MASTER_ID)
where T1.MASTER_ID = 1   

Plan
--------------------------------------------------------------------------------
PLAN JOIN (T2 INDEX (PK_T2), T1 INDEX (PK_T1))



или

Код: sql
1.
2.
3.
4.
5.
6.
7.
select *
from T1 join T2 using (MASTER_ID)
where T2.MASTER_ID = 1   

Plan
--------------------------------------------------------------------------------
PLAN JOIN (T2 INDEX (PK_T2), T1 INDEX (PK_T1))


...
Рейтинг: 0 / 0
PLAN - join/using
    #40097165
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gorynich,

а не надо так делать. Если в таблицах есть одноименные поля всегда надо указывать полное имя поля, иначе у сервера возникает неопределённость. Он может взять любое из них
...
Рейтинг: 0 / 0
PLAN - join/using
    #40097166
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
насколько помню, при неявном (звездочка или без алиаса) возврате USING-поля вместо него возвращается coalesce(T1.MASTER_ID, T2.MASTER_ID), по которому есс-но нельзя юзать индекс.
...
Рейтинг: 0 / 0
PLAN - join/using
    #40097173
Gorynich
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimitr
насколько помню, при неявном (звездочка или без алиаса) возврате USING-поля вместо него возвращается coalesce(T1.MASTER_ID, T2.MASTER_ID), по которому есс-но нельзя юзать индекс.


Действительно...

Руководство по языку
SQL СУБД Firebird 4.0Подсказка
Если при соединении именованными столбцами вы используете столбцы соединения в
условии отбора WHERE, то всегда используйте уточнённые имена столбцов. В противном
случае индекс по этому столбцу не будет задействован.
...
Рейтинг: 0 / 0
PLAN - join/using
    #40097186
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gorynich,

Код: sql
1.
where MASTER_ID = 1 


Странно, что сервер не обругал на ambiguous. Одинаковый столбец в обоих таблицах, по какому делать where - х.з. Понятно что тут join, но в одном из столбцов могут отсутствовать данные, которые есть в другом.
Кроме того, select * при запросе из более чем 1й таблицы я никогда не пишу. Д.б. select t1.*, t2.* ...
Короче, не пишите так, чтобы были неоднозначности. Либо будет ругань от сервера, либо х.з. какой результат.
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / PLAN - join/using
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]