Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Про индекс и Left Outer Join / 22 сообщений из 22, страница 1 из 1
18.06.2004, 11:30:50
    #32566780
Децл
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Про индекс и Left Outer Join
Привет.
Сервер 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
18.06.2004, 11:35:23
    #32566793
fedd
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Про индекс и Left Outer Join
имхо, вот это
Код: 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
18.06.2004, 12:28:45
    #32566973
fedd
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Про индекс и Left Outer Join
если не помогло создание индекса т2.а, выложите планы запросов...
...
Рейтинг: 0 / 0
18.06.2004, 14:31:50
    #32567416
ГАГН2.0.0.1
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Про индекс и Left Outer Join
Я извиняюсь - вот верный скрипт

Код: 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
18.06.2004, 14:35:26
    #32567428
ГАГН2.0.0.1
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Про индекс и Left Outer Join
Ой кажиццо я засветился, но ничиго
Вот планы:

Код: 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
18.06.2004, 14:37:39
    #32567439
fedd
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Про индекс и Left Outer Join
а планы-то... легче будет сообразить.

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

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

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


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

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

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

А как этаа?
...
Рейтинг: 0 / 0
18.06.2004, 16:21:52
    #32567776
fedd
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Про индекс и Left Outer Join
я сам этого никогда не делал... я ваще ламер. у меня как-то само все работает.. по моему надо написать план прямо в запрос, толи спереди, толи сзади. план скопируй из второго запроса с иннер джоином...
...
Рейтинг: 0 / 0
18.06.2004, 16:53:12
    #32567873
Децл
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Про индекс и Left Outer Join
Код: 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
18.06.2004, 17:01:44
    #32567889
Злобастый
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Про индекс и Left Outer Join
Ты определись-то, чё те надобно, старче.
С какого перепугу сервер должен пользовать индекс ORDER T1_IDX_A по таблице T1, если никаких ограничений на T1 ты не накладываешь?!
...
Рейтинг: 0 / 0
18.06.2004, 17:13:00
    #32567929
fedd
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Про индекс и Left Outer Join
ЗлобастыйТы определись-то, чё те надобно, старче.
С какого перепугу сервер должен пользовать индекс ORDER T1_IDX_A по таблице T1, если никаких ограничений на T1 ты не накладываешь?!

а для сортировки??
...
Рейтинг: 0 / 0
18.06.2004, 17:47:58
    #32568003
Злобастый
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Про индекс и Left Outer Join
Сортируется результат джойна. Так что всё тут правильно (с точки зрения оптимизатора).
Если сильно нужно (и позволяют условия), то можно переписать на неявный джойн, через подзапрос. Тогда индекс для сортировку будет использоваться.
Код: 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
18.06.2004, 17:53:19
    #32568012
fedd
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Про индекс и Left Outer Join
ЗлобастыйСортируется результат джойна. Так что всё тут правильно (с точки зрения оптимизатора).
Если сильно нужно (и позволяют условия), то можно переписать на неявный джойн, через подзапрос. Тогда индекс для сортировку будет использоваться.
Код: 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
18.06.2004, 18:08:28
    #32568034
Злобастый
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Про индекс и Left Outer Join
авторв аналогичной ситуации mysql...
Не поминай этот ментальный мастурбатор в приличном обществе.
В отношении индекса в ORDER BY. Дмитрий как-то говорил, что существуют ситуации, когда сервер не всегда показывает индекс в плане, несмотря на то что использует его. Тонкости этого вопроса лучше спросить у него самого.
...
Рейтинг: 0 / 0
18.06.2004, 18:19:02
    #32568046
fedd
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Про индекс и Left Outer Join
цитатник:

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


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