Received: from maia.hub.org (maia-3.hub.org [200.46.204.243]) by mail.postgresql.org (Postfix) with ESMTP id 4C0CE1337BBB for ; Wed, 11 May 2011 19:04:59 -0300 (ADT) 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 50702-07 for ; Wed, 11 May 2011 22:04:51 +0000 (UTC) X-Greylist: from auto-whitelisted by SQLgrey-1.7.6 Received: from smtp.peak6.com (smtp.peak6.com [38.98.137.6]) by mail.postgresql.org (Postfix) with ESMTP id 851EA1337BA8 for ; Wed, 11 May 2011 19:04:51 -0300 (ADT) X-AuditID: 0a64cb1e-b7c43ae000003d6d-1c-4dcb0802bcf2 Message-ID: <4DCB0802.9060505@peak6.com> Date: Wed, 11 May 2011 17:04:50 -0500 From: Shaun Thomas Reply-To: Organization: Peak6 User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2.7) Gecko/20100720 Lightning/1.0b2 Thunderbird/3.1.1 MIME-Version: 1.0 To: CC: Scott Marlowe , Craig Ringer , Aren Cambre , Subject: Re: Postgres refusing to use >1 core References: <4DC81A3F020000250003D433@gw.wicourts.gov> <4DC81D56020000250003D438@gw.wicourts.gov> <4DC8B893.3060908@postnewspapers.com.au> <4DC9E7C5.9080309@postnewspapers.com.au> <4DCAB3A1.2090507@peak6.com> <201105111953.060147@ms14.lnh.mail.rcn.net> In-Reply-To: <201105111953.060147@ms14.lnh.mail.rcn.net> Content-Type: text/plain; charset="ISO-8859-1"; format=flowed content-transfer-encoding: 7bit X-Originating-IP: [10.10.221.50] X-Brightmail-Tracker: AAAAAQAAAZE= X-Virus-Scanned: Maia Mailguard 1.0.1 X-Spam-Status: No, hits=-1.91 tagged_above=-10 required=5 tests=BAYES_00=-1.9, T_RP_MATCHES_RCVD=-0.01 X-Spam-Level: X-Archive-Number: 201105/160 X-Sequence-Number: 43669 On 05/11/2011 02:53 PM, gnuoytr@rcn.com wrote: > So, the $64 question: how did you find an engagement where, to bend > Shakespeare, "first thing we do, is kill all the coders" isn't > required? It's just one of those things you have to explain. Not just how to fix it, but *why* doing so fixes it. It's also not really a fair expectation in a lot of ways. Even when a coder uses all SQL, their inexperience in the engine can still ruin performance. We spend years getting to know PostgreSQL, or just general DB techniques. They do the same with coding. And unless they're a developer for a very graphics intensive project, they're probably not well acquainted with set theory. Just today, I took a query like this: UPDATE customer c SET c.login_counter = a.counter FROM (SELECT session_id, count(*) as counter FROM session WHERE date_created >= CURRENT_DATE GROUP BY session_id) a WHERE c.process_date = CURRENT_DATE AND c.customer_id = a.session_id And suggested this instead: CREATE TEMP TABLE tmp_login_counts AS SELECT session_id, count(1) AS counter FROM auth_token_arc WHERE date_created >= CURRENT_DATE GROUP BY session_id UPDATE reporting.customer c SET login_counter = a.counter FROM tmp_login_counts a WHERE c.process_date = CURRENT_DATE AND c.customer_id = a.session_id The original query, with our very large tables, ran for over *two hours* thanks to a nested loop iterating over the subquery. My replacement ran in roughly 30 seconds. If we were using a newer version of PG, we could have used a CTE. But do you get what I mean? Temp tables are a fairly common technique, but how would a coder know about CTEs? They're pretty new, even to *us*. We hold regular Lunch'n'Learns for our developers to teach them the good/bad of what they're doing, and that helps significantly. Even hours later, I see them using the techniques I showed them. The one I'm presenting soon is entitled '10 Ways to Ruin Performance' and they're all specific examples taken from day-to-day queries and jobs here, all from different categories of mistake. It's just a part of being a good DBA. -- Shaun Thomas OptionsHouse | 141 W. Jackson Blvd. | Suite 800 | Chicago IL, 60604 312-676-8870 sthomas@peak6.com ______________________________________________ See http://www.peak6.com/email_disclaimer.php for terms and conditions related to this email