{"id":9457,"date":"2016-12-08T10:19:26","date_gmt":"2016-12-08T09:19:26","guid":{"rendered":"https:\/\/www.dbi-services.com\/blog\/can-i-do-it-with-postgresql-7-partitioning\/"},"modified":"2016-12-08T10:19:26","modified_gmt":"2016-12-08T09:19:26","slug":"can-i-do-it-with-postgresql-7-partitioning","status":"publish","type":"post","link":"https:\/\/www.dbi-services.com\/blog\/can-i-do-it-with-postgresql-7-partitioning\/","title":{"rendered":"Can I do it with PostgreSQL? \u2013 7 \u2013 Partitioning"},"content":{"rendered":"<p><a href=\"https:\/\/www.postgresql.org\/about\/\" target=\"_blank\" rel=\"noopener\">PostgreSQL supports tables up to 32TB<\/a>. Do you want to be the one responsible for managing such a table? I guess not. Usually you start to partition your tables when they grow very fast and consume more than hundreds of gigabytes. Can PostgreSQL do this? Do you you know what <a href=\"https:\/\/www.postgresql.org\/docs\/current\/static\/ddl-inherit.html\" target=\"_blank\" rel=\"noopener\">table inheritance<\/a> is? No? PostgreSQL implements partitioning by using table inheritance and <a target=\"_blank\" rel=\"noopener\">constraint exclusion<\/a>. Sounds strange? Lets have a look &#8230;<\/p>\n<p><!--more--><\/p>\n<p>Us usual I am running the currently latest version of PostgreSQL:<\/p>\n<pre class=\"brush: sql; gutter: true; first-line: 1\">postgres@pgbox:\/home\/postgres\/ [PG961] psql postgres\npsql (9.6.1 dbi services build)\nType \"help\" for help.\n\n(postgres@[local]:5439) [postgres] &gt; select version();\n                                                          version                                                           \n----------------------------------------------------------------------------------------------------------------------------\n PostgreSQL 9.6.1 dbi services build on x86_64-pc-linux-gnu, compiled by gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-4), 64-bit\n(1 row)\n\nTime: 0.513 ms\n(postgres@[local]:5439) [postgres] &gt; \n<\/pre>\n<p>So, what is table inheritance. In PostgreSQL you do things like this:<\/p>\n<pre class=\"brush: sql; gutter: true; first-line: 1\">(postgres@[local]:5439) [postgres] &gt; create table databases ( name varchar(10), vendor varchar(10) );\nCREATE TABLE\nTime: 20.477 ms\n(postgres@[local]:5439) [postgres] &gt; create table databases_rdbms ( rdbms boolean ) inherits (databases);\nCREATE TABLE\nTime: 20.080 ms\n(postgres@[local]:5439) [postgres] &gt; create table databases_nosql ( nosql boolean ) inherits (databases);\nCREATE TABLE\nTime: 22.048 ms\n<\/pre>\n<p>What we&#8217;ve done here is: We created three tables in total. The &#8220;databases_rdbms&#8221; and &#8220;databases_nosql&#8221; tables inherit from the &#8220;databases&#8221; table. What does that mean? Lets insert some data into the tables that inherit from the &#8220;databases&#8221; table:<\/p>\n<pre class=\"brush: sql; gutter: true; first-line: 1\">(postgres@[local]:5439) [postgres] &gt; insert into databases_rdbms values ('PostgreSQL','Community',true);\nINSERT 0 1\nTime: 20.215 ms\n(postgres@[local]:5439) [postgres] &gt; insert into databases_rdbms values ('MariaDB','MariaDB',true);\nINSERT 0 1\nTime: 1.666 ms\n(postgres@[local]:5439) [postgres] &gt; insert into databases_nosql values ('MongoDB','MongoDB',true);\nINSERT 0 1\nTime: 1.619 ms\n(postgres@[local]:5439) [postgres] &gt; insert into databases_nosql values ('Cassandra','Apache',true);\nINSERT 0 1\nTime: 0.833 ms\n<\/pre>\n<p>Note that we did not insert any data into the &#8220;databases&#8221; table, but when we query the &#8220;databases&#8221; table we get this result:<\/p>\n<pre class=\"brush: sql; gutter: true; first-line: 1\">(postgres@[local]:5439) [postgres] &gt; select * from databases;\n    name    |  vendor   \n------------+-----------\n PostgreSQL | Community\n MariaDB    | MariaDB\n MongoDB    | MongoDB\n Cassandra  | Apache\n(4 rows)\n<\/pre>\n<p>All the data from all child tables has been retrieved (of course without the additional column on the child tables). We can still query the child tables:<\/p>\n<pre class=\"brush: sql; gutter: true; first-line: 1\">(postgres@[local]:5439) [postgres] &gt; select * from databases_rdbms;\n    name    |  vendor   | rdbms \n------------+-----------+-------\n PostgreSQL | Community | t\n MariaDB    | MariaDB   | t\n(2 rows)\n\nTime: 0.224 ms\n(postgres@[local]:5439) [postgres] &gt; select * from databases_nosql;\n   name    | vendor  | nosql \n-----------+---------+-------\n MongoDB   | MongoDB | t\n Cassandra | Apache  | t\n(2 rows)\n<\/pre>\n<p>But when we query &#8220;only&#8221; on the master table there is no result:<\/p>\n<pre class=\"brush: sql; gutter: true; first-line: 1\">(postgres@[local]:5439) [postgres] &gt; select * from only databases;\n name | vendor \n------+--------\n(0 rows)\n<\/pre>\n<p>Of course for this specific example it would be better to add an additional column to the master table which specifies if a database is a NoSQL database or not. This is just to show how it works. There is a good example for another use case in the <a href=\"https:\/\/www.postgresql.org\/docs\/current\/static\/ddl-inherit.html\" target=\"_blank\" rel=\"noopener\">documentation<\/a>.<\/p>\n<p>What does all this have to do with partitioning? When you want to partition your tables in PostgreSQL you&#8217;ll do exactly the same thing:<\/p>\n<pre class=\"brush: sql; gutter: true; first-line: 1\">(postgres@[local]:5439) [postgres] &gt; create table log_data ( id int, some_data varchar(10), ts date );\nCREATE TABLE\n(postgres@[local]:5439) [postgres] &gt; create table log_data_2016() inherits ( log_data );\nCREATE TABLE\n(postgres@[local]:5439) [postgres] &gt; create table log_data_2015() inherits ( log_data );\nCREATE TABLE\n<\/pre>\n<p>We want to partition our log data by year, so we create a child table for each year we know we have data for. We additionally need is a check constraint on each of the child tables:<\/p>\n<pre class=\"brush: sql; gutter: true; first-line: 1\">(postgres@[local]:5439) [postgres] &gt; d+ log_data_2016\n                             Table \"public.log_data_2016\"\n  Column   |         Type          | Modifiers | Storage  | Stats target | Description \n-----------+-----------------------+-----------+----------+--------------+-------------\n id        | integer               |           | plain    |              | \n some_data | character varying(10) |           | extended |              | \n ts        | date                  |           | plain    |              | \nCheck constraints:\n    \"cs1\" CHECK (ts &gt;= '2016-01-01'::date AND ts  d+ log_data_2015\n                             Table \"public.log_data_2015\"\n  Column   |         Type          | Modifiers | Storage  | Stats target | Description \n-----------+-----------------------+-----------+----------+--------------+-------------\n id        | integer               |           | plain    |              | \n some_data | character varying(10) |           | extended |              | \n ts        | date                  |           | plain    |              | \nCheck constraints:\n    \"cs1\" CHECK (ts &gt;= '2015-01-01'::date AND ts &lt; '2016-01-01'::date)\nInherits: log_data\n<\/pre>\n<p>This guarantees that the child tables only get data for a specific year. So far so good. But how does PostgreSQL know that inserts into the master table should get routed to the corresponding child table? This is done by using triggers:<\/p>\n<pre class=\"brush: sql; gutter: true; first-line: 1\">(postgres@[local]:5439) [postgres] &gt; CREATE OR REPLACE FUNCTION log_data_insert_trigger()\nRETURNS TRIGGER AS $$\nBEGIN\nIF ( NEW.ts &gt;= DATE '2015.01.01' AND\nNEW.ts &lt; DATE '2016-01-01' ) THEN INSERT INTO log_data_2015 VALUES (NEW.*); ELSIF ( NEW.ts &gt;= DATE '2016-01-01' AND\nNEW.ts &lt; DATE '2017-01-01' ) THEN\nINSERT INTO log_data_2016 VALUES (NEW.*);\nELSE\nRAISE EXCEPTION 'Date out of range!';\nEND IF;\nRETURN NULL;\nEND;\n$$\nLANGUAGE plpgsql;\n\nCREATE TRIGGER insert_log_data_trigger\nBEFORE INSERT ON log_data\nFOR EACH ROW EXECUTE PROCEDURE log_data_insert_trigger();<\/pre>\n<p>When there are inserts against the master table, from now on these go to the corresponding child table:<\/p>\n<pre class=\"brush: sql; gutter: true; first-line: 1\">(postgres@[local]:5439) [postgres] &gt; insert into log_data values ( 1, 'aaaa', date('2016.03.03'));\nINSERT 0 0\n(postgres@[local]:5439) [postgres] &gt; insert into log_data values ( 2, 'aaaa', date('2015.03.03'));\nINSERT 0 0\n(postgres@[local]:5439) [postgres] &gt; select * from log_data;\n id | some_data |     ts     \n----+-----------+------------\n  1 | aaaa      | 2016-03-03\n  2 | aaaa      | 2015-03-03\n(2 rows)\n(postgres@[local]:5439) [postgres] &gt; select * from log_data_2015;\n id | some_data |     ts     \n----+-----------+------------\n  2 | aaaa      | 2015-03-03\n(1 row)\n\n(postgres@[local]:5439) [postgres] &gt; select * from log_data_2016;\n id | some_data |     ts     \n----+-----------+------------\n  1 | aaaa      | 2016-03-03\n(1 row)\n<\/pre>\n<p>Selects against the master table where we use the ts column in the where condition now only select from the child table:<\/p>\n<pre class=\"brush: sql; gutter: true; first-line: 1\">(postgres@[local]:5439) [postgres] &gt; explain analyze select * from log_data where ts = date ('2016.03.03');\n                                                  QUERY PLAN                                                   \n---------------------------------------------------------------------------------------------------------------\n Append  (cost=0.00..23.75 rows=7 width=46) (actual time=0.006..0.006 rows=1 loops=1)\n   -&gt;  Seq Scan on log_data  (cost=0.00..0.00 rows=1 width=46) (actual time=0.002..0.002 rows=0 loops=1)\n         Filter: (ts = '2016-03-03'::date)\n   -&gt;  Seq Scan on log_data_2016  (cost=0.00..23.75 rows=6 width=46) (actual time=0.004..0.004 rows=1 loops=1)\n         Filter: (ts = '2016-03-03'::date)\n Planning time: 0.131 ms\n Execution time: 0.019 ms\n(7 rows)\n(postgres@[local]:5439) [postgres] &gt; explain analyze select * from log_data where ts = date ('2015.03.03');\n                                                  QUERY PLAN                                                   \n---------------------------------------------------------------------------------------------------------------\n Append  (cost=0.00..23.75 rows=7 width=46) (actual time=0.007..0.007 rows=1 loops=1)\n   -&gt;  Seq Scan on log_data  (cost=0.00..0.00 rows=1 width=46) (actual time=0.002..0.002 rows=0 loops=1)\n         Filter: (ts = '2015-03-03'::date)\n   -&gt;  Seq Scan on log_data_2015  (cost=0.00..23.75 rows=6 width=46) (actual time=0.004..0.004 rows=1 loops=1)\n         Filter: (ts = '2015-03-03'::date)\n Planning time: 0.102 ms\n Execution time: 0.019 ms\n(7 rows)\n<\/pre>\n<p>Of course you can create indexes on the child tables as well. This is how partitioning basically works in PostgreSQL. To be honest, this is not the most beautiful way to do partitioning and this can become tricky to manage. But as always there are projects that assist you, e.g. <a href=\"https:\/\/github.com\/keithf4\/pg_partman\" target=\"_blank\" rel=\"noopener\">pg_partman<\/a> or <a href=\"https:\/\/github.com\/postgrespro\/pg_pathman\" target=\"_blank\" rel=\"noopener\">pg_pathman<\/a>.<\/p>\n<p>Wouldn&#8217;t it be nice to have a SQL syntax to do table partitioning? Exactly this was <a href=\"https:\/\/commitfest.postgresql.org\/12\/611\/\" target=\"_blank\" rel=\"noopener\">committed yesterday<\/a> and will probably be there in PostgreSQL 10 next year. The <a href=\"https:\/\/www.postgresql.org\/docs\/devel\/static\/sql-createtable.html\" target=\"_blank\" rel=\"noopener\">development documentation<\/a> already describes the syntax:<\/p>\n<pre class=\"brush: sql; gutter: true; first-line: 1\">[ PARTITION BY { RANGE | LIST } ( { column_name | ( expression ) } [ COLLATE collation ] [ opclass ] [, ... ] ) ]\n[ WITH ( storage_parameter [= value] [, ... ] ) | WITH OIDS | WITHOUT OIDS ]\n[ ON COMMIT { PRESERVE ROWS | DELETE ROWS | DROP } ]\n[ TABLESPACE tablespace_name ]\n<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>PostgreSQL supports tables up to 32TB. Do you want to be the one responsible for managing such a table? I guess not. Usually you start to partition your tables when they grow very fast and consume more than hundreds of gigabytes. Can PostgreSQL do this? Do you you know what table inheritance is? No? PostgreSQL [&hellip;]<\/p>\n","protected":false},"author":28,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[229],"tags":[77],"type_dbi":[],"class_list":["post-9457","post","type-post","status-publish","format-standard","hentry","category-database-administration-monitoring","tag-postgresql"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v28.8 (Yoast SEO v28.8) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Can I do it with PostgreSQL? \u2013 7 \u2013 Partitioning - dbi Blog<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.dbi-services.com\/blog\/can-i-do-it-with-postgresql-7-partitioning\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Can I do it with PostgreSQL? \u2013 7 \u2013 Partitioning\" \/>\n<meta property=\"og:description\" content=\"PostgreSQL supports tables up to 32TB. Do you want to be the one responsible for managing such a table? I guess not. Usually you start to partition your tables when they grow very fast and consume more than hundreds of gigabytes. Can PostgreSQL do this? Do you you know what table inheritance is? No? PostgreSQL [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.dbi-services.com\/blog\/can-i-do-it-with-postgresql-7-partitioning\/\" \/>\n<meta property=\"og:site_name\" content=\"dbi Blog\" \/>\n<meta property=\"article:published_time\" content=\"2016-12-08T09:19:26+00:00\" \/>\n<meta name=\"author\" content=\"Open source Team\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Open source Team\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"6 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/can-i-do-it-with-postgresql-7-partitioning\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/can-i-do-it-with-postgresql-7-partitioning\\\/\"},\"author\":{\"name\":\"Open source Team\",\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/#\\\/schema\\\/person\\\/4bae5e5dd8c7d48edbd948772b49b202\"},\"headline\":\"Can I do it with PostgreSQL? \u2013 7 \u2013 Partitioning\",\"datePublished\":\"2016-12-08T09:19:26+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/can-i-do-it-with-postgresql-7-partitioning\\\/\"},\"wordCount\":489,\"commentCount\":0,\"keywords\":[\"PostgreSQL\"],\"articleSection\":[\"Database Administration &amp; Monitoring\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/can-i-do-it-with-postgresql-7-partitioning\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/can-i-do-it-with-postgresql-7-partitioning\\\/\",\"url\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/can-i-do-it-with-postgresql-7-partitioning\\\/\",\"name\":\"Can I do it with PostgreSQL? \u2013 7 \u2013 Partitioning - dbi Blog\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/#website\"},\"datePublished\":\"2016-12-08T09:19:26+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/#\\\/schema\\\/person\\\/4bae5e5dd8c7d48edbd948772b49b202\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/can-i-do-it-with-postgresql-7-partitioning\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/can-i-do-it-with-postgresql-7-partitioning\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/can-i-do-it-with-postgresql-7-partitioning\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Accueil\",\"item\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Can I do it with PostgreSQL? \u2013 7 \u2013 Partitioning\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/\",\"name\":\"dbi Blog\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/#\\\/schema\\\/person\\\/4bae5e5dd8c7d48edbd948772b49b202\",\"name\":\"Open source Team\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/eb4fb12e386e8c41fdef0733e8114594cf2653e4f55e9fa2161442b8eaf3f657?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/eb4fb12e386e8c41fdef0733e8114594cf2653e4f55e9fa2161442b8eaf3f657?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/eb4fb12e386e8c41fdef0733e8114594cf2653e4f55e9fa2161442b8eaf3f657?s=96&d=mm&r=g\",\"caption\":\"Open source Team\"},\"url\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/author\\\/open-source-team\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Can I do it with PostgreSQL? \u2013 7 \u2013 Partitioning - dbi Blog","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.dbi-services.com\/blog\/can-i-do-it-with-postgresql-7-partitioning\/","og_locale":"en_US","og_type":"article","og_title":"Can I do it with PostgreSQL? \u2013 7 \u2013 Partitioning","og_description":"PostgreSQL supports tables up to 32TB. Do you want to be the one responsible for managing such a table? I guess not. Usually you start to partition your tables when they grow very fast and consume more than hundreds of gigabytes. Can PostgreSQL do this? Do you you know what table inheritance is? No? PostgreSQL [&hellip;]","og_url":"https:\/\/www.dbi-services.com\/blog\/can-i-do-it-with-postgresql-7-partitioning\/","og_site_name":"dbi Blog","article_published_time":"2016-12-08T09:19:26+00:00","author":"Open source Team","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Open source Team","Est. reading time":"6 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.dbi-services.com\/blog\/can-i-do-it-with-postgresql-7-partitioning\/#article","isPartOf":{"@id":"https:\/\/www.dbi-services.com\/blog\/can-i-do-it-with-postgresql-7-partitioning\/"},"author":{"name":"Open source Team","@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/4bae5e5dd8c7d48edbd948772b49b202"},"headline":"Can I do it with PostgreSQL? \u2013 7 \u2013 Partitioning","datePublished":"2016-12-08T09:19:26+00:00","mainEntityOfPage":{"@id":"https:\/\/www.dbi-services.com\/blog\/can-i-do-it-with-postgresql-7-partitioning\/"},"wordCount":489,"commentCount":0,"keywords":["PostgreSQL"],"articleSection":["Database Administration &amp; Monitoring"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.dbi-services.com\/blog\/can-i-do-it-with-postgresql-7-partitioning\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.dbi-services.com\/blog\/can-i-do-it-with-postgresql-7-partitioning\/","url":"https:\/\/www.dbi-services.com\/blog\/can-i-do-it-with-postgresql-7-partitioning\/","name":"Can I do it with PostgreSQL? \u2013 7 \u2013 Partitioning - dbi Blog","isPartOf":{"@id":"https:\/\/www.dbi-services.com\/blog\/#website"},"datePublished":"2016-12-08T09:19:26+00:00","author":{"@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/4bae5e5dd8c7d48edbd948772b49b202"},"breadcrumb":{"@id":"https:\/\/www.dbi-services.com\/blog\/can-i-do-it-with-postgresql-7-partitioning\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.dbi-services.com\/blog\/can-i-do-it-with-postgresql-7-partitioning\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.dbi-services.com\/blog\/can-i-do-it-with-postgresql-7-partitioning\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Accueil","item":"https:\/\/www.dbi-services.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Can I do it with PostgreSQL? \u2013 7 \u2013 Partitioning"}]},{"@type":"WebSite","@id":"https:\/\/www.dbi-services.com\/blog\/#website","url":"https:\/\/www.dbi-services.com\/blog\/","name":"dbi Blog","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.dbi-services.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/4bae5e5dd8c7d48edbd948772b49b202","name":"Open source Team","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/eb4fb12e386e8c41fdef0733e8114594cf2653e4f55e9fa2161442b8eaf3f657?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/eb4fb12e386e8c41fdef0733e8114594cf2653e4f55e9fa2161442b8eaf3f657?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/eb4fb12e386e8c41fdef0733e8114594cf2653e4f55e9fa2161442b8eaf3f657?s=96&d=mm&r=g","caption":"Open source Team"},"url":"https:\/\/www.dbi-services.com\/blog\/author\/open-source-team\/"}]}},"_links":{"self":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts\/9457","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/users\/28"}],"replies":[{"embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/comments?post=9457"}],"version-history":[{"count":0,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts\/9457\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/media?parent=9457"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/categories?post=9457"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/tags?post=9457"},{"taxonomy":"type","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/type_dbi?post=9457"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}