Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Ускорить выполнение запроса / 4 сообщений из 4, страница 1 из 1
07.09.2006, 17:12
    #33971827
IgorK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ускорить выполнение запроса
Имеем PostgreSQL 7.3.4
Имеем запрос
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
SELECT r1.id as r_id, count(distinct pc.code) as r_count
FROM prices_catalog pc, rubrics as r1, rubrics as r2
WHERE
 pc.code = r2.code
 AND r1.parent_id =  1000000 
 AND r1.l<=r2.l and r1.r>=r2.r
 AND r1.rubricator_id =  50  AND r2.rubricator_id =  50 
 GROUP BY r1.id
который выполняется 115 сек. План такой
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
Aggregate (cost= 1217747 . 71 .. 1217903 . 73  rows= 2080  width= 36 ) 
-> Group (cost= 1217747 . 71 .. 1217851 . 73  rows= 20803  width= 36 ) 
-> Sort (cost= 1217747 . 71 .. 1217799 . 72  rows= 20803  width= 36 ) 
Sort Key: r1.id 
-> Nested Loop (cost= 0 . 00 .. 1216255 . 63  rows= 20803  width= 36 ) 
Join Filter: (("inner".l <= "outer".l) AND ("inner".r >= "outer".r)) 
-> Nested Loop (cost= 0 . 00 .. 141088 . 96  rows= 20403  width= 24 ) 
-> Seq Scan on prices_catalog pc (cost= 0 . 00 .. 493 . 63  rows= 20363  width= 4 ) 
-> Index Scan using code_idx1 on rubrics r2 (cost= 0 . 00 .. 6 . 89  rows= 1  width= 20 ) 
Index Cond: (("outer".code)::text = r2.code) 
Filter: (rubricator_id =  50 ) 
-> Index Scan using rubrics_parent_idx on rubrics r1 (cost= 0 . 00 .. 52 . 56  rows= 9  width= 12 ) 
Index Cond: (parent_id =  1000000 ) 
Filter: (rubricator_id =  50 ) 
Как можно его ускорить? Индексы вроде по всем полям есть, записей немного.
...
Рейтинг: 0 / 0
07.09.2006, 17:34
    #33971936
LeXa NalBat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ускорить выполнение запроса
приведите пожалуйста описание таблиц с индексами, и EXPLAIN ANALYZE вместо EXPLAIN
...
Рейтинг: 0 / 0
08.09.2006, 14:50
    #33974400
IgorK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ускорить выполнение запроса
индексы такие
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
public prices_catalog firmid_idx CREATE INDEX firmid_idx ON prices_catalog USING btree (firm_id) 
public prices_catalog code_idx CREATE INDEX code_idx ON prices_catalog USING btree (code) 
public prices_catalog prices_catalog_pkey CREATE UNIQUE INDEX prices_catalog_pkey ON prices_catalog USING btree (code, firm_id, num) 
public rubrics ribricator_idx CREATE INDEX ribricator_idx ON rubrics USING btree (rubricator_id) 
public rubrics rubrics_name_idx CREATE INDEX rubrics_name_idx ON rubrics USING btree (name) 
public rubrics lev_idx CREATE INDEX lev_idx ON rubrics USING btree ("level") 
public rubrics code_idx1 CREATE INDEX code_idx1 ON rubrics USING btree (code) 
public rubrics rubrics_parent_idx CREATE INDEX rubrics_parent_idx ON rubrics USING btree (parent_id) 
public rubrics lrr_idx CREATE INDEX lrr_idx ON rubrics USING btree (l, r, rubricator_id) 
public rubrics lr_idx CREATE INDEX lr_idx ON rubrics USING btree (l, r) 
public rubrics l_idx CREATE INDEX l_idx ON rubrics USING btree (l) 
public rubrics r_idx CREATE INDEX r_idx ON rubrics USING btree (r) 
public rubrics rubrics_pkey CREATE UNIQUE INDEX rubrics_pkey ON rubrics USING btree (id) 

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
QUERY PLAN 
Aggregate (cost= 987854 . 38 .. 988004 . 99  rows= 2008  width= 36 ) (actual time= 73865 . 70 .. 74046 . 79  rows= 15  loops= 1 ) 
-> Group (cost= 987854 . 38 .. 987954 . 79  rows= 20081  width= 36 ) (actual time= 73865 . 18 .. 73981 . 39  rows= 20385  loops= 1 ) 
-> Sort (cost= 987854 . 38 .. 987904 . 58  rows= 20081  width= 36 ) (actual time= 73865 . 17 .. 73895 . 76  rows= 20385  loops= 1 ) 
Sort Key: r1.id 
-> Nested Loop (cost= 0 . 00 .. 986419 . 27  rows= 20081  width= 36 ) (actual time= 0 . 21 .. 73771 . 25  rows= 20385  loops= 1 ) 
Join Filter: (("inner".l <= "outer".l) AND ("inner".r >= "outer".r)) 
-> Nested Loop (cost= 0 . 00 .. 150330 . 77  rows= 19404  width= 24 ) (actual time= 0 . 15 .. 10042 . 30  rows= 20385  loops= 1 ) 
-> Seq Scan on prices_catalog pc (cost= 0 . 00 .. 493 . 63  rows= 20363  width= 4 ) (actual time= 0 . 05 .. 139 . 10  rows= 20363  loops= 1 ) 
-> Index Scan using code_idx1 on rubrics r2 (cost= 0 . 00 .. 7 . 34  rows= 1  width= 20 ) (actual time= 0 . 35 .. 0 . 47  rows= 1  loops= 20363 ) 
Index Cond: (("outer".code)::text = r2.code) 
Filter: (rubricator_id =  50 ) 
-> Index Scan using rubrics_parent_idx on rubrics r1 (cost= 0 . 00 .. 42 . 95  rows= 9  width= 12 ) (actual time= 0 . 29 .. 3 . 06  rows= 23  loops= 20385 ) 
Index Cond: (parent_id =  1000000 ) 
Filter: (rubricator_id =  50 ) 
Total runtime:  74050 . 58  msec 
...
Рейтинг: 0 / 0
11.09.2006, 12:07
    #33977608
LeXa NalBat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ускорить выполнение запроса
1. Попробуйте заставить постгрес выбрать другой план выполнения запроса с помощью команд set_enable_nestloop to off,... Приведите пожалуйста полученные планы (explain analyze).

2. Попробуйте заставить постгрес использовать план
Код: plaintext
1.
2.
r1: rubricator_id=50 and parent_id=1000000
  r2: rubricator_id=50 and l>=r1.l and r<=r1.r
    pc: pc.code=r2.code
То есть сначала сканирование r1, затем для каждой найденной строки сканирование r2, затем для каждой найденной в r2 строки - сканирование pc. Для этого создайте индексы (rubricator_id, parent_id), (rubricator_id, l), (pc.code), удалите другие индексы.

3. Если я правильно понял смысл этого запроса - для данной категории (1000000) выбрать список всех ее детей, и для каждого из детей найти кол-во его потомков, которые имеют товары в prices_catalog. Тогда запрос можно переформулировать с использованием where exists ( select 1 from prices_catalog where code=r.code ). При этом не придется искать все записи в prices_catalog.

PS: Как связаны code, l, r для каждой строки в rubrics? Для листовых категорий l=r? Товары могут быть приписаны к нелистовым категориям?
...
Рейтинг: 0 / 0
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Ускорить выполнение запроса / 4 сообщений из 4, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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