204 lines
336 KiB
HTML
204 lines
336 KiB
HTML
<!doctype html><html lang="en-US" dir="ltr"><head><base href="https://cloud.google.com/blog/"><link rel="preconnect" href="//www.gstatic.com"><meta name="referrer" content="origin"><meta name="viewport" content="initial-scale=1, width=device-width"><meta name="track-metadata-page_hosting_platform" content="blog_boq"><meta name="mobile-web-app-capable" content="yes"><meta name="apple-mobile-web-app-capable" content="yes"><meta name="application-name" content="Google Cloud Blog"><meta name="apple-mobile-web-app-title" content="Google Cloud Blog"><meta name="apple-mobile-web-app-status-bar-style" content="black"><meta name="msapplication-tap-highlight" content="no"><link rel="preconnect" href="//fonts.googleapis.com"><link rel="preconnect" href="//fonts.gstatic.com"><link rel="preconnect" href="//www.gstatic.com"><link rel="preconnect" href="//storage.googleapis.com"><link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Google+Sans+Text:400,500,700,400i,500i,700i" nonce="RWMKHuytZOJr4DhxiNx31g"><link rel="manifest" crossorigin="use-credentials" href="_/TransformBlogUi/manifest.json"><link rel="home" href="/?lfhs=2"><link rel="msapplication-starturl" href="/?lfhs=2"><link rel="icon" href="https://www.gstatic.com/cgc/supercloud_favicon.ico" sizes="32x32"><link rel="apple-touch-icon-precomposed" href="https://www.gstatic.com/cgc/supercloud_favicon.ico" sizes="32x32"><link rel="msapplication-square32x32logo" href="https://www.gstatic.com/cgc/supercloud_favicon.ico" sizes="32x32"><script data-id="_gd" nonce="ukEud-BIIo14C235ZP9QwA">window.WIZ_global_data = {"AfY8Hf":true,"Bwo7Jf":"%.@.\"US\",4]","CGQM5":"%.@.[[1]]]","DpimGf":false,"EP1ykd":["/_/*","/accounts/*","/sitemap/*","/sitemaplanding/*","/sitemapsummary/*","/sitemapsummarylanding/*","/static/*","/transform","/transform/*"],"FdrFJe":"-3718342947793369815","HiPsbb":1,"Im6cmf":"/blog/_/TransformBlogUi","JvMKJd":"%.@.\"GTM-5CVQBG\",[[\"en\",\"\\u202aEnglish\\u202c\",true,\"en\"],[\"de\",\"\\u202aDeutsch\\u202c\",true,\"de\"],[\"es\",\"\\u202aEspañol\\u202c\",true,\"es\"],[\"es-419\",\"\\u202aEspañol (Latinoamérica)\\u202c\",true,\"es-419\"],[\"fr\",\"\\u202aFrançais\\u202c\",true,\"fr\"],[\"id\",\"\\u202aIndonesia\\u202c\",true,\"id\"],[\"it\",\"\\u202aItaliano\\u202c\",true,\"it\"],[\"pt-BR\",\"\\u202aPortuguês (Brasil)\\u202c\",true,\"pt-BR\"],[\"zh-CN\",\"\\u202a简体中文\\u202c\",true,\"zh-Hans\"],[\"zh-TW\",\"\\u202a繁體中文\\u202c\",true,\"zh-Hant\"],[\"ja\",\"\\u202a日本語\\u202c\",true,\"ja\"],[\"ko\",\"\\u202a한국어\\u202c\",true,\"ko\"]],[\"83405\",\"AIzaSyD3LJeW4Q6gtdgJlyeFZUp-GhpIoc6EUeg\"],\"en\",null,null,[],[[\"https://cloud.google.com/innovators\",\"https://cloud.google.com/innovators/plus/activate\",\"https://cloud.google.com/innovators/innovatorsplus\"],[\"https://workspace.google.com/pricing\",\"https://www.x.com/googleworkspace\",\"https://www.facebook.com/googleworkspace\",\"https://www.youtube.com/channel/UCBmwzQnSoj9b6HzNmFrg_yw\",\"https://www.instagram.com/googleworkspace\",\"https://www.linkedin.com/showcase/googleworkspace\",\"https://about.google/?utm_source\\u003dworkspace.google.com\\u0026utm_medium\\u003dreferral\\u0026utm_campaign\\u003dgsuite-footer-en\",\"https://about.google/products/?tip\\u003dexplore\",\"https://workspace.google.com\",\"https://workspace.google.com/contact/?source\\u003dgafb-form-globalnav-en\",\"https://workspace.google.com/business/signup/welcome?hl\\u003den\\u0026source\\u003dgafb-form-globalnav-en\",\"https://workspace.google.com/blog\"],[\"https://www.cloudskillsboost.google\",\"https://www.cloudskillsboost.google?utm_source\\u003dcgc\\u0026utm_medium\\u003dwebsite\\u0026utm_campaign\\u003devergreen\",\"https://www.cloudskillsboost.google/subscriptions?utm_source\\u003dcgc\\u0026utm_medium\\u003dwebsite\\u0026utm_campaign\\u003devergreenlaunchpromo\",\"https://www.cloudskillsboost.google/subscriptions?utm_source\\u003dcgc\\u0026utm_medium\\u003dwebsite\\u0026utm_campaign\\u003devergreen\",\"https://www.cloudskillsboost.google/catalog?utm_source\\u003dcgc\\u0026utm_medium\\u003dwebsite\\u0026utm_campaign\\u003devergreen\",\"https://www.cloudskillsboost.google/paths?utm_source\\u003dcgc\\u0026utm_medium\\u003dwebsite\\u0026utm_campaign\\u003devergreen\"],[\"https://mapsplatform.google.com\"],[\"https://cloud.google.com/developers\",\"https://cloud.google.com/developers/settings?utm_source\\u003dinnovators\"],[\"https://console.cloud.google.com/freetrial\",\"https://console.cloud.google.com/\",\"https://console.cloud.google.com/freetrial?redirectPath\\u003dhttps://cloud.google.com/blog/products/gcp/what-dbas-need-to-know-about-cloud-spanner-part-1-keys-and-indexes/\"],[\"https://aitestkitchen.withgoogle.com/signup\",\"https://blog.google/technology/ai/join-us-in-the-ai-test-kitchen/\",\"https://cloud.google.com/ai\"],[\"https://googlecloudplatform.blogspot.com/\",\"https://github.com/GoogleCloudPlatform\",\"https://www.linkedin.com/showcase/google-cloud\",\"https://x.com/googlecloud\",\"https://www.facebook.com/googlecloud\"],[[[\"https://cloud.google.com/products/compute\"],[\"https://cloud.google.com/bigquery\"],[\"https://cloud.google.com/kubernetes-engine\"],[\"https://cloud.google.com/vertex-ai\"],[\"https://cloud.google.com/apigee\"],[\"https://cloud.google.com/functions\"],[\"https://cloud.google.com/generative-ai-studio\"],[\"https://cloud.google.com/products/agent-builder\"],[\"https://cloud.google.com/products/conversational-agents\"],[\"https://cloud.google.com/natural-language\"],[\"https://cloud.google.com/speech-to-text\"],[\"https://cloud.google.com/text-to-speech\"],[\"https://cloud.google.com/video-intelligence\"],[\"https://cloud.google.com/vertex-ai-notebooks\"],[\"https://cloud.google.com/gpu\"],[\"https://cloud.google.com/document-ai\"],[\"https://cloud.google.com/looker\"],[\"https://cloud.google.com/looker-studio\"],[\"https://cloud.google.com/bare-metal\"],[\"https://cloud.google.com/batch\"],[\"https://cloud.google.com/vmware-engine\"],[\"https://cloud.google.com/build\"],[\"https://cloud.google.com/deploy\"],[\"https://cloud.google.com/dataproc\"],[\"https://cloud.google.com/products/dataflow\"],[\"https://cloud.google.com/dataform\"],[\"https://cloud.google.com/pubsub\"],[\"https://cloud.google.com/data-fusion\"],[\"https://cloud.google.com/composer\"],[\"https://cloud.google.com/dataplex\"],[\"https://cloud.google.com/analytics-hub\"],[\"https://cloud.google.com/biglake\"],[\"https://cloud.google.com/products/alloydb\"],[\"https://cloud.google.com/bigtable\"],[\"https://cloud.google.com/spanner\"],[\"https://cloud.google.com/sql\"],[\"https://cloud.google.com/products/firestore\"],[\"https://cloud.google.com/memorystore\"],[\"https://cloud.google.com/datastream\"],[\"https://cloud.google.com/security/products/assured-open-source-software\"],[\"https://cloud.google.com/code/\"],[\"https://cloud.google.com/sdk\"],[\"https://cloud.google.com/workstations\"],[\"https://cloud.google.com/anti-money-laundering-ai\"],[\"https://cloud.google.com/healthcare-api\"],[\"https://cloud.google.com/device-connect\"],[\"https://cloud.google.com/telecom-network-automation\"],[\"https://cloud.google.com/telecom-data-fabric\"],[\"https://cloud.google.com/telecom-subscriber-insights\"],[\"https://cloud.google.com/application-integration\"],[\"https://cloud.google.com/carbon-footprint\"],[\"https://cloud.google.com/cost-management\"],[\"https://cloud.google.com/managed-prometheus\"],[\"https://cloud.google.com/service-health\"],[\"https://cloud.google.com/earth-engine\"],[\"https://cloud.google.com/cdn/\"],[\"https://cloud.google.com/database-migration\"],[\"https://cloud.google.com/storage-transfer-service/\"],[\"https://cloud.google.com/immersive-stream/xr/\"],[\"https://cloud.google.com/dns\"],[\"https://cloud.google.com/security/products/intrusion-detection-system\"],[\"https://cloud.google.com/load-balancing\"],[\"https://cloud.google.com/nat\"],[\"https://cloud.google.com/network-connectivity-center\"],[\"https://cloud.google.com/network-intelligence-center\"],[\"https://cloud.google.com/security/products/armor\"],[\"https://cloud.google.com/security/products/firewall\"],[\"https://cloud.google.com/private-service-connect\"],[\"https://cloud.google.com/vpc\"],[\"https://cloud.google.com/security/vpc-service-controls\"],[\"https://cloud.google.com/logging\"],[\"https://cloud.google.com/monitoring\"],[\"https://cloud.google.com/appsheet/automation\"],[\"https://cloud.google.com/identity\"],[\"https://cloud.google.com/security/products/access-transparency\"],[\"https://cloud.google.com/security/products/assured-workloads\"],[\"https://cloud.google.com/security/products/security-key-management\"],[\"https://cloud.google.com/security/products/confidential-computing\"],[\"https://cloud.google.com/security/products/security-command-center\"],[\"https://cloud.google.com/security/products/iap\"],[\"https://cloud.google.com/security/products/certificate-authority-service\"],[\"https://cloud.google.com/security/products/titan-security-key\"],[\"https://cloud.google.com/security/products/recaptcha\"],[\"https://cloud.google.com/security/products/identity-platform\"],[\"https://cloud.google.com/security/products/threat-intelligence\"],[\"https://cloud.google.com/security/products/attack-surface-management\"],[\"https://cloud.google.com/security/products/digital-threat-monitoring\"],[\"https://cloud.google.com/security/products/mandiant-security-validation\"],[\"https://cloud.google.com/security/products/security-operations\"],[\"https://cloud.google.com/appengine\"],[\"https://cloud.google.com/run\"],[\"https://cloud.google.com/workflows\"],[\"https://cloud.google.com/storage\"],[\"https://cloud.google.com/filestore\"],[\"https://cloud.google.com/persistent-disk\"],[\"https://cloud.google.com/backup-disaster-recovery\"],[\"https://cloud.google.com/netapp-volumes\"],[\"https://cloud.google.com/parallelstore\"],[\"https://cloud.google.com/blockchain-node-engine\"],[\"https://cloud.google.com/products/observability\"],[\"https://cloud.google.com/products/gemini/cloud-assist\"],[\"https://cloud.google.com/agent-assist\"],[\"https://cloud.google.com/products/blockchain-rpc/\"],[\"https://cloud.google.com/distributed-cloud\"],[\"https://cloud.google.com/translate\"]]]],[2026,9,11],[[\"en\",\"x-default\"],\"x-default\"],[null,true],null,\"/blog/products/gcp/what-dbas-need-to-know-about-cloud-spanner-part-1-keys-and-indexes/?hl\\u003den\",[\"6LcsrxUqAAAAAFhpR1lXsPN2j2nsTwy6JTbRKzJr\"],null,[\"marketing-studio-write-user\"]]","LVIXXb":1,"LoQv7e":false,"M55kSc":"%.@.]","MT7f9b":[],"MUE6Ne":"cloudx-web-blog-uiserver","PylxI":"%.@.\"cloudblog\",\"products/gcp/what-dbas-need-to-know-about-cloud-spanner-part-1-keys-and-indexes\",[\"en\",\"de\",\"fr\",\"ko\",\"ja\"],\"en\",null,\"https://cloud.google.com/blog/\",\"blog_article\",\"cloud.google.com\",[\"https://console.cloud.google.com/freetrial/\",\"https://cloud.google.com/contact/\",\"https://cloud.google.com/\",\"https://cloud.google.com/blog/\",\"https://cloud.google.com/\",\"https://www.google.com/\",\"https://cloud.google.com/products/\",\"https://about.google.com/products/\",\"https://about.google/intl/en/\",\"https://support.google.com\"],[\"googlecloud\",\"googlecloud\",\"showcase/google-cloud\",\"googlecloud/\",\"googlecloud/\"],true,\"/blog/products/gcp/what-dbas-need-to-know-about-cloud-spanner-part-1-keys-and-indexes/\"]","QrtxK":"","S06Grb":"","S6lZl":105833389,"TSDtV":"%.@.[[null,[[45837477,null,false,null,null,null,\"srequb\"],[45680097,null,true,null,null,null,\"PvHIUc\"],[45532645,null,true,null,null,null,\"wFnpse\"],[45449433,null,true,null,null,null,\"BotAtd\"],[45744209,null,false,null,null,null,\"JxMqJf\"],[45813112,null,null,null,\"projects/gweb-cloud-chat-prod/locations/us/apps/45c2d323-204d-48d3-92fc-2687b7b83fc2/deployments/067abe51-ab2d-4b92-9bd7-da8449eb9242\",null,\"V8lsGf\"],[45722680,null,true,null,null,null,\"BWcuJc\"],[45449449,null,true,null,null,null,\"b5B1L\"],[45759811,null,true,null,null,null,\"KrIGrd\"],[45785379,null,false,null,null,null,\"aY24Yb\"],[45701740,null,false,null,null,null,\"y6g6ie\"],[45646404,null,true,null,null,null,\"tfPPe\"],[45825584,null,false,null,null,null,\"Ekaiab\"],[45631885,null,false,null,null,null,\"kG32O\"],[45449445,null,true,null,null,null,\"C4H3Td\"],[45449438,null,false,null,null,null,\"m0uJSe\"],[45798764,null,true,null,null,null,\"ftwKye\"],[45749343,null,false,null,null,null,\"oSympb\"],[45752517,null,false,null,null,null,\"F1plqc\"],[45826729,null,false,null,null,null,\"IKu6Ue\"],[45449467,null,null,null,\"variant4\",null,\"qL2Vf\"],[45449469,null,null,null,\"default\",null,\"mBNY1\"],[45837118,null,false,null,null,null,\"zbMFKc\"],[45771867,null,false,null,null,null,\"MHNqU\"],[45449434,null,true,null,null,null,\"PvZHQ\"],[45754671,null,true,null,null,null,\"hMe1rb\"],[45817954,null,false,null,null,null,\"BJOcCd\"],[45745727,null,true,null,null,null,\"yjPBc\"],[45449435,null,false,null,null,null,\"s7Z7Ld\"],[45812792,null,true,null,null,null,\"R7XCie\"],[45767041,null,true,null,null,null,\"bdhplb\"],[45532646,null,true,null,null,null,\"RIvlU\"],[45449439,null,true,null,null,null,\"lsuui\"],[45752205,null,false,null,null,null,\"oiRoS\"],[45795490,null,true,null,null,null,\"Jpadob\"],[45651724,null,true,null,null,null,\"xYDLRc\"],[45725850,null,true,null,null,null,\"gC7Zce\"],[45449444,null,true,null,null,null,\"HGJqie\"],[45753540,null,true,null,null,null,\"S8n1J\"],[45768800,null,true,null,null,null,\"HIWUOc\"],[45757409,null,false,null,null,null,\"u4N7kf\"],[45778758,null,true,null,null,null,\"yj6JAc\"],[45449436,null,false,null,null,null,\"NCoWOd\"],[45743518,null,true,null,null,null,\"uYraWb\"],[45775335,null,true,null,null,null,\"Q5MWO\"],[45735522,null,true,null,null,null,\"jzW39e\"],[45685295,null,false,null,null,null,\"gu5ZGb\"],[45674523,null,false,null,null,null,\"EB3TEf\"],[45773628,null,true,null,null,null,\"BjJdxb\"],[45449442,null,true,null,null,null,\"dsKk4d\"],[45788620,null,true,null,null,null,\"h5BYjc\"],[45741355,null,true,null,null,null,\"l9Tv3e\"],[45815772,null,true,null,null,null,\"AiR0Db\"],[45728287,null,true,null,null,null,\"uafElc\"],[45459555,null,false,null,null,null,\"Imeoqb\"],[45449440,null,false,null,null,null,\"j9nUqf\"],[45786094,null,true,null,null,null,\"RU5eB\"],[45734162,null,true,null,null,null,\"oQBWLd\"],[45449471,null,null,null,\"default\",null,\"Ammqqf\"],[45726389,null,true,null,null,null,\"aMBCvc\"],[45702737,null,true,null,null,null,\"pcLlld\"],[45739488,null,false,null,null,null,\"VaCY3d\"],[45734163,null,true,null,null,null,\"T74Ilb\"],[45612748,null,false,null,null,null,\"fdXYmb\"],[45738613,null,false,null,null,null,\"mHT8Be\"],[45671281,null,false,null,null,null,\"TQUxrf\"],[45823449,null,true,null,null,null,\"Uwy9Df\"],[45449443,null,false,null,null,null,\"wvKxS\"],[45830711,null,false,null,null,null,\"EMC88b\"],[45449450,null,false,null,null,null,\"PTNaKe\"],[45795459,null,false,null,null,null,\"T0LQ0d\"],[45681401,null,false,null,null,null,\"aj6iDb\"],[45752829,null,false,null,null,null,\"Fajj6c\"],[45801909,3000,null,null,null,null,\"K6BlHd\"],[45734079,null,false,null,null,null,\"vCPH2e\"],[45449446,null,true,null,null,null,\"ktxJzc\"],[45449468,null,null,null,\"variant2\",null,\"BUEcUe\"],[45747617,null,true,null,null,null,\"SV187c\"],[45628378,null,true,null,null,null,\"hRRuzd\"],[45662552,null,true,null,null,null,\"epuB3d\"],[45733437,null,true,null,null,null,\"qvuKo\"]],\"CAMSJB0l7s2IEJ3+BOiHrBAKAArapfAECsy6BrHSBNrbC+ixBM2mGw\\u003d\\u003d\"]]]","UUFaWc":"%.@.null,1000,2]","Vvafkd":false,"Yllh3e":"%.@.1789169664736347,130343851,3643200718]","aAofAd":"%.@.[[[\"Solutions \\u0026 technology\",null,[[[\"AI \\u0026 Machine Learning\",\"/blog/products/ai-machine-learning\"],[\"API Management\",\"/blog/products/api-management\"],[\"Application Development\",\"/blog/products/application-development\"],[\"Application Modernization\",\"/blog/products/application-modernization\"],[\"Chrome Enterprise\",\"/blog/products/chrome-enterprise\"],[\"Compute\",\"/blog/products/compute\"],[\"Containers \\u0026 Kubernetes\",\"/blog/products/containers-kubernetes\"],[\"Data Analytics\",\"/blog/products/data-analytics\"],[\"Databases\",\"/blog/products/databases\"],[\"DevOps \\u0026 SRE\",\"/blog/products/devops-sre\"],[\"Maps \\u0026 Geospatial\",\"/blog/topics/maps-geospatial\"],[\"Security\",null,[[[\"Security \\u0026 Identity\",\"/blog/products/identity-security\"],[\"Threat Intelligence\",\"/blog/topics/threat-intelligence\"]]]],[\"Infrastructure\",\"/blog/products/infrastructure\"],[\"Infrastructure Modernization\",\"/blog/products/infrastructure-modernization\"],[\"Networking\",\"/blog/products/networking\"],[\"Productivity \\u0026 Collaboration\",\"/blog/products/productivity-collaboration\"],[\"SAP on Google Cloud\",\"/blog/products/sap-google-cloud\"],[\"Storage \\u0026 Data Transfer\",\"/blog/products/storage-data-transfer\"],[\"Sustainability\",\"/blog/topics/sustainability\"]]]],[\"Ecosystem\",null,[[[\"IT Leaders\",\"/transform\"],[\"Industries\",null,[[[\"Financial Services\",\"/blog/topics/financial-services\"],[\"Healthcare \\u0026 Life Sciences\",\"/blog/topics/healthcare-life-sciences\"],[\"Manufacturing\",\"/blog/topics/manufacturing\"],[\"Media \\u0026 Entertainment\",\"/blog/products/media-entertainment\"],[\"Public Sector\",\"/blog/topics/public-sector\"],[\"Retail\",\"/blog/topics/retail\"],[\"Supply Chain\",\"/blog/topics/supply-chain-logistics\"],[\"Telecommunications\",\"/blog/topics/telecommunications\"]]]],[\"Partners\",\"/blog/topics/partners\"],[\"Startups \\u0026 SMB\",\"/blog/topics/startups\"],[\"Training \\u0026 Certifications\",\"/blog/topics/training-certifications\"],[\"Inside Google Cloud\",\"/blog/topics/inside-google-cloud\"],[\"Google Cloud Next \\u0026 Events\",\"/blog/topics/google-cloud-next\"],[\"Google Cloud Consulting\",\"/blog/topics/consulting\"],[\"Google Maps Platform\",\"https://mapsplatform.google.com/resources/blog/\"],[\"Google Workspace\",\"https://workspace.google.com/blog\"]]]],[\"Developers \\u0026 Practitioners\",\"/blog/topics/developers-practitioners\"],[\"Transform with Google Cloud\",\"/transform\"]]],[[\"de\",[[[\"Neuigkeiten\",\"/blog/de/topics/whats-new/aktuelles-auf-dem-google-cloud-blog\"],[\"Lösungen \\u0026 Technologien\",null,[[[\"Anwendungsentwicklung\",\"/blog/de/products/application-development\"],[\"Anwendungsmodernisierung\",\"/blog/de/products/anwendungsmodernisierung\"],[\"API-Verwaltung\",\"/blog/de/products/api-management\"],[\"Chrome Enterprise\",\"/blog/de/products/chrome-enterprise\"],[\"Computing\",\"/blog/de/products/compute\"],[\"Containers \\u0026 Kubernetes\",\"/blog/de/products/containers-kubernetes\"],[\"Datenanalysen\",\"/blog/de/products/data-analytics\"],[\"Datenbanken\",\"/blog/de/products/databases\"],[\"DevOps \\u0026 SRE\",\"/blog/de/products/devops-sre\"],[\"Infrastruktur\",\"/blog/de/products/infrastructure\"],[\"KI \\u0026 Machine Learning\",\"/blog/de/products/ai-machine-learning\"],[\"Maps \\u0026 Geospatial\",\"/blog/de/topics/maps-geospatial\"],[\"Modernisierung der Infrastruktur\",\"/blog/de/products/modernisierung-der-infrastruktur\"],[\"Nachhaltigkeit\",\"/blog/de/topics/nachhaltigkeit\"],[\"Netzwerk\",\"/blog/de/products/networking\"],[\"Produktivität und Zusammenarbeit\",\"/blog/de/products/produktivitaet-und-kollaboration\"],[\"SAP in Google Cloud\",\"/blog/de/products/sap-google-cloud\"],[\"Sicherheit \\u0026 Identität\",\"/blog/de/products/identity-security\"],[\"Speicher und Datentransfer\",\"/blog/de/products/storage-data-transfer\"]]]],[\"Ökosystem\",null,[[[\"IT Leader\",\"/transform/de\"],[\"Industrien\",null,[[[\"Behörden und öffentlicher Sektor\",\"/blog/de/topics/public-sector\"],[\"Einzelhandel\",\"/blog/de/topics/retail\"],[\"Fertigung\",\"/blog/de/topics/fertigung\"],[\"Finanzdienstleistungen\",\"/blog/de/topics/financial-services\"],[\"Gesundheitswesen und Biowissenschaften\",\"/blog/de/topics/healthcare-life-sciences\"],[\"Lieferkette und Logistik\",\"/blog/de/topics/lieferkette-und-logistik\"],[\"Medien und Unterhaltung\",\"/blog/de/products/media-entertainment\"],[\"Telekommunikation\",\"/blog/de/topics/telecommunications\"]]]],[\"Entwickler*innen \\u0026 Fachkräfte\",\"/blog/de/topics/developers-practitioners\"],[\"Google Cloud Next \\u0026 Events\",\"/blog/de/topics/events\"],[\"Google Maps Platform\",\"/blog/de/products/maps-platform\"],[\"Google Workspace\",\"https://workspace.google.com/blog/de\"],[\"Inside Google Cloud\",\"/blog/de/topics/inside-google-cloud\"],[\"Kunden\",\"/blog/de/topics/kunden\"],[\"Partner\",\"/blog/de/topics/partners\"],[\"Start-ups und KMU\",\"/blog/de/topics/startups\"],[\"Training und Zertifizierung\",\"/blog/de/topics/training-certifications\"]]]],[\"Transformation mit Google Cloud\",\"/transform/de\"]]]],[\"en\",[[[\"Solutions \\u0026 technology\",null,[[[\"AI \\u0026 Machine Learning\",\"/blog/products/ai-machine-learning\"],[\"API Management\",\"/blog/products/api-management\"],[\"Application Development\",\"/blog/products/application-development\"],[\"Application Modernization\",\"/blog/products/application-modernization\"],[\"Chrome Enterprise\",\"/blog/products/chrome-enterprise\"],[\"Compute\",\"/blog/products/compute\"],[\"Containers \\u0026 Kubernetes\",\"/blog/products/containers-kubernetes\"],[\"Data Analytics\",\"/blog/products/data-analytics\"],[\"Databases\",\"/blog/products/databases\"],[\"DevOps \\u0026 SRE\",\"/blog/products/devops-sre\"],[\"Maps \\u0026 Geospatial\",\"/blog/topics/maps-geospatial\"],[\"Security\",null,[[[\"Security \\u0026 Identity\",\"/blog/products/identity-security\"],[\"Threat Intelligence\",\"/blog/topics/threat-intelligence\"]]]],[\"Infrastructure\",\"/blog/products/infrastructure\"],[\"Infrastructure Modernization\",\"/blog/products/infrastructure-modernization\"],[\"Networking\",\"/blog/products/networking\"],[\"Productivity \\u0026 Collaboration\",\"/blog/products/productivity-collaboration\"],[\"SAP on Google Cloud\",\"/blog/products/sap-google-cloud\"],[\"Storage \\u0026 Data Transfer\",\"/blog/products/storage-data-transfer\"],[\"Sustainability\",\"/blog/topics/sustainability\"]]]],[\"Ecosystem\",null,[[[\"IT Leaders\",\"/transform\"],[\"Industries\",null,[[[\"Financial Services\",\"/blog/topics/financial-services\"],[\"Healthcare \\u0026 Life Sciences\",\"/blog/topics/healthcare-life-sciences\"],[\"Manufacturing\",\"/blog/topics/manufacturing\"],[\"Media \\u0026 Entertainment\",\"/blog/products/media-entertainment\"],[\"Public Sector\",\"/blog/topics/public-sector\"],[\"Retail\",\"/blog/topics/retail\"],[\"Supply Chain\",\"/blog/topics/supply-chain-logistics\"],[\"Telecommunications\",\"/blog/topics/telecommunications\"]]]],[\"Partners\",\"/blog/topics/partners\"],[\"Startups \\u0026 SMB\",\"/blog/topics/startups\"],[\"Training \\u0026 Certifications\",\"/blog/topics/training-certifications\"],[\"Inside Google Cloud\",\"/blog/topics/inside-google-cloud\"],[\"Google Cloud Next \\u0026 Events\",\"/blog/topics/google-cloud-next\"],[\"Google Cloud Consulting\",\"/blog/topics/consulting\"],[\"Google Maps Platform\",\"https://mapsplatform.google.com/resources/blog/\"],[\"Google Workspace\",\"https://workspace.google.com/blog\"]]]],[\"Developers \\u0026 Practitioners\",\"/blog/topics/developers-practitioners\"],[\"Transform with Google Cloud\",\"/transform\"]]]],[\"fr\",[[[\"Les tendances\",\"/blog/fr/topics/les-tendances/quelles-sont-les-nouveautes-de-google-cloud\"],[\"Solutions et Technologie\",null,[[[\"Analyse de données\",\"/blog/fr/products/analyse-de-donnees/\"],[\"Bases de données\",\"/blog/fr/products/databases\"],[\"Calcul\",\"/blog/fr/products/calcul/\"],[\"Chrome Entreprise\",\"/blog/fr/products/chrome-enterprise/\"],[\"Conteneurs et Kubernetes\",\"/blog/fr/products/conteneurs-et-kubernetes/\"],[\"Développement d\u0027Applications\",\"/blog/fr/products/application-development\"],[\"Développement durable\",\"/blog/fr/topics/developpement-durable\"],[\"DevOps et ingénierie SRE\",\"/blog/fr/products/devops-sre\"],[\"Gestion des API\",\"/blog/fr/products/api-management\"],[\"IA et Machine Learning\",\"/blog/fr/products/ai-machine-learning\"],[\"Infrastructure\",\"/blog/fr/products/infrastructure\"],[\"Maps et Géospatial\",\"/blog/fr/topics/maps-geospatial\"],[\"Modernisation d\u0027Applications\",\"/blog/fr/products/modernisation-dapplications/\"],[\"Modernisation d\u0027Infrastructure\",\"/blog/fr/products/modernisation-dinfrastructure/\"],[\"Networking\",\"/blog/fr/products/networking\"],[\"Productivité et Collaboration\",\"/blog/fr/products/productivite-et-collaboration\"],[\"SAP sur Google Cloud\",\"/blog/fr/products/sap-google-cloud\"],[\"Sécurité et Identité\",\"/blog/fr/products/identity-security\"],[\"Stockage et transfert de données\",\"/blog/fr/products/storage-data-transfer\"]]]],[\"Écosystème\",null,[[[\"Responsables IT\",\"/transform/fr\"],[\"Industries\",null,[[[\"Commerce\",\"/blog/fr/topics/retail\"],[\"Manufacturing\",\"/blog/fr/topics/manufacturing\"],[\"Médias et Divertissement\",\"/blog/fr/products/media-entertainment\"],[\"Santé\",\"/blog/fr/topics/healthcare-life-sciences\"],[\"Secteur Public\",\"/blog/fr/topics/public-sector\"],[\"Services Financiers\",\"/blog/fr/topics/financial-services\"],[\"Supply Chain\",\"/blog/fr/topics/supply-chain/\"],[\"Telecommunications\",\"/blog/fr/topics/telecommunications\"]]]],[\"Clients\",\"/blog/fr/topics/clients/\"],[\"Développeurs et professionnels\",\"/blog/fr/topics/developers-practitioners\"],[\"Formations et certifications\",\"/blog/fr/topics/training-certifications\"],[\"Google Cloud Next et Événements\",\"/blog/fr/topics/evenements\"],[\"Google Maps Platform\",\"/blog/fr/products/maps-platform\"],[\"Google Workspace\",\"https://workspace.google.com/blog/fr\"],[\"Inside Google Cloud\",\"/blog/fr/topics/inside-google-cloud\"],[\"Partenaires\",\"/blog/fr/topics/partners\"],[\"Start-ups et PME\",\"/blog/fr/topics/startups\"]]]],[\"Transformer avec Google Cloud\",\"/transform/fr\"]]]],[\"ja\",[[[\"ソリューションとテクノロジー\",null,[[[\"AI \\u0026 機械学習\",\"/blog/ja/products/ai-machine-learning\"],[\"API 管理\",\"/blog/ja/products/api-management\"],[\"アプリケーション開発\",\"/blog/ja/products/application-development\"],[\"アプリケーション モダナイゼーション\",\"/blog/ja/products/application-modernization\"],[\"Chrome Enterprise\",\"/blog/ja/products/chrome-enterprise\"],[\"コンピューティング\",\"/blog/ja/products/compute\"],[\"Containers \\u0026 Kubernetes\",\"/blog/ja/products/containers-kubernetes\"],[\"データ分析\",\"/blog/ja/products/data-analytics\"],[\"データベース\",\"/blog/ja/products/databases\"],[\"DevOps \\u0026 SRE\",\"/blog/ja/products/devops-sre\"],[\"Maps \\u0026 Geospatial\",\"/blog/ja/products/maps-platform\"],[\"セキュリティ\",null,[[[\"セキュリティ \\u0026 アイデンティティ\",\"/blog/ja/products/identity-security\"],[\"脅威インテリジェンス\",\"/blog/ja/topics/threat-intelligence\"]]]],[\"インフラストラクチャ\",\"/blog/ja/products/infrastructure\"],[\"インフラ モダナイゼーション\",\"/blog/ja/products/infrastructure-modernization\"],[\"ネットワーキング\",\"/blog/ja/products/networking\"],[\"生産性とコラボレーション\",\"/blog/ja/products/productivity-collaboration\"],[\"Google Cloud での SAP\",\"/blog/ja/products/sap-google-cloud\"],[\"ストレージとデータ転送\",\"/blog/ja/products/storage-data-transfer\"],[\"サステナビリティ\",\"/blog/ja/topics/sustainability\"]]]],[\"エコシステム\",null,[[[\"ITリーダー\",\"/transform/ja\"],[\"業種\",null,[[[\"金融サービス\",\"/blog/ja/topics/financial-services\"],[\"ヘルスケア、ライフ サイエンス\",\"/blog/ja/topics/healthcare-life-sciences\"],[\"製造\",\"/blog/ja/topics/manufacturing\"],[\"メディア、エンターテイメント\",\"/blog/ja/products/media-entertainment\"],[\"公共部門\",\"/blog/ja/topics/public-sector\"],[\"小売業\",\"/blog/ja/topics/retail\"],[\"サプライ チェーン\",\"/blog/ja/topics/supply-chain-logistics\"],[\"通信\",\"/blog/ja/topics/telecommunications\"]]]],[\"顧客事例\",\"/blog/ja/topics/customers\"],[\"パートナー\",\"/blog/ja/topics/partners\"],[\"スタートアップ \\u0026 SMB\",\"/blog/ja/topics/startups\"],[\"トレーニングと認定\",\"/blog/ja/topics/training-certifications\"],[\"Inside Google Cloud\",\"/blog/ja/topics/inside-google-cloud\"],[\"Google Cloud Next と イベント\",\"/blog/ja/topics/google-cloud-next\"],[\"Google Maps Platform\",\"/blog/ja/products/maps-platform\"],[\"Google Workspace\",\"https://workspace.google.com/blog/ja\"]]]],[\"デベロッパー\",\"/blog/ja/topics/developers-practitioners\"],[\"Transform with Google Cloud\",\"/transform/ja\"]]]],[\"ko\",[[[\"솔루션 및 기술\",null,[[[\"AI 및 머신러닝\",\"/blog/ko/products/ai-machine-learning\"],[\"API 관리\",\"/blog/ko/products/api-management\"],[\"애플리케이션 개발\",\"/blog/ko/products/application-development\"],[\"애플리케이션 현대화\",\"/blog/ko/products/application-modernization\"],[\"Chrome Enterprise\",\"/blog/products/chrome-enterprise\"],[\"컴퓨팅\",\"/blog/ko/products/compute\"],[\"컨테이너 \\u0026 Kubernetes\",\"/blog/ko/products/containers-kubernetes\"],[\"데이터 분석\",\"/blog/ko/products/data-analytics\"],[\"데이터베이스\",\"/blog/ko/products/databases\"],[\"DevOps 및 SRE\",\"/blog/ko/products/devops-sre\"],[\"Maps \\u0026 Geospatial\",\"/blog/ko/products/maps-platform\"],[\"보안\",null,[[[\"보안 \\u0026 아이덴티티\",\"/blog/ko/products/identity-security\"],[\"위협 인텔리전스\",\"/blog/ko/topics/threat-intelligence\"]]]],[\"인프라\",\"/blog/ko/products/infrastructure\"],[\"Infrastructure Modernization\",\"/blog/ko/products/infrastructure-modernization\"],[\"네트워킹\",\"/blog/ko/products/networking\"],[\"생산성 및 공동작업\",\"/blog/ko/products/productivity-collaboration\"],[\"SAP on Google Cloud\",\"/blog/ko/products/sap-google-cloud\"],[\"스토리지 및 데이터 전송\",\"/blog/ko/products/storage-data-transfer\"],[\"지속가능성\",\"/blog/ko/topics/sustainability\"]]]],[\"에코시스템\",null,[[[\"IT Leaders\",\"/transform/ko\"],[\"업종\",null,[[[\"금융 서비스\",\"/blog/ko/topics/financial-services\"],[\"의료 및 생명과학\",\"/blog/ko/topics/healthcare-life-sciences\"],[\"제조업\",\"/blog/ko/topics/manufacturing\"],[\"미디어 및 엔터테인먼트\",\"/blog/ko/products/media-entertainment\"],[\"공공부문\",\"/blog/ko/topics/public-sector\"],[\"소매업\",\"/blog/ko/topics/retail\"],[\"공급망\",\"/blog/topics/supply-chain-logistics\"],[\"통신\",\"/blog/ko/topics/telecommunications\"]]]],[\"고객 사례\",\"/blog/ko/topics/customers\"],[\"파트너\",\"/blog/ko/topics/partners\"],[\"스타트업 \\u0026 SMB\",\"/blog/ko/topics/startups\"],[\"교육 \\u0026 인증\",\"/blog/ko/topics/training-certifications\"],[\"Inside Google Cloud\",\"/blog/ko/topics/inside-google-cloud\"],[\"Google Cloud Next 및 이벤트\",\"/blog/ko/topics/google-cloud-next\"],[\"Google Maps Platform\",\"/blog/ko/products/maps-platform\"],[\"Google Workspace\",\"https://workspace.google.com/blog/ko\"]]]],[\"개발 및 IT운영\",\"/blog/ko/topics/developers-practitioners\"],[\"Google Cloud와 함께 하는 디지털 혁신\",\"/transform/ko\"]]]]],[[\"de\",[[[\"Products \\u0026 technology\",null,[[[\"AI \\u0026 Machine Learning\",\"/blog/p-t/ai-machine-learning\"],[\"API Management\",\"/blog/api-management\"],[\"Applied engineering\",\"/blog/products-technology/applied-engineering\"],[\"Developer tools\",\"/blog/developer-tools\"],[\"Business intelligence (BI)\",\"/blog/business-intelligence-bi\"],[\"Chrome Enterprise\",\"/blog/chrome-enterprise\"],[\"Compute\",\"/blog/compute\"],[\"Containers \\u0026 Kubernetes\",\"/blog/containers-kubernetes\"],[\"Data analytics\",\"/blog/data-analytics\"],[\"Databases\",\"/blog/databases\"],[\"DevOps\",\"/blog/devops\"],[\"Distributed cloud\",\"/blog/distributed-cloud\"],[\"Hybrid \\u0026 multicloud\",\"/blog/hybrid-multicloud/\"],[\"Management tools\",\"/blog/management-tools\"],[\"Maps \\u0026 geospatial\",\"/blog/maps-geospatial\"],[\"Migration\",\"/blog/migration\"],[\"Networking\",\"/blog/networking\"],[\"SAP on Google Cloud\",\"/blog/sap-google-cloud\"],[\"Security\",\"/blog/security\"],[\"Sovereignty \\u0026 compliance\",\"/blog/sovereignty-compliance\"],[\"SRE\",\"/blog/site-reliability-engineering-sre\"],[\"Storage\",\"/blog/storage\"],[\"Threat Intelligence\",\"/blog/threat-intelligence\"]]],[\"See all product news\",\"Stay informed on all Cloud product announcements\",\"/blog/products/\",\"linear-gradient(79.98deg, rgba(66, 133, 244, 0.2) 0%, rgba(62, 106, 240, 0.2) 53.91%, rgba(87, 159, 255, 0.2) 107.82%)\",\"linear-gradient(79.98deg, rgba(66, 133, 244, 0.3) 0%, rgba(62, 106, 240, 0.3) 53.91%, rgba(87, 159, 255, 0.3) 107.82%)\",\"#2F3793\"],7],[\"Learning\",null,[[[\"Cloud architecture\",\"/blog/cloud-architecture\"],[\"IT leaders\",\"/blog/it-leaders\"],[\"Training \\u0026 certifications\",\"/blog/training-certifications\"]]],[\"Explore learning\",\"Develop your cloud skills and enhance your expertise\",\"/blog/products/\",\"linear-gradient(79.98deg, rgba(52, 168, 83, 0.2) 0%, rgba(102, 214, 105, 0.2) 53.91%, rgba(52, 168, 83, 0.2) 107.82%)\",\"linear-gradient(79.98deg, rgba(52, 168, 83, 0.2) 0%, rgba(102, 214, 105, 0.2) 53.91%, rgba(52, 168, 83, 0.2) 107.82%)\",\"#004E41\"]],[\"Developers\",\"/blog/developers-practitioners\"],[\"Customers \\u0026 partners\",null,[[[\"Customer stories\",\"/blog/customer-stories\"],[\"Financial services\",\"/blog/financial-services\"],[\"Gaming\",\"/blog/gaming\"],[\"Healthcare \\u0026 life sciences\",\"/blog/healthcare-life-sciences\"],[\"Manufacturing\",\"/blog/manufacturing\"],[\"Media \\u0026 entertainment\",\"/blog/media-entertainment\"],[\"Partners\",\"/blog/partners\"],[\"Public sector\",\"/blog/public-sector\"],[\"Retail\",\"/blog/retail\"],[\"Startups\",\"/blog/startups\"],[\"Supply chain \\u0026 logistics\",\"/blog/supply-chain-logistics\"],[\"Telecommunications\",\"/blog/telecommunications\"]]],[\"Explore customers \\u0026 partners\",\"Learn how we work with organizations to transform industries\",\"/blog/products/\",\"linear-gradient(80.33deg, rgba(251, 188, 4, 0.2) 0%, rgba(242, 153, 0, 0.2) 50.64%, rgba(251, 188, 4, 0.2) 101.28%)\",\"linear-gradient(80.33deg, rgba(251, 188, 4, 0.3) 0%, rgba(242, 153, 0, 0.3) 50.64%, rgba(251, 188, 4, 0.3) 101.28%)\",\"#202124\"]],[\"Inside Google Cloud\",null,[[[\"Company news\",\"/blog/company-news\"],[\"Data centers \\u0026 regions\",\"/blog/data-centers-and-regions\"],[\"Events\",\"/blog/events\"],[\"Consulting\",\"/blog/google-cloud-consulting\"],[\"Google Cloud Next\",\"/blog/google-cloud-next\"],[\"Sustainability\",\"/blog/sustainability\"],[\"Systems\",\"/blog/systems\"]]],[\"Explore Inside Google Cloud\",\"Explore the latest Google Cloud news and events\",\"/blog/products/\",\"linear-gradient(80.33deg, rgba(254, 63, 60, 0.2) 0%, rgba(255, 110, 178, 0.2) 51.13%, rgba(254, 63, 60, 0.2) 101.28%)\",\"linear-gradient(80.33deg, rgba(254, 63, 60, 0.3) 0%, rgba(255, 110, 178, 0.3) 51.13%, rgba(254, 63, 60, 0.3) 101.28%)\",\"#7D0304\"]]]]],[\"en\",[[[\"Products \\u0026 technology\",null,[[[\"AI \\u0026 Machine Learning\",\"/blog/p-t/ai-machine-learning\"],[\"API Management\",\"/blog/api-management\"],[\"Applied engineering\",\"/blog/products-technology/applied-engineering\"],[\"Developer tools\",\"/blog/developer-tools\"],[\"Business intelligence (BI)\",\"/blog/business-intelligence-bi\"],[\"Chrome Enterprise\",\"/blog/chrome-enterprise\"],[\"Compute\",\"/blog/compute\"],[\"Containers \\u0026 Kubernetes\",\"/blog/containers-kubernetes\"],[\"Data analytics\",\"/blog/data-analytics\"],[\"Databases\",\"/blog/databases\"],[\"DevOps\",\"/blog/devops\"],[\"Distributed cloud\",\"/blog/distributed-cloud\"],[\"Hybrid \\u0026 multicloud\",\"/blog/hybrid-multicloud/\"],[\"Management tools\",\"/blog/management-tools\"],[\"Maps \\u0026 geospatial\",\"/blog/maps-geospatial\"],[\"Migration\",\"/blog/migration\"],[\"Networking\",\"/blog/networking\"],[\"SAP on Google Cloud\",\"/blog/sap-google-cloud\"],[\"Security\",\"/blog/security\"],[\"Sovereignty \\u0026 compliance\",\"/blog/sovereignty-compliance\"],[\"SRE\",\"/blog/site-reliability-engineering-sre\"],[\"Storage\",\"/blog/storage\"],[\"Threat Intelligence\",\"/blog/threat-intelligence\"]]],[\"See all product news\",\"Stay informed on all Cloud product announcements\",\"/blog/products/\",\"linear-gradient(79.98deg, rgba(66, 133, 244, 0.2) 0%, rgba(62, 106, 240, 0.2) 53.91%, rgba(87, 159, 255, 0.2) 107.82%)\",\"linear-gradient(79.98deg, rgba(66, 133, 244, 0.3) 0%, rgba(62, 106, 240, 0.3) 53.91%, rgba(87, 159, 255, 0.3) 107.82%)\",\"#2F3793\"],7],[\"Learning\",null,[[[\"Cloud architecture\",\"/blog/cloud-architecture\"],[\"IT leaders\",\"/blog/it-leaders\"],[\"Training \\u0026 certifications\",\"/blog/training-certifications\"]]],[\"Explore learning\",\"Develop your cloud skills and enhance your expertise\",\"/blog/products/\",\"linear-gradient(79.98deg, rgba(52, 168, 83, 0.2) 0%, rgba(102, 214, 105, 0.2) 53.91%, rgba(52, 168, 83, 0.2) 107.82%)\",\"linear-gradient(79.98deg, rgba(52, 168, 83, 0.2) 0%, rgba(102, 214, 105, 0.2) 53.91%, rgba(52, 168, 83, 0.2) 107.82%)\",\"#004E41\"]],[\"Developers\",\"/blog/developers-practitioners\"],[\"Customers \\u0026 partners\",null,[[[\"Customer stories\",\"/blog/customer-stories\"],[\"Financial services\",\"/blog/financial-services\"],[\"Gaming\",\"/blog/gaming\"],[\"Healthcare \\u0026 life sciences\",\"/blog/healthcare-life-sciences\"],[\"Manufacturing\",\"/blog/manufacturing\"],[\"Media \\u0026 entertainment\",\"/blog/media-entertainment\"],[\"Partners\",\"/blog/partners\"],[\"Public sector\",\"/blog/public-sector\"],[\"Retail\",\"/blog/retail\"],[\"Startups\",\"/blog/startups\"],[\"Supply chain \\u0026 logistics\",\"/blog/supply-chain-logistics\"],[\"Telecommunications\",\"/blog/telecommunications\"]]],[\"Explore customers \\u0026 partners\",\"Learn how we work with organizations to transform industries\",\"/blog/products/\",\"linear-gradient(80.33deg, rgba(251, 188, 4, 0.2) 0%, rgba(242, 153, 0, 0.2) 50.64%, rgba(251, 188, 4, 0.2) 101.28%)\",\"linear-gradient(80.33deg, rgba(251, 188, 4, 0.3) 0%, rgba(242, 153, 0, 0.3) 50.64%, rgba(251, 188, 4, 0.3) 101.28%)\",\"#202124\"]],[\"Inside Google Cloud\",null,[[[\"Company news\",\"/blog/company-news\"],[\"Data centers \\u0026 regions\",\"/blog/data-centers-and-regions\"],[\"Events\",\"/blog/events\"],[\"Consulting\",\"/blog/google-cloud-consulting\"],[\"Google Cloud Next\",\"/blog/google-cloud-next\"],[\"Sustainability\",\"/blog/sustainability\"],[\"Systems\",\"/blog/systems\"]]],[\"Explore Inside Google Cloud\",\"Explore the latest Google Cloud news and events\",\"/blog/products/\",\"linear-gradient(80.33deg, rgba(254, 63, 60, 0.2) 0%, rgba(255, 110, 178, 0.2) 51.13%, rgba(254, 63, 60, 0.2) 101.28%)\",\"linear-gradient(80.33deg, rgba(254, 63, 60, 0.3) 0%, rgba(255, 110, 178, 0.3) 51.13%, rgba(254, 63, 60, 0.3) 101.28%)\",\"#7D0304\"]]]]],[\"fr\",[[[\"Products \\u0026 technology\",null,[[[\"AI \\u0026 Machine Learning\",\"/blog/p-t/ai-machine-learning\"],[\"API Management\",\"/blog/api-management\"],[\"Applied engineering\",\"/blog/products-technology/applied-engineering\"],[\"Developer tools\",\"/blog/developer-tools\"],[\"Business intelligence (BI)\",\"/blog/business-intelligence-bi\"],[\"Chrome Enterprise\",\"/blog/chrome-enterprise\"],[\"Compute\",\"/blog/compute\"],[\"Containers \\u0026 Kubernetes\",\"/blog/containers-kubernetes\"],[\"Data analytics\",\"/blog/data-analytics\"],[\"Databases\",\"/blog/databases\"],[\"DevOps\",\"/blog/devops\"],[\"Distributed cloud\",\"/blog/distributed-cloud\"],[\"Hybrid \\u0026 multicloud\",\"/blog/hybrid-multicloud/\"],[\"Management tools\",\"/blog/management-tools\"],[\"Maps \\u0026 geospatial\",\"/blog/maps-geospatial\"],[\"Migration\",\"/blog/migration\"],[\"Networking\",\"/blog/networking\"],[\"SAP on Google Cloud\",\"/blog/sap-google-cloud\"],[\"Security\",\"/blog/security\"],[\"Sovereignty \\u0026 compliance\",\"/blog/sovereignty-compliance\"],[\"SRE\",\"/blog/site-reliability-engineering-sre\"],[\"Storage\",\"/blog/storage\"],[\"Threat Intelligence\",\"/blog/threat-intelligence\"]]],[\"See all product news\",\"Stay informed on all Cloud product announcements\",\"/blog/products/\",\"linear-gradient(79.98deg, rgba(66, 133, 244, 0.2) 0%, rgba(62, 106, 240, 0.2) 53.91%, rgba(87, 159, 255, 0.2) 107.82%)\",\"linear-gradient(79.98deg, rgba(66, 133, 244, 0.3) 0%, rgba(62, 106, 240, 0.3) 53.91%, rgba(87, 159, 255, 0.3) 107.82%)\",\"#2F3793\"],7],[\"Learning\",null,[[[\"Cloud architecture\",\"/blog/cloud-architecture\"],[\"IT leaders\",\"/blog/it-leaders\"],[\"Training \\u0026 certifications\",\"/blog/training-certifications\"]]],[\"Explore learning\",\"Develop your cloud skills and enhance your expertise\",\"/blog/products/\",\"linear-gradient(79.98deg, rgba(52, 168, 83, 0.2) 0%, rgba(102, 214, 105, 0.2) 53.91%, rgba(52, 168, 83, 0.2) 107.82%)\",\"linear-gradient(79.98deg, rgba(52, 168, 83, 0.2) 0%, rgba(102, 214, 105, 0.2) 53.91%, rgba(52, 168, 83, 0.2) 107.82%)\",\"#004E41\"]],[\"Developers\",\"/blog/developers-practitioners\"],[\"Customers \\u0026 partners\",null,[[[\"Customer stories\",\"/blog/customer-stories\"],[\"Financial services\",\"/blog/financial-services\"],[\"Gaming\",\"/blog/gaming\"],[\"Healthcare \\u0026 life sciences\",\"/blog/healthcare-life-sciences\"],[\"Manufacturing\",\"/blog/manufacturing\"],[\"Media \\u0026 entertainment\",\"/blog/media-entertainment\"],[\"Partners\",\"/blog/partners\"],[\"Public sector\",\"/blog/public-sector\"],[\"Retail\",\"/blog/retail\"],[\"Startups\",\"/blog/startups\"],[\"Supply chain \\u0026 logistics\",\"/blog/supply-chain-logistics\"],[\"Telecommunications\",\"/blog/telecommunications\"]]],[\"Explore customers \\u0026 partners\",\"Learn how we work with organizations to transform industries\",\"/blog/products/\",\"linear-gradient(80.33deg, rgba(251, 188, 4, 0.2) 0%, rgba(242, 153, 0, 0.2) 50.64%, rgba(251, 188, 4, 0.2) 101.28%)\",\"linear-gradient(80.33deg, rgba(251, 188, 4, 0.3) 0%, rgba(242, 153, 0, 0.3) 50.64%, rgba(251, 188, 4, 0.3) 101.28%)\",\"#202124\"]],[\"Inside Google Cloud\",null,[[[\"Company news\",\"/blog/company-news\"],[\"Data centers \\u0026 regions\",\"/blog/data-centers-and-regions\"],[\"Events\",\"/blog/events\"],[\"Consulting\",\"/blog/google-cloud-consulting\"],[\"Google Cloud Next\",\"/blog/google-cloud-next\"],[\"Sustainability\",\"/blog/sustainability\"],[\"Systems\",\"/blog/systems\"]]],[\"Explore Inside Google Cloud\",\"Explore the latest Google Cloud news and events\",\"/blog/products/\",\"linear-gradient(80.33deg, rgba(254, 63, 60, 0.2) 0%, rgba(255, 110, 178, 0.2) 51.13%, rgba(254, 63, 60, 0.2) 101.28%)\",\"linear-gradient(80.33deg, rgba(254, 63, 60, 0.3) 0%, rgba(255, 110, 178, 0.3) 51.13%, rgba(254, 63, 60, 0.3) 101.28%)\",\"#7D0304\"]]]]],[\"ja\",[[[\"Products \\u0026 technology\",null,[[[\"AI \\u0026 Machine Learning\",\"/blog/p-t/ai-machine-learning\"],[\"API Management\",\"/blog/api-management\"],[\"Applied engineering\",\"/blog/products-technology/applied-engineering\"],[\"Developer tools\",\"/blog/developer-tools\"],[\"Business intelligence (BI)\",\"/blog/business-intelligence-bi\"],[\"Chrome Enterprise\",\"/blog/chrome-enterprise\"],[\"Compute\",\"/blog/compute\"],[\"Containers \\u0026 Kubernetes\",\"/blog/containers-kubernetes\"],[\"Data analytics\",\"/blog/data-analytics\"],[\"Databases\",\"/blog/databases\"],[\"DevOps\",\"/blog/devops\"],[\"Distributed cloud\",\"/blog/distributed-cloud\"],[\"Hybrid \\u0026 multicloud\",\"/blog/hybrid-multicloud/\"],[\"Management tools\",\"/blog/management-tools\"],[\"Maps \\u0026 geospatial\",\"/blog/maps-geospatial\"],[\"Migration\",\"/blog/migration\"],[\"Networking\",\"/blog/networking\"],[\"SAP on Google Cloud\",\"/blog/sap-google-cloud\"],[\"Security\",\"/blog/security\"],[\"Sovereignty \\u0026 compliance\",\"/blog/sovereignty-compliance\"],[\"SRE\",\"/blog/site-reliability-engineering-sre\"],[\"Storage\",\"/blog/storage\"],[\"Threat Intelligence\",\"/blog/threat-intelligence\"]]],[\"See all product news\",\"Stay informed on all Cloud product announcements\",\"/blog/products/\",\"linear-gradient(79.98deg, rgba(66, 133, 244, 0.2) 0%, rgba(62, 106, 240, 0.2) 53.91%, rgba(87, 159, 255, 0.2) 107.82%)\",\"linear-gradient(79.98deg, rgba(66, 133, 244, 0.3) 0%, rgba(62, 106, 240, 0.3) 53.91%, rgba(87, 159, 255, 0.3) 107.82%)\",\"#2F3793\"],7],[\"Learning\",null,[[[\"Cloud architecture\",\"/blog/cloud-architecture\"],[\"IT leaders\",\"/blog/it-leaders\"],[\"Training \\u0026 certifications\",\"/blog/training-certifications\"]]],[\"Explore learning\",\"Develop your cloud skills and enhance your expertise\",\"/blog/products/\",\"linear-gradient(79.98deg, rgba(52, 168, 83, 0.2) 0%, rgba(102, 214, 105, 0.2) 53.91%, rgba(52, 168, 83, 0.2) 107.82%)\",\"linear-gradient(79.98deg, rgba(52, 168, 83, 0.2) 0%, rgba(102, 214, 105, 0.2) 53.91%, rgba(52, 168, 83, 0.2) 107.82%)\",\"#004E41\"]],[\"Developers\",\"/blog/developers-practitioners\"],[\"Customers \\u0026 partners\",null,[[[\"Customer stories\",\"/blog/customer-stories\"],[\"Financial services\",\"/blog/financial-services\"],[\"Gaming\",\"/blog/gaming\"],[\"Healthcare \\u0026 life sciences\",\"/blog/healthcare-life-sciences\"],[\"Manufacturing\",\"/blog/manufacturing\"],[\"Media \\u0026 entertainment\",\"/blog/media-entertainment\"],[\"Partners\",\"/blog/partners\"],[\"Public sector\",\"/blog/public-sector\"],[\"Retail\",\"/blog/retail\"],[\"Startups\",\"/blog/startups\"],[\"Supply chain \\u0026 logistics\",\"/blog/supply-chain-logistics\"],[\"Telecommunications\",\"/blog/telecommunications\"]]],[\"Explore customers \\u0026 partners\",\"Learn how we work with organizations to transform industries\",\"/blog/products/\",\"linear-gradient(80.33deg, rgba(251, 188, 4, 0.2) 0%, rgba(242, 153, 0, 0.2) 50.64%, rgba(251, 188, 4, 0.2) 101.28%)\",\"linear-gradient(80.33deg, rgba(251, 188, 4, 0.3) 0%, rgba(242, 153, 0, 0.3) 50.64%, rgba(251, 188, 4, 0.3) 101.28%)\",\"#202124\"]],[\"Inside Google Cloud\",null,[[[\"Company news\",\"/blog/company-news\"],[\"Data centers \\u0026 regions\",\"/blog/data-centers-and-regions\"],[\"Events\",\"/blog/events\"],[\"Consulting\",\"/blog/google-cloud-consulting\"],[\"Google Cloud Next\",\"/blog/google-cloud-next\"],[\"Sustainability\",\"/blog/sustainability\"],[\"Systems\",\"/blog/systems\"]]],[\"Explore Inside Google Cloud\",\"Explore the latest Google Cloud news and events\",\"/blog/products/\",\"linear-gradient(80.33deg, rgba(254, 63, 60, 0.2) 0%, rgba(255, 110, 178, 0.2) 51.13%, rgba(254, 63, 60, 0.2) 101.28%)\",\"linear-gradient(80.33deg, rgba(254, 63, 60, 0.3) 0%, rgba(255, 110, 178, 0.3) 51.13%, rgba(254, 63, 60, 0.3) 101.28%)\",\"#7D0304\"]]]]],[\"ko\",[[[\"Products \\u0026 technology\",null,[[[\"AI \\u0026 Machine Learning\",\"/blog/p-t/ai-machine-learning\"],[\"API Management\",\"/blog/api-management\"],[\"Applied engineering\",\"/blog/products-technology/applied-engineering\"],[\"Developer tools\",\"/blog/developer-tools\"],[\"Business intelligence (BI)\",\"/blog/business-intelligence-bi\"],[\"Chrome Enterprise\",\"/blog/chrome-enterprise\"],[\"Compute\",\"/blog/compute\"],[\"Containers \\u0026 Kubernetes\",\"/blog/containers-kubernetes\"],[\"Data analytics\",\"/blog/data-analytics\"],[\"Databases\",\"/blog/databases\"],[\"DevOps\",\"/blog/devops\"],[\"Distributed cloud\",\"/blog/distributed-cloud\"],[\"Hybrid \\u0026 multicloud\",\"/blog/hybrid-multicloud/\"],[\"Management tools\",\"/blog/management-tools\"],[\"Maps \\u0026 geospatial\",\"/blog/maps-geospatial\"],[\"Migration\",\"/blog/migration\"],[\"Networking\",\"/blog/networking\"],[\"SAP on Google Cloud\",\"/blog/sap-google-cloud\"],[\"Security\",\"/blog/security\"],[\"Sovereignty \\u0026 compliance\",\"/blog/sovereignty-compliance\"],[\"SRE\",\"/blog/site-reliability-engineering-sre\"],[\"Storage\",\"/blog/storage\"],[\"Threat Intelligence\",\"/blog/threat-intelligence\"]]],[\"See all product news\",\"Stay informed on all Cloud product announcements\",\"/blog/products/\",\"linear-gradient(79.98deg, rgba(66, 133, 244, 0.2) 0%, rgba(62, 106, 240, 0.2) 53.91%, rgba(87, 159, 255, 0.2) 107.82%)\",\"linear-gradient(79.98deg, rgba(66, 133, 244, 0.3) 0%, rgba(62, 106, 240, 0.3) 53.91%, rgba(87, 159, 255, 0.3) 107.82%)\",\"#2F3793\"],7],[\"Learning\",null,[[[\"Cloud architecture\",\"/blog/cloud-architecture\"],[\"IT leaders\",\"/blog/it-leaders\"],[\"Training \\u0026 certifications\",\"/blog/training-certifications\"]]],[\"Explore learning\",\"Develop your cloud skills and enhance your expertise\",\"/blog/products/\",\"linear-gradient(79.98deg, rgba(52, 168, 83, 0.2) 0%, rgba(102, 214, 105, 0.2) 53.91%, rgba(52, 168, 83, 0.2) 107.82%)\",\"linear-gradient(79.98deg, rgba(52, 168, 83, 0.2) 0%, rgba(102, 214, 105, 0.2) 53.91%, rgba(52, 168, 83, 0.2) 107.82%)\",\"#004E41\"]],[\"Developers\",\"/blog/developers-practitioners\"],[\"Customers \\u0026 partners\",null,[[[\"Customer stories\",\"/blog/customer-stories\"],[\"Financial services\",\"/blog/financial-services\"],[\"Gaming\",\"/blog/gaming\"],[\"Healthcare \\u0026 life sciences\",\"/blog/healthcare-life-sciences\"],[\"Manufacturing\",\"/blog/manufacturing\"],[\"Media \\u0026 entertainment\",\"/blog/media-entertainment\"],[\"Partners\",\"/blog/partners\"],[\"Public sector\",\"/blog/public-sector\"],[\"Retail\",\"/blog/retail\"],[\"Startups\",\"/blog/startups\"],[\"Supply chain \\u0026 logistics\",\"/blog/supply-chain-logistics\"],[\"Telecommunications\",\"/blog/telecommunications\"]]],[\"Explore customers \\u0026 partners\",\"Learn how we work with organizations to transform industries\",\"/blog/products/\",\"linear-gradient(80.33deg, rgba(251, 188, 4, 0.2) 0%, rgba(242, 153, 0, 0.2) 50.64%, rgba(251, 188, 4, 0.2) 101.28%)\",\"linear-gradient(80.33deg, rgba(251, 188, 4, 0.3) 0%, rgba(242, 153, 0, 0.3) 50.64%, rgba(251, 188, 4, 0.3) 101.28%)\",\"#202124\"]],[\"Inside Google Cloud\",null,[[[\"Company news\",\"/blog/company-news\"],[\"Data centers \\u0026 regions\",\"/blog/data-centers-and-regions\"],[\"Events\",\"/blog/events\"],[\"Consulting\",\"/blog/google-cloud-consulting\"],[\"Google Cloud Next\",\"/blog/google-cloud-next\"],[\"Sustainability\",\"/blog/sustainability\"],[\"Systems\",\"/blog/systems\"]]],[\"Explore Inside Google Cloud\",\"Explore the latest Google Cloud news and events\",\"/blog/products/\",\"linear-gradient(80.33deg, rgba(254, 63, 60, 0.2) 0%, rgba(255, 110, 178, 0.2) 51.13%, rgba(254, 63, 60, 0.2) 101.28%)\",\"linear-gradient(80.33deg, rgba(254, 63, 60, 0.3) 0%, rgba(255, 110, 178, 0.3) 51.13%, rgba(254, 63, 60, 0.3) 101.28%)\",\"#7D0304\"]]]]]]]","b5W2zf":"default_TransformBlogUi","cfb2h":"boq_cloudx-web-blog-uiserver_20260909.00_p0","eptZe":"/blog/_/TransformBlogUi/","f8POw":"%.@.[106242883,1714253,97656895,98225186,106088277,105763536,105993283,1706538,48554500,106551328,97493656,106565539,105901316,106058902,105739268,97493634,106032101,105823623,97535270,98073360,97442195,97785984,48489833,97656881,105993269,97493642,105739254,97493620,98073330,97442181,97785970],null,null,null,null,true]","gGcLoe":false,"hsFLT":"%.@.null,10,3]","iCzhFc":false,"nQyAE":{"PTNaKe":"false","RU5eB":"true","MHNqU":"false","ktxJzc":"true","BUEcUe":"variant2","aY24Yb":"false","y6g6ie":"false","kG32O":"false","oSympb":"false","IKu6Ue":"false","BJOcCd":"false","bdhplb":"true","Jpadob":"true","gu5ZGb":"false","EB3TEf":"false","h5BYjc":"true","j9nUqf":"false","pcLlld":"true","wvKxS":"false","EMC88b":"false","srequb":"false","PvHIUc":"true","JxMqJf":"false","V8lsGf":"projects/gweb-cloud-chat-prod/locations/us/apps/45c2d323-204d-48d3-92fc-2687b7b83fc2/deployments/067abe51-ab2d-4b92-9bd7-da8449eb9242","KrIGrd":"true","tfPPe":"true","Ekaiab":"false","m0uJSe":"false","PvZHQ":"true","s7Z7Ld":"false","RIvlU":"true","lsuui":"true","HGJqie":"true","u4N7kf":"false","NCoWOd":"false","jzW39e":"true","dsKk4d":"true","l9Tv3e":"true","uafElc":"true","VaCY3d":"false","fdXYmb":"false","TQUxrf":"false","Uwy9Df":"true","K6BlHd":"3000","vCPH2e":"false","epuB3d":"true","BotAtd":"true"},"p9hQne":"https://www.gstatic.com/_/boq-cloudx-web-blog/_/r/","qwAQke":"TransformBlogUi","rtQCxc":420,"u4g7r":"%.@.null,1,3]","vJ2GOe":"%.@.null,[[\"de\",[[[\"Themen\",null,[[[\"Product Announcements\",\"/blog/de/product-announcements\"],[\"KI \\u0026 Machine Learning\",\"/blog/de/ai-machine-learning\"],[\"Produktivität und Kollaboration\",\"/blog/de/productivity-collaboration\"],[\"Identität und Sicherheit\",\"/blog/de/identity-and-security\"],[\"Future of Work\",\"/blog/de/future-of-work\"],[\"Hybrides Arbeiten\",\"/blog/de/hybrid-work\"],[\"Kundenreferenzen\",\"/blog/de/customer-stories\"],[\"Entwickler*innen und Fachkräfte\",\"/blog/de/developers-practitioners\"],[\"Partner\",\"/blog/de/partners\"],[\"Events\",\"/blog/de/events\"],[\"Öffentlicher Sektor\",\"/blog/de/public-sector\"]]]],[\"Produktneuigkeiten\",null,[[[\"Gmail\",\"/blog/de/gmail\"],[\"Meet\",\"/blog/de/meet\"],[\"Chat\",\"/blog/de/chat-spaces\"],[\"Drive\",\"/blog/de/drive\"],[\"Docs\",\"/blog/de/docs\"],[\"Sheets\",\"/blog/de/sheets\"]]]]]]],[\"en\",[[[\"Topics\",null,[[[\"Product Announcements\",\"/blog/product-announcements\"],[\"AI and Machine Learning\",\"/blog/ai-machine-learning\"],[\"Productivity and Collaboration\",\"/blog/productivity-collaboration\"],[\"Identity and Security\",\"/blog/identity-and-security\"],[\"Future of Work\",\"/blog/future-of-work\"],[\"Hybrid Work\",\"/blog/hybrid-work\"],[\"Customer Stories\",\"/blog/customer-stories\"],[\"Developers and Practitioners\",\"/blog/developers-practitioners\"],[\"Partners\",\"/blog/partners\"],[\"Events\",\"/blog/events\"],[\"Public Sector\",\"/blog/public-sector\"]]]],[\"Product News\",null,[[[\"Gmail\",\"/blog/gmail\"],[\"Meet\",\"/blog/meet\"],[\"Chat\",\"/blog/chat-spaces\"],[\"Drive\",\"/blog/drive\"],[\"Docs\",\"/blog/docs\"],[\"Sheets\",\"/blog/sheets\"],[\"Vids\",\"/blog/google-vids\"]]]]]]],[\"fr\",[[[\"Thèmes\",null,[[[\"Product Announcements\",\"/blog/fr/product-announcements\"],[\"IA et Machine Learning\",\"/blog/fr/ai-machine-learning\"],[\"Productivité et Collaboration\",\"/blog/fr/productivity-collaboration\"],[\"Identité et Sécurité\",\"/blog/fr/identity-and-security\"],[\"L\u0027avenir du travail\",\"/blog/fr/future-of-work\"],[\"Travail hybride\",\"/blog/fr/hybrid-work\"],[\"Témoignages Clients\",\"/blog/fr/customer-stories\"],[\"Développeurs et professionnels\",\"/blog/fr/developers-practitioners\"],[\"Partenaires\",\"/blog/fr/partners\"],[\"Événements\",\"/blog/fr/events\"],[\"Secteur Public\",\"/blog/fr/public-sector\"]]]],[\"Annonces sur les produits\",null,[[[\"Gmail\",\"/blog/fr/gmail\"],[\"Meet\",\"/blog/fr/meet\"],[\"Chat\",\"/blog/fr/chat-spaces\"],[\"Drive\",\"/blog/fr/drive\"],[\"Docs\",\"/blog/fr/docs\"],[\"Sheets\",\"/blog/fr/sheets\"]]]]]]],[\"ja\",[[[\"トピック\",null,[[[\"プロダクトの発表\",\"/blog/ja/product-announcements\"],[\"AI \\u0026 機械学習\",\"/blog/ja/ai-machine-learning\"],[\"生産性とコラボレーション\",\"/blog/ja/productivity-collaboration\"],[\"アイデンティティとセキュリティ\",\"/blog/ja/identity-and-security\"],[\"未来の働き方\",\"/blog/ja/future-of-work\"],[\"ハイブリッドな働き方\",\"/blog/ja/hybrid-work\"],[\"顧客事例\",\"/blog/ja/customer-stories\"],[\"デベロッパー\",\"/blog/ja/developers-practitioners\"],[\"パートナー\",\"/blog/ja/partners\"],[\"イベント\",\"/blog/ja/events\"],[\"公共部門\",\"/blog/ja/public-sector\"]]]],[\"製品ニュース\",null,[[[\"Gmail\",\"/blog/ja/gmail\"],[\"Meet\",\"/blog/ja/meet\"],[\"Chat\",\"/blog/ja/chat-spaces\"],[\"ドライブ\",\"/blog/ja/drive\"],[\"ドキュメント\",\"/blog/ja/docs\"],[\"スプレッドシート\",\"/blog/ja/sheets\"]]]]]]],[\"ko\",[[[\"주제\",null,[[[\"제품 업데이트\",\"/blog/ko/product-announcements\"],[\"AI 및 머신러닝\",\"/blog/ko/ai-machine-learning\"],[\"생산성 및 공동작업\",\"/blog/ko/productivity-collaboration\"],[\"인증 및 보안 \",\"/blog/ko/identity-and-security\"],[\"Future of Work\",\"/blog/ko/future-of-work\"],[\"하이브리드 업무\",\"/blog/ko/hybrid-work\"],[\"고객 사례\",\"/blog/ko/customer-stories\"],[\"개발자\",\"/blog/ko/developers-practitioners\"],[\"파트너\",\"/blog/ko/partners\"],[\"이벤트\",\"/blog/ko/events\"],[\"공공부문\",\"/blog/ko/public-sector\"]]]],[\"제품 소식\",null,[[[\"Gmail\",\"/blog/ko/gmail\"],[\"Meet\",\"/blog/ko/meet\"],[\"Chat\",\"/blog/ko/chat-spaces\"],[\"Drive\",\"/blog/ko/drive\"],[\"Docs\",\"/blog/ko/docs\"],[\"Sheets\",\"/blog/ko/sheets\"]]]]]]]],null,[[\"de\",[[[[[\"Enthaltene Anwendungen\",\"https://workspace.google.com/intl/de/features/\",[[[\"Gmail\",\"https://workspace.google.com/intl/de/products/gmail/\"],[\"Meet\",\"https://workspace.google.com/intl/de/products/meet/\"],[\"Chat\",\"https://workspace.google.com/intl/de/products/chat/\"],[\"Kalender\",\"https://workspace.google.com/intl/de/products/calendar/\"],[\"Drive\",\"https://workspace.google.com/intl/de/products/drive/\"],[\"Docs\",\"https://workspace.google.com/intl/de/products/docs/\"],[\"Tabellen\",\"https://workspace.google.com/intl/de/products/sheets/\"],[\"Präsentationen\",\"https://workspace.google.com/intl/de/products/slides/\"],[\"Formulare\",\"https://workspace.google.com/intl/de/products/forms/\"],[\"Sites\",\"https://workspace.google.com/intl/de/products/sites/\"],[\"Notizen\",\"https://workspace.google.com/intl/de/products/keep/\"],[\"Apps Script\",\"https://workspace.google.com/intl/de/products/apps-script/\"]]]]]],[[[\"Sicherheit und Verwaltung\",\"https://workspace.google.com/intl/de/security/\",[[[\"Admin\",\"https://workspace.google.com/intl/de/products/admin/\"],[\"Endpunkt\",\"https://workspace.google.com/intl/de/products/admin/endpoint/\"],[\"Vault\",\"https://workspace.google.com/intl/de/products/vault/\"],[\"Work Insights\",\"https://workspace.google.com/intl/de/products/workinsights/\"]]]],[\"Lösungen\",\"https://workspace.google.com/intl/de/solutions/\",[[[\"Neue Unternehmen\",\"https://workspace.google.com/intl/de/business/new-business/\"],[\"Kleine Unternehmen\",\"https://workspace.google.com/intl/de/business/small-business/\"],[\"Große Unternehmen\",\"https://workspace.google.com/intl/de/enterprise/\"],[\"Education\",\"https://edu.google.com/products/workspace-for-education/education-fundamentals/\"],[\"Nonprofit-Organisationen\",\"https://www.google.com/nonprofits/\"]]]]]],[[[\"Preise\",\"https://workspace.google.com/intl/de/pricing.html\",[[[\"Version auswählen\",\"https://workspace.google.com/intl/de/pricing.html\"]]]],[\"Add-ons\",null,[[[\"Gemini für Workspace\",\"https://workspace.google.com/solutions/ai/\"],[\"Google Voice\",\"https://workspace.google.com/intl/de/products/voice/\"],[\"AppSheet\",\"https://about.appsheet.com/home/\"]]]]]],[[[\"Ressourcen\",\"https://workspace.google.com/intl/de/faq/\",[[[\"Telearbeit\",\"https://workspace.google.com/intl/de/resources/working-remotely/\"],[\"Sicherheit\",\"https://workspace.google.com/intl/de/security/\"],[\"FAQ\",\"https://workspace.google.com/intl/de/faq/\"],[\"Partner\",\"https://cloud.withgoogle.com/partners/?products\\u003dGOOGLE_WORKSPACE_PRODUCT\"],[\"Google Workspace Marketplace\",\"https://workspace.google.com/marketplace/?hl\\u003dde\"],[\"Integrationen\",\"https://workspace.google.com/intl/de/integrations/\"],[\"Schulung \\u0026 Zertifizierung\",\"https://workspace.google.com/intl/de/training/\"]]]]]],[[[\"Schulung und Support\",\"https://workspace.google.com/intl/de/support/\",[[[\"Admin-Hilfe\",\"https://support.google.com/a/#topic\\u003d29157\"],[\"Einrichtungs- und Bereitstellungscenter\",\"https://support.google.com/a/answer/6365252?hl\\u003dde\"],[\"Schulungscenter für Nutzer\",\"https://support.google.com/a/users?hl\\u003dde#topic\\u003d11499463\"],[\"Foren für Administratoren\",\"https://productforums.google.com/forum/#!forum/apps\"],[\"Google Workspace-Dashboard\",\"https://www.google.com/appsstatus\"],[\"Presse\",\"https://cloud.google.com/press/\"]]]],[\"Mehr von Google\",null,[[[\"Google Cloud\",\"https://cloud.google.com/?hl\\u003dde\"],[\"Chrome Enterprise\",\"https://chromeenterprise.google/\"],[\"Google Lösungen für Unternehmen\",\"https://www.google.com/intl/de/services/\"],[\"Google Ads\",\"https://ads.google.com/home/?subid\\u003dde-de-xs-aw-z-a-dyn-accounts_wsft!o3\"],[\"Business Messages\",\"https://businessmessages.google/\"],[\"An Nutzerstudien teilnehmen\",\"https://userresearch.google.com/?reserved\\u003d0\\u0026utm_source\\u003dgsuite.google.com\\u0026Q_Language\\u003den\\u0026utm_medium\\u003down_srch\\u0026utm_campaign\\u003dGlobal-GSuite\\u0026utm_term\\u003d0\\u0026utm_content\\u003d0\\u0026productTag\\u003dgafw\\u0026campaignDate\\u003dnov18\\u0026pType\\u003dbprof\\u0026referral_code\\u003dug422768\"]]]]]]]]],[\"en\",[[[[[\"Included applications\",\"https://workspace.google.com/features/\",[[[\"Gmail\",\"https://workspace.google.com/products/gmail/\"],[\"Meet\",\"https://workspace.google.com/products/meet/\"],[\"Chat\",\"https://workspace.google.com/products/chat/\"],[\"Calendar\",\"https://workspace.google.com/products/calendar/\"],[\"Drive\",\"https://workspace.google.com/products/drive/\"],[\"Docs\",\"https://workspace.google.com/products/docs/\"],[\"Sheets\",\"https://workspace.google.com/products/sheets/\"],[\"Slides\",\"https://workspace.google.com/products/slides/\"],[\"Forms\",\"https://workspace.google.com/products/forms/\"],[\"Sites\",\"https://workspace.google.com/products/sites/\"],[\"Keep\",\"https://workspace.google.com/products/keep/\"],[\"Apps Script\",\"https://workspace.google.com/products/apps-script/\"]]]]]],[[[\"Security and management\",\"https://workspace.google.com/security/\",[[[\"Admin\",\"https://workspace.google.com/products/admin/\"],[\"Endpoint\",\"https://workspace.google.com/products/admin/endpoint/\"],[\"Vault\",\"https://workspace.google.com/products/vault/\"],[\"Work Insights\",\"https://workspace.google.com/products/workinsights/\"]]]],[\"Solutions\",\"https://workspace.google.com/solutions/\",[[[\"New Business\",\"https://workspace.google.com/business/new-business/\"],[\"Small Business\",\"https://workspace.google.com/business/small-business/\"],[\"Enterprise\",\"https://workspace.google.com/enterprise/\"],[\"Retail\",\"https://workspace.google.com/industries/retail/\"],[\"Manufacturing\",\"https://workspace.google.com/industries/manufacturing/\"],[\"Professional Services\",\"https://workspace.google.com/industries/professional-services/\"],[\"Technology\",\"https://workspace.google.com/industries/technology/\"],[\"Healthcare\",\"https://workspace.google.com/industries/healthcare/\"],[\"Government\",\"https://workspace.google.com/industries/government/\"],[\"Education\",\"https://edu.google.com/products/workspace-for-education/education-fundamentals/\"],[\"Nonprofits\",\"https://www.google.com/nonprofits/\"],[\"Artificial Intelligence\",\"https://workspace.google.com/solutions/ai/\"]]]]]],[[[\"Pricing\",\"https://workspace.google.com/pricing.html\",[[[\"Compare pricing plans\",\"https://workspace.google.com/pricing.html\"]]]],[\"Add-ons\",null,[[[\"Gemini for Workspace\",\"https://workspace.google.com/solutions/ai/\"],[\"Meet hardware\",\"https://workspace.google.com/products/meet-hardware/\"],[\"Google Voice\",\"https://workspace.google.com/products/voice/\"],[\"AppSheet\",\"https://about.appsheet.com/home/\"]]]]]],[[[\"Resources\",\"https://workspace.google.com/faq/\",[[[\"Working remotely\",\"https://workspace.google.com/resources/working-remotely/\"],[\"Security\",\"https://workspace.google.com/security/\"],[\"Customer Stories\",\"https://workspace.google.com/customers/\"],[\"FAQs\",\"https://workspace.google.com/faq/\"],[\"Partners\",\"https://cloud.withgoogle.com/partners/?products\\u003dGOOGLE_WORKSPACE_PRODUCT\"],[\"Marketplace\",\"https://workspace.google.com/marketplace/\"],[\"Integrations\",\"https://workspace.google.com/integrations/\"],[\"Training \\u0026 Certification\",\"https://workspace.google.com/training/\"],[\"Refer Google Workspace\",\"https://workspace.google.com/landing/partners/referral/\"]]]]]],[[[\"Learning and support\",\"https://workspace.google.com/support/\",[[[\"Admin Help\",\"https://support.google.com/a/#topic\\u003d29157\"],[\"Setup and Deployment Center\",\"https://support.google.com/a/answer/6365252\"],[\"Learning Center for Users\",\"https://support.google.com/a/users#topic\\u003d11499463\"],[\"Forums for Admins\",\"https://productforums.google.com/forum/#!forum/apps\"],[\"Google Workspace Dashboard\",\"https://www.google.com/appsstatus\"],[\"What\u0027s New in Google Workspace\",\"https://workspace.google.com/whatsnew/\"],[\"Find a Google Workspace Partner\",\"https://www.google.com/a/partnersearch/\"],[\"Join the community of IT Admins\",\"https://www.googlecloudcommunity.com/gc/Google-Workspace/ct-p/google-workspace\"],[\"Press\",\"https://cloud.google.com/press/\"]]]],[\"More from Google\",null,[[[\"Google Cloud\",\"https://cloud.google.com/\"],[\"Google Domains\",\"https://domains.google.com/about/?utm_source\\u003dgoogleappsforwork\\u0026utm_medium\\u003dreferral\\u0026utm_campaign\\u003dgooglepromos\"],[\"Chrome Enterprise\",\"https://chromeenterprise.google/\"],[\"Google Business Solutions\",\"https://www.google.com/services/\"],[\"Google Ads\",\"https://ads.google.com/home/?subid\\u003dus-en-xs-aw-z-a-dyn-accounts_wsft!o3\"],[\"Business Messages\",\"https://businessmessages.google/\"],[\"Join User Studies\",\"https://userresearch.google.com/?reserved\\u003d0\\u0026utm_source\\u003dgsuite.google.com\\u0026Q_Language\\u003den\\u0026utm_medium\\u003down_srch\\u0026utm_campaign\\u003dGlobal-GSuite\\u0026utm_term\\u003d0\\u0026utm_content\\u003d0\\u0026productTag\\u003dgafw\\u0026campaignDate\\u003dnov18\\u0026pType\\u003dbprof\\u0026referral_code\\u003dug422768\"]]]]]]]]],[\"fr\",[[[[[\"Enthaltene Anwendungen\",\"https://workspace.google.com/intl/fr/features/\",[[[\"Gmail\",\"https://workspace.google.com/intl/fr/products/gmail/\"],[\"Meet\",\"https://workspace.google.com/intl/fr/products/meet/\"],[\"Chat\",\"https://workspace.google.com/intl/fr/products/chat/\"],[\"Google Agenda\",\"https://workspace.google.com/intl/fr/products/calendar/\"],[\"Drive\",\"https://workspace.google.com/intl/fr/products/drive/\"],[\"Docs\",\"https://workspace.google.com/intl/fr/products/docs/\"],[\"Sheets\",\"https://workspace.google.com/intl/fr/products/sheets/\"],[\"Slides\",\"https://workspace.google.com/intl/fr/products/slides/\"],[\"Forms\",\"https://workspace.google.com/intl/fr/products/forms/\"],[\"Google Sites\",\"https://workspace.google.com/intl/fr/products/sites/\"],[\"Keep\",\"https://workspace.google.com/intl/fr/products/keep/\"],[\"Apps Script\",\"https://workspace.google.com/intl/fr/products/apps-script/\"]]]]]],[[[\"Sécurité et gestion\",\"https://workspace.google.com/intl/fr/security/\",[[[\"Console d\u0027administration\",\"https://workspace.google.com/intl/fr/products/admin/\"],[\"Point de terminaison\",\"https://workspace.google.com/intl/fr/products/admin/endpoint/\"],[\"Vault\",\"https://workspace.google.com/intl/fr/products/vault/\"],[\"Work Insights\",\"https://workspace.google.com/intl/fr/products/workinsights/\"]]]],[\"Solutions\",\"https://workspace.google.com/intl/fr/solutions/\",[[[\"Nouvelle entreprise\",\"https://workspace.google.com/intl/fr/business/new-business/\"],[\"PME\",\"https://workspace.google.com/intl/fr/business/small-business/\"],[\"Grande entreprise\",\"https://workspace.google.com/intl/fr/enterprise/\"],[\"Education\",\"https://edu.google.com/products/workspace-for-education/education-fundamentals/\"],[\"Associations\",\"https://www.google.com/nonprofits/\"]]]]]],[[[\"Tarifs\",\"https://workspace.google.com/intl/fr/pricing.html\",[[[\"Choisissez une édition\",\"https://workspace.google.com/intl/fr/pricing.html\"]]]],[\"Add-ons\",null,[[[\"Gemini pour Workspace\",\"https://workspace.google.com/solutions/ai/\"],[\"Matériel Meet\",\"https://workspace.google.com/intl/fr/products/meet-hardware/\"],[\"Google Voice\",\"https://workspace.google.com/intl/fr/products/voice/\"],[\"AppSheet\",\"https://about.appsheet.com/home/\"]]]]]],[[[\"Ressources\",\"https://workspace.google.com/intl/fr/faq/\",[[[\"Travail à distance\",\"https://workspace.google.com/intl/fr/resources/working-remotely/\"],[\"Sécurité\",\"https://workspace.google.com/intl/fr/security/\"],[\"Questions fréquentes\",\"https://workspace.google.com/intl/fr/faq/\"],[\"Partenaires\",\"https://cloud.withgoogle.com/partners/?products\\u003dGOOGLE_WORKSPACE_PRODUCT\"],[\"Marketplace\",\"https://workspace.google.com/marketplace/?hl\\u003dfr\"],[\"Intégrations\",\"https://workspace.google.com/intl/fr/integrations/\"],[\"Formation et certification\",\"https://workspace.google.com/intl/fr/training/\"]]]]]],[[[\"Formation et assistance\",\"https://workspace.google.com/intl/fr/support/\",[[[\"Aide pour les administrateurs\",\"https://support.google.com/a/#topic\\u003d29157\"],[\"Centre de configuration et de déploiement\",\"https://support.google.com/a/answer/6365252?hl\\u003dfr\"],[\"Centre de formation pour les utilisateurs\",\"https://support.google.com/a/users?hl\\u003dfr#topic\\u003d11499463\"],[\"Forums pour les administrateurs\",\"https://productforums.google.com/forum/#!forum/apps\"],[\"Tableau de bord Google Workspace\",\"https://www.google.com/appsstatus#hl\\u003dfr\"],[\"Rechercher un partenaire Google Workspace\",\"https://www.google.com/a/partnersearch/?hl\\u003dfr#home\"],[\"Presse\",\"https://cloud.google.com/press/\"]]]],[\"Autres ressources Google\",null,[[[\"Google Cloud\",\"https://cloud.google.com/?hl\\u003dfr\"],[\"Chrome Enterprise\",\"https://chromeenterprise.google/\"],[\"Solutions d\u0027entreprise Google\",\"https://www.google.com/intl/fr/services/\"],[\"Google pour les Pros\",\"https://pourlespros.withgoogle.com/?utm_source\\u003dEngagement\\u0026utm_medium\\u003dep\\u0026utm_term\\u003dSMB\\u0026utm_content\\u003dFR%20Apps%20for%20work%20footert\\u0026utm_campaign\\u003dQ4_2015%20FR%20Apps%20for%20work%20footer\"],[\"Google Ads\",\"https://ads.google.com/home/?subid\\u003dfr-fr-xs-aw-z-a-dyn-accounts_wsft!o3\"],[\"Business Messages\",\"https://businessmessages.google/\"],[\"Participer aux études sur l\u0027expérience utilisateur\",\"https://userresearch.google.com/?reserved\\u003d0\\u0026utm_source\\u003dgsuite.google.com\\u0026Q_Language\\u003den\\u0026utm_medium\\u003down_srch\\u0026utm_campaign\\u003dGlobal-GSuite\\u0026utm_term\\u003d0\\u0026utm_content\\u003d0\\u0026productTag\\u003dgafw\\u0026campaignDate\\u003dnov18\\u0026pType\\u003dbprof\\u0026referral_code\\u003dug422768\"]]]]]]]]],[\"ja\",[[[[[\"ご利用いただけるアプリケーション\",\"https://workspace.google.com/intl/ja/features/\",[[[\"Gmail\",\"https://workspace.google.com/intl/ja/products/gmail/\"],[\"Meet\",\"https://workspace.google.com/intl/ja/products/meet/\"],[\"Chat\",\"https://workspace.google.com/intl/ja/products/chat/\"],[\"カレンダー\",\"https://workspace.google.com/intl/ja/products/calendar/\"],[\"ドライブ\",\"https://workspace.google.com/intl/ja/products/drive/\"],[\"ドキュメント\",\"https://workspace.google.com/intl/ja/products/docs/\"],[\"スプレッドシート\",\"https://workspace.google.com/intl/ja/products/sheets/\"],[\"スライド\",\"https://workspace.google.com/intl/ja/products/slides/\"],[\"フォーム\",\"https://workspace.google.com/intl/ja/products/forms/\"],[\"サイト\",\"https://workspace.google.com/intl/ja/products/sites/\"],[\"Keep\",\"https://workspace.google.com/intl/ja/products/keep/\"],[\"Apps Script\",\"https://workspace.google.com/intl/ja/products/apps-script/\"]]]]]],[[[\"セキュリティと管理\",\"https://workspace.google.com/intl/ja/security/\",[[[\"管理コンソール\",\"https://workspace.google.com/intl/ja/products/admin/\"],[\"エンドポイント\",\"https://workspace.google.com/intl/ja/products/admin/endpoint/\"],[\"Vault\",\"https://workspace.google.com/intl/ja/products/vault/\"],[\"Work Insights\",\"https://workspace.google.com/intl/ja/products/workinsights/\"]]]],[\"ソリューション\",\"https://workspace.google.com/intl/ja/solutions/\",[[[\"新規ビジネス\",\"https://workspace.google.com/intl/ja/business/new-business/\"],[\"小規模ビジネス\",\"https://workspace.google.com/intl/ja/business/small-business/\"],[\"大規模ビジネス\",\"https://workspace.google.com/intl/ja/enterprise/\"],[\"Education\",\"https://edu.google.com/intl/ja/products/workspace-for-education/education-fundamentals/\"],[\"非営利団体\",\"https://www.google.com/intl/ja/nonprofits/\"]]]]]],[[[\"料金\",\"https://workspace.google.com/intl/ja/pricing.html\",[[[\"エディションを選ぶ\",\"https://workspace.google.com/intl/ja/pricing.html\"]]]],[\"Add-ons\",null,[[[\"Gemini for Workspace\",\"https://workspace.google.com/solutions/ai/\"],[\"Meet ハードウェア\",\"https://workspace.google.com/intl/ja/products/meet-hardware/\"],[\"AppSheet\",\"https://about.appsheet.com/home/\"]]]]]],[[[\"関連情報\",\"https://workspace.google.com/intl/ja/faq/\",[[[\"リモートワーク\",\"https://workspace.google.com/intl/ja/resources/working-remotely/\"],[\"セキュリティ\",\"https://workspace.google.com/intl/ja/security/\"],[\"事例紹介\",\"https://workspace.google.com/intl/ja/customers/\"],[\"よくある質問\",\"https://workspace.google.com/intl/ja/faq/\"],[\"パートナー\",\"https://cloud.withgoogle.com/partners/?products\\u003dGOOGLE_WORKSPACE_PRODUCT\"],[\"Marketplace\",\"https://workspace.google.com/marketplace/?hl\\u003dja\"],[\"統合\",\"https://workspace.google.com/intl/ja/integrations/\"],[\"トレーニングと認定資格\",\"https://workspace.google.com/intl/ja/training/\"]]]]]],[[[\"学習とサポート\",\"https://workspace.google.com/intl/ja/support/\",[[[\"管理者用ヘルプ\",\"https://support.google.com/a/#topic\\u003d29157\"],[\"設定と導入のガイド\",\"https://support.google.com/a/answer/6365252?hl\\u003dja\"],[\"ユーザー向けラーニング センター\",\"https://support.google.com/a/users?hl\\u003dja#topic\\u003d11499463\"],[\"管理者向けフォーラム\",\"https://productforums.google.com/forum/#!forum/apps\"],[\"Google Workspace ステータス ダッシュボード\",\"https://www.google.com/appsstatus#hl\\u003dja\"],[\"Google Workspace パートナーを探す\",\"https://www.google.com/a/partnersearch/?hl\\u003dja#home\"],[\"プレスリリース\",\"https://cloud.google.com/press/?hl\\u003dja\"]]]],[\"その他の Google サービス\",null,[[[\"Google Cloud\",\"https://cloud.google.com/?hl\\u003dja\"],[\"Chrome Enterprise\",\"https://chromeenterprise.google/\"],[\"Google ビジネス ソリューション\",\"https://www.google.com/intl/ja/services/\"],[\"Google 広告\",\"https://ads.google.com/home/?subid\\u003dja-ja-xs-aw-z-a-dyn-accounts_wsft!o3\"],[\"Business Messages\",\"https://businessmessages.google/\"],[\"ユーザー調査に参加する\",\"https://userresearch.google.com/?reserved\\u003d0\\u0026utm_source\\u003dgsuite.google.com\\u0026Q_Language\\u003den\\u0026utm_medium\\u003down_srch\\u0026utm_campaign\\u003dGlobal-GSuite\\u0026utm_term\\u003d0\\u0026utm_content\\u003d0\\u0026productTag\\u003dgafw\\u0026campaignDate\\u003dnov18\\u0026pType\\u003dbprof\\u0026referral_code\\u003dug422768\"]]]]]]]]],[\"ko\",[[[[[\"포함된 애플리케이션\",\"https://workspace.google.com/intl/ko/features/\",[[[\"Gmail\",\"https://workspace.google.com/intl/ko/products/gmail/\"],[\"Meet\",\"https://workspace.google.com/intl/ko/products/meet/\"],[\"Chat\",\"https://workspace.google.com/intl/ko/products/chat/\"],[\"Calendar\",\"https://workspace.google.com/intl/ko/products/calendar/\"],[\"Drive\",\"https://workspace.google.com/intl/ko/products/drive/\"],[\"Docs\",\"https://workspace.google.com/intl/ko/products/docs/\"],[\"Sheets\",\"https://workspace.google.com/intl/ko/products/sheets/\"],[\"Slides\",\"https://workspace.google.com/intl/ko/products/slides/\"],[\"설문지\",\"https://workspace.google.com/intl/ko/products/forms/\"],[\"사이트 도구\",\"https://workspace.google.com/intl/ko/products/sites/\"],[\"Keep\",\"https://workspace.google.com/intl/ko/products/keep/\"],[\"Apps Script\",\"https://workspace.google.com/intl/ko/products/apps-script/\"]]]]]],[[[\"보안 및 관리\",\"https://workspace.google.com/intl/ko/security/\",[[[\"관리\",\"https://workspace.google.com/intl/ko/products/admin/\"],[\"엔드포인트\",\"https://workspace.google.com/intl/ko/products/admin/endpoint/\"],[\"Vault\",\"https://workspace.google.com/intl/ko/products/vault/\"],[\"Work Insights\",\"https://workspace.google.com/intl/ko/products/workinsights/\"]]]],[\"솔루션\",\"https://workspace.google.com/intl/ko/solutions/\",[[[\"신규 업체\",\"https://workspace.google.com/intl/ko/business/new-business/\"],[\"중소기업\",\"https://workspace.google.com/intl/ko/business/small-business/\"],[\"엔터프라이즈\",\"https://workspace.google.com/intl/ko/enterprise/\"],[\"Education\",\"https://edu.google.com/products/workspace-for-education/education-fundamentals/\"],[\"비영리단체\",\"https://www.google.com/nonprofits/\"]]]]]],[[[\"가격\",\"https://workspace.google.com/intl/ko/pricing.html\",[[[\"버전 선택\",\"https://workspace.google.com/intl/ko/pricing.html\"]]]],[\"Add-ons\",null,[[[\"Workspace를 위한 Gemini\",\"https://workspace.google.com/solutions/ai/\"],[\"AppSheet\",\"https://about.appsheet.com/home/\"]]]]]],[[[\"리소스\",\"https://workspace.google.com/intl/ko/faq/\",[[[\"원격 근무\",\"https://workspace.google.com/intl/ko/resources/working-remotely/\"],[\"보안\",\"https://workspace.google.com/intl/ko/security/\"],[\"FAQ\",\"https://workspace.google.com/intl/ko/faq/\"],[\"파트너\",\"https://cloud.withgoogle.com/partners/?products\\u003dGOOGLE_WORKSPACE_PRODUCT\"],[\"Marketplace\",\"https://workspace.google.com/marketplace/?hl\\u003dko\"],[\"통합\",\"https://workspace.google.com/intl/ko/integrations/\"],[\"교육 및 인증\",\"https://workspace.google.com/intl/ko/training/\"]]]]]],[[[\"학습 및 지원\",\"https://workspace.google.com/intl/ko/support/\",[[[\"관리자 도움말\",\"https://support.google.com/a/#topic\\u003d29157\"],[\"설치 및 배포 센터\",\"https://support.google.com/a/answer/6365252?hl\\u003dko\"],[\"사용자를 위한 학습 센터\",\"https://support.google.com/a/users?hl\\u003dko#topic\\u003d11499463\"],[\"관리자 포럼\",\"https://productforums.google.com/forum/#!forum/apps\"],[\"Google Workspace 대시보드\",\"https://www.google.com/appsstatus#hl\\u003dko\"],[\"Google Workspace 파트너 찾기\",\"https://www.google.com/a/partnersearch/?hl\\u003dko#home\"],[\"보도자료\",\"https://cloud.google.com/press/\"]]]],[\"Google의 다른 제품\",null,[[[\"Google Cloud\",\"https://cloud.google.com/?hl\\u003dko\"],[\"Chrome Enterprise\",\"https://chromeenterprise.google/\"],[\"Google 비즈니스 솔루션\",\"https://www.google.com/intl/ko_kr/business/\"],[\"Google Ads\",\"https://ads.google.com/home/?subid\\u003dkr-ko-xs-aw-z-a-dyn-accounts_wsft!o3\"],[\"Business Messages\",\"https://businessmessages.google/\"],[\"사용자 연구 참여\",\"https://userresearch.google.com/?reserved\\u003d0\\u0026utm_source\\u003dgsuite.google.com\\u0026Q_Language\\u003den\\u0026utm_medium\\u003down_srch\\u0026utm_campaign\\u003dGlobal-GSuite\\u0026utm_term\\u003d0\\u0026utm_content\\u003d0\\u0026productTag\\u003dgafw\\u0026campaignDate\\u003dnov18\\u0026pType\\u003dbprof\\u0026referral_code\\u003dug422768\"]]]]]]]]]],[[\"de\",[[[\"Product News\",null,[[[\"Product News\",\"/blog/product-announcements/\"],[\"Workspace with Gemini\",\"/blog/workspace-with-gemini\"],[\"Gemini app\",\"/blog/gemini-app\"],[\"NotebookLM\",\"/blog/notebooklm\"],[\"Meet\",\"/blog/meet\"],[\"Gmail\",\"/blog/gmail\"],[\"Chat\",\"/blog/chat-spaces\"],[\"Drive\",\"/blog/drive\"],[\"Docs\",\"/blog/docs\"],[\"Sheets\",\"/blog/sheets\"],[\"Slides\",\"/blog/slides\"],[\"Vids\",\"/blog/google-vids\"],[\"Calendar\",\"/blog/calendar\"]]],[\"Explore product news\",\"Stay informed on all Cloud product announcements\",\"/blog/products/\",\"linear-gradient(79.98deg, rgba(66, 133, 244, 0.2) 0%, rgba(62, 106, 240, 0.2) 53.91%, rgba(87, 159, 255, 0.2) 107.82%)\",\"linear-gradient(79.98deg, rgba(66, 133, 244, 0.3) 0%, rgba(62, 106, 240, 0.3) 53.91%, rgba(87, 159, 255, 0.3) 107.82%)\",\"#2F3793\"],4],[\"Topics\",null,[[[\"Transforming work with AI\",\"/blog/transforming-work-with-ai\"],[\"Future of work\",\"/blog/future-of-work\"],[\"Security \\u0026 identity\",\"/blog/security-and-identity\"],[\"Enterprise-ready\",\"/blog/enterprise-ready\"],[\"Small business\",\"/blog/small-business\"],[\"Partners \\u0026 integrations\",\"/blog/partners-and-integrations\"]]],[\"Explore topics\",\"Get expert analysis on trends and workspace strategy\",\"/blog/products/\",\"linear-gradient(79.98deg, rgba(52, 168, 83, 0.2) 0%, rgba(115, 186, 255, 0.2) 53.91%, rgba(52, 168, 83, 0.2) 107.82%)\",\"linear-gradient(79.98deg, rgba(52, 168, 83, 0.2) 0%, rgba(102, 214, 105, 0.2) 53.91%, rgba(52, 168, 83, 0.2) 107.82%)\",\"#004E41\"]],[\"Developers \\u0026 Prectitioner\",null,[[[\"Dev tools \\u0026 APIs\",\"/blog/dev-tools-and-apis\"],[\"Dev guides\",\"/blog/dev-guides\"]]],[\"Explore developers \\u0026 practitioners\",\"Learn how we work with organizations to transform industries\",\"/blog/products/\",\"linear-gradient(80.33deg, rgba(255, 122, 114, 0.2) 0%, rgba(251, 188, 4, 0.2) 50.64%, rgba(255, 233, 33, 0.2) 101.28%)\",\"linear-gradient(80.33deg, rgba(255, 122, 114, 0.3) 0%, rgba(251, 188, 4, 0.3) 50.64%, rgba(255, 233, 33, 0.3) 101.28%)\",\"#202124\"]],[\"Learning\",null,[[[\"Training\",\"/blog/training\"],[\"How-to guides\",\"/blog/how-to-guides\"],[\"Best practices\",\"/blog/best-practices\"]]],[\"Explore learning\",\"Develop your Workspace skills and enhance your expertise\",\"/blog/products/\",\"linear-gradient(80.33deg, rgba(147, 120, 255, 0.2) 0%, rgba(106, 100, 253, 0.2) 51.13%, rgba(62, 106, 240, 0.2) 101.28%)\",\"linear-gradient(80.33deg, rgba(147, 120, 255, 0.3) 0%, rgba(106, 100, 253, 0.3) 51.13%, rgba(62, 106, 240, 0.3) 101.28%)\",\"#4D1D9B\"]],[\"Customer stories\",null,[[[\"Public sector\",\"/blog/public-sector\"],[\"Financial services\",\"/blog/financial-services\"],[\"Healthcare \\u0026 life sciences\",\"/blog/healthcare-and-life-sciences\"],[\"Telco\",\"/blog/telco\"],[\"Retail\",\"/blog/retail\"],[\"Media \\u0026 entertainment\",\"/blog/media-entertainment\"],[\"Consumer packaged goods (CPG)\",\"/blog/consumer-packaged-goods-cpg\"],[\"Supply chain \\u0026 logistics\",\"/blog/supply-chain-and-logistics\"],[\"Professional services\",\"/blog/professional-services\"],[\"Technology\",\"/blog/technology\"],[\"Education\",\"/blog/education\"]]],[\"Explore customer stories\",\"See how we work with customers to transform businesses and industries\",\"/blog/products/\",\"linear-gradient(79.98deg, rgba(66, 133, 244, 0.2) 0%, rgba(62, 106, 240, 0.2) 53.91%, rgba(87, 159, 255, 0.2) 107.82%)\",\"linear-gradient(79.98deg, rgba(66, 133, 244, 0.3) 0%, rgba(62, 106, 240, 0.3) 53.91%, rgba(87, 159, 255, 0.3) 107.82%)\",\"#2F3793\"]]]]],[\"en\",[[[\"Product News\",null,[[[\"Product News\",\"/blog/product-announcements/\"],[\"Workspace with Gemini\",\"/blog/workspace-with-gemini\"],[\"Gemini app\",\"/blog/gemini-app\"],[\"NotebookLM\",\"/blog/notebooklm\"],[\"Meet\",\"/blog/meet\"],[\"Gmail\",\"/blog/gmail\"],[\"Chat\",\"/blog/chat-spaces\"],[\"Drive\",\"/blog/drive\"],[\"Docs\",\"/blog/docs\"],[\"Sheets\",\"/blog/sheets\"],[\"Slides\",\"/blog/slides\"],[\"Vids\",\"/blog/google-vids\"],[\"Calendar\",\"/blog/calendar\"]]],[\"Explore product news\",\"Stay informed on all Cloud product announcements\",\"/blog/products/\",\"linear-gradient(79.98deg, rgba(66, 133, 244, 0.2) 0%, rgba(62, 106, 240, 0.2) 53.91%, rgba(87, 159, 255, 0.2) 107.82%)\",\"linear-gradient(79.98deg, rgba(66, 133, 244, 0.3) 0%, rgba(62, 106, 240, 0.3) 53.91%, rgba(87, 159, 255, 0.3) 107.82%)\",\"#2F3793\"],4],[\"Topics\",null,[[[\"Transforming work with AI\",\"/blog/transforming-work-with-ai\"],[\"Future of work\",\"/blog/future-of-work\"],[\"Security \\u0026 identity\",\"/blog/security-and-identity\"],[\"Enterprise-ready\",\"/blog/enterprise-ready\"],[\"Small business\",\"/blog/small-business\"],[\"Partners \\u0026 integrations\",\"/blog/partners-and-integrations\"]]],[\"Explore topics\",\"Get expert analysis on trends and workspace strategy\",\"/blog/products/\",\"linear-gradient(79.98deg, rgba(52, 168, 83, 0.2) 0%, rgba(115, 186, 255, 0.2) 53.91%, rgba(52, 168, 83, 0.2) 107.82%)\",\"linear-gradient(79.98deg, rgba(52, 168, 83, 0.2) 0%, rgba(102, 214, 105, 0.2) 53.91%, rgba(52, 168, 83, 0.2) 107.82%)\",\"#004E41\"]],[\"Developers \\u0026 Prectitioner\",null,[[[\"Dev tools \\u0026 APIs\",\"/blog/dev-tools-and-apis\"],[\"Dev guides\",\"/blog/dev-guides\"]]],[\"Explore developers \\u0026 practitioners\",\"Learn how we work with organizations to transform industries\",\"/blog/products/\",\"linear-gradient(80.33deg, rgba(255, 122, 114, 0.2) 0%, rgba(251, 188, 4, 0.2) 50.64%, rgba(255, 233, 33, 0.2) 101.28%)\",\"linear-gradient(80.33deg, rgba(255, 122, 114, 0.3) 0%, rgba(251, 188, 4, 0.3) 50.64%, rgba(255, 233, 33, 0.3) 101.28%)\",\"#202124\"]],[\"Learning\",null,[[[\"Training\",\"/blog/training\"],[\"How-to guides\",\"/blog/how-to-guides\"],[\"Best practices\",\"/blog/best-practices\"]]],[\"Explore learning\",\"Develop your Workspace skills and enhance your expertise\",\"/blog/products/\",\"linear-gradient(80.33deg, rgba(147, 120, 255, 0.2) 0%, rgba(106, 100, 253, 0.2) 51.13%, rgba(62, 106, 240, 0.2) 101.28%)\",\"linear-gradient(80.33deg, rgba(147, 120, 255, 0.3) 0%, rgba(106, 100, 253, 0.3) 51.13%, rgba(62, 106, 240, 0.3) 101.28%)\",\"#4D1D9B\"]],[\"Customer stories\",null,[[[\"Public sector\",\"/blog/public-sector\"],[\"Financial services\",\"/blog/financial-services\"],[\"Healthcare \\u0026 life sciences\",\"/blog/healthcare-and-life-sciences\"],[\"Telco\",\"/blog/telco\"],[\"Retail\",\"/blog/retail\"],[\"Media \\u0026 entertainment\",\"/blog/media-entertainment\"],[\"Consumer packaged goods (CPG)\",\"/blog/consumer-packaged-goods-cpg\"],[\"Supply chain \\u0026 logistics\",\"/blog/supply-chain-and-logistics\"],[\"Professional services\",\"/blog/professional-services\"],[\"Technology\",\"/blog/technology\"],[\"Education\",\"/blog/education\"]]],[\"Explore customer stories\",\"See how we work with customers to transform businesses and industries\",\"/blog/products/\",\"linear-gradient(79.98deg, rgba(66, 133, 244, 0.2) 0%, rgba(62, 106, 240, 0.2) 53.91%, rgba(87, 159, 255, 0.2) 107.82%)\",\"linear-gradient(79.98deg, rgba(66, 133, 244, 0.3) 0%, rgba(62, 106, 240, 0.3) 53.91%, rgba(87, 159, 255, 0.3) 107.82%)\",\"#2F3793\"]]]]],[\"fr\",[[[\"Product News\",null,[[[\"Product News\",\"/blog/product-announcements/\"],[\"Workspace with Gemini\",\"/blog/workspace-with-gemini\"],[\"Gemini app\",\"/blog/gemini-app\"],[\"NotebookLM\",\"/blog/notebooklm\"],[\"Meet\",\"/blog/meet\"],[\"Gmail\",\"/blog/gmail\"],[\"Chat\",\"/blog/chat-spaces\"],[\"Drive\",\"/blog/drive\"],[\"Docs\",\"/blog/docs\"],[\"Sheets\",\"/blog/sheets\"],[\"Slides\",\"/blog/slides\"],[\"Vids\",\"/blog/google-vids\"],[\"Calendar\",\"/blog/calendar\"]]],[\"Explore product news\",\"Stay informed on all Cloud product announcements\",\"/blog/products/\",\"linear-gradient(79.98deg, rgba(66, 133, 244, 0.2) 0%, rgba(62, 106, 240, 0.2) 53.91%, rgba(87, 159, 255, 0.2) 107.82%)\",\"linear-gradient(79.98deg, rgba(66, 133, 244, 0.3) 0%, rgba(62, 106, 240, 0.3) 53.91%, rgba(87, 159, 255, 0.3) 107.82%)\",\"#2F3793\"],4],[\"Topics\",null,[[[\"Transforming work with AI\",\"/blog/transforming-work-with-ai\"],[\"Future of work\",\"/blog/future-of-work\"],[\"Security \\u0026 identity\",\"/blog/security-and-identity\"],[\"Enterprise-ready\",\"/blog/enterprise-ready\"],[\"Small business\",\"/blog/small-business\"],[\"Partners \\u0026 integrations\",\"/blog/partners-and-integrations\"]]],[\"Explore topics\",\"Get expert analysis on trends and workspace strategy\",\"/blog/products/\",\"linear-gradient(79.98deg, rgba(52, 168, 83, 0.2) 0%, rgba(115, 186, 255, 0.2) 53.91%, rgba(52, 168, 83, 0.2) 107.82%)\",\"linear-gradient(79.98deg, rgba(52, 168, 83, 0.2) 0%, rgba(102, 214, 105, 0.2) 53.91%, rgba(52, 168, 83, 0.2) 107.82%)\",\"#004E41\"]],[\"Developers \\u0026 Prectitioner\",null,[[[\"Dev tools \\u0026 APIs\",\"/blog/dev-tools-and-apis\"],[\"Dev guides\",\"/blog/dev-guides\"]]],[\"Explore developers \\u0026 practitioners\",\"Learn how we work with organizations to transform industries\",\"/blog/products/\",\"linear-gradient(80.33deg, rgba(255, 122, 114, 0.2) 0%, rgba(251, 188, 4, 0.2) 50.64%, rgba(255, 233, 33, 0.2) 101.28%)\",\"linear-gradient(80.33deg, rgba(255, 122, 114, 0.3) 0%, rgba(251, 188, 4, 0.3) 50.64%, rgba(255, 233, 33, 0.3) 101.28%)\",\"#202124\"]],[\"Learning\",null,[[[\"Training\",\"/blog/training\"],[\"How-to guides\",\"/blog/how-to-guides\"],[\"Best practices\",\"/blog/best-practices\"]]],[\"Explore learning\",\"Develop your Workspace skills and enhance your expertise\",\"/blog/products/\",\"linear-gradient(80.33deg, rgba(147, 120, 255, 0.2) 0%, rgba(106, 100, 253, 0.2) 51.13%, rgba(62, 106, 240, 0.2) 101.28%)\",\"linear-gradient(80.33deg, rgba(147, 120, 255, 0.3) 0%, rgba(106, 100, 253, 0.3) 51.13%, rgba(62, 106, 240, 0.3) 101.28%)\",\"#4D1D9B\"]],[\"Customer stories\",null,[[[\"Public sector\",\"/blog/public-sector\"],[\"Financial services\",\"/blog/financial-services\"],[\"Healthcare \\u0026 life sciences\",\"/blog/healthcare-and-life-sciences\"],[\"Telco\",\"/blog/telco\"],[\"Retail\",\"/blog/retail\"],[\"Media \\u0026 entertainment\",\"/blog/media-entertainment\"],[\"Consumer packaged goods (CPG)\",\"/blog/consumer-packaged-goods-cpg\"],[\"Supply chain \\u0026 logistics\",\"/blog/supply-chain-and-logistics\"],[\"Professional services\",\"/blog/professional-services\"],[\"Technology\",\"/blog/technology\"],[\"Education\",\"/blog/education\"]]],[\"Explore customer stories\",\"See how we work with customers to transform businesses and industries\",\"/blog/products/\",\"linear-gradient(79.98deg, rgba(66, 133, 244, 0.2) 0%, rgba(62, 106, 240, 0.2) 53.91%, rgba(87, 159, 255, 0.2) 107.82%)\",\"linear-gradient(79.98deg, rgba(66, 133, 244, 0.3) 0%, rgba(62, 106, 240, 0.3) 53.91%, rgba(87, 159, 255, 0.3) 107.82%)\",\"#2F3793\"]]]]],[\"ja\",[[[\"Product News\",null,[[[\"Product News\",\"/blog/product-announcements/\"],[\"Workspace with Gemini\",\"/blog/workspace-with-gemini\"],[\"Gemini app\",\"/blog/gemini-app\"],[\"NotebookLM\",\"/blog/notebooklm\"],[\"Meet\",\"/blog/meet\"],[\"Gmail\",\"/blog/gmail\"],[\"Chat\",\"/blog/chat-spaces\"],[\"Drive\",\"/blog/drive\"],[\"Docs\",\"/blog/docs\"],[\"Sheets\",\"/blog/sheets\"],[\"Slides\",\"/blog/slides\"],[\"Vids\",\"/blog/google-vids\"],[\"Calendar\",\"/blog/calendar\"]]],[\"Explore product news\",\"Stay informed on all Cloud product announcements\",\"/blog/products/\",\"linear-gradient(79.98deg, rgba(66, 133, 244, 0.2) 0%, rgba(62, 106, 240, 0.2) 53.91%, rgba(87, 159, 255, 0.2) 107.82%)\",\"linear-gradient(79.98deg, rgba(66, 133, 244, 0.3) 0%, rgba(62, 106, 240, 0.3) 53.91%, rgba(87, 159, 255, 0.3) 107.82%)\",\"#2F3793\"],4],[\"Topics\",null,[[[\"Transforming work with AI\",\"/blog/transforming-work-with-ai\"],[\"Future of work\",\"/blog/future-of-work\"],[\"Security \\u0026 identity\",\"/blog/security-and-identity\"],[\"Enterprise-ready\",\"/blog/enterprise-ready\"],[\"Small business\",\"/blog/small-business\"],[\"Partners \\u0026 integrations\",\"/blog/partners-and-integrations\"]]],[\"Explore topics\",\"Get expert analysis on trends and workspace strategy\",\"/blog/products/\",\"linear-gradient(79.98deg, rgba(52, 168, 83, 0.2) 0%, rgba(115, 186, 255, 0.2) 53.91%, rgba(52, 168, 83, 0.2) 107.82%)\",\"linear-gradient(79.98deg, rgba(52, 168, 83, 0.2) 0%, rgba(102, 214, 105, 0.2) 53.91%, rgba(52, 168, 83, 0.2) 107.82%)\",\"#004E41\"]],[\"Developers \\u0026 Prectitioner\",null,[[[\"Dev tools \\u0026 APIs\",\"/blog/dev-tools-and-apis\"],[\"Dev guides\",\"/blog/dev-guides\"]]],[\"Explore developers \\u0026 practitioners\",\"Learn how we work with organizations to transform industries\",\"/blog/products/\",\"linear-gradient(80.33deg, rgba(255, 122, 114, 0.2) 0%, rgba(251, 188, 4, 0.2) 50.64%, rgba(255, 233, 33, 0.2) 101.28%)\",\"linear-gradient(80.33deg, rgba(255, 122, 114, 0.3) 0%, rgba(251, 188, 4, 0.3) 50.64%, rgba(255, 233, 33, 0.3) 101.28%)\",\"#202124\"]],[\"Learning\",null,[[[\"Training\",\"/blog/training\"],[\"How-to guides\",\"/blog/how-to-guides\"],[\"Best practices\",\"/blog/best-practices\"]]],[\"Explore learning\",\"Develop your Workspace skills and enhance your expertise\",\"/blog/products/\",\"linear-gradient(80.33deg, rgba(147, 120, 255, 0.2) 0%, rgba(106, 100, 253, 0.2) 51.13%, rgba(62, 106, 240, 0.2) 101.28%)\",\"linear-gradient(80.33deg, rgba(147, 120, 255, 0.3) 0%, rgba(106, 100, 253, 0.3) 51.13%, rgba(62, 106, 240, 0.3) 101.28%)\",\"#4D1D9B\"]],[\"Customer stories\",null,[[[\"Public sector\",\"/blog/public-sector\"],[\"Financial services\",\"/blog/financial-services\"],[\"Healthcare \\u0026 life sciences\",\"/blog/healthcare-and-life-sciences\"],[\"Telco\",\"/blog/telco\"],[\"Retail\",\"/blog/retail\"],[\"Media \\u0026 entertainment\",\"/blog/media-entertainment\"],[\"Consumer packaged goods (CPG)\",\"/blog/consumer-packaged-goods-cpg\"],[\"Supply chain \\u0026 logistics\",\"/blog/supply-chain-and-logistics\"],[\"Professional services\",\"/blog/professional-services\"],[\"Technology\",\"/blog/technology\"],[\"Education\",\"/blog/education\"]]],[\"Explore customer stories\",\"See how we work with customers to transform businesses and industries\",\"/blog/products/\",\"linear-gradient(79.98deg, rgba(66, 133, 244, 0.2) 0%, rgba(62, 106, 240, 0.2) 53.91%, rgba(87, 159, 255, 0.2) 107.82%)\",\"linear-gradient(79.98deg, rgba(66, 133, 244, 0.3) 0%, rgba(62, 106, 240, 0.3) 53.91%, rgba(87, 159, 255, 0.3) 107.82%)\",\"#2F3793\"]]]]],[\"ko\",[[[\"Product News\",null,[[[\"Product News\",\"/blog/product-announcements/\"],[\"Workspace with Gemini\",\"/blog/workspace-with-gemini\"],[\"Gemini app\",\"/blog/gemini-app\"],[\"NotebookLM\",\"/blog/notebooklm\"],[\"Meet\",\"/blog/meet\"],[\"Gmail\",\"/blog/gmail\"],[\"Chat\",\"/blog/chat-spaces\"],[\"Drive\",\"/blog/drive\"],[\"Docs\",\"/blog/docs\"],[\"Sheets\",\"/blog/sheets\"],[\"Slides\",\"/blog/slides\"],[\"Vids\",\"/blog/google-vids\"],[\"Calendar\",\"/blog/calendar\"]]],[\"Explore product news\",\"Stay informed on all Cloud product announcements\",\"/blog/products/\",\"linear-gradient(79.98deg, rgba(66, 133, 244, 0.2) 0%, rgba(62, 106, 240, 0.2) 53.91%, rgba(87, 159, 255, 0.2) 107.82%)\",\"linear-gradient(79.98deg, rgba(66, 133, 244, 0.3) 0%, rgba(62, 106, 240, 0.3) 53.91%, rgba(87, 159, 255, 0.3) 107.82%)\",\"#2F3793\"],4],[\"Topics\",null,[[[\"Transforming work with AI\",\"/blog/transforming-work-with-ai\"],[\"Future of work\",\"/blog/future-of-work\"],[\"Security \\u0026 identity\",\"/blog/security-and-identity\"],[\"Enterprise-ready\",\"/blog/enterprise-ready\"],[\"Small business\",\"/blog/small-business\"],[\"Partners \\u0026 integrations\",\"/blog/partners-and-integrations\"]]],[\"Explore topics\",\"Get expert analysis on trends and workspace strategy\",\"/blog/products/\",\"linear-gradient(79.98deg, rgba(52, 168, 83, 0.2) 0%, rgba(115, 186, 255, 0.2) 53.91%, rgba(52, 168, 83, 0.2) 107.82%)\",\"linear-gradient(79.98deg, rgba(52, 168, 83, 0.2) 0%, rgba(102, 214, 105, 0.2) 53.91%, rgba(52, 168, 83, 0.2) 107.82%)\",\"#004E41\"]],[\"Developers \\u0026 Prectitioner\",null,[[[\"Dev tools \\u0026 APIs\",\"/blog/dev-tools-and-apis\"],[\"Dev guides\",\"/blog/dev-guides\"]]],[\"Explore developers \\u0026 practitioners\",\"Learn how we work with organizations to transform industries\",\"/blog/products/\",\"linear-gradient(80.33deg, rgba(255, 122, 114, 0.2) 0%, rgba(251, 188, 4, 0.2) 50.64%, rgba(255, 233, 33, 0.2) 101.28%)\",\"linear-gradient(80.33deg, rgba(255, 122, 114, 0.3) 0%, rgba(251, 188, 4, 0.3) 50.64%, rgba(255, 233, 33, 0.3) 101.28%)\",\"#202124\"]],[\"Learning\",null,[[[\"Training\",\"/blog/training\"],[\"How-to guides\",\"/blog/how-to-guides\"],[\"Best practices\",\"/blog/best-practices\"]]],[\"Explore learning\",\"Develop your Workspace skills and enhance your expertise\",\"/blog/products/\",\"linear-gradient(80.33deg, rgba(147, 120, 255, 0.2) 0%, rgba(106, 100, 253, 0.2) 51.13%, rgba(62, 106, 240, 0.2) 101.28%)\",\"linear-gradient(80.33deg, rgba(147, 120, 255, 0.3) 0%, rgba(106, 100, 253, 0.3) 51.13%, rgba(62, 106, 240, 0.3) 101.28%)\",\"#4D1D9B\"]],[\"Customer stories\",null,[[[\"Public sector\",\"/blog/public-sector\"],[\"Financial services\",\"/blog/financial-services\"],[\"Healthcare \\u0026 life sciences\",\"/blog/healthcare-and-life-sciences\"],[\"Telco\",\"/blog/telco\"],[\"Retail\",\"/blog/retail\"],[\"Media \\u0026 entertainment\",\"/blog/media-entertainment\"],[\"Consumer packaged goods (CPG)\",\"/blog/consumer-packaged-goods-cpg\"],[\"Supply chain \\u0026 logistics\",\"/blog/supply-chain-and-logistics\"],[\"Professional services\",\"/blog/professional-services\"],[\"Technology\",\"/blog/technology\"],[\"Education\",\"/blog/education\"]]],[\"Explore customer stories\",\"See how we work with customers to transform businesses and industries\",\"/blog/products/\",\"linear-gradient(79.98deg, rgba(66, 133, 244, 0.2) 0%, rgba(62, 106, 240, 0.2) 53.91%, rgba(87, 159, 255, 0.2) 107.82%)\",\"linear-gradient(79.98deg, rgba(66, 133, 244, 0.3) 0%, rgba(62, 106, 240, 0.3) 53.91%, rgba(87, 159, 255, 0.3) 107.82%)\",\"#2F3793\"]]]]]]]","w2btAe":"%.@.null,null,\"\",false,null,null,true,false]","xn5OId":false,"xnI9P":true,"xwAfE":true,"y2FhP":"prod","yFnxrf":1884,"zChJod":"%.@.]"};</script><script nonce="ukEud-BIIo14C235ZP9QwA">window["_F_toggles_default_TransformBlogUi"] = [0x400402, 0x26406, 0x20, ];</script><script nonce="ukEud-BIIo14C235ZP9QwA">(function(){'use strict';var a=window,d=a.performance,l=k();a.cc_latency_start_time=d&&d.now?0:d&&d.timing&&d.timing.navigationStart?d.timing.navigationStart:l;function k(){return d&&d.now?d.now():(new Date).getTime()}function n(e){if(d&&d.now&&d.mark){var g=d.mark(e);if(g)return g.startTime;if(d.getEntriesByName&&(e=d.getEntriesByName(e).pop()))return e.startTime}return k()}a.onaft=function(){n("aft")};a._isLazyImage=function(e){return e.hasAttribute("data-src")||e.hasAttribute("data-ils")||e.getAttribute("loading")==="lazy"};
|
||
a.l=function(e){function g(b){var c={};c[b]=k();a.cc_latency.push(c)}function m(b){var c=n("iml");b.setAttribute("data-iml",c);return c}a.cc_aid=e;a.iml_start=a.cc_latency_start_time;a.css_size=0;a.cc_latency=[];a.ccTick=g;a.onJsLoad=function(){g("jsl")};a.onCssLoad=function(){g("cssl")};a._isVisible=function(b,c){if(!c||c.style.display=="none")return!1;var f=b.defaultView;if(f&&f.getComputedStyle&&(f=f.getComputedStyle(c),f.height=="0px"||f.width=="0px"||f.visibility=="hidden"))return!1;if(!c.getBoundingClientRect)return!0;
|
||
var h=c.getBoundingClientRect();c=h.left+a.pageXOffset;f=h.top+a.pageYOffset;if(f+h.height<0||c+h.width<0||h.height<=0||h.width<=0)return!1;b=b.documentElement;return f<=(a.innerHeight||b.clientHeight)&&c<=(a.innerWidth||b.clientWidth)};a._recordImlEl=m;document.documentElement.addEventListener("load",function(b){b=b.target;var c;b.tagName!="IMG"||b.hasAttribute("data-iid")||a._isLazyImage(b)||b.hasAttribute("data-noaft")||(c=m(b));if(a.aft_counter&&(b=a.aft_counter.indexOf(b),b!==-1&&(b=a.aft_counter.splice(b,
|
||
1).length===1,a.aft_counter.length===0&&b&&c)))a.onaft(c)},!0);a.prt=-1;a.wiz_tick=function(){var b=n("prt");a.prt=b}};}).call(this);
|
||
l('DK1zsb')</script><script nonce="ukEud-BIIo14C235ZP9QwA">var _F_cssRowKey = 'boq-cloudx-web-blog.TransformBlogUi.yZgsDxAfBrU.L.B1.O';var _F_combinedSignature = 'AHrnUqUGNGNeCiP-_qWKs7Ba6w58X6y9Cg';function _DumpException(e) {throw e;}</script><link rel="stylesheet" href="https://www.gstatic.com/_/mss/boq-cloudx-web-blog/_/ss/k=boq-cloudx-web-blog.TransformBlogUi.yZgsDxAfBrU.L.B1.O/am=AgRAgAGZAAAC/d=1/ed=1/rs=AHrnUqXpecS6QUjjCqXIIH_7efvk5j1Ndw/m=articleview,_b,_tp" data-id="_cl" nonce="RWMKHuytZOJr4DhxiNx31g"><script nonce="ukEud-BIIo14C235ZP9QwA">onCssLoad();</script><style data-font-stylesheet nonce="RWMKHuytZOJr4DhxiNx31g">@font-face{font-family:'Material Icons Extended';font-style:normal;font-weight:400;src:url(https://fonts.gstatic.com/s/materialiconsextended/v154/kJEjBvgX7BgnkSrUwT8UnLVc38YydejYY-oE_LvJHMXBBA.woff2)format('woff2');}.material-icons-extended{font-family:'Material Icons Extended';font-weight:normal;font-style:normal;font-size:24px;line-height:1;letter-spacing:normal;text-transform:none;display:inline-block;white-space:nowrap;word-wrap:normal;direction:ltr;-webkit-font-feature-settings:'liga';-webkit-font-smoothing:antialiased;}@font-face{font-family:'Google Material Icons';font-style:normal;font-weight:400;src:url(https://fonts.gstatic.com/s/googlematerialicons/v144/Gw6kwdfw6UnXLJCcmafZyFRXb3BL9rvi0QZG3Sy7X00.woff2)format('woff2');}.google-material-icons{font-family:'Google Material Icons';font-weight:normal;font-style:normal;font-size:24px;line-height:1;letter-spacing:normal;text-transform:none;display:inline-block;white-space:nowrap;word-wrap:normal;direction:ltr;-webkit-font-feature-settings:'liga';-webkit-font-smoothing:antialiased;}@font-face{font-family:'Product Sans';font-style:normal;font-weight:400;src:url(https://fonts.gstatic.com/s/productsans/v9/pxiDypQkot1TnFhsFMOfGShVGdeOYktMqlap.woff2)format('woff2');unicode-range:U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF;}@font-face{font-family:'Product Sans';font-style:normal;font-weight:400;src:url(https://fonts.gstatic.com/s/productsans/v9/pxiDypQkot1TnFhsFMOfGShVF9eOYktMqg.woff2)format('woff2');unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD;}@font-face{font-family:'Google Sans';font-style:normal;font-weight:400;src:url(https://fonts.gstatic.com/s/googlesans/v62/4UasrENHsxJlGDuGo1OIlJfC6l_24rlCK1Yo_Iqcsih3SAyH6cAwhX9RPiIUvbQoi-Entw.woff2)format('woff2');unicode-range:U+0308,U+0530-058F,U+2010,U+2024,U+25CC,U+FB13-FB17;}@font-face{font-family:'Google Sans';font-style:normal;font-weight:400;src:url(https://fonts.gstatic.com/s/googlesans/v62/4UasrENHsxJlGDuGo1OIlJfC6l_24rlCK1Yo_Iqcsih3SAyH6cAwhX9RPiAUvbQoi-Entw.woff2)format('woff2');unicode-range:U+0951-0952,U+0964-0965,U+0980-09FE,U+1CD0,U+1CD2,U+1CD5-1CD6,U+1CD8,U+1CE1,U+1CEA,U+1CED,U+1CF2,U+1CF5-1CF7,U+200C-200D,U+20B9,U+25CC,U+A8F1;}@font-face{font-family:'Google Sans';font-style:normal;font-weight:400;src:url(https://fonts.gstatic.com/s/googlesans/v62/4UasrENHsxJlGDuGo1OIlJfC6l_24rlCK1Yo_Iqcsih3SAyH6cAwhX9RPh0UvbQoi-Entw.woff2)format('woff2');unicode-range:U+02C7,U+02D8-02D9,U+02DB,U+0307,U+1400-167F,U+18B0-18F5,U+25CC,U+11AB0-11ABF;}@font-face{font-family:'Google Sans';font-style:normal;font-weight:400;src:url(https://fonts.gstatic.com/s/googlesans/v62/4UasrENHsxJlGDuGo1OIlJfC6l_24rlCK1Yo_Iqcsih3SAyH6cAwhX9RPj8UvbQoi-Entw.woff2)format('woff2');unicode-range:U+0460-052F,U+1C80-1C8A,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F;}@font-face{font-family:'Google Sans';font-style:normal;font-weight:400;src:url(https://fonts.gstatic.com/s/googlesans/v62/4UasrENHsxJlGDuGo1OIlJfC6l_24rlCK1Yo_Iqcsih3SAyH6cAwhX9RPjYUvbQoi-Entw.woff2)format('woff2');unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116;}@font-face{font-family:'Google Sans';font-style:normal;font-weight:400;src:url(https://fonts.gstatic.com/s/googlesans/v62/4UasrENHsxJlGDuGo1OIlJfC6l_24rlCK1Yo_Iqcsih3SAyH6cAwhX9RPjMUvbQoi-Entw.woff2)format('woff2');unicode-range:U+0900-097F,U+1CD0-1CF9,U+200C-200D,U+20A8,U+20B9,U+20F0,U+25CC,U+A830-A839,U+A8E0-A8FF,U+11B00-11B09;}@font-face{font-family:'Google Sans';font-style:normal;font-weight:400;src:url(https://fonts.gstatic.com/s/googlesans/v62/4UasrENHsxJlGDuGo1OIlJfC6l_24rlCK1Yo_Iqcsih3SAyH6cAwhX9RPiMUvbQoi-Entw.woff2)format('woff2');unicode-range:U+030E,U+1200-1399,U+2D80-2DDE,U+AB01-AB2E,U+1E7E0-1E7E6,U+1E7E8-1E7EB,U+1E7ED-1E7EE,U+1E7F0-1E7FE;}@font-face{font-family:'Google Sans';font-style:normal;font-weight:400;src:url(https://fonts.gstatic.com/s/googlesans/v62/4UasrENHsxJlGDuGo1OIlJfC6l_24rlCK1Yo_Iqcsih3SAyH6cAwhX9RPi0UvbQoi-Entw.woff2)format('woff2');unicode-range:U+0589,U+10A0-10FF,U+1C90-1CBA,U+1CBD-1CBF,U+205A,U+2D00-2D2F,U+2E31;}@font-face{font-family:'Google Sans';font-style:normal;font-weight:400;src:url(https://fonts.gstatic.com/s/googlesans/v62/4UasrENHsxJlGDuGo1OIlJfC6l_24rlCK1Yo_Iqcsih3SAyH6cAwhX9RPj4UvbQoi-Entw.woff2)format('woff2');unicode-range:U+1F00-1FFF;}@font-face{font-family:'Google Sans';font-style:normal;font-weight:400;src:url(https://fonts.gstatic.com/s/googlesans/v62/4UasrENHsxJlGDuGo1OIlJfC6l_24rlCK1Yo_Iqcsih3SAyH6cAwhX9RPjEUvbQoi-Entw.woff2)format('woff2');unicode-range:U+0370-0377,U+037A-037F,U+0384-038A,U+038C,U+038E-03A1,U+03A3-03FF;}@font-face{font-family:'Google Sans';font-style:normal;font-weight:400;src:url(https://fonts.gstatic.com/s/googlesans/v62/4UasrENHsxJlGDuGo1OIlJfC6l_24rlCK1Yo_Iqcsih3SAyH6cAwhX9RPikUvbQoi-Entw.woff2)format('woff2');unicode-range:U+0951-0952,U+0964-0965,U+0A80-0AFF,U+200C-200D,U+20B9,U+25CC,U+A830-A839;}@font-face{font-family:'Google Sans';font-style:normal;font-weight:400;src:url(https://fonts.gstatic.com/s/googlesans/v62/4UasrENHsxJlGDuGo1OIlJfC6l_24rlCK1Yo_Iqcsih3SAyH6cAwhX9RPhEUvbQoi-Entw.woff2)format('woff2');unicode-range:U+0951-0952,U+0964-0965,U+0A01-0A76,U+200C-200D,U+20B9,U+25CC,U+262C,U+A830-A839;}@font-face{font-family:'Google Sans';font-style:normal;font-weight:400;src:url(https://fonts.gstatic.com/s/googlesans/v62/4UasrENHsxJlGDuGo1OIlJfC6l_24rlCK1Yo_Iqcsih3SAyH6cAwhX9RPjAUvbQoi-Entw.woff2)format('woff2');unicode-range:U+0307-0308,U+0590-05FF,U+200C-2010,U+20AA,U+25CC,U+FB1D-FB4F;}@font-face{font-family:'Google Sans';font-style:normal;font-weight:400;src:url(https://fonts.gstatic.com/s/googlesans/v62/4UasrENHsxJlGDuGo1OIlJfC6l_24rlCK1Yo_Iqcsih3SAyH6cAwhX9RPjkUvbQoi-Entw.woff2)format('woff2');unicode-range:U+1780-17FF,U+19E0-19FF,U+200C-200D,U+25CC;}@font-face{font-family:'Google Sans';font-style:normal;font-weight:400;src:url(https://fonts.gstatic.com/s/googlesans/v62/4UasrENHsxJlGDuGo1OIlJfC6l_24rlCK1Yo_Iqcsih3SAyH6cAwhX9RPjsUvbQoi-Entw.woff2)format('woff2');unicode-range:U+0E81-0EDF,U+200C-200D,U+25CC;}@font-face{font-family:'Google Sans';font-style:normal;font-weight:400;src:url(https://fonts.gstatic.com/s/googlesans/v62/4UasrENHsxJlGDuGo1OIlJfC6l_24rlCK1Yo_Iqcsih3SAyH6cAwhX9RPioUvbQoi-Entw.woff2)format('woff2');unicode-range:U+0307,U+0323,U+0951-0952,U+0964-0965,U+0D00-0D7F,U+1CDA,U+1CF2,U+200C-200D,U+20B9,U+25CC,U+A830-A832;}@font-face{font-family:'Google Sans';font-style:normal;font-weight:400;src:url(https://fonts.gstatic.com/s/googlesans/v62/4UasrENHsxJlGDuGo1OIlJfC6l_24rlCK1Yo_Iqcsih3SAyH6cAwhX9RPisUvbQoi-Entw.woff2)format('woff2');unicode-range:U+0951-0952,U+0964-0965,U+0B01-0B77,U+1CDA,U+1CF2,U+200C-200D,U+20B9,U+25CC;}@font-face{font-family:'Google Sans';font-style:normal;font-weight:400;src:url(https://fonts.gstatic.com/s/googlesans/v62/4UasrENHsxJlGDuGo1OIlJfC6l_24rlCK1Yo_Iqcsih3SAyH6cAwhX9RPi8UvbQoi-Entw.woff2)format('woff2');unicode-range:U+0964-0965,U+0D81-0DF4,U+1CF2,U+200C-200D,U+25CC,U+111E1-111F4;}@font-face{font-family:'Google Sans';font-style:normal;font-weight:400;src:url(https://fonts.gstatic.com/s/googlesans/v62/4UasrENHsxJlGDuGo1OIlJfC6l_24rlCK1Yo_Iqcsih3SAyH6cAwhX9RPlwUvbQoi-Entw.woff2)format('woff2');unicode-range:U+0001-000C,U+000E-001F,U+007F-009F,U+20DD-20E0,U+20E2-20E4,U+2150-218F,U+2190,U+2192,U+2194-2199,U+21AF,U+21E6-21F0,U+21F3,U+2218-2219,U+2299,U+22C4-22C6,U+2300-243F,U+2440-244A,U+2460-24FF,U+25A0-27BF,U+2800-28FF,U+2921-2922,U+2981,U+29BF,U+29EB,U+2B00-2BFF,U+4DC0-4DFF,U+FFF9-FFFB,U+10140-1018E,U+10190-1019C,U+101A0,U+101D0-101FD,U+102E0-102FB,U+10E60-10E7E,U+1D2C0-1D2D3,U+1D2E0-1D37F,U+1F000-1F0FF,U+1F100-1F1AD,U+1F1E6-1F1FF,U+1F30D-1F30F,U+1F315,U+1F31C,U+1F31E,U+1F320-1F32C,U+1F336,U+1F378,U+1F37D,U+1F382,U+1F393-1F39F,U+1F3A7-1F3A8,U+1F3AC-1F3AF,U+1F3C2,U+1F3C4-1F3C6,U+1F3CA-1F3CE,U+1F3D4-1F3E0,U+1F3ED,U+1F3F1-1F3F3,U+1F3F5-1F3F7,U+1F408,U+1F415,U+1F41F,U+1F426,U+1F43F,U+1F441-1F442,U+1F444,U+1F446-1F449,U+1F44C-1F44E,U+1F453,U+1F46A,U+1F47D,U+1F4A3,U+1F4B0,U+1F4B3,U+1F4B9,U+1F4BB,U+1F4BF,U+1F4C8-1F4CB,U+1F4D6,U+1F4DA,U+1F4DF,U+1F4E3-1F4E6,U+1F4EA-1F4ED,U+1F4F7,U+1F4F9-1F4FB,U+1F4FD-1F4FE,U+1F503,U+1F507-1F50B,U+1F50D,U+1F512-1F513,U+1F53E-1F54A,U+1F54F-1F5FA,U+1F610,U+1F650-1F67F,U+1F687,U+1F68D,U+1F691,U+1F694,U+1F698,U+1F6AD,U+1F6B2,U+1F6B9-1F6BA,U+1F6BC,U+1F6C6-1F6CF,U+1F6D3-1F6D7,U+1F6E0-1F6EA,U+1F6F0-1F6F3,U+1F6F7-1F6FC,U+1F700-1F7FF,U+1F800-1F80B,U+1F810-1F847,U+1F850-1F859,U+1F860-1F887,U+1F890-1F8AD,U+1F8B0-1F8BB,U+1F8C0-1F8C1,U+1F900-1F90B,U+1F93B,U+1F946,U+1F984,U+1F996,U+1F9E9,U+1FA00-1FA6F,U+1FA70-1FA7C,U+1FA80-1FA89,U+1FA8F-1FAC6,U+1FACE-1FADC,U+1FADF-1FAE9,U+1FAF0-1FAF8,U+1FB00-1FBFF;}@font-face{font-family:'Google Sans';font-style:normal;font-weight:400;src:url(https://fonts.gstatic.com/s/googlesans/v62/4UasrENHsxJlGDuGo1OIlJfC6l_24rlCK1Yo_Iqcsih3SAyH6cAwhX9RPiQUvbQoi-Entw.woff2)format('woff2');unicode-range:U+0964-0965,U+0B82-0BFA,U+200C-200D,U+20B9,U+25CC;}@font-face{font-family:'Google Sans';font-style:normal;font-weight:400;src:url(https://fonts.gstatic.com/s/googlesans/v62/4UasrENHsxJlGDuGo1OIlJfC6l_24rlCK1Yo_Iqcsih3SAyH6cAwhX9RPi4UvbQoi-Entw.woff2)format('woff2');unicode-range:U+0951-0952,U+0964-0965,U+0C00-0C7F,U+1CDA,U+1CF2,U+200C-200D,U+25CC;}@font-face{font-family:'Google Sans';font-style:normal;font-weight:400;src:url(https://fonts.gstatic.com/s/googlesans/v62/4UasrENHsxJlGDuGo1OIlJfC6l_24rlCK1Yo_Iqcsih3SAyH6cAwhX9RPiYUvbQoi-Entw.woff2)format('woff2');unicode-range:U+02D7,U+0303,U+0331,U+0E01-0E5B,U+200C-200D,U+25CC;}@font-face{font-family:'Google Sans';font-style:normal;font-weight:400;src:url(https://fonts.gstatic.com/s/googlesans/v62/4UasrENHsxJlGDuGo1OIlJfC6l_24rlCK1Yo_Iqcsih3SAyH6cAwhX9RPj0UvbQoi-Entw.woff2)format('woff2');unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+0300-0301,U+0303-0304,U+0308-0309,U+0323,U+0329,U+1EA0-1EF9,U+20AB;}@font-face{font-family:'Google Sans';font-style:normal;font-weight:400;src:url(https://fonts.gstatic.com/s/googlesans/v62/4UasrENHsxJlGDuGo1OIlJfC6l_24rlCK1Yo_Iqcsih3SAyH6cAwhX9RPjwUvbQoi-Entw.woff2)format('woff2');unicode-range:U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF;}@font-face{font-family:'Google Sans';font-style:normal;font-weight:400;src:url(https://fonts.gstatic.com/s/googlesans/v62/4UasrENHsxJlGDuGo1OIlJfC6l_24rlCK1Yo_Iqcsih3SAyH6cAwhX9RPjIUvbQoi-E.woff2)format('woff2');unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD;}@font-face{font-family:'Google Sans';font-style:normal;font-weight:500;src:url(https://fonts.gstatic.com/s/googlesans/v62/4UasrENHsxJlGDuGo1OIlJfC6l_24rlCK1Yo_Iqcsih3SAyH6cAwhX9RPiIUvbQoi-Entw.woff2)format('woff2');unicode-range:U+0308,U+0530-058F,U+2010,U+2024,U+25CC,U+FB13-FB17;}@font-face{font-family:'Google Sans';font-style:normal;font-weight:500;src:url(https://fonts.gstatic.com/s/googlesans/v62/4UasrENHsxJlGDuGo1OIlJfC6l_24rlCK1Yo_Iqcsih3SAyH6cAwhX9RPiAUvbQoi-Entw.woff2)format('woff2');unicode-range:U+0951-0952,U+0964-0965,U+0980-09FE,U+1CD0,U+1CD2,U+1CD5-1CD6,U+1CD8,U+1CE1,U+1CEA,U+1CED,U+1CF2,U+1CF5-1CF7,U+200C-200D,U+20B9,U+25CC,U+A8F1;}@font-face{font-family:'Google Sans';font-style:normal;font-weight:500;src:url(https://fonts.gstatic.com/s/googlesans/v62/4UasrENHsxJlGDuGo1OIlJfC6l_24rlCK1Yo_Iqcsih3SAyH6cAwhX9RPh0UvbQoi-Entw.woff2)format('woff2');unicode-range:U+02C7,U+02D8-02D9,U+02DB,U+0307,U+1400-167F,U+18B0-18F5,U+25CC,U+11AB0-11ABF;}@font-face{font-family:'Google Sans';font-style:normal;font-weight:500;src:url(https://fonts.gstatic.com/s/googlesans/v62/4UasrENHsxJlGDuGo1OIlJfC6l_24rlCK1Yo_Iqcsih3SAyH6cAwhX9RPj8UvbQoi-Entw.woff2)format('woff2');unicode-range:U+0460-052F,U+1C80-1C8A,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F;}@font-face{font-family:'Google Sans';font-style:normal;font-weight:500;src:url(https://fonts.gstatic.com/s/googlesans/v62/4UasrENHsxJlGDuGo1OIlJfC6l_24rlCK1Yo_Iqcsih3SAyH6cAwhX9RPjYUvbQoi-Entw.woff2)format('woff2');unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116;}@font-face{font-family:'Google Sans';font-style:normal;font-weight:500;src:url(https://fonts.gstatic.com/s/googlesans/v62/4UasrENHsxJlGDuGo1OIlJfC6l_24rlCK1Yo_Iqcsih3SAyH6cAwhX9RPjMUvbQoi-Entw.woff2)format('woff2');unicode-range:U+0900-097F,U+1CD0-1CF9,U+200C-200D,U+20A8,U+20B9,U+20F0,U+25CC,U+A830-A839,U+A8E0-A8FF,U+11B00-11B09;}@font-face{font-family:'Google Sans';font-style:normal;font-weight:500;src:url(https://fonts.gstatic.com/s/googlesans/v62/4UasrENHsxJlGDuGo1OIlJfC6l_24rlCK1Yo_Iqcsih3SAyH6cAwhX9RPiMUvbQoi-Entw.woff2)format('woff2');unicode-range:U+030E,U+1200-1399,U+2D80-2DDE,U+AB01-AB2E,U+1E7E0-1E7E6,U+1E7E8-1E7EB,U+1E7ED-1E7EE,U+1E7F0-1E7FE;}@font-face{font-family:'Google Sans';font-style:normal;font-weight:500;src:url(https://fonts.gstatic.com/s/googlesans/v62/4UasrENHsxJlGDuGo1OIlJfC6l_24rlCK1Yo_Iqcsih3SAyH6cAwhX9RPi0UvbQoi-Entw.woff2)format('woff2');unicode-range:U+0589,U+10A0-10FF,U+1C90-1CBA,U+1CBD-1CBF,U+205A,U+2D00-2D2F,U+2E31;}@font-face{font-family:'Google Sans';font-style:normal;font-weight:500;src:url(https://fonts.gstatic.com/s/googlesans/v62/4UasrENHsxJlGDuGo1OIlJfC6l_24rlCK1Yo_Iqcsih3SAyH6cAwhX9RPj4UvbQoi-Entw.woff2)format('woff2');unicode-range:U+1F00-1FFF;}@font-face{font-family:'Google Sans';font-style:normal;font-weight:500;src:url(https://fonts.gstatic.com/s/googlesans/v62/4UasrENHsxJlGDuGo1OIlJfC6l_24rlCK1Yo_Iqcsih3SAyH6cAwhX9RPjEUvbQoi-Entw.woff2)format('woff2');unicode-range:U+0370-0377,U+037A-037F,U+0384-038A,U+038C,U+038E-03A1,U+03A3-03FF;}@font-face{font-family:'Google Sans';font-style:normal;font-weight:500;src:url(https://fonts.gstatic.com/s/googlesans/v62/4UasrENHsxJlGDuGo1OIlJfC6l_24rlCK1Yo_Iqcsih3SAyH6cAwhX9RPikUvbQoi-Entw.woff2)format('woff2');unicode-range:U+0951-0952,U+0964-0965,U+0A80-0AFF,U+200C-200D,U+20B9,U+25CC,U+A830-A839;}@font-face{font-family:'Google Sans';font-style:normal;font-weight:500;src:url(https://fonts.gstatic.com/s/googlesans/v62/4UasrENHsxJlGDuGo1OIlJfC6l_24rlCK1Yo_Iqcsih3SAyH6cAwhX9RPhEUvbQoi-Entw.woff2)format('woff2');unicode-range:U+0951-0952,U+0964-0965,U+0A01-0A76,U+200C-200D,U+20B9,U+25CC,U+262C,U+A830-A839;}@font-face{font-family:'Google Sans';font-style:normal;font-weight:500;src:url(https://fonts.gstatic.com/s/googlesans/v62/4UasrENHsxJlGDuGo1OIlJfC6l_24rlCK1Yo_Iqcsih3SAyH6cAwhX9RPjAUvbQoi-Entw.woff2)format('woff2');unicode-range:U+0307-0308,U+0590-05FF,U+200C-2010,U+20AA,U+25CC,U+FB1D-FB4F;}@font-face{font-family:'Google Sans';font-style:normal;font-weight:500;src:url(https://fonts.gstatic.com/s/googlesans/v62/4UasrENHsxJlGDuGo1OIlJfC6l_24rlCK1Yo_Iqcsih3SAyH6cAwhX9RPjkUvbQoi-Entw.woff2)format('woff2');unicode-range:U+1780-17FF,U+19E0-19FF,U+200C-200D,U+25CC;}@font-face{font-family:'Google Sans';font-style:normal;font-weight:500;src:url(https://fonts.gstatic.com/s/googlesans/v62/4UasrENHsxJlGDuGo1OIlJfC6l_24rlCK1Yo_Iqcsih3SAyH6cAwhX9RPjsUvbQoi-Entw.woff2)format('woff2');unicode-range:U+0E81-0EDF,U+200C-200D,U+25CC;}@font-face{font-family:'Google Sans';font-style:normal;font-weight:500;src:url(https://fonts.gstatic.com/s/googlesans/v62/4UasrENHsxJlGDuGo1OIlJfC6l_24rlCK1Yo_Iqcsih3SAyH6cAwhX9RPioUvbQoi-Entw.woff2)format('woff2');unicode-range:U+0307,U+0323,U+0951-0952,U+0964-0965,U+0D00-0D7F,U+1CDA,U+1CF2,U+200C-200D,U+20B9,U+25CC,U+A830-A832;}@font-face{font-family:'Google Sans';font-style:normal;font-weight:500;src:url(https://fonts.gstatic.com/s/googlesans/v62/4UasrENHsxJlGDuGo1OIlJfC6l_24rlCK1Yo_Iqcsih3SAyH6cAwhX9RPisUvbQoi-Entw.woff2)format('woff2');unicode-range:U+0951-0952,U+0964-0965,U+0B01-0B77,U+1CDA,U+1CF2,U+200C-200D,U+20B9,U+25CC;}@font-face{font-family:'Google Sans';font-style:normal;font-weight:500;src:url(https://fonts.gstatic.com/s/googlesans/v62/4UasrENHsxJlGDuGo1OIlJfC6l_24rlCK1Yo_Iqcsih3SAyH6cAwhX9RPi8UvbQoi-Entw.woff2)format('woff2');unicode-range:U+0964-0965,U+0D81-0DF4,U+1CF2,U+200C-200D,U+25CC,U+111E1-111F4;}@font-face{font-family:'Google Sans';font-style:normal;font-weight:500;src:url(https://fonts.gstatic.com/s/googlesans/v62/4UasrENHsxJlGDuGo1OIlJfC6l_24rlCK1Yo_Iqcsih3SAyH6cAwhX9RPlwUvbQoi-Entw.woff2)format('woff2');unicode-range:U+0001-000C,U+000E-001F,U+007F-009F,U+20DD-20E0,U+20E2-20E4,U+2150-218F,U+2190,U+2192,U+2194-2199,U+21AF,U+21E6-21F0,U+21F3,U+2218-2219,U+2299,U+22C4-22C6,U+2300-243F,U+2440-244A,U+2460-24FF,U+25A0-27BF,U+2800-28FF,U+2921-2922,U+2981,U+29BF,U+29EB,U+2B00-2BFF,U+4DC0-4DFF,U+FFF9-FFFB,U+10140-1018E,U+10190-1019C,U+101A0,U+101D0-101FD,U+102E0-102FB,U+10E60-10E7E,U+1D2C0-1D2D3,U+1D2E0-1D37F,U+1F000-1F0FF,U+1F100-1F1AD,U+1F1E6-1F1FF,U+1F30D-1F30F,U+1F315,U+1F31C,U+1F31E,U+1F320-1F32C,U+1F336,U+1F378,U+1F37D,U+1F382,U+1F393-1F39F,U+1F3A7-1F3A8,U+1F3AC-1F3AF,U+1F3C2,U+1F3C4-1F3C6,U+1F3CA-1F3CE,U+1F3D4-1F3E0,U+1F3ED,U+1F3F1-1F3F3,U+1F3F5-1F3F7,U+1F408,U+1F415,U+1F41F,U+1F426,U+1F43F,U+1F441-1F442,U+1F444,U+1F446-1F449,U+1F44C-1F44E,U+1F453,U+1F46A,U+1F47D,U+1F4A3,U+1F4B0,U+1F4B3,U+1F4B9,U+1F4BB,U+1F4BF,U+1F4C8-1F4CB,U+1F4D6,U+1F4DA,U+1F4DF,U+1F4E3-1F4E6,U+1F4EA-1F4ED,U+1F4F7,U+1F4F9-1F4FB,U+1F4FD-1F4FE,U+1F503,U+1F507-1F50B,U+1F50D,U+1F512-1F513,U+1F53E-1F54A,U+1F54F-1F5FA,U+1F610,U+1F650-1F67F,U+1F687,U+1F68D,U+1F691,U+1F694,U+1F698,U+1F6AD,U+1F6B2,U+1F6B9-1F6BA,U+1F6BC,U+1F6C6-1F6CF,U+1F6D3-1F6D7,U+1F6E0-1F6EA,U+1F6F0-1F6F3,U+1F6F7-1F6FC,U+1F700-1F7FF,U+1F800-1F80B,U+1F810-1F847,U+1F850-1F859,U+1F860-1F887,U+1F890-1F8AD,U+1F8B0-1F8BB,U+1F8C0-1F8C1,U+1F900-1F90B,U+1F93B,U+1F946,U+1F984,U+1F996,U+1F9E9,U+1FA00-1FA6F,U+1FA70-1FA7C,U+1FA80-1FA89,U+1FA8F-1FAC6,U+1FACE-1FADC,U+1FADF-1FAE9,U+1FAF0-1FAF8,U+1FB00-1FBFF;}@font-face{font-family:'Google Sans';font-style:normal;font-weight:500;src:url(https://fonts.gstatic.com/s/googlesans/v62/4UasrENHsxJlGDuGo1OIlJfC6l_24rlCK1Yo_Iqcsih3SAyH6cAwhX9RPiQUvbQoi-Entw.woff2)format('woff2');unicode-range:U+0964-0965,U+0B82-0BFA,U+200C-200D,U+20B9,U+25CC;}@font-face{font-family:'Google Sans';font-style:normal;font-weight:500;src:url(https://fonts.gstatic.com/s/googlesans/v62/4UasrENHsxJlGDuGo1OIlJfC6l_24rlCK1Yo_Iqcsih3SAyH6cAwhX9RPi4UvbQoi-Entw.woff2)format('woff2');unicode-range:U+0951-0952,U+0964-0965,U+0C00-0C7F,U+1CDA,U+1CF2,U+200C-200D,U+25CC;}@font-face{font-family:'Google Sans';font-style:normal;font-weight:500;src:url(https://fonts.gstatic.com/s/googlesans/v62/4UasrENHsxJlGDuGo1OIlJfC6l_24rlCK1Yo_Iqcsih3SAyH6cAwhX9RPiYUvbQoi-Entw.woff2)format('woff2');unicode-range:U+02D7,U+0303,U+0331,U+0E01-0E5B,U+200C-200D,U+25CC;}@font-face{font-family:'Google Sans';font-style:normal;font-weight:500;src:url(https://fonts.gstatic.com/s/googlesans/v62/4UasrENHsxJlGDuGo1OIlJfC6l_24rlCK1Yo_Iqcsih3SAyH6cAwhX9RPj0UvbQoi-Entw.woff2)format('woff2');unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+0300-0301,U+0303-0304,U+0308-0309,U+0323,U+0329,U+1EA0-1EF9,U+20AB;}@font-face{font-family:'Google Sans';font-style:normal;font-weight:500;src:url(https://fonts.gstatic.com/s/googlesans/v62/4UasrENHsxJlGDuGo1OIlJfC6l_24rlCK1Yo_Iqcsih3SAyH6cAwhX9RPjwUvbQoi-Entw.woff2)format('woff2');unicode-range:U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF;}@font-face{font-family:'Google Sans';font-style:normal;font-weight:500;src:url(https://fonts.gstatic.com/s/googlesans/v62/4UasrENHsxJlGDuGo1OIlJfC6l_24rlCK1Yo_Iqcsih3SAyH6cAwhX9RPjIUvbQoi-E.woff2)format('woff2');unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD;}@font-face{font-family:'Google Sans';font-style:normal;font-weight:700;src:url(https://fonts.gstatic.com/s/googlesans/v62/4UasrENHsxJlGDuGo1OIlJfC6l_24rlCK1Yo_Iqcsih3SAyH6cAwhX9RPiIUvbQoi-Entw.woff2)format('woff2');unicode-range:U+0308,U+0530-058F,U+2010,U+2024,U+25CC,U+FB13-FB17;}@font-face{font-family:'Google Sans';font-style:normal;font-weight:700;src:url(https://fonts.gstatic.com/s/googlesans/v62/4UasrENHsxJlGDuGo1OIlJfC6l_24rlCK1Yo_Iqcsih3SAyH6cAwhX9RPiAUvbQoi-Entw.woff2)format('woff2');unicode-range:U+0951-0952,U+0964-0965,U+0980-09FE,U+1CD0,U+1CD2,U+1CD5-1CD6,U+1CD8,U+1CE1,U+1CEA,U+1CED,U+1CF2,U+1CF5-1CF7,U+200C-200D,U+20B9,U+25CC,U+A8F1;}@font-face{font-family:'Google Sans';font-style:normal;font-weight:700;src:url(https://fonts.gstatic.com/s/googlesans/v62/4UasrENHsxJlGDuGo1OIlJfC6l_24rlCK1Yo_Iqcsih3SAyH6cAwhX9RPh0UvbQoi-Entw.woff2)format('woff2');unicode-range:U+02C7,U+02D8-02D9,U+02DB,U+0307,U+1400-167F,U+18B0-18F5,U+25CC,U+11AB0-11ABF;}@font-face{font-family:'Google Sans';font-style:normal;font-weight:700;src:url(https://fonts.gstatic.com/s/googlesans/v62/4UasrENHsxJlGDuGo1OIlJfC6l_24rlCK1Yo_Iqcsih3SAyH6cAwhX9RPj8UvbQoi-Entw.woff2)format('woff2');unicode-range:U+0460-052F,U+1C80-1C8A,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F;}@font-face{font-family:'Google Sans';font-style:normal;font-weight:700;src:url(https://fonts.gstatic.com/s/googlesans/v62/4UasrENHsxJlGDuGo1OIlJfC6l_24rlCK1Yo_Iqcsih3SAyH6cAwhX9RPjYUvbQoi-Entw.woff2)format('woff2');unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116;}@font-face{font-family:'Google Sans';font-style:normal;font-weight:700;src:url(https://fonts.gstatic.com/s/googlesans/v62/4UasrENHsxJlGDuGo1OIlJfC6l_24rlCK1Yo_Iqcsih3SAyH6cAwhX9RPjMUvbQoi-Entw.woff2)format('woff2');unicode-range:U+0900-097F,U+1CD0-1CF9,U+200C-200D,U+20A8,U+20B9,U+20F0,U+25CC,U+A830-A839,U+A8E0-A8FF,U+11B00-11B09;}@font-face{font-family:'Google Sans';font-style:normal;font-weight:700;src:url(https://fonts.gstatic.com/s/googlesans/v62/4UasrENHsxJlGDuGo1OIlJfC6l_24rlCK1Yo_Iqcsih3SAyH6cAwhX9RPiMUvbQoi-Entw.woff2)format('woff2');unicode-range:U+030E,U+1200-1399,U+2D80-2DDE,U+AB01-AB2E,U+1E7E0-1E7E6,U+1E7E8-1E7EB,U+1E7ED-1E7EE,U+1E7F0-1E7FE;}@font-face{font-family:'Google Sans';font-style:normal;font-weight:700;src:url(https://fonts.gstatic.com/s/googlesans/v62/4UasrENHsxJlGDuGo1OIlJfC6l_24rlCK1Yo_Iqcsih3SAyH6cAwhX9RPi0UvbQoi-Entw.woff2)format('woff2');unicode-range:U+0589,U+10A0-10FF,U+1C90-1CBA,U+1CBD-1CBF,U+205A,U+2D00-2D2F,U+2E31;}@font-face{font-family:'Google Sans';font-style:normal;font-weight:700;src:url(https://fonts.gstatic.com/s/googlesans/v62/4UasrENHsxJlGDuGo1OIlJfC6l_24rlCK1Yo_Iqcsih3SAyH6cAwhX9RPj4UvbQoi-Entw.woff2)format('woff2');unicode-range:U+1F00-1FFF;}@font-face{font-family:'Google Sans';font-style:normal;font-weight:700;src:url(https://fonts.gstatic.com/s/googlesans/v62/4UasrENHsxJlGDuGo1OIlJfC6l_24rlCK1Yo_Iqcsih3SAyH6cAwhX9RPjEUvbQoi-Entw.woff2)format('woff2');unicode-range:U+0370-0377,U+037A-037F,U+0384-038A,U+038C,U+038E-03A1,U+03A3-03FF;}@font-face{font-family:'Google Sans';font-style:normal;font-weight:700;src:url(https://fonts.gstatic.com/s/googlesans/v62/4UasrENHsxJlGDuGo1OIlJfC6l_24rlCK1Yo_Iqcsih3SAyH6cAwhX9RPikUvbQoi-Entw.woff2)format('woff2');unicode-range:U+0951-0952,U+0964-0965,U+0A80-0AFF,U+200C-200D,U+20B9,U+25CC,U+A830-A839;}@font-face{font-family:'Google Sans';font-style:normal;font-weight:700;src:url(https://fonts.gstatic.com/s/googlesans/v62/4UasrENHsxJlGDuGo1OIlJfC6l_24rlCK1Yo_Iqcsih3SAyH6cAwhX9RPhEUvbQoi-Entw.woff2)format('woff2');unicode-range:U+0951-0952,U+0964-0965,U+0A01-0A76,U+200C-200D,U+20B9,U+25CC,U+262C,U+A830-A839;}@font-face{font-family:'Google Sans';font-style:normal;font-weight:700;src:url(https://fonts.gstatic.com/s/googlesans/v62/4UasrENHsxJlGDuGo1OIlJfC6l_24rlCK1Yo_Iqcsih3SAyH6cAwhX9RPjAUvbQoi-Entw.woff2)format('woff2');unicode-range:U+0307-0308,U+0590-05FF,U+200C-2010,U+20AA,U+25CC,U+FB1D-FB4F;}@font-face{font-family:'Google Sans';font-style:normal;font-weight:700;src:url(https://fonts.gstatic.com/s/googlesans/v62/4UasrENHsxJlGDuGo1OIlJfC6l_24rlCK1Yo_Iqcsih3SAyH6cAwhX9RPjkUvbQoi-Entw.woff2)format('woff2');unicode-range:U+1780-17FF,U+19E0-19FF,U+200C-200D,U+25CC;}@font-face{font-family:'Google Sans';font-style:normal;font-weight:700;src:url(https://fonts.gstatic.com/s/googlesans/v62/4UasrENHsxJlGDuGo1OIlJfC6l_24rlCK1Yo_Iqcsih3SAyH6cAwhX9RPjsUvbQoi-Entw.woff2)format('woff2');unicode-range:U+0E81-0EDF,U+200C-200D,U+25CC;}@font-face{font-family:'Google Sans';font-style:normal;font-weight:700;src:url(https://fonts.gstatic.com/s/googlesans/v62/4UasrENHsxJlGDuGo1OIlJfC6l_24rlCK1Yo_Iqcsih3SAyH6cAwhX9RPioUvbQoi-Entw.woff2)format('woff2');unicode-range:U+0307,U+0323,U+0951-0952,U+0964-0965,U+0D00-0D7F,U+1CDA,U+1CF2,U+200C-200D,U+20B9,U+25CC,U+A830-A832;}@font-face{font-family:'Google Sans';font-style:normal;font-weight:700;src:url(https://fonts.gstatic.com/s/googlesans/v62/4UasrENHsxJlGDuGo1OIlJfC6l_24rlCK1Yo_Iqcsih3SAyH6cAwhX9RPisUvbQoi-Entw.woff2)format('woff2');unicode-range:U+0951-0952,U+0964-0965,U+0B01-0B77,U+1CDA,U+1CF2,U+200C-200D,U+20B9,U+25CC;}@font-face{font-family:'Google Sans';font-style:normal;font-weight:700;src:url(https://fonts.gstatic.com/s/googlesans/v62/4UasrENHsxJlGDuGo1OIlJfC6l_24rlCK1Yo_Iqcsih3SAyH6cAwhX9RPi8UvbQoi-Entw.woff2)format('woff2');unicode-range:U+0964-0965,U+0D81-0DF4,U+1CF2,U+200C-200D,U+25CC,U+111E1-111F4;}@font-face{font-family:'Google Sans';font-style:normal;font-weight:700;src:url(https://fonts.gstatic.com/s/googlesans/v62/4UasrENHsxJlGDuGo1OIlJfC6l_24rlCK1Yo_Iqcsih3SAyH6cAwhX9RPlwUvbQoi-Entw.woff2)format('woff2');unicode-range:U+0001-000C,U+000E-001F,U+007F-009F,U+20DD-20E0,U+20E2-20E4,U+2150-218F,U+2190,U+2192,U+2194-2199,U+21AF,U+21E6-21F0,U+21F3,U+2218-2219,U+2299,U+22C4-22C6,U+2300-243F,U+2440-244A,U+2460-24FF,U+25A0-27BF,U+2800-28FF,U+2921-2922,U+2981,U+29BF,U+29EB,U+2B00-2BFF,U+4DC0-4DFF,U+FFF9-FFFB,U+10140-1018E,U+10190-1019C,U+101A0,U+101D0-101FD,U+102E0-102FB,U+10E60-10E7E,U+1D2C0-1D2D3,U+1D2E0-1D37F,U+1F000-1F0FF,U+1F100-1F1AD,U+1F1E6-1F1FF,U+1F30D-1F30F,U+1F315,U+1F31C,U+1F31E,U+1F320-1F32C,U+1F336,U+1F378,U+1F37D,U+1F382,U+1F393-1F39F,U+1F3A7-1F3A8,U+1F3AC-1F3AF,U+1F3C2,U+1F3C4-1F3C6,U+1F3CA-1F3CE,U+1F3D4-1F3E0,U+1F3ED,U+1F3F1-1F3F3,U+1F3F5-1F3F7,U+1F408,U+1F415,U+1F41F,U+1F426,U+1F43F,U+1F441-1F442,U+1F444,U+1F446-1F449,U+1F44C-1F44E,U+1F453,U+1F46A,U+1F47D,U+1F4A3,U+1F4B0,U+1F4B3,U+1F4B9,U+1F4BB,U+1F4BF,U+1F4C8-1F4CB,U+1F4D6,U+1F4DA,U+1F4DF,U+1F4E3-1F4E6,U+1F4EA-1F4ED,U+1F4F7,U+1F4F9-1F4FB,U+1F4FD-1F4FE,U+1F503,U+1F507-1F50B,U+1F50D,U+1F512-1F513,U+1F53E-1F54A,U+1F54F-1F5FA,U+1F610,U+1F650-1F67F,U+1F687,U+1F68D,U+1F691,U+1F694,U+1F698,U+1F6AD,U+1F6B2,U+1F6B9-1F6BA,U+1F6BC,U+1F6C6-1F6CF,U+1F6D3-1F6D7,U+1F6E0-1F6EA,U+1F6F0-1F6F3,U+1F6F7-1F6FC,U+1F700-1F7FF,U+1F800-1F80B,U+1F810-1F847,U+1F850-1F859,U+1F860-1F887,U+1F890-1F8AD,U+1F8B0-1F8BB,U+1F8C0-1F8C1,U+1F900-1F90B,U+1F93B,U+1F946,U+1F984,U+1F996,U+1F9E9,U+1FA00-1FA6F,U+1FA70-1FA7C,U+1FA80-1FA89,U+1FA8F-1FAC6,U+1FACE-1FADC,U+1FADF-1FAE9,U+1FAF0-1FAF8,U+1FB00-1FBFF;}@font-face{font-family:'Google Sans';font-style:normal;font-weight:700;src:url(https://fonts.gstatic.com/s/googlesans/v62/4UasrENHsxJlGDuGo1OIlJfC6l_24rlCK1Yo_Iqcsih3SAyH6cAwhX9RPiQUvbQoi-Entw.woff2)format('woff2');unicode-range:U+0964-0965,U+0B82-0BFA,U+200C-200D,U+20B9,U+25CC;}@font-face{font-family:'Google Sans';font-style:normal;font-weight:700;src:url(https://fonts.gstatic.com/s/googlesans/v62/4UasrENHsxJlGDuGo1OIlJfC6l_24rlCK1Yo_Iqcsih3SAyH6cAwhX9RPi4UvbQoi-Entw.woff2)format('woff2');unicode-range:U+0951-0952,U+0964-0965,U+0C00-0C7F,U+1CDA,U+1CF2,U+200C-200D,U+25CC;}@font-face{font-family:'Google Sans';font-style:normal;font-weight:700;src:url(https://fonts.gstatic.com/s/googlesans/v62/4UasrENHsxJlGDuGo1OIlJfC6l_24rlCK1Yo_Iqcsih3SAyH6cAwhX9RPiYUvbQoi-Entw.woff2)format('woff2');unicode-range:U+02D7,U+0303,U+0331,U+0E01-0E5B,U+200C-200D,U+25CC;}@font-face{font-family:'Google Sans';font-style:normal;font-weight:700;src:url(https://fonts.gstatic.com/s/googlesans/v62/4UasrENHsxJlGDuGo1OIlJfC6l_24rlCK1Yo_Iqcsih3SAyH6cAwhX9RPj0UvbQoi-Entw.woff2)format('woff2');unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+0300-0301,U+0303-0304,U+0308-0309,U+0323,U+0329,U+1EA0-1EF9,U+20AB;}@font-face{font-family:'Google Sans';font-style:normal;font-weight:700;src:url(https://fonts.gstatic.com/s/googlesans/v62/4UasrENHsxJlGDuGo1OIlJfC6l_24rlCK1Yo_Iqcsih3SAyH6cAwhX9RPjwUvbQoi-Entw.woff2)format('woff2');unicode-range:U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF;}@font-face{font-family:'Google Sans';font-style:normal;font-weight:700;src:url(https://fonts.gstatic.com/s/googlesans/v62/4UasrENHsxJlGDuGo1OIlJfC6l_24rlCK1Yo_Iqcsih3SAyH6cAwhX9RPjIUvbQoi-E.woff2)format('woff2');unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD;}@font-face{font-family:'Google Sans Display';font-style:normal;font-weight:400;src:url(https://fonts.gstatic.com/s/googlesansdisplay/v13/ea8FacM9Wef3EJPWRrHjgE4B6CnlZxHVDvr9oT3ZQZRENA.woff2)format('woff2');unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116;}@font-face{font-family:'Google Sans Display';font-style:normal;font-weight:400;src:url(https://fonts.gstatic.com/s/googlesansdisplay/v13/ea8FacM9Wef3EJPWRrHjgE4B6CnlZxHVDv39oT3ZQZRENA.woff2)format('woff2');unicode-range:U+0370-0377,U+037A-037F,U+0384-038A,U+038C,U+038E-03A1,U+03A3-03FF;}@font-face{font-family:'Google Sans Display';font-style:normal;font-weight:400;src:url(https://fonts.gstatic.com/s/googlesansdisplay/v13/ea8FacM9Wef3EJPWRrHjgE4B6CnlZxHVDvH9oT3ZQZRENA.woff2)format('woff2');unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+0300-0301,U+0303-0304,U+0308-0309,U+0323,U+0329,U+1EA0-1EF9,U+20AB;}@font-face{font-family:'Google Sans Display';font-style:normal;font-weight:400;src:url(https://fonts.gstatic.com/s/googlesansdisplay/v13/ea8FacM9Wef3EJPWRrHjgE4B6CnlZxHVDvD9oT3ZQZRENA.woff2)format('woff2');unicode-range:U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF;}@font-face{font-family:'Google Sans Display';font-style:normal;font-weight:400;src:url(https://fonts.gstatic.com/s/googlesansdisplay/v13/ea8FacM9Wef3EJPWRrHjgE4B6CnlZxHVDv79oT3ZQZQ.woff2)format('woff2');unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD;}@font-face{font-family:'Google Sans Display';font-style:normal;font-weight:500;src:url(https://fonts.gstatic.com/s/googlesansdisplay/v13/ea8IacM9Wef3EJPWRrHjgE4B6CnlZxHVBg3etBT7TL5-PQEKcA.woff2)format('woff2');unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116;}@font-face{font-family:'Google Sans Display';font-style:normal;font-weight:500;src:url(https://fonts.gstatic.com/s/googlesansdisplay/v13/ea8IacM9Wef3EJPWRrHjgE4B6CnlZxHVBg3etBP7TL5-PQEKcA.woff2)format('woff2');unicode-range:U+0370-0377,U+037A-037F,U+0384-038A,U+038C,U+038E-03A1,U+03A3-03FF;}@font-face{font-family:'Google Sans Display';font-style:normal;font-weight:500;src:url(https://fonts.gstatic.com/s/googlesansdisplay/v13/ea8IacM9Wef3EJPWRrHjgE4B6CnlZxHVBg3etB_7TL5-PQEKcA.woff2)format('woff2');unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+0300-0301,U+0303-0304,U+0308-0309,U+0323,U+0329,U+1EA0-1EF9,U+20AB;}@font-face{font-family:'Google Sans Display';font-style:normal;font-weight:500;src:url(https://fonts.gstatic.com/s/googlesansdisplay/v13/ea8IacM9Wef3EJPWRrHjgE4B6CnlZxHVBg3etB77TL5-PQEKcA.woff2)format('woff2');unicode-range:U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF;}@font-face{font-family:'Google Sans Display';font-style:normal;font-weight:500;src:url(https://fonts.gstatic.com/s/googlesansdisplay/v13/ea8IacM9Wef3EJPWRrHjgE4B6CnlZxHVBg3etBD7TL5-PQE.woff2)format('woff2');unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD;}@font-face{font-family:'Google Sans Display';font-style:normal;font-weight:700;src:url(https://fonts.gstatic.com/s/googlesansdisplay/v13/ea8IacM9Wef3EJPWRrHjgE4B6CnlZxHVBkXYtBT7TL5-PQEKcA.woff2)format('woff2');unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116;}@font-face{font-family:'Google Sans Display';font-style:normal;font-weight:700;src:url(https://fonts.gstatic.com/s/googlesansdisplay/v13/ea8IacM9Wef3EJPWRrHjgE4B6CnlZxHVBkXYtBP7TL5-PQEKcA.woff2)format('woff2');unicode-range:U+0370-0377,U+037A-037F,U+0384-038A,U+038C,U+038E-03A1,U+03A3-03FF;}@font-face{font-family:'Google Sans Display';font-style:normal;font-weight:700;src:url(https://fonts.gstatic.com/s/googlesansdisplay/v13/ea8IacM9Wef3EJPWRrHjgE4B6CnlZxHVBkXYtB_7TL5-PQEKcA.woff2)format('woff2');unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+0300-0301,U+0303-0304,U+0308-0309,U+0323,U+0329,U+1EA0-1EF9,U+20AB;}@font-face{font-family:'Google Sans Display';font-style:normal;font-weight:700;src:url(https://fonts.gstatic.com/s/googlesansdisplay/v13/ea8IacM9Wef3EJPWRrHjgE4B6CnlZxHVBkXYtB77TL5-PQEKcA.woff2)format('woff2');unicode-range:U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF;}@font-face{font-family:'Google Sans Display';font-style:normal;font-weight:700;src:url(https://fonts.gstatic.com/s/googlesansdisplay/v13/ea8IacM9Wef3EJPWRrHjgE4B6CnlZxHVBkXYtBD7TL5-PQE.woff2)format('woff2');unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD;}@font-face{font-family:'Google Symbols';font-style:normal;font-weight:400;src:url(https://fonts.gstatic.com/l/font?kit=HhzMU5Ak9u-oMExPeInvcuEmPosC9zyteYEFU68cPrjdKM1XLPTxlGmzczpgWvF1d8Yp7AudBnt3CPar1JFWjoLAUv3G-tSNljixIIGUsC62cYrKiAwGax-fp9PtdVq68d0yHSjUy2BdPvfEJ2rDQwn79OOKv3UwEzsxQ4hmXu95&skey=f8ec4d50247dc1c1&v=v456)format('woff2');}.google-symbols{font-family:'Google Symbols';font-weight:normal;font-style:normal;font-size:24px;line-height:1;letter-spacing:normal;text-transform:none;display:inline-block;white-space:nowrap;word-wrap:normal;direction:ltr;-webkit-font-feature-settings:'liga';-webkit-font-smoothing:antialiased;}</style><script nonce="ukEud-BIIo14C235ZP9QwA">(function(){'use strict';function g(){var a=k,b=0;return function(){return b<a.length?{done:!1,value:a[b++]}:{done:!0}}};/*
|
||
|
||
Copyright The Closure Library Authors.
|
||
SPDX-License-Identifier: Apache-2.0
|
||
*/
|
||
var l=this||self;/*
|
||
|
||
Copyright 2024 Google, Inc
|
||
SPDX-License-Identifier: MIT
|
||
*/
|
||
var m=["focus","blur","error","load","toggle"];function n(a){return a==="mouseenter"?"mouseover":a==="mouseleave"?"mouseout":a==="pointerenter"?"pointerover":a==="pointerleave"?"pointerout":a};function p(a){this.l={};this.m={};this.j=null;this.i=[];this.o=a}p.prototype.handleEvent=function(a,b,c){q(this,{eventType:a,event:b,targetElement:b.target,eic:c,timeStamp:Date.now(),eia:void 0,eirp:void 0,eiack:void 0})};function q(a,b){if(a.j)a.j(b);else{b.eirp=!0;var c;(c=a.i)==null||c.push(b)}}
|
||
function r(a,b,c){if(!(b in a.l)&&a.o){var e=function(f,d,B){a.handleEvent(f,d,B)};a.l[b]=e;c=n(c||b);if(c!==b){var h=a.m[c]||[];h.push(b);a.m[c]=h}a.o.addEventListener(c,function(f){return function(d){e(b,d,f)}},void 0)}}p.prototype.handler=function(a){return this.l[a]};p.prototype.ecrd=function(a){this.j=a;var b;if((b=this.i)==null?0:b.length){for(a=0;a<this.i.length;a++)q(this,this.i[a]);this.i=null}};function t(a){this.element=a;this.i=[]}t.prototype.addEventListener=function(a,b,c){var e=this.i,h=e.push,f=this.element;b=b(this.element);var d=!1;m.indexOf(a)>=0&&(d=!0);f.addEventListener(a,b,typeof c==="boolean"?{capture:d,passive:c}:d);h.call(e,{eventType:a,handler:b,capture:d,passive:c})};var k="click dblclick focus focusin blur error focusout keydown keyup keypress load mouseover mouseout mouseenter mouseleave mousemove submit toggle touchstart touchend touchmove touchcancel auxclick change compositionstart compositionupdate compositionend beforeinput input select selectstart textinput copy cut paste mousedown mouseup wheel contextmenu dragover dragenter dragleave drop dragstart dragend pointerdown pointermove pointerup pointercancel pointerenter pointerleave pointerover pointerout gotpointercapture lostpointercapture ended loadedmetadata pagehide pageshow visibilitychange beforematch".split(" ");
|
||
if(!(k instanceof Array)){var u;var v=typeof Symbol!="undefined"&&Symbol.iterator&&k[Symbol.iterator];if(v)u=v.call(k);else if(typeof k.length=="number")u={next:g()};else throw Error(String(k)+" is not an iterable or ArrayLike");for(var w,x=[];!(w=u.next()).done;)x.push(w.value)};var y=function(a){return{trigger:function(b){var c=a.handler(b.type);c||(r(a,b.type),c=a.handler(b.type));var e=b.target||b.srcElement;c&&c(b.type,b,e.ownerDocument.documentElement)},configure:function(b){b(a)}}}(function(){var a=window,b=new t(a.document.documentElement),c=new p(b);k.forEach(function(d){return r(c,d)});var e,h,f;"onwebkitanimationend"in a&&(e="webkitAnimationEnd");r(c,"animationend",e);"onwebkitanimationstart"in a&&(h="webkitAnimationStart");r(c,"animationstart",h);r(c,"animationcancel");
|
||
"onwebkittransitionend"in a&&(f="webkitTransitionEnd");r(c,"transitionend",f);return{u:c,container:b}}().u),z=["BOQ_wizbind"],A=window||l,C;for(;z.length&&(C=z.shift());)z.length||y===void 0?A[C]&&A[C]!==Object.prototype[C]?A=A[C]:A=A[C]={}:A[C]=y;}).call(this);
|
||
</script><script noCollect src="https://www.gstatic.com/_/mss/boq-cloudx-web-blog/_/js/k=boq-cloudx-web-blog.TransformBlogUi.en_US.wJiMbTLBlzA.2018.O/am=AAAAAACZ/d=1/excm=_b,_tp,articleview/ed=1/dg=0/wt=2/ujg=1/rs=AHrnUqVxHxeZ_6gyIm6jL7m-uySGzhDRDQ/dti=1/m=_b,_tp" defer id="base-js" fetchpriority="high" nonce="ukEud-BIIo14C235ZP9QwA"></script><script nonce="ukEud-BIIo14C235ZP9QwA">if (window.BOQ_loadedInitialJS) {onJsLoad();} else {document.getElementById('base-js').addEventListener('load', onJsLoad, false);}</script><script nonce="ukEud-BIIo14C235ZP9QwA">
|
||
window['_wjdc'] = function (d) {window['_wjdd'] = d};
|
||
</script><link rel="alternate" type="application/rss+xml" title="Google Cloud" href="https://cloudblog.withgoogle.com/products/gcp/rss"><title>What DBAs need to know about Cloud Spanner: Keys and indexes | Google Cloud Blog</title><meta name="description" content="Learn the dos-and-don'ts, best practices and why things are different in Cloud Spanner."><meta name="robots" content="max-image-preview:large"><meta property="og:title" content="What DBAs need to know about Cloud Spanner: Keys and indexes | Google Cloud Blog"><meta property="og:type" content="website"><meta property="og:url" content="https://cloud.google.com/blog/products/gcp/what-dbas-need-to-know-about-cloud-spanner-part-1-keys-and-indexes"><meta property="og:image" content="https://storage.googleapis.com/gweb-cloudblog-publish/images/15_-_Google_Cloud_2fKuG6b.max-2600x2600.jpg"><meta property="og:description" content="Learn the dos-and-don'ts, best practices and why things are different in Cloud Spanner."><meta property="og:site_name" content="Google Cloud Blog"><meta name="twitter:card" content="summary_large_image"><meta name="twitter:url" content="https://cloud.google.com/blog/products/gcp/what-dbas-need-to-know-about-cloud-spanner-part-1-keys-and-indexes"><meta name="twitter:title" content="What DBAs need to know about Cloud Spanner: Keys and indexes | Google Cloud Blog"><meta name="twitter:description" content="Learn the dos-and-don'ts, best practices and why things are different in Cloud Spanner."><meta name="twitter:image" content="https://storage.googleapis.com/gweb-cloudblog-publish/images/15_-_Google_Cloud_2fKuG6b.max-2600x2600.jpg"><meta name="twitter:site" content="@googlecloud"><script type="application/ld+json">{"@context":"https://schema.org","@type":"BlogPosting","@id":"https://cloud.google.com/blog/products/gcp/what-dbas-need-to-know-about-cloud-spanner-part-1-keys-and-indexes","headline":"What DBAs need to know about Cloud Spanner: Keys and indexes","description":"Learn the dos-and-don\u0027ts, best practices and why things are different in Cloud Spanner.","image":"https://storage.googleapis.com/gweb-cloudblog-publish/images/15_-_Google_Cloud_2fKuG6b.max-2600x2600.jpg","author":[{"@type":"Person","name":"Niel Markwick","url":""},{"@type":"Person","name":"Robert Saxby","url":""}],"datePublished":"2018-06-07","publisher":{"@type":"Organization","name":"Google Cloud","logo":{"@type":"ImageObject","url":"https://www.gstatic.com/cgc/google-cloud-logo.svg"}},"url":"https://cloud.google.com/blog/products/gcp/what-dbas-need-to-know-about-cloud-spanner-part-1-keys-and-indexes","keywords":["Google Cloud","Databases","Solutions and How-to\u0027s","Spanner"],"timeRequired":"PT13M"}</script><link rel="canonical" href="https://cloud.google.com/blog/products/gcp/what-dbas-need-to-know-about-cloud-spanner-part-1-keys-and-indexes/"><meta name="track-metadata-page_post_title" content="What DBAs need to know about Cloud Spanner: Keys and indexes"><meta name="track-metadata-page_post_labels" content="Google Cloud"><meta name="track-metadata-page_first_published" content="2018-06-14 19:06:00"><meta name="published_time" content="2018-06-14T19:49:22-0700"><meta name="track-metadata-page_last_published" content="2018-06-07 13:06:00"><meta name="track-metadata-page_post_author" content="Niel Markwick"><meta name="track-metadata-page_post_author_role" content="Solutions Architect"><meta name="authors" content="Niel Markwick,Robert Saxby"><meta name="page" content="36622"><meta name="locale" content="en"><meta name="content_type" content="blog.articlepage"><meta name="tags" content="Google Cloud,Databases,Solutions and How-to's,Spanner"><meta name="read_duration" content="13"><header jsaction="rcuQ6b:npT2md" jscontroller="o60eef" class="glue-header nRhiJb-tJHJj-OWXEXe-kFx1Ae" id="kO001e"><a href="./#content" class="glue-header__link glue-header__skip-content">Jump to Content</a><div class="glue-header__bar glue-header__bar--mobile DFb9Jf" track-metadata-module="header"><div class="nRhiJb-mb9u9d"><div class="glue-header__container JF2WI"><div class="nRhiJb-o2XRw-yHKmmc lUwpmd"><div class="nRhiJb-rSCjMe"><a class="nRhiJb-rSCjMe-hSRGPd" href="https://cloud.google.com/" title="Google Cloud" track-name="google cloud"track-type="blog nav"track-metadata-position="nav"track-metadata-eventdetail="cloud.google.com/"track-metadata-module="header"><div class="nRhiJb-rSCjMe-haAclf"><svg class="glue-header__logo-svg" viewBox="0 0 74 24" role="presentation" aria-hidden="true"><path fill="#4285F4" d="M9.24 8.19v2.46h5.88c-.18 1.38-.64 2.39-1.34 3.1-.86.86-2.2 1.8-4.54 1.8-3.62 0-6.45-2.92-6.45-6.54s2.83-6.54 6.45-6.54c1.95 0 3.38.77 4.43 1.76L15.4 2.5C13.94 1.08 11.98 0 9.24 0 4.28 0 .11 4.04.11 9s4.17 9 9.13 9c2.68 0 4.7-.88 6.28-2.52 1.62-1.62 2.13-3.91 2.13-5.75 0-.57-.04-1.1-.13-1.54H9.24z"></path><path fill="#EA4335" d="M25 6.19c-3.21 0-5.83 2.44-5.83 5.81 0 3.34 2.62 5.81 5.83 5.81s5.83-2.46 5.83-5.81c0-3.37-2.62-5.81-5.83-5.81zm0 9.33c-1.76 0-3.28-1.45-3.28-3.52 0-2.09 1.52-3.52 3.28-3.52s3.28 1.43 3.28 3.52c0 2.07-1.52 3.52-3.28 3.52z"></path><path fill="#4285F4" d="M53.58 7.49h-.09c-.57-.68-1.67-1.3-3.06-1.3C47.53 6.19 45 8.72 45 12c0 3.26 2.53 5.81 5.43 5.81 1.39 0 2.49-.62 3.06-1.32h.09v.81c0 2.22-1.19 3.41-3.1 3.41-1.56 0-2.53-1.12-2.93-2.07l-2.22.92c.64 1.54 2.33 3.43 5.15 3.43 2.99 0 5.52-1.76 5.52-6.05V6.49h-2.42v1zm-2.93 8.03c-1.76 0-3.1-1.5-3.1-3.52 0-2.05 1.34-3.52 3.1-3.52 1.74 0 3.1 1.5 3.1 3.54.01 2.03-1.36 3.5-3.1 3.5z"></path><path fill="#FBBC05" d="M38 6.19c-3.21 0-5.83 2.44-5.83 5.81 0 3.34 2.62 5.81 5.83 5.81s5.83-2.46 5.83-5.81c0-3.37-2.62-5.81-5.83-5.81zm0 9.33c-1.76 0-3.28-1.45-3.28-3.52 0-2.09 1.52-3.52 3.28-3.52s3.28 1.43 3.28 3.52c0 2.07-1.52 3.52-3.28 3.52z"></path><path fill="#34A853" d="M58 .24h2.51v17.57H58z"></path><path fill="#EA4335" d="M68.26 15.52c-1.3 0-2.22-.59-2.82-1.76l7.77-3.21-.26-.66c-.48-1.3-1.96-3.7-4.97-3.7-2.99 0-5.48 2.35-5.48 5.81 0 3.26 2.46 5.81 5.76 5.81 2.66 0 4.2-1.63 4.84-2.57l-1.98-1.32c-.66.96-1.56 1.6-2.86 1.6zm-.18-7.15c1.03 0 1.91.53 2.2 1.28l-5.25 2.17c0-2.44 1.73-3.45 3.05-3.45z"></path></svg></div><span class="nRhiJb-rSCjMe-OWXEXe-UBMNlb khBwGd">Cloud</span></a></div></div><div class="glue-header__hamburger s6BfRd"><button class="glue-header__drawer-toggle-btn" aria-label="Open the navigation drawer"><svg class="nRhiJb-Bz112c nRhiJb-Bz112c-OWXEXe-xgZe3c" viewBox="0 0 24 24" role="presentation" aria-hidden="true"><path d="M3 18h18v-2H3v2zm0-5h18v-2H3v2zm0-7v2h18V6H3z"></path></svg></button></div><div class="nRhiJb-o2XRw-yHKmmc UrjqX"><div class="nRhiJb-rSCjMe"><a class="nRhiJb-rSCjMe-hSRGPd" href="https://cloud.google.com/blog/" title="Google Cloud Blog" track-name="blog"track-type="blog nav"track-metadata-position="nav"track-metadata-eventdetail="cloud.google.com/blog/"track-metadata-module="header"><span class="nRhiJb-rSCjMe-OWXEXe-UBMNlb khBwGd">Blog</span></a></div></div></div><div class="glue-header__container ca6rub"><div class="nRhiJb-GUI8l"><a class="nRhiJb-LgbsSe nRhiJb-LgbsSe-OWXEXe-pSzOP-o6Shpd " href="https://cloud.google.com/contact/" track-name="contact sales"track-type="blog nav"track-metadata-eventdetail="cloud.google.com/contact/"track-metadata-module="header" track-name="contact sales"track-type="button"track-metadata-position="nav"track-metadata-eventdetail="cloud.google.com/contact/">Contact sales </a><a class="nRhiJb-LgbsSe nRhiJb-LgbsSe-OWXEXe-CNusmb-o6Shpd " href="https://console.cloud.google.com/freetrial/" track-name="get started for free"track-type="blog nav"track-metadata-eventdetail="console.cloud.google.com/freetrial/"track-metadata-module="header" track-name="get started for free"track-type="button"track-metadata-position="nav"track-metadata-eventdetail="console.cloud.google.com/freetrial/">Get started for free </a></div><div class="GKI4ub"><div class="Jhiezd"><form action="/blog/search/" class="A2C6Ob"><input class="BAhdXd" jsname="oJAbI" name="query" type="text" placeholder="Find an article..."><input type="hidden" name="language" value=en hidden><input type="hidden" name="category" value=article hidden><input type="hidden" name="paginate" value="25" hidden><input type="hidden" name="order" value="newest" hidden><input type="hidden" name="hl" value=en hidden><span class="A0lwXc" jsname="D8MWrd" aria-label="Show the search input field." role="button" jsaction="click:jUF4E"><svg class="nRhiJb-Bz112c nRhiJb-Bz112c-OWXEXe-xgZe3c" viewBox="0 0 24 24" role="presentation" aria-hidden="true" width="40" height="22"><path d="M20.49 19l-5.73-5.73C15.53 12.2 16 10.91 16 9.5A6.5 6.5 0 1 0 9.5 16c1.41 0 2.7-.47 3.77-1.24L19 20.49 20.49 19zM5 9.5C5 7.01 7.01 5 9.5 5S14 7.01 14 9.5 11.99 14 9.5 14 5 11.99 5 9.5z"></path></svg></span></form></div></div></div></div></div><div class="glue-header__bar glue-header__bar--desktop glue-header__drawer YcctDe" track-metadata-module="header"><div class="nRhiJb-mb9u9d M7RUq"><div class="glue-header__container JF2WI"><div class="nRhiJb-o2XRw-yHKmmc lUwpmd"><div class="nRhiJb-rSCjMe"><a class="nRhiJb-rSCjMe-hSRGPd" href="https://cloud.google.com/" title="Google Cloud" track-name="google cloud"track-type="blog nav"track-metadata-position="nav"track-metadata-eventdetail="cloud.google.com/"track-metadata-module="header"><div class="nRhiJb-rSCjMe-haAclf"><svg class="glue-header__logo-svg" viewBox="0 0 74 24" role="presentation" aria-hidden="true"><path fill="#4285F4" d="M9.24 8.19v2.46h5.88c-.18 1.38-.64 2.39-1.34 3.1-.86.86-2.2 1.8-4.54 1.8-3.62 0-6.45-2.92-6.45-6.54s2.83-6.54 6.45-6.54c1.95 0 3.38.77 4.43 1.76L15.4 2.5C13.94 1.08 11.98 0 9.24 0 4.28 0 .11 4.04.11 9s4.17 9 9.13 9c2.68 0 4.7-.88 6.28-2.52 1.62-1.62 2.13-3.91 2.13-5.75 0-.57-.04-1.1-.13-1.54H9.24z"></path><path fill="#EA4335" d="M25 6.19c-3.21 0-5.83 2.44-5.83 5.81 0 3.34 2.62 5.81 5.83 5.81s5.83-2.46 5.83-5.81c0-3.37-2.62-5.81-5.83-5.81zm0 9.33c-1.76 0-3.28-1.45-3.28-3.52 0-2.09 1.52-3.52 3.28-3.52s3.28 1.43 3.28 3.52c0 2.07-1.52 3.52-3.28 3.52z"></path><path fill="#4285F4" d="M53.58 7.49h-.09c-.57-.68-1.67-1.3-3.06-1.3C47.53 6.19 45 8.72 45 12c0 3.26 2.53 5.81 5.43 5.81 1.39 0 2.49-.62 3.06-1.32h.09v.81c0 2.22-1.19 3.41-3.1 3.41-1.56 0-2.53-1.12-2.93-2.07l-2.22.92c.64 1.54 2.33 3.43 5.15 3.43 2.99 0 5.52-1.76 5.52-6.05V6.49h-2.42v1zm-2.93 8.03c-1.76 0-3.1-1.5-3.1-3.52 0-2.05 1.34-3.52 3.1-3.52 1.74 0 3.1 1.5 3.1 3.54.01 2.03-1.36 3.5-3.1 3.5z"></path><path fill="#FBBC05" d="M38 6.19c-3.21 0-5.83 2.44-5.83 5.81 0 3.34 2.62 5.81 5.83 5.81s5.83-2.46 5.83-5.81c0-3.37-2.62-5.81-5.83-5.81zm0 9.33c-1.76 0-3.28-1.45-3.28-3.52 0-2.09 1.52-3.52 3.28-3.52s3.28 1.43 3.28 3.52c0 2.07-1.52 3.52-3.28 3.52z"></path><path fill="#34A853" d="M58 .24h2.51v17.57H58z"></path><path fill="#EA4335" d="M68.26 15.52c-1.3 0-2.22-.59-2.82-1.76l7.77-3.21-.26-.66c-.48-1.3-1.96-3.7-4.97-3.7-2.99 0-5.48 2.35-5.48 5.81 0 3.26 2.46 5.81 5.76 5.81 2.66 0 4.2-1.63 4.84-2.57l-1.98-1.32c-.66.96-1.56 1.6-2.86 1.6zm-.18-7.15c1.03 0 1.91.53 2.2 1.28l-5.25 2.17c0-2.44 1.73-3.45 3.05-3.45z"></path></svg></div><span class="nRhiJb-rSCjMe-OWXEXe-UBMNlb khBwGd">Cloud</span></a></div></div><div class="nRhiJb-o2XRw-yHKmmc UrjqX"><div class="nRhiJb-rSCjMe"><a class="nRhiJb-rSCjMe-hSRGPd" href="https://cloud.google.com/blog/" title="Google Cloud Blog" track-name="blog"track-type="blog nav"track-metadata-position="nav"track-metadata-eventdetail="cloud.google.com/blog/"track-metadata-module="header"><span class="nRhiJb-rSCjMe-OWXEXe-UBMNlb khBwGd">Blog</span></a></div></div></div><div class="glue-header__container glue-header__stepped-nav LKvi8b" role="navigation"><div class="glue-header__stepped-nav-controls-container"><div class="glue-header__stepped-nav-controls"><div class="glue-header__stepped-nav-controls-arrow"><svg class="nRhiJb-Bz112c nRhiJb-Bz112c-OWXEXe-SFi8G" viewBox="0 0 24 24" role="presentation" aria-hidden="true"><path d="M16.41 5.41L15 4l-8 8 8 8 1.41-1.41L9.83 12"></path></svg><svg class="nRhiJb-Bz112c nRhiJb-Bz112c-OWXEXe-SFi8G glue-header__stepped-nav-subnav-icon" viewBox="0 0 24 24" role="presentation" aria-hidden="true"><path d="M7.59 18.59L9 20l8-8-8-8-1.41 1.41L14.17 12"></path></svg></div><div class="glue-header__stepped-nav-controls-title glue-header__link"></div></div></div><div class="glue-header__stepped-nav-menus"></div></div><div class="glue-header__container nRhiJb-J6KYL-OWXEXe-Q4irje"><nav class="glue-header__link-bar"><ul class="glue-header__list glue-header__list--nested glue-header__deep-nav URiJfb"><li class="glue-header__item "><a class="glue-header__link">Solutions & technology<svg class="nRhiJb-Bz112c nRhiJb-Bz112c-OWXEXe-SFi8G" viewBox="0 0 24 24" role="presentation" aria-hidden="true"><path d="M5.41 7.59L4 9l8 8 8-8-1.41-1.41L12 14.17"></path></svg></a><ul class="glue-header__list NDdrcc"><li class="glue-header__item "><a class="glue-header__link janap " href="https://cloud.google.com/blog/products/ai-machine-learning" track-name="ai & machine learning"track-type="blog nav"track-metadata-position="nav"track-metadata-eventdetail="cloud.google.com/blog/products/ai-machine-learning"track-metadata-module="header"><span>AI & Machine Learning</span></a></li><li class="glue-header__item "><a class="glue-header__link janap " href="https://cloud.google.com/blog/products/api-management" track-name="api management"track-type="blog nav"track-metadata-position="nav"track-metadata-eventdetail="cloud.google.com/blog/products/api-management"track-metadata-module="header"><span>API Management</span></a></li><li class="glue-header__item "><a class="glue-header__link janap " href="https://cloud.google.com/blog/products/application-development" track-name="application development"track-type="blog nav"track-metadata-position="nav"track-metadata-eventdetail="cloud.google.com/blog/products/application-development"track-metadata-module="header"><span>Application Development</span></a></li><li class="glue-header__item "><a class="glue-header__link janap " href="https://cloud.google.com/blog/products/application-modernization" track-name="application modernization"track-type="blog nav"track-metadata-position="nav"track-metadata-eventdetail="cloud.google.com/blog/products/application-modernization"track-metadata-module="header"><span>Application Modernization</span></a></li><li class="glue-header__item "><a class="glue-header__link janap " href="https://cloud.google.com/blog/products/chrome-enterprise" track-name="chrome enterprise"track-type="blog nav"track-metadata-position="nav"track-metadata-eventdetail="cloud.google.com/blog/products/chrome-enterprise"track-metadata-module="header"><span>Chrome Enterprise</span></a></li><li class="glue-header__item "><a class="glue-header__link janap " href="https://cloud.google.com/blog/products/compute" track-name="compute"track-type="blog nav"track-metadata-position="nav"track-metadata-eventdetail="cloud.google.com/blog/products/compute"track-metadata-module="header"><span>Compute</span></a></li><li class="glue-header__item "><a class="glue-header__link janap " href="https://cloud.google.com/blog/products/containers-kubernetes" track-name="containers & kubernetes"track-type="blog nav"track-metadata-position="nav"track-metadata-eventdetail="cloud.google.com/blog/products/containers-kubernetes"track-metadata-module="header"><span>Containers & Kubernetes</span></a></li><li class="glue-header__item "><a class="glue-header__link janap " href="https://cloud.google.com/blog/products/data-analytics" track-name="data analytics"track-type="blog nav"track-metadata-position="nav"track-metadata-eventdetail="cloud.google.com/blog/products/data-analytics"track-metadata-module="header"><span>Data Analytics</span></a></li><li class="glue-header__item "><a class="glue-header__link janap " href="https://cloud.google.com/blog/products/databases" track-name="databases"track-type="blog nav"track-metadata-position="nav"track-metadata-eventdetail="cloud.google.com/blog/products/databases"track-metadata-module="header"><span>Databases</span></a></li><li class="glue-header__item "><a class="glue-header__link janap " href="https://cloud.google.com/blog/products/devops-sre" track-name="devops & sre"track-type="blog nav"track-metadata-position="nav"track-metadata-eventdetail="cloud.google.com/blog/products/devops-sre"track-metadata-module="header"><span>DevOps & SRE</span></a></li><li class="glue-header__item "><a class="glue-header__link janap " href="https://cloud.google.com/blog/topics/maps-geospatial" track-name="maps & geospatial"track-type="blog nav"track-metadata-position="nav"track-metadata-eventdetail="cloud.google.com/blog/topics/maps-geospatial"track-metadata-module="header"><span>Maps & Geospatial</span></a></li><li class="glue-header__item "><a class="glue-header__link janap">Security<svg class="nRhiJb-Bz112c nRhiJb-Bz112c-OWXEXe-SFi8G" viewBox="0 0 24 24" role="presentation" aria-hidden="true"><path d="M7.59 18.59L9 20l8-8-8-8-1.41 1.41L14.17 12"></path></svg></a><ul class="glue-header__list NDdrcc"><li class="glue-header__item "><a class="glue-header__link janap " href="https://cloud.google.com/blog/products/identity-security" track-name="security & identity"track-type="blog nav"track-metadata-position="nav"track-metadata-eventdetail="cloud.google.com/blog/products/identity-security"track-metadata-module="header"><span>Security & Identity</span></a></li><li class="glue-header__item "><a class="glue-header__link janap " href="https://cloud.google.com/blog/topics/threat-intelligence" track-name="threat intelligence"track-type="blog nav"track-metadata-position="nav"track-metadata-eventdetail="cloud.google.com/blog/topics/threat-intelligence"track-metadata-module="header"><span>Threat Intelligence</span></a></li></ul></li><li class="glue-header__item "><a class="glue-header__link janap " href="https://cloud.google.com/blog/products/infrastructure" track-name="infrastructure"track-type="blog nav"track-metadata-position="nav"track-metadata-eventdetail="cloud.google.com/blog/products/infrastructure"track-metadata-module="header"><span>Infrastructure</span></a></li><li class="glue-header__item "><a class="glue-header__link janap " href="https://cloud.google.com/blog/products/infrastructure-modernization" track-name="infrastructure modernization"track-type="blog nav"track-metadata-position="nav"track-metadata-eventdetail="cloud.google.com/blog/products/infrastructure-modernization"track-metadata-module="header"><span>Infrastructure Modernization</span></a></li><li class="glue-header__item "><a class="glue-header__link janap " href="https://cloud.google.com/blog/products/networking" track-name="networking"track-type="blog nav"track-metadata-position="nav"track-metadata-eventdetail="cloud.google.com/blog/products/networking"track-metadata-module="header"><span>Networking</span></a></li><li class="glue-header__item "><a class="glue-header__link janap " href="https://cloud.google.com/blog/products/productivity-collaboration" track-name="productivity & collaboration"track-type="blog nav"track-metadata-position="nav"track-metadata-eventdetail="cloud.google.com/blog/products/productivity-collaboration"track-metadata-module="header"><span>Productivity & Collaboration</span></a></li><li class="glue-header__item "><a class="glue-header__link janap " href="https://cloud.google.com/blog/products/sap-google-cloud" track-name="sap on google cloud"track-type="blog nav"track-metadata-position="nav"track-metadata-eventdetail="cloud.google.com/blog/products/sap-google-cloud"track-metadata-module="header"><span>SAP on Google Cloud</span></a></li><li class="glue-header__item "><a class="glue-header__link janap " href="https://cloud.google.com/blog/products/storage-data-transfer" track-name="storage & data transfer"track-type="blog nav"track-metadata-position="nav"track-metadata-eventdetail="cloud.google.com/blog/products/storage-data-transfer"track-metadata-module="header"><span>Storage & Data Transfer</span></a></li><li class="glue-header__item "><a class="glue-header__link janap " href="https://cloud.google.com/blog/topics/sustainability" track-name="sustainability"track-type="blog nav"track-metadata-position="nav"track-metadata-eventdetail="cloud.google.com/blog/topics/sustainability"track-metadata-module="header"><span>Sustainability</span></a></li></ul></li><li class="glue-header__item "><a class="glue-header__link">Ecosystem<svg class="nRhiJb-Bz112c nRhiJb-Bz112c-OWXEXe-SFi8G" viewBox="0 0 24 24" role="presentation" aria-hidden="true"><path d="M5.41 7.59L4 9l8 8 8-8-1.41-1.41L12 14.17"></path></svg></a><ul class="glue-header__list NDdrcc"><li class="glue-header__item "><a class="glue-header__link janap " href="https://cloud.google.com/transform" track-name="it leaders"track-type="blog nav"track-metadata-position="nav"track-metadata-eventdetail="cloud.google.com/transform"track-metadata-module="header"><span>IT Leaders</span></a></li><li class="glue-header__item "><a class="glue-header__link janap">Industries<svg class="nRhiJb-Bz112c nRhiJb-Bz112c-OWXEXe-SFi8G" viewBox="0 0 24 24" role="presentation" aria-hidden="true"><path d="M7.59 18.59L9 20l8-8-8-8-1.41 1.41L14.17 12"></path></svg></a><ul class="glue-header__list NDdrcc"><li class="glue-header__item "><a class="glue-header__link janap " href="https://cloud.google.com/blog/topics/financial-services" track-name="financial services"track-type="blog nav"track-metadata-position="nav"track-metadata-eventdetail="cloud.google.com/blog/topics/financial-services"track-metadata-module="header"><span>Financial Services</span></a></li><li class="glue-header__item "><a class="glue-header__link janap " href="https://cloud.google.com/blog/topics/healthcare-life-sciences" track-name="healthcare & life sciences"track-type="blog nav"track-metadata-position="nav"track-metadata-eventdetail="cloud.google.com/blog/topics/healthcare-life-sciences"track-metadata-module="header"><span>Healthcare & Life Sciences</span></a></li><li class="glue-header__item "><a class="glue-header__link janap " href="https://cloud.google.com/blog/topics/manufacturing" track-name="manufacturing"track-type="blog nav"track-metadata-position="nav"track-metadata-eventdetail="cloud.google.com/blog/topics/manufacturing"track-metadata-module="header"><span>Manufacturing</span></a></li><li class="glue-header__item "><a class="glue-header__link janap " href="https://cloud.google.com/blog/products/media-entertainment" track-name="media & entertainment"track-type="blog nav"track-metadata-position="nav"track-metadata-eventdetail="cloud.google.com/blog/products/media-entertainment"track-metadata-module="header"><span>Media & Entertainment</span></a></li><li class="glue-header__item "><a class="glue-header__link janap " href="https://cloud.google.com/blog/topics/public-sector" track-name="public sector"track-type="blog nav"track-metadata-position="nav"track-metadata-eventdetail="cloud.google.com/blog/topics/public-sector"track-metadata-module="header"><span>Public Sector</span></a></li><li class="glue-header__item "><a class="glue-header__link janap " href="https://cloud.google.com/blog/topics/retail" track-name="retail"track-type="blog nav"track-metadata-position="nav"track-metadata-eventdetail="cloud.google.com/blog/topics/retail"track-metadata-module="header"><span>Retail</span></a></li><li class="glue-header__item "><a class="glue-header__link janap " href="https://cloud.google.com/blog/topics/supply-chain-logistics" track-name="supply chain"track-type="blog nav"track-metadata-position="nav"track-metadata-eventdetail="cloud.google.com/blog/topics/supply-chain-logistics"track-metadata-module="header"><span>Supply Chain</span></a></li><li class="glue-header__item "><a class="glue-header__link janap " href="https://cloud.google.com/blog/topics/telecommunications" track-name="telecommunications"track-type="blog nav"track-metadata-position="nav"track-metadata-eventdetail="cloud.google.com/blog/topics/telecommunications"track-metadata-module="header"><span>Telecommunications</span></a></li></ul></li><li class="glue-header__item "><a class="glue-header__link janap " href="https://cloud.google.com/blog/topics/partners" track-name="partners"track-type="blog nav"track-metadata-position="nav"track-metadata-eventdetail="cloud.google.com/blog/topics/partners"track-metadata-module="header"><span>Partners</span></a></li><li class="glue-header__item "><a class="glue-header__link janap " href="https://cloud.google.com/blog/topics/startups" track-name="startups & smb"track-type="blog nav"track-metadata-position="nav"track-metadata-eventdetail="cloud.google.com/blog/topics/startups"track-metadata-module="header"><span>Startups & SMB</span></a></li><li class="glue-header__item "><a class="glue-header__link janap " href="https://cloud.google.com/blog/topics/training-certifications" track-name="training & certifications"track-type="blog nav"track-metadata-position="nav"track-metadata-eventdetail="cloud.google.com/blog/topics/training-certifications"track-metadata-module="header"><span>Training & Certifications</span></a></li><li class="glue-header__item "><a class="glue-header__link janap " href="https://cloud.google.com/blog/topics/inside-google-cloud" track-name="inside google cloud"track-type="blog nav"track-metadata-position="nav"track-metadata-eventdetail="cloud.google.com/blog/topics/inside-google-cloud"track-metadata-module="header"><span>Inside Google Cloud</span></a></li><li class="glue-header__item "><a class="glue-header__link janap " href="https://cloud.google.com/blog/topics/google-cloud-next" track-name="google cloud next & events"track-type="blog nav"track-metadata-position="nav"track-metadata-eventdetail="cloud.google.com/blog/topics/google-cloud-next"track-metadata-module="header"><span>Google Cloud Next & Events</span></a></li><li class="glue-header__item "><a class="glue-header__link janap " href="https://cloud.google.com/blog/topics/consulting" track-name="google cloud consulting"track-type="blog nav"track-metadata-position="nav"track-metadata-eventdetail="cloud.google.com/blog/topics/consulting"track-metadata-module="header"><span>Google Cloud Consulting</span></a></li><li class="glue-header__item "><a class="glue-header__link janap " href="https://mapsplatform.google.com/resources/blog/" track-name="google maps platform"track-type="blog nav"track-metadata-position="nav"track-metadata-eventdetail="mapsplatform.google.com/resources/blog/"track-metadata-module="header" target="_blank"><span>Google Maps Platform<svg class="nRhiJb-Bz112c nRhiJb-Bz112c-OWXEXe-SFi8G FsOzib nRhiJb-tHaKme-AipIyc" viewBox="0 0 24 24" role="presentation" aria-hidden="true"><path d="m8.9 16.075 5.4-5.4v2.675h1.4V8.3h-5.05v1.4h2.65l-5.375 5.375ZM12 21.3q-1.925 0-3.625-.738-1.7-.737-2.95-1.987-1.25-1.25-1.987-2.95Q2.7 13.925 2.7 12t.738-3.625q.737-1.7 1.987-2.95 1.25-1.25 2.95-1.988Q10.075 2.7 12 2.7t3.625.737q1.7.738 2.95 1.988 1.25 1.25 1.987 2.95.738 1.7.738 3.625t-.738 3.625q-.737 1.7-1.987 2.95-1.25 1.25-2.95 1.987-1.7.738-3.625.738Z"></path></svg></span></a></li><li class="glue-header__item "><a class="glue-header__link janap " href="https://workspace.google.com/blog" track-name="google workspace"track-type="blog nav"track-metadata-position="nav"track-metadata-eventdetail="workspace.google.com/blog"track-metadata-module="header" target="_blank"><span>Google Workspace<svg class="nRhiJb-Bz112c nRhiJb-Bz112c-OWXEXe-SFi8G FsOzib nRhiJb-tHaKme-AipIyc" viewBox="0 0 24 24" role="presentation" aria-hidden="true"><path d="m8.9 16.075 5.4-5.4v2.675h1.4V8.3h-5.05v1.4h2.65l-5.375 5.375ZM12 21.3q-1.925 0-3.625-.738-1.7-.737-2.95-1.987-1.25-1.25-1.987-2.95Q2.7 13.925 2.7 12t.738-3.625q.737-1.7 1.987-2.95 1.25-1.25 2.95-1.988Q10.075 2.7 12 2.7t3.625.737q1.7.738 2.95 1.988 1.25 1.25 1.987 2.95.738 1.7.738 3.625t-.738 3.625q-.737 1.7-1.987 2.95-1.25 1.25-2.95 1.987-1.7.738-3.625.738Z"></path></svg></span></a></li></ul></li><li class="glue-header__item "><a class="glue-header__link " href="https://cloud.google.com/blog/topics/developers-practitioners" track-name="developers & practitioners"track-type="blog nav"track-metadata-position="nav"track-metadata-eventdetail="cloud.google.com/blog/topics/developers-practitioners"track-metadata-module="header"><span>Developers & Practitioners</span></a></li><li class="glue-header__item "><a class="glue-header__link " href="https://cloud.google.com/transform" track-name="transform with google cloud"track-type="blog nav"track-metadata-position="nav"track-metadata-eventdetail="cloud.google.com/transform"track-metadata-module="header"><span>Transform with Google Cloud</span></a></li></ul></nav></div><div class="glue-header__container ca6rub nRhiJb-J6KYL-OWXEXe-SU0ZEf"><div class="nRhiJb-GUI8l"><a class="nRhiJb-LgbsSe nRhiJb-LgbsSe-OWXEXe-pSzOP-o6Shpd " href="https://cloud.google.com/contact/" track-name="contact sales"track-type="blog nav"track-metadata-eventdetail="cloud.google.com/contact/"track-metadata-module="header" track-name="contact sales"track-type="button"track-metadata-position="nav"track-metadata-eventdetail="cloud.google.com/contact/">Contact sales </a><a class="nRhiJb-LgbsSe nRhiJb-LgbsSe-OWXEXe-CNusmb-o6Shpd " href="https://console.cloud.google.com/freetrial/" track-name="get started for free"track-type="blog nav"track-metadata-eventdetail="console.cloud.google.com/freetrial/"track-metadata-module="header" track-name="get started for free"track-type="button"track-metadata-position="nav"track-metadata-eventdetail="console.cloud.google.com/freetrial/">Get started for free </a></div><div class="GKI4ub"><div class="Jhiezd"><form action="/blog/search/" class="A2C6Ob"><input class="BAhdXd" jsname="oJAbI" name="query" type="text" placeholder="Find an article..."><input type="hidden" name="language" value=en hidden><input type="hidden" name="category" value=article hidden><input type="hidden" name="paginate" value="25" hidden><input type="hidden" name="order" value="newest" hidden><input type="hidden" name="hl" value=en hidden><span class="A0lwXc" jsname="D8MWrd" aria-label="Show the search input field." role="button" jsaction="click:jUF4E"><svg class="nRhiJb-Bz112c nRhiJb-Bz112c-OWXEXe-xgZe3c" viewBox="0 0 24 24" role="presentation" aria-hidden="true" width="40" height="22"><path d="M20.49 19l-5.73-5.73C15.53 12.2 16 10.91 16 9.5A6.5 6.5 0 1 0 9.5 16c1.41 0 2.7-.47 3.77-1.24L19 20.49 20.49 19zM5 9.5C5 7.01 7.01 5 9.5 5S14 7.01 14 9.5 11.99 14 9.5 14 5 11.99 5 9.5z"></path></svg></span></form></div></div></div></div></div><div class="glue-header__drawer-backdrop"></div></header><script nonce="ukEud-BIIo14C235ZP9QwA">var AF_initDataKeys = ["ds:0"]; var AF_dataServiceRequests = {'ds:0' : {id:'nInjGe',request:["cloudblog","products/gcp/what-dbas-need-to-know-about-cloud-spanner-part-1-keys-and-indexes","en"]}}; var AF_initDataChunkQueue = []; var AF_initDataCallback; var AF_initDataInitializeCallback; if (AF_initDataInitializeCallback) {AF_initDataInitializeCallback(AF_initDataKeys, AF_initDataChunkQueue, AF_dataServiceRequests);}if (!AF_initDataCallback) {AF_initDataCallback = function(chunk) {AF_initDataChunkQueue.push(chunk);};}</script></head><body id="yDmH0d" jscontroller="pjICDe" jsaction="rcuQ6b:npT2md; click:FAbpgf; auxclick:FAbpgf" class="tQj5Y ghyPEc IqBfM ecJEib EWZcud nRhiJb-qJTHM" data-has-header="true" data-has-footer="true"><script aria-hidden="true" nonce="ukEud-BIIo14C235ZP9QwA">window.wiz_progress&&window.wiz_progress();</script><div class="VUoKZ" aria-hidden="true"><div class="TRHLAc"></div></div><c-wiz jsrenderer="zPZHOe" class="SSPGKf" jsdata="deferred-i1" data-p="%.@."cloudblog","products/gcp/what-dbas-need-to-know-about-cloud-spanner-part-1-keys-and-indexes","en"]" data-node-index="0;0" jsmodel="hc6Ubd" view c-wiz data-ogpc><div class="T4LgNb " jsname="a9kxte"><div jsname="qJTHM" class="kFwPee"><article class="nRhiJb-qJTHM" jsaction="rcuQ6b:npT2md" jscontroller="kxO7ab"><section class="nRhiJb-DARUcf"><div class="Wdmc0c nRhiJb-DbgRPb-wNfPc-cGMI2b"><div class="Qwf2Db-MnozTc Qwf2Db-MnozTc-OWXEXe-MnozTc-qWD73c nRhiJb-BFbNVe-r8s4j-bMElCd dIsJJe" track-name="google cloud"track-type="tag">Google Cloud</div><div class="nRhiJb-ObfsIf"><div class="nRhiJb-kR0ZEf-OWXEXe-GV1x9e-R6PoUb"></div><div class="nRhiJb-kR0ZEf-OWXEXe-GV1x9e-EehZO nRhiJb-fmcmS-oXtfBe"><h1 class="Qwf2Db-MnozTc Qwf2Db-MnozTc-OWXEXe-MnozTc-ibL1re"><div class="Qwf2Db-MnozTc Qwf2Db-MnozTc-OWXEXe-MnozTc-ibL1re"><span class="FewWi"></span>What DBAs need to know about Cloud Spanner, part 1: Keys and indexes</div></h1></div></div><div class="nRhiJb-fmcmS-oXtfBe dEogG">June 7, 2018</div></div></section><div class="EKklye"><div class="nRhiJb-DARUcf ZWw7T"><div class="npzWPc"><div class="dzoHJ"><div class="nRhiJb-DX2B6 nRhiJb-DX2B6-OWXEXe-h30Snd"><div class="nRhiJb-j5y3u"><ul class="nRhiJb-Qijihe phRaUe" role="list"><li class="hpHPGf"><a class="nRhiJb-ARYxNe" href="https://x.com/intent/tweet?text=What%20DBAs%20need%20to%20know%20about%20Cloud%20Spanner,%20part%201:%20Keys%20and%20indexes%20@googlecloud&url=https://cloud.google.com/blog/products/gcp/what-dbas-need-to-know-about-cloud-spanner-part-1-keys-and-indexes" track-name="x"track-type="social share"track-metadata-eventdetail="x.com/intent/tweet?text=What DBAs need to know about Cloud Spanner, part 1: Keys and indexes%20@googlecloud&url=cloud.google.com/blog/products/gcp/what-dbas-need-to-know-about-cloud-spanner-part-1-keys-and-indexes"track-metadata-module="social icons" target="_blank" rel="noopener"><svg class="nRhiJb-Bz112c nRhiJb-Bz112c-OWXEXe-DX2B6 nRhiJb-Bz112c-OWXEXe-nSuQf" viewBox="0 0 24 24" role="presentation" aria-hidden="true" role="presentation" aria-hidden="true"><path d="M13.9,10.5L21.1,2h-1.7l-6.3,7.4L8,2H2.2l7.6,11.1L2.2,22h1.7l6.7-7.8L16,22h5.8L13.9,10.5L13.9,10.5z M11.5,13.2l-0.8-1.1 L4.6,3.3h2.7l5,7.1l0.8,1.1l6.5,9.2h-2.7L11.5,13.2L11.5,13.2z"></path></svg></a></li><li class="hpHPGf"><a class="nRhiJb-ARYxNe" href="https://www.linkedin.com/shareArticle?mini=true&url=https://cloud.google.com/blog/products/gcp/what-dbas-need-to-know-about-cloud-spanner-part-1-keys-and-indexes&title=What%20DBAs%20need%20to%20know%20about%20Cloud%20Spanner,%20part%201:%20Keys%20and%20indexes" track-name="linkedin"track-type="social share"track-metadata-eventdetail="www.linkedin.com/shareArticle?mini=true&url=cloud.google.com/blog/products/gcp/what-dbas-need-to-know-about-cloud-spanner-part-1-keys-and-indexes&title=What DBAs need to know about Cloud Spanner, part 1: Keys and indexes"track-metadata-module="social icons" target="_blank" rel="noopener"><svg class="nRhiJb-Bz112c nRhiJb-Bz112c-OWXEXe-DX2B6 nRhiJb-Bz112c-OWXEXe-nSuQf" viewBox="0 0 24 24" role="presentation" aria-hidden="true" role="presentation" aria-hidden="true"><path d="M20 2H4c-1.1 0-1.99.9-1.99 2L2 20c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zM8 19H5v-9h3v9zM6.5 8.31c-1 0-1.81-.81-1.81-1.81S5.5 4.69 6.5 4.69s1.81.81 1.81 1.81S7.5 8.31 6.5 8.31zM19 19h-3v-5.3c0-.83-.67-1.5-1.5-1.5s-1.5.67-1.5 1.5V19h-3v-9h3v1.2c.52-.84 1.59-1.4 2.5-1.4 1.93 0 3.5 1.57 3.5 3.5V19z"></path></svg></a></li><li class="hpHPGf"><a class="nRhiJb-ARYxNe" href="https://www.facebook.com/sharer/sharer.php?caption=What%20DBAs%20need%20to%20know%20about%20Cloud%20Spanner,%20part%201:%20Keys%20and%20indexes&u=https://cloud.google.com/blog/products/gcp/what-dbas-need-to-know-about-cloud-spanner-part-1-keys-and-indexes" track-name="facebook"track-type="social share"track-metadata-eventdetail="www.facebook.com/sharer/sharer.php?caption=What DBAs need to know about Cloud Spanner, part 1: Keys and indexes&u=cloud.google.com/blog/products/gcp/what-dbas-need-to-know-about-cloud-spanner-part-1-keys-and-indexes"track-metadata-module="social icons" target="_blank" rel="noopener"><svg class="nRhiJb-Bz112c nRhiJb-Bz112c-OWXEXe-DX2B6 nRhiJb-Bz112c-OWXEXe-nSuQf" viewBox="0 0 24 24" role="presentation" aria-hidden="true" role="presentation" aria-hidden="true"><path d="M20 2H4c-1.1 0-1.99.9-1.99 2L2 20c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zm-1 2v3h-2c-.55 0-1 .45-1 1v2h3v3h-3v7h-3v-7h-2v-3h2V7.5C13 5.57 14.57 4 16.5 4H19z"></path></svg></a></li><li class="hpHPGf"><a class="nRhiJb-ARYxNe" href="mailto:?subject=What%20DBAs%20need%20to%20know%20about%20Cloud%20Spanner,%20part%201:%20Keys%20and%20indexes&body=Check%20out%20this%20article%20on%20the%20Cloud%20Blog:%0A%0AWhat%20DBAs%20need%20to%20know%20about%20Cloud%20Spanner,%20part%201:%20Keys%20and%20indexes%0A%0ALearn%20the%20dos-and-don%27ts,%20best%20practices%20and%20why%20things%20are%20different%20in%20Cloud%20Spanner.%0A%0Ahttps://cloud.google.com/blog/products/gcp/what-dbas-need-to-know-about-cloud-spanner-part-1-keys-and-indexes" track-name="email"track-type="social share"track-metadata-eventdetail="mailto:?subject=What DBAs need to know about Cloud Spanner, part 1: Keys and indexes&body=Check%20out%20this%20article%20on%20the%20Cloud%20Blog:%0A%0AWhat DBAs need to know about Cloud Spanner, part 1: Keys and indexes%0A%0ALearn the dos-and-don'ts, best practices and why things are different in Cloud Spanner.%0A%0Acloud.google.com/blog/products/gcp/what-dbas-need-to-know-about-cloud-spanner-part-1-keys-and-indexes"track-metadata-module="social icons" target="_blank" rel="noopener"><svg class="nRhiJb-Bz112c nRhiJb-Bz112c-OWXEXe-DX2B6 nRhiJb-Bz112c-OWXEXe-nSuQf" viewBox="0 0 24 24" role="presentation" aria-hidden="true" role="presentation" aria-hidden="true"><path d="M20 4H4c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V6c0-1.1-.9-2-2-2zm-.8 2L12 10.8 4.8 6h14.4zM4 18V7.87l8 5.33 8-5.33V18H4z"></path></svg></a></li></ul></div></div></div></div></div><div><section class="nRhiJb-DARUcf"><div class="nRhiJb-DbgRPb-wNfPc-ma6Yeb nRhiJb-DbgRPb-wNfPc-cGMI2b"><section class="DA9Qj nRhiJb-ObfsIf nRhiJb-fmcmS-oXtfBe"><div class="nRhiJb-kR0ZEf-OWXEXe-GV1x9e-ibL1re"></div><div class="nRhiJb-kR0ZEf-OWXEXe-GV1x9e-II5mzb kWSSdd"><h5 class="cHE8Ub Qwf2Db-MnozTc Qwf2Db-MnozTc-OWXEXe-MnozTc-qWD73c">Niel Markwick</h5><p class="nRhiJb-qJTHM khCp7b">Solutions Architect</p></div><div class="nRhiJb-kR0ZEf-OWXEXe-GV1x9e-II5mzb kWSSdd"><h5 class="cHE8Ub Qwf2Db-MnozTc Qwf2Db-MnozTc-OWXEXe-MnozTc-qWD73c">Robert Saxby</h5><p class="nRhiJb-qJTHM khCp7b">Product Manager</p></div></section></div></section><div class="nRhiJb-DARUcf"><div class="nRhiJb-ObfsIf nRhiJb-DbgRPb-wNfPc-ma6Yeb nRhiJb-DbgRPb-qWD73c-cGMI2b"><div class="nRhiJb-kR0ZEf-OWXEXe-GV1x9e-ibL1re dzoHJ"></div><div class="OYL9D nRhiJb-kR0ZEf-OWXEXe-GV1x9e-OiUrBf" jsname="tx2NYc"><section class="Wy08Ac nRhiJb-qJTHM-OWXEXe-hJDwNd nRhiJb-DbgRPb-II5mzb-cGMI2b"><div jsaction="rcuQ6b:npT2md" jscontroller="M0Q3Qb" data-is-cws-richtext="true" class=" "><p><a href="https://cloud.google.com/spanner/">Cloud Spanner</a> is a relational and horizontally scalable database service, built from a cloud/distributed design perspective. It brings efficiency and high availability for developers and database administrators (DBAs), and differs structurally from typical databases you’re used to. In this blog series, we’ll explore some of the key differences that DBAs and developers will encounter as you migrate from traditional vertically-scaling (scale-up) relational database management systems (RDBMS) and move to Cloud Spanner. We will discuss some of the dos-and-don'ts, best practices and why things are different in Cloud Spanner.</p><p>In this series, we will explore a range of topics, including:
|
||
<br></p><ul>
|
||
<li>Selection of keys and use of indexes</li>
|
||
<li>How to approach business logic</li>
|
||
<li>Importing and exporting data</li>
|
||
<li>Migrating from your existing RDBMS</li>
|
||
<li>Optimizing performance</li>
|
||
<li>Access control and logging </li>
|
||
</ul>
|
||
You’ll gain an understanding of how to best use Cloud Spanner and release its potential to achieve linearly scalable performance over massive databases. In this first installment, let’s start with a closer look at how the concepts of keys and indexes work in Cloud Spanner.<p></p><p></p><h3>
|
||
Choosing keys in Cloud Spanner</h3>
|
||
Just like in other databases, the choice of key is vitally important to optimize the performance of the database. It’s even more important in Cloud Spanner, due to the way its mechanisms distribute database load. Unlike traditional RDBMS, you’ll need to take care when choosing the primary keys for the tables and choosing which columns to index. <p>Using well-distributed keys results in a table whose size and performance can scale linearly with the number of Cloud Spanner nodes, while using poorly distributed keys can result in hotspots, where a single node is responsible for the majority of reads and writes to the table.</p><p>In a traditional vertically scaled RDBMS, there is a single node that manages all of the tables. (Depending on the installation, there may be replicas that can be used for reading or for failover). This single node therefore has full control over the table row locks, and the issuing of unique keys from a numeric sequence.</p><p>Cloud Spanner is a distributed system, with many nodes reading and writing to the database at any one time. However, to achieve scalability, along with global ACID transactions and strong consistency, only one node at any one time can have write responsibility for a given row.</p><p>Cloud Spanner distributes management of rows across multiple nodes by breaking up each table into several <a href="https://cloud.google.com/spanner/docs/schema-and-data-model#database-splits">splits</a>, using ranges of the lexicographically sorted primary key. </p><p>This enables Cloud Spanner to achieve high availability and scalability, but it also means that using any continuously increasing or decreasing sequence as a key is detrimental to performance. To explain why, let’s explore how Cloud Spanner creates and manages its table splits.</p><h3>
|
||
Table splits and key choice</h3>
|
||
Cloud Spanner manages splits using <a href="https://en.wikipedia.org/wiki/Paxos_(computer_science)" target="_blank">Paxos</a> (you can learn more about how in this detailed documentation: <a href="https://cloud.google.com/spanner/docs/whitepapers/life-of-reads-and-writes">Life of Cloud Spanner Reads & Writes</a> and <a href="https://research.google.com/archive/spanner.html" target="_blank">Spanner: Google's Globally Distributed Database</a>). In a regional instance of Cloud Spanner, the responsibility for reading/writing each split is distributed across a group of three nodes, one in each of the three availability zones of the Cloud Spanner instance.<p><br></p><p>One node in this group of three is elected Split Leader and manages the writes and locks for all the rows in the split. All three nodes in the group can perform reads.</p><p>To create a visual example, consider a table with 600 rows that uses a simple, continuous, monotonically increasing integer key (as is common in traditional RDBMS), broken into six splits, running on a two-node (per zone) Cloud Spanner instance. In an ideal situation, the table will have six splits, the leaders of which will be the six individual nodes available in the instance.</p><p></p></div></section><section class="QzPuud"><div><section><figure class="NEBdNd"><section class="PBkdHd DhGbH" jscontroller="SCGBie" jsaction="rcuQ6b:npT2md"><img class="JcsBte mZzdH ZOnyjc" src="https://storage.googleapis.com/gweb-cloudblog-publish/images/gcp-split-leaderndlc.max-700x700.PNG" alt="https://storage.googleapis.com/gweb-cloudblog-publish/images/gcp-split-leaderndlc.max-700x700.PNG" jsname='P3Vluc' jsaction="click:HTIlC" loading="lazy"/><section class="glue-modal glue-modal--dark QHdDac" role="dialog" aria-modal="true"><img class="JcsBte mZzdH ZOnyjc" src="https://storage.googleapis.com/gweb-cloudblog-publish/images/gcp-split-leaderndlc.max-700x700.PNG" alt="https://storage.googleapis.com/gweb-cloudblog-publish/images/gcp-split-leaderndlc.max-700x700.PNG" jsname='P3Vluc' jsaction="click:HTIlC" loading="lazy"/><button class="glue-modal__close-btn" tabindex="0" aria-label="Close this modal"></button></section></section></figure></section></div></section><section class="Wy08Ac nRhiJb-qJTHM-OWXEXe-hJDwNd nRhiJb-DbgRPb-II5mzb-cGMI2b"><div jsaction="rcuQ6b:npT2md" jscontroller="M0Q3Qb" data-is-cws-richtext="true" class=" "><p>This distribution would result in ideal performance when reading/updating the rows, provided that the reads and updates are evenly distributed across the key range.</p><h3>
|
||
Problems with hotspots</h3>The problem arises when new rows are appended to the database. Every new row will have an incrementing ID and will be added to the last split, meaning that out of the six available nodes, only one node will be handling all of the writes. In the example above, node 2c would be handling all writes. This node then becomes a hotspot, limiting the overall write performance of the database. In addition, the row distribution becomes unbalanced, with the last split becoming significantly larger, so it’s then handling more row reads than the others. <p>Cloud Spanner does try to compensate for uneven load by <a href="https://cloud.google.com/spanner/docs/schema-and-data-model#database-splits">adding and removing splits in the background</a> according to read and write load, and by creating a new split once the split size crosses a set threshold. However, in a frequently appended table, this will not happen quickly enough to avoid creating a hotspot.</p><p>Along with monotonically increasing or decreasing keys, this issue also affects tables that are indexed by any deterministic key—for example, an increasing timestamp in an event log table. Timestamp-keyed tables are also more likely to have a read hotspot because, in most cases, recently timestamped rows are accessed more frequently than the others. (Check out <a href="https://medium.com/google-cloud/cloud-spanner-choosing-the-right-primary-keys-cd2a47c7b52d" target="_blank">Cloud Spanner — Choosing the right primary keys</a> for detailed information on detecting and avoiding hotspots.)</p><h3>
|
||
Problems with sequence generators</h3>
|
||
The concept of sequence generators, or lack thereof, is an important area to explore further. Traditional vertical RDBMS have integrated sequence generators, which create new integer keys from a sequence during a transaction. Cloud Spanner cannot have this due to its distributed architecture, as there would either be race conditions between the split leader nodes when inserting new keys, or the table would have to be globally locked when generating a new key, both of which would reduce performance.<p>One workaround could be that the key is generated by the application (for example, by storing the next key value in a separate table in the database, or by getting the current maximum key value from the table). However, you’ll run into the same performance problems. Consider that as the application is also likely to be distributed, there may be multiple database clients trying to append a row at the same time, with two potential results depending on how the new key is generated:
|
||
<br></p><ul>
|
||
<li>If the SELECT for the existing key is performed in the transaction, one application instance trying to append would block all other application instances trying to append due to row locking.</li>
|
||
<li>If the SELECT for the existing key is done outside of the transaction, then there is a race between each of the application instances trying to append the new row. One will succeed, while others would have to retry (including generating a new key) after the append fails, since the key already exists. </li>
|
||
</ul>
|
||
<h3>
|
||
What makes a good key</h3>
|
||
So if sequential keys will limit database performance in Cloud Spanner, what’s a good key to use? Ideally, the high-order bits should be evenly and semi-randomly distributed when keys are generated. <p>One simple way to generate such a key is to use random numbers, such as a random universally unique identifier (UUID). Note that there are several classes of <a href="http://go/wiki/Universally_unique_identifier#Versions" target="_blank">UUID</a>. Versions 1 and 2 use deterministic prefixes, such as timestamps or MAC addresses. Ensure that the UUID generation method you use is truly randomly distributed, i.e., v4, at least over the higher order bytes. This will ensure that the keys are evenly distributed among the keyspace, and hence that the load is distributed evenly over the spanner nodes. </p><p>Although another approach might be to use some real-world attributes of the data that are immutable and evenly distributed over the key range, this is quite a challenge since most uniformly distributed attributes are discrete and not continuous. For example, the random result of a dice roll is uniformly distributed and has six finite values. A continuous distribution could rely on an irrational number, for example π.</p><h3>
|
||
What if I really need an integer sequence as a key?</h3>
|
||
Though it’s not recommended, in some circumstances an integer sequence key is necessary, either for legacy or for external reasons, e.g., an employee ID.<p>To use an integer sequence key, you’ll first need a sequence generator that’s safe across a distributed system. One way of doing this is to have a table in Cloud Spanner contain a row for each required sequence that contains the next value in the sequence—so it would look something like this:
|
||
</p></div></section><section class="nRhiJb-DbgRPb-II5mzb-cGMI2b"><section><div class="kg99be" jscontroller="vkZm2d" jsaction="rcuQ6b:npT2md" data-text-to-copy="CREATE TABLE Sequences (
|
||
Sequence_ID STRING(MAX) NOT NULL, -- The name of the sequence
|
||
Next_Value INT64 NOT NULL
|
||
) PRIMARY KEY (Sequence_ID)" soy-skip ssk='4:dXrt'><div jsaction="click:VTVhdd" class="GaRnv"><svg class="" viewBox="0 0 20 20" role="presentation" aria-hidden="true" height=20 widdht=20><path d="M7.979 14.667c-.458 0-.84-.153-1.146-.459a1.53 1.53 0 0 1-.458-1.125V3.938c0-.459.153-.84.458-1.146.306-.306.688-.459 1.146-.459h6.625c.445 0 .823.156 1.136.469.312.313.468.691.468 1.136v9.145c0 .445-.156.82-.468 1.125a1.564 1.564 0 0 1-1.136.459H7.979Zm0-1.334h6.625c.083 0 .15-.024.198-.073a.239.239 0 0 0 .073-.177V3.938a.265.265 0 0 0-.073-.198.268.268 0 0 0-.198-.073H7.979a.268.268 0 0 0-.198.073.266.266 0 0 0-.073.198v9.145c0 .07.024.129.073.177a.267.267 0 0 0 .198.073ZM4.875 17.75a1.53 1.53 0 0 1-1.125-.458 1.532 1.532 0 0 1-.458-1.125V5.729h1.333v10.438c0 .07.024.128.073.177a.24.24 0 0 0 .177.073h7.937v1.333H4.875ZM7.708 3.667v9.666-9.666Z" fill="#1a73e8"/></svg></div><div jscontroller="M2lJBf" jsaction="rcuQ6b:npT2md" data-enable-content-editable-input-style="false" data-enable-line-wrapping data-read-only><div class="hg3Lgc qs41qe BEXrzd" data-loadingmessage="Loading..." jscontroller="GFartf" jsaction="animationend:kWijWc;dyRcpb:dyRcpb" data-active="true" jsname="aZ2wEe"><div class="eBrXtc" aria-live="polite" jsname="vyyg5">Loading...</div><div jsname="Hxlbvc" class="JdM54e"><div class="aopPX ZqnFk co39ub"><div class="e2XBBf uEtL3"><div class="kPEoYc GOJTSe"></div></div><div class="LqC3Y"><div class="kPEoYc GOJTSe"></div></div><div class="e2XBBf QR7YS"><div class="kPEoYc GOJTSe"></div></div></div><div class="aopPX fxjES Cn087"><div class="e2XBBf uEtL3"><div class="kPEoYc GOJTSe"></div></div><div class="LqC3Y"><div class="kPEoYc GOJTSe"></div></div><div class="e2XBBf QR7YS"><div class="kPEoYc GOJTSe"></div></div></div><div class="aopPX ZHXbZe hfsr6b"><div class="e2XBBf uEtL3"><div class="kPEoYc GOJTSe"></div></div><div class="LqC3Y"><div class="kPEoYc GOJTSe"></div></div><div class="e2XBBf QR7YS"><div class="kPEoYc GOJTSe"></div></div></div><div class="aopPX fDBOYb EjXFBf"><div class="e2XBBf uEtL3"><div class="kPEoYc GOJTSe"></div></div><div class="LqC3Y"><div class="kPEoYc GOJTSe"></div></div><div class="e2XBBf QR7YS"><div class="kPEoYc GOJTSe"></div></div></div></div></div><div dir="ltr"><textarea jsname="bqeLof" class="Fdco1c">CREATE TABLE Sequences (
|
||
Sequence_ID STRING(MAX) NOT NULL, -- The name of the sequence
|
||
Next_Value INT64 NOT NULL
|
||
) PRIMARY KEY (Sequence_ID)</textarea></div></div></div></section></section><section class="Wy08Ac nRhiJb-qJTHM-OWXEXe-hJDwNd nRhiJb-DbgRPb-II5mzb-cGMI2b"><div jsaction="rcuQ6b:npT2md" jscontroller="M0Q3Qb" data-is-cws-richtext="true" class=" "><p>When a new ID value is required, the next value of the sequence is read, incremented and updated in the same transaction as the insert for the new row.</p><p>Note that this will limit performance when many rows are inserted, as each insert will block all other inserts due to the update of the Sequences table that we created above.</p><p>This performance issue can be reduced—though at the cost of possible gaps in the sequence—if each application instance reserves a block of, for example, 100 sequence values at once by incrementing Next_Value by 100, and then manages issuing individual IDs from that block internally.</p><p>In the table using the sequence, the key cannot simply be the numeric sequence value itself, as that will cause the last split to become a hotspot (as explained previously). So the application must generate a complex key that randomly distributes the rows among the splits.</p><p>This is known as <em>application-level sharding</em> and is achieved by prefixing the sequential ID with an additional column containing a value that’s evenly distributed among the key space—e.g., a hash of the original ID, or bit-reversing the ID. That looks something like this:
|
||
</p></div></section><section class="nRhiJb-DbgRPb-II5mzb-cGMI2b"><section><div class="kg99be" jscontroller="vkZm2d" jsaction="rcuQ6b:npT2md" data-text-to-copy="CREATE TABLE Table1 (
|
||
Hashed_Id INT64 NOT NULL,
|
||
ID INT64 NOT NULL,
|
||
-- other columns with data values follow....
|
||
) PRIMARY KEY (Hashed_Id, Id)" soy-skip ssk='4:dXrt'><div jsaction="click:VTVhdd" class="GaRnv"><svg class="" viewBox="0 0 20 20" role="presentation" aria-hidden="true" height=20 widdht=20><path d="M7.979 14.667c-.458 0-.84-.153-1.146-.459a1.53 1.53 0 0 1-.458-1.125V3.938c0-.459.153-.84.458-1.146.306-.306.688-.459 1.146-.459h6.625c.445 0 .823.156 1.136.469.312.313.468.691.468 1.136v9.145c0 .445-.156.82-.468 1.125a1.564 1.564 0 0 1-1.136.459H7.979Zm0-1.334h6.625c.083 0 .15-.024.198-.073a.239.239 0 0 0 .073-.177V3.938a.265.265 0 0 0-.073-.198.268.268 0 0 0-.198-.073H7.979a.268.268 0 0 0-.198.073.266.266 0 0 0-.073.198v9.145c0 .07.024.129.073.177a.267.267 0 0 0 .198.073ZM4.875 17.75a1.53 1.53 0 0 1-1.125-.458 1.532 1.532 0 0 1-.458-1.125V5.729h1.333v10.438c0 .07.024.128.073.177a.24.24 0 0 0 .177.073h7.937v1.333H4.875ZM7.708 3.667v9.666-9.666Z" fill="#1a73e8"/></svg></div><div jscontroller="M2lJBf" jsaction="rcuQ6b:npT2md" data-enable-content-editable-input-style="false" data-enable-line-wrapping data-read-only><div class="hg3Lgc qs41qe BEXrzd" data-loadingmessage="Loading..." jscontroller="GFartf" jsaction="animationend:kWijWc;dyRcpb:dyRcpb" data-active="true" jsname="aZ2wEe"><div class="eBrXtc" aria-live="polite" jsname="vyyg5">Loading...</div><div jsname="Hxlbvc" class="JdM54e"><div class="aopPX ZqnFk co39ub"><div class="e2XBBf uEtL3"><div class="kPEoYc GOJTSe"></div></div><div class="LqC3Y"><div class="kPEoYc GOJTSe"></div></div><div class="e2XBBf QR7YS"><div class="kPEoYc GOJTSe"></div></div></div><div class="aopPX fxjES Cn087"><div class="e2XBBf uEtL3"><div class="kPEoYc GOJTSe"></div></div><div class="LqC3Y"><div class="kPEoYc GOJTSe"></div></div><div class="e2XBBf QR7YS"><div class="kPEoYc GOJTSe"></div></div></div><div class="aopPX ZHXbZe hfsr6b"><div class="e2XBBf uEtL3"><div class="kPEoYc GOJTSe"></div></div><div class="LqC3Y"><div class="kPEoYc GOJTSe"></div></div><div class="e2XBBf QR7YS"><div class="kPEoYc GOJTSe"></div></div></div><div class="aopPX fDBOYb EjXFBf"><div class="e2XBBf uEtL3"><div class="kPEoYc GOJTSe"></div></div><div class="LqC3Y"><div class="kPEoYc GOJTSe"></div></div><div class="e2XBBf QR7YS"><div class="kPEoYc GOJTSe"></div></div></div></div></div><div dir="ltr"><textarea jsname="bqeLof" class="Fdco1c">CREATE TABLE Table1 (
|
||
Hashed_Id INT64 NOT NULL,
|
||
ID INT64 NOT NULL,
|
||
-- other columns with data values follow....
|
||
) PRIMARY KEY (Hashed_Id, Id)</textarea></div></div></div></section></section><section class="Wy08Ac nRhiJb-qJTHM-OWXEXe-hJDwNd nRhiJb-DbgRPb-II5mzb-cGMI2b"><div jsaction="rcuQ6b:npT2md" jscontroller="M0Q3Qb" data-is-cws-richtext="true" class=" "><p>Even a simple cyclic redundancy check (CRC)32 checksum is good enough to provide a suitably pseudo-random Hashed_Id. It does not have to be secure, just enough to randomize the row order of the sequentially numbered keys, as in the following table:</p></div></section><section class="QzPuud"><div><section><figure class="NEBdNd"><section class="PBkdHd DhGbH" jscontroller="SCGBie" jsaction="rcuQ6b:npT2md"><img class="JcsBte mZzdH H05fDc" src="https://storage.googleapis.com/gweb-cloudblog-publish/images/gcp-cyclic-redundancy-checka224.max-400x400.PNG" alt="https://storage.googleapis.com/gweb-cloudblog-publish/images/gcp-cyclic-redundancy-checka224.max-400x400.PNG" jsname='P3Vluc' jsaction="click:HTIlC" loading="lazy"/><section class="glue-modal glue-modal--dark QHdDac" role="dialog" aria-modal="true"><img class="JcsBte mZzdH H05fDc" src="https://storage.googleapis.com/gweb-cloudblog-publish/images/gcp-cyclic-redundancy-checka224.max-400x400.PNG" alt="https://storage.googleapis.com/gweb-cloudblog-publish/images/gcp-cyclic-redundancy-checka224.max-400x400.PNG" jsname='P3Vluc' jsaction="click:HTIlC" loading="lazy"/><button class="glue-modal__close-btn" tabindex="0" aria-label="Close this modal"></button></section></section></figure></section></div></section><section class="Wy08Ac nRhiJb-qJTHM-OWXEXe-hJDwNd nRhiJb-DbgRPb-II5mzb-cGMI2b"><div jsaction="rcuQ6b:npT2md" jscontroller="M0Q3Qb" data-is-cws-richtext="true" class=" "><p>Note that whenever a row is read directly, both the ID and Hashed_Id must be specified to prevent a table scan, as in this example:
|
||
</p></div></section><section class="nRhiJb-DbgRPb-II5mzb-cGMI2b"><section><div class="kg99be" jscontroller="vkZm2d" jsaction="rcuQ6b:npT2md" data-text-to-copy="SELECT * FROM Table1
|
||
WHERE t1.Hashed_Id = 0xDEADBEEF
|
||
AND t1.Id = 1234" soy-skip ssk='4:dXrt'><div jsaction="click:VTVhdd" class="GaRnv"><svg class="" viewBox="0 0 20 20" role="presentation" aria-hidden="true" height=20 widdht=20><path d="M7.979 14.667c-.458 0-.84-.153-1.146-.459a1.53 1.53 0 0 1-.458-1.125V3.938c0-.459.153-.84.458-1.146.306-.306.688-.459 1.146-.459h6.625c.445 0 .823.156 1.136.469.312.313.468.691.468 1.136v9.145c0 .445-.156.82-.468 1.125a1.564 1.564 0 0 1-1.136.459H7.979Zm0-1.334h6.625c.083 0 .15-.024.198-.073a.239.239 0 0 0 .073-.177V3.938a.265.265 0 0 0-.073-.198.268.268 0 0 0-.198-.073H7.979a.268.268 0 0 0-.198.073.266.266 0 0 0-.073.198v9.145c0 .07.024.129.073.177a.267.267 0 0 0 .198.073ZM4.875 17.75a1.53 1.53 0 0 1-1.125-.458 1.532 1.532 0 0 1-.458-1.125V5.729h1.333v10.438c0 .07.024.128.073.177a.24.24 0 0 0 .177.073h7.937v1.333H4.875ZM7.708 3.667v9.666-9.666Z" fill="#1a73e8"/></svg></div><div jscontroller="M2lJBf" jsaction="rcuQ6b:npT2md" data-enable-content-editable-input-style="false" data-enable-line-wrapping data-read-only><div class="hg3Lgc qs41qe BEXrzd" data-loadingmessage="Loading..." jscontroller="GFartf" jsaction="animationend:kWijWc;dyRcpb:dyRcpb" data-active="true" jsname="aZ2wEe"><div class="eBrXtc" aria-live="polite" jsname="vyyg5">Loading...</div><div jsname="Hxlbvc" class="JdM54e"><div class="aopPX ZqnFk co39ub"><div class="e2XBBf uEtL3"><div class="kPEoYc GOJTSe"></div></div><div class="LqC3Y"><div class="kPEoYc GOJTSe"></div></div><div class="e2XBBf QR7YS"><div class="kPEoYc GOJTSe"></div></div></div><div class="aopPX fxjES Cn087"><div class="e2XBBf uEtL3"><div class="kPEoYc GOJTSe"></div></div><div class="LqC3Y"><div class="kPEoYc GOJTSe"></div></div><div class="e2XBBf QR7YS"><div class="kPEoYc GOJTSe"></div></div></div><div class="aopPX ZHXbZe hfsr6b"><div class="e2XBBf uEtL3"><div class="kPEoYc GOJTSe"></div></div><div class="LqC3Y"><div class="kPEoYc GOJTSe"></div></div><div class="e2XBBf QR7YS"><div class="kPEoYc GOJTSe"></div></div></div><div class="aopPX fDBOYb EjXFBf"><div class="e2XBBf uEtL3"><div class="kPEoYc GOJTSe"></div></div><div class="LqC3Y"><div class="kPEoYc GOJTSe"></div></div><div class="e2XBBf QR7YS"><div class="kPEoYc GOJTSe"></div></div></div></div></div><div dir="ltr"><textarea jsname="bqeLof" class="Fdco1c">SELECT * FROM Table1
|
||
WHERE t1.Hashed_Id = 0xDEADBEEF
|
||
AND t1.Id = 1234</textarea></div></div></div></section></section><section class="Wy08Ac nRhiJb-qJTHM-OWXEXe-hJDwNd nRhiJb-DbgRPb-II5mzb-cGMI2b"><div jsaction="rcuQ6b:npT2md" jscontroller="M0Q3Qb" data-is-cws-richtext="true" class=" "><p>Similarly, whenever this table is joined with other tables in the query by Id, the join must also use both the ID and the Hashed_Id. Otherwise, you’ll lose performance, since a table scan will be required to find the row. This means that the table that references the ID must also include the Hashed_Id, like this:
|
||
</p></div></section><section class="nRhiJb-DbgRPb-II5mzb-cGMI2b"><section><div class="kg99be" jscontroller="vkZm2d" jsaction="rcuQ6b:npT2md" data-text-to-copy="CREATE TABLE Table2 (
|
||
Id String(MAX), -- UUID
|
||
Table1_Hashed_Id INT64 NOT NULL,
|
||
Table1_Id INT64 NOT NULL,
|
||
-- other columns with data values follow....
|
||
) PRIMARY KEY (Id)
|
||
SELECT * from Table2 t2 INNER JOIN Table1 t1
|
||
ON t1.Hashed_Id = t2.Table1_Hashed_Id
|
||
AND t1.Id = t2.Table1_Id
|
||
WHERE ... -- some criteria" soy-skip ssk='4:dXrt'><div jsaction="click:VTVhdd" class="GaRnv"><svg class="" viewBox="0 0 20 20" role="presentation" aria-hidden="true" height=20 widdht=20><path d="M7.979 14.667c-.458 0-.84-.153-1.146-.459a1.53 1.53 0 0 1-.458-1.125V3.938c0-.459.153-.84.458-1.146.306-.306.688-.459 1.146-.459h6.625c.445 0 .823.156 1.136.469.312.313.468.691.468 1.136v9.145c0 .445-.156.82-.468 1.125a1.564 1.564 0 0 1-1.136.459H7.979Zm0-1.334h6.625c.083 0 .15-.024.198-.073a.239.239 0 0 0 .073-.177V3.938a.265.265 0 0 0-.073-.198.268.268 0 0 0-.198-.073H7.979a.268.268 0 0 0-.198.073.266.266 0 0 0-.073.198v9.145c0 .07.024.129.073.177a.267.267 0 0 0 .198.073ZM4.875 17.75a1.53 1.53 0 0 1-1.125-.458 1.532 1.532 0 0 1-.458-1.125V5.729h1.333v10.438c0 .07.024.128.073.177a.24.24 0 0 0 .177.073h7.937v1.333H4.875ZM7.708 3.667v9.666-9.666Z" fill="#1a73e8"/></svg></div><div jscontroller="M2lJBf" jsaction="rcuQ6b:npT2md" data-enable-content-editable-input-style="false" data-enable-line-wrapping data-read-only><div class="hg3Lgc qs41qe BEXrzd" data-loadingmessage="Loading..." jscontroller="GFartf" jsaction="animationend:kWijWc;dyRcpb:dyRcpb" data-active="true" jsname="aZ2wEe"><div class="eBrXtc" aria-live="polite" jsname="vyyg5">Loading...</div><div jsname="Hxlbvc" class="JdM54e"><div class="aopPX ZqnFk co39ub"><div class="e2XBBf uEtL3"><div class="kPEoYc GOJTSe"></div></div><div class="LqC3Y"><div class="kPEoYc GOJTSe"></div></div><div class="e2XBBf QR7YS"><div class="kPEoYc GOJTSe"></div></div></div><div class="aopPX fxjES Cn087"><div class="e2XBBf uEtL3"><div class="kPEoYc GOJTSe"></div></div><div class="LqC3Y"><div class="kPEoYc GOJTSe"></div></div><div class="e2XBBf QR7YS"><div class="kPEoYc GOJTSe"></div></div></div><div class="aopPX ZHXbZe hfsr6b"><div class="e2XBBf uEtL3"><div class="kPEoYc GOJTSe"></div></div><div class="LqC3Y"><div class="kPEoYc GOJTSe"></div></div><div class="e2XBBf QR7YS"><div class="kPEoYc GOJTSe"></div></div></div><div class="aopPX fDBOYb EjXFBf"><div class="e2XBBf uEtL3"><div class="kPEoYc GOJTSe"></div></div><div class="LqC3Y"><div class="kPEoYc GOJTSe"></div></div><div class="e2XBBf QR7YS"><div class="kPEoYc GOJTSe"></div></div></div></div></div><div dir="ltr"><textarea jsname="bqeLof" class="Fdco1c">CREATE TABLE Table2 (
|
||
Id String(MAX), -- UUID
|
||
Table1_Hashed_Id INT64 NOT NULL,
|
||
Table1_Id INT64 NOT NULL,
|
||
-- other columns with data values follow....
|
||
) PRIMARY KEY (Id)
|
||
SELECT * from Table2 t2 INNER JOIN Table1 t1
|
||
ON t1.Hashed_Id = t2.Table1_Hashed_Id
|
||
AND t1.Id = t2.Table1_Id
|
||
WHERE ... -- some criteria</textarea></div></div></div></section></section><section class="Wy08Ac nRhiJb-qJTHM-OWXEXe-hJDwNd nRhiJb-DbgRPb-II5mzb-cGMI2b"><div jsaction="rcuQ6b:npT2md" jscontroller="M0Q3Qb" data-is-cws-richtext="true" class=" "><p></p><p></p><h3>
|
||
What if I really need to use a timestamp as a key?</h3>
|
||
In many cases, the row using the timestamp as a key also refers to some other table data. For example, the transactions on a bank account will refer to the source account. In this case, assuming that the source account number is already reasonably evenly distributed, you can use a complex key containing the account number first and then the timestamp:
|
||
<p></p><p></p></div></section><section class="nRhiJb-DbgRPb-II5mzb-cGMI2b"><section><div class="kg99be" jscontroller="vkZm2d" jsaction="rcuQ6b:npT2md" data-text-to-copy="CREATE TABLE Transactions (
|
||
account_number INT64 NOT NULL,
|
||
timestamp TIMESTAMP NOT NULL,
|
||
transaction_info ...,
|
||
) PRIMARY KEY (account_number, timestamp DESC)" soy-skip ssk='4:dXrt'><div jsaction="click:VTVhdd" class="GaRnv"><svg class="" viewBox="0 0 20 20" role="presentation" aria-hidden="true" height=20 widdht=20><path d="M7.979 14.667c-.458 0-.84-.153-1.146-.459a1.53 1.53 0 0 1-.458-1.125V3.938c0-.459.153-.84.458-1.146.306-.306.688-.459 1.146-.459h6.625c.445 0 .823.156 1.136.469.312.313.468.691.468 1.136v9.145c0 .445-.156.82-.468 1.125a1.564 1.564 0 0 1-1.136.459H7.979Zm0-1.334h6.625c.083 0 .15-.024.198-.073a.239.239 0 0 0 .073-.177V3.938a.265.265 0 0 0-.073-.198.268.268 0 0 0-.198-.073H7.979a.268.268 0 0 0-.198.073.266.266 0 0 0-.073.198v9.145c0 .07.024.129.073.177a.267.267 0 0 0 .198.073ZM4.875 17.75a1.53 1.53 0 0 1-1.125-.458 1.532 1.532 0 0 1-.458-1.125V5.729h1.333v10.438c0 .07.024.128.073.177a.24.24 0 0 0 .177.073h7.937v1.333H4.875ZM7.708 3.667v9.666-9.666Z" fill="#1a73e8"/></svg></div><div jscontroller="M2lJBf" jsaction="rcuQ6b:npT2md" data-enable-content-editable-input-style="false" data-enable-line-wrapping data-read-only><div class="hg3Lgc qs41qe BEXrzd" data-loadingmessage="Loading..." jscontroller="GFartf" jsaction="animationend:kWijWc;dyRcpb:dyRcpb" data-active="true" jsname="aZ2wEe"><div class="eBrXtc" aria-live="polite" jsname="vyyg5">Loading...</div><div jsname="Hxlbvc" class="JdM54e"><div class="aopPX ZqnFk co39ub"><div class="e2XBBf uEtL3"><div class="kPEoYc GOJTSe"></div></div><div class="LqC3Y"><div class="kPEoYc GOJTSe"></div></div><div class="e2XBBf QR7YS"><div class="kPEoYc GOJTSe"></div></div></div><div class="aopPX fxjES Cn087"><div class="e2XBBf uEtL3"><div class="kPEoYc GOJTSe"></div></div><div class="LqC3Y"><div class="kPEoYc GOJTSe"></div></div><div class="e2XBBf QR7YS"><div class="kPEoYc GOJTSe"></div></div></div><div class="aopPX ZHXbZe hfsr6b"><div class="e2XBBf uEtL3"><div class="kPEoYc GOJTSe"></div></div><div class="LqC3Y"><div class="kPEoYc GOJTSe"></div></div><div class="e2XBBf QR7YS"><div class="kPEoYc GOJTSe"></div></div></div><div class="aopPX fDBOYb EjXFBf"><div class="e2XBBf uEtL3"><div class="kPEoYc GOJTSe"></div></div><div class="LqC3Y"><div class="kPEoYc GOJTSe"></div></div><div class="e2XBBf QR7YS"><div class="kPEoYc GOJTSe"></div></div></div></div></div><div dir="ltr"><textarea jsname="bqeLof" class="Fdco1c">CREATE TABLE Transactions (
|
||
account_number INT64 NOT NULL,
|
||
timestamp TIMESTAMP NOT NULL,
|
||
transaction_info ...,
|
||
) PRIMARY KEY (account_number, timestamp DESC)</textarea></div></div></div></section></section><section class="Wy08Ac nRhiJb-qJTHM-OWXEXe-hJDwNd nRhiJb-DbgRPb-II5mzb-cGMI2b"><div jsaction="rcuQ6b:npT2md" jscontroller="M0Q3Qb" data-is-cws-richtext="true" class=" "><p>The splits will be made primarily using the account number and not the timestamp, thus distributing the newly added rows over various splits.</p><p>Note that in this table, the timestamp is sorted by descending order. That’s because in most cases you want to read the most recent transactions—which will be first in the table—so you won’t need to scan through the entire table to find the most recent rows.</p><p>If you do not, or cannot have an external reference, or have any other data that you can use in the key in order to distribute the order, then you will need to perform application-level sharding, which is shown in the integer sequence example above. </p><p>Note, however, that using a simple hash will make queries by timestamp range extremely slow, since retrieving a range of timestamps will require a full table scan to cover all the hashes. Instead, we recommend generating a ShardId from the timestamp. So, for example,
|
||
</p></div></section><section class="nRhiJb-DbgRPb-II5mzb-cGMI2b"><section><div class="kg99be" jscontroller="vkZm2d" jsaction="rcuQ6b:npT2md" data-text-to-copy="TimestampShardId = CRC32(Timestamp) % 100" soy-skip ssk='4:dXrt'><div jsaction="click:VTVhdd" class="GaRnv"><svg class="" viewBox="0 0 20 20" role="presentation" aria-hidden="true" height=20 widdht=20><path d="M7.979 14.667c-.458 0-.84-.153-1.146-.459a1.53 1.53 0 0 1-.458-1.125V3.938c0-.459.153-.84.458-1.146.306-.306.688-.459 1.146-.459h6.625c.445 0 .823.156 1.136.469.312.313.468.691.468 1.136v9.145c0 .445-.156.82-.468 1.125a1.564 1.564 0 0 1-1.136.459H7.979Zm0-1.334h6.625c.083 0 .15-.024.198-.073a.239.239 0 0 0 .073-.177V3.938a.265.265 0 0 0-.073-.198.268.268 0 0 0-.198-.073H7.979a.268.268 0 0 0-.198.073.266.266 0 0 0-.073.198v9.145c0 .07.024.129.073.177a.267.267 0 0 0 .198.073ZM4.875 17.75a1.53 1.53 0 0 1-1.125-.458 1.532 1.532 0 0 1-.458-1.125V5.729h1.333v10.438c0 .07.024.128.073.177a.24.24 0 0 0 .177.073h7.937v1.333H4.875ZM7.708 3.667v9.666-9.666Z" fill="#1a73e8"/></svg></div><div jscontroller="M2lJBf" jsaction="rcuQ6b:npT2md" data-enable-content-editable-input-style="false" data-enable-line-wrapping data-read-only><div class="hg3Lgc qs41qe BEXrzd" data-loadingmessage="Loading..." jscontroller="GFartf" jsaction="animationend:kWijWc;dyRcpb:dyRcpb" data-active="true" jsname="aZ2wEe"><div class="eBrXtc" aria-live="polite" jsname="vyyg5">Loading...</div><div jsname="Hxlbvc" class="JdM54e"><div class="aopPX ZqnFk co39ub"><div class="e2XBBf uEtL3"><div class="kPEoYc GOJTSe"></div></div><div class="LqC3Y"><div class="kPEoYc GOJTSe"></div></div><div class="e2XBBf QR7YS"><div class="kPEoYc GOJTSe"></div></div></div><div class="aopPX fxjES Cn087"><div class="e2XBBf uEtL3"><div class="kPEoYc GOJTSe"></div></div><div class="LqC3Y"><div class="kPEoYc GOJTSe"></div></div><div class="e2XBBf QR7YS"><div class="kPEoYc GOJTSe"></div></div></div><div class="aopPX ZHXbZe hfsr6b"><div class="e2XBBf uEtL3"><div class="kPEoYc GOJTSe"></div></div><div class="LqC3Y"><div class="kPEoYc GOJTSe"></div></div><div class="e2XBBf QR7YS"><div class="kPEoYc GOJTSe"></div></div></div><div class="aopPX fDBOYb EjXFBf"><div class="e2XBBf uEtL3"><div class="kPEoYc GOJTSe"></div></div><div class="LqC3Y"><div class="kPEoYc GOJTSe"></div></div><div class="e2XBBf QR7YS"><div class="kPEoYc GOJTSe"></div></div></div></div></div><div dir="ltr"><textarea jsname="bqeLof" class="Fdco1c">TimestampShardId = CRC32(Timestamp) % 100</textarea></div></div></div></section></section><section class="Wy08Ac nRhiJb-qJTHM-OWXEXe-hJDwNd nRhiJb-DbgRPb-II5mzb-cGMI2b"><div jsaction="rcuQ6b:npT2md" jscontroller="M0Q3Qb" data-is-cws-richtext="true" class=" "><p>will return a pseudo-random value between 0 and 99 from the timestamp. Then, you can use this ShardId in the table key so that sequential timestamps are distributed across multiple splits, like so:
|
||
</p></div></section><section class="nRhiJb-DbgRPb-II5mzb-cGMI2b"><section><div class="kg99be" jscontroller="vkZm2d" jsaction="rcuQ6b:npT2md" data-text-to-copy="CREATE TABLE Events (
|
||
TimestampShardId INT64 NOT NULL
|
||
Timestamp TIMESTAMP NOT NULL,
|
||
event_info...
|
||
) PRIMARY KEY (TimestampShardId, Timestamp DESC)" soy-skip ssk='4:dXrt'><div jsaction="click:VTVhdd" class="GaRnv"><svg class="" viewBox="0 0 20 20" role="presentation" aria-hidden="true" height=20 widdht=20><path d="M7.979 14.667c-.458 0-.84-.153-1.146-.459a1.53 1.53 0 0 1-.458-1.125V3.938c0-.459.153-.84.458-1.146.306-.306.688-.459 1.146-.459h6.625c.445 0 .823.156 1.136.469.312.313.468.691.468 1.136v9.145c0 .445-.156.82-.468 1.125a1.564 1.564 0 0 1-1.136.459H7.979Zm0-1.334h6.625c.083 0 .15-.024.198-.073a.239.239 0 0 0 .073-.177V3.938a.265.265 0 0 0-.073-.198.268.268 0 0 0-.198-.073H7.979a.268.268 0 0 0-.198.073.266.266 0 0 0-.073.198v9.145c0 .07.024.129.073.177a.267.267 0 0 0 .198.073ZM4.875 17.75a1.53 1.53 0 0 1-1.125-.458 1.532 1.532 0 0 1-.458-1.125V5.729h1.333v10.438c0 .07.024.128.073.177a.24.24 0 0 0 .177.073h7.937v1.333H4.875ZM7.708 3.667v9.666-9.666Z" fill="#1a73e8"/></svg></div><div jscontroller="M2lJBf" jsaction="rcuQ6b:npT2md" data-enable-content-editable-input-style="false" data-enable-line-wrapping data-read-only><div class="hg3Lgc qs41qe BEXrzd" data-loadingmessage="Loading..." jscontroller="GFartf" jsaction="animationend:kWijWc;dyRcpb:dyRcpb" data-active="true" jsname="aZ2wEe"><div class="eBrXtc" aria-live="polite" jsname="vyyg5">Loading...</div><div jsname="Hxlbvc" class="JdM54e"><div class="aopPX ZqnFk co39ub"><div class="e2XBBf uEtL3"><div class="kPEoYc GOJTSe"></div></div><div class="LqC3Y"><div class="kPEoYc GOJTSe"></div></div><div class="e2XBBf QR7YS"><div class="kPEoYc GOJTSe"></div></div></div><div class="aopPX fxjES Cn087"><div class="e2XBBf uEtL3"><div class="kPEoYc GOJTSe"></div></div><div class="LqC3Y"><div class="kPEoYc GOJTSe"></div></div><div class="e2XBBf QR7YS"><div class="kPEoYc GOJTSe"></div></div></div><div class="aopPX ZHXbZe hfsr6b"><div class="e2XBBf uEtL3"><div class="kPEoYc GOJTSe"></div></div><div class="LqC3Y"><div class="kPEoYc GOJTSe"></div></div><div class="e2XBBf QR7YS"><div class="kPEoYc GOJTSe"></div></div></div><div class="aopPX fDBOYb EjXFBf"><div class="e2XBBf uEtL3"><div class="kPEoYc GOJTSe"></div></div><div class="LqC3Y"><div class="kPEoYc GOJTSe"></div></div><div class="e2XBBf QR7YS"><div class="kPEoYc GOJTSe"></div></div></div></div></div><div dir="ltr"><textarea jsname="bqeLof" class="Fdco1c">CREATE TABLE Events (
|
||
TimestampShardId INT64 NOT NULL
|
||
Timestamp TIMESTAMP NOT NULL,
|
||
event_info...
|
||
) PRIMARY KEY (TimestampShardId, Timestamp DESC)</textarea></div></div></div></section></section><section class="Wy08Ac nRhiJb-qJTHM-OWXEXe-hJDwNd nRhiJb-DbgRPb-II5mzb-cGMI2b"><div jsaction="rcuQ6b:npT2md" jscontroller="M0Q3Qb" data-is-cws-richtext="true" class=" "><p>For example, a table with dates of the first 10 days of 2018 (which without ShardId would be stored in the table in date order) will give the following ordering:</p></div></section><section class="QzPuud"><div><section><figure class="NEBdNd"><section class="PBkdHd DhGbH" jscontroller="SCGBie" jsaction="rcuQ6b:npT2md"><img class="JcsBte mZzdH H05fDc" src="https://storage.googleapis.com/gweb-cloudblog-publish/images/gcp-TimestampShardId1ek6.max-400x400.PNG" alt="https://storage.googleapis.com/gweb-cloudblog-publish/images/gcp-TimestampShardId1ek6.max-400x400.PNG" jsname='P3Vluc' jsaction="click:HTIlC" loading="lazy"/><section class="glue-modal glue-modal--dark QHdDac" role="dialog" aria-modal="true"><img class="JcsBte mZzdH H05fDc" src="https://storage.googleapis.com/gweb-cloudblog-publish/images/gcp-TimestampShardId1ek6.max-400x400.PNG" alt="https://storage.googleapis.com/gweb-cloudblog-publish/images/gcp-TimestampShardId1ek6.max-400x400.PNG" jsname='P3Vluc' jsaction="click:HTIlC" loading="lazy"/><button class="glue-modal__close-btn" tabindex="0" aria-label="Close this modal"></button></section></section></figure></section></div></section><section class="Wy08Ac nRhiJb-qJTHM-OWXEXe-hJDwNd nRhiJb-DbgRPb-II5mzb-cGMI2b"><div jsaction="rcuQ6b:npT2md" jscontroller="M0Q3Qb" data-is-cws-richtext="true" class=" "><p>When a query is made, you must use a BETWEEN clause to be able to select across all shards without performing a table scan:
|
||
</p></div></section><section class="nRhiJb-DbgRPb-II5mzb-cGMI2b"><section><div class="kg99be" jscontroller="vkZm2d" jsaction="rcuQ6b:npT2md" data-text-to-copy="Select * from Events
|
||
WHERE
|
||
TimestampShardId BETWEEN 0 AND 99
|
||
AND Timestamp > @lower_bound
|
||
AND Timestamp < @upper_bound;" soy-skip ssk='4:dXrt'><div jsaction="click:VTVhdd" class="GaRnv"><svg class="" viewBox="0 0 20 20" role="presentation" aria-hidden="true" height=20 widdht=20><path d="M7.979 14.667c-.458 0-.84-.153-1.146-.459a1.53 1.53 0 0 1-.458-1.125V3.938c0-.459.153-.84.458-1.146.306-.306.688-.459 1.146-.459h6.625c.445 0 .823.156 1.136.469.312.313.468.691.468 1.136v9.145c0 .445-.156.82-.468 1.125a1.564 1.564 0 0 1-1.136.459H7.979Zm0-1.334h6.625c.083 0 .15-.024.198-.073a.239.239 0 0 0 .073-.177V3.938a.265.265 0 0 0-.073-.198.268.268 0 0 0-.198-.073H7.979a.268.268 0 0 0-.198.073.266.266 0 0 0-.073.198v9.145c0 .07.024.129.073.177a.267.267 0 0 0 .198.073ZM4.875 17.75a1.53 1.53 0 0 1-1.125-.458 1.532 1.532 0 0 1-.458-1.125V5.729h1.333v10.438c0 .07.024.128.073.177a.24.24 0 0 0 .177.073h7.937v1.333H4.875ZM7.708 3.667v9.666-9.666Z" fill="#1a73e8"/></svg></div><div jscontroller="M2lJBf" jsaction="rcuQ6b:npT2md" data-enable-content-editable-input-style="false" data-enable-line-wrapping data-read-only><div class="hg3Lgc qs41qe BEXrzd" data-loadingmessage="Loading..." jscontroller="GFartf" jsaction="animationend:kWijWc;dyRcpb:dyRcpb" data-active="true" jsname="aZ2wEe"><div class="eBrXtc" aria-live="polite" jsname="vyyg5">Loading...</div><div jsname="Hxlbvc" class="JdM54e"><div class="aopPX ZqnFk co39ub"><div class="e2XBBf uEtL3"><div class="kPEoYc GOJTSe"></div></div><div class="LqC3Y"><div class="kPEoYc GOJTSe"></div></div><div class="e2XBBf QR7YS"><div class="kPEoYc GOJTSe"></div></div></div><div class="aopPX fxjES Cn087"><div class="e2XBBf uEtL3"><div class="kPEoYc GOJTSe"></div></div><div class="LqC3Y"><div class="kPEoYc GOJTSe"></div></div><div class="e2XBBf QR7YS"><div class="kPEoYc GOJTSe"></div></div></div><div class="aopPX ZHXbZe hfsr6b"><div class="e2XBBf uEtL3"><div class="kPEoYc GOJTSe"></div></div><div class="LqC3Y"><div class="kPEoYc GOJTSe"></div></div><div class="e2XBBf QR7YS"><div class="kPEoYc GOJTSe"></div></div></div><div class="aopPX fDBOYb EjXFBf"><div class="e2XBBf uEtL3"><div class="kPEoYc GOJTSe"></div></div><div class="LqC3Y"><div class="kPEoYc GOJTSe"></div></div><div class="e2XBBf QR7YS"><div class="kPEoYc GOJTSe"></div></div></div></div></div><div dir="ltr"><textarea jsname="bqeLof" class="Fdco1c">Select * from Events
|
||
WHERE
|
||
TimestampShardId BETWEEN 0 AND 99
|
||
AND Timestamp > @lower_bound
|
||
AND Timestamp < @upper_bound;</textarea></div></div></div></section></section><section class="Wy08Ac nRhiJb-qJTHM-OWXEXe-hJDwNd nRhiJb-DbgRPb-II5mzb-cGMI2b"><div jsaction="rcuQ6b:npT2md" jscontroller="M0Q3Qb" data-is-cws-richtext="true" class=" "><p>Note that the ShardId is only a way of improving key distribution so that Cloud Spanner can use multiple splits to store sequential timestamps. It does not identify an actual database split, and rows in different tables with the same ShardId may well be in different splits.</p><h3>
|
||
Migration implications</h3>
|
||
When you’re migrating from an existing RDBMS that uses keys that are not optimal for Cloud Spanner, take the above considerations into account. If necessary, add key hashes to tables or change the key ordering.<p></p><p></p><h3>
|
||
Deciding on indexes in Cloud Spanner</h3>
|
||
In a traditional RDBMS, indexes are very efficient ways of looking up rows in a table by a value that is not the primary key. Under most circumstances, a row lookup via an index will take approximately the same time as a row lookup via its key. That’s because the table and the index are managed by a single node, so the index can point directly to the on-disk row of the table. <p>In Cloud Spanner, indexes are actually implemented using tables, which allows them to be distributed and enables the same degree of scalability and performance as normal tables. </p><p>However, because of this type of implementation, using indexes to read the data from the table row is less efficient than in a traditional RDBMS. It’s effectively an inner join with the original table, so reading from a table using an indexed key turns into this process:
|
||
<br></p><ul>
|
||
<li>Look up split for index key</li>
|
||
<li>Read index row from split to get table key</li>
|
||
<li>Look up split for table key</li>
|
||
<li>Read table row from split to get row values</li>
|
||
<li>Return row values</li>
|
||
</ul>
|
||
Note that there is no guarantee that the split for the index key is on the same node as the split for the table key, so a simple index query may require cross-node communication just to read one row.<p>Similarly, updating an indexed table will most likely require a multi-node write to update the table row and the index row. So using an index in Cloud Spanner is always a trade-off between improved read performance and reduced write performance. </p><h3>
|
||
Index keys and hotspots</h3>
|
||
Because indexes are implemented as tables in Cloud Spanner, you’ll encounter the same issues with the indexed columns as you did with the table keys: An index on a column with poorly distributed values (such as a timestamp) will lead to the creation of a hotspot, even if the underlying table is using well-distributed keys. That’s because when rows are appended to the table, the index will also have new rows appended, and writes for these new rows will always be sent to the same split.<p>Therefore, care must be taken when creating indexes, and we recommend that you create indexes only using columns which have a well-distributed set of values, just like when choosing a table key. </p><p>In some cases, you’ll need to do application-level sharding for the indexed columns in order to create a synthetic ShardId column, which can be used in the index to distribute values over the splits.</p><p>For example, this configuration below will create a hotspot when appending events due to the index, even if UserId is randomly distributed.
|
||
</p></div></section><section class="nRhiJb-DbgRPb-II5mzb-cGMI2b"><section><div class="kg99be" jscontroller="vkZm2d" jsaction="rcuQ6b:npT2md" data-text-to-copy="CREATE TABLE Events (
|
||
UserId String(MAX),
|
||
Timestamp TIMESTAMP,
|
||
EventData)
|
||
PRIMARY KEY (UserId, Timestamp DESC);
|
||
CREATE INDEX EventsByTimestamp ON Events (Timestamp DESC);" soy-skip ssk='4:dXrt'><div jsaction="click:VTVhdd" class="GaRnv"><svg class="" viewBox="0 0 20 20" role="presentation" aria-hidden="true" height=20 widdht=20><path d="M7.979 14.667c-.458 0-.84-.153-1.146-.459a1.53 1.53 0 0 1-.458-1.125V3.938c0-.459.153-.84.458-1.146.306-.306.688-.459 1.146-.459h6.625c.445 0 .823.156 1.136.469.312.313.468.691.468 1.136v9.145c0 .445-.156.82-.468 1.125a1.564 1.564 0 0 1-1.136.459H7.979Zm0-1.334h6.625c.083 0 .15-.024.198-.073a.239.239 0 0 0 .073-.177V3.938a.265.265 0 0 0-.073-.198.268.268 0 0 0-.198-.073H7.979a.268.268 0 0 0-.198.073.266.266 0 0 0-.073.198v9.145c0 .07.024.129.073.177a.267.267 0 0 0 .198.073ZM4.875 17.75a1.53 1.53 0 0 1-1.125-.458 1.532 1.532 0 0 1-.458-1.125V5.729h1.333v10.438c0 .07.024.128.073.177a.24.24 0 0 0 .177.073h7.937v1.333H4.875ZM7.708 3.667v9.666-9.666Z" fill="#1a73e8"/></svg></div><div jscontroller="M2lJBf" jsaction="rcuQ6b:npT2md" data-enable-content-editable-input-style="false" data-enable-line-wrapping data-read-only><div class="hg3Lgc qs41qe BEXrzd" data-loadingmessage="Loading..." jscontroller="GFartf" jsaction="animationend:kWijWc;dyRcpb:dyRcpb" data-active="true" jsname="aZ2wEe"><div class="eBrXtc" aria-live="polite" jsname="vyyg5">Loading...</div><div jsname="Hxlbvc" class="JdM54e"><div class="aopPX ZqnFk co39ub"><div class="e2XBBf uEtL3"><div class="kPEoYc GOJTSe"></div></div><div class="LqC3Y"><div class="kPEoYc GOJTSe"></div></div><div class="e2XBBf QR7YS"><div class="kPEoYc GOJTSe"></div></div></div><div class="aopPX fxjES Cn087"><div class="e2XBBf uEtL3"><div class="kPEoYc GOJTSe"></div></div><div class="LqC3Y"><div class="kPEoYc GOJTSe"></div></div><div class="e2XBBf QR7YS"><div class="kPEoYc GOJTSe"></div></div></div><div class="aopPX ZHXbZe hfsr6b"><div class="e2XBBf uEtL3"><div class="kPEoYc GOJTSe"></div></div><div class="LqC3Y"><div class="kPEoYc GOJTSe"></div></div><div class="e2XBBf QR7YS"><div class="kPEoYc GOJTSe"></div></div></div><div class="aopPX fDBOYb EjXFBf"><div class="e2XBBf uEtL3"><div class="kPEoYc GOJTSe"></div></div><div class="LqC3Y"><div class="kPEoYc GOJTSe"></div></div><div class="e2XBBf QR7YS"><div class="kPEoYc GOJTSe"></div></div></div></div></div><div dir="ltr"><textarea jsname="bqeLof" class="Fdco1c">CREATE TABLE Events (
|
||
UserId String(MAX),
|
||
Timestamp TIMESTAMP,
|
||
EventData)
|
||
PRIMARY KEY (UserId, Timestamp DESC);
|
||
CREATE INDEX EventsByTimestamp ON Events (Timestamp DESC);</textarea></div></div></div></section></section><section class="Wy08Ac nRhiJb-qJTHM-OWXEXe-hJDwNd nRhiJb-DbgRPb-II5mzb-cGMI2b"><div jsaction="rcuQ6b:npT2md" jscontroller="M0Q3Qb" data-is-cws-richtext="true" class=" "><p>As with a table keyed by timestamp only, a synthetic ShardId column will need to be added to the table, and then used as the first indexed column to help the distribution of the index among the splits.</p><p>A simple ShardId generator could be:
|
||
</p></div></section><section class="nRhiJb-DbgRPb-II5mzb-cGMI2b"><section><div class="kg99be" jscontroller="vkZm2d" jsaction="rcuQ6b:npT2md" data-text-to-copy="TimestampShardId = CRC32(Timestamp) % 100" soy-skip ssk='4:dXrt'><div jsaction="click:VTVhdd" class="GaRnv"><svg class="" viewBox="0 0 20 20" role="presentation" aria-hidden="true" height=20 widdht=20><path d="M7.979 14.667c-.458 0-.84-.153-1.146-.459a1.53 1.53 0 0 1-.458-1.125V3.938c0-.459.153-.84.458-1.146.306-.306.688-.459 1.146-.459h6.625c.445 0 .823.156 1.136.469.312.313.468.691.468 1.136v9.145c0 .445-.156.82-.468 1.125a1.564 1.564 0 0 1-1.136.459H7.979Zm0-1.334h6.625c.083 0 .15-.024.198-.073a.239.239 0 0 0 .073-.177V3.938a.265.265 0 0 0-.073-.198.268.268 0 0 0-.198-.073H7.979a.268.268 0 0 0-.198.073.266.266 0 0 0-.073.198v9.145c0 .07.024.129.073.177a.267.267 0 0 0 .198.073ZM4.875 17.75a1.53 1.53 0 0 1-1.125-.458 1.532 1.532 0 0 1-.458-1.125V5.729h1.333v10.438c0 .07.024.128.073.177a.24.24 0 0 0 .177.073h7.937v1.333H4.875ZM7.708 3.667v9.666-9.666Z" fill="#1a73e8"/></svg></div><div jscontroller="M2lJBf" jsaction="rcuQ6b:npT2md" data-enable-content-editable-input-style="false" data-enable-line-wrapping data-read-only><div class="hg3Lgc qs41qe BEXrzd" data-loadingmessage="Loading..." jscontroller="GFartf" jsaction="animationend:kWijWc;dyRcpb:dyRcpb" data-active="true" jsname="aZ2wEe"><div class="eBrXtc" aria-live="polite" jsname="vyyg5">Loading...</div><div jsname="Hxlbvc" class="JdM54e"><div class="aopPX ZqnFk co39ub"><div class="e2XBBf uEtL3"><div class="kPEoYc GOJTSe"></div></div><div class="LqC3Y"><div class="kPEoYc GOJTSe"></div></div><div class="e2XBBf QR7YS"><div class="kPEoYc GOJTSe"></div></div></div><div class="aopPX fxjES Cn087"><div class="e2XBBf uEtL3"><div class="kPEoYc GOJTSe"></div></div><div class="LqC3Y"><div class="kPEoYc GOJTSe"></div></div><div class="e2XBBf QR7YS"><div class="kPEoYc GOJTSe"></div></div></div><div class="aopPX ZHXbZe hfsr6b"><div class="e2XBBf uEtL3"><div class="kPEoYc GOJTSe"></div></div><div class="LqC3Y"><div class="kPEoYc GOJTSe"></div></div><div class="e2XBBf QR7YS"><div class="kPEoYc GOJTSe"></div></div></div><div class="aopPX fDBOYb EjXFBf"><div class="e2XBBf uEtL3"><div class="kPEoYc GOJTSe"></div></div><div class="LqC3Y"><div class="kPEoYc GOJTSe"></div></div><div class="e2XBBf QR7YS"><div class="kPEoYc GOJTSe"></div></div></div></div></div><div dir="ltr"><textarea jsname="bqeLof" class="Fdco1c">TimestampShardId = CRC32(Timestamp) % 100</textarea></div></div></div></section></section><section class="Wy08Ac nRhiJb-qJTHM-OWXEXe-hJDwNd nRhiJb-DbgRPb-II5mzb-cGMI2b"><div jsaction="rcuQ6b:npT2md" jscontroller="M0Q3Qb" data-is-cws-richtext="true" class=" "><p>which will give a hash value between 0 and 99 from the timestamp. You’ll need to add this to the original table as a new column, then use it as the first index key, like this:
|
||
</p></div></section><section class="nRhiJb-DbgRPb-II5mzb-cGMI2b"><section><div class="kg99be" jscontroller="vkZm2d" jsaction="rcuQ6b:npT2md" data-text-to-copy="CREATE TABLE Events (
|
||
UserId String(MAX),
|
||
Timestamp TIMESTAMP,
|
||
TimestampShardId INT64,
|
||
EventData)
|
||
PRIMARY KEY (UserId, Timestamp DESC);
|
||
CREATE INDEX EventsByTimestamp ON Events (TimestampShardId,Timestamp);" soy-skip ssk='4:dXrt'><div jsaction="click:VTVhdd" class="GaRnv"><svg class="" viewBox="0 0 20 20" role="presentation" aria-hidden="true" height=20 widdht=20><path d="M7.979 14.667c-.458 0-.84-.153-1.146-.459a1.53 1.53 0 0 1-.458-1.125V3.938c0-.459.153-.84.458-1.146.306-.306.688-.459 1.146-.459h6.625c.445 0 .823.156 1.136.469.312.313.468.691.468 1.136v9.145c0 .445-.156.82-.468 1.125a1.564 1.564 0 0 1-1.136.459H7.979Zm0-1.334h6.625c.083 0 .15-.024.198-.073a.239.239 0 0 0 .073-.177V3.938a.265.265 0 0 0-.073-.198.268.268 0 0 0-.198-.073H7.979a.268.268 0 0 0-.198.073.266.266 0 0 0-.073.198v9.145c0 .07.024.129.073.177a.267.267 0 0 0 .198.073ZM4.875 17.75a1.53 1.53 0 0 1-1.125-.458 1.532 1.532 0 0 1-.458-1.125V5.729h1.333v10.438c0 .07.024.128.073.177a.24.24 0 0 0 .177.073h7.937v1.333H4.875ZM7.708 3.667v9.666-9.666Z" fill="#1a73e8"/></svg></div><div jscontroller="M2lJBf" jsaction="rcuQ6b:npT2md" data-enable-content-editable-input-style="false" data-enable-line-wrapping data-read-only><div class="hg3Lgc qs41qe BEXrzd" data-loadingmessage="Loading..." jscontroller="GFartf" jsaction="animationend:kWijWc;dyRcpb:dyRcpb" data-active="true" jsname="aZ2wEe"><div class="eBrXtc" aria-live="polite" jsname="vyyg5">Loading...</div><div jsname="Hxlbvc" class="JdM54e"><div class="aopPX ZqnFk co39ub"><div class="e2XBBf uEtL3"><div class="kPEoYc GOJTSe"></div></div><div class="LqC3Y"><div class="kPEoYc GOJTSe"></div></div><div class="e2XBBf QR7YS"><div class="kPEoYc GOJTSe"></div></div></div><div class="aopPX fxjES Cn087"><div class="e2XBBf uEtL3"><div class="kPEoYc GOJTSe"></div></div><div class="LqC3Y"><div class="kPEoYc GOJTSe"></div></div><div class="e2XBBf QR7YS"><div class="kPEoYc GOJTSe"></div></div></div><div class="aopPX ZHXbZe hfsr6b"><div class="e2XBBf uEtL3"><div class="kPEoYc GOJTSe"></div></div><div class="LqC3Y"><div class="kPEoYc GOJTSe"></div></div><div class="e2XBBf QR7YS"><div class="kPEoYc GOJTSe"></div></div></div><div class="aopPX fDBOYb EjXFBf"><div class="e2XBBf uEtL3"><div class="kPEoYc GOJTSe"></div></div><div class="LqC3Y"><div class="kPEoYc GOJTSe"></div></div><div class="e2XBBf QR7YS"><div class="kPEoYc GOJTSe"></div></div></div></div></div><div dir="ltr"><textarea jsname="bqeLof" class="Fdco1c">CREATE TABLE Events (
|
||
UserId String(MAX),
|
||
Timestamp TIMESTAMP,
|
||
TimestampShardId INT64,
|
||
EventData)
|
||
PRIMARY KEY (UserId, Timestamp DESC);
|
||
CREATE INDEX EventsByTimestamp ON Events (TimestampShardId,Timestamp);</textarea></div></div></div></section></section><section class="Wy08Ac nRhiJb-qJTHM-OWXEXe-hJDwNd nRhiJb-DbgRPb-II5mzb-cGMI2b"><div jsaction="rcuQ6b:npT2md" jscontroller="M0Q3Qb" data-is-cws-richtext="true" class=" "><p>This will remove the hotspot on index update, but will slow down range queries on timestamp, since you’ll have to run the query for each ShardId value (0-99) to get the timestamp range from all shards:
|
||
</p></div></section><section class="nRhiJb-DbgRPb-II5mzb-cGMI2b"><section><div class="kg99be" jscontroller="vkZm2d" jsaction="rcuQ6b:npT2md" data-text-to-copy="Select * from Events@{FORCE_INDEX=EventsByTimestamp}
|
||
WHERE
|
||
TimestampShardId BETWEEN 0 AND 99
|
||
AND Timestamp > @lower_bound
|
||
AND Timestamp < @upper_bound;" soy-skip ssk='4:dXrt'><div jsaction="click:VTVhdd" class="GaRnv"><svg class="" viewBox="0 0 20 20" role="presentation" aria-hidden="true" height=20 widdht=20><path d="M7.979 14.667c-.458 0-.84-.153-1.146-.459a1.53 1.53 0 0 1-.458-1.125V3.938c0-.459.153-.84.458-1.146.306-.306.688-.459 1.146-.459h6.625c.445 0 .823.156 1.136.469.312.313.468.691.468 1.136v9.145c0 .445-.156.82-.468 1.125a1.564 1.564 0 0 1-1.136.459H7.979Zm0-1.334h6.625c.083 0 .15-.024.198-.073a.239.239 0 0 0 .073-.177V3.938a.265.265 0 0 0-.073-.198.268.268 0 0 0-.198-.073H7.979a.268.268 0 0 0-.198.073.266.266 0 0 0-.073.198v9.145c0 .07.024.129.073.177a.267.267 0 0 0 .198.073ZM4.875 17.75a1.53 1.53 0 0 1-1.125-.458 1.532 1.532 0 0 1-.458-1.125V5.729h1.333v10.438c0 .07.024.128.073.177a.24.24 0 0 0 .177.073h7.937v1.333H4.875ZM7.708 3.667v9.666-9.666Z" fill="#1a73e8"/></svg></div><div jscontroller="M2lJBf" jsaction="rcuQ6b:npT2md" data-enable-content-editable-input-style="false" data-enable-line-wrapping data-read-only><div class="hg3Lgc qs41qe BEXrzd" data-loadingmessage="Loading..." jscontroller="GFartf" jsaction="animationend:kWijWc;dyRcpb:dyRcpb" data-active="true" jsname="aZ2wEe"><div class="eBrXtc" aria-live="polite" jsname="vyyg5">Loading...</div><div jsname="Hxlbvc" class="JdM54e"><div class="aopPX ZqnFk co39ub"><div class="e2XBBf uEtL3"><div class="kPEoYc GOJTSe"></div></div><div class="LqC3Y"><div class="kPEoYc GOJTSe"></div></div><div class="e2XBBf QR7YS"><div class="kPEoYc GOJTSe"></div></div></div><div class="aopPX fxjES Cn087"><div class="e2XBBf uEtL3"><div class="kPEoYc GOJTSe"></div></div><div class="LqC3Y"><div class="kPEoYc GOJTSe"></div></div><div class="e2XBBf QR7YS"><div class="kPEoYc GOJTSe"></div></div></div><div class="aopPX ZHXbZe hfsr6b"><div class="e2XBBf uEtL3"><div class="kPEoYc GOJTSe"></div></div><div class="LqC3Y"><div class="kPEoYc GOJTSe"></div></div><div class="e2XBBf QR7YS"><div class="kPEoYc GOJTSe"></div></div></div><div class="aopPX fDBOYb EjXFBf"><div class="e2XBBf uEtL3"><div class="kPEoYc GOJTSe"></div></div><div class="LqC3Y"><div class="kPEoYc GOJTSe"></div></div><div class="e2XBBf QR7YS"><div class="kPEoYc GOJTSe"></div></div></div></div></div><div dir="ltr"><textarea jsname="bqeLof" class="Fdco1c">Select * from Events@{FORCE_INDEX=EventsByTimestamp}
|
||
WHERE
|
||
TimestampShardId BETWEEN 0 AND 99
|
||
AND Timestamp > @lower_bound
|
||
AND Timestamp < @upper_bound;</textarea></div></div></div></section></section><section class="Wy08Ac nRhiJb-qJTHM-OWXEXe-hJDwNd nRhiJb-DbgRPb-II5mzb-cGMI2b"><div jsaction="rcuQ6b:npT2md" jscontroller="M0Q3Qb" data-is-cws-richtext="true" class=" "><p>Using this type of index and sharding strategy must strike a balance between the additional complexity when reading and the increase in performance of an indexed query.
|
||
<br></p><h3>
|
||
Other indexes you should know</h3>
|
||
When you’re migrating to Cloud Spanner, you’ll also want to understand how these other index types function and when you might need to use them:
|
||
<br><h3>
|
||
NULL_FILTERED indexes</h3>
|
||
By default, Cloud Spanner will index rows using NULL indexed column values. A NULL is considered to be the smallest possible value, so these values will appear at the start of the index.<p>It’s also possible to disable this behavior by using the <a href="https://cloud.google.com/spanner/docs/secondary-indexes#indexing_of_nulls">CREATE NULL_FILTERED INDEX</a> syntax, which will create an index ignoring rows with NULL indexed column values.</p><p>This index will be smaller than the complete index, as it will effectively be a materialized filtered view on the table, and will be faster to query than the full table when a table scan is necessary. </p><h3>
|
||
UNIQUE indexes</h3>
|
||
You can use a <a href="https://cloud.google.com/spanner/docs/secondary-indexes#unique_indexes">UNIQUE</a> index to enforce that a column of a table has unique values. This constraint will be applied at transaction commit time (and at index creation).<p></p><p></p><h3>
|
||
Covering Indexes and STORING clause</h3>
|
||
To optimize performance when reading from indexes, Cloud Spanner can store the column values of the table row in the index itself, removing the need to read the table. This is known as a Covering Index. This is achieved by using the STORING clause when defining the index. The values of the column can then be read directly from the index, so reading from the index performs as well as reading from the table.
|
||
For example, this table contains employee data:
|
||
<p></p><p></p></div></section><section class="nRhiJb-DbgRPb-II5mzb-cGMI2b"><section><div class="kg99be" jscontroller="vkZm2d" jsaction="rcuQ6b:npT2md" data-text-to-copy="CREATE TABLE Employees (
|
||
CompanyUUID INT64,
|
||
EmployeeUUID INT64,
|
||
FullName STRING(MAX)
|
||
...
|
||
) PRIMARY KEY (CompanyUUID,EmployeeUUID)" soy-skip ssk='4:dXrt'><div jsaction="click:VTVhdd" class="GaRnv"><svg class="" viewBox="0 0 20 20" role="presentation" aria-hidden="true" height=20 widdht=20><path d="M7.979 14.667c-.458 0-.84-.153-1.146-.459a1.53 1.53 0 0 1-.458-1.125V3.938c0-.459.153-.84.458-1.146.306-.306.688-.459 1.146-.459h6.625c.445 0 .823.156 1.136.469.312.313.468.691.468 1.136v9.145c0 .445-.156.82-.468 1.125a1.564 1.564 0 0 1-1.136.459H7.979Zm0-1.334h6.625c.083 0 .15-.024.198-.073a.239.239 0 0 0 .073-.177V3.938a.265.265 0 0 0-.073-.198.268.268 0 0 0-.198-.073H7.979a.268.268 0 0 0-.198.073.266.266 0 0 0-.073.198v9.145c0 .07.024.129.073.177a.267.267 0 0 0 .198.073ZM4.875 17.75a1.53 1.53 0 0 1-1.125-.458 1.532 1.532 0 0 1-.458-1.125V5.729h1.333v10.438c0 .07.024.128.073.177a.24.24 0 0 0 .177.073h7.937v1.333H4.875ZM7.708 3.667v9.666-9.666Z" fill="#1a73e8"/></svg></div><div jscontroller="M2lJBf" jsaction="rcuQ6b:npT2md" data-enable-content-editable-input-style="false" data-enable-line-wrapping data-read-only><div class="hg3Lgc qs41qe BEXrzd" data-loadingmessage="Loading..." jscontroller="GFartf" jsaction="animationend:kWijWc;dyRcpb:dyRcpb" data-active="true" jsname="aZ2wEe"><div class="eBrXtc" aria-live="polite" jsname="vyyg5">Loading...</div><div jsname="Hxlbvc" class="JdM54e"><div class="aopPX ZqnFk co39ub"><div class="e2XBBf uEtL3"><div class="kPEoYc GOJTSe"></div></div><div class="LqC3Y"><div class="kPEoYc GOJTSe"></div></div><div class="e2XBBf QR7YS"><div class="kPEoYc GOJTSe"></div></div></div><div class="aopPX fxjES Cn087"><div class="e2XBBf uEtL3"><div class="kPEoYc GOJTSe"></div></div><div class="LqC3Y"><div class="kPEoYc GOJTSe"></div></div><div class="e2XBBf QR7YS"><div class="kPEoYc GOJTSe"></div></div></div><div class="aopPX ZHXbZe hfsr6b"><div class="e2XBBf uEtL3"><div class="kPEoYc GOJTSe"></div></div><div class="LqC3Y"><div class="kPEoYc GOJTSe"></div></div><div class="e2XBBf QR7YS"><div class="kPEoYc GOJTSe"></div></div></div><div class="aopPX fDBOYb EjXFBf"><div class="e2XBBf uEtL3"><div class="kPEoYc GOJTSe"></div></div><div class="LqC3Y"><div class="kPEoYc GOJTSe"></div></div><div class="e2XBBf QR7YS"><div class="kPEoYc GOJTSe"></div></div></div></div></div><div dir="ltr"><textarea jsname="bqeLof" class="Fdco1c">CREATE TABLE Employees (
|
||
CompanyUUID INT64,
|
||
EmployeeUUID INT64,
|
||
FullName STRING(MAX)
|
||
...
|
||
) PRIMARY KEY (CompanyUUID,EmployeeUUID)</textarea></div></div></div></section></section><section class="Wy08Ac nRhiJb-qJTHM-OWXEXe-hJDwNd nRhiJb-DbgRPb-II5mzb-cGMI2b"><div jsaction="rcuQ6b:npT2md" jscontroller="M0Q3Qb" data-is-cws-richtext="true" class=" "><p>If you often need to look up an employee’s full name, for example, you can create an index on employeeUUID, storing the full name for rapid lookups:
|
||
</p></div></section><section class="nRhiJb-DbgRPb-II5mzb-cGMI2b"><section><div class="kg99be" jscontroller="vkZm2d" jsaction="rcuQ6b:npT2md" data-text-to-copy="CREATE INDEX EmployeesById
|
||
ON Employees (EmployeeUUID)
|
||
STORING (FullName);" soy-skip ssk='4:dXrt'><div jsaction="click:VTVhdd" class="GaRnv"><svg class="" viewBox="0 0 20 20" role="presentation" aria-hidden="true" height=20 widdht=20><path d="M7.979 14.667c-.458 0-.84-.153-1.146-.459a1.53 1.53 0 0 1-.458-1.125V3.938c0-.459.153-.84.458-1.146.306-.306.688-.459 1.146-.459h6.625c.445 0 .823.156 1.136.469.312.313.468.691.468 1.136v9.145c0 .445-.156.82-.468 1.125a1.564 1.564 0 0 1-1.136.459H7.979Zm0-1.334h6.625c.083 0 .15-.024.198-.073a.239.239 0 0 0 .073-.177V3.938a.265.265 0 0 0-.073-.198.268.268 0 0 0-.198-.073H7.979a.268.268 0 0 0-.198.073.266.266 0 0 0-.073.198v9.145c0 .07.024.129.073.177a.267.267 0 0 0 .198.073ZM4.875 17.75a1.53 1.53 0 0 1-1.125-.458 1.532 1.532 0 0 1-.458-1.125V5.729h1.333v10.438c0 .07.024.128.073.177a.24.24 0 0 0 .177.073h7.937v1.333H4.875ZM7.708 3.667v9.666-9.666Z" fill="#1a73e8"/></svg></div><div jscontroller="M2lJBf" jsaction="rcuQ6b:npT2md" data-enable-content-editable-input-style="false" data-enable-line-wrapping data-read-only><div class="hg3Lgc qs41qe BEXrzd" data-loadingmessage="Loading..." jscontroller="GFartf" jsaction="animationend:kWijWc;dyRcpb:dyRcpb" data-active="true" jsname="aZ2wEe"><div class="eBrXtc" aria-live="polite" jsname="vyyg5">Loading...</div><div jsname="Hxlbvc" class="JdM54e"><div class="aopPX ZqnFk co39ub"><div class="e2XBBf uEtL3"><div class="kPEoYc GOJTSe"></div></div><div class="LqC3Y"><div class="kPEoYc GOJTSe"></div></div><div class="e2XBBf QR7YS"><div class="kPEoYc GOJTSe"></div></div></div><div class="aopPX fxjES Cn087"><div class="e2XBBf uEtL3"><div class="kPEoYc GOJTSe"></div></div><div class="LqC3Y"><div class="kPEoYc GOJTSe"></div></div><div class="e2XBBf QR7YS"><div class="kPEoYc GOJTSe"></div></div></div><div class="aopPX ZHXbZe hfsr6b"><div class="e2XBBf uEtL3"><div class="kPEoYc GOJTSe"></div></div><div class="LqC3Y"><div class="kPEoYc GOJTSe"></div></div><div class="e2XBBf QR7YS"><div class="kPEoYc GOJTSe"></div></div></div><div class="aopPX fDBOYb EjXFBf"><div class="e2XBBf uEtL3"><div class="kPEoYc GOJTSe"></div></div><div class="LqC3Y"><div class="kPEoYc GOJTSe"></div></div><div class="e2XBBf QR7YS"><div class="kPEoYc GOJTSe"></div></div></div></div></div><div dir="ltr"><textarea jsname="bqeLof" class="Fdco1c">CREATE INDEX EmployeesById
|
||
ON Employees (EmployeeUUID)
|
||
STORING (FullName);</textarea></div></div></div></section></section><section class="Wy08Ac nRhiJb-qJTHM-OWXEXe-hJDwNd nRhiJb-DbgRPb-II5mzb-cGMI2b"><div jsaction="rcuQ6b:npT2md" jscontroller="M0Q3Qb" data-is-cws-richtext="true" class=" "><p></p><p></p><h3>
|
||
Forcing index use</h3>
|
||
Cloud Spanner’s query engine will only automatically use indexes in rare circumstances (when it is a query fully covered by the index), so it is important to use a FORCE_INDEX directive in the SQL SELECT statement to ensure that Cloud Spanner looks up values from the index. (You can find more details in the <a href="https://cloud.google.com/spanner/docs/secondary-indexes#index_directive">documentation</a>.)
|
||
<p></p><p></p></div></section><section class="nRhiJb-DbgRPb-II5mzb-cGMI2b"><section><div class="kg99be" jscontroller="vkZm2d" jsaction="rcuQ6b:npT2md" data-text-to-copy="Select *
|
||
from Employees@{FORCE_INDEX=EmployeesById}
|
||
Where EmployeeUUID=xxx;" soy-skip ssk='4:dXrt'><div jsaction="click:VTVhdd" class="GaRnv"><svg class="" viewBox="0 0 20 20" role="presentation" aria-hidden="true" height=20 widdht=20><path d="M7.979 14.667c-.458 0-.84-.153-1.146-.459a1.53 1.53 0 0 1-.458-1.125V3.938c0-.459.153-.84.458-1.146.306-.306.688-.459 1.146-.459h6.625c.445 0 .823.156 1.136.469.312.313.468.691.468 1.136v9.145c0 .445-.156.82-.468 1.125a1.564 1.564 0 0 1-1.136.459H7.979Zm0-1.334h6.625c.083 0 .15-.024.198-.073a.239.239 0 0 0 .073-.177V3.938a.265.265 0 0 0-.073-.198.268.268 0 0 0-.198-.073H7.979a.268.268 0 0 0-.198.073.266.266 0 0 0-.073.198v9.145c0 .07.024.129.073.177a.267.267 0 0 0 .198.073ZM4.875 17.75a1.53 1.53 0 0 1-1.125-.458 1.532 1.532 0 0 1-.458-1.125V5.729h1.333v10.438c0 .07.024.128.073.177a.24.24 0 0 0 .177.073h7.937v1.333H4.875ZM7.708 3.667v9.666-9.666Z" fill="#1a73e8"/></svg></div><div jscontroller="M2lJBf" jsaction="rcuQ6b:npT2md" data-enable-content-editable-input-style="false" data-enable-line-wrapping data-read-only><div class="hg3Lgc qs41qe BEXrzd" data-loadingmessage="Loading..." jscontroller="GFartf" jsaction="animationend:kWijWc;dyRcpb:dyRcpb" data-active="true" jsname="aZ2wEe"><div class="eBrXtc" aria-live="polite" jsname="vyyg5">Loading...</div><div jsname="Hxlbvc" class="JdM54e"><div class="aopPX ZqnFk co39ub"><div class="e2XBBf uEtL3"><div class="kPEoYc GOJTSe"></div></div><div class="LqC3Y"><div class="kPEoYc GOJTSe"></div></div><div class="e2XBBf QR7YS"><div class="kPEoYc GOJTSe"></div></div></div><div class="aopPX fxjES Cn087"><div class="e2XBBf uEtL3"><div class="kPEoYc GOJTSe"></div></div><div class="LqC3Y"><div class="kPEoYc GOJTSe"></div></div><div class="e2XBBf QR7YS"><div class="kPEoYc GOJTSe"></div></div></div><div class="aopPX ZHXbZe hfsr6b"><div class="e2XBBf uEtL3"><div class="kPEoYc GOJTSe"></div></div><div class="LqC3Y"><div class="kPEoYc GOJTSe"></div></div><div class="e2XBBf QR7YS"><div class="kPEoYc GOJTSe"></div></div></div><div class="aopPX fDBOYb EjXFBf"><div class="e2XBBf uEtL3"><div class="kPEoYc GOJTSe"></div></div><div class="LqC3Y"><div class="kPEoYc GOJTSe"></div></div><div class="e2XBBf QR7YS"><div class="kPEoYc GOJTSe"></div></div></div></div></div><div dir="ltr"><textarea jsname="bqeLof" class="Fdco1c">Select *
|
||
from Employees@{FORCE_INDEX=EmployeesById}
|
||
Where EmployeeUUID=xxx;</textarea></div></div></div></section></section><section class="Wy08Ac nRhiJb-qJTHM-OWXEXe-hJDwNd nRhiJb-DbgRPb-II5mzb-cGMI2b"><div jsaction="rcuQ6b:npT2md" jscontroller="M0Q3Qb" data-is-cws-richtext="true" class=" "><p>Note that when using the Cloud Spanner Read APIs, you can only perform fully covered queries—i.e., queries where the index stores all of the columns requested. To read the columns from the original table using an index, you must use an SQL query. See Use a Secondary Index section of the Getting Started docs for examples.</p><h3>
|
||
Continuing your Cloud Spanner education</h3>
|
||
There are some big conceptual differences when you’re using a cloud-built, horizontally scalable database like Cloud Spanner in contrast with the RDBMS you’ve been using for years. Once you’re familiar with the way keys and indexes work, you can start to take advantage of the benefits of Cloud Spanner for faster scalability.<p>In the next episode of this series, we will look at how to deal with business logic that would previously be implemented by triggers and stored procedures, neither of which exist in Cloud Spanner.</p><p>Want to learn more about Cloud Spanner in person? We’ll be discussing data migration and more <a href="https://cloud.withgoogle.com/next18/sf/sessions/session/156790" target="_blank">in this session</a> at Next 2018 in July. For more information, and to register, visit the <a href="https://goo.gl/fo1kgH" target="_blank">Next ‘18 website</a>.</p><h3>
|
||
Related content:</h3>
|
||
<a href="https://cloudplatform.googleblog.com/2018/03/how-we-used-Cloud-Spanner-to-build-our-email-personalization-system-from-Soup-to-nuts.html" target="_blank">How we used Cloud Spanner to build our email personalization system—from “Soup” to nuts</a><br><a href="https://cloudplatform.googleblog.com/2018/01/why-you-should-pick-strong-consistency-whenever-possible.html" target="_blank">Why you should pick strong consistency, whenever possible</a><p></p><p></p></div></section><section class="Wy08Ac nRhiJb-qJTHM-OWXEXe-hJDwNd nRhiJb-DbgRPb-II5mzb-cGMI2b"><div jsaction="rcuQ6b:npT2md" jscontroller="M0Q3Qb" data-is-cws-richtext="true" class=" "><p><a href="https://cloudplatform.googleblog.com/2018/05/Sharding-of-timestamp-ordered-data-in-Cloud-Spanner.html" target="_blank">Sharding of timestamp-ordered data in Cloud Spanner</a></p></div></section><section class="kcBhad"><section class="Fabbec"><span class="WrMNjb">Posted in</span><ul class="FzXI4e"><li class="I4B51b"><a href="https://cloud.google.com/blog/products/gcp" track-metadata-position="body"track-metadata-eventdetail="cloud.google.com/blog/products/gcp"track-metadata-module="tag list"track-metadata-module_headline="posted in">Google Cloud</a></li><li class="I4B51b"><a href="https://cloud.google.com/blog/products/databases" track-metadata-position="body"track-metadata-eventdetail="cloud.google.com/blog/products/databases"track-metadata-module="tag list"track-metadata-module_headline="posted in">Databases</a></li><li class="I4B51b"><a href="https://cloud.google.com/blog/topics/solutions-how-tos" track-metadata-position="body"track-metadata-eventdetail="cloud.google.com/blog/topics/solutions-how-tos"track-metadata-module="tag list"track-metadata-module_headline="posted in">Solutions and How-to's</a></li><li class="I4B51b"><a href="https://cloud.google.com/blog/products/spanner" track-metadata-position="body"track-metadata-eventdetail="cloud.google.com/blog/products/spanner"track-metadata-module="tag list"track-metadata-module_headline="posted in">Spanner</a></li></ul></section></section></div></div></div></div></div><section class="nRhiJb-DARUcf " track-metadata-module="related articles" track-metadata-module_headline="related articles"><div class="nRhiJb-DbgRPb-c5RTEf-ma6Yeb nRhiJb-DbgRPb-wNfPc-cGMI2b"><h5 class="Qwf2Db-MnozTc Qwf2Db-MnozTc-OWXEXe-MnozTc-wNfPc nRhiJb-DbgRPb-II5mzb-cGMI2b">Related articles</h5><section class="m9cUGf HGev3 nJD2Qe nRhiJb-ObfsIf"><div class=" QaGyvd nRhiJb-kR0ZEf-OWXEXe-GV1x9e-c5RTEf nRhiJb-kR0ZEf-OWXEXe-GV1x9e-qWD73c-V2iZpe"><div class="mA0uBe"><a href="https://cloud.google.com/blog/topics/inside-google-cloud/whats-new-google-cloud" class="lD2oe" track-name="what’s new with google cloud"track-type="card"track-metadata-eventdetail="cloud.google.com/blog/topics/inside-google-cloud/whats-new-google-cloud"><div class="AhkbS "><div class="hqnDEf"><section class="PBkdHd "><img class=" D5RK8d" src="https://storage.googleapis.com/gweb-cloudblog-publish/images/whats_new_2026_CfhxFWX.max-700x700.jpg" alt="https://storage.googleapis.com/gweb-cloudblog-publish/images/whats_new_2026_CfhxFWX.max-700x700.jpg" loading="lazy"/></section></div><div class="JUOx5b"><div class="Qwf2Db-MnozTc Qwf2Db-MnozTc-OWXEXe-MnozTc-qWD73c nRhiJb-DbgRPb-c5RTEf-ma6Yeb nRhiJb-BFbNVe-r8s4j-bMElCd FI6Gl nRhiJb-fmcmS-oXtfBe" track-name="inside google cloud"track-type="tag">Inside Google Cloud</div><h3 class="Qwf2Db-MnozTc HGFKtc Qwf2Db-MnozTc-OWXEXe-MnozTc-wNfPc">What’s new with Google Cloud</h3><p class="nRhiJb-cHYyed dTIXyb nRhiJb-DbgRPb-R6PoUb-ma6Yeb">By Google Cloud Content & Editorial • 39-minute read</p></div></div></a></div></div><div class=" QaGyvd nRhiJb-kR0ZEf-OWXEXe-GV1x9e-c5RTEf nRhiJb-kR0ZEf-OWXEXe-GV1x9e-qWD73c-V2iZpe"><div class="mA0uBe"><a href="https://cloud.google.com/blog/products/ai-machine-learning/what-google-cloud-announced-in-ai-this-month" class="lD2oe" track-name="what google cloud announced in ai this month"track-type="card"track-metadata-eventdetail="cloud.google.com/blog/products/ai-machine-learning/what-google-cloud-announced-in-ai-this-month"><div class="AhkbS "><div class="hqnDEf"><section class="PBkdHd "><img class=" D5RK8d" src="https://storage.googleapis.com/gweb-cloudblog-publish/images/google_ai_this_month.max-700x700.jpg" alt="https://storage.googleapis.com/gweb-cloudblog-publish/images/google_ai_this_month.max-700x700.jpg" loading="lazy"/></section></div><div class="JUOx5b"><div class="Qwf2Db-MnozTc Qwf2Db-MnozTc-OWXEXe-MnozTc-qWD73c nRhiJb-DbgRPb-c5RTEf-ma6Yeb nRhiJb-BFbNVe-r8s4j-bMElCd FI6Gl nRhiJb-fmcmS-oXtfBe" track-name="ai & machine learning"track-type="tag">AI & Machine Learning</div><h3 class="Qwf2Db-MnozTc HGFKtc Qwf2Db-MnozTc-OWXEXe-MnozTc-wNfPc">What Google Cloud announced in AI this month</h3><p class="nRhiJb-cHYyed dTIXyb nRhiJb-DbgRPb-R6PoUb-ma6Yeb">By Andrea Morange • 27-minute read</p></div></div></a></div></div><div class=" QaGyvd nRhiJb-kR0ZEf-OWXEXe-GV1x9e-c5RTEf nRhiJb-kR0ZEf-OWXEXe-GV1x9e-qWD73c-V2iZpe"><div class="mA0uBe"><a href="https://cloud.google.com/blog/products/ai-machine-learning/what-google-cloud-announced-in-ai-this-month-2025" class="lD2oe" track-name="what google cloud announced in ai this month - 2025"track-type="card"track-metadata-eventdetail="cloud.google.com/blog/products/ai-machine-learning/what-google-cloud-announced-in-ai-this-month-2025"><div class="AhkbS "><div class="hqnDEf"><section class="PBkdHd "><img class=" D5RK8d" src="https://storage.googleapis.com/gweb-cloudblog-publish/images/monthly_ai_news.max-700x700.png" alt="https://storage.googleapis.com/gweb-cloudblog-publish/images/monthly_ai_news.max-700x700.png" loading="lazy"/></section></div><div class="JUOx5b"><div class="Qwf2Db-MnozTc Qwf2Db-MnozTc-OWXEXe-MnozTc-qWD73c nRhiJb-DbgRPb-c5RTEf-ma6Yeb nRhiJb-BFbNVe-r8s4j-bMElCd FI6Gl nRhiJb-fmcmS-oXtfBe" track-name="ai & machine learning"track-type="tag">AI & Machine Learning</div><h3 class="Qwf2Db-MnozTc HGFKtc Qwf2Db-MnozTc-OWXEXe-MnozTc-wNfPc">What Google Cloud announced in AI this month - 2025</h3><p class="nRhiJb-cHYyed dTIXyb nRhiJb-DbgRPb-R6PoUb-ma6Yeb">By Andrea Morange • 43-minute read</p></div></div></a></div></div><div class=" QaGyvd nRhiJb-kR0ZEf-OWXEXe-GV1x9e-c5RTEf nRhiJb-kR0ZEf-OWXEXe-GV1x9e-qWD73c-V2iZpe"><div class="mA0uBe"><a href="https://cloud.google.com/blog/topics/inside-google-cloud/whats-new-google-cloud-2025" class="lD2oe" track-name="what’s new with google cloud - 2025"track-type="card"track-metadata-eventdetail="cloud.google.com/blog/topics/inside-google-cloud/whats-new-google-cloud-2025"><div class="AhkbS "><div class="hqnDEf"><section class="PBkdHd "><img class=" D5RK8d" src="https://storage.googleapis.com/gweb-cloudblog-publish/images/whts_new_2025_5V6FQkI.max-700x700.jpg" alt="https://storage.googleapis.com/gweb-cloudblog-publish/images/whts_new_2025_5V6FQkI.max-700x700.jpg" loading="lazy"/></section></div><div class="JUOx5b"><div class="Qwf2Db-MnozTc Qwf2Db-MnozTc-OWXEXe-MnozTc-qWD73c nRhiJb-DbgRPb-c5RTEf-ma6Yeb nRhiJb-BFbNVe-r8s4j-bMElCd FI6Gl nRhiJb-fmcmS-oXtfBe" track-name="inside google cloud"track-type="tag">Inside Google Cloud</div><h3 class="Qwf2Db-MnozTc HGFKtc Qwf2Db-MnozTc-OWXEXe-MnozTc-wNfPc">What’s new with Google Cloud - 2025</h3><p class="nRhiJb-cHYyed dTIXyb nRhiJb-DbgRPb-R6PoUb-ma6Yeb">By Google Cloud Content & Editorial • 39-minute read</p></div></div></a></div></div></section></div></section></article></div></div><c-data id="i1" jsdata=" n2jFB;_;1"></c-data></c-wiz><script aria-hidden="true" nonce="ukEud-BIIo14C235ZP9QwA">window.wiz_progress&&window.wiz_progress();window.wiz_tick&&window.wiz_tick('zPZHOe');</script><script nonce="ukEud-BIIo14C235ZP9QwA">(function(){'use strict';var c=window,d=[];c.aft_counter=d;var e=[],f=0;function _recordIsAboveFold(a){if(!c._isLazyImage(a)&&!a.hasAttribute("data-noaft")&&a.src){var b=(c._isVisible||function(){})(c.document,a);a.setAttribute("data-atf",b);b&&(e.indexOf(a)!==-1||d.indexOf(a)!==-1||a.complete||d.push(a),a.hasAttribute("data-iml")&&(a=Number(a.getAttribute("data-iml")),a>f&&(f=a)))}}
|
||
c.initAft=function(){f=0;e=Array.prototype.slice.call(document.getElementsByTagName("img")).filter(function(a){return!!a.getAttribute("data-iml")});[].forEach.call(document.getElementsByTagName("img"),function(a){try{_recordIsAboveFold(a)}catch(b){throw b.message=a.hasAttribute("data-iid")?b.message+"\nrecordIsAboveFold error for defer inlined image":b.message+("\nrecordIsAboveFold error for img element with <src: "+a.src+">"),b;}});if(d.length===0)c.onaft(f);e=[]};}).call(this);
|
||
initAft()</script><script id="_ij" nonce="ukEud-BIIo14C235ZP9QwA">window.IJ_values = [[null,null,"",false,null,null,true,false],'0','https:\/\/cloud.google.com\/blog\/',["cloudblog","products/gcp/what-dbas-need-to-know-about-cloud-spanner-part-1-keys-and-indexes",["en","de","fr","ko","ja"],"en",null,"https://cloud.google.com/blog/","blog_article","cloud.google.com",["https://console.cloud.google.com/freetrial/","https://cloud.google.com/contact/","https://cloud.google.com/","https://cloud.google.com/blog/","https://cloud.google.com/","https://www.google.com/","https://cloud.google.com/products/","https://about.google.com/products/","https://about.google/intl/en/","https://support.google.com"],["googlecloud","googlecloud","showcase/google-cloud","googlecloud/","googlecloud/"],true,"/blog/products/gcp/what-dbas-need-to-know-about-cloud-spanner-part-1-keys-and-indexes/"], null ,'boq_cloudx-web-blog-uiserver_20260909.00_p0','cloud.google.com',["US",4],[[["bigquery_ftv",["bigquery_ftv",[["control",["control",[97716263,97716264],["/bigquery"]]],["variantA",["variantA",[97716265,97716266],["/bigquery"]]],["variantB",["variantB",[97716267,97716268],["/bigquery"]]],["variantC",["variantC",[97716269,97716270],["/bigquery"]]]]]],["gemini_enterprise_hero_cta",["gemini_enterprise_hero_cta",[["control",["control",[106647111,106647112],["/gemini-enterprise"]]],["variantA",["variantA",[106647113,106647114],["/gemini-enterprise"]]],["variantB",["variantB",[106647115,106647116],["/gemini-enterprise"]]]]]],["jss",["jss",[["control",["control",[93803230,93804391],["/products/ai","/products/compute","/solutions/web-hosting"]]],["variantA",["variantA",[93803231,93804392],["/products/ai","/products/compute","/solutions/web-hosting"]]],["variantB",["variantB",[93803232,93804393],["/products/ai","/products/compute","/solutions/web-hosting"]]],["variantC",["variantC",[93803233,93804394],["/products/ai","/products/compute","/solutions/web-hosting"]]]]]],["learnify",["learnify",[["control",["control",[105572947,105573897,105572947,105573897,105572947,105573897,105572947,105573897,105572947,105573897,105572947,105573897,105572947,105573897],["/free","/speech-to-text","/bigquery","/products/compute","/run","/storage","/solutions/web-hosting"]]],["variantA",["variantA",[105572948,105573898,105572948,105573898,105572948,105573898,105572948,105573898,105572948,105573898,105572948,105573898,105572948,105573898],["/free","/speech-to-text","/bigquery","/products/compute","/run","/storage","/solutions/web-hosting"]]],["variantB",["variantB",[105572949,105573899,105572949,105573899,105572949,105573899,105572949,105573899,105572949,105573899,105572949,105573899,105572949,105573899],["/free","/speech-to-text","/bigquery","/products/compute","/run","/storage","/solutions/web-hosting"]]]]]],["visual_interest",["visual_interest",[["control",["control",[97933470,97933471],["/free"]]],["variantA",["variantA",[97933472,97933473],["/free"]]],["variantB",["variantB",[97933474,97933475],["/free"]]],["variantC",["variantC",[97940381,97940382],["/free"]]]]]]]], 0.0 ,["GTM-5CVQBG",[["en","\u202aEnglish\u202c",true,"en"],["de","\u202aDeutsch\u202c",true,"de"],["es","\u202aEspañol\u202c",true,"es"],["es-419","\u202aEspañol (Latinoamérica)\u202c",true,"es-419"],["fr","\u202aFrançais\u202c",true,"fr"],["id","\u202aIndonesia\u202c",true,"id"],["it","\u202aItaliano\u202c",true,"it"],["pt-BR","\u202aPortuguês (Brasil)\u202c",true,"pt-BR"],["zh-CN","\u202a简体中文\u202c",true,"zh-Hans"],["zh-TW","\u202a繁體中文\u202c",true,"zh-Hant"],["ja","\u202a日本語\u202c",true,"ja"],["ko","\u202a한국어\u202c",true,"ko"]],["83405","AIzaSyD3LJeW4Q6gtdgJlyeFZUp-GhpIoc6EUeg"],"en",null,null,[],[["https://cloud.google.com/innovators","https://cloud.google.com/innovators/plus/activate","https://cloud.google.com/innovators/innovatorsplus"],["https://workspace.google.com/pricing","https://www.x.com/googleworkspace","https://www.facebook.com/googleworkspace","https://www.youtube.com/channel/UCBmwzQnSoj9b6HzNmFrg_yw","https://www.instagram.com/googleworkspace","https://www.linkedin.com/showcase/googleworkspace","https://about.google/?utm_source\u003dworkspace.google.com\u0026utm_medium\u003dreferral\u0026utm_campaign\u003dgsuite-footer-en","https://about.google/products/?tip\u003dexplore","https://workspace.google.com","https://workspace.google.com/contact/?source\u003dgafb-form-globalnav-en","https://workspace.google.com/business/signup/welcome?hl\u003den\u0026source\u003dgafb-form-globalnav-en","https://workspace.google.com/blog"],["https://www.cloudskillsboost.google","https://www.cloudskillsboost.google?utm_source\u003dcgc\u0026utm_medium\u003dwebsite\u0026utm_campaign\u003devergreen","https://www.cloudskillsboost.google/subscriptions?utm_source\u003dcgc\u0026utm_medium\u003dwebsite\u0026utm_campaign\u003devergreenlaunchpromo","https://www.cloudskillsboost.google/subscriptions?utm_source\u003dcgc\u0026utm_medium\u003dwebsite\u0026utm_campaign\u003devergreen","https://www.cloudskillsboost.google/catalog?utm_source\u003dcgc\u0026utm_medium\u003dwebsite\u0026utm_campaign\u003devergreen","https://www.cloudskillsboost.google/paths?utm_source\u003dcgc\u0026utm_medium\u003dwebsite\u0026utm_campaign\u003devergreen"],["https://mapsplatform.google.com"],["https://cloud.google.com/developers","https://cloud.google.com/developers/settings?utm_source\u003dinnovators"],["https://console.cloud.google.com/freetrial","https://console.cloud.google.com/","https://console.cloud.google.com/freetrial?redirectPath\u003dhttps://cloud.google.com/blog/products/gcp/what-dbas-need-to-know-about-cloud-spanner-part-1-keys-and-indexes/"],["https://aitestkitchen.withgoogle.com/signup","https://blog.google/technology/ai/join-us-in-the-ai-test-kitchen/","https://cloud.google.com/ai"],["https://googlecloudplatform.blogspot.com/","https://github.com/GoogleCloudPlatform","https://www.linkedin.com/showcase/google-cloud","https://x.com/googlecloud","https://www.facebook.com/googlecloud"],[[["https://cloud.google.com/products/compute"],["https://cloud.google.com/bigquery"],["https://cloud.google.com/kubernetes-engine"],["https://cloud.google.com/vertex-ai"],["https://cloud.google.com/apigee"],["https://cloud.google.com/functions"],["https://cloud.google.com/generative-ai-studio"],["https://cloud.google.com/products/agent-builder"],["https://cloud.google.com/products/conversational-agents"],["https://cloud.google.com/natural-language"],["https://cloud.google.com/speech-to-text"],["https://cloud.google.com/text-to-speech"],["https://cloud.google.com/video-intelligence"],["https://cloud.google.com/vertex-ai-notebooks"],["https://cloud.google.com/gpu"],["https://cloud.google.com/document-ai"],["https://cloud.google.com/looker"],["https://cloud.google.com/looker-studio"],["https://cloud.google.com/bare-metal"],["https://cloud.google.com/batch"],["https://cloud.google.com/vmware-engine"],["https://cloud.google.com/build"],["https://cloud.google.com/deploy"],["https://cloud.google.com/dataproc"],["https://cloud.google.com/products/dataflow"],["https://cloud.google.com/dataform"],["https://cloud.google.com/pubsub"],["https://cloud.google.com/data-fusion"],["https://cloud.google.com/composer"],["https://cloud.google.com/dataplex"],["https://cloud.google.com/analytics-hub"],["https://cloud.google.com/biglake"],["https://cloud.google.com/products/alloydb"],["https://cloud.google.com/bigtable"],["https://cloud.google.com/spanner"],["https://cloud.google.com/sql"],["https://cloud.google.com/products/firestore"],["https://cloud.google.com/memorystore"],["https://cloud.google.com/datastream"],["https://cloud.google.com/security/products/assured-open-source-software"],["https://cloud.google.com/code/"],["https://cloud.google.com/sdk"],["https://cloud.google.com/workstations"],["https://cloud.google.com/anti-money-laundering-ai"],["https://cloud.google.com/healthcare-api"],["https://cloud.google.com/device-connect"],["https://cloud.google.com/telecom-network-automation"],["https://cloud.google.com/telecom-data-fabric"],["https://cloud.google.com/telecom-subscriber-insights"],["https://cloud.google.com/application-integration"],["https://cloud.google.com/carbon-footprint"],["https://cloud.google.com/cost-management"],["https://cloud.google.com/managed-prometheus"],["https://cloud.google.com/service-health"],["https://cloud.google.com/earth-engine"],["https://cloud.google.com/cdn/"],["https://cloud.google.com/database-migration"],["https://cloud.google.com/storage-transfer-service/"],["https://cloud.google.com/immersive-stream/xr/"],["https://cloud.google.com/dns"],["https://cloud.google.com/security/products/intrusion-detection-system"],["https://cloud.google.com/load-balancing"],["https://cloud.google.com/nat"],["https://cloud.google.com/network-connectivity-center"],["https://cloud.google.com/network-intelligence-center"],["https://cloud.google.com/security/products/armor"],["https://cloud.google.com/security/products/firewall"],["https://cloud.google.com/private-service-connect"],["https://cloud.google.com/vpc"],["https://cloud.google.com/security/vpc-service-controls"],["https://cloud.google.com/logging"],["https://cloud.google.com/monitoring"],["https://cloud.google.com/appsheet/automation"],["https://cloud.google.com/identity"],["https://cloud.google.com/security/products/access-transparency"],["https://cloud.google.com/security/products/assured-workloads"],["https://cloud.google.com/security/products/security-key-management"],["https://cloud.google.com/security/products/confidential-computing"],["https://cloud.google.com/security/products/security-command-center"],["https://cloud.google.com/security/products/iap"],["https://cloud.google.com/security/products/certificate-authority-service"],["https://cloud.google.com/security/products/titan-security-key"],["https://cloud.google.com/security/products/recaptcha"],["https://cloud.google.com/security/products/identity-platform"],["https://cloud.google.com/security/products/threat-intelligence"],["https://cloud.google.com/security/products/attack-surface-management"],["https://cloud.google.com/security/products/digital-threat-monitoring"],["https://cloud.google.com/security/products/mandiant-security-validation"],["https://cloud.google.com/security/products/security-operations"],["https://cloud.google.com/appengine"],["https://cloud.google.com/run"],["https://cloud.google.com/workflows"],["https://cloud.google.com/storage"],["https://cloud.google.com/filestore"],["https://cloud.google.com/persistent-disk"],["https://cloud.google.com/backup-disaster-recovery"],["https://cloud.google.com/netapp-volumes"],["https://cloud.google.com/parallelstore"],["https://cloud.google.com/blockchain-node-engine"],["https://cloud.google.com/products/observability"],["https://cloud.google.com/products/gemini/cloud-assist"],["https://cloud.google.com/agent-assist"],["https://cloud.google.com/products/blockchain-rpc/"],["https://cloud.google.com/distributed-cloud"],["https://cloud.google.com/translate"]]]],[2026,9,11],[["en","x-default"],"x-default"],[null,true],null,"/blog/products/gcp/what-dbas-need-to-know-about-cloud-spanner-part-1-keys-and-indexes/?hl\u003den",["6LcsrxUqAAAAAFhpR1lXsPN2j2nsTwy6JTbRKzJr"],null,["marketing-studio-write-user"]],[],'','ukEud-BIIo14C235ZP9QwA','RWMKHuytZOJr4DhxiNx31g','DEFAULT','\/blog', 2026.0 ,'https:\/\/cloud.google.com\/blog\/products\/gcp\/what-dbas-need-to-know-about-cloud-spanner-part-1-keys-and-indexes\/', null ,'ltr', false ,'https:\/\/accounts.google.com\/AccountChooser?continue\x3dhttps:\/\/cloud.google.com\/blog\/products\/gcp\/what-dbas-need-to-know-about-cloud-spanner-part-1-keys-and-indexes\/\x26hl\x3den-US','https:\/\/accounts.google.com\/ServiceLogin?hl\x3den-US\x26continue\x3dhttps:\/\/cloud.google.com\/blog\/products\/gcp\/what-dbas-need-to-know-about-cloud-spanner-part-1-keys-and-indexes\/','https:\/\/accounts.google.com\/SignOutOptions?continue\x3dhttps:\/\/cloud.google.com\/blog\/products\/gcp\/what-dbas-need-to-know-about-cloud-spanner-part-1-keys-and-indexes\/',[[[1]]], false , false , false ,'en','en-US','en_US', null , null ,'https:\/\/myaccount.google.com\/privacypolicy?hl\x3den-US', false , null ,'https:\/\/www.gstatic.com\/_\/boq-cloudx-web-blog\/_\/r\/','https:\/\/myaccount.google.com\/termsofservice?hl\x3den-US','gdu',[[[["Solutions \u0026 technology",null,[[["AI \u0026 Machine Learning","/blog/products/ai-machine-learning"],["API Management","/blog/products/api-management"],["Application Development","/blog/products/application-development"],["Application Modernization","/blog/products/application-modernization"],["Chrome Enterprise","/blog/products/chrome-enterprise"],["Compute","/blog/products/compute"],["Containers \u0026 Kubernetes","/blog/products/containers-kubernetes"],["Data Analytics","/blog/products/data-analytics"],["Databases","/blog/products/databases"],["DevOps \u0026 SRE","/blog/products/devops-sre"],["Maps \u0026 Geospatial","/blog/topics/maps-geospatial"],["Security",null,[[["Security \u0026 Identity","/blog/products/identity-security"],["Threat Intelligence","/blog/topics/threat-intelligence"]]]],["Infrastructure","/blog/products/infrastructure"],["Infrastructure Modernization","/blog/products/infrastructure-modernization"],["Networking","/blog/products/networking"],["Productivity \u0026 Collaboration","/blog/products/productivity-collaboration"],["SAP on Google Cloud","/blog/products/sap-google-cloud"],["Storage \u0026 Data Transfer","/blog/products/storage-data-transfer"],["Sustainability","/blog/topics/sustainability"]]]],["Ecosystem",null,[[["IT Leaders","/transform"],["Industries",null,[[["Financial Services","/blog/topics/financial-services"],["Healthcare \u0026 Life Sciences","/blog/topics/healthcare-life-sciences"],["Manufacturing","/blog/topics/manufacturing"],["Media \u0026 Entertainment","/blog/products/media-entertainment"],["Public Sector","/blog/topics/public-sector"],["Retail","/blog/topics/retail"],["Supply Chain","/blog/topics/supply-chain-logistics"],["Telecommunications","/blog/topics/telecommunications"]]]],["Partners","/blog/topics/partners"],["Startups \u0026 SMB","/blog/topics/startups"],["Training \u0026 Certifications","/blog/topics/training-certifications"],["Inside Google Cloud","/blog/topics/inside-google-cloud"],["Google Cloud Next \u0026 Events","/blog/topics/google-cloud-next"],["Google Cloud Consulting","/blog/topics/consulting"],["Google Maps Platform","https://mapsplatform.google.com/resources/blog/"],["Google Workspace","https://workspace.google.com/blog"]]]],["Developers \u0026 Practitioners","/blog/topics/developers-practitioners"],["Transform with Google Cloud","/transform"]]],[["de",[[["Neuigkeiten","/blog/de/topics/whats-new/aktuelles-auf-dem-google-cloud-blog"],["Lösungen \u0026 Technologien",null,[[["Anwendungsentwicklung","/blog/de/products/application-development"],["Anwendungsmodernisierung","/blog/de/products/anwendungsmodernisierung"],["API-Verwaltung","/blog/de/products/api-management"],["Chrome Enterprise","/blog/de/products/chrome-enterprise"],["Computing","/blog/de/products/compute"],["Containers \u0026 Kubernetes","/blog/de/products/containers-kubernetes"],["Datenanalysen","/blog/de/products/data-analytics"],["Datenbanken","/blog/de/products/databases"],["DevOps \u0026 SRE","/blog/de/products/devops-sre"],["Infrastruktur","/blog/de/products/infrastructure"],["KI \u0026 Machine Learning","/blog/de/products/ai-machine-learning"],["Maps \u0026 Geospatial","/blog/de/topics/maps-geospatial"],["Modernisierung der Infrastruktur","/blog/de/products/modernisierung-der-infrastruktur"],["Nachhaltigkeit","/blog/de/topics/nachhaltigkeit"],["Netzwerk","/blog/de/products/networking"],["Produktivität und Zusammenarbeit","/blog/de/products/produktivitaet-und-kollaboration"],["SAP in Google Cloud","/blog/de/products/sap-google-cloud"],["Sicherheit \u0026 Identität","/blog/de/products/identity-security"],["Speicher und Datentransfer","/blog/de/products/storage-data-transfer"]]]],["Ökosystem",null,[[["IT Leader","/transform/de"],["Industrien",null,[[["Behörden und öffentlicher Sektor","/blog/de/topics/public-sector"],["Einzelhandel","/blog/de/topics/retail"],["Fertigung","/blog/de/topics/fertigung"],["Finanzdienstleistungen","/blog/de/topics/financial-services"],["Gesundheitswesen und Biowissenschaften","/blog/de/topics/healthcare-life-sciences"],["Lieferkette und Logistik","/blog/de/topics/lieferkette-und-logistik"],["Medien und Unterhaltung","/blog/de/products/media-entertainment"],["Telekommunikation","/blog/de/topics/telecommunications"]]]],["Entwickler*innen \u0026 Fachkräfte","/blog/de/topics/developers-practitioners"],["Google Cloud Next \u0026 Events","/blog/de/topics/events"],["Google Maps Platform","/blog/de/products/maps-platform"],["Google Workspace","https://workspace.google.com/blog/de"],["Inside Google Cloud","/blog/de/topics/inside-google-cloud"],["Kunden","/blog/de/topics/kunden"],["Partner","/blog/de/topics/partners"],["Start-ups und KMU","/blog/de/topics/startups"],["Training und Zertifizierung","/blog/de/topics/training-certifications"]]]],["Transformation mit Google Cloud","/transform/de"]]]],["en",[[["Solutions \u0026 technology",null,[[["AI \u0026 Machine Learning","/blog/products/ai-machine-learning"],["API Management","/blog/products/api-management"],["Application Development","/blog/products/application-development"],["Application Modernization","/blog/products/application-modernization"],["Chrome Enterprise","/blog/products/chrome-enterprise"],["Compute","/blog/products/compute"],["Containers \u0026 Kubernetes","/blog/products/containers-kubernetes"],["Data Analytics","/blog/products/data-analytics"],["Databases","/blog/products/databases"],["DevOps \u0026 SRE","/blog/products/devops-sre"],["Maps \u0026 Geospatial","/blog/topics/maps-geospatial"],["Security",null,[[["Security \u0026 Identity","/blog/products/identity-security"],["Threat Intelligence","/blog/topics/threat-intelligence"]]]],["Infrastructure","/blog/products/infrastructure"],["Infrastructure Modernization","/blog/products/infrastructure-modernization"],["Networking","/blog/products/networking"],["Productivity \u0026 Collaboration","/blog/products/productivity-collaboration"],["SAP on Google Cloud","/blog/products/sap-google-cloud"],["Storage \u0026 Data Transfer","/blog/products/storage-data-transfer"],["Sustainability","/blog/topics/sustainability"]]]],["Ecosystem",null,[[["IT Leaders","/transform"],["Industries",null,[[["Financial Services","/blog/topics/financial-services"],["Healthcare \u0026 Life Sciences","/blog/topics/healthcare-life-sciences"],["Manufacturing","/blog/topics/manufacturing"],["Media \u0026 Entertainment","/blog/products/media-entertainment"],["Public Sector","/blog/topics/public-sector"],["Retail","/blog/topics/retail"],["Supply Chain","/blog/topics/supply-chain-logistics"],["Telecommunications","/blog/topics/telecommunications"]]]],["Partners","/blog/topics/partners"],["Startups \u0026 SMB","/blog/topics/startups"],["Training \u0026 Certifications","/blog/topics/training-certifications"],["Inside Google Cloud","/blog/topics/inside-google-cloud"],["Google Cloud Next \u0026 Events","/blog/topics/google-cloud-next"],["Google Cloud Consulting","/blog/topics/consulting"],["Google Maps Platform","https://mapsplatform.google.com/resources/blog/"],["Google Workspace","https://workspace.google.com/blog"]]]],["Developers \u0026 Practitioners","/blog/topics/developers-practitioners"],["Transform with Google Cloud","/transform"]]]],["fr",[[["Les tendances","/blog/fr/topics/les-tendances/quelles-sont-les-nouveautes-de-google-cloud"],["Solutions et Technologie",null,[[["Analyse de données","/blog/fr/products/analyse-de-donnees/"],["Bases de données","/blog/fr/products/databases"],["Calcul","/blog/fr/products/calcul/"],["Chrome Entreprise","/blog/fr/products/chrome-enterprise/"],["Conteneurs et Kubernetes","/blog/fr/products/conteneurs-et-kubernetes/"],["Développement d'Applications","/blog/fr/products/application-development"],["Développement durable","/blog/fr/topics/developpement-durable"],["DevOps et ingénierie SRE","/blog/fr/products/devops-sre"],["Gestion des API","/blog/fr/products/api-management"],["IA et Machine Learning","/blog/fr/products/ai-machine-learning"],["Infrastructure","/blog/fr/products/infrastructure"],["Maps et Géospatial","/blog/fr/topics/maps-geospatial"],["Modernisation d'Applications","/blog/fr/products/modernisation-dapplications/"],["Modernisation d'Infrastructure","/blog/fr/products/modernisation-dinfrastructure/"],["Networking","/blog/fr/products/networking"],["Productivité et Collaboration","/blog/fr/products/productivite-et-collaboration"],["SAP sur Google Cloud","/blog/fr/products/sap-google-cloud"],["Sécurité et Identité","/blog/fr/products/identity-security"],["Stockage et transfert de données","/blog/fr/products/storage-data-transfer"]]]],["Écosystème",null,[[["Responsables IT","/transform/fr"],["Industries",null,[[["Commerce","/blog/fr/topics/retail"],["Manufacturing","/blog/fr/topics/manufacturing"],["Médias et Divertissement","/blog/fr/products/media-entertainment"],["Santé","/blog/fr/topics/healthcare-life-sciences"],["Secteur Public","/blog/fr/topics/public-sector"],["Services Financiers","/blog/fr/topics/financial-services"],["Supply Chain","/blog/fr/topics/supply-chain/"],["Telecommunications","/blog/fr/topics/telecommunications"]]]],["Clients","/blog/fr/topics/clients/"],["Développeurs et professionnels","/blog/fr/topics/developers-practitioners"],["Formations et certifications","/blog/fr/topics/training-certifications"],["Google Cloud Next et Événements","/blog/fr/topics/evenements"],["Google Maps Platform","/blog/fr/products/maps-platform"],["Google Workspace","https://workspace.google.com/blog/fr"],["Inside Google Cloud","/blog/fr/topics/inside-google-cloud"],["Partenaires","/blog/fr/topics/partners"],["Start-ups et PME","/blog/fr/topics/startups"]]]],["Transformer avec Google Cloud","/transform/fr"]]]],["ja",[[["ソリューションとテクノロジー",null,[[["AI \u0026 機械学習","/blog/ja/products/ai-machine-learning"],["API 管理","/blog/ja/products/api-management"],["アプリケーション開発","/blog/ja/products/application-development"],["アプリケーション モダナイゼーション","/blog/ja/products/application-modernization"],["Chrome Enterprise","/blog/ja/products/chrome-enterprise"],["コンピューティング","/blog/ja/products/compute"],["Containers \u0026 Kubernetes","/blog/ja/products/containers-kubernetes"],["データ分析","/blog/ja/products/data-analytics"],["データベース","/blog/ja/products/databases"],["DevOps \u0026 SRE","/blog/ja/products/devops-sre"],["Maps \u0026 Geospatial","/blog/ja/products/maps-platform"],["セキュリティ",null,[[["セキュリティ \u0026 アイデンティティ","/blog/ja/products/identity-security"],["脅威インテリジェンス","/blog/ja/topics/threat-intelligence"]]]],["インフラストラクチャ","/blog/ja/products/infrastructure"],["インフラ モダナイゼーション","/blog/ja/products/infrastructure-modernization"],["ネットワーキング","/blog/ja/products/networking"],["生産性とコラボレーション","/blog/ja/products/productivity-collaboration"],["Google Cloud での SAP","/blog/ja/products/sap-google-cloud"],["ストレージとデータ転送","/blog/ja/products/storage-data-transfer"],["サステナビリティ","/blog/ja/topics/sustainability"]]]],["エコシステム",null,[[["ITリーダー","/transform/ja"],["業種",null,[[["金融サービス","/blog/ja/topics/financial-services"],["ヘルスケア、ライフ サイエンス","/blog/ja/topics/healthcare-life-sciences"],["製造","/blog/ja/topics/manufacturing"],["メディア、エンターテイメント","/blog/ja/products/media-entertainment"],["公共部門","/blog/ja/topics/public-sector"],["小売業","/blog/ja/topics/retail"],["サプライ チェーン","/blog/ja/topics/supply-chain-logistics"],["通信","/blog/ja/topics/telecommunications"]]]],["顧客事例","/blog/ja/topics/customers"],["パートナー","/blog/ja/topics/partners"],["スタートアップ \u0026 SMB","/blog/ja/topics/startups"],["トレーニングと認定","/blog/ja/topics/training-certifications"],["Inside Google Cloud","/blog/ja/topics/inside-google-cloud"],["Google Cloud Next と イベント","/blog/ja/topics/google-cloud-next"],["Google Maps Platform","/blog/ja/products/maps-platform"],["Google Workspace","https://workspace.google.com/blog/ja"]]]],["デベロッパー","/blog/ja/topics/developers-practitioners"],["Transform with Google Cloud","/transform/ja"]]]],["ko",[[["솔루션 및 기술",null,[[["AI 및 머신러닝","/blog/ko/products/ai-machine-learning"],["API 관리","/blog/ko/products/api-management"],["애플리케이션 개발","/blog/ko/products/application-development"],["애플리케이션 현대화","/blog/ko/products/application-modernization"],["Chrome Enterprise","/blog/products/chrome-enterprise"],["컴퓨팅","/blog/ko/products/compute"],["컨테이너 \u0026 Kubernetes","/blog/ko/products/containers-kubernetes"],["데이터 분석","/blog/ko/products/data-analytics"],["데이터베이스","/blog/ko/products/databases"],["DevOps 및 SRE","/blog/ko/products/devops-sre"],["Maps \u0026 Geospatial","/blog/ko/products/maps-platform"],["보안",null,[[["보안 \u0026 아이덴티티","/blog/ko/products/identity-security"],["위협 인텔리전스","/blog/ko/topics/threat-intelligence"]]]],["인프라","/blog/ko/products/infrastructure"],["Infrastructure Modernization","/blog/ko/products/infrastructure-modernization"],["네트워킹","/blog/ko/products/networking"],["생산성 및 공동작업","/blog/ko/products/productivity-collaboration"],["SAP on Google Cloud","/blog/ko/products/sap-google-cloud"],["스토리지 및 데이터 전송","/blog/ko/products/storage-data-transfer"],["지속가능성","/blog/ko/topics/sustainability"]]]],["에코시스템",null,[[["IT Leaders","/transform/ko"],["업종",null,[[["금융 서비스","/blog/ko/topics/financial-services"],["의료 및 생명과학","/blog/ko/topics/healthcare-life-sciences"],["제조업","/blog/ko/topics/manufacturing"],["미디어 및 엔터테인먼트","/blog/ko/products/media-entertainment"],["공공부문","/blog/ko/topics/public-sector"],["소매업","/blog/ko/topics/retail"],["공급망","/blog/topics/supply-chain-logistics"],["통신","/blog/ko/topics/telecommunications"]]]],["고객 사례","/blog/ko/topics/customers"],["파트너","/blog/ko/topics/partners"],["스타트업 \u0026 SMB","/blog/ko/topics/startups"],["교육 \u0026 인증","/blog/ko/topics/training-certifications"],["Inside Google Cloud","/blog/ko/topics/inside-google-cloud"],["Google Cloud Next 및 이벤트","/blog/ko/topics/google-cloud-next"],["Google Maps Platform","/blog/ko/products/maps-platform"],["Google Workspace","https://workspace.google.com/blog/ko"]]]],["개발 및 IT운영","/blog/ko/topics/developers-practitioners"],["Google Cloud와 함께 하는 디지털 혁신","/transform/ko"]]]]],[["de",[[["Products \u0026 technology",null,[[["AI \u0026 Machine Learning","/blog/p-t/ai-machine-learning"],["API Management","/blog/api-management"],["Applied engineering","/blog/products-technology/applied-engineering"],["Developer tools","/blog/developer-tools"],["Business intelligence (BI)","/blog/business-intelligence-bi"],["Chrome Enterprise","/blog/chrome-enterprise"],["Compute","/blog/compute"],["Containers \u0026 Kubernetes","/blog/containers-kubernetes"],["Data analytics","/blog/data-analytics"],["Databases","/blog/databases"],["DevOps","/blog/devops"],["Distributed cloud","/blog/distributed-cloud"],["Hybrid \u0026 multicloud","/blog/hybrid-multicloud/"],["Management tools","/blog/management-tools"],["Maps \u0026 geospatial","/blog/maps-geospatial"],["Migration","/blog/migration"],["Networking","/blog/networking"],["SAP on Google Cloud","/blog/sap-google-cloud"],["Security","/blog/security"],["Sovereignty \u0026 compliance","/blog/sovereignty-compliance"],["SRE","/blog/site-reliability-engineering-sre"],["Storage","/blog/storage"],["Threat Intelligence","/blog/threat-intelligence"]]],["See all product news","Stay informed on all Cloud product announcements","/blog/products/","linear-gradient(79.98deg, rgba(66, 133, 244, 0.2) 0%, rgba(62, 106, 240, 0.2) 53.91%, rgba(87, 159, 255, 0.2) 107.82%)","linear-gradient(79.98deg, rgba(66, 133, 244, 0.3) 0%, rgba(62, 106, 240, 0.3) 53.91%, rgba(87, 159, 255, 0.3) 107.82%)","#2F3793"],7],["Learning",null,[[["Cloud architecture","/blog/cloud-architecture"],["IT leaders","/blog/it-leaders"],["Training \u0026 certifications","/blog/training-certifications"]]],["Explore learning","Develop your cloud skills and enhance your expertise","/blog/products/","linear-gradient(79.98deg, rgba(52, 168, 83, 0.2) 0%, rgba(102, 214, 105, 0.2) 53.91%, rgba(52, 168, 83, 0.2) 107.82%)","linear-gradient(79.98deg, rgba(52, 168, 83, 0.2) 0%, rgba(102, 214, 105, 0.2) 53.91%, rgba(52, 168, 83, 0.2) 107.82%)","#004E41"]],["Developers","/blog/developers-practitioners"],["Customers \u0026 partners",null,[[["Customer stories","/blog/customer-stories"],["Financial services","/blog/financial-services"],["Gaming","/blog/gaming"],["Healthcare \u0026 life sciences","/blog/healthcare-life-sciences"],["Manufacturing","/blog/manufacturing"],["Media \u0026 entertainment","/blog/media-entertainment"],["Partners","/blog/partners"],["Public sector","/blog/public-sector"],["Retail","/blog/retail"],["Startups","/blog/startups"],["Supply chain \u0026 logistics","/blog/supply-chain-logistics"],["Telecommunications","/blog/telecommunications"]]],["Explore customers \u0026 partners","Learn how we work with organizations to transform industries","/blog/products/","linear-gradient(80.33deg, rgba(251, 188, 4, 0.2) 0%, rgba(242, 153, 0, 0.2) 50.64%, rgba(251, 188, 4, 0.2) 101.28%)","linear-gradient(80.33deg, rgba(251, 188, 4, 0.3) 0%, rgba(242, 153, 0, 0.3) 50.64%, rgba(251, 188, 4, 0.3) 101.28%)","#202124"]],["Inside Google Cloud",null,[[["Company news","/blog/company-news"],["Data centers \u0026 regions","/blog/data-centers-and-regions"],["Events","/blog/events"],["Consulting","/blog/google-cloud-consulting"],["Google Cloud Next","/blog/google-cloud-next"],["Sustainability","/blog/sustainability"],["Systems","/blog/systems"]]],["Explore Inside Google Cloud","Explore the latest Google Cloud news and events","/blog/products/","linear-gradient(80.33deg, rgba(254, 63, 60, 0.2) 0%, rgba(255, 110, 178, 0.2) 51.13%, rgba(254, 63, 60, 0.2) 101.28%)","linear-gradient(80.33deg, rgba(254, 63, 60, 0.3) 0%, rgba(255, 110, 178, 0.3) 51.13%, rgba(254, 63, 60, 0.3) 101.28%)","#7D0304"]]]]],["en",[[["Products \u0026 technology",null,[[["AI \u0026 Machine Learning","/blog/p-t/ai-machine-learning"],["API Management","/blog/api-management"],["Applied engineering","/blog/products-technology/applied-engineering"],["Developer tools","/blog/developer-tools"],["Business intelligence (BI)","/blog/business-intelligence-bi"],["Chrome Enterprise","/blog/chrome-enterprise"],["Compute","/blog/compute"],["Containers \u0026 Kubernetes","/blog/containers-kubernetes"],["Data analytics","/blog/data-analytics"],["Databases","/blog/databases"],["DevOps","/blog/devops"],["Distributed cloud","/blog/distributed-cloud"],["Hybrid \u0026 multicloud","/blog/hybrid-multicloud/"],["Management tools","/blog/management-tools"],["Maps \u0026 geospatial","/blog/maps-geospatial"],["Migration","/blog/migration"],["Networking","/blog/networking"],["SAP on Google Cloud","/blog/sap-google-cloud"],["Security","/blog/security"],["Sovereignty \u0026 compliance","/blog/sovereignty-compliance"],["SRE","/blog/site-reliability-engineering-sre"],["Storage","/blog/storage"],["Threat Intelligence","/blog/threat-intelligence"]]],["See all product news","Stay informed on all Cloud product announcements","/blog/products/","linear-gradient(79.98deg, rgba(66, 133, 244, 0.2) 0%, rgba(62, 106, 240, 0.2) 53.91%, rgba(87, 159, 255, 0.2) 107.82%)","linear-gradient(79.98deg, rgba(66, 133, 244, 0.3) 0%, rgba(62, 106, 240, 0.3) 53.91%, rgba(87, 159, 255, 0.3) 107.82%)","#2F3793"],7],["Learning",null,[[["Cloud architecture","/blog/cloud-architecture"],["IT leaders","/blog/it-leaders"],["Training \u0026 certifications","/blog/training-certifications"]]],["Explore learning","Develop your cloud skills and enhance your expertise","/blog/products/","linear-gradient(79.98deg, rgba(52, 168, 83, 0.2) 0%, rgba(102, 214, 105, 0.2) 53.91%, rgba(52, 168, 83, 0.2) 107.82%)","linear-gradient(79.98deg, rgba(52, 168, 83, 0.2) 0%, rgba(102, 214, 105, 0.2) 53.91%, rgba(52, 168, 83, 0.2) 107.82%)","#004E41"]],["Developers","/blog/developers-practitioners"],["Customers \u0026 partners",null,[[["Customer stories","/blog/customer-stories"],["Financial services","/blog/financial-services"],["Gaming","/blog/gaming"],["Healthcare \u0026 life sciences","/blog/healthcare-life-sciences"],["Manufacturing","/blog/manufacturing"],["Media \u0026 entertainment","/blog/media-entertainment"],["Partners","/blog/partners"],["Public sector","/blog/public-sector"],["Retail","/blog/retail"],["Startups","/blog/startups"],["Supply chain \u0026 logistics","/blog/supply-chain-logistics"],["Telecommunications","/blog/telecommunications"]]],["Explore customers \u0026 partners","Learn how we work with organizations to transform industries","/blog/products/","linear-gradient(80.33deg, rgba(251, 188, 4, 0.2) 0%, rgba(242, 153, 0, 0.2) 50.64%, rgba(251, 188, 4, 0.2) 101.28%)","linear-gradient(80.33deg, rgba(251, 188, 4, 0.3) 0%, rgba(242, 153, 0, 0.3) 50.64%, rgba(251, 188, 4, 0.3) 101.28%)","#202124"]],["Inside Google Cloud",null,[[["Company news","/blog/company-news"],["Data centers \u0026 regions","/blog/data-centers-and-regions"],["Events","/blog/events"],["Consulting","/blog/google-cloud-consulting"],["Google Cloud Next","/blog/google-cloud-next"],["Sustainability","/blog/sustainability"],["Systems","/blog/systems"]]],["Explore Inside Google Cloud","Explore the latest Google Cloud news and events","/blog/products/","linear-gradient(80.33deg, rgba(254, 63, 60, 0.2) 0%, rgba(255, 110, 178, 0.2) 51.13%, rgba(254, 63, 60, 0.2) 101.28%)","linear-gradient(80.33deg, rgba(254, 63, 60, 0.3) 0%, rgba(255, 110, 178, 0.3) 51.13%, rgba(254, 63, 60, 0.3) 101.28%)","#7D0304"]]]]],["fr",[[["Products \u0026 technology",null,[[["AI \u0026 Machine Learning","/blog/p-t/ai-machine-learning"],["API Management","/blog/api-management"],["Applied engineering","/blog/products-technology/applied-engineering"],["Developer tools","/blog/developer-tools"],["Business intelligence (BI)","/blog/business-intelligence-bi"],["Chrome Enterprise","/blog/chrome-enterprise"],["Compute","/blog/compute"],["Containers \u0026 Kubernetes","/blog/containers-kubernetes"],["Data analytics","/blog/data-analytics"],["Databases","/blog/databases"],["DevOps","/blog/devops"],["Distributed cloud","/blog/distributed-cloud"],["Hybrid \u0026 multicloud","/blog/hybrid-multicloud/"],["Management tools","/blog/management-tools"],["Maps \u0026 geospatial","/blog/maps-geospatial"],["Migration","/blog/migration"],["Networking","/blog/networking"],["SAP on Google Cloud","/blog/sap-google-cloud"],["Security","/blog/security"],["Sovereignty \u0026 compliance","/blog/sovereignty-compliance"],["SRE","/blog/site-reliability-engineering-sre"],["Storage","/blog/storage"],["Threat Intelligence","/blog/threat-intelligence"]]],["See all product news","Stay informed on all Cloud product announcements","/blog/products/","linear-gradient(79.98deg, rgba(66, 133, 244, 0.2) 0%, rgba(62, 106, 240, 0.2) 53.91%, rgba(87, 159, 255, 0.2) 107.82%)","linear-gradient(79.98deg, rgba(66, 133, 244, 0.3) 0%, rgba(62, 106, 240, 0.3) 53.91%, rgba(87, 159, 255, 0.3) 107.82%)","#2F3793"],7],["Learning",null,[[["Cloud architecture","/blog/cloud-architecture"],["IT leaders","/blog/it-leaders"],["Training \u0026 certifications","/blog/training-certifications"]]],["Explore learning","Develop your cloud skills and enhance your expertise","/blog/products/","linear-gradient(79.98deg, rgba(52, 168, 83, 0.2) 0%, rgba(102, 214, 105, 0.2) 53.91%, rgba(52, 168, 83, 0.2) 107.82%)","linear-gradient(79.98deg, rgba(52, 168, 83, 0.2) 0%, rgba(102, 214, 105, 0.2) 53.91%, rgba(52, 168, 83, 0.2) 107.82%)","#004E41"]],["Developers","/blog/developers-practitioners"],["Customers \u0026 partners",null,[[["Customer stories","/blog/customer-stories"],["Financial services","/blog/financial-services"],["Gaming","/blog/gaming"],["Healthcare \u0026 life sciences","/blog/healthcare-life-sciences"],["Manufacturing","/blog/manufacturing"],["Media \u0026 entertainment","/blog/media-entertainment"],["Partners","/blog/partners"],["Public sector","/blog/public-sector"],["Retail","/blog/retail"],["Startups","/blog/startups"],["Supply chain \u0026 logistics","/blog/supply-chain-logistics"],["Telecommunications","/blog/telecommunications"]]],["Explore customers \u0026 partners","Learn how we work with organizations to transform industries","/blog/products/","linear-gradient(80.33deg, rgba(251, 188, 4, 0.2) 0%, rgba(242, 153, 0, 0.2) 50.64%, rgba(251, 188, 4, 0.2) 101.28%)","linear-gradient(80.33deg, rgba(251, 188, 4, 0.3) 0%, rgba(242, 153, 0, 0.3) 50.64%, rgba(251, 188, 4, 0.3) 101.28%)","#202124"]],["Inside Google Cloud",null,[[["Company news","/blog/company-news"],["Data centers \u0026 regions","/blog/data-centers-and-regions"],["Events","/blog/events"],["Consulting","/blog/google-cloud-consulting"],["Google Cloud Next","/blog/google-cloud-next"],["Sustainability","/blog/sustainability"],["Systems","/blog/systems"]]],["Explore Inside Google Cloud","Explore the latest Google Cloud news and events","/blog/products/","linear-gradient(80.33deg, rgba(254, 63, 60, 0.2) 0%, rgba(255, 110, 178, 0.2) 51.13%, rgba(254, 63, 60, 0.2) 101.28%)","linear-gradient(80.33deg, rgba(254, 63, 60, 0.3) 0%, rgba(255, 110, 178, 0.3) 51.13%, rgba(254, 63, 60, 0.3) 101.28%)","#7D0304"]]]]],["ja",[[["Products \u0026 technology",null,[[["AI \u0026 Machine Learning","/blog/p-t/ai-machine-learning"],["API Management","/blog/api-management"],["Applied engineering","/blog/products-technology/applied-engineering"],["Developer tools","/blog/developer-tools"],["Business intelligence (BI)","/blog/business-intelligence-bi"],["Chrome Enterprise","/blog/chrome-enterprise"],["Compute","/blog/compute"],["Containers \u0026 Kubernetes","/blog/containers-kubernetes"],["Data analytics","/blog/data-analytics"],["Databases","/blog/databases"],["DevOps","/blog/devops"],["Distributed cloud","/blog/distributed-cloud"],["Hybrid \u0026 multicloud","/blog/hybrid-multicloud/"],["Management tools","/blog/management-tools"],["Maps \u0026 geospatial","/blog/maps-geospatial"],["Migration","/blog/migration"],["Networking","/blog/networking"],["SAP on Google Cloud","/blog/sap-google-cloud"],["Security","/blog/security"],["Sovereignty \u0026 compliance","/blog/sovereignty-compliance"],["SRE","/blog/site-reliability-engineering-sre"],["Storage","/blog/storage"],["Threat Intelligence","/blog/threat-intelligence"]]],["See all product news","Stay informed on all Cloud product announcements","/blog/products/","linear-gradient(79.98deg, rgba(66, 133, 244, 0.2) 0%, rgba(62, 106, 240, 0.2) 53.91%, rgba(87, 159, 255, 0.2) 107.82%)","linear-gradient(79.98deg, rgba(66, 133, 244, 0.3) 0%, rgba(62, 106, 240, 0.3) 53.91%, rgba(87, 159, 255, 0.3) 107.82%)","#2F3793"],7],["Learning",null,[[["Cloud architecture","/blog/cloud-architecture"],["IT leaders","/blog/it-leaders"],["Training \u0026 certifications","/blog/training-certifications"]]],["Explore learning","Develop your cloud skills and enhance your expertise","/blog/products/","linear-gradient(79.98deg, rgba(52, 168, 83, 0.2) 0%, rgba(102, 214, 105, 0.2) 53.91%, rgba(52, 168, 83, 0.2) 107.82%)","linear-gradient(79.98deg, rgba(52, 168, 83, 0.2) 0%, rgba(102, 214, 105, 0.2) 53.91%, rgba(52, 168, 83, 0.2) 107.82%)","#004E41"]],["Developers","/blog/developers-practitioners"],["Customers \u0026 partners",null,[[["Customer stories","/blog/customer-stories"],["Financial services","/blog/financial-services"],["Gaming","/blog/gaming"],["Healthcare \u0026 life sciences","/blog/healthcare-life-sciences"],["Manufacturing","/blog/manufacturing"],["Media \u0026 entertainment","/blog/media-entertainment"],["Partners","/blog/partners"],["Public sector","/blog/public-sector"],["Retail","/blog/retail"],["Startups","/blog/startups"],["Supply chain \u0026 logistics","/blog/supply-chain-logistics"],["Telecommunications","/blog/telecommunications"]]],["Explore customers \u0026 partners","Learn how we work with organizations to transform industries","/blog/products/","linear-gradient(80.33deg, rgba(251, 188, 4, 0.2) 0%, rgba(242, 153, 0, 0.2) 50.64%, rgba(251, 188, 4, 0.2) 101.28%)","linear-gradient(80.33deg, rgba(251, 188, 4, 0.3) 0%, rgba(242, 153, 0, 0.3) 50.64%, rgba(251, 188, 4, 0.3) 101.28%)","#202124"]],["Inside Google Cloud",null,[[["Company news","/blog/company-news"],["Data centers \u0026 regions","/blog/data-centers-and-regions"],["Events","/blog/events"],["Consulting","/blog/google-cloud-consulting"],["Google Cloud Next","/blog/google-cloud-next"],["Sustainability","/blog/sustainability"],["Systems","/blog/systems"]]],["Explore Inside Google Cloud","Explore the latest Google Cloud news and events","/blog/products/","linear-gradient(80.33deg, rgba(254, 63, 60, 0.2) 0%, rgba(255, 110, 178, 0.2) 51.13%, rgba(254, 63, 60, 0.2) 101.28%)","linear-gradient(80.33deg, rgba(254, 63, 60, 0.3) 0%, rgba(255, 110, 178, 0.3) 51.13%, rgba(254, 63, 60, 0.3) 101.28%)","#7D0304"]]]]],["ko",[[["Products \u0026 technology",null,[[["AI \u0026 Machine Learning","/blog/p-t/ai-machine-learning"],["API Management","/blog/api-management"],["Applied engineering","/blog/products-technology/applied-engineering"],["Developer tools","/blog/developer-tools"],["Business intelligence (BI)","/blog/business-intelligence-bi"],["Chrome Enterprise","/blog/chrome-enterprise"],["Compute","/blog/compute"],["Containers \u0026 Kubernetes","/blog/containers-kubernetes"],["Data analytics","/blog/data-analytics"],["Databases","/blog/databases"],["DevOps","/blog/devops"],["Distributed cloud","/blog/distributed-cloud"],["Hybrid \u0026 multicloud","/blog/hybrid-multicloud/"],["Management tools","/blog/management-tools"],["Maps \u0026 geospatial","/blog/maps-geospatial"],["Migration","/blog/migration"],["Networking","/blog/networking"],["SAP on Google Cloud","/blog/sap-google-cloud"],["Security","/blog/security"],["Sovereignty \u0026 compliance","/blog/sovereignty-compliance"],["SRE","/blog/site-reliability-engineering-sre"],["Storage","/blog/storage"],["Threat Intelligence","/blog/threat-intelligence"]]],["See all product news","Stay informed on all Cloud product announcements","/blog/products/","linear-gradient(79.98deg, rgba(66, 133, 244, 0.2) 0%, rgba(62, 106, 240, 0.2) 53.91%, rgba(87, 159, 255, 0.2) 107.82%)","linear-gradient(79.98deg, rgba(66, 133, 244, 0.3) 0%, rgba(62, 106, 240, 0.3) 53.91%, rgba(87, 159, 255, 0.3) 107.82%)","#2F3793"],7],["Learning",null,[[["Cloud architecture","/blog/cloud-architecture"],["IT leaders","/blog/it-leaders"],["Training \u0026 certifications","/blog/training-certifications"]]],["Explore learning","Develop your cloud skills and enhance your expertise","/blog/products/","linear-gradient(79.98deg, rgba(52, 168, 83, 0.2) 0%, rgba(102, 214, 105, 0.2) 53.91%, rgba(52, 168, 83, 0.2) 107.82%)","linear-gradient(79.98deg, rgba(52, 168, 83, 0.2) 0%, rgba(102, 214, 105, 0.2) 53.91%, rgba(52, 168, 83, 0.2) 107.82%)","#004E41"]],["Developers","/blog/developers-practitioners"],["Customers \u0026 partners",null,[[["Customer stories","/blog/customer-stories"],["Financial services","/blog/financial-services"],["Gaming","/blog/gaming"],["Healthcare \u0026 life sciences","/blog/healthcare-life-sciences"],["Manufacturing","/blog/manufacturing"],["Media \u0026 entertainment","/blog/media-entertainment"],["Partners","/blog/partners"],["Public sector","/blog/public-sector"],["Retail","/blog/retail"],["Startups","/blog/startups"],["Supply chain \u0026 logistics","/blog/supply-chain-logistics"],["Telecommunications","/blog/telecommunications"]]],["Explore customers \u0026 partners","Learn how we work with organizations to transform industries","/blog/products/","linear-gradient(80.33deg, rgba(251, 188, 4, 0.2) 0%, rgba(242, 153, 0, 0.2) 50.64%, rgba(251, 188, 4, 0.2) 101.28%)","linear-gradient(80.33deg, rgba(251, 188, 4, 0.3) 0%, rgba(242, 153, 0, 0.3) 50.64%, rgba(251, 188, 4, 0.3) 101.28%)","#202124"]],["Inside Google Cloud",null,[[["Company news","/blog/company-news"],["Data centers \u0026 regions","/blog/data-centers-and-regions"],["Events","/blog/events"],["Consulting","/blog/google-cloud-consulting"],["Google Cloud Next","/blog/google-cloud-next"],["Sustainability","/blog/sustainability"],["Systems","/blog/systems"]]],["Explore Inside Google Cloud","Explore the latest Google Cloud news and events","/blog/products/","linear-gradient(80.33deg, rgba(254, 63, 60, 0.2) 0%, rgba(255, 110, 178, 0.2) 51.13%, rgba(254, 63, 60, 0.2) 101.28%)","linear-gradient(80.33deg, rgba(254, 63, 60, 0.3) 0%, rgba(255, 110, 178, 0.3) 51.13%, rgba(254, 63, 60, 0.3) 101.28%)","#7D0304"]]]]]]],'cloud.google.com','https', null , false , null ,[[106242883,1714253,97656895,98225186,106088277,105763536,105993283,1706538,48554500,106551328,97493656,106565539,105901316,106058902,105739268,97493634,106032101,105823623,97535270,98073360,97442195,97785984,48489833,97656881,105993269,97493642,105739254,97493620,98073330,97442181,97785970],null,null,null,null,true],];</script><script class="ds:0" nonce="ukEud-BIIo14C235ZP9QwA">AF_initDataCallback({key: 'ds:0', hash: '1', data:[["What DBAs need to know about Cloud Spanner: Keys and indexes","Learn the dos-and-don'ts, best practices and why things are different in Cloud Spanner.",[1528401600],"https://storage.googleapis.com/gweb-cloudblog-publish/images/15_-_Google_Cloud_2fKuG6b.max-2600x2600.jpg","https://cloud.google.com/blog/products/gcp/what-dbas-need-to-know-about-cloud-spanner-part-1-keys-and-indexes",[1529030962,332260000],"blog.articlepage",null,"/api/w_v2/pages/36622/","what-dbas-need-to-know-about-cloud-spanner-part-1-keys-and-indexes",36622],[["Niel Markwick","Solutions Architect"],["Robert Saxby","Product Manager"]],[null,"\u003cscript type\u003d\"application/ld+json\"\u003e{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"@id\":\"https://cloud.google.com/blog/products/gcp/what-dbas-need-to-know-about-cloud-spanner-part-1-keys-and-indexes\",\"headline\":\"What DBAs need to know about Cloud Spanner: Keys and indexes\",\"description\":\"Learn the dos-and-don\\u0027ts, best practices and why things are different in Cloud Spanner.\",\"image\":\"https://storage.googleapis.com/gweb-cloudblog-publish/images/15_-_Google_Cloud_2fKuG6b.max-2600x2600.jpg\",\"author\":[{\"@type\":\"Person\",\"name\":\"Niel Markwick\",\"url\":\"\"},{\"@type\":\"Person\",\"name\":\"Robert Saxby\",\"url\":\"\"}],\"datePublished\":\"2018-06-07\",\"publisher\":{\"@type\":\"Organization\",\"name\":\"Google Cloud\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://www.gstatic.com/cgc/google-cloud-logo.svg\"}},\"url\":\"https://cloud.google.com/blog/products/gcp/what-dbas-need-to-know-about-cloud-spanner-part-1-keys-and-indexes\",\"keywords\":[\"Google Cloud\",\"Databases\",\"Solutions and How-to\\u0027s\",\"Spanner\"],\"timeRequired\":\"PT13M\"}\u003c/script\u003e"],["What DBAs need to know about Cloud Spanner, part 1: Keys and indexes"],null,null,[[null,null,[null,[null,"\u003cp\u003e\u003ca href\u003d\"https://cloud.google.com/spanner/\"\u003eCloud Spanner\u003c/a\u003e is a relational and horizontally scalable database service, built from a cloud/distributed design perspective. It brings efficiency and high availability for developers and database administrators (DBAs), and differs structurally from typical databases you’re used to. In this blog series, we’ll explore some of the key differences that DBAs and developers will encounter as you migrate from traditional vertically-scaling (scale-up) relational database management systems (RDBMS) and move to Cloud Spanner. We will discuss some of the dos-and-don'ts, best practices and why things are different in Cloud Spanner.\u003c/p\u003e\u003cp\u003eIn this series, we will explore a range of topics, including:\n\u003cbr\u003e\u003c/p\u003e\u003cul\u003e\n\u003cli\u003eSelection of keys and use of indexes\u003c/li\u003e\n\u003cli\u003eHow to approach business logic\u003c/li\u003e\n\u003cli\u003eImporting and exporting data\u003c/li\u003e\n\u003cli\u003eMigrating from your existing RDBMS\u003c/li\u003e\n\u003cli\u003eOptimizing performance\u003c/li\u003e\n\u003cli\u003eAccess control and logging \u003c/li\u003e\n\u003c/ul\u003e\nYou’ll gain an understanding of how to best use Cloud Spanner and release its potential to achieve linearly scalable performance over massive databases. In this first installment, let’s start with a closer look at how the concepts of keys and indexes work in Cloud Spanner.\u003cp\u003e\u003c/p\u003e\u003cp\u003e\u003c/p\u003e\u003ch3\u003e\nChoosing keys in Cloud Spanner\u003c/h3\u003e\nJust like in other databases, the choice of key is vitally important to optimize the performance of the database. It’s even more important in Cloud Spanner, due to the way its mechanisms distribute database load. Unlike traditional RDBMS, you’ll need to take care when choosing the primary keys for the tables and choosing which columns to index. \u003cp\u003eUsing well-distributed keys results in a table whose size and performance can scale linearly with the number of Cloud Spanner nodes, while using poorly distributed keys can result in hotspots, where a single node is responsible for the majority of reads and writes to the table.\u003c/p\u003e\u003cp\u003eIn a traditional vertically scaled RDBMS, there is a single node that manages all of the tables. (Depending on the installation, there may be replicas that can be used for reading or for failover). This single node therefore has full control over the table row locks, and the issuing of unique keys from a numeric sequence.\u003c/p\u003e\u003cp\u003eCloud Spanner is a distributed system, with many nodes reading and writing to the database at any one time. However, to achieve scalability, along with global ACID transactions and strong consistency, only one node at any one time can have write responsibility for a given row.\u003c/p\u003e\u003cp\u003eCloud Spanner distributes management of rows across multiple nodes by breaking up each table into several \u003ca href\u003d\"https://cloud.google.com/spanner/docs/schema-and-data-model#database-splits\"\u003esplits\u003c/a\u003e, using ranges of the lexicographically sorted primary key. \u003c/p\u003e\u003cp\u003eThis enables Cloud Spanner to achieve high availability and scalability, but it also means that using any continuously increasing or decreasing sequence as a key is detrimental to performance. To explain why, let’s explore how Cloud Spanner creates and manages its table splits.\u003c/p\u003e\u003ch3\u003e\nTable splits and key choice\u003c/h3\u003e\nCloud Spanner manages splits using \u003ca href\u003d\"https://en.wikipedia.org/wiki/Paxos_(computer_science)\" target\u003d\"_blank\"\u003ePaxos\u003c/a\u003e (you can learn more about how in this detailed documentation: \u003ca href\u003d\"https://cloud.google.com/spanner/docs/whitepapers/life-of-reads-and-writes\"\u003eLife of Cloud Spanner Reads \u0026amp; Writes\u003c/a\u003e and \u003ca href\u003d\"https://research.google.com/archive/spanner.html\" target\u003d\"_blank\"\u003eSpanner: Google's Globally Distributed Database\u003c/a\u003e). In a regional instance of Cloud Spanner, the responsibility for reading/writing each split is distributed across a group of three nodes, one in each of the three availability zones of the Cloud Spanner instance.\u003cp\u003e\u003cbr\u003e\u003c/p\u003e\u003cp\u003eOne node in this group of three is elected Split Leader and manages the writes and locks for all the rows in the split. All three nodes in the group can perform reads.\u003c/p\u003e\u003cp\u003eTo create a visual example, consider a table with 600 rows that uses a simple, continuous, monotonically increasing integer key (as is common in traditional RDBMS), broken into six splits, running on a two-node (per zone) Cloud Spanner instance. In an ideal situation, the table will have six splits, the leaders of which will be the six individual nodes available in the instance.\u003c/p\u003e\u003cp\u003e\u003c/p\u003e"]]],[null,null,null,null,null,null,null,null,[[[null,""],["https://storage.googleapis.com/gweb-cloudblog-publish/images/gcp-split-leaderndlc.max-700x700.PNG",null,null,"https://storage.googleapis.com/gweb-cloudblog-publish/images/gcp-split-leaderndlc.max-700x700.PNG"],null,3]]],[null,null,[null,[null,"\u003cp\u003eThis distribution would result in ideal performance when reading/updating the rows, provided that the reads and updates are evenly distributed across the key range.\u003c/p\u003e\u003ch3\u003e\nProblems with hotspots\u003c/h3\u003eThe problem arises when new rows are appended to the database. Every new row will have an incrementing ID and will be added to the last split, meaning that out of the six available nodes, only one node will be handling all of the writes. In the example above, node 2c would be handling all writes. This node then becomes a hotspot, limiting the overall write performance of the database. In addition, the row distribution becomes unbalanced, with the last split becoming significantly larger, so it’s then handling more row reads than the others. \u003cp\u003eCloud Spanner does try to compensate for uneven load by \u003ca href\u003d\"https://cloud.google.com/spanner/docs/schema-and-data-model#database-splits\"\u003eadding and removing splits in the background\u003c/a\u003e according to read and write load, and by creating a new split once the split size crosses a set threshold. However, in a frequently appended table, this will not happen quickly enough to avoid creating a hotspot.\u003c/p\u003e\u003cp\u003eAlong with monotonically increasing or decreasing keys, this issue also affects tables that are indexed by any deterministic key—for example, an increasing timestamp in an event log table. Timestamp-keyed tables are also more likely to have a read hotspot because, in most cases, recently timestamped rows are accessed more frequently than the others. (Check out \u003ca href\u003d\"https://medium.com/google-cloud/cloud-spanner-choosing-the-right-primary-keys-cd2a47c7b52d\" target\u003d\"_blank\"\u003eCloud Spanner — Choosing the right primary keys\u003c/a\u003e for detailed information on detecting and avoiding hotspots.)\u003c/p\u003e\u003ch3\u003e\nProblems with sequence generators\u003c/h3\u003e\nThe concept of sequence generators, or lack thereof, is an important area to explore further. Traditional vertical RDBMS have integrated sequence generators, which create new integer keys from a sequence during a transaction. Cloud Spanner cannot have this due to its distributed architecture, as there would either be race conditions between the split leader nodes when inserting new keys, or the table would have to be globally locked when generating a new key, both of which would reduce performance.\u003cp\u003eOne workaround could be that the key is generated by the application (for example, by storing the next key value in a separate table in the database, or by getting the current maximum key value from the table). However, you’ll run into the same performance problems. Consider that as the application is also likely to be distributed, there may be multiple database clients trying to append a row at the same time, with two potential results depending on how the new key is generated:\n\u003cbr\u003e\u003c/p\u003e\u003cul\u003e\n\u003cli\u003eIf the SELECT for the existing key is performed in the transaction, one application instance trying to append would block all other application instances trying to append due to row locking.\u003c/li\u003e\n\u003cli\u003eIf the SELECT for the existing key is done outside of the transaction, then there is a race between each of the application instances trying to append the new row. One will succeed, while others would have to retry (including generating a new key) after the append fails, since the key already exists. \u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003e\nWhat makes a good key\u003c/h3\u003e\nSo if sequential keys will limit database performance in Cloud Spanner, what’s a good key to use? Ideally, the high-order bits should be evenly and semi-randomly distributed when keys are generated. \u003cp\u003eOne simple way to generate such a key is to use random numbers, such as a random universally unique identifier (UUID). Note that there are several classes of \u003ca href\u003d\"http://go/wiki/Universally_unique_identifier#Versions\" target\u003d\"_blank\"\u003eUUID\u003c/a\u003e. Versions 1 and 2 use deterministic prefixes, such as timestamps or MAC addresses. Ensure that the UUID generation method you use is truly randomly distributed, i.e., v4, at least over the higher order bytes. This will ensure that the keys are evenly distributed among the keyspace, and hence that the load is distributed evenly over the spanner nodes. \u003c/p\u003e\u003cp\u003eAlthough another approach might be to use some real-world attributes of the data that are immutable and evenly distributed over the key range, this is quite a challenge since most uniformly distributed attributes are discrete and not continuous. For example, the random result of a dice roll is uniformly distributed and has six finite values. A continuous distribution could rely on an irrational number, for example π.\u003c/p\u003e\u003ch3\u003e\nWhat if I really need an integer sequence as a key?\u003c/h3\u003e\nThough it’s not recommended, in some circumstances an integer sequence key is necessary, either for legacy or for external reasons, e.g., an employee ID.\u003cp\u003eTo use an integer sequence key, you’ll first need a sequence generator that’s safe across a distributed system. One way of doing this is to have a table in Cloud Spanner contain a row for each required sequence that contains the next value in the sequence—so it would look something like this:\n\u003c/p\u003e"]]],[["CREATE TABLE Sequences (\r\n Sequence_ID STRING(MAX) NOT NULL, -- The name of the sequence\r\n Next_Value INT64 NOT NULL\r\n) PRIMARY KEY (Sequence_ID)",null,[null,""]]],[null,null,[null,[null,"\u003cp\u003eWhen a new ID value is required, the next value of the sequence is read, incremented and updated in the same transaction as the insert for the new row.\u003c/p\u003e\u003cp\u003eNote that this will limit performance when many rows are inserted, as each insert will block all other inserts due to the update of the Sequences table that we created above.\u003c/p\u003e\u003cp\u003eThis performance issue can be reduced—though at the cost of possible gaps in the sequence—if each application instance reserves a block of, for example, 100 sequence values at once by incrementing Next_Value by 100, and then manages issuing individual IDs from that block internally.\u003c/p\u003e\u003cp\u003eIn the table using the sequence, the key cannot simply be the numeric sequence value itself, as that will cause the last split to become a hotspot (as explained previously). So the application must generate a complex key that randomly distributes the rows among the splits.\u003c/p\u003e\u003cp\u003eThis is known as \u003cem\u003eapplication-level sharding\u003c/em\u003e and is achieved by prefixing the sequential ID with an additional column containing a value that’s evenly distributed among the key space—e.g., a hash of the original ID, or bit-reversing the ID. That looks something like this:\n\u003c/p\u003e"]]],[["CREATE TABLE Table1 (\r\n Hashed_Id INT64 NOT NULL, \r\n ID INT64 NOT NULL,\r\n -- other columns with data values follow....\r\n) PRIMARY KEY (Hashed_Id, Id)",null,[null,""]]],[null,null,[null,[null,"\u003cp\u003eEven a simple cyclic redundancy check (CRC)32 checksum is good enough to provide a suitably pseudo-random Hashed_Id. It does not have to be secure, just enough to randomize the row order of the sequentially numbered keys, as in the following table:\u003c/p\u003e"]]],[null,null,null,null,null,null,null,null,[[[null,""],["https://storage.googleapis.com/gweb-cloudblog-publish/images/gcp-cyclic-redundancy-checka224.max-400x400.PNG",null,null,"https://storage.googleapis.com/gweb-cloudblog-publish/images/gcp-cyclic-redundancy-checka224.max-400x400.PNG"],null,2]]],[null,null,[null,[null,"\u003cp\u003eNote that whenever a row is read directly, both the ID and Hashed_Id must be specified to prevent a table scan, as in this example:\n\u003c/p\u003e"]]],[["SELECT * FROM Table1\r\nWHERE t1.Hashed_Id \u003d 0xDEADBEEF\r\n AND t1.Id \u003d 1234",null,[null,""]]],[null,null,[null,[null,"\u003cp\u003eSimilarly, whenever this table is joined with other tables in the query by Id, the join must also use both the ID and the Hashed_Id. Otherwise, you’ll lose performance, since a table scan will be required to find the row. This means that the table that references the ID must also include the Hashed_Id, like this:\n\u003c/p\u003e"]]],[["CREATE TABLE Table2 (\r\n Id String(MAX), -- UUID\r\n Table1_Hashed_Id INT64 NOT NULL, \r\n Table1_Id INT64 NOT NULL,\r\n -- other columns with data values follow....\r\n) PRIMARY KEY (Id)\r\nSELECT * from Table2 t2 INNER JOIN Table1 t1 \r\n ON t1.Hashed_Id \u003d t2.Table1_Hashed_Id\r\n AND t1.Id \u003d t2.Table1_Id\r\nWHERE ... -- some criteria",null,[null,""]]],[null,null,[null,[null,"\u003cp\u003e\u003c/p\u003e\u003cp\u003e\u003c/p\u003e\u003ch3\u003e\nWhat if I really need to use a timestamp as a key?\u003c/h3\u003e\nIn many cases, the row using the timestamp as a key also refers to some other table data. For example, the transactions on a bank account will refer to the source account. In this case, assuming that the source account number is already reasonably evenly distributed, you can use a complex key containing the account number first and then the timestamp:\n\u003cp\u003e\u003c/p\u003e\u003cp\u003e\u003c/p\u003e"]]],[["CREATE TABLE Transactions (\r\n account_number INT64 NOT NULL,\r\n timestamp TIMESTAMP NOT NULL,\r\n transaction_info ...,\r\n) PRIMARY KEY (account_number, timestamp DESC)",null,[null,""]]],[null,null,[null,[null,"\u003cp\u003eThe splits will be made primarily using the account number and not the timestamp, thus distributing the newly added rows over various splits.\u003c/p\u003e\u003cp\u003eNote that in this table, the timestamp is sorted by descending order. That’s because in most cases you want to read the most recent transactions—which will be first in the table—so you won’t need to scan through the entire table to find the most recent rows.\u003c/p\u003e\u003cp\u003eIf you do not, or cannot have an external reference, or have any other data that you can use in the key in order to distribute the order, then you will need to perform application-level sharding, which is shown in the integer sequence example above. \u003c/p\u003e\u003cp\u003eNote, however, that using a simple hash will make queries by timestamp range extremely slow, since retrieving a range of timestamps will require a full table scan to cover all the hashes. Instead, we recommend generating a ShardId from the timestamp. So, for example,\n \u003c/p\u003e"]]],[["TimestampShardId \u003d CRC32(Timestamp) % 100",null,[null,""]]],[null,null,[null,[null,"\u003cp\u003ewill return a pseudo-random value between 0 and 99 from the timestamp. Then, you can use this ShardId in the table key so that sequential timestamps are distributed across multiple splits, like so:\n\u003c/p\u003e"]]],[["CREATE TABLE Events (\r\n TimestampShardId INT64 NOT NULL\r\n Timestamp TIMESTAMP NOT NULL,\r\n event_info...\r\n) PRIMARY KEY (TimestampShardId, Timestamp DESC)",null,[null,""]]],[null,null,[null,[null,"\u003cp\u003eFor example, a table with dates of the first 10 days of 2018 (which without ShardId would be stored in the table in date order) will give the following ordering:\u003c/p\u003e"]]],[null,null,null,null,null,null,null,null,[[[null,""],["https://storage.googleapis.com/gweb-cloudblog-publish/images/gcp-TimestampShardId1ek6.max-400x400.PNG",null,null,"https://storage.googleapis.com/gweb-cloudblog-publish/images/gcp-TimestampShardId1ek6.max-400x400.PNG"],null,2]]],[null,null,[null,[null,"\u003cp\u003eWhen a query is made, you must use a BETWEEN clause to be able to select across all shards without performing a table scan:\n\u003c/p\u003e"]]],[["Select * from Events\r\nWHERE\r\n TimestampShardId BETWEEN 0 AND 99\r\n AND Timestamp \u003e @lower_bound\r\n AND Timestamp \u003c @upper_bound;",null,[null,""]]],[null,null,[null,[null,"\u003cp\u003eNote that the ShardId is only a way of improving key distribution so that Cloud Spanner can use multiple splits to store sequential timestamps. It does not identify an actual database split, and rows in different tables with the same ShardId may well be in different splits.\u003c/p\u003e\u003ch3\u003e\nMigration implications\u003c/h3\u003e\nWhen you’re migrating from an existing RDBMS that uses keys that are not optimal for Cloud Spanner, take the above considerations into account. If necessary, add key hashes to tables or change the key ordering.\u003cp\u003e\u003c/p\u003e\u003cp\u003e\u003c/p\u003e\u003ch3\u003e\nDeciding on indexes in Cloud Spanner\u003c/h3\u003e\nIn a traditional RDBMS, indexes are very efficient ways of looking up rows in a table by a value that is not the primary key. Under most circumstances, a row lookup via an index will take approximately the same time as a row lookup via its key. That’s because the table and the index are managed by a single node, so the index can point directly to the on-disk row of the table. \u003cp\u003eIn Cloud Spanner, indexes are actually implemented using tables, which allows them to be distributed and enables the same degree of scalability and performance as normal tables. \u003c/p\u003e\u003cp\u003eHowever, because of this type of implementation, using indexes to read the data from the table row is less efficient than in a traditional RDBMS. It’s effectively an inner join with the original table, so reading from a table using an indexed key turns into this process:\n\u003cbr\u003e\u003c/p\u003e\u003cul\u003e\n\u003cli\u003eLook up split for index key\u003c/li\u003e\n\u003cli\u003eRead index row from split to get table key\u003c/li\u003e\n\u003cli\u003eLook up split for table key\u003c/li\u003e\n\u003cli\u003eRead table row from split to get row values\u003c/li\u003e\n\u003cli\u003eReturn row values\u003c/li\u003e\n\u003c/ul\u003e\nNote that there is no guarantee that the split for the index key is on the same node as the split for the table key, so a simple index query may require cross-node communication just to read one row.\u003cp\u003eSimilarly, updating an indexed table will most likely require a multi-node write to update the table row and the index row. So using an index in Cloud Spanner is always a trade-off between improved read performance and reduced write performance. \u003c/p\u003e\u003ch3\u003e\nIndex keys and hotspots\u003c/h3\u003e\nBecause indexes are implemented as tables in Cloud Spanner, you’ll encounter the same issues with the indexed columns as you did with the table keys: An index on a column with poorly distributed values (such as a timestamp) will lead to the creation of a hotspot, even if the underlying table is using well-distributed keys. That’s because when rows are appended to the table, the index will also have new rows appended, and writes for these new rows will always be sent to the same split.\u003cp\u003eTherefore, care must be taken when creating indexes, and we recommend that you create indexes only using columns which have a well-distributed set of values, just like when choosing a table key. \u003c/p\u003e\u003cp\u003eIn some cases, you’ll need to do application-level sharding for the indexed columns in order to create a synthetic ShardId column, which can be used in the index to distribute values over the splits.\u003c/p\u003e\u003cp\u003eFor example, this configuration below will create a hotspot when appending events due to the index, even if UserId is randomly distributed.\n\u003c/p\u003e"]]],[["CREATE TABLE Events (\r\n UserId String(MAX),\r\n Timestamp TIMESTAMP,\r\n EventData)\r\nPRIMARY KEY (UserId, Timestamp DESC);\r\nCREATE INDEX EventsByTimestamp ON Events (Timestamp DESC);",null,[null,""]]],[null,null,[null,[null,"\u003cp\u003eAs with a table keyed by timestamp only, a synthetic ShardId column will need to be added to the table, and then used as the first indexed column to help the distribution of the index among the splits.\u003c/p\u003e\u003cp\u003eA simple ShardId generator could be:\n \u003c/p\u003e"]]],[["TimestampShardId \u003d CRC32(Timestamp) % 100",null,[null,""]]],[null,null,[null,[null,"\u003cp\u003ewhich will give a hash value between 0 and 99 from the timestamp. You’ll need to add this to the original table as a new column, then use it as the first index key, like this:\n\u003c/p\u003e"]]],[["CREATE TABLE Events (\r\n UserId String(MAX),\r\n Timestamp TIMESTAMP,\r\n TimestampShardId INT64, \r\n EventData)\r\nPRIMARY KEY (UserId, Timestamp DESC);\r\nCREATE INDEX EventsByTimestamp ON Events (TimestampShardId,Timestamp);",null,[null,""]]],[null,null,[null,[null,"\u003cp\u003eThis will remove the hotspot on index update, but will slow down range queries on timestamp, since you’ll have to run the query for each ShardId value (0-99) to get the timestamp range from all shards:\n\u003c/p\u003e"]]],[["Select * from Events@{FORCE_INDEX\u003dEventsByTimestamp}\r\nWHERE\r\n TimestampShardId BETWEEN 0 AND 99\r\n AND Timestamp \u003e @lower_bound\r\n AND Timestamp \u003c @upper_bound;",null,[null,""]]],[null,null,[null,[null,"\u003cp\u003eUsing this type of index and sharding strategy must strike a balance between the additional complexity when reading and the increase in performance of an indexed query.\n\u003cbr\u003e\u003c/p\u003e\u003ch3\u003e\nOther indexes you should know\u003c/h3\u003e\nWhen you’re migrating to Cloud Spanner, you’ll also want to understand how these other index types function and when you might need to use them:\n\u003cbr\u003e\u003ch3\u003e\nNULL_FILTERED indexes\u003c/h3\u003e\nBy default, Cloud Spanner will index rows using NULL indexed column values. A NULL is considered to be the smallest possible value, so these values will appear at the start of the index.\u003cp\u003eIt’s also possible to disable this behavior by using the \u003ca href\u003d\"https://cloud.google.com/spanner/docs/secondary-indexes#indexing_of_nulls\"\u003eCREATE NULL_FILTERED INDEX\u003c/a\u003e syntax, which will create an index ignoring rows with NULL indexed column values.\u003c/p\u003e\u003cp\u003eThis index will be smaller than the complete index, as it will effectively be a materialized filtered view on the table, and will be faster to query than the full table when a table scan is necessary. \u003c/p\u003e\u003ch3\u003e\nUNIQUE indexes\u003c/h3\u003e\nYou can use a \u003ca href\u003d\"https://cloud.google.com/spanner/docs/secondary-indexes#unique_indexes\"\u003eUNIQUE\u003c/a\u003e index to enforce that a column of a table has unique values. This constraint will be applied at transaction commit time (and at index creation).\u003cp\u003e\u003c/p\u003e\u003cp\u003e\u003c/p\u003e\u003ch3\u003e\nCovering Indexes and STORING clause\u003c/h3\u003e\nTo optimize performance when reading from indexes, Cloud Spanner can store the column values of the table row in the index itself, removing the need to read the table. This is known as a Covering Index. This is achieved by using the STORING clause when defining the index. The values of the column can then be read directly from the index, so reading from the index performs as well as reading from the table. \nFor example, this table contains employee data:\n\u003cp\u003e\u003c/p\u003e\u003cp\u003e\u003c/p\u003e"]]],[["CREATE TABLE Employees (\r\n CompanyUUID INT64,\r\n EmployeeUUID INT64,\r\n FullName STRING(MAX)\r\n ...\r\n) PRIMARY KEY (CompanyUUID,EmployeeUUID)",null,[null,""]]],[null,null,[null,[null,"\u003cp\u003eIf you often need to look up an employee’s full name, for example, you can create an index on employeeUUID, storing the full name for rapid lookups:\n\u003c/p\u003e"]]],[["CREATE INDEX EmployeesById \r\n ON Employees (EmployeeUUID) \r\n STORING (FullName);",null,[null,""]]],[null,null,[null,[null,"\u003cp\u003e\u003c/p\u003e\u003cp\u003e\u003c/p\u003e\u003ch3\u003e\nForcing index use\u003c/h3\u003e\nCloud Spanner’s query engine will only automatically use indexes in rare circumstances (when it is a query fully covered by the index), so it is important to use a FORCE_INDEX directive in the SQL SELECT statement to ensure that Cloud Spanner looks up values from the index. (You can find more details in the \u003ca href\u003d\"https://cloud.google.com/spanner/docs/secondary-indexes#index_directive\"\u003edocumentation\u003c/a\u003e.) \n\u003cp\u003e\u003c/p\u003e\u003cp\u003e\u003c/p\u003e"]]],[["Select * \r\nfrom Employees@{FORCE_INDEX\u003dEmployeesById}\r\nWhere EmployeeUUID\u003dxxx;",null,[null,""]]],[null,null,[null,[null,"\u003cp\u003eNote that when using the Cloud Spanner Read APIs, you can only perform fully covered queries—i.e., queries where the index stores all of the columns requested. To read the columns from the original table using an index, you must use an SQL query. See Use a Secondary Index section of the Getting Started docs for examples.\u003c/p\u003e\u003ch3\u003e\nContinuing your Cloud Spanner education\u003c/h3\u003e\nThere are some big conceptual differences when you’re using a cloud-built, horizontally scalable database like Cloud Spanner in contrast with the RDBMS you’ve been using for years. Once you’re familiar with the way keys and indexes work, you can start to take advantage of the benefits of Cloud Spanner for faster scalability.\u003cp\u003eIn the next episode of this series, we will look at how to deal with business logic that would previously be implemented by triggers and stored procedures, neither of which exist in Cloud Spanner.\u003c/p\u003e\u003cp\u003eWant to learn more about Cloud Spanner in person? We’ll be discussing data migration and more \u003ca href\u003d\"https://cloud.withgoogle.com/next18/sf/sessions/session/156790\" target\u003d\"_blank\"\u003ein this session\u003c/a\u003e at Next 2018 in July. For more information, and to register, visit the \u003ca href\u003d\"https://goo.gl/fo1kgH\" target\u003d\"_blank\"\u003eNext ‘18 website\u003c/a\u003e.\u003c/p\u003e\u003ch3\u003e\nRelated content:\u003c/h3\u003e\n\u003ca href\u003d\"https://cloudplatform.googleblog.com/2018/03/how-we-used-Cloud-Spanner-to-build-our-email-personalization-system-from-Soup-to-nuts.html\" target\u003d\"_blank\"\u003eHow we used Cloud Spanner to build our email personalization system—from “Soup” to nuts\u003c/a\u003e\u003cbr\u003e\u003ca href\u003d\"https://cloudplatform.googleblog.com/2018/01/why-you-should-pick-strong-consistency-whenever-possible.html\" target\u003d\"_blank\"\u003eWhy you should pick strong consistency, whenever possible\u003c/a\u003e\u003cp\u003e\u003c/p\u003e\u003cp\u003e\u003c/p\u003e"]]],[null,null,[null,[null,"\u003cp\u003e\u003ca href\u003d\"https://cloudplatform.googleblog.com/2018/05/Sharding-of-timestamp-ordered-data-in-Cloud-Spanner.html\" target\u003d\"_blank\"\u003eSharding of timestamp-ordered data in Cloud Spanner\u003c/a\u003e\u003c/p\u003e"]]]],[["Inside Google Cloud","What’s new with Google Cloud","Find our newest updates, announcements, resources, events, learning opportunities, and more in one handy location.",["https://storage.googleapis.com/gweb-cloudblog-publish/images/whats_new_2026_CfhxFWX.max-700x700.jpg","https://storage.googleapis.com/gweb-cloudblog-publish/images/whats_new_2026_CfhxFWX.max-400x400.jpg 324w, https://storage.googleapis.com/gweb-cloudblog-publish/images/whats_new_2026_CfhxFWX.max-700x700.jpg 648w"," 324px, 648px","https://storage.googleapis.com/gweb-cloudblog-publish/images/whats_new_2026_CfhxFWX.max-700x700.jpg"],null,39,null,"https://cloud.google.com/blog/topics/inside-google-cloud/whats-new-google-cloud",null,1,[["Google Cloud Content \u0026 Editorial "]],null,"42034"],["AI \u0026 Machine Learning","What Google Cloud announced in AI this month","Learn about the latest announcements, innovations, and guides when it comes to Google Cloud AI.",["https://storage.googleapis.com/gweb-cloudblog-publish/images/google_ai_this_month.max-700x700.jpg","https://storage.googleapis.com/gweb-cloudblog-publish/images/google_ai_this_month.max-400x400.jpg 324w, https://storage.googleapis.com/gweb-cloudblog-publish/images/google_ai_this_month.max-700x700.jpg 648w"," 324px, 648px","https://storage.googleapis.com/gweb-cloudblog-publish/images/google_ai_this_month.max-700x700.jpg"],null,27,null,"https://cloud.google.com/blog/products/ai-machine-learning/what-google-cloud-announced-in-ai-this-month",null,1,[["Andrea Morange","Editor, Google Cloud"]],null,"56017"],["AI \u0026 Machine Learning","What Google Cloud announced in AI this month - 2025","Learn about the latest announcements, innovations, and guides when it comes to Google Cloud AI.",["https://storage.googleapis.com/gweb-cloudblog-publish/images/monthly_ai_news.max-700x700.png","https://storage.googleapis.com/gweb-cloudblog-publish/images/monthly_ai_news.max-400x400.png 324w, https://storage.googleapis.com/gweb-cloudblog-publish/images/monthly_ai_news.max-700x700.png 648w"," 324px, 648px","https://storage.googleapis.com/gweb-cloudblog-publish/images/monthly_ai_news.max-700x700.png"],null,43,null,"https://cloud.google.com/blog/products/ai-machine-learning/what-google-cloud-announced-in-ai-this-month-2025",null,1,[["Andrea Morange","Editor, Google Cloud"]],null,"58236"],["Inside Google Cloud","What’s new with Google Cloud - 2025","Find our newest updates, announcements, resources, events, learning opportunities, and more in one handy location.",["https://storage.googleapis.com/gweb-cloudblog-publish/images/whts_new_2025_5V6FQkI.max-700x700.jpg","https://storage.googleapis.com/gweb-cloudblog-publish/images/whts_new_2025_5V6FQkI.max-400x400.jpg 324w, https://storage.googleapis.com/gweb-cloudblog-publish/images/whts_new_2025_5V6FQkI.max-700x700.jpg 648w"," 324px, 648px","https://storage.googleapis.com/gweb-cloudblog-publish/images/whts_new_2025_5V6FQkI.max-700x700.jpg"],null,39,null,"https://cloud.google.com/blog/topics/inside-google-cloud/whats-new-google-cloud-2025",null,1,[["Google Cloud Content \u0026 Editorial "]],null,"58202"]],null,"Google Cloud",null,[["Google Cloud","https://cloud.google.com/blog/products/gcp","gcp",[],["en"],"Products"],["Databases","https://cloud.google.com/blog/products/databases","databases",[],["en"],"Products"],["Solutions and How-to's","https://cloud.google.com/blog/topics/solutions-how-tos","solutions-how-tos",null,["en"],"Topics"],["Spanner","https://cloud.google.com/blog/products/spanner","spanner",[],["en"],"Products"]],null,null,13,null,36622], sideChannel: {}});</script><script id="wiz_jd" nonce="ukEud-BIIo14C235ZP9QwA">if (window['_wjdc']) {const wjd = {}; window['_wjdc'](wjd); delete window['_wjdc'];}</script><script aria-hidden="true" id="WIZ-footer" nonce="ukEud-BIIo14C235ZP9QwA">window.wiz_progress&&window.wiz_progress();window.stopScanForCss&&window.stopScanForCss(); ccTick('bl');</script></body></html><footer id="ZCHFDb"><footer class="nRhiJb-RWrDld nRhiJb-yePe5c QJnbF" jscontroller="NsSboe" track-metadata-module="footer"><h3 class="nRhiJb-VqCwd-L6cTce">Footer Links</h3><section class="nRhiJb-haF9Wb r2W5Od"><section class="nRhiJb-DX2B6"><div class="nRhiJb-j5y3u"><h4 class="nRhiJb-BkAck nRhiJb-BkAck-OWXEXe-TzA9Ye">Follow us</h4><ul class="nRhiJb-Qijihe c3Uqdd" role="list"><li class="nRhiJb-KKXgde"><a class="nRhiJb-ARYxNe" href="https://www.x.com/googlecloud" target="_blank" rel="noopener" track-name="x"track-type="social link"track-metadata-position="footer"track-metadata-eventdetail="www.x.com/googlecloud"track-metadata-module="footer"track-metadata-module_headline="follow us"><svg class="nRhiJb-Bz112c nRhiJb-Bz112c-OWXEXe-xgZe3c nRhiJb-Bz112c-OWXEXe-DX2B6" viewBox="0 0 24 24" role="presentation" aria-hidden="true"><path d="M13.9,10.5L21.1,2h-1.7l-6.3,7.4L8,2H2.2l7.6,11.1L2.2,22h1.7l6.7-7.8L16,22h5.8L13.9,10.5L13.9,10.5z M11.5,13.2l-0.8-1.1 L4.6,3.3h2.7l5,7.1l0.8,1.1l6.5,9.2h-2.7L11.5,13.2L11.5,13.2z"></path></svg></a></li><li class="nRhiJb-KKXgde"><a class="nRhiJb-ARYxNe" href="https://www.youtube.com/googlecloud" target="_blank" rel="noopener" track-name="youtube"track-type="social link"track-metadata-position="footer"track-metadata-eventdetail="www.youtube.com/googlecloud"track-metadata-module="footer"track-metadata-module_headline="follow us"><svg class="nRhiJb-Bz112c nRhiJb-Bz112c-OWXEXe-xgZe3c nRhiJb-Bz112c-OWXEXe-DX2B6" viewBox="0 0 24 24" role="presentation" aria-hidden="true"><path d="M23.74 7.1s-.23-1.65-.95-2.37c-.91-.96-1.93-.96-2.4-1.02C17.04 3.47 12 3.5 12 3.5s-5.02-.03-8.37.21c-.46.06-1.48.06-2.39 1.02C.52 5.45.28 7.1.28 7.1S.04 9.05 0 10.98V13c.04 1.94.28 3.87.28 3.87s.24 1.65.96 2.38c.91.95 2.1.92 2.64 1.02 1.88.18 7.91.22 8.12.22 0 0 5.05.01 8.4-.23.46-.06 1.48-.06 2.39-1.02.72-.72.96-2.37.96-2.37s.24-1.94.25-3.87v-2.02c-.02-1.93-.26-3.88-.26-3.88zM9.57 15.5V8.49L16 12.13 9.57 15.5z"></path></svg></a></li><li class="nRhiJb-KKXgde"><a class="nRhiJb-ARYxNe" href="https://www.linkedin.com/showcase/google-cloud" target="_blank" rel="noopener" track-name="linkedin"track-type="social link"track-metadata-position="footer"track-metadata-eventdetail="www.linkedin.com/showcase/google-cloud"track-metadata-module="footer"track-metadata-module_headline="follow us"><svg class="nRhiJb-Bz112c nRhiJb-Bz112c-OWXEXe-xgZe3c nRhiJb-Bz112c-OWXEXe-DX2B6" viewBox="0 0 24 24" role="presentation" aria-hidden="true"><path d="M20 2H4c-1.1 0-1.99.9-1.99 2L2 20c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zM8 19H5v-9h3v9zM6.5 8.31c-1 0-1.81-.81-1.81-1.81S5.5 4.69 6.5 4.69s1.81.81 1.81 1.81S7.5 8.31 6.5 8.31zM19 19h-3v-5.3c0-.83-.67-1.5-1.5-1.5s-1.5.67-1.5 1.5V19h-3v-9h3v1.2c.52-.84 1.59-1.4 2.5-1.4 1.93 0 3.5 1.57 3.5 3.5V19z"></path></svg></a></li><li class="nRhiJb-KKXgde"><a class="nRhiJb-ARYxNe" href="https://www.instagram.com/googlecloud/" target="_blank" rel="noopener" track-name="instagram"track-type="social link"track-metadata-position="footer"track-metadata-eventdetail="www.instagram.com/googlecloud/"track-metadata-module="footer"track-metadata-module_headline="follow us"><svg class="nRhiJb-Bz112c nRhiJb-Bz112c-OWXEXe-xgZe3c nRhiJb-Bz112c-OWXEXe-DX2B6" viewBox="0 0 24 24" role="presentation" aria-hidden="true"><path d="M12,0 C15.3,0 15.7,0 17,0 C18.3,0.1 19.1,0.3 19.9,0.6 C20.7,0.9 21.3,1.3 22,2 C22.7,2.7 23.1,3.4 23.3,4.2 C23.6,5 23.8,5.8 23.9,7.1 C24,8.3 24,8.7 24,12 C24,15.3 24,15.7 23.9,16.9 C23.8,18.2 23.6,19 23.3,19.8 C23,20.6 22.6,21.2 21.9,21.9 C21.3,22.6 20.6,23 19.8,23.3 C19,23.6 18.2,23.8 16.9,23.9 C15.7,24 15.3,24 12,24 C8.7,24 8.3,24 7,24 C5.7,23.9 4.9,23.7 4.1,23.4 C3.3,23.1 2.7,22.7 2,22 C1.3,21.3 0.9,20.6 0.7,19.8 C0.4,19 0.2,18.2 0.1,16.9 C0,15.7 0,15.3 0,12 C0,8.7 0,8.3 0.1,7.1 C0.1,5.8 0.3,4.9 0.6,4.1 C0.9,3.4 1.3,2.7 2,2 C2.7,1.3 3.4,0.9 4.1,0.6 C4.9,0.3 5.8,0.1 7.1,0.1 C8.3,0 8.7,0 12,0 Z M12,2.2 C8.8,2.2 8.4,2.2 7.2,2.2 C6,2.3 5.3,2.5 4.9,2.6 C4.4,2.9 4,3.1 3.5,3.5 C3.1,3.9 2.8,4.3 2.6,4.9 C2.5,5.3 2.3,6 2.3,7.2 C2.2,8.4 2.2,8.8 2.2,12 C2.2,15.2 2.2,15.5 2.3,16.8 C2.3,17.9 2.5,18.6 2.7,19 C2.9,19.6 3.2,20 3.6,20.4 C4,20.8 4.4,21.1 5,21.3 C5.4,21.5 6,21.6 7.2,21.7 C8.4,21.8 8.8,21.8 12,21.8 C15.2,21.8 15.5,21.8 16.8,21.7 C17.9,21.7 18.6,21.5 19,21.3 C19.6,21.1 20,20.8 20.4,20.4 C20.8,20 21.1,19.6 21.3,19 C21.5,18.6 21.6,18 21.7,16.8 C21.8,15.6 21.8,15.2 21.8,12 C21.8,8.8 21.8,8.5 21.7,7.2 C21.7,6.1 21.5,5.4 21.3,5 C21.1,4.4 20.8,4 20.4,3.6 C20,3.2 19.6,2.9 19,2.7 C18.6,2.5 18,2.4 16.8,2.3 C15.6,2.2 15.2,2.2 12,2.2 Z M12,5.8 C15.4,5.8 18.2,8.6 18.2,12 C18.2,15.4 15.4,18.2 12,18.2 C8.6,18.2 5.8,15.4 5.8,12 C5.8,8.6 8.6,5.8 12,5.8 Z M12,16 C14.2,16 16,14.2 16,12 C16,9.8 14.2,8 12,8 C9.8,8 8,9.8 8,12 C8,14.2 9.8,16 12,16 Z M18.4,7 C17.6268014,7 17,6.37319865 17,5.6 C17,4.82680135 17.6268014,4.2 18.4,4.2 C19.1731986,4.2 19.8,4.82680135 19.8,5.6 C19.8,6.37319865 19.1731986,7 18.4,7 Z"></path></svg></a></li><li class="nRhiJb-KKXgde"><a class="nRhiJb-ARYxNe" href="https://www.facebook.com/googlecloud/" target="_blank" rel="noopener" track-name="facebook"track-type="social link"track-metadata-position="footer"track-metadata-eventdetail="www.facebook.com/googlecloud/"track-metadata-module="footer"track-metadata-module_headline="follow us"><svg class="nRhiJb-Bz112c nRhiJb-Bz112c-OWXEXe-xgZe3c nRhiJb-Bz112c-OWXEXe-DX2B6" viewBox="0 0 24 24" role="presentation" aria-hidden="true"><path d="M20 2H4c-1.1 0-1.99.9-1.99 2L2 20c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zm-1 2v3h-2c-.55 0-1 .45-1 1v2h3v3h-3v7h-3v-7h-2v-3h2V7.5C13 5.57 14.57 4 16.5 4H19z"></path></svg></a></li></ul></div></section></section><section class="nRhiJb-hlZHHf rtKYfe"><div class="nRhiJb-vQnuyc UXgbsb"><a class="ZOs9zc" href="https://cloud.google.com/" title="Google Cloud" track-name="google"track-type="footer link"track-metadata-position="footer"track-metadata-eventdetail="cloud.google.com/"track-metadata-module="footer"><img src="https://www.gstatic.com/cgc/super_cloud_gradient.png" class="nRhiJb-vQnuyc-RJLb9c" alt="Cloud logo"/></a></div><ul class="nRhiJb-hlZHHf-PLDbbf nRhiJb-di8rgd-ZGNLv AXb5J" role="list"><li class="glue-footer__global-links-list-item"><a class="nRhiJb-Fx4vi " href="https://cloud.google.com/" track-name="google cloud"track-type="footer link"track-metadata-position="footer"track-metadata-eventdetail="cloud.google.com/"track-metadata-module="footer">Google Cloud</a></li><li class="glue-footer__global-links-list-item"><a class="nRhiJb-Fx4vi " href="https://cloud.google.com/products/" track-name="google cloud products"track-type="footer link"track-metadata-position="footer"track-metadata-eventdetail="cloud.google.com/products/"track-metadata-module="footer">Google Cloud Products</a></li><li class="glue-footer__global-links-list-item"><a class="nRhiJb-Fx4vi " href="https://myaccount.google.com/privacypolicy?hl=en-US" target="_blank" track-name="privacy"track-type="footer link"track-metadata-position="footer"track-metadata-eventdetail="myaccount.google.com/privacypolicy?hl=en-US"track-metadata-module="footer">Privacy</a></li><li class="glue-footer__global-links-list-item"><a class="nRhiJb-Fx4vi " href="https://myaccount.google.com/termsofservice?hl=en-US" target="_blank" track-name="terms"track-type="footer link"track-metadata-position="footer"track-metadata-eventdetail="myaccount.google.com/termsofservice?hl=en-US"track-metadata-module="footer">Terms</a></li><li aria-hidden="true" class="glue-footer__global-links-list-item"><a aria-hidden="true" role="button" tabindex="0" class="nRhiJb-Fx4vi glue-footer__link glue-cookie-notification-bar-control" href="#" target="_blank" track-name="cookies management controls"track-type="footer link"track-metadata-position="footer"track-metadata-eventdetail="#"track-metadata-module="footer">Cookies management controls</a></li></ul><ul class="nRhiJb-hlZHHf-PLDbbf nRhiJb-hlZHHf-PLDbbf-OWXEXe-hOedQd nRhiJb-di8rgd-ZGNLv qkxr1" role="list"><li class="glue-footer__global-links-list-item nRhiJb-hlZHHf-PLDbbf-rymPhb-ibnC6b-OWXEXe-hOedQd"><a class="nRhiJb-Fx4vi" href="https://support.google.com" target="_blank" track-name="help"track-type="footer link"track-metadata-position="footer"track-metadata-eventdetail="support.google.com"track-metadata-module="footer"><svg class="nRhiJb-Bz112c nRhiJb-Bz112c-OWXEXe-xgZe3c nRhiJb-Bz112c-OWXEXe-yePe5c-h9d3hd" viewBox="0 0 24 24" role="presentation" aria-hidden="true"><path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 17h-2v-2h2v2zm2.07-7.75l-.9.92C13.45 12.9 13 13.5 13 15h-2v-.5c0-1.1.45-2.1 1.17-2.83l1.24-1.26c.37-.36.59-.86.59-1.41 0-1.1-.9-2-2-2s-2 .9-2 2H8c0-2.21 1.79-4 4-4s4 1.79 4 4c0 .88-.36 1.68-.93 2.25z"></path></svg>Help</a></li><li class="glue-footer__global-links-list-item nRhiJb-hlZHHf-PLDbbf-rymPhb-ibnC6b-OWXEXe-hOedQd"><select jsaction="change:xU0iy" aria-label="Change language" class="nRhiJb-CL4aqd-j4gsHd"><option value="" selected disabled hidden>Language</option><option value="en" selected>English</option><option value="de">Deutsch</option><option value="fr">Français</option><option value="ko">한국어</option><option value="ja">日本語</option></select></li></ul></section></footer></footer> |