Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Не включаются индексы при обращении к родительской таблице / 7 сообщений из 7, страница 1 из 1
02.03.2005, 16:29
    #32941769
novill
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не включаются индексы при обращении к родительской таблице
Postgres 8.0

Есть корневая таблица и несколько наследников. Подключаю ее по left join к запросу.
Индексы не включаются! Они есть и у родительской и у дочерних таблиц.
Если подключать дочерние сами по себе все работает.

Почему?
...
Рейтинг: 0 / 0
02.03.2005, 17:35
    #32942008
mwolf
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не включаются индексы при обращении к родительской таблице
novillPostgres 8.0

Есть корневая таблица и несколько наследников. Подключаю ее по left join к запросу.
Индексы не включаются! Они есть и у родительской и у дочерних таблиц.
Если подключать дочерние сами по себе все работает.

Почему?

Чё? Ещё раз вопрос и помедленее, пожалуста.
"подключать дочерние сами по себе" - это что означает?
И "корневая" это как?
"Подключаю ее по left join к запросу" тоже интересно.

Если серьёзно, то показывай:
-структуру таблиц;
-существующие индексы;
-планы выполнения;
тогда может и получится ответить.
...
Рейтинг: 0 / 0
03.03.2005, 09:49
    #32942833
novill
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не включаются индексы при обращении к родительской таблице
CREATE TABLE table1 ( id int4, ...);
CREATE INDEX table1_id ON parent_t USING btree (id);

CREATE TABLE parent_t ( id int4);
CREATE INDEX parent_t_id ON parent_t USING btree (id);

CREATE TABLE child1 ( f1 string) inherits parent_t;
CREATE INDEX child1_id ON child1 USING btree (id);

CREATE TABLE child1 ( f2 date) inherits parent_t;
CREATE INDEX child2_id ON child2 USING btree (id);

select
...
from table1
...
left join parent_t on table1.id=parent_t.id

План

Merge Left Join (cost=303.09..533.09 rows=15000 width=8)
Merge Cond: ("outer".id = "inner".id)
-> Sort (cost=69.83..72.33 rows=1000 width=4)
Sort Key: table1.id
-> Seq Scan on table1 (cost=0.00..20.00 rows=1000 width=4)
-> Sort (cost=233.26..240.76 rows=3000 width=4)
Sort Key: public.parent_t.id
-> Append (cost=0.00..60.00 rows=3000 width=4)
-> Seq Scan on parent_t (cost=0.00..20.00 rows=1000 width=4)
-> Seq Scan on child1 parent_t (cost=0.00..20.00 rows=1000 width=4)
-> Seq Scan on child2 parent_t (cost=0.00..20.00 rows=1000 width=4)

Озадачивают последние три строчки в плане выполнения
...
Рейтинг: 0 / 0
03.03.2005, 11:51
    #32943249
mwolf
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не включаются индексы при обращении к родительской таблице
novill
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
CREATE TABLE table1 ( id int4, ...);
CREATE INDEX table1_id ON parent_t  USING btree (id);

CREATE TABLE parent_t ( id int4);
CREATE INDEX parent_t_id ON parent_t  USING btree (id);

CREATE TABLE child1 ( f1 string) inherits parent_t;
CREATE INDEX child1_id ON child1  USING btree (id);

CREATE TABLE child1 ( f2 date)  inherits parent_t;
CREATE INDEX child2_id ON child2  USING btree (id);

select 
...
from table1
...
left join parent_t on table1.id=parent_t.id
План
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
Merge Left Join  (cost= 303 . 09 .. 533 . 09  rows= 15000  width= 8 )
  Merge Cond: ("outer".id = "inner".id)
  ->  Sort  (cost= 69 . 83 .. 72 . 33  rows= 1000  width= 4 )
        Sort Key: table1.id
        ->  Seq Scan on table1  (cost= 0 . 00 .. 20 . 00  rows= 1000  width= 4 )
  ->  Sort  (cost= 233 . 26 .. 240 . 76  rows= 3000  width= 4 )
        Sort Key: public.parent_t.id
        ->  Append  (cost= 0 . 00 .. 60 . 00  rows= 3000  width= 4 )
              ->  Seq Scan on parent_t  (cost= 0 . 00 .. 20 . 00  rows= 1000  width= 4 )
              ->  Seq Scan on child1 parent_t  (cost= 0 . 00 .. 20 . 00  rows= 1000  width= 4 )
              ->  Seq Scan on child2 parent_t  (cost= 0 . 00 .. 20 . 00  rows= 1000  width= 4 )
Озадачивают последние три строчки в плане выполнения

Однако.
Скажем прямо, никогда не использовал наследуемые таблицы. А проблема, судя по всему, в этом. Если я правильно понял план, то твой запрос эквивалентен такому (не знаю только, что у тебя в select-части):
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
select 
...
from table1
...
left join (
  SELECT id FROM parent_t
  UNION ALL
  SELECT id FROM child1
  UNION ALL
  SELECT id FROM child2
) AS t
on table1.id=t.id
А тут индексами и не светит. (((
Переделай, пожалуста, мой запрос со своими полями и покажи план этого запроса. Есть подозрение, что они будут одинаковы.

Для оптимизации, скорее всего, прийдётся отказываться от наследуемых таблиц.
...
Рейтинг: 0 / 0
03.03.2005, 12:45
    #32943387
LeXa NalBat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не включаются индексы при обращении к родительской таблице
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
=> explain select * from parent_t order by id;
                                   QUERY PLAN
---------------------------------------------------------------------------------
 Sort  (cost= 11 . 52 .. 12 . 06  rows= 216  width= 4 )
   Sort Key: public.parent_t.id
   ->  Result  (cost= 0 . 00 .. 3 . 14  rows= 216  width= 4 )
         ->  Append  (cost= 0 . 00 .. 3 . 14  rows= 216  width= 4 )
               ->  Seq Scan on parent_t  (cost= 0 . 00 .. 3 . 14  rows= 214  width= 4 )
               ->  Seq Scan on child1 parent_t  (cost= 0 . 00 .. 0 . 00  rows= 1  width= 4 )
               ->  Seq Scan on child2 parent_t  (cost= 0 . 00 .. 0 . 00  rows= 1  width= 4 )

=> explain select * from parent_t where id between  10  and  20  order by id;
                                            QUERY PLAN
---------------------------------------------------------------------------------------------------
 Sort  (cost= 13 . 43 .. 13 . 44  rows= 4  width= 4 )
   Sort Key: public.parent_t.id
   ->  Result  (cost= 0 . 00 .. 13 . 39  rows= 4  width= 4 )
         ->  Append  (cost= 0 . 00 .. 13 . 39  rows= 4  width= 4 )
               ->  Index Scan using parent_t_id on parent_t  (cost= 0 . 00 .. 6 . 03  rows= 2  width= 4 )
                     Index Cond: ((id >=  10 ) AND (id <=  20 ))
               ->  Index Scan using child1_id on child1 parent_t  (cost= 0 . 00 .. 3 . 68  rows= 1  width= 4 )
                     Index Cond: ((id >=  10 ) AND (id <=  20 ))
               ->  Index Scan using child2_id on child2 parent_t  (cost= 0 . 00 .. 3 . 68  rows= 1  width= 4 )
                     Index Cond: ((id >=  10 ) AND (id <=  20 ))

Мне кажется, что в обоих этих запросах можно избавиться от внешней сортировки, если использовать вместо тупого APPEND аналог MERGE JOIN. Но ... либо а) я ошибаюсь, и этого сделать нельзя, либо б) постгрес пока так делать не умеет, либо в) у нас не получилось его запинать (это маловероятно).
...
Рейтинг: 0 / 0
03.03.2005, 13:33
    #32943579
4321
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не включаются индексы при обращении к родительской таблице
Да, индексов на всю иерархию (или хотя бы на подвыборку) явно не хватает. Точно так же как и возможности построить п-кей на всю иерархию (с тем, чтобы завязаться F-Key-ем к ней). Т.е. изюм с червячком. Придется вместно иерархии юзать "звезду" (там, в свою очередь будет не хватать "инедкса на поля 2 таблиц, связанных 1->1"). Единственно, что "честно наследуется" (кроме полей) -Чек констрайнты (я даже подумывал попытаться вызывать чеком в корне (на поле "п-кея") ф-ю, которая будет апдейтить ключи на стороне некой "вторичной ко всей иерархии" таблички - вместо вторичного ключа (UPDATE CASCADE), и возвращать по отработке True. Но чек не срабатывает при удалении - не сделаешь на ON DELETE).
...
Рейтинг: 0 / 0
04.03.2005, 21:29
    #32947411
centur
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не включаются индексы при обращении к родительской таблице
для Primary\foreign ключей на иерархичекие таблицы используй .../contrib/refint
как выяснилось с 8.0 идет в стандартной поставке контрибов
...
Рейтинг: 0 / 0
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Не включаются индексы при обращении к родительской таблице / 7 сообщений из 7, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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