{"id":5145,"date":"2015-05-10T12:33:57","date_gmt":"2015-05-10T10:33:57","guid":{"rendered":"https:\/\/www.dbi-services.com\/blog\/bulk-loading-semi-structured-data-in-postgresql\/"},"modified":"2015-05-10T12:33:57","modified_gmt":"2015-05-10T10:33:57","slug":"bulk-loading-semi-structured-data-in-postgresql","status":"publish","type":"post","link":"https:\/\/www.dbi-services.com\/blog\/bulk-loading-semi-structured-data-in-postgresql\/","title":{"rendered":"bulk loading semi structured data in postgresql"},"content":{"rendered":"<p>The <a href=\"\/the-fastest-way-to-load-1m-rows-in-postgresql\" target=\"_blank\">last post<\/a> took a look at how to efficiently load 1m rows into a table in PostgreSQL. In this post I&#8217;ll take a look on how to do the same with semi structured data.<br \/>\n<img decoding=\"async\" id=\"system-readmore\" class=\"mceItemReadMore\" title=\"Read More\" src=\"http:\/\/wwwold.dbi-services.com\/plugins\/editors\/jce\/tiny_mce\/plugins\/article\/img\/trans.gif\" alt=\"Read More\" \/><br \/>\nAgain it is the same system as in the last post using the same PostgreSQL parameters.<\/p>\n<h3>Using the hstore datatype<\/h3>\n<p>For storing key\/value pairs there is the <a href=\"http:\/\/www.postgresql.org\/docs\/current\/static\/hstore.html\" target=\"_blank\">hstore extension<\/a> in PostgreSQL.<br \/>\nUsing the same sample data as in the last post this is the script to load 1m of key\/value rows:<\/p>\n<pre class=\"brush: java; gutter: true; first-line: 1\">\\timing off\ncreate extension if not exists hstore;\ndrop table demo_hstore;\ncreate table demo_hstore ( document hstore );\n\\timing on\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  lv_hstore_string varchar(80);\nBEGIN\n  for i in 0..1e6 loop\n     n:=trunc(random()*1000+1);\n     lv_hstore_string := 'id =&gt; '||i||', text =&gt; \"'||l_people_array[floor((random()*11))+1::int]||'\", number =&gt; '||n;\n     insert into DEMO_HSTORE values(lv_hstore_string::hstore);\n  end loop;\nEND$$;\n<\/pre>\n<p>Lets execute it:<\/p>\n<pre class=\"brush: java; gutter: true; first-line: 1\">postgres=# \\i 1mio_rows_no_pk_hstore.sql\nTiming is off.\npsql:1mio_rows_no_pk_hstore.sql:2: NOTICE:  extension \"hstore\" already exists, skipping\nCREATE EXTENSION\nDROP TABLE\nCREATE TABLE\nTiming is on.\nDO\nTime: 5833.749 ms\npostgres=# \\i 1mio_rows_no_pk_hstore.sql\nTiming is off.\npsql:1mio_rows_no_pk_hstore.sql:2: NOTICE:  extension \"hstore\" already exists, skipping\nCREATE EXTENSION\nDROP TABLE\nCREATE TABLE\nTiming is on.\nDO\nTime: 5741.429 ms\npostgres=# \\i 1mio_rows_no_pk_hstore.sql\nTiming is off.\npsql:1mio_rows_no_pk_hstore.sql:2: NOTICE:  extension \"hstore\" already exists, skipping\nCREATE EXTENSION\nDROP TABLE\nCREATE TABLE\nTiming is on.\nDO\nTime: 5789.512 ms\n<\/pre>\n<p>Around 6 seconds. Lets unload this with copy and reload it using copy:<\/p>\n<pre class=\"brush: java; gutter: true; first-line: 1\">postgres=# copy demo_hstore to '\/home\/postgres\/demo_hstore.txt';\nCOPY 1000001\nTime: 285.805 ms\n<\/pre>\n<p>Loading it with copy should be a lot faster:<\/p>\n<pre class=\"brush: java; gutter: true; first-line: 1\">\\timing off\ndrop table demo_hstore;\ncreate table demo_hstore ( document hstore );\n\\timing on\ncopy DEMO_HSTORE from '\/home\/postgres\/demo_hstore.txt';\n<\/pre>\n<p>How much faster?<\/p>\n<pre class=\"brush: java; gutter: true; first-line: 1\">postgres=# \\i 1mio_copy_no_indexes_hstore.sql\nTiming is off.\nDROP TABLE\nCREATE TABLE\nTiming is on.\nCOPY 1000001\nTime: 2736.709 ms\npostgres=# \\i 1mio_copy_no_indexes_hstore.sql\nTiming is off.\nDROP TABLE\nCREATE TABLE\nTiming is on.\nCOPY 1000001\nTime: 2882.477 ms\npostgres=# \\i 1mio_copy_no_indexes_hstore.sql\nTiming is off.\nDROP TABLE\nCREATE TABLE\nTiming is on.\nCOPY 1000001\nTime: 3626.356 ms\n<\/pre>\n<p>More than 2 times faster. Your data now looks like this:<\/p>\n<pre class=\"brush: java; gutter: true; first-line: 1\">postgres=# select * from demo_hstore limit 5;\n                   document                   \n----------------------------------------------\n \"id\"=&gt;\"0\", \"text\"=&gt;\"Bill\", \"number\"=&gt;\"424\"\n \"id\"=&gt;\"1\", \"text\"=&gt;\"George\", \"number\"=&gt;\"681\"\n \"id\"=&gt;\"2\", \"text\"=&gt;\"Eliot\", \"number\"=&gt;\"79\"\n \"id\"=&gt;\"3\", \"text\"=&gt;\"George\", \"number\"=&gt;\"472\"\n \"id\"=&gt;\"4\", \"text\"=&gt;\"Greg\", \"number\"=&gt;\"966\"\n(5 rows)\n\nTime: 15.175 ms\n<\/pre>\n<h3>Using the jsonb datatype<\/h3>\n<p>PostgreSQL provides two data types for storing json. <a href=\"http:\/\/www.postgresql.org\/docs\/current\/static\/datatype-json.html\" target=\"_blank\">json and jsonb<\/a>. jsonb is the binary format data type introduced in 9.4 while json is based on text.<br \/>\nSo, lets do the same tests:<\/p>\n<pre class=\"brush: java; gutter: true; first-line: 1\">\\timing off\ndrop table demo_jsonb;\ncreate table demo_jsonb ( document jsonb );\n\\timing on\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  lv_json_string varchar(80);\nBEGIN\n  for i in 0..1e6 loop\n     n:=trunc(random()*1000+1);\n     lv_json_string := '{\"id\":\"'||i||'\", \"text\":\"'||l_people_array[floor((random()*11))+1::int]||'\", \"number\":\"'||n||'\"}';\n     insert into DEMO_JSONB values(lv_json_string::jsonb);\n  end loop;\nEND$$;\n<\/pre>\n<p>How long does it take in a loop? :<\/p>\n<pre class=\"brush: java; gutter: true; first-line: 1\">postgres=# \\i 1mio_rows_no_pk_jsonb.sql\nTiming is off.\nDROP TABLE\nCREATE TABLE\nTiming is on.\nDO\nTime: 6229.134 ms\npostgres=# \\i 1mio_rows_no_pk_jsonb.sql\nTiming is off.\nDROP TABLE\nCREATE TABLE\nTiming is on.\nDO\nTime: 6210.610 ms\npostgres=# \\i 1mio_rows_no_pk_jsonb.sql\nTiming is off.\nDROP TABLE\nCREATE TABLE\nTiming is on.\nDO\nTime: 6237.734 ms\n<\/pre>\n<p>Around 6 seconds. And by using copy?<\/p>\n<pre class=\"brush: java; gutter: true; first-line: 1\">postgres=# copy demo_jsonb to '\/home\/postgres\/demo_jsonb.txt';\nCOPY 1000001\nTime: 501.950 ms\n<\/pre>\n<p>Lets load it:<\/p>\n<pre class=\"brush: java; gutter: true; first-line: 1\">postgres=# \\i 1mio_copy_no_indexes_jsonb.sql\nTiming is off.\nDROP TABLE\nCREATE TABLE\nTiming is on.\nCOPY 1000001\nTime: 3739.681 ms\npostgres=# \\i 1mio_copy_no_indexes_jsonb.sql\nTiming is off.\nDROP TABLE\nCREATE TABLE\nTiming is on.\nCOPY 1000001\nTime: 4369.161 ms\npostgres=# \\i 1mio_copy_no_indexes_jsonb.sql\nTiming is off.\nDROP TABLE\nCREATE TABLE\nTiming is on.\nCOPY 1000001\nTime: 5000.136 ms\n<\/pre>\n<p>Between 4 and 5 seconds. And how does the data look like?<\/p>\n<pre class=\"brush: java; gutter: true; first-line: 1\">postgres=# select * from demo_jsonb limit 5;\n                   document                    \n-----------------------------------------------\n {\"id\": \"0\", \"text\": \"George\", \"number\": \"51\"}\n {\"id\": \"1\", \"text\": \"Marc\", \"number\": \"884\"}\n {\"id\": \"2\", \"text\": \"Bill\", \"number\": \"951\"}\n {\"id\": \"3\", \"text\": \"Steve\", \"number\": \"200\"}\n {\"id\": \"4\", \"text\": \"Eliot\", \"number\": \"722\"}\n(5 rows)\n<\/pre>\n<p>How do you select on this table if you want to limit the results?<\/p>\n<pre class=\"brush: java; gutter: true; first-line: 1\">postgres=# SELECT document-&gt;'id', document-&gt;'text', document-&gt;'number' FROM demo_jsonb WHERE document @&gt; '{\"number\": \"884\"}' limit 5;\n ?column? | ?column? | ?column? \n----------+----------+----------\n \"1\"      | \"Marc\"   | \"884\"\n \"64\"     | \"Katie\"  | \"884\"\n \"201\"    | \"Tracy\"  | \"884\"\n \"1041\"   | \"George\" | \"884\"\n \"2074\"   | \"Greg\"   | \"884\"\n(5 rows)\n<\/pre>\n<p>Check the <a href=\"http:\/\/www.postgresql.org\/docs\/current\/static\/datatype-json.html\" target=\"_blank\">documentation<\/a> for more examples and on how to index jsonb columns.<br \/>\nLooking forward to see <a href=\"https:\/\/www.dbi-services.com\/index.php\/blog\/dbi-bloggers\/blogger\/listings\/fpa\" target=\"_blank\">Franck<\/a> and <a href=\"https:\/\/www.dbi-services.com\/index.php\/blog\/dbi-bloggers\/blogger\/listings\/dab\" target=\"_blank\">David<\/a> to load the same data &#8230;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>The last post took a look at how to efficiently load 1m rows into a table in PostgreSQL. In this post I&#8217;ll take a look on how to do the same with semi structured data. Again it is the same system as in the last post using the same PostgreSQL parameters. Using the hstore datatype [&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":[368],"tags":[77],"type_dbi":[],"class_list":["post-5145","post","type-post","status-publish","format-standard","hentry","category-development-performance","tag-postgresql"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v27.2 (Yoast SEO v27.5) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>bulk loading semi structured data 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\/bulk-loading-semi-structured-data-in-postgresql\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"bulk loading semi structured data in postgresql\" \/>\n<meta property=\"og:description\" content=\"The last post took a look at how to efficiently load 1m rows into a table in PostgreSQL. In this post I&#8217;ll take a look on how to do the same with semi structured data. Again it is the same system as in the last post using the same PostgreSQL parameters. Using the hstore datatype [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.dbi-services.com\/blog\/bulk-loading-semi-structured-data-in-postgresql\/\" \/>\n<meta property=\"og:site_name\" content=\"dbi Blog\" \/>\n<meta property=\"article:published_time\" content=\"2015-05-10T10:33:57+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/wwwold.dbi-services.com\/plugins\/editors\/jce\/tiny_mce\/plugins\/article\/img\/trans.gif\" \/>\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=\"4 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\\\/bulk-loading-semi-structured-data-in-postgresql\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/bulk-loading-semi-structured-data-in-postgresql\\\/\"},\"author\":{\"name\":\"Daniel Westermann\",\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/#\\\/schema\\\/person\\\/8d08e9bd996a89bd75c0286cbabf3c66\"},\"headline\":\"bulk loading semi structured data in postgresql\",\"datePublished\":\"2015-05-10T10:33:57+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/bulk-loading-semi-structured-data-in-postgresql\\\/\"},\"wordCount\":235,\"commentCount\":0,\"image\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/bulk-loading-semi-structured-data-in-postgresql\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/wwwold.dbi-services.com\\\/plugins\\\/editors\\\/jce\\\/tiny_mce\\\/plugins\\\/article\\\/img\\\/trans.gif\",\"keywords\":[\"PostgreSQL\"],\"articleSection\":[\"Development &amp; Performance\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/bulk-loading-semi-structured-data-in-postgresql\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/bulk-loading-semi-structured-data-in-postgresql\\\/\",\"url\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/bulk-loading-semi-structured-data-in-postgresql\\\/\",\"name\":\"bulk loading semi structured data in postgresql - dbi Blog\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/bulk-loading-semi-structured-data-in-postgresql\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/bulk-loading-semi-structured-data-in-postgresql\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/wwwold.dbi-services.com\\\/plugins\\\/editors\\\/jce\\\/tiny_mce\\\/plugins\\\/article\\\/img\\\/trans.gif\",\"datePublished\":\"2015-05-10T10:33:57+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/#\\\/schema\\\/person\\\/8d08e9bd996a89bd75c0286cbabf3c66\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/bulk-loading-semi-structured-data-in-postgresql\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/bulk-loading-semi-structured-data-in-postgresql\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/bulk-loading-semi-structured-data-in-postgresql\\\/#primaryimage\",\"url\":\"http:\\\/\\\/wwwold.dbi-services.com\\\/plugins\\\/editors\\\/jce\\\/tiny_mce\\\/plugins\\\/article\\\/img\\\/trans.gif\",\"contentUrl\":\"http:\\\/\\\/wwwold.dbi-services.com\\\/plugins\\\/editors\\\/jce\\\/tiny_mce\\\/plugins\\\/article\\\/img\\\/trans.gif\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/bulk-loading-semi-structured-data-in-postgresql\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Accueil\",\"item\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"bulk loading semi structured data 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":"bulk loading semi structured data 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\/bulk-loading-semi-structured-data-in-postgresql\/","og_locale":"en_US","og_type":"article","og_title":"bulk loading semi structured data in postgresql","og_description":"The last post took a look at how to efficiently load 1m rows into a table in PostgreSQL. In this post I&#8217;ll take a look on how to do the same with semi structured data. Again it is the same system as in the last post using the same PostgreSQL parameters. Using the hstore datatype [&hellip;]","og_url":"https:\/\/www.dbi-services.com\/blog\/bulk-loading-semi-structured-data-in-postgresql\/","og_site_name":"dbi Blog","article_published_time":"2015-05-10T10:33:57+00:00","og_image":[{"url":"http:\/\/wwwold.dbi-services.com\/plugins\/editors\/jce\/tiny_mce\/plugins\/article\/img\/trans.gif","type":"","width":"","height":""}],"author":"Daniel Westermann","twitter_card":"summary_large_image","twitter_creator":"@westermanndanie","twitter_misc":{"Written by":"Daniel Westermann","Est. reading time":"4 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.dbi-services.com\/blog\/bulk-loading-semi-structured-data-in-postgresql\/#article","isPartOf":{"@id":"https:\/\/www.dbi-services.com\/blog\/bulk-loading-semi-structured-data-in-postgresql\/"},"author":{"name":"Daniel Westermann","@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/8d08e9bd996a89bd75c0286cbabf3c66"},"headline":"bulk loading semi structured data in postgresql","datePublished":"2015-05-10T10:33:57+00:00","mainEntityOfPage":{"@id":"https:\/\/www.dbi-services.com\/blog\/bulk-loading-semi-structured-data-in-postgresql\/"},"wordCount":235,"commentCount":0,"image":{"@id":"https:\/\/www.dbi-services.com\/blog\/bulk-loading-semi-structured-data-in-postgresql\/#primaryimage"},"thumbnailUrl":"http:\/\/wwwold.dbi-services.com\/plugins\/editors\/jce\/tiny_mce\/plugins\/article\/img\/trans.gif","keywords":["PostgreSQL"],"articleSection":["Development &amp; Performance"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.dbi-services.com\/blog\/bulk-loading-semi-structured-data-in-postgresql\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.dbi-services.com\/blog\/bulk-loading-semi-structured-data-in-postgresql\/","url":"https:\/\/www.dbi-services.com\/blog\/bulk-loading-semi-structured-data-in-postgresql\/","name":"bulk loading semi structured data in postgresql - dbi Blog","isPartOf":{"@id":"https:\/\/www.dbi-services.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.dbi-services.com\/blog\/bulk-loading-semi-structured-data-in-postgresql\/#primaryimage"},"image":{"@id":"https:\/\/www.dbi-services.com\/blog\/bulk-loading-semi-structured-data-in-postgresql\/#primaryimage"},"thumbnailUrl":"http:\/\/wwwold.dbi-services.com\/plugins\/editors\/jce\/tiny_mce\/plugins\/article\/img\/trans.gif","datePublished":"2015-05-10T10:33:57+00:00","author":{"@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/8d08e9bd996a89bd75c0286cbabf3c66"},"breadcrumb":{"@id":"https:\/\/www.dbi-services.com\/blog\/bulk-loading-semi-structured-data-in-postgresql\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.dbi-services.com\/blog\/bulk-loading-semi-structured-data-in-postgresql\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.dbi-services.com\/blog\/bulk-loading-semi-structured-data-in-postgresql\/#primaryimage","url":"http:\/\/wwwold.dbi-services.com\/plugins\/editors\/jce\/tiny_mce\/plugins\/article\/img\/trans.gif","contentUrl":"http:\/\/wwwold.dbi-services.com\/plugins\/editors\/jce\/tiny_mce\/plugins\/article\/img\/trans.gif"},{"@type":"BreadcrumbList","@id":"https:\/\/www.dbi-services.com\/blog\/bulk-loading-semi-structured-data-in-postgresql\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Accueil","item":"https:\/\/www.dbi-services.com\/blog\/"},{"@type":"ListItem","position":2,"name":"bulk loading semi structured data 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\/5145","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=5145"}],"version-history":[{"count":0,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts\/5145\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/media?parent=5145"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/categories?post=5145"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/tags?post=5145"},{"taxonomy":"type","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/type_dbi?post=5145"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}