How to optimize this simple query :-(

Поиск
Список
Период
Сортировка
От marten@feki.toppoint.de
Тема How to optimize this simple query :-(
Дата
Msg-id 199911211112.MAA21246@feki.toppoint.de
обсуждение исходный текст
Список pgsql-sql
I've the follwoing two tables:

Table P3AT

AO    CHAR(15)
AT    Integer
AV    VARCHAR(80)
AB    LargeInteger


Table P3RL

RELS  CHAR(15)
RELT  CHAR(15)
SRCT  Integer
and some other columns


Indices are on: P3AT.AO, P3AT.AT, P3RL.RELS, P3RL.RELT, P3RL.SRCT 


Now I do the query:

a) SELECT AO,AT,AV FROM P3AT WHERE AO IN     (SELECT RELT FROM P3RL WHERE RELS='9#####3#####RW#' AND (SRCT=1004025))

or via

b) SELECT AO,AT,AV FROM P3AT WHERE EXISTS    (SELECT RELT FROM P3RL WHERE (RELT=AO) AND (RELS= ..) AND ...)


Both statements have the same explain result:

Seq Scan on p3at (cost=14458.84 rows=327480 width=28)SubPlan   -> Index Scan using reltrgind om p3rl (cost=2.05 rows=1
width=12)

Both statements need about 3300 milliseconds to do the job ... and return the
three result rows ...

I gave it another sql-query and this works much better:


c) SELECT AO,AT,AV FROM P3AT,P3RL WHERE      (P3AT.AO=P3RL.RELT) AND (RELS= ...) AND (SRCT= ...)

This gives the following explain result (and the one I would have expected):

NestedLoop (cost=4.1 rows=5 width=40) -> Index Scan using relsrcind on p3rl (cost=2.05 rows=1 width=12) -> Index Scan
usingatrownind on p3at (cost=2.05 rows=327480 width=28)
 

and needs only 5 ms !

Marten













В списке pgsql-sql по дате отправления:

Предыдущее
От: "Hiroshi Inoue"
Дата:
Сообщение: RE: [SQL] Deleting indexes before vacuum?
Следующее
От: Tom Lane
Дата:
Сообщение: Re: [SQL] Deleting indexes before vacuum?