Received: from maia.hub.org (maia-3.hub.org [200.46.204.243]) by mail.postgresql.org (Postfix) with ESMTP id 3BAFF1337B47 for ; Mon, 28 Feb 2011 14:47:57 -0400 (AST) Received: from mail.postgresql.org ([200.46.204.86]) by maia.hub.org (mx1.hub.org [200.46.204.243]) (amavisd-maia, port 10024) with ESMTP id 11749-06 for ; Mon, 28 Feb 2011 18:47:48 +0000 (UTC) X-Greylist: from auto-whitelisted by SQLgrey-1.7.6 Received: from mimolette.dalibo.net (unknown [212.85.154.222]) by mail.postgresql.org (Postfix) with ESMTP id DEE071337BA4 for ; Mon, 28 Feb 2011 14:47:47 -0400 (AST) Received: from marco-dalibo.localnet (gev44-1-78-228-108-65.fbx.proxad.net [78.228.108.65]) by mimolette.dalibo.net (Postfix) with ESMTPSA id 46DB7D83FC; Mon, 28 Feb 2011 19:47:47 +0100 (CET) From: Marc Cousin To: Tom Lane Subject: Re: inheritance: planning time vs children number vs column number Date: Mon, 28 Feb 2011 19:47:46 +0100 User-Agent: KMail/1.13.6 (Linux/2.6.37-ARCH; KDE/4.6.0; x86_64; ; ) Cc: Heikki Linnakangas , pgsql-performance@postgresql.org References: <201102281038.04945.cousinmarc@gmail.com> <201102281409.55827.cousinmarc@gmail.com> <7266.1298907337@sss.pgh.pa.us> In-Reply-To: <7266.1298907337@sss.pgh.pa.us> X-KMail-Markup: true MIME-Version: 1.0 Content-Type: Multipart/Mixed; boundary="Boundary-00=_S3+aNTluOgiQZGx" Message-Id: <201102281947.46590.cousinmarc@gmail.com> X-Virus-Scanned: Maia Mailguard 1.0.1 X-Spam-Status: No, hits=-1.105 tagged_above=-10 required=5 tests=BAYES_00=-1.9, FREEMAIL_FROM=0.001, HTML_MESSAGE=0.001, RDNS_NONE=0.793 X-Spam-Level: X-Archive-Number: 201102/534 X-Sequence-Number: 42672 --Boundary-00=_S3+aNTluOgiQZGx Content-Type: multipart/alternative; boundary="Boundary-01=_S3+aNW1MrmcSfPB" Content-Transfer-Encoding: 7bit --Boundary-01=_S3+aNW1MrmcSfPB Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable The Monday 28 February 2011 16:35:37, Tom Lane wrote : > Marc Cousin writes: > > The Monday 28 February 2011 13:57:45, Heikki Linnakangas wrote : > >> Testing here with a table with 1000 columns and 100 partitions, about > >> 80% of the planning time is looking up the statistics on attribute > >> width, to calculate average tuple width. I don't see O(n^2) behavior, > >> though, it seems linear. > >=20 > > It is only based on experimentation, for my part, of course=C3=A2=C2=80= =C5=A0 > >=20 > > If you measure the planning time, modifying either the columns or the > > partitions number, the square root of the planning time is almost > > perfectly proportional with the parameter you're playing with. >=20 > Could we see a concrete example demonstrating that? I agree with Heikki > that it's not obvious what you are testing that would have such behavior. > I can think of places that would have O(N^2) behavior in the length of > the targetlist, but it seems unlikely that they'd come to dominate > runtime at a mere 1000 columns. >=20 > regards, tom lane I feel a little silly not having provided a test case from the start=E2=80= =A6 A script doing a complete test is attached to this email. It's doing a simple=20 CREATE TABLE test_father (col0 int,col1 int,col2 int,col3 int,col4 int,col5= =20 int,col6 int,col7 int,col8 int,col9 int,col10 in t,col11 int,col12 int,col13 int,col14 int,col15 int,col16 int,col17 int,col= 18=20 int,col19 int,col20 int,col21 int,col22 int,co l23 int,=E2=80=A6) =46ollowed by 600=20 CREATE TABLE test_child_0 (CHECK (col0=3D0)) INHERITS (test_father); And a single=20 SELECT col0 FROM test_father WHERE col0=3D0; Here are my results (from the same machine). I've done it with 600 partitio= ns,=20 to have big planning times. If you need a smaller one (this one takes nearl= y=20 ten minutes to run) tell me. COLS:100 PARTITIONS:600 Time : 513,764 ms (sqrt : 22.6) COLS:200 PARTITIONS:600 Time : 906,214 ms (sqrt : 30.1) COLS:300 PARTITIONS:600 Time : 2255,390 ms (sqrt : 47.48) COLS:400 PARTITIONS:600 Time : 4816,820 ms (sqrt : 69.4) COLS:500 PARTITIONS:600 Time : 5736,602 ms (sqrt : 75.73) COLS:600 PARTITIONS:600 Time : 7659,617 ms (sqrt : 87.51) COLS:700 PARTITIONS:600 Time : 9313,260 ms (sqrt : 96.5) COLS:800 PARTITIONS:600 Time : 13700,353 ms (sqrt : 117.04) COLS:900 PARTITIONS:600 Time : 13914,765 ms (sqrt : 117.95) COLS:1000 PARTITIONS:600 Time : 20335,750 ms (sqrt : 142.6) COLS:1100 PARTITIONS:600 Time : 21048,958 ms (sqrt : 145.08) COLS:1200 PARTITIONS:600 Time : 27619,559 ms (sqrt : 166.18) COLS:1300 PARTITIONS:600 Time : 31357,353 ms (sqrt : 177.08) COLS:1400 PARTITIONS:600 Time : 34435,711 ms (sqrt : 185.57) COLS:1500 PARTITIONS:600 Time : 38954,676 ms (sqrt : 197.37) As for my previous results, these ones are on a machine doing a bit of othe= r=20 work, so some values may be a bit offset, and it's only one measure each ti= me=20 anyway. The CSV file I sent from the first email is obtained running the exact same= =20 commands, but playing on both columns and partitions, and averaged over 3=20 measures. Regards. --Boundary-01=_S3+aNW1MrmcSfPB Content-Type: text/html; charset="utf-8" Content-Transfer-Encoding: quoted-printable

The Monday = 28 February 2011 16:35:37, Tom Lane wrote :

> Marc C= ousin <cousinmarc@gmail.com> writes:

> > T= he Monday 28 February 2011 13:57:45, Heikki Linnakangas wrote :

> >&g= t; Testing here with a table with 1000 columns and 100 partitions, about

> >&g= t; 80% of the planning time is looking up the statistics on attribute

> >&g= t; width, to calculate average tuple width. I don't see O(n^2) behavior,

> >&g= t; though, it seems linear.

> > <= /p>

> > I= t is only based on experimentation, for my part, of course=C3=A2=C2=80=C5= =A0

> > <= /p>

> > I= f you measure the planning time, modifying either the columns or the

> > p= artitions number, the square root of the planning time is almost

> > p= erfectly proportional with the parameter you're playing with.

>

> Could = we see a concrete example demonstrating that? I agree with Heikki

> that i= t's not obvious what you are testing that would have such behavior.

> I can = think of places that would have O(N^2) behavior in the length of

> the ta= rgetlist, but it seems unlikely that they'd come to dominate

> runtim= e at a mere 1000 columns.

>

> reg= ards, tom lane


I feel a li= ttle silly not having provided a test case from the start=E2=80=A6


A script do= ing a complete test is attached to this email.


It's doing = a simple


CREATE TABL= E test_father (col0 int,col1 int,col2 int,col3 int,col4 int,col5 int,col6 i= nt,col7 int,col8 int,col9 int,col10 in

t,col11 int= ,col12 int,col13 int,col14 int,col15 int,col16 int,col17 int,col18 int,col1= 9 int,col20 int,col21 int,col22 int,co

l23 int,=E2= =80=A6)


Followed by= 600

CREATE TABL= E test_child_0 (CHECK (col0=3D0)) INHERITS (test_father);


And a singl= e


SELECT col0= FROM test_father WHERE col0=3D0;



Here are my= results (from the same machine). I've done it with 600 partitions, to have= big planning times. If you need a smaller one (this one takes nearly ten m= inutes to run) tell me.


COLS:100 PA= RTITIONS:600

Time : 513,= 764 ms (sqrt : 22.6)

COLS:200 PA= RTITIONS:600

Time : 906,= 214 ms (sqrt : 30.1)

COLS:300 PA= RTITIONS:600

Time : 2255= ,390 ms (sqrt : 47.48)

COLS:400 PA= RTITIONS:600

Time : 4816= ,820 ms (sqrt : 69.4)

COLS:500 PA= RTITIONS:600

Time : 5736= ,602 ms (sqrt : 75.73)

COLS:600 PA= RTITIONS:600

Time : 7659= ,617 ms (sqrt : 87.51)

COLS:700 PA= RTITIONS:600

Time : 9313= ,260 ms (sqrt : 96.5)

COLS:800 PA= RTITIONS:600

Time : 1370= 0,353 ms (sqrt : 117.04)

COLS:900 PA= RTITIONS:600

Time : 1391= 4,765 ms (sqrt : 117.95)

COLS:1000 P= ARTITIONS:600

Time : 2033= 5,750 ms (sqrt : 142.6)

COLS:1100 P= ARTITIONS:600

Time : 2104= 8,958 ms (sqrt : 145.08)

COLS:1200 P= ARTITIONS:600

Time : 2761= 9,559 ms (sqrt : 166.18)

COLS:1300 P= ARTITIONS:600

Time : 3135= 7,353 ms (sqrt : 177.08)

COLS:1400 P= ARTITIONS:600

Time : 3443= 5,711 ms (sqrt : 185.57)

COLS:1500 P= ARTITIONS:600

Time : 3895= 4,676 ms (sqrt : 197.37)



As for my p= revious results, these ones are on a machine doing a bit of other work, so = some values may be a bit offset, and it's only one measure each time anyway= =2E


The CSV fil= e I sent from the first email is obtained running the exact same commands, = but playing on both columns and partitions, and averaged over 3 measures.


Regards. --Boundary-01=_S3+aNW1MrmcSfPB-- --Boundary-00=_S3+aNTluOgiQZGx Content-Type: application/x-bzip; name="script.sql.bz2" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="script.sql.bz2" QlpoOTFBWSZTWT+87ysFTSDfgEAQQGR/+j/v/oSv55wAYF2ffAAAAAAABAACHAIADAEAQAAACAgE AAAAAAAFBbYIAFCqAJoMAAAAAAAAAAC2wQAAAAAAAAAtsEAAAAAAAAALNqIAAAAAAAABbYIAAAAA AAAFm1EAAAAAttQgAAAALbBAAAAALbBAAAAEAqgAYAAaAAMmgAADQCSqGQ//VVVAAAAAAAAGAAGg ADJoAAA0BgABoAAyaAAANAN6qp7UaP1UeqVKE9TQA00NA0ANDBSqID/VKSah6p5Q9QNGj1PU8pmo aNino/dJJQ+7/qVyq6q455q71cKuKfhwfw/wP8w/zj/QP+Aeij4KKKKKKKKPBRRoUUUUUUUbFFFG CiiiiijsUUUUdCiiiijoUUUUUdiiiijBRRRRRRsUUUaFFFFFFFHgoo+Ciiiiiiij0WCiiiiiiiii jwWCjQooooooo9FHwUUUUUUUUeCijQooooooo2KKKMFFFFFFHYoooo6FFFFFHQooooo7FFFFGCii iiijYooo0KKKKKKKPBRR8FFFFFFFFHosFFFFFFFFFFGxYKKMFFFFFFHoo+CiiiiiiijwUUaFFFFF FFGxRRRgoooooo7FFFFHQooooo6FFFFFHYoooowUUUUUUbFFFGhRRRRRRR4KKPgoooooooo9Fgoo oooooooo7Fgooo6FFFFFHoo+CiiiiiiijwUUaFFFFFFFGxRRRgoooooo7FFFFHQooooo6FFFFFHY oooowUUUUUUbFFFGhRRRRRRR4KKPgoooooooo9Fgoooooooooo6Fgoooo7FFFFHoo+Ciiiiiiijw UUaFFFFFFFGxRRRgoooooo7FFFFHQooooo6FFFFFHYoooowUUUUUUbFFFGhRRRRRRR4KKPgooooo ooo9FgoooooooooowUUUUUUbFFFGhRRRRRRR4KKPgoooooooo9FgooooooooopfnV+8SKH3iRQ5q /Or6qvsEihxV+v+VSih99Xmrt9dXer11V6q4Q4n0n0n0n0n0n0n0n0ntWnE000000009K005mmmm mmmnlWmmnaaaaaaaeFaaaad5ppppp3Vppppp4mmmmnZWmmmmmnmaaacq00000009TTThWmmmmmmm nuajTTTTTTTTTT3VkcGMYxjGMe1Y4PsMYxjGMdK6OjkxjGMYx5VjGOxjGMYx4VjGMdzGMYx3VjGM Y8GMYx2VjGMYx5MYxyrGMYxjHoxjhWMYxjGMezIxjGMYxjGPVWhrm1rVVVewr4qqqqqvIVWlVVVV bhVViqqqruFVVdKqqrqFVVV2qqrIVVVVbVVahVVVVXiq+QqqqqqvVVMzMzMzN32yqS7SSSXm2XSS SSS8WyXWSSSXe2SXaSSS5tkkuJJJcWySS5kku1skkl3kl1tkkkl4kulskkkl5lUkkkklztm2HAPN s6AHi2OoDvbDsBzbBwDi2ByHa2A7jrbAPB0tgDy2wtttvQsLCwsLDuFhYWFhgsLCwsLCw3CwsLDQ sLCwsLCwsPIWFh8FhYWFhYWFhYewqFhYWFhYWFhYWFh4LIVGkVFRUVFRUVHoqPiKioqKioqKio8F RUaRUVFRUVFRUbFRUVGIqKioqKio7FRUVFR0ioqKioqOhUVFRUVHaKioqKjBUVFRUVFRtFRUVGhU VFRUVFRUeIqKj4KioqKioqKio9RZCoqKioqKio0tLS81alixdixYsWLFi91YuCxYsWLFixYvVWLF yWLFixYsWLzVixYuxYsWLFixeKsWLFi7lixYsWLvVixYsWLwWLFixdqsWLFixYvJYsWLmrFixYsW LF6LFi4qxYsWLFixYvZalixYsWLFixYsXYsRSUlJ0SkpKSkpPRSfCUlJSUlJSUlJ4KSk0SkpKSkp KSk2KSkpMJSUlJSUlJ2KSkpKTolJSUlJSdCkpKSkpOyUlJSUmCkpKSkpKTZKSkpNCkpKSkpKSk8J SUnwUlJSUlJSUlJ6SxFJSUlJSUlJSUlJ0KkWGTJk8JkyZMnurJwmTJkyZMmTJ6qyZOUyZMmTJkye asmTJ2TJkyZMmTxVkyZMndMmTJkyd6smTJkyeEyZMmTtVkyZMmTJ5TJkyc1ZMmTJkyZPSZMnFWTJ kyZMmTJ7TRZMmTJkyZMmTJ2qwtGjRo0eY0aNHurRxGjRo0aNGjR6q0aOY0aNGjRo0eatGjR2jRo0 aNGjxVo0aNHeNGjRo0d6tGjRo0eI0aNGjtVo0aNGjR5jRo0c1aNGjRo0aPUaNHFWjRo0aNGjR7jC 0aNGjRo0aNGjmrVMMMMMMPQww91YcDDDDDDDDD1VhhyMMMMMMMPNWGGHYYYYYYYeKsMMMO4wwwww 71YYYYYeBhhhh2qwwwwww8jDDDmrDDDDDDD0MMOKsMMMMMMMPY1TDDDDDDDDDJPgsJSlKUpT0p6K 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 UTQ0NRNDQ1E0NDUTQ0NRNDQ1E0NDUTQ0NRNDQ1E0PB4PB4NjwcTcm25vIYjJGE9G4nEnJJw5FFFF HBRwfomDQ1E0NDUTQ0NRNDQ1E0NDUTQ0NRNDQ1E0NDUTQ0NRNDweDweDY8HE3JtubyGIyRhO4no4 k5JOHIooooo4OD9E0NDUTQ0NRNDQ1E0NDUTQ0NRNDQ1E0NDUTQ0NRNDQ1E0PB4PB4PB4OJuTbc3k MRkjCbiejiTkk4ciiiiijg4P0TQ0NRNDQ1E0NDUTQ0NRNDQ1E0NDUTQ0NRNDQ1E0NDUTQ8Hg8Hg8 Hg4m5NtzeQxGSMJuJ6OJOSThyKKKKKODg/RNDQ1E0NDUTQ0NRNDQ1E0NDUTQ0NRNDQ1E0NDUTQ0N RNDweDweDweDibk23N5DEZIwm4no4k5JOHIooooo4OD9E0NDUTQ0NRNDQ1E0NDUTQ0NRNDQ1E0ND UTQ0NRNDQ1E0PB4PB4PB4OJuTbc3kMRkjCbiejiTkk4ciiiiijg4P0TQ0NRNDQ1E0NDUTQ0NRNDQ 1E0NDUTQ0NRNDQ1E0NDUTQ4PR6PR6PR0ODg4OCjsUUUUYKKKKKKNiiijQooooooo8FFHwUUUUUUU UeiwUUUUcHRd6u9XerqdTqdTqdTTyrTTTsKUpSlc2ylKbjMzM3FszMlzJJdrZJDuOtsObbmz0dw7 h3Co6RUVFRUVHQstLSxYvBYsWLF2qxYWRSUlJslJSUmhSUlJUyZMnpMmTirJkyaNGjRo9xhaNGj5 VdDodDodDodDqp0Ohq1atWrVq9FPhSxYsWLFix4LFjUUUUUUUUdiiiijoUUUUUdCiiiijsUUUUYK KKKKKNiiijQooooooo8FFHwUUUdDg6HQ6FFFFFHB+Tcm25vIYjJGE3E4OJP0k/H6KKKKKOD+kk/R CeDweDweD+H8m5NtzeQxGSMJuJ4P5J/ST+P6KKKKKP4fYhNjY2NjY4OJuTbc3kMRkjCbieDiTkk4 ciiiiijg+xCbGxsbGxwcTcm25vIYjJGE3E8HEnJJw5FFFFFHB9iE2NjY2Njg4m5NtzeQxGSMJuJ4 OJOSThyKKKKKOD7EJsbGxsbHBxNybbm8hiMkYTcTwcScknDkUUUUUcH2ITY2NjY2ODibk23N5DEZ Iwm4nEno5JOHIooooo4LEJsbGxsbHBxNybbm8hiMkYTcTiT0cknDkUUUUUcFiE2NjY2Njg4m5Ntz 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 --Boundary-00=_S3+aNTluOgiQZGx--