Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Долго выполняется запрос / 9 сообщений из 9, страница 1 из 1
08.12.2004, 17:13
    #32819266
e60
e60
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Долго выполняется запрос
В ons около 38 млн записей
в cg порядка 10 000
в ers 15
Машина P4 2.8 Ghz 1Gb RAM Два ATA диска в RAID 1 (это тестовый комп)

запрос
Код: plaintext
select id,wbi,ddate from ons where cgid in(select id from cg) and stackid= 1 ::int4 anderid in(select id from ers where typeid= 1 ) order by id,wbi limit  10 ;
выполняется
Time: 183224.340 ms (6 минут с копейками)
вот что выводит explain
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
Limit  (cost= 1409378 . 39 .. 1409378 . 41  rows= 10  width= 12 )
   ->  Sort  (cost= 1409378 . 39 .. 1409380 . 78  rows= 955  width= 12 )
         Sort Key: wagons.id, wagons.wbill
         ->  Hash IN Join  (cost= 45 . 01 .. 1409331 . 12  rows= 955  width= 12 )
               Hash Cond: ("outer".cargoid = "inner".id)
               ->  Hash IN Join  (cost= 22 . 51 .. 1409294 . 30  rows= 955  width= 16 )
                     Hash Cond: ("outer".ownerid = "inner".id)
                     ->  Seq Scan on wagons  (cost= 0 . 00 .. 1408307 . 85  rows=190877width= 20 )
                           Filter: (stackid =  1 )
                     ->  Hash  (cost= 22 . 50 .. 22 . 50  rows= 5  width= 4 )
                           ->  Seq Scan on companies  (cost= 0 . 00 .. 22 . 50  rows= 5  width= 4 )
                                 Filter: (typeid =  1 )
               ->  Hash  (cost= 20 . 00 .. 20 . 00  rows= 1000  width= 4 )
                     ->  Seq Scan on cargo  (cost= 0 . 00 .. 20 . 00  rows= 1000  width= 4 )
( 14  rows)
если установить SET enable_seqscan=false;
Time: 299074.389 ms (10 мин с хвостом)
то explain выводит
-------------------------------
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
Limit  (cost= 3712521 . 15 .. 3712521 . 17  rows= 10  width= 12 )
   ->  Sort  (cost= 3712521 . 15 .. 3712523 . 54  rows= 955  width= 12 )
         Sort Key: wagons.id, wagons.wbill
         ->  Hash IN Join  (cost= 109 . 01 .. 3712473 . 88  rows= 955  width= 12 )
               Hash Cond: ("outer".cargoid = "inner".id)
               ->  Nested Loop  (cost= 54 . 51 .. 3712405 . 06  rows= 955  width= 16 )
                     ->  HashAggregate  (cost= 54 . 51 .. 54 . 51  rows= 5  width= 4 )
                           ->  Index Scan using companies_pkey on companies  (cost= 0 . 00 .. 54 . 50  rows= 5  width= 4 )
                                 Filter: (typeid =  1 )
                     ->  Index Scan using wagons_cmpo on wagons  (cost= 0 . 00 .. 742458 . 18  rows= 954  width= 20 )
                           Index Cond: (wagons.ownerid = "outer".id)
                           Filter: (stackid =  1 )
               ->  Hash  (cost= 52 . 00 .. 52 . 00  rows= 1000  width= 4 )
                     ->  Index Scan using cargo_pkey on cargo  (cost= 0 . 00 .. 52 . 00 
 rows= 1000  width= 4 )
(14 rows)

Вот параметры postgresql.conf
Код: plaintext
1.
2.
3.
4.
5.
6.
shared_buffers =  3072 		# min  16 , at least max_connections* 2 , 8KB each
sort_mem =  30720 		# min  64 , size in KB
vacuum_mem =  40960 		# min  1024 , size in KB

# - Free Space Map -
max_fsm_pages =  400000 		# min max_fsm_relations* 16 ,  6  bytes each
max_fsm_relations =  20000 	# min  100 ,  50  bytes eachъ
Вопрос может ли быстрее?
...
Рейтинг: 0 / 0
08.12.2004, 17:28
    #32819304
nevermind
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Долго выполняется запрос
Поменяй in на exists. Что с индексами по полям из order by? Покажи дескрайбы таблиц
...
Рейтинг: 0 / 0
08.12.2004, 19:02
    #32819510
Долго выполняется запрос
Я может не в тему, но просто интересно почему не через простые джойны это сделать.
У Вас везде как я вижу идет HASH JOIN хотя как я понимаю должно ходить по индексам.


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
select 
	id,wbi,ddate 
from 
	ons as ONS

	INNER JOIN cg as CG ON
		CG.id = ONS.cgid

	INNER JOIN ers as ERS ON 
		ERS.id = ONS.erid
WHERE
	stackid= 1 ::int4

ORDER BY
	id,wbi 
LIMIT  10 ;
...
Рейтинг: 0 / 0
08.12.2004, 22:44
    #32819672
Sad Spirit
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Долго выполняется запрос
не кисло было бы VACUUM ANALYZE сделать, похоже статистика не имеет отношения к реальности.

И легенду проработай как следует, а то у тебя таблицы в запросе и в EXPLAIN по-разному называются...
...
Рейтинг: 0 / 0
09.12.2004, 09:56
    #32819953
LeXa NalBat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Долго выполняется запрос
e60вот что выводит explain
Приведите пожалуйста вывод explain analyze.
...
Рейтинг: 0 / 0
09.12.2004, 12:50
    #32820541
mwolf
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Долго выполняется запрос
Хочется узнать версию Постгреса. Если меньше 7.4, то сразу меняй IN на EXISTS.

Так же было бы неплохо увидеть описания таблиц и индексов на них.

Насчёт параметров сервера - если на машина будет работать только на СУБД, то не жмись на память, отдавай её всю Постгресу. У меня машина тоже с гигом ОЗУ и вот мои настройки:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
shared_buffers = 131072         # min max_connections*2 or 16, 8KB each
max_fsm_relations = 1000        # min 10, fsm is free space map, ~40 bytes
max_fsm_pages = 32000           # min 1000, fsm is free space map, ~6 bytes
wal_buffers = 128               # min 4, typically 8KB each

sort_mem = 20480                # min 64, size in KB
vacuum_mem = 20480              # min 1024, size in KB
...
Рейтинг: 0 / 0
09.12.2004, 12:56
    #32820568
e60
e60
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Долго выполняется запрос
LeXa NalBat e60вот что выводит explain
Приведите пожалуйста вывод explain analyze.
Вот
Код: 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.
28.
29.
30.
31.
 Limit  (cost= 743454 . 81 .. 743454 . 84  rows= 10  width= 12 ) (actual time= 304791 . 892 .. 30 
 4791 . 998  rows= 10  loops= 1 )
   ->  Sort  (cost= 743454 . 81 .. 743457 . 20  rows= 955  width= 12 ) (actual time= 304791 . 8 
 81 .. 304791 . 914  rows= 10  loops= 1 )
         Sort Key: ons.id, ons.wbi
         ->  Merge IN Join  (cost= 743343 . 21 .. 743407 . 55  rows= 955  width= 12 ) (actua
l time= 304786 . 787 .. 304790 . 947  rows= 203  loops= 1 )
               Merge Cond: ("outer".cgid = "inner".id)
               ->  Sort  (cost= 742518 . 57 .. 742520 . 96  rows= 955  width= 16 ) (actual t
ime= 304679 . 196 .. 304683 . 367  rows= 1080  loops= 1 )
                     Sort Key: ons.cgid
                     ->  Nested Loop  (cost= 1 . 19 .. 742471 . 30  rows= 955  width= 16 ) (
actual time= 304434 . 434 .. 304674 . 586  rows= 1080  loops= 1 )
                           ->  HashAggregate  (cost= 1 . 19 .. 1 . 19  rows= 1  width= 4 ) (
actual time= 8 . 990 .. 9 . 014  rows= 2  loops= 1 )
                                 ->  Seq Scan on ers  (cost= 0 . 00 .. 1 . 19  rows= 1  wi
dth= 4 ) (actual time= 8 . 939 .. 8 . 957  rows= 2  loops= 1 )
                                       Filter: (typeid =  1 )
                           ->  Index Scan using ons_ers on ons  (cost= 0 . 00 .. 7424 
 58 . 18  rows= 954  width= 20 ) (actual time= 152236 . 205 .. 152327 . 886  rows= 540  loops= 2 )
                                 Index Cond: (ons.erid = "outer".id)                                 
	               Filter: (stackid =  1 )
               ->  Sort  (cost= 824 . 64 .. 849 . 64  rows= 10003  width= 4 ) (actual time= 1 
 00 . 545 .. 101 . 325  rows= 205  loops= 1 )
                     Sort Key: cg.id
                     ->  Seq Scan on cg  (cost= 0 . 00 .. 160 . 03  rows= 10003  width= 4 )
(actual time= 3 . 643 .. 57 . 144  rows= 10003  loops= 1 )
 Total runtime:  304793 . 174  ms
( 18  rows)

Time:  304852 . 174  ms
...
Рейтинг: 0 / 0
09.12.2004, 15:26
    #32821170
LeXa NalBat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Долго выполняется запрос
Код: plaintext
1.
2.
->  Index Scan using ons_ers on ons  (cost= 0 . 00 .. 742458 . 18  rows= 954  width= 20 ) (actual time= 152236 . 205 .. 152327 . 886  rows= 540  loop s= 2 )
  Index Cond: (ons.erid = "outer".id)
  Filter: (stackid =  1 )

Создайте индекс erid,stackid или stackid,erid на ons.
...
Рейтинг: 0 / 0
09.12.2004, 17:55
    #32821674
e60
e60
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Долго выполняется запрос
LeXa NalBat
Код: plaintext
1.
2.
->  Index Scan using ons_ers on ons  (cost= 0 . 00 .. 742458 . 18  rows= 954  width= 20 ) (actual time= 152236 . 205 .. 152327 . 886  rows= 540  loop s= 2 )
  Index Cond: (ons.erid = "outer".id)
  Filter: (stackid =  1 )

Создайте индекс erid,stackid или stackid,erid на ons.
Клево 4 секунды :)
Еще вопрос а вообще реально могут с такой таблицей работать на чтение пользователей 10-15 одновременно?
...
Рейтинг: 0 / 0
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Долго выполняется запрос / 9 сообщений из 9, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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