powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Про индекс и Left Outer Join
22 сообщений из 22, страница 1 из 1
Про индекс и Left Outer Join
    #32566780
Фотография Децл
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Привет.
Сервер Yaffil 1.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
CREATE TABLE t1 (
a integer,
b integer
);

CREATE TABLE t2 (
a integer,
b integer
);

CREATE INDEX t1_idx_a ON t1 (a, b);

commit;

 --фулл скан
 
 SELECT t1.a, t2.b
 FROM t1
left outer join t2 on (t1.b=t2.a)
order by t1.a

 --использует индекс
 
 SELECT t1.a, t2.b
 FROM t1 ,t2 where (t1.b=t2.a)
order by t1.a

В t1 могут быть строки, для кот нет соответствия в t2(поэтому я восп left outer join)/

Как сделать так, чтоб выбирались все записи из т1, независимо от того есть ли им соответствие в т2 и использовался индекс

Зарание спасибо за помощь
...
Рейтинг: 0 / 0
Про индекс и Left Outer Join
    #32566793
Фотография fedd
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
имхо, вот это
Код: plaintext
1.
2.
3.
4.
 --использует индекс
 
 SELECT t1.a, t2.b
 FROM t1 ,t2 where (t1.b=t2.a)
order by t1.a
использует индекс только чтобы отсортировать. я уверен, что фулл скан там тоже есть...
индекс неправильный. кажется, надо сделать еще индекс по t2.a
...
Рейтинг: 0 / 0
Про индекс и Left Outer Join
    #32566973
Фотография fedd
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
если не помогло создание индекса т2.а, выложите планы запросов...
...
Рейтинг: 0 / 0
Про индекс и Left Outer Join
    #32567416
ГАГН2.0.0.1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я извиняюсь - вот верный скрипт

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
CREATE TABLE t1 (
a integer  not null,
b integer  not null
);

CREATE TABLE t2 (
a integer not null,
b integer  not null
);

ALTER TABLE t1 ADD CONSTRAINT PK_t1 PRIMARY KEY (b);
ALTER TABLE t2 ADD CONSTRAINT PK_t2 PRIMARY KEY (a);
CREATE INDEX t1_idx_a ON t1 (a);

commit;

 --фулл скан
 
 SELECT t1.a, t2.b
 FROM t1
left outer join t2 on (t1.b=t2.a)
order by t1.a

 --использует индекс
 
 SELECT t1.a, t2.b
 FROM t1 ,t2 where (t1.b=t2.a)
order by t1.a
...
Рейтинг: 0 / 0
Про индекс и Left Outer Join
    #32567428
ГАГН2.0.0.1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ой кажиццо я засветился, но ничиго
Вот планы:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
 --фулл скан
 
 SELECT t1.a, t2.b
 FROM t1
left outer join t2 on (t1.b=t2.a)
order by t1.a

Adapted Plan
PLAN SORT (JOIN (T1 NATURAL,T2 INDEX (PK_T2)))

 --использует индекс
 
 SELECT t1.a, t2.b
 FROM t1 ,t2 where (t1.b=t2.a)
order by t1.a

Adapted Plan
PLAN JOIN (T1 ORDER T1_IDX_A,T2 INDEX (PK_T2))
...
Рейтинг: 0 / 0
Про индекс и Left Outer Join
    #32567439
Фотография fedd
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а планы-то... легче будет сообразить.

планы умеешь доставать из ИБЭксперта?
...
Рейтинг: 0 / 0
Про индекс и Left Outer Join
    #32567440
Фотография fedd
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а, вижу
...
Рейтинг: 0 / 0
Про индекс и Left Outer Join
    #32567450
Фотография fedd
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
гадаю (знаниев не хватаит)

попробуй
Код: plaintext
CREATE INDEX t1_idx_ba ON t1 (b,a);
...
Рейтинг: 0 / 0
Про индекс и Left Outer Join
    #32567493
Фотография fedd
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
слушай, не знаю почему натурал в первом запросе. могу предположить, что мало записей, и оптимизатор решает ну его этот индекс, быстрее натурал получится
...
Рейтинг: 0 / 0
Про индекс и Left Outer Join
    #32567495
Фотография Децл
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не - не то
Код: plaintext
1.
Adapted Plan
PLAN SORT (JOIN (T1 NATURAL,T2 INDEX (PK_T2)))
...
Рейтинг: 0 / 0
Про индекс и Left Outer Join
    #32567500
Фотография Децл
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тогда почему во втором идет по индексу?

зы В боевой базе записей много - 100 000
...
Рейтинг: 0 / 0
Про индекс и Left Outer Join
    #32567506
Фотография fedd
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ДецлНе - не то
Код: plaintext
1.
Adapted Plan
PLAN SORT (JOIN (T1 NATURAL,T2 INDEX (PK_T2)))


да уж вижу что фигня..

по идее должно быть так: сервер должен идит по индексу т1.а по порядку, находить запись в таблице, и по т1.б искать запись в т2, используя индекс т2.а. индекс т1.а ему при этом не нужон. почему он не использует индекс т1.а - не понимаю!

попробуй подсунуть ему план в явном виде...
...
Рейтинг: 0 / 0
Про индекс и Left Outer Join
    #32567535
Фотография Децл
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторпопробуй подсунуть ему план в явном виде...

А как этаа?
...
Рейтинг: 0 / 0
Про индекс и Left Outer Join
    #32567776
Фотография fedd
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я сам этого никогда не делал... я ваще ламер. у меня как-то само все работает.. по моему надо написать план прямо в запрос, толи спереди, толи сзади. план скопируй из второго запроса с иннер джоином...
...
Рейтинг: 0 / 0
Про индекс и Left Outer Join
    #32567873
Фотография Децл
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
 SELECT t1.a, t2.b
 FROM t1
left outer join t2 on (t1.b=t2.a)
PLAN JOIN (T1 ORDER T1_IDX_A,T2 INDEX (RDB$PRIMARY10))
order by t1.a

index  cannot be used in the specified plan.
index T1_IDX_A cannot be used in the specified plan.

????
...
Рейтинг: 0 / 0
Про индекс и Left Outer Join
    #32567889
Злобастый
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ты определись-то, чё те надобно, старче.
С какого перепугу сервер должен пользовать индекс ORDER T1_IDX_A по таблице T1, если никаких ограничений на T1 ты не накладываешь?!
...
Рейтинг: 0 / 0
Про индекс и Left Outer Join
    #32567929
Фотография fedd
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЗлобастыйТы определись-то, чё те надобно, старче.
С какого перепугу сервер должен пользовать индекс ORDER T1_IDX_A по таблице T1, если никаких ограничений на T1 ты не накладываешь?!

а для сортировки??
...
Рейтинг: 0 / 0
Про индекс и Left Outer Join
    #32568003
Злобастый
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сортируется результат джойна. Так что всё тут правильно (с точки зрения оптимизатора).
Если сильно нужно (и позволяют условия), то можно переписать на неявный джойн, через подзапрос. Тогда индекс для сортировку будет использоваться.
Код: plaintext
1.
2.
3.
SELECT t1.a,
       (SELECT t2.b FROM t2 where (t1.b=t2.a))
  FROM t1 
order by t1.a
...
Рейтинг: 0 / 0
Про индекс и Left Outer Join
    #32568012
Фотография fedd
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЗлобастыйСортируется результат джойна. Так что всё тут правильно (с точки зрения оптимизатора).
Если сильно нужно (и позволяют условия), то можно переписать на неявный джойн, через подзапрос. Тогда индекс для сортировку будет использоваться.
Код: plaintext
1.
2.
3.
SELECT t1.a,
       (SELECT t2.b FROM t2 where (t1.b=t2.a))
  FROM t1 
order by t1.a


мне кажется, что в аналогичной ситуации mysql использовал бы индекс... там и подзапросов раньше не было, а с лефт джойном ведь постоянно приходится работать. а тут такая засада - при лефт джойне и ордере - не используются индексыыыы
...
Рейтинг: 0 / 0
Про индекс и Left Outer Join
    #32568034
Злобастый
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
авторв аналогичной ситуации mysql...
Не поминай этот ментальный мастурбатор в приличном обществе.
В отношении индекса в ORDER BY. Дмитрий как-то говорил, что существуют ситуации, когда сервер не всегда показывает индекс в плане, несмотря на то что использует его. Тонкости этого вопроса лучше спросить у него самого.
...
Рейтинг: 0 / 0
Про индекс и Left Outer Join
    #32568046
Фотография fedd
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
цитатник:

/topic/75094&hl=%e8%ed%e4%e5%ea%f1+%ef%eb%e0%ed#539058
тот же топик:
/topic/75094&hl=%e8%ed%e4%e5%ea%f1+%ef%eb%e0%ed#539524

ну пачиму???? в лефт джоин не используются индексы???

(план не показывает индексы в других случаях, а не при лефт джоин. в любом случае, "натурал" оно не пишет, если использует индекс)
...
Рейтинг: 0 / 0
Про индекс и Left Outer Join
    #32568097
Злобастый
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
пАтАму-шо!
Не научили оптимизатор рассматривать этот конкретный частный случай .
В общем же случае, при LEFT JOIN, талица "находящаяся справа" берётся вся, целиком (если не наложены никакие дополнительные ограничения). Потому и используется NATURAL, который в данном случае именно "...то, что доХтор прописал" (С).
Да, для рассматриваемого частного случая, можно было бы взять индекс. Но не факт, что сортировка в данном случае будет менее эффективной, чем полное сканирование индекса.
А вообще, запрос абстрактный. На практике делать полный джойн 2-х таблиц, не накладывая дополнительных ограничений , могут только чайники, при решении игрушечных задач (в основном).
...
Рейтинг: 0 / 0
22 сообщений из 22, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Про индекс и Left Outer Join
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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