From: | Niklas Paulsson <niklas(dot)paulsson(at)lodon(dot)se> |
---|---|
To: | postgresql-perf <pgsql-performance(at)postgresql(dot)org> |
Subject: | SQL performance question |
Date: | 2012-11-22 12:06:01 |
Message-ID: | 50AE1529.3050000@lodon.se |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-performance |
Hello,
This is a performance question that has held me occupied for quite some
time now,
The following join is a somewhat slow query:
(np_artikel, sm_artikel_dim are views and sm_orderrad_* are tables )
xtest=# explain analyze verbose
select * from np_artikel np
join sm_artikel_dim dim on np.artikelid = dim.artikelid
join sm_orderrad ord on ord.artikelid = np.artikelid
JOIN sm_orderrad_storlek STL ON ORD.ordradnr = STL.ordradnr
WHERE STL.BATCHNR = 3616912 AND STL.ORDRADNR = 3 AND ORD.BATCHNR=3616912;
See: http://explain.depesz.com/s/stI
Total runtime: 47748.786 ms
(140 rows)
This is somewhat strange - beacause i look for i single order-row in a
specific order-batch which only returns one article-id. Please see the
following three questions.
xtest=# SELECT distinct artikelid FROM sm_orderrad ORD JOIN
sm_orderrad_storlek STL ON ORD.ordradnr = STL.ordradnr WHERE STL.BATCHNR
= 3616912 AND STL.ORDRADNR = 3 AND ORD.BATCHNR=3616912;
artikelid
-----------
301206
(1 row)
xtest=# explain analyze verbose SELECT distinct artikelid FROM
sm_orderrad ORD JOIN sm_orderrad_storlek STL ON ORD.ordradnr =
STL.ordradnr WHERE STL.BATCHNR = 3616912 AND STL.ORDRADNR = 3 AND
ORD.BATCHNR=3616912;
See: http://explain.depesz.com/s/kI2
Total runtime: 0.256 ms
(13 rows)
xtest=# explain analyze verbose select * from np_artikel np join
sm_artikel_dim dim on np.artikelid = dim.artikelid where np.artikelid
=301206;
See: http://explain.depesz.com/s/fFN
Total runtime: 2.563 ms
(99 rows)
Getting the same result from a question where I use a fixed article-id
is about 23 000 times faster .....
Perhaps if use a subquery?
xtest=# explain analyze select * from np_artikel np join sm_artikel_dim
dim on np.artikelid = dim.artikelid where np.artikelid in ( SELECT
distinct artikelid FROM sm_orderrad ORD JOIN sm_orderrad_storlek STL ON
ORD.ordradnr = STL.ordradnr WHERE STL.BATCHNR = 3616912 AND STL.ORDRADNR
= 3 AND ORD.BATCHNR=3616912);
See:http://explain.depesz.com/s/wcD )
Total runtime: 45542.462 ms
(90 rows)
No, not much luck there either ..
CTE's are cool, or so I've heard atleast ...
xtest=# explain analyze verbose
WITH orders AS ( SELECT distinct artikelid FROM sm_orderrad ORD JOIN
sm_orderrad_storlek STL ON ORD.ordradnr = STL.ordradnr WHERE STL.BATCHNR
= 3616912 AND STL.ORDRADNR = 3 AND ORD.BATCHNR=3616912)
select * from np_artikel np
join sm_artikel_dim dim on np.artikelid = dim.artikelid
join orders on np.artikelid=orders.artikelid;
See: http://explain.depesz.com/s/1a2
Total runtime: 44966.271 ms
(145 rows)
But they aren't much faster than a join, obviously.
My question is the following: Would it be possible to rewrite the query
in such a way or use some kind of server-setting/tuning so it will get
as fast as when I query with a single article-id as argument?
--
+46 734 307 163 (mobile)
www.lodon.se
Besöksadress:
Lodon AB
Vingalandsgatan 8
417 63 Göteborg
From | Date | Subject | |
---|---|---|---|
Next Message | Jeremy Harris | 2012-11-22 13:42:33 | Re: Poor performance using CTE |
Previous Message | Craig Ringer | 2012-11-22 10:34:56 | Re: PQconnectStart/PQconnectPoll |