Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtp (Exim 4.80) (envelope-from ) id 1Xxm3Y-0007Vy-Rl for pgsql-sql@arkaria.postgresql.org; Mon, 08 Dec 2014 00:20:05 +0000 Received: from localhost ([127.0.0.1] helo=postgresql.org) by malur.postgresql.org with smtp (Exim 4.80) (envelope-from ) id 1Xxm3X-0006hQ-FT for pgsql-sql@arkaria.postgresql.org; Mon, 08 Dec 2014 00:20:03 +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 1Xxm3T-0006aO-8m for pgsql-sql@postgresql.org; Mon, 08 Dec 2014 00:19:59 +0000 Received: from out3-smtp.messagingengine.com ([66.111.4.27]) by magus.postgresql.org with esmtps (TLS1.2:DHE_RSA_AES_256_CBC_SHA256:256) (Exim 4.80) (envelope-from ) id 1Xxm3P-0000JT-1u for pgsql-sql@postgresql.org; Mon, 08 Dec 2014 00:19:57 +0000 Received: from compute1.internal (compute1.nyi.internal [10.202.2.41]) by mailout.nyi.internal (Postfix) with ESMTP id 3797C20748 for ; Sun, 7 Dec 2014 19:19:53 -0500 (EST) Received: from frontend2 ([10.202.2.161]) by compute1.internal (MEProxy); Sun, 07 Dec 2014 19:19:53 -0500 DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; d=aklaver.com; h= x-sasl-enc:message-id:date:from:mime-version:to:subject :references:in-reply-to:content-type:content-transfer-encoding; s=mesmtp; bh=fhvtidldA+nvMaE89YGtG/sHL+k=; b=OI++d0wt3JRvAgaSwn 7bRgWzViX7PLERlZ0Ck9lcd2Oqg5rUHbWtfkIiQZWfzLoVY6ia0RcyK61xZDeqHi A/Tefq9JaVQ6BFJmmD0IlNCeBX/qEu0YScAPIO2ffG7KkzPotl6mdEBlVPARZmOp bZG7JOJd8TNwdPgJBIFWu5ouQ= DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; d= messagingengine.com; h=x-sasl-enc:message-id:date:from :mime-version:to:subject:references:in-reply-to:content-type :content-transfer-encoding; s=smtpout; bh=fhvtidldA+nvMaE89YGtG/ sHL+k=; b=h28NcamzQe/s0qgAEX31CRfF9YJxG6NOhpHFpfcLUQ/dUsdbwCSeQd L3Lr40RHO3hqnd1AGEKv+kzsUgpWJpC5QjunTLIIpYJA+Z+dkB+3UD2uT3B9gRMV pF2faCuA3LDuSRP3ln1bfknyuIxXLs8RXCQAZOovMRhEM+4PzqZZU= X-Sasl-enc: jnTNLzUEVoK+mnXcuHIN92ekfxAJHwWPagAzOE/+Ku+/ 1417997992 Received: from [192.168.1.4] (unknown [174.21.228.172]) by mail.messagingengine.com (Postfix) with ESMTPA id AF403680159; Sun, 7 Dec 2014 19:19:52 -0500 (EST) Message-ID: <5484EEA7.1030403@aklaver.com> Date: Sun, 07 Dec 2014 16:19:51 -0800 From: Adrian Klaver User-Agent: Mozilla/5.0 (X11; Linux i686; rv:31.0) Gecko/20100101 Thunderbird/31.3.0 MIME-Version: 1.0 To: Tim Dudgeon , pgsql-sql@postgresql.org Subject: Re: querying with index on jsonb slower than standard column. Why? References: <5484DBDA.6090405@gmail.com> In-Reply-To: <5484DBDA.6090405@gmail.com> Content-Type: text/plain; charset=windows-1252; format=flowed Content-Transfer-Encoding: 7bit X-Pg-Spam-Score: -2.7 (--) List-Archive: List-Help: List-ID: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: X-Mailing-List: pgsql-sql Precedence: bulk Sender: pgsql-sql-owner@postgresql.org On 12/07/2014 02:59 PM, Tim Dudgeon wrote: > I was doing some performance profiling regarding querying against jsonb > columns and found something I can't explain. > I created json version and standard column versions of some data, and > indexed the json 'fields' and the normal columns and executed equivalent > queries against both. > I find that the json version is quite a bit (approx 3x) slower which I > can't explain as both should (and are according to plans are) working > against what I would expect are equivalent indexes. > > Can anyone explain this? The docs can: http://www.postgresql.org/docs/9.4/interactive/datatype-json.html#JSON-INDEXING > > Example code is here: > > > create table json_test ( > id SERIAL, > assay1_ic50 FLOAT, > assay2_ic50 FLOAT, > data JSONB > ); > > DO > $do$ > DECLARE > val1 FLOAT; > val2 FLOAT; > BEGIN > for i in 1..10000000 LOOP > val1 = random() * 100; > val2 = random() * 100; > INSERT INTO json_test (assay1_ic50, assay2_ic50, data) VALUES > (val1, val2, ('{"assay1_ic50": ' || val1 || ', "assay2_ic50": ' || > val2 || ', "mod": "="}')::jsonb); > end LOOP; > END > $do$ > > create index idx_data_json_assay1_ic50 on json_test (((data ->> > 'assay1_ic50')::float)); > create index idx_data_json_assay2_ic50 on json_test (((data ->> > 'assay2_ic50')::float)); > > create index idx_data_col_assay1_ic50 on json_test (assay1_ic50); > create index idx_data_col_assay2_ic50 on json_test (assay2_ic50); > > select count(*) from json_test; > select * from json_test limit 10; > > select count(*) from json_test where (data->>'assay1_ic50')::float > 90 > and (data->>'assay2_ic50')::float < 10; > select count(*) from json_test where assay1_ic50 > 90 and assay2_ic50 < 10; > > > > Thanks > Tim > > > -- Adrian Klaver adrian.klaver@aklaver.com -- Sent via pgsql-sql mailing list (pgsql-sql@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-sql