From: | Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us> |
---|---|
To: | Neil Conway <neilc(at)samurai(dot)com> |
Cc: | Dawid Kuroczko <qnex42(at)gmail(dot)com>, pgsql-general(at)postgresql(dot)org |
Subject: | Re: psql vs perl prepared inserts |
Date: | 2005-04-13 15:11:42 |
Message-ID: | 7421.1113405102@sss.pgh.pa.us |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-general |
Neil Conway <neilc(at)samurai(dot)com> writes:
> The intent of prepared statements is to reduce the overhead of running
> the parser, rewriter and planner multiple times for a statement that is
> executed multiple times. For an INSERT query without any sub-selects
> that is not rewritten by any rules, the cost to parse, rewrite and plan
> the statement is trivial.
You'd be surprised ...
I was looking into this just the other day, with a test case that looks
like
create table bench1 (id int NOT NULL,id2 int NOT NULL,id3 int NOT NULL,
dummy1 char(30));
create unique index bench1_index_ on bench1 (id,id2);
create index bench1_index_1 on bench1 (id3);
begin;
insert into bench1 values (0,0,0,'ABCDEFGHIJ');
... 300,000 inserts ...
insert into bench1 values (167151,167151,167151,'CDEFGHIJKL');
commit;
According to gprof, the above-1% functions are
% cumulative self self total
time seconds seconds calls s/call s/call name
6.62 53.38 53.38 300007 0.00 0.00 yyparse
5.31 96.19 42.81 11808781 0.00 0.00 hash_search
4.44 132.00 35.81 61268959 0.00 0.00 AllocSetAlloc
4.23 166.13 34.13 902304 0.00 0.00 XLogInsert
3.20 191.99 25.86 13688735 0.00 0.00 _bt_compare
2.94 215.75 23.76 12158347 0.00 0.00 LWLockAcquire
2.67 237.32 21.58 4500066 0.00 0.00 base_yylex
2.56 258.00 20.68 6000510 0.00 0.00 SearchCatCache
1.99 274.07 16.07 12160856 0.00 0.00 LWLockRelease
1.88 289.25 15.18 13008925 0.00 0.00 hash_any
1.49 301.25 12.01 2452386 0.00 0.00 PinBuffer
1.36 312.25 11.00 1201324 0.00 0.00 fmgr_info_cxt_security
1.36 323.24 10.98 300000 0.00 0.00 planner
1.19 332.81 9.57 20700142 0.00 0.00 MemoryContextAllocZeroAligned
I don't trust gprof's tree-structured breakdown entirely, but it puts
a pretty significant fraction of the blame on parse/plan activities:
3.66 767.69 300007/300007 PostgresMain [4]
[5] 95.6 3.66 767.69 300007 exec_simple_query [5]
6.13 283.12 300007/300007 PortalRun [6]
0.48 167.39 300007/300007 pg_analyze_and_rewrite [9]
0.47 122.85 300007/300007 pg_plan_queries [16]
1.56 93.29 300007/300007 pg_parse_query [23]
0.62 34.78 300007/300007 pg_rewrite_queries [52]
0.99 17.39 300007/300007 PortalDrop [79]
0.56 16.26 600014/600014 finish_xact_command [84]
1.19 6.89 300007/300007 CreatePortal [126]
1.08 2.29 600014/600014 start_xact_command [186]
1.88 0.36 300007/300007 PortalStart [218]
0.76 1.44 300007/300007 pq_puttextmessage [220]
1.35 0.00 300007/600017 set_ps_display [210]
1.27 0.00 300007/300007 CreateCommandTag [271]
0.89 0.22 300007/300007 printtup_create_DR [286]
0.74 0.00 300007/300007 CreateDestReceiver [328]
0.61 0.00 300007/600015 pgstat_report_activity [277]
0.10 0.14 300007/13864259 pfree [112]
0.23 0.00 300007/300007 PortalSetResultFormat [449]
0.19 0.00 300007/300007 IsAbortedTransactionBlockState [474]
0.07 0.00 300007/300007 printtup_destroy [564]
0.05 0.00 300007/300007 PortalDefineQuery [580]
0.03 0.00 300007/300007 EndCommand [617]
0.01 0.00 300007/300007 BeginCommand [670]
That adds up to over 50% of the runtime spent in parse/rewrite/plan.
I haven't gotten around to converting the test case into a program that
can use a prepared INSERT command, but it looks plausible to expect
a factor of 2 or so speedup ... of course, using COPY would completely
blow this away, anyway ...
regards, tom lane
From | Date | Subject | |
---|---|---|---|
Next Message | Eric D. Nielsen | 2005-04-13 15:41:41 | Re: PostGreSQL (7.3?) recovery, Mac OS X (10.3.8) |
Previous Message | Daniel Verite | 2005-04-13 14:52:42 | Re: psql vs perl prepared inserts |