Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtp (Exim 4.80) (envelope-from ) id 1YFC1B-0007EI-Ho for pgsql-performance@arkaria.postgresql.org; Sun, 25 Jan 2015 01:29:37 +0000 Received: from localhost ([127.0.0.1] helo=postgresql.org) by malur.postgresql.org with smtp (Exim 4.80) (envelope-from ) id 1YFC1A-0003ho-UY for pgsql-performance@arkaria.postgresql.org; Sun, 25 Jan 2015 01:29:36 +0000 Received: from magus.postgresql.org ([2a02:c0:301:0:ffff::29]) by malur.postgresql.org with esmtps (TLS1.2:DHE_RSA_AES_256_CBC_SHA256:256) (Exim 4.80) (envelope-from ) id 1YFC19-0003hh-R6 for pgsql-performance@postgresql.org; Sun, 25 Jan 2015 01:29:35 +0000 Received: from mail-we0-f182.google.com ([74.125.82.182]) by magus.postgresql.org with esmtps (TLS1.0:RSA_AES_256_CBC_SHA1:256) (Exim 4.80) (envelope-from ) id 1YFC16-0003ZD-1V for pgsql-performance@postgresql.org; Sun, 25 Jan 2015 01:29:34 +0000 Received: by mail-we0-f182.google.com with SMTP id l61so3573558wev.13 for ; Sat, 24 Jan 2015 17:29:31 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:message-id:date:from:organization:user-agent :mime-version:to:subject:references:in-reply-to:content-type :content-transfer-encoding; bh=1lkwMxvEDR8kE+9eRgzCgQZe2KGVC9qmI4KTlhEeljQ=; b=K/imUluXEZACLR9yWOf3soJl1mrxEFzv2skr9SbLqUYvaMnaF+uEpA+CJqIoMoZb6h nmFWrhPah4W3P0bCVHiLWSrayn4wwZbWQNOmHUDaFvlebRGY/Wo9zMGUgDSvqZHsRAtH inbCeUKDtqpxv7gjviHLuXEYAOxX9sOaPV1/GUzydE7PCuAtwHJV5voJOkTpPCxozy1q Ettx9/F5Vz/RCwRyS9XteAFhAljqD7wjcNhe79/bC9m4xo8WG4cQ6NB4H9dlbg9Qrj8p t7wdM1/ov1ps87ADm+7mOFTVypAEQI7fjcyj5Jjrbtuv5uj0GUTaekk/6YvOsz4fawf/ /XIQ== X-Gm-Message-State: ALoCoQnFD7fdF40gkb4fv3XHD4RHk7ZLjuetAqEbWSjyNNZR1Y0rmJTno9ISBtJTrjsel1eG+1as18ngJVSXfP+vsKRe2RW85L0PMNpPDIFb8fXdNu3HAHJX4Vf50TJhhtWWuURxLyYt6NQLDrTc/aOXgRPNiTTOsFfKxN27y6E2AazkcAjyvXSvfnwPcxeSMNj8TlfnjwtL X-Received: by 10.194.175.69 with SMTP id by5mr29158403wjc.32.1422149370942; Sat, 24 Jan 2015 17:29:30 -0800 (PST) Received: from [192.168.1.163] (ip-78-45-139-138.net.upcbroadband.cz. [78.45.139.138]) by mx.google.com with ESMTPSA id 18sm8212012wjr.46.2015.01.24.17.29.29 for (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sat, 24 Jan 2015 17:29:30 -0800 (PST) Message-ID: <54C446F7.9050504@2ndquadrant.com> Date: Sun, 25 Jan 2015 02:29:27 +0100 From: Tomas Vondra Organization: 2ndQuadrant User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:31.0) Gecko/20100101 Thunderbird/31.4.0 MIME-Version: 1.0 To: pgsql-performance@postgresql.org Subject: Re: Initial insert References: In-Reply-To: Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit X-Pg-Spam-Score: -2.6 (--) List-Archive: List-Help: List-ID: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: X-Mailing-List: pgsql-performance Precedence: bulk Sender: pgsql-performance-owner@postgresql.org Hi, On 22.1.2015 17:46, Laurent Cathala wrote: > Hi, > I'm trying to create datas on an initial import and i'm encountering a > performance issue. > I've 2 tables, my process create a record in each table and execute a > sum with join on this 2 tables. (and other requests but there are very fast) > > My 2 tables are empty before the import. > > My count query is : > select sum(quantitest0_.quantite_valeur) as col_0_0_ from > dm5_quantitestock quantitest0_, dm5_caracteristiquearticlestock > caracteris1_ where > quantitest0_.id_caracteristiquearticlestock=caracteris1_.id and > caracteris1_.id_article='4028804c4a311178014a346546967c59' > > i use parameterized request. > > My process create only 6000 records in each table. > > During the whole process this sum request lasts longer and longer. > > The auto-explain plan show an seq scan > > ---------- > Query Text: select sum(quantitest0_.quantite_valeur) as col_0_0_ from > dm5_quantitestock quantitest0_, dm5_caracteristiquearticlestock > caracteris1_ where > quantitest0_.id_caracteristiquearticlestock=caracteris1_.id and > caracteris1_.id_article=$1 > Aggregate (cost=2.04..2.05 rows=1 width=26) (actual > time=862.621..862.621 rows=1 loops=1) > Output: sum(quantitest0_.quantite_valeur) > -> Nested Loop (cost=0.00..2.04 rows=1 width=26) (actual > time=862.618..862.618 rows=0 loops=1) > Output: quantitest0_.quantite_valeur > Join Filter: > ((quantitest0_.id_caracteristiquearticlestock)::text = > (caracteris1_.id)::text) > Rows Removed by Join Filter: 1869 > -> Seq Scan on public.dm5_quantitestock quantitest0_ > (cost=0.00..1.01 rows=1 width=164) (actual time=0.004..0.408 rows=1869 > loops=1) > Output: quantitest0_.id, > quantitest0_.datefinvalidite, quantitest0_.quantite_valeur, > quantitest0_.id_caracteristiquearticlestock, > quantitest0_.id_caracteristiquelieustock, > quantitest0_.datecreationsysteme, quantitest0_.datemodificationsysteme, > quantitest0_.id_creeparsysteme, quantitest0_.id_modifieparsysteme > -> Seq Scan on public.dm5_caracteristiquearticlestock > caracteris1_ (cost=0.00..1.01 rows=1 width=42) (actual > time=0.456..0.456 rows=1 loops=1869) > Output: caracteris1_.id, > caracteris1_.datefinvalidite, caracteris1_.id_lot, > caracteris1_.id_article, caracteris1_.id_numeroserie, > caracteris1_.datecreationsysteme, caracteris1_.datemodificationsysteme, > caracteris1_.id_modifieparsysteme, caracteris1_.id_creeparsysteme > Filter: ((caracteris1_.id_article)::text = ($1)::text) > Rows Removed by Filter: 1869 > ----------- > > if a launch an analyse during the process, the explain use index, but > the time remains the same. > > --------- > Query Text: select sum(quantitest0_.quantite_valeur) as col_0_0_ from > dm5_quantitestock quantitest0_, dm5_caracteristiquearticlestock > caracteris1_ where > quantitest0_.id_caracteristiquearticlestock=caracteris1_.id and > caracteris1_.id_article=$1 > Aggregate (cost=16.55..16.56 rows=1 width=26) (actual > time=654.998..654.998 rows=1 loops=1) > Output: sum(quantitest0_.quantite_valeur) > -> Nested Loop (cost=0.00..16.55 rows=1 width=26) (actual > time=654.994..654.994 rows=0 loops=1) > Output: quantitest0_.quantite_valeur > Join Filter: ((quantitest0_.id_caracteristiquearticlestock)::text > = (caracteris1_.id)::text) > Rows Removed by Join Filter: 1651 > -> Index Scan using x_dm5_quantitestock_00 on > public.dm5_quantitestock quantitest0_ (cost=0.00..8.27 rows=1 > width=164) (actual time=0.011..0.579 rows=1651 loops=1) > Output: quantitest0_.id, quantitest0_.datefinvalidite, > quantitest0_.quantite_valeur, > quantitest0_.id_caracteristiquearticlestock, > quantitest0_.id_caracteristiquelieustock, > quantitest0_.datecreationsysteme, quantitest0_.datemodificationsysteme, > quantitest0_.id_creeparsysteme, quantitest0_.id_modifieparsysteme > -> Index Scan using dm5_caracteristiquearticlestock_pkey on > public.dm5_caracteristiquearticlestock caracteris1_ (cost=0.00..8.27 > rows=1 width=42) (actual time=0.395..0.395 rows=1 loops=1651) > Output: caracteris1_.id, caracteris1_.datefinvalidite, > caracteris1_.id_lot, caracteris1_.id_article, > caracteris1_.id_numeroserie, caracteris1_.datecreationsysteme, > caracteris1_.datemodificationsysteme, caracteris1_.id_modifieparsysteme, > caracteris1_.id_creeparsysteme > Filter: ((caracteris1_.id_article)::text = > '4028804c4a311178014a346547307cce'::text) > Rows Removed by Filter: 1651 > > ---------- Why is the first query using a parameter ($1) while the second one uses a string literal? Have you executed them differently? > > If i create the first 1000 records, commit and end transaction, the > whole import is very fast. And what plans do the queries use? > > I can't change my process to cut the process in little part... We're talking about a 600-800 ms query - even if you cut it to 1 ms, I don't see how this would do a difference in a batch-style job. If you're doing many such queries (with different id_article values), you may do something like this select caracteris1_.id_article, sum(quantitest0_.quantite_valeur) as col_0_0_ from dm5_quantitestock quantitest0_, dm5_caracteristiquearticlestock caracteris1_ where quantitest0_.id_caracteristiquearticlestock=caracteris1_.id group by caracteris1_.id_article and then query this (supposedly much smaller) table. regards -- Tomas Vondra http://www.2ndQuadrant.com/ PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services -- Sent via pgsql-performance mailing list (pgsql-performance@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-performance