{"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":29,"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 v27.2 (Yoast SEO v27.4) - 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=\"Daniel Westermann\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@westermanndanie\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Daniel Westermann\" \/>\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\":\"Daniel Westermann\",\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/#\\\/schema\\\/person\\\/8d08e9bd996a89bd75c0286cbabf3c66\"},\"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\\\/8d08e9bd996a89bd75c0286cbabf3c66\"},\"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\\\/8d08e9bd996a89bd75c0286cbabf3c66\",\"name\":\"Daniel Westermann\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/31350ceeecb1dd8986339a29bf040d4cd3cd087d410deccd8f55234466d6c317?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/31350ceeecb1dd8986339a29bf040d4cd3cd087d410deccd8f55234466d6c317?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/31350ceeecb1dd8986339a29bf040d4cd3cd087d410deccd8f55234466d6c317?s=96&d=mm&r=g\",\"caption\":\"Daniel Westermann\"},\"description\":\"Daniel Westermann is Principal Consultant and Technology Leader Open Infrastructure at dbi services. He has more than 15 years of experience in management, engineering and optimization of databases and infrastructures, especially on Oracle and PostgreSQL. Since the beginning of his career, he has specialized in Oracle Technologies and is Oracle Certified Professional 12c and Oracle Certified Expert RAC\\\/GridInfra. Over time, Daniel has become increasingly interested in open source technologies, becoming \u201cTechnology Leader Open Infrastructure\u201d and PostgreSQL expert. \u00a0Based on community or EnterpriseDB tools, he develops and installs complex high available solutions with PostgreSQL. He is also a certified PostgreSQL Plus 9.0 Professional and a Postgres Advanced Server 9.4 Professional. He is a regular speaker at PostgreSQL conferences in Switzerland and Europe. Today Daniel is also supporting our customers on AWS services such as AWS RDS, database migrations into the cloud, EC2 and automated infrastructure management with AWS SSM (System Manager). He is a certified AWS Solutions Architect Professional. Prior to dbi services, Daniel was Management System Engineer at LC SYSTEMS-Engineering AG in Basel. Before that, he worked as Oracle Developper &amp;\u00a0Project Manager at Delta Energy Solutions AG in Basel (today Powel AG). Daniel holds a diploma in Business Informatics (DHBW, Germany). His branch-related experience mainly covers the pharma industry, the financial sector, energy, lottery and telecommunications.\",\"sameAs\":[\"https:\\\/\\\/x.com\\\/westermanndanie\"],\"url\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/author\\\/daniel-westermann\\\/\"}]}<\/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":"Daniel Westermann","twitter_card":"summary_large_image","twitter_creator":"@westermanndanie","twitter_misc":{"Written by":"Daniel Westermann","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":"Daniel Westermann","@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/8d08e9bd996a89bd75c0286cbabf3c66"},"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\/8d08e9bd996a89bd75c0286cbabf3c66"},"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\/8d08e9bd996a89bd75c0286cbabf3c66","name":"Daniel Westermann","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/31350ceeecb1dd8986339a29bf040d4cd3cd087d410deccd8f55234466d6c317?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/31350ceeecb1dd8986339a29bf040d4cd3cd087d410deccd8f55234466d6c317?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/31350ceeecb1dd8986339a29bf040d4cd3cd087d410deccd8f55234466d6c317?s=96&d=mm&r=g","caption":"Daniel Westermann"},"description":"Daniel Westermann is Principal Consultant and Technology Leader Open Infrastructure at dbi services. He has more than 15 years of experience in management, engineering and optimization of databases and infrastructures, especially on Oracle and PostgreSQL. Since the beginning of his career, he has specialized in Oracle Technologies and is Oracle Certified Professional 12c and Oracle Certified Expert RAC\/GridInfra. Over time, Daniel has become increasingly interested in open source technologies, becoming \u201cTechnology Leader Open Infrastructure\u201d and PostgreSQL expert. \u00a0Based on community or EnterpriseDB tools, he develops and installs complex high available solutions with PostgreSQL. He is also a certified PostgreSQL Plus 9.0 Professional and a Postgres Advanced Server 9.4 Professional. He is a regular speaker at PostgreSQL conferences in Switzerland and Europe. Today Daniel is also supporting our customers on AWS services such as AWS RDS, database migrations into the cloud, EC2 and automated infrastructure management with AWS SSM (System Manager). He is a certified AWS Solutions Architect Professional. Prior to dbi services, Daniel was Management System Engineer at LC SYSTEMS-Engineering AG in Basel. Before that, he worked as Oracle Developper &amp;\u00a0Project Manager at Delta Energy Solutions AG in Basel (today Powel AG). Daniel holds a diploma in Business Informatics (DHBW, Germany). His branch-related experience mainly covers the pharma industry, the financial sector, energy, lottery and telecommunications.","sameAs":["https:\/\/x.com\/westermanndanie"],"url":"https:\/\/www.dbi-services.com\/blog\/author\/daniel-westermann\/"}]}},"_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\/29"}],"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}]}}