Received: from maia.hub.org (maia-3.hub.org [200.46.204.243]) by mail.postgresql.org (Postfix) with ESMTP id CF7141337B68 for ; Tue, 10 May 2011 17:42:55 -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 29465-03 for ; Tue, 10 May 2011 20:42:49 +0000 (UTC) X-Greylist: delayed 02:20:00.721075 by SQLgrey-1.7.6 Received: from 26.mail-out.ovh.net (6.26.mail-out.ovh.net [46.105.35.144]) by mail.postgresql.org (Postfix) with SMTP id 7B1191337B4E for ; Tue, 10 May 2011 17:42:48 -0300 (ADT) Received: (qmail 22792 invoked by uid 503); 10 May 2011 17:22:36 -0000 Received: from b9.ovh.net (HELO mail620.ha.ovh.net) (213.186.33.59) by 26.mail-out.ovh.net with SMTP; 10 May 2011 17:22:36 -0000 Received: from b0.ovh.net (HELO queueout) (213.186.33.50) by b0.ovh.net with SMTP; 10 May 2011 19:57:56 +0200 Received: from par69-8-88-161-102-87.fbx.proxad.net (HELO apollo13) (lists%peufeu.com@88.161.102.87) by ns0.ovh.net with SMTP; 10 May 2011 19:57:55 +0200 Content-Type: text/plain; charset=utf-8; format=flowed; delsp=yes To: "pgsql-performance@postgresql.org" Subject: Postgres NoSQL emulation Date: Tue, 10 May 2011 19:56:03 +0200 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit From: "Pierre C" Message-ID: User-Agent: Opera Mail/11.10 (Linux) X-Ovh-Tracer-Id: 8981022083164800561 X-Ovh-Remote: 88.161.102.87 (par69-8-88-161-102-87.fbx.proxad.net) X-Ovh-Local: 213.186.33.20 (ns0.ovh.net) X-Spam-Check: DONE|U 0.5/N X-Virus-Scanned: Maia Mailguard 1.0.1 X-Spam-Status: No, hits=-1.9 tagged_above=-10 required=5 tests=BAYES_00=-1.9, RCVD_IN_DNSWL_NONE=-0.0001 X-Spam-Level: X-Archive-Number: 201105/134 X-Sequence-Number: 43643 While reading about NoSQL, > MongoDB let's you store and search JSON objects.In that case, you don't > need to have the same "columns" in each "row" The following ensued. Isn't it cute ? CREATE TABLE mongo ( id SERIAL PRIMARY KEY, obj hstore NOT NULL ); INSERT INTO mongo (obj) SELECT ('a=>'||n||',key'||(n%10)||'=>'||n)::hstore FROM generate_series(1,100000) n; SELECT * FROM mongo LIMIT 10; id | obj ----+------------------------- 1 | "a"=>"1", "key1"=>"1" 2 | "a"=>"2", "key2"=>"2" 3 | "a"=>"3", "key3"=>"3" 4 | "a"=>"4", "key4"=>"4" 5 | "a"=>"5", "key5"=>"5" 6 | "a"=>"6", "key6"=>"6" 7 | "a"=>"7", "key7"=>"7" 8 | "a"=>"8", "key8"=>"8" 9 | "a"=>"9", "key9"=>"9" 10 | "a"=>"10", "key0"=>"10" CREATE INDEX mongo_a ON mongo((obj->'a')) WHERE (obj->'a') IS NOT NULL; CREATE INDEX mongo_k1 ON mongo((obj->'key1')) WHERE (obj->'key1') IS NOT NULL; CREATE INDEX mongo_k2 ON mongo((obj->'key2')) WHERE (obj->'key2') IS NOT NULL; VACUUM ANALYZE mongo; SELECT * FROM mongo WHERE (obj->'key1')='271'; id | obj -----+--------------------------- 271 | "a"=>"271", "key1"=>"271" (1 ligne) EXPLAIN ANALYZE SELECT * FROM mongo WHERE (obj->'key1')='271'; QUERY PLAN --------------------------------------------------------------------------------------------------------------------- Index Scan using mongo_k1 on mongo (cost=0.00..567.05 rows=513 width=36) (actual time=0.024..0.025 rows=1 loops=1) Index Cond: ((obj -> 'key1'::text) = '271'::text) Total runtime: 0.048 ms