{"id":4808,"date":"2015-05-18T15:33:12","date_gmt":"2015-05-18T13:33:12","guid":{"rendered":"https:\/\/www.dbi-services.com\/blog\/optimized-row-columnar-orc-format-in-postgresql\/"},"modified":"2015-05-18T15:33:12","modified_gmt":"2015-05-18T13:33:12","slug":"optimized-row-columnar-orc-format-in-postgresql","status":"publish","type":"post","link":"https:\/\/www.dbi-services.com\/blog\/optimized-row-columnar-orc-format-in-postgresql\/","title":{"rendered":"Optimized Row Columnar (ORC) format in PostgreSQL"},"content":{"rendered":"<p>Nowadays everybody is talking about columnar storage format. What can PostgreSQL do in this area? There is no native support for that in PostgreSQL but thanks to the fact that PostgreSQL is\u00a0<a href=\"http:\/\/www.postgresql.org\/docs\/current\/static\/extend.html\" target=\"_blank\" rel=\"noopener\">highly extensible<\/a> there is a <a href=\"http:\/\/www.postgresql.org\/docs\/current\/static\/fdwhandler.html\" target=\"_blank\" rel=\"noopener\">foreign data wrapper<\/a> called <a target=\"_blank\" rel=\"noopener\">cstore_fdw<\/a>. Lets take a look on what it can do.<\/p>\n<p>For installing cstore_fdw we&#8217;ll need to install the <a href=\"https:\/\/developers.google.com\/protocol-buffers\/\" target=\"_blank\" rel=\"noopener\">protobuf-c-devel<\/a> package which is available in the epel repository if you are on a redhat base distribution:<\/p>\n<pre class=\"brush: actionscript3; gutter: true; first-line: 1\">wget http:\/\/dl.fedoraproject.org\/pub\/epel\/7\/x86_64\/e\/epel-release-7-5.noarch.rpm\nyum localinstall epel-release-7-5.noarch.rpm\nyum install protobuf-c-devel\n<\/pre>\n<p>Once this is installed we can continue with installing the extension. Obviously we need the sources in a first step:<\/p>\n<pre class=\"brush: actionscript3; gutter: true; first-line: 1\">su - postgres\ncd \/var\/tmp\ngit clone git:\/\/github.com\/citusdata\/cstore_fdw\ncd cstore_fdw<\/pre>\n<p>Building is straightforward and easy:<\/p>\n<pre class=\"brush: actionscript3; gutter: true; first-line: 1\">export PATH=[YOUR_PG_HOME]\/bin\/:$PATH\nmake\nmake install\n<\/pre>\n<p>That&#8217;s it. Now we need to add the extension to PostgreSQL:<\/p>\n<pre class=\"brush: actionscript3; gutter: true; first-line: 1\">grep shared_pre postgresql.conf \nshared_preload_libraries = 'cstore_fdw'\t\t# (change requires restart)\n<\/pre>\n<p>After a restart of the database cstore_fdw will be available:<\/p>\n<pre class=\"brush: actionscript3; gutter: true; first-line: 1\">postgres=# CREATE EXTENSION cstore_fdw;\nCREATE EXTENSION\n<\/pre>\n<p>Ok, and now? Lets create our first columnar store table:<\/p>\n<pre class=\"brush: actionscript3; gutter: true; first-line: 1\">CREATE SERVER cstore_server FOREIGN DATA WRAPPER cstore_fdw;\nCREATE FOREIGN TABLE demo2\n   ( id int\n   , text varchar(15)\n   , number int\n   , time timestamp\n   , text1 varchar(100)\n   , text2 varchar(100)\n   , text3 varchar(100)\n   , text4 varchar(100)\n   , text5 varchar(100)\n   , text6 varchar(100)\n   )\nSERVER cstore_server\nOPTIONS (compression 'pglz');\n<\/pre>\n<p>Lets create some sample data (10mio rows).<\/p>\n<pre class=\"brush: actionscript3; gutter: true; first-line: 1\">timing on\ndrop table if exists demo;\ncreate table demo\n   ( id int\n   , text varchar(15)\n   , number int\n   , time timestamp\n   , text1 varchar(100)\n   , text2 varchar(100)\n   , text3 varchar(100)\n   , text4 varchar(100)\n   , text5 varchar(100)\n   , text6 varchar(100)\n   );\nDO $$DECLARE\n  l_people_array varchar(15)[12] := '{\"Marc\", \"Bill\", \"George\", \"Eliot\", \"Matt\", \"Trey\", \"Tracy\",\"Greg\", \"Steve\", \"Kristina\", \"Katie\", \"Jeff\"}';\n  n int;\n  linterval varchar(20);\n  text varchar(100) := md5('aaa');\nBEGIN\n  for i in 0..1e7 loop\n     n:=trunc(random()*1000+1);\n     linterval := n||' days';\n     insert into DEMO values( i\n                            , l_people_array[floor((random()*11))+1::int]\n                            , n\n                            , current_timestamp + linterval::interval\n                            , text\n                            , text\n                            , text\n                            , text\n                            , text\n                            , text\n                            );\n  end loop;\nEND$$;\n<\/pre>\n<p>For loading the data to the column store table I&#8217;ll write the demo table to a flat by using copy as usual (this will take some time for this amount of rows):<\/p>\n<pre class=\"brush: actionscript3; gutter: true; first-line: 1\">postgres=# copy demo to '\/home\/postgres\/column_store_data.txt';\nCOPY 10000001\nTime: 219766.916 ms\n<\/pre>\n<p>The resulting file is 2.3 gb:<\/p>\n<pre>-rw-r--r--. 1 postgres postgres 2.3G May 13 15:55 column_store_data.txt<\/pre>\n<p>Now we can load the same data to the demo2 table:<\/p>\n<pre class=\"brush: actionscript3; gutter: true; first-line: 1\">postgres=# copy demo2 from '\/home\/postgres\/column_store_data.txt';\nCOPY 10000001\nTime: 46389.124 ms\npostgres=# \n<\/pre>\n<p>First lets see on how much smaller the demo2 table really is:<\/p>\n<pre class=\"brush: actionscript3; gutter: true; first-line: 1\">postgres=# select pg_size_pretty(pg_relation_size('demo'));\n pg_size_pretty \n----------------\n 2441 MB\n(1 row)\n\nTime: 0.366 ms\npostgres=# ! ls -lha $PGDATA\/cstore_fdw\/13056\ntotal 153M\ndrwx------. 2 postgres postgres   37 May 13 15:58 .\ndrwx------. 3 postgres postgres   18 May 13 15:04 ..\n-rw-------. 1 postgres postgres 153M May 13 15:58 17247\n-rw-------. 1 postgres postgres 1.2K May 13 15:58 17247.footer\n<\/pre>\n<p>Not bad, 153MB compared to 2441MB for the traditional table. Now lets look at the response time for the traditional table:<\/p>\n<pre class=\"brush: actionscript3; gutter: true; first-line: 1\">postgres=# select id,text,number from demo where id = 50;\n id | text | number \n----+------+--------\n 50 | Trey |    625\n(1 row)\n\nTime: 26842.250 ms\npostgres=# select id,text,number from demo where id = 50;\n id | text | number \n----+------+--------\n 50 | Trey |    625\n(1 row)\n\nTime: 28530.903 ms\npostgres=# select id,text,number from demo where id = 50;\n id | text | number \n----+------+--------\n 50 | Trey |    625\n(1 row)\n\nTime: 29815.443 ms\n<\/pre>\n<p>The column store should be faster:<\/p>\n<pre class=\"brush: actionscript3; gutter: true; first-line: 1\">postgres=# select id,text,number from demo2 where id = 50;\n id | text | number \n----+------+--------\n 50 | Trey |    625\n(1 row)\n\nTime: 631.668 ms\npostgres=# select id,text,number from demo2 where id = 50;\n id | text | number \n----+------+--------\n 50 | Trey |    625\n(1 row)\n\nTime: 20.740 ms\npostgres=# select id,text,number from demo2 where id = 50;\n id | text | number \n----+------+--------\n 50 | Trey |    625\n(1 row)\n\nTime: 15.368 ms\n<\/pre>\n<p>And yes, it is much faster. Less than a second compared to around 28 seconds. Note that you can not create an index on the column store table:<\/p>\n<pre class=\"brush: actionscript3; gutter: true; first-line: 1\">postgres=# create index i2 on demo2(id);\nERROR:  cannot create index on foreign table \"demo2\"\nSTATEMENT:  create index i2 on demo2(id);\nERROR:  cannot create index on foreign table \"demo2\"\nTime: 0.596 ms\n<\/pre>\n<p>With an index on the traditional demo table the response time is faster on the demo table than on the demo2 table:<\/p>\n<pre class=\"brush: actionscript3; gutter: true; first-line: 1\">postgres=# select id,text,number from demo where id = 50;\n id | text | number \n----+------+--------\n 50 | Trey |    625\n(1 row)\n\nTime: 0.706 ms\npostgres=# select id,text,number from demo where id = 50;\n id | text | number \n----+------+--------\n 50 | Trey |    625\n(1 row)\n\nTime: 0.304 ms\npostgres=# select id,text,number from demo where id = 50;\n id | text | number \n----+------+--------\n 50 | Trey |    625\n(1 row)\n\nTime: 0.286 ms\npostgres=# \n<\/pre>\n<p>But of course this is only true if you query few rows. As soon as we query more data it is the other way around:<\/p>\n<pre class=\"brush: actionscript3; gutter: true; first-line: 1\">postgres=# select sum(number), avg(id) from demo2 where id between 666 and 6666666;\n    sum     |         avg          \n------------+----------------------\n 3336866872 | 3333666.000000000000\n(1 row)\n\nTime: 1485.294 ms\npostgres=# select sum(number), avg(id) from demo2 where id between 666 and 6666666;\n    sum     |         avg          \n------------+----------------------\n 3336866872 | 3333666.000000000000\n(1 row)\n\nTime: 939.993 ms\npostgres=# select sum(number), avg(id) from demo2 where id between 666 and 6666666;\n    sum     |         avg          \n------------+----------------------\n 3336866872 | 3333666.000000000000\n(1 row)\n\nTime: 938.552 ms\n<\/pre>\n<p>For the traditional table:<\/p>\n<pre class=\"brush: actionscript3; gutter: true; first-line: 1\">postgres=# select sum(number), avg(id) from demo where id between 666 and 6666666;\n    sum     |         avg          \n------------+----------------------\n 3336866872 | 3333666.000000000000\n(1 row)\n\nTime: 23447.962 ms\npostgres=# select sum(number), avg(id) from demo where id between 666 and 6666666;\n    sum     |         avg          \n------------+----------------------\n 3336866872 | 3333666.000000000000\n(1 row)\n\nTime: 23488.484 ms\npostgres=# select sum(number), avg(id) from demo where id between 666 and 6666666;\n    sum     |         avg          \n------------+----------------------\n 3336866872 | 3333666.000000000000\n(1 row)\n\nTime: 23660.244 ms\npostgres=# \n<\/pre>\n<p>But there are restrictions currently: You can neither update on nor delete from the columnar table:<\/p>\n<pre class=\"brush: actionscript3; gutter: true; first-line: 1\">postgres=# update demo2 set number = 10 where id = 5;\nERROR:  operation is not supported\nSTATEMENT:  update demo2 set number = 10 where id = 5;\nERROR:  operation is not supported\nTime: 51.183 ms\npostgres=# delete from demo2 where id = 5;\nERROR:  operation is not supported\nSTATEMENT:  delete from demo2 where id = 5;\nERROR:  operation is not supported\nTime: 0.260 ms\npostgres=# \n<\/pre>\n<p>But you can append data:<\/p>\n<pre class=\"brush: actionscript3; gutter: true; first-line: 1\">postgres=# insert into demo2 select * from demo limit 5;\nINSERT 0 5\nTime: 165.618 ms\npostgres=# \n<\/pre>\n<p>Depending on the use case the cstore_fdw might be great alternative (dwh or archive data, for example).<\/p>\n<p>Want to meet in one day our experts from all technologies? Come to our <a href=\"https:\/\/www.dbi-services.com\/index.php\/newsroom-e\/events\/event-l-in-memory-r-boost-your-it-performance\" target=\"_blank\" rel=\"noopener\">Event In-Memory: boost your IT performance!<\/a> where we talk about SQL Server, Oracle and SAP HANA.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Nowadays everybody is talking about columnar storage format. What can PostgreSQL do in this area? There is no native support for that in PostgreSQL but thanks to the fact that PostgreSQL is\u00a0highly extensible there is a foreign data wrapper called cstore_fdw. Lets take a look on what it can do. For installing cstore_fdw we&#8217;ll need [&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":[198],"tags":[579,77],"type_dbi":[],"class_list":["post-4808","post","type-post","status-publish","format-standard","hentry","category-database-management","tag-column-store","tag-postgresql"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v27.2 (Yoast SEO v27.2) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Optimized Row Columnar (ORC) format in PostgreSQL - 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\/optimized-row-columnar-orc-format-in-postgresql\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Optimized Row Columnar (ORC) format in PostgreSQL\" \/>\n<meta property=\"og:description\" content=\"Nowadays everybody is talking about columnar storage format. What can PostgreSQL do in this area? There is no native support for that in PostgreSQL but thanks to the fact that PostgreSQL is\u00a0highly extensible there is a foreign data wrapper called cstore_fdw. Lets take a look on what it can do. For installing cstore_fdw we&#8217;ll need [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.dbi-services.com\/blog\/optimized-row-columnar-orc-format-in-postgresql\/\" \/>\n<meta property=\"og:site_name\" content=\"dbi Blog\" \/>\n<meta property=\"article:published_time\" content=\"2015-05-18T13:33:12+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=\"5 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\/optimized-row-columnar-orc-format-in-postgresql\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/optimized-row-columnar-orc-format-in-postgresql\/\"},\"author\":{\"name\":\"Daniel Westermann\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/8d08e9bd996a89bd75c0286cbabf3c66\"},\"headline\":\"Optimized Row Columnar (ORC) format in PostgreSQL\",\"datePublished\":\"2015-05-18T13:33:12+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/optimized-row-columnar-orc-format-in-postgresql\/\"},\"wordCount\":386,\"commentCount\":0,\"keywords\":[\"Column Store\",\"PostgreSQL\"],\"articleSection\":[\"Database management\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.dbi-services.com\/blog\/optimized-row-columnar-orc-format-in-postgresql\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/optimized-row-columnar-orc-format-in-postgresql\/\",\"url\":\"https:\/\/www.dbi-services.com\/blog\/optimized-row-columnar-orc-format-in-postgresql\/\",\"name\":\"Optimized Row Columnar (ORC) format in PostgreSQL - dbi Blog\",\"isPartOf\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/#website\"},\"datePublished\":\"2015-05-18T13:33:12+00:00\",\"author\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/8d08e9bd996a89bd75c0286cbabf3c66\"},\"breadcrumb\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/optimized-row-columnar-orc-format-in-postgresql\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.dbi-services.com\/blog\/optimized-row-columnar-orc-format-in-postgresql\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/optimized-row-columnar-orc-format-in-postgresql\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Accueil\",\"item\":\"https:\/\/www.dbi-services.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Optimized Row Columnar (ORC) format in PostgreSQL\"}]},{\"@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":"Optimized Row Columnar (ORC) format in PostgreSQL - 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\/optimized-row-columnar-orc-format-in-postgresql\/","og_locale":"en_US","og_type":"article","og_title":"Optimized Row Columnar (ORC) format in PostgreSQL","og_description":"Nowadays everybody is talking about columnar storage format. What can PostgreSQL do in this area? There is no native support for that in PostgreSQL but thanks to the fact that PostgreSQL is\u00a0highly extensible there is a foreign data wrapper called cstore_fdw. Lets take a look on what it can do. For installing cstore_fdw we&#8217;ll need [&hellip;]","og_url":"https:\/\/www.dbi-services.com\/blog\/optimized-row-columnar-orc-format-in-postgresql\/","og_site_name":"dbi Blog","article_published_time":"2015-05-18T13:33:12+00:00","author":"Daniel Westermann","twitter_card":"summary_large_image","twitter_creator":"@westermanndanie","twitter_misc":{"Written by":"Daniel Westermann","Est. reading time":"5 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.dbi-services.com\/blog\/optimized-row-columnar-orc-format-in-postgresql\/#article","isPartOf":{"@id":"https:\/\/www.dbi-services.com\/blog\/optimized-row-columnar-orc-format-in-postgresql\/"},"author":{"name":"Daniel Westermann","@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/8d08e9bd996a89bd75c0286cbabf3c66"},"headline":"Optimized Row Columnar (ORC) format in PostgreSQL","datePublished":"2015-05-18T13:33:12+00:00","mainEntityOfPage":{"@id":"https:\/\/www.dbi-services.com\/blog\/optimized-row-columnar-orc-format-in-postgresql\/"},"wordCount":386,"commentCount":0,"keywords":["Column Store","PostgreSQL"],"articleSection":["Database management"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.dbi-services.com\/blog\/optimized-row-columnar-orc-format-in-postgresql\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.dbi-services.com\/blog\/optimized-row-columnar-orc-format-in-postgresql\/","url":"https:\/\/www.dbi-services.com\/blog\/optimized-row-columnar-orc-format-in-postgresql\/","name":"Optimized Row Columnar (ORC) format in PostgreSQL - dbi Blog","isPartOf":{"@id":"https:\/\/www.dbi-services.com\/blog\/#website"},"datePublished":"2015-05-18T13:33:12+00:00","author":{"@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/8d08e9bd996a89bd75c0286cbabf3c66"},"breadcrumb":{"@id":"https:\/\/www.dbi-services.com\/blog\/optimized-row-columnar-orc-format-in-postgresql\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.dbi-services.com\/blog\/optimized-row-columnar-orc-format-in-postgresql\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.dbi-services.com\/blog\/optimized-row-columnar-orc-format-in-postgresql\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Accueil","item":"https:\/\/www.dbi-services.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Optimized Row Columnar (ORC) format in PostgreSQL"}]},{"@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\/4808","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=4808"}],"version-history":[{"count":0,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts\/4808\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/media?parent=4808"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/categories?post=4808"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/tags?post=4808"},{"taxonomy":"type","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/type_dbi?post=4808"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}