{"id":11457,"date":"2018-07-19T09:17:07","date_gmt":"2018-07-19T07:17:07","guid":{"rendered":"https:\/\/www.dbi-services.com\/blog\/google-cloud-spanner-inserting-data\/"},"modified":"2018-07-19T09:17:07","modified_gmt":"2018-07-19T07:17:07","slug":"google-cloud-spanner-inserting-data","status":"publish","type":"post","link":"https:\/\/www.dbi-services.com\/blog\/google-cloud-spanner-inserting-data\/","title":{"rendered":"Google Cloud Spanner &#8211; inserting data"},"content":{"rendered":"<h2>By Franck Pachot<\/h2>\n<p>.<br \/>\nIn a <a href=\"https:\/\/www.dbi-services.com\/blog\/google-cloud-spanner-no-decimal-numeric-data-types\/\" target=\"_blank\" rel=\"noopener noreferrer\">previous post<\/a> I&#8217;ve created a Google Cloud Spanner database and inserted a few rows from the GUI. This is definitely not a solution fo many rows and here is a post about using the command line.<br \/>\n<!--more--><br \/>\nIf I start the Google Shell from the icon on the Spanner page for my project, everything is set. But if I run it from elsewhere, using the <a href=\"https:\/\/console.cloud.google.com\/cloudshell\" target=\"_blank\" rel=\"noopener noreferrer\">https:\/\/console.cloud.google.com\/cloudshell<\/a> as I did in <a href=\"https:\/\/www.dbi-services.com\/blog\/a-free-persistent-google-cloud-service-with-oracle-xe\/\" target=\"_blank\" rel=\"noopener noreferrer\">A free persistent Google Cloud service with Oracle XE<\/a> I have to set the project:<\/p>\n<pre><code>\nfranck_pachot@cloudshell:~$ gcloud config set project superb-avatar-210409\nUpdated property [core\/project].\nfranck_pachot@superb-avatar-210409:~$ \n<\/code><\/pre>\n<h3>Instance<\/h3>\n<p>I create my Spanner instance with 3 nodes across the world:<\/p>\n<pre><code>\u00a8\nfranck_pachot@superb-avatar-210409:~$ time gcloud spanner instances create franck  --config nam-eur-asia1 --nodes=3 --description Franck \nCreating instance...done.                                                                                                                                                                                                                          \n&nbsp;\nreal    0m3.940s\nuser    0m0.344s\nsys     0m0.092s\n<\/code><\/pre>\n<h3>Database<\/h3>\n<p>and Spanner database &#8211; created in 6 seconds:<\/p>\n<pre><code>\nfranck_pachot@superb-avatar-210409:~$ time gcloud spanner databases create test --instance=franck\nCreating database...done.                                                                                                                                                                                                                          \n&amp;nbssp;\nreal    0m6.832s\nuser    0m0.320s\nsys     0m0.128s\n<\/code><\/pre>\n<h3>Table<\/h3>\n<p>The DDL for table creation can also be run from there:<\/p>\n<pre><code>\nfranck_pachot@superb-avatar-210409:~$ gcloud spanner databases ddl update test --instance=franck --ddl='create table DEMO1 ( ID1 int64, TEXT string(max) ) primary key (ID1)'\nDDL updating...done.                                                                                                                                                                                                                               \n'@type': type.googleapis.com\/google.protobuf.Empty\n<\/code><\/pre>\n<p>I&#8217;m now ready to insert one million rows. Here is my table:<\/p>\n<pre><code>\nfranck_pachot@superb-avatar-210409:~$ gcloud spanner databases ddl describe test --instance=franck\n--- |-\n  CREATE TABLE DEMO1 (\n    ID1 INT64,\n    TEXT STRING(MAX),\n  ) PRIMARY KEY(ID1)\n<\/code><\/pre>\n<h3>Insert<\/h3>\n<p>The gcloud command line has a limited insert possibility:<\/p>\n<pre><code>\nfranck_pachot@superb-avatar-210409:~$ time for i in $(seq 1 1000000) ; do gcloud beta spanner rows insert --table=DEMO1 --database=test --instance=franck --data=ID1=${i},TEXT=XXX${i} ; done\ncommitTimestamp: '2018-07-18T11:09:45.065684Z'\ncommitTimestamp: '2018-07-18T11:09:50.433133Z'\ncommitTimestamp: '2018-07-18T11:09:55.752857Z'\ncommitTimestamp: '2018-07-18T11:10:01.044531Z'\ncommitTimestamp: '2018-07-18T11:10:06.285764Z'\ncommitTimestamp: '2018-07-18T11:10:11.106936Z'\n^C\n<\/code><\/pre>\n<p>Ok, let&#8217;s stop there. Calling a service for each row is not efficient with a latency of 5 seconds.<\/p>\n<h3>API<\/h3>\n<p>I&#8217;ll use the API from Python. Basically, a connection is a Spanner Client:<\/p>\n<pre><code>\nfranck_pachot@superb-avatar-210409:~$ python3\nPython 3.5.3 (default, Jan 19 2017, 14:11:04) \n[GCC 6.3.0 20170118] on linux\nType \"help\", \"copyright\", \"credits\" or \"license\" for more information.\n&gt;&gt;&gt; from google.cloud import spanner\n&gt;&gt;&gt; spanner_client = spanner.Client()\n&gt;&gt;&gt; instance = spanner_client.instance('franck')\n&gt;&gt;&gt; database = instance.database('test')\n&gt;&gt;&gt; \n<\/code><\/pre>\n<h3>Batch Insert<\/h3>\n<p>With this I can send a batch of rows to insert. Here is the full Python script I used to insert one million, by batch of 1000 rows:<\/p>\n<pre><code>\nfrom google.cloud import spanner\nspanner_client = spanner.Client()\ninstance = spanner_client.instance('franck')\ndatabase = instance.database('test')\nfor j in range(1000):\n records=[]\n for i in range(1000):\n  records.append((1+j*1000+i,u'XXX'+str(i)))\n with database.batch() as batch:\n  batch.insert(table='DEMO1',columns=('ID1', 'TEXT',),values=records)\n<\/code><\/pre>\n<p>This takes 2 minutes:<\/p>\n<pre><code>\nfranck_pachot@superb-avatar-210409:~$ time python3 test.py \n&nbsp;\nreal    2m52.707s\nuser    0m21.776s\nsys     0m0.668s\nfranck_pachot@superb-avatar-210409:~$ \n<\/code><\/pre>\n<p>If you remember my list of blogs on <a href=\"https:\/\/www.dbi-services.com\/blog\/?s=Variations+on+1M+rows+insert\" target=\"_blank\" rel=\"noopener noreferrer\">Variations on 1M rows insert<\/a> that&#8217;s not so fast. But remember that rows are distributed across 3 nodes in 3 continents but here inserting with constantly increasing value have all batched rows going to the same node. The PRIMARY KEY in Google Spanner is not only there to declare a constraint but also determines the organization of data.<\/p>\n<h3>Query<\/h3>\n<p>The select can also be run from there from a read-only transaction called &#8216;Snapshot&#8217; because it is doing MVCC consistent reads:<\/p>\n<pre><code>\nfrank_pachot@superb-avatar-210409:~$ python3\nPython 3.5.3 (default, Jan 19 2017, 14:11:04) \n[GCC 6.3.0 20170118] on linux\nType \"help\", \"copyright\", \"credits\" or \"license\" for more information.\n&gt;&gt;&gt; from google.cloud import spanner\n&gt;&gt;&gt; with spanner.Client().instance('franck').database('test').snapshot() as snapshot:\n...     results = snapshot.execute_sql('SELECT COUNT(*) FROM DEMO1')\n...     for row in results:\n...         print(row)\n... \n[1000000]\n<\/code><\/pre>\n<p>The advantage of the read-only transaction is that it can do consistent reads without locking. The queries executed in a read-write transaction have to acquire some locks in order to guarantee consistency when reading across multiple nodes.<\/p>\n<h3>Interleave<\/h3>\n<p>So, you can look at the PRIMARY KEY as a partition by range, and we have also reference partitioning with INTERLEAVE IN PARENT. This reminds me of the Oracle CLUSTER segment that is so rarely used because storing the tables separately is finally the better compromise on performance and flexibility for a multi-purpose database. <\/p>\n<p>Here is my creation of DEMO2 where ID1 is a foreign key referencing DEMO1<\/p>\n<pre><code>\nfranck_pachot@superb-avatar-210409:~$ time gcloud spanner databases ddl update test --instance=franck --ddl='create table DEMO2 ( ID1 int64, ID2 int64, TEXT string(max) ) primary key (ID1,ID2), interleave in parent DEMO1 on delete cascade'\nDDL updating...done.                                                                                                                                                                                                                               \n'@type': type.googleapis.com\/google.protobuf.Empty\n&nbsp;\nreal    0m24.418s\nuser    0m0.356s\nsys     0m0.088s\n<\/code><\/pre>\n<p>I&#8217;m now inserting 5 detail rows per each parent row:<\/p>\n<pre><code>\nfrom google.cloud import spanner\ndatabase =  spanner.Client().instance('franck').database('test')\nfor j in range(1000):\n records=[]\n for i in range(1000):\n  for k in range(5):\n   records.append((1+j*1000+i,k,u'XXX'+str(i)+' '+str(k)))\n with database.batch() as batch:\n  batch.insert(table='DEMO2',columns=('ID1','ID2','TEXT'),values=records)\n<\/code><\/pre>\n<p>This ran in 6 minutes.<\/p>\n<h3>Join (Cross Apply)<\/h3>\n<p>Here is the execution plan for<\/p>\n<pre><code>\nSELECT * FROM DEMO1 join DEMO2 using(ID1) where DEMO2.TEXT=DEMO1.TEXT\n<\/code><\/pre>\n<p>where I join the two tables and apply a filter on the join:<br \/>\n<a href=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/CaptureSpannerCrossApply.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/CaptureSpannerCrossApply.png\" alt=\"CaptureSpannerCrossApply\" width=\"908\" height=\"518\" class=\"aligncenter size-full wp-image-25457\" \/><\/a><\/p>\n<p>Thanks to the INTERLEAVE the join is running locally. Each row from DEMO1 (the Input of the Cross Apply) is joined with DEMO2 (the Map of Cross Apply) locally. Only the result is serialized. On this small number of rows we do not see the benefit from having the rows in multiple nodes. There are only 2 nodes with rows here (2 local executions) and probably one node contains most of the rows. The average time per node is 10.72 seconds and the elapsed time is 20.9 seconds, so I guess that one node ran un 20.9 seconds and the other in 1.35 only.<\/p>\n<p>The same without the tables interleaved (here as DEMO3) is faster to insert but the join will be more complex where DEMO1 must be distributed to all nodes.<br \/>\n<a href=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/CaptureSpannerDistributedCrossApply.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/CaptureSpannerDistributedCrossApply.png\" alt=\"CaptureSpannerDistributedCrossApply\" width=\"970\" height=\"601\" class=\"aligncenter size-full wp-image-25461\" \/><\/a><br \/>\nWithout interleave, the input table of the local Cross Apply is a Batch Scan, which is actually like a temporary table distributed to all nodes (seems to have 51 chunks here), created by the &#8216;Create Batch&#8217;. This is called Distributed Cross Applied. <\/p>\n<h3>So what?<\/h3>\n<p>Google Spanner has only some aspects of SQL and Relational databases. But it is still, like the NoSQL databases, a database where the data model is focused at one use case only because the data model and the data organization have to be designed for specific data access.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>By Franck Pachot . In a previous post I&#8217;ve created a Google Cloud Spanner database and inserted a few rows from the GUI. This is definitely not a solution fo many rows and here is a post about using the command line.<\/p>\n","protected":false},"author":27,"featured_media":11458,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[955,229],"tags":[135,1049,1402],"type_dbi":[],"class_list":["post-11457","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-cloud","category-database-administration-monitoring","tag-cloud","tag-google-cloud","tag-spanner"],"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>Google Cloud Spanner - inserting data - 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\/google-cloud-spanner-inserting-data\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Google Cloud Spanner - inserting data\" \/>\n<meta property=\"og:description\" content=\"By Franck Pachot . In a previous post I&#8217;ve created a Google Cloud Spanner database and inserted a few rows from the GUI. This is definitely not a solution fo many rows and here is a post about using the command line.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.dbi-services.com\/blog\/google-cloud-spanner-inserting-data\/\" \/>\n<meta property=\"og:site_name\" content=\"dbi Blog\" \/>\n<meta property=\"article:published_time\" content=\"2018-07-19T07:17:07+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/CaptureSpannerCrossApply.png\" \/>\n\t<meta property=\"og:image:width\" content=\"908\" \/>\n\t<meta property=\"og:image:height\" content=\"518\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Oracle 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=\"Oracle 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\/google-cloud-spanner-inserting-data\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/google-cloud-spanner-inserting-data\/\"},\"author\":{\"name\":\"Oracle Team\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/66ab87129f2d357f09971bc7936a77ee\"},\"headline\":\"Google Cloud Spanner &#8211; inserting data\",\"datePublished\":\"2018-07-19T07:17:07+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/google-cloud-spanner-inserting-data\/\"},\"wordCount\":667,\"commentCount\":0,\"image\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/google-cloud-spanner-inserting-data\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/CaptureSpannerCrossApply.png\",\"keywords\":[\"Cloud\",\"Google Cloud\",\"Spanner\"],\"articleSection\":[\"Cloud\",\"Database Administration &amp; Monitoring\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.dbi-services.com\/blog\/google-cloud-spanner-inserting-data\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/google-cloud-spanner-inserting-data\/\",\"url\":\"https:\/\/www.dbi-services.com\/blog\/google-cloud-spanner-inserting-data\/\",\"name\":\"Google Cloud Spanner - inserting data - dbi Blog\",\"isPartOf\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/google-cloud-spanner-inserting-data\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/google-cloud-spanner-inserting-data\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/CaptureSpannerCrossApply.png\",\"datePublished\":\"2018-07-19T07:17:07+00:00\",\"author\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/66ab87129f2d357f09971bc7936a77ee\"},\"breadcrumb\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/google-cloud-spanner-inserting-data\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.dbi-services.com\/blog\/google-cloud-spanner-inserting-data\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/google-cloud-spanner-inserting-data\/#primaryimage\",\"url\":\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/CaptureSpannerCrossApply.png\",\"contentUrl\":\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/CaptureSpannerCrossApply.png\",\"width\":908,\"height\":518},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/google-cloud-spanner-inserting-data\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Accueil\",\"item\":\"https:\/\/www.dbi-services.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Google Cloud Spanner &#8211; inserting data\"}]},{\"@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\/66ab87129f2d357f09971bc7936a77ee\",\"name\":\"Oracle Team\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/secure.gravatar.com\/avatar\/f711f7cd2c9b09bf2627133755b569fb5be0694810cfd33033bdd095fedba86d?s=96&d=mm&r=g\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/f711f7cd2c9b09bf2627133755b569fb5be0694810cfd33033bdd095fedba86d?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/f711f7cd2c9b09bf2627133755b569fb5be0694810cfd33033bdd095fedba86d?s=96&d=mm&r=g\",\"caption\":\"Oracle Team\"},\"url\":\"https:\/\/www.dbi-services.com\/blog\/author\/oracle-team\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Google Cloud Spanner - inserting data - 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\/google-cloud-spanner-inserting-data\/","og_locale":"en_US","og_type":"article","og_title":"Google Cloud Spanner - inserting data","og_description":"By Franck Pachot . In a previous post I&#8217;ve created a Google Cloud Spanner database and inserted a few rows from the GUI. This is definitely not a solution fo many rows and here is a post about using the command line.","og_url":"https:\/\/www.dbi-services.com\/blog\/google-cloud-spanner-inserting-data\/","og_site_name":"dbi Blog","article_published_time":"2018-07-19T07:17:07+00:00","og_image":[{"width":908,"height":518,"url":"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/CaptureSpannerCrossApply.png","type":"image\/png"}],"author":"Oracle Team","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Oracle Team","Est. reading time":"6 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.dbi-services.com\/blog\/google-cloud-spanner-inserting-data\/#article","isPartOf":{"@id":"https:\/\/www.dbi-services.com\/blog\/google-cloud-spanner-inserting-data\/"},"author":{"name":"Oracle Team","@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/66ab87129f2d357f09971bc7936a77ee"},"headline":"Google Cloud Spanner &#8211; inserting data","datePublished":"2018-07-19T07:17:07+00:00","mainEntityOfPage":{"@id":"https:\/\/www.dbi-services.com\/blog\/google-cloud-spanner-inserting-data\/"},"wordCount":667,"commentCount":0,"image":{"@id":"https:\/\/www.dbi-services.com\/blog\/google-cloud-spanner-inserting-data\/#primaryimage"},"thumbnailUrl":"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/CaptureSpannerCrossApply.png","keywords":["Cloud","Google Cloud","Spanner"],"articleSection":["Cloud","Database Administration &amp; Monitoring"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.dbi-services.com\/blog\/google-cloud-spanner-inserting-data\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.dbi-services.com\/blog\/google-cloud-spanner-inserting-data\/","url":"https:\/\/www.dbi-services.com\/blog\/google-cloud-spanner-inserting-data\/","name":"Google Cloud Spanner - inserting data - dbi Blog","isPartOf":{"@id":"https:\/\/www.dbi-services.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.dbi-services.com\/blog\/google-cloud-spanner-inserting-data\/#primaryimage"},"image":{"@id":"https:\/\/www.dbi-services.com\/blog\/google-cloud-spanner-inserting-data\/#primaryimage"},"thumbnailUrl":"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/CaptureSpannerCrossApply.png","datePublished":"2018-07-19T07:17:07+00:00","author":{"@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/66ab87129f2d357f09971bc7936a77ee"},"breadcrumb":{"@id":"https:\/\/www.dbi-services.com\/blog\/google-cloud-spanner-inserting-data\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.dbi-services.com\/blog\/google-cloud-spanner-inserting-data\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.dbi-services.com\/blog\/google-cloud-spanner-inserting-data\/#primaryimage","url":"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/CaptureSpannerCrossApply.png","contentUrl":"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/CaptureSpannerCrossApply.png","width":908,"height":518},{"@type":"BreadcrumbList","@id":"https:\/\/www.dbi-services.com\/blog\/google-cloud-spanner-inserting-data\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Accueil","item":"https:\/\/www.dbi-services.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Google Cloud Spanner &#8211; inserting data"}]},{"@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\/66ab87129f2d357f09971bc7936a77ee","name":"Oracle Team","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/f711f7cd2c9b09bf2627133755b569fb5be0694810cfd33033bdd095fedba86d?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/f711f7cd2c9b09bf2627133755b569fb5be0694810cfd33033bdd095fedba86d?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/f711f7cd2c9b09bf2627133755b569fb5be0694810cfd33033bdd095fedba86d?s=96&d=mm&r=g","caption":"Oracle Team"},"url":"https:\/\/www.dbi-services.com\/blog\/author\/oracle-team\/"}]}},"_links":{"self":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts\/11457","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\/27"}],"replies":[{"embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/comments?post=11457"}],"version-history":[{"count":0,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts\/11457\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/media\/11458"}],"wp:attachment":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/media?parent=11457"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/categories?post=11457"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/tags?post=11457"},{"taxonomy":"type","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/type_dbi?post=11457"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}