🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: pl.comp.lang.perl
5 messages
5 total messages Started by A.L.E.C Fri, 08 May 2009 10:39
DBD::Pg - wolne execute (nie samo zapytanie, tylko właśnie execute)
#51371
Author: A.L.E.C
Date: Fri, 08 May 2009 10:39
29 lines
1880 bytes
Mam zapytanie SQL, które wg explain wykonuje się poniżej 1 ms:

SELECT n.id, d.userid, d.id AS dataid
FROM phonenumbers n
JOIN phonenumberassignments a ON (a.phonenumberid = n.id)
LEFT JOIN phonecontractdata d ON (d.id = a.phonecontractdataid)
WHERE (n.number = ? OR (n.number < ? AND n.number_end >= ?))
AND d.vdate <= ?
AND (d.todate IS NULL OR d.todate > ?)
AND d.status = 1
ORDER BY d.vdate DESC, d.id DESC
LIMIT 1;

W kodzie używam prepare() a następnie execute('123123123', '123123123', 
'123123123', '2009-04-01', '2009-04-01');

Oprócz tego mam inne zapytania zwracające jeden wiersz, wykonujące się 
(wg explain) w podobnym czasie. Problem polega na tym, że podczas gdy 
wywołanie execute() dla pozostałych zajmuje 0.01 sek., w przypadku tego 
jednego mam 0.15 sek. Czym może być spowodowana taka różnica? Skończyły 
mi się pomysły.

System: Solaris i FreeBSD, DBD::Pg i DBI w najnowszych wersjach, perl 
5.8.8. postgres 8.3.7 i 8.3.3.

-- 
Aleksander 'A.L.E.C' Machniak http://alec.pl gg:2275252
LAN Management System Developer http://lms.org.pl
Roundcube Webmail Project Developer http://roundcube.net
Re: DBD::Pg - wolne execute (nie samo zapytanie, tylko właśnie execute)
#51372
Author: A.L.E.C
Date: Fri, 08 May 2009 12:56
44 lines
3712 bytes
A.L.E.C wrote:
> Mam zapytanie SQL, które wg explain wykonuje się poniżej 1 ms:
> 
> SELECT n.id, d.userid, d.id AS dataid
> FROM phonenumbers n
> JOIN phonenumberassignments a ON (a.phonenumberid = n.id)
> LEFT JOIN phonecontractdata d ON (d.id = a.phonecontractdataid)
> WHERE (n.number = ? OR (n.number < ? AND n.number_end >= ?))
> AND d.vdate <= ?
> AND (d.todate IS NULL OR d.todate > ?)
> AND d.status = 1
> ORDER BY d.vdate DESC, d.id DESC
> LIMIT 1;

Tak wygląda explain:

Limit  (cost=47.57..47.57 rows=1 width=16) (actual time=0.126..0.126 rows=1 loops=1)
   ->  Sort  (cost=47.57..47.57 rows=1 width=16) (actual time=0.125..0.125 rows=1 loops=1)
         Sort Key: d.vdate, d.id
         Sort Method:  quicksort  Memory: 25kB
         ->  Nested Loop  (cost=34.86..47.56 rows=1 width=16) (actual time=0.110..0.115 rows=1 loops=1)
               ->  Nested Loop  (cost=34.86..47.18 rows=1 width=8) (actual time=0.097..0.099 rows=1 loops=1)
                     ->  Bitmap Heap Scan on phonenumbers n  (cost=34.86..38.88 rows=1 width=4) (actual time=0.083..0.083 rows=1 loops=1)
                           Recheck Cond: ((number = 221248415) OR ((number < 221248415) AND (number_end >= 221248415)))
                           ->  BitmapOr  (cost=34.86..34.86 rows=1 width=0) (actual time=0.078..0.078 rows=0 loops=1)
                                 ->  Bitmap Index Scan on phonenumbers_number_key  (cost=0.00..4.29 rows=1 width=0) (actual time=0.017..0.017 rows=1 loops=1)
                                       Index Cond: (number = 221248415)
                                 ->  Bitmap Index Scan on phonenumbers_number_key  (cost=0.00..30.57 rows=1 width=0) (actual time=0.059..0.059 rows=0 loops=1)
                                       Index Cond: ((number < 221248415) AND (number_end >= 221248415))
                     ->  Index Scan using phonenumberassignments_phonenumberid_idx on phonenumberassignments a  (cost=0.00..8.29 rows=1 width=8) (actual time=0.009..0.009 rows=1 loops=1)
                           Index Cond: (a.phonenumberid = n.id)
               ->  Index Scan using phonecontractdata_pkey on phonecontractdata d  (cost=0.00..0.36 rows=1 width=12) (actual time=0.011..0.012 rows=1 loops=1)
                     Index Cond: (d.id = a.phonecontractdataid)
                     Filter: ((d.vdate <= '2009-03-23'::date) AND ((d.todate IS NULL) OR (d.todate > '2009-03-23'::date)) AND (d.status = 1))
Total runtime: 0.224 ms

Aktualnie doszedłem do tego że to samo zapytanie przygotowane przy pomocy prepare/execute
ale bez parametrów działa szybko - 0.001 sek. Teraz pytanie czy to problem
prepared_statements w postgresie, czy DBI? Sprawdzę w php.

-- 
Aleksander 'A.L.E.C' Machniak http://alec.pl gg:2275252
LAN Management System Developer http://lms.org.pl
Roundcube Webmail Project Developer http://roundcube.net
Re: DBD::Pg - wolne execute (nie samo zapytanie, tylko właśnie execute)
#51373
Author: hubert depesz lubaczewski
Date: Fri, 08 May 2009 14:26
13 lines
1398 bytes
On 2009-05-08, A.L.E.C <alec1@poczta.onet.pl> wrote:
> Aktualnie doszedłem do tego że to samo zapytanie przygotowane przy pomocy prepare/execute
> ale bez parametrów działa szybko - 0.001 sek. Teraz pytanie czy to problem
> prepared_statements w postgresie, czy DBI? Sprawdzę w php.

zobaczy czy to nie to cię "ugryzło":
http://www.depesz.com/index.php/2008/05/10/prepared-statements-gotcha/

depesz

-- 
Linkedin: http://www.linkedin.com/in/depesz  /  blog: http://www.depesz.com/
jid/gtalk: depesz@depesz.com / aim:depeszhdl / skype:depesz_hdl / gg:6749007
Re: DBD::Pg - wolne execute (nie samo zapytanie, tylko właśnie execute)
#51375
Author: Daniel Podlejski
Date: Fri, 08 May 2009 14:30
23 lines
1835 bytes
>  Aktualnie doszedłem do tego że to samo zapytanie przygotowane przy pomocy prepare/execute
>  ale bez parametrów działa szybko - 0.001 sek. Teraz pytanie czy to problem
>  prepared_statements w postgresie, czy DBI? Sprawdzę w php.

Wykonanie zapytania "gotowego", a wykonanie przez preapre/execute to
trochę coś innego. Jeśli chcesz zrobić analizę tego co jest wywoływane
przez DBI, musisz puścić explain trochę inaczej. Przygotuj sobie
zapytanie w psql za pomocą:

PREPARE test (typy parametrów) AS zapytanie;

potem wykonaj:

EXPLAIN ANALYZE EXECUTE test(parametry);

Plan wykonania dla zapytania "gotowego" potrafi się różnić od planu
dla PREPARE/EXECUTE, stąd te różnice w czasach wykonia (planer dla
zapytania "gotowego" wie jakich parametrów używasz, a dla PREPARE/EXECUTE
nie wie w momencie "preparowanie", więc czasem pewnych rzeczy nie
jest w stanie zoptymalizować).

-- 
Daniel Podlejski
Re: DBD::Pg - wolne execute (nie samo zapytanie, tylko właśnie execute)
#51374
Author: A.L.E.C
Date: Sat, 09 May 2009 10:44
14 lines
1436 bytes
hubert depesz lubaczewski wrote:

> zobaczy czy to nie to cię "ugryzło":
> http://www.depesz.com/index.php/2008/05/10/prepared-statements-gotcha/

Tak, dokładnie, niestety nie pomaga ani rzutowanie na odpowiednie typy, 
ani zdefiniowanie typów parametrów przy PREPARE. Trochę mnie to smuci, 
bo aplikacja którą piszę wykonuje prawie wszystkie zapytania przez 
prepare/execute z parametrami.

-- 
Aleksander 'A.L.E.C' Machniak http://alec.pl gg:2275252
LAN Management System Developer http://lms.org.pl
Roundcube Webmail Developer http://roundcube.net
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads