{"allowedRenditionsWidth":["320","480","640","768","960","1200","1440","1920"],"templateName":"quickstart-page-template","cssClassNames":"page basicpage summit-page","language":"en","title":"Performance","analyticsPageType":"quickstart-page-template","analyticsCategory":"general","analyticsSubCategory":"","excludeFromAnalytics":false,":hierarchyType":"page",":path":"/content/snowflake-site/global/en/developers/guides/well-architected-framework-performance","analyticsDebugMode":false,"coveoConfig":{"searchHub":"snowflake.com","organizationId":"snowflakecomputingproduction8neljofn","apiKey":"xx335921a6-2a0a-40f2-a167-e390b4766c3d","pipeline":"snowflake.com"},"isPasswordProtected":false,"analyticsEnabled":true,":type":"snowflake-site/components/structure/page","analyticsData":{"excludeFromAnalytics":false,"subCategory":"","pageType":"quickstart-page-template","templateName":"quickstart-page-template","siteName":"snowflake","pageUrl":"/content/snowflake-site/global/en/developers/guides/well-architected-framework-performance","language":"en","category":"general","pageName":"Performance","contentTags":["snowflake-site:taxonomy/solution-center/certification/well-architected-framework"]},"analyticsContentTags":["snowflake-site:taxonomy/solution-center/certification/well-architected-framework"],":mappedPath":"/en/developers/guides/well-architected-framework-performance/",":items":{"root":{"columnClassNames":{"markup_editor_1950346551":"aem-GridColumn aem-GridColumn--default--12","experiencefragment-banner":"aem-GridColumn aem-GridColumn--default--12","experiencefragment-header":"aem-GridColumn aem-GridColumn--default--12","responsivegrid":"aem-GridColumn aem-GridColumn--default--12","experiencefragment-footer":"aem-GridColumn aem-GridColumn--default--12","modal_container":"aem-GridColumn aem-GridColumn--default--12","markup_editor":"aem-GridColumn aem-GridColumn--default--12"},"gridClassNames":"aem-Grid aem-Grid--12 aem-Grid--default--12","columnCount":12,":items":{"experiencefragment-banner":{"id":"experiencefragment-90016e549a","localizedFragmentVariationPath":"/content/experience-fragments/snowflake-site/language-masters/en/site/pushdown-banner/master/jcr:content","configured":true,":type":"snowflake-site/components/experiencefragment",":items":{"root":{"columnClassNames":{"pushdown_banner_copy":"aem-GridColumn aem-GridColumn--default--12"},"gridClassNames":"aem-Grid aem-Grid--12 aem-Grid--default--12","layout":"RESPONSIVE_GRID","columnCount":12,"id":"container-966cfba16d",":type":"snowflake-site/components/container",":items":{"pushdown_banner_copy":{"id":"pushdown-banner-25189db2b8","contentHeadline":"Snowflake World Tour hits your city","contentDescription":"See how leading teams deploy agents at scale. Find a stop near you. Register free.","contentJustifyContent":"center","linkStyle":"text-white","linkCTA":{"id":"link-cta","heapButtonClasses":["pushdown_banner"],"showOutboundIcon":false,"buttonLink":{"valid":true,"attributes":{"target":"_blank"},"url":"/en/world-tour/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_INTERNAL",":type":"snowflake-site/components/button","text":"Register now"},":type":"snowflake-site/components/pushdown-banner","appliedCssClassNames":"snowflake-pushdown-banner-text-white snowflake-pushdown-banner-background-black"}},":itemsOrder":["pushdown_banner_copy"]},"image":{":type":"nt:unstructured"},"cq:metadata":{":type":"nt:unstructured"}},":itemsOrder":["root","image","cq:metadata"],"classNames":"aem-xf"},"experiencefragment-header":{"id":"experiencefragment-56dbbdc8ae","localizedFragmentVariationPath":"/content/experience-fragments/snowflake-site/language-masters/en/site/mega-nav-header/master/jcr:content","configured":true,":type":"snowflake-site/components/experiencefragment",":items":{"root":{"columnClassNames":{"mega_header":"aem-GridColumn aem-GridColumn--default--12","markup_editor":"aem-GridColumn aem-GridColumn--default--12"},"gridClassNames":"aem-Grid aem-Grid--12 aem-Grid--default--12","layout":"RESPONSIVE_GRID","columnCount":12,"id":"container-8011ec78be",":type":"snowflake-site/components/container",":items":{"markup_editor":{"id":"markup-editor-80e44c8aec","title":" ","cssContent":".footer-nav__link-group .snowflake-button-container,.subnav__item--button,.snowflake-card-v2-advanced-button .snowflake-button-container{justify-content:flex-start}.mega-nav__sign-in.snowflake-button-container{display:none}@media screen and (min-width:768px){.mega-nav__sign-in.snowflake-button-container{display:inline-block;font-family:'Texta',sans-serif;font-weight:800 !important}}@media screen and (min-width:1024px) and (max-width:1199px){.snowflake-mega-nav-header-buttons-container .snowflake-button-blue .snowflake-button-container{font-size:13px !important}.snowflake-language-navigation .language-icon{width:18px !important;height:18px !important;margin-right:4px !important}}.mega-nav__sign-in svg{display:none}.nav-item__platform-parent-why-sf.snowflake-mega-nav-nav-item\u003Ea:hover,.nav-item__platform-parent.snowflake-mega-nav-nav-item\u003Ea:hover{background-color:transparent !important}.nav-platform-sidebar .snowflake-mega-nav-nav-item:hover.blue-icon .snowflake-mega-nav-nav-item-icon__inner{background-color:var(--ui-01) !important}@media screen and (min-width:1024px){.snowflake-mega-nav-navigation-dropdown{overflow:hidden}.meganav-platform-features{padding-left:64px}.meganav-platform-features::before{content:'';transform:translateX(-64px);display:block;z-index:0;width:100%;height:100%;position:absolute;top:0;background:#f7f9fa}.nav-item--si.snowflake-mega-nav-nav-item\u003Ea:hover{background-color:transparent}.nav-item--si{border-bottom:1px solid #ccc;padding-bottom:16px;margin-bottom:8px}.nav-item__platform-parent{border-bottom:1px solid #ccc;margin-bottom:8px;padding-bottom:16px}.nav-item__platform-parent-why-sf .snowflake-mega-nav-nav-item-description::after{content:'What Snowflake can do for you \u003E';display:block;color:var(--ui-01);margin-top:16px}.nav-item__platform-parent .snowflake-mega-nav-nav-item-description::after{content:'View the platform \u003E';display:block;color:var(--ui-01);margin-top:16px}}@media screen and (min-width:1367px){.snowflake-mega-nav-nav-item-description{font-size:13px !important;line-height:20px !important}.snowflake-mega-nav-nav-item-title-wrapper\u003E.snowflake-mega-nav-nav-item-title{font-size:17px !important}.nav-item__platform-parent-why-sf .snowflake-mega-nav-nav-item-title,.nav-item__platform-parent .snowflake-mega-nav-nav-item-title{font-size:24px !important;line-height:32px !important;margin-bottom:8px !important}.nav-item__platform-parent-why-sf .snowflake-mega-nav-nav-item-description,.nav-item__platform-parent .snowflake-mega-nav-nav-item-description{font-size:14px !important;line-height:20px !important}}html.wf-texta-n9-loading .display-1-v2{font-size:48px!important;line-height:50px!important;letter-spacing:-.5px!important;font-family:sans-serif!important}html.wf-texta-n9-loading .heading-4-v2{font-size:18px!important;line-height:24px!important;font-family:sans-serif!important}@media screen and (min-width:768px){html.wf-texta-n9-loading .display-2-v2{font-size:48px!important;line-height:50px!important;font-family:sans-serif!important}html.wf-texta-n9-loading .display-1-v2{font-size:55.5px!important;line-height:54px!important;letter-spacing:-.5px!important;font-family:sans-serif!important}html.wf-lato-n4-loading .body-2,html.wf-lato-n4-loading .heading-5-v2,html.wf-lato-n4-loading .snowflake-card-v2-advanced-text .snowflake-text p{font-size:15.5px!important;font-family:sans-serif!important}html.wf-texta-n9-loading .heading-2,html.wf-texta-n9-loading .heading-2-v2{font-size:34px!important;line-height:38px!important;letter-spacing:-.75px!important;font-family:sans-serif!important}html.wf-texta-n8-loading .heading-6-v2.snowflake-mega-nav-navigation-title{font-size:13.5px!important;font-family:sans-serif!important}html.wf-texta-n8-loading .heading-4,html.wf-texta-n8-loading .snowflake-button-container,html.wf-texta-n8-loading .snowflake-button-regular .snowflake-button-container{font-size:13px!important;line-height:20px!important;letter-spacing:.25px!important;font-family:sans-serif!important}}@media screen and (min-width:1024px){html.wf-lato-n4-loading .snowflake-mega-nav-nav-item-description{font-size:11.5px!important;font-family:sans-serif!important}html.wf-lato-n4-loading .body-2,html.wf-lato-n4-loading .text-size-regular .snowflake-text li,html.wf-lato-n4-loading .text-size-regular .snowflake-text p,html.wf-lato-n4-loading .text-size-regular .snowflake-text span[data-testid=text-content],html.wf-lato-n4-loading .text-size-regular.cq-Editable-dom li,html.wf-lato-n4-loading .text-size-regular.cq-Editable-dom p,html.wf-lato-n4-loading .text-size-regular.cq-Editable-dom span[data-testid=text-content]{font-size:13.5px!important;font-family:sans-serif!important}html.wf-texta-n8-loading .snowflake-button-compact .snowflake-button-container{font-size:12px!important;letter-spacing:0!important;line-height:18px!important}}@media screen and (min-width:1367px){html.wf-lato-n4-loading .hp-hero__eyebrow a\u003Eb:first-child{font-size:11px!important;font-family:sans-serif!important}html.wf-texta-n8-loading .hp-hero__eyebrow a{font-size:13px!important;font-family:sans-serif!important}html.wf-texta-n9-loading .display-2-v2{font-size:61px!important;line-height:60px!important;font-family:sans-serif!important}html.wf-texta-n9-loading .display-1-v2{font-size:74.5px!important;line-height:74px!important;letter-spacing:-.75px!important;font-family:sans-serif!important}html.wf-texta-n9-loading .heading-2,html.wf-texta-n9-loading .heading-2-v2{font-size:41px!important;letter-spacing:-.75px!important;font-family:sans-serif!important}html.wf-texta-n9-loading .heading-3-v2{font-family:sans-serif!important;letter-spacing:-.75px!important;font-size:33.75px!important}html.wf-texta-n9-loading .heading-4-v2{font-size:19.5px!important;line-height:26px!important;font-family:sans-serif!important}html.wf-texta-n8-loading .heading-6-v2{font-size:12px!important;font-family:sans-serif!important}html.wf-texta-n8-loading .heading-6-v2.snowflake-mega-nav-navigation-title{font-size:14px!important;font-family:sans-serif!important}html.wf-lato-n4-loading .body-1,html.wf-lato-n4-loading .cq-Editable-dom[data-cq-data-path*=text] ol\u003Eli,html.wf-lato-n4-loading .snowflake-text li,html.wf-lato-n4-loading .snowflake-text p,html.wf-lato-n4-loading .text-size-large .snowflake-text li,html.wf-lato-n4-loading .text-size-large .snowflake-text p,html.wf-lato-n4-loading .text-size-large .snowflake-text span[data-testid=text-content],html.wf-lato-n4-loading .text-size-large.cq-Editable-dom li,html.wf-lato-n4-loading .text-size-large.cq-Editable-dom p,html.wf-lato-n4-loading .text-size-large.cq-Editable-dom span[data-testid=text-content],html.wf-lato-n4-loading.cq-Editable-dom[data-cq-data-path*=text]\u003Ep,html.wf-lato-n4-loading.cq-Editable-dom[data-cq-data-path*=text]\u003Eul\u003Eli{font-size:17.5px!important;font-family:sans-serif!important}html.wf-lato-n4-loading .body-2,html.wf-lato-n4-loading .text-size-regular .snowflake-text li,html.wf-lato-n4-loading .text-size-regular .snowflake-text p,html.wf-lato-n4-loading .text-size-regular .snowflake-text span[data-testid=text-content],html.wf-lato-n4-loading .text-size-regular.cq-Editable-dom li,html.wf-lato-n4-loading .text-size-regular.cq-Editable-dom p,html.wf-lato-n4-loading .text-size-regular.cq-Editable-dom span[data-testid=text-content],html.wf-texta-n8-loading .snowflake-button-link .snowflake-button-container,html.wf-texta-n8-loading .snowflake-button-link-back .snowflake-button-container{font-size:15.5px!important;font-family:sans-serif!important}html.wf-lato-n4-loading .body-3,html.wf-lato-n4-loading .text-size-small .snowflake-text li,html.wf-lato-n4-loading .text-size-small .snowflake-text p,html.wf-lato-n4-loading .text-size-small .snowflake-text span[data-testid=text-content],html.wf-lato-n4-loading .text-size-small.cq-Editable-dom li,html.wf-lato-n4-loading .text-size-small.cq-Editable-dom p,html.wf-lato-n4-loading .text-size-small.cq-Editable-dom span[data-testid=text-content]{font-size:13.5px!important;font-family:sans-serif!important}}#industryPlatformSection,.sc-hero{background-position:top left;background-size:20% auto}.bwalignc,.bwalignr{list-style-position:inside}.snowflake-text p sup{font-size:10px}#industryPlatformSection .industry-platform__row .snowflake-flexible-column-container-items,.button-group-pair\u003E.container\u003E.cmp-container\u003E.aem-container,.snowflake-hero-system-content-container{gap:16px}.agenda-item p,.button-group-pair\u003E.container\u003E.cmp-container\u003E.aem-container\u003Ediv,.partner-details p{margin:0!important}.button-group-pair\u003E.container\u003E.cmp-container\u003E.aem-container::after,.button-group-pair\u003E.container\u003E.cmp-container\u003E.aem-container::before,.hide-logo .snowflake-case-study-card-logo,.partner-page__powered-by-logo,.sc-hero div.code-toolbar\u003E.toolbar,.snowflake-card-v2-advanced.no-link .snowflake-card-v2-advanced-button,.snowflake-partner-hero-card-badge-container{display:none!important}.section--card-mobile-carousel .snowflake-flexible-column-container-items-with-carousel{max-width:100%!important}@media screen and (min-width:768px){.button-group-pair .snowflake-button-container.inline-button--desktop,.button-group-pair\u003E.container\u003E.cmp-container\u003E.aem-container\u003Ediv{width:auto!important;display:inline-block!important}.button-group-pair\u003E.container\u003E.cmp-container\u003E.aem-container{align-items:center;justify-content:flex-start!important}.button-group-pair.center\u003E.container\u003E.cmp-container\u003E.aem-container{justify-content:center!important}.section--card-mobile-carousel{margin-left:var(--tablet-portrait-margin,48px)!important;margin-right:var(--tablet-portrait-margin,48px);width:calc(100% - 96px)!important;width:calc(100% - var(--tablet-portrait-margin) * 2)!important}}@media screen and (min-width:1024px){.section--card-mobile-carousel{margin-left:var(--tablet-horizontal-margin,48px)!important;margin-right:var(--tablet-horizontal-margin,48px);width:calc(100% - 96px)!important;width:calc(100% - var(--tablet-horizontal-margin) * 2)!important}.snowflake-mega-nav-header-mobile-icon{display:none!important}}@media screen and (min-width:1367px){.section--card-mobile-carousel{margin-left:var(--desktop-margin,6.5%)!important;margin-right:var(--desktop-margin,6.5%);width:87%!important;width:calc(100% - var(--desktop-margin) * 2)!important}.logo-container{min-width:143px}.sc-hero__headline .heading-1-v2{font-size:60px}.snowflake-mega-nav-navigation-title{font-size:17px}.snowflake-mega-nav-dropdown-footer-wrapper .snowflake-title-v2 .snowflake-title-v2-line:first-child{font-size:16px!important;line-height:24px!important}}.hero--home{overflow:hidden;background-color:var(--ui-01);z-index:2}.hp-hero__subheadline{width:90%}.hero--home .snowflake-button-container{transition:.3s}.hero--home .snowflake-button-primary a:hover,.hero--home .snowflake-button-secondary a:hover,.hero--home .snowflake-button-white a:hover{transition:.3s;background-color:var(--ui-02)!important;color:var(--ui-05)!important}.hero--home .snowflake-button-secondary a:hover{border-color:var(--ui-05)!important}.hero--home .snowflake-button-primary a:hover,.hero--home .snowflake-button-white a:hover{border-color:var(--ui-02)!important}.bwalignc,.hp-hero__eyebrow{text-align:center}.hp-hero__eyebrow a{display:inline-flex;flex-direction:column;justify-content:center;cursor:pointer;padding:8px;border-radius:var(--spacing-01);gap:8px;align-items:center;background-color:#45aee3;color:var(--ui-03);font-family:Texta,sans-serif;font-weight:800;font-size:16px;line-height:22px;transition:background-color .3s}.hp-hero__eyebrow a:hover{background-color:#7fc6ea;text-decoration:none;transition:background-color .3s}.hp-hero__eyebrow a\u003Eb:first-child{text-transform:uppercase;white-space:nowrap;display:inline-block;background-color:var(--ui-02);color:var(--ui-05);font-size:12px!important;line-height:16px!important;font-family:Lato,sans-serif;font-weight:500!important;padding:3px 6px;border-radius:2px;letter-spacing:1px}@media screen and (min-width:767px){.hp-hero__eyebrow{text-align:left}.hp-hero__eyebrow a{flex-direction:row;text-align:left}}.hero--home__inner .offset-video,.hero--home__inner .snowflake-experience-fragment,.offset-video__bg-image{max-height:200px;overflow:hidden}.hero--home__inner .offset-video .wistia-responsive-padding{padding-top:100%}.hero--home__inner .snowflake-experience-fragment,.offset-video__bg-image{position:absolute!important;top:0;left:0;width:100%}.offset-video__bg-image{z-index:-1}@media screen and (min-width:768px){.hero--home__inner .snowflake-experience-fragment,.offset-video,.offset-video__bg-image{position:absolute!important;max-height:none;top:0;left:0;width:250%;padding-bottom:250%;transform:translate(0,-50%);height:0}.workloads_7.unistore{max-width:317px}}.promo-banner--homepage{z-index:2}.homepage-banner-offset-container::after{content:\"\";display:block;position:absolute;bottom:0;z-index:1;left:0;width:100%;height:80%;background:#fff}.section--quicklinks .snowflake-button-full-width a{padding-left:24px!important;padding-right:24px!important;transition:box-shadow .25s cubic-bezier(.4,0,.2,1);text-align:left;display:flex;justify-content:center;align-items:center}.section--quicklinks .snowflake-button-full-width a:hover{box-shadow:0 16px 16px 0 rgb(0 0 0 / .16);transition:box-shadow .25s cubic-bezier(.4,0,.2,1)}.section--quicklinks .snowflake-button-container:focus-visible a::before,.section--quicklinks .snowflake-button-full-width a::before{content:\"\";width:23px;height:23px;flex-shrink:0;margin-right:12px;display:inline-block;background-size:cover;background-repeat:no-repeat;background-position:center}#industryPartnerSlider .snowflake-navigation-icon.swiper-button-disabled,#partnerResources .section--resource-hub a svg,.button-tabs span.snowflake-tabs-navigation-item:after,.customer-card--hide-cta .snowflake-case-study-card-button,.dot-tabs span.snowflake-tabs-navigation-item::after,.partner-sidebar__mobile-expand,html:not(.aem-AuthorLayer-initial):not(.aem-AuthorLayer-Edit) .tab-content:not(.is-active){display:none}.section--quicklinks .snowflake-button-full-width a.pricing::before{background-image:url(https://www.snowflake.com/content/dam/snowflake-site/general/icons/decorative-icons/pricing-icon.svg)}.section--quicklinks .snowflake-button-full-width a.snowflake_on_snowflake::before{background-image:url(https://www.snowflake.com/content/dam/snowflake-site/general/icons/navigation/nav-icon_snowflake-bug.svg)}.section--quicklinks .snowflake-button-full-width a.virtual_hands_on_labs::before{background-image:url(https://www.snowflake.com/content/dam/snowflake-site/general/icons/navigation/nav-icon__training.svg)}.section--quicklinks .snowflake-button-full-width a.weekly_demo::before{background-image:url(https://www.snowflake.com/content/dam/snowflake-site/general/icons/navigation/nav-icon__webinars.svg)}@media screen and (min-width:1024px){.hero--home__inner .snowflake-experience-fragment,.offset-video,.offset-video__bg-image{left:-50%}.section--quicklinks .snowflake-flexible-column-container-items{gap:24px}.snowflake-quote-item-inner{padding:32px 24px 24px!important}}#communitiesOuter_overflowBottomGray::after{max-height:100px}#caseStudyOuter_overflowBottomMidBlue::after{max-height:180px}#caseStudyInner .snowflake-case-study-card .snowflake-wistia-video{border-radius:0!important}#caseStudyInner .snowflake-case-study-card{box-shadow:none!important;border-radius:0}#caseStudyInner{max-width:1200px;margin:0 auto;box-shadow:rgb(152 162 179 / .1) 0 10px 20px 0,rgb(152 162 179 / .25) 0 2px 6px 0;border-radius:8px;overflow:hidden;position:relative;z-index:1}.case-study__logo-bar\u003E.snowflake-flexible-column-container-items{background:#f7f9fa;padding:32px 16px 40px}.case-study__logo-bar .cmp-image__image{width:90%;margin:0 auto;max-width:240px}.hp-platform__text-group\u003E.container\u003E.cmp-container\u003E.aem-container\u003Ediv:not(:first-child),.sc-sidebar__group .snowflake-button-link{margin-top:8px}.workloads_7.unistore{margin-left:auto;margin-right:auto}#homepageFootnotesInner .snowflake-simple-stat-disclaimer .snowflake-text p{color:#fff!important}.snowflake-simple-stat-disclaimer .snowflake-text p\u003Ea{border-bottom:1px solid var(--ui-03);color:var(--text-03)}.snowflake-card-v2-advanced{color:inherit}#workloadCardGridOuter .snowflake-card-v2-base-front{gap:0}.video-modal.snowflake-modal-window-open-inner{background-color:#fff0;padding:8px;border:none}.snowflake-container-arrow-dotted-faded .snowflake-container-arrow-dotted-faded-image{width:40%!important;max-width:420px;top:4%!important}.list--blue-bullets ul{margin:0!important;padding:0!important;list-style-type:none}.list--blue-bullets li{margin:0;padding:0 0 0 32px;position:relative}.list--blue-bullets li::before{content:\"\";display:block;border-radius:100%;background:#29b5e8;width:18px;height:18px;position:absolute;top:4px;left:0;border:5px solid #e5f2f7;box-sizing:border-box}.list--blue-bullets li:not(:last-child){margin-bottom:1rem}.logo-tabs .snowflake-navigation-container,.snowflake-simple-stat-content:empty,.summit-speaker-card .snowflake-card-v2-advanced-text{margin-bottom:0}#techResourceInner,#techResourceOuter,div.overflow-bottom--blue,div.overflow-bottom--gray,div.overflow-bottom--mid-blue,div.overflow-bottom--white,div.overflow-top--blue,div.overflow-top--gray,div.overflow-top--mid-blue,div.overflow-top--white,div[id$=overflowBottomGray],div[id$=overflowBottomMidBlue],div[id$=overflowTopBlue],div[id$=overflowTopGray]{position:relative}div.overflow-bottom--blue::after,div.overflow-bottom--gray::after,div.overflow-bottom--mid-blue::after,div.overflow-bottom--white::after,div.overflow-top--blue::after,div.overflow-top--gray::after,div.overflow-top--mid-blue::after,div.overflow-top--white::after,div[id$=overflowBottomGray]::after,div[id$=overflowBottomMidBlue]::after,div[id$=overflowBottomWhite]::after,div[id$=overflowTopBlue]::after,div[id$=overflowTopGray]::after,div[id$=overflowTopWhite]::after{content:\"\";display:block;position:absolute;left:0;width:100%;height:40%}div.overflow-top--blue::after,div.overflow-top--gray::after,div.overflow-top--mid-blue::after,div.overflow-top--white::after,div[id$=overflowTopBlue]::after,div[id$=overflowTopGray]::after,div[id$=overflowTopWhite]::after{top:0}div.overflow-bottom--blue::after,div.overflow-bottom--gray::after,div.overflow-bottom--mid-blue::after,div.overflow-bottom--white::after,div[id$=overflowBottomGray]::after,div[id$=overflowBottomMidBlue]::after,div[id$=overflowBottomWhite]::after{bottom:0}div.overflow-bottom--white::after,div.overflow-top--white::after,div[id$=overflowBottomWhite]::after,div[id$=overflowTopWhite]::after{background:#fff!important}div.overflow-bottom--gray::after,div.overflow-top--gray::after,div[id$=overflowBottomGray]::after,div[id$=overflowTopGray]::after{background:#f6f9fa!important}div.overflow-bottom--mid-blue::after,div.overflow-top--mid-blue::after,div[id$=overflowBottomMidBlue]::after,div[id$=overflowTopMidBlue]::after{background:#11567f!important}div.overflow-bottom--blue::after,div.overflow-top--blue::after,div[id$=overflowBottomBlue]::after,div[id$=overflowTopBlue]::after{background:#259edc!important}.snowflake-premium-content-banner.promo-banner--no-shadow{box-shadow:none!important}#industryPartnerSlider .cmp-image__image,#industryPartnerSlider .section--partner-tabs .snowflake-image-container .cmp-image__image,#partnerSidebar,.has-shadow .cmp-image__image{box-shadow:0 10px 20px 0 rgb(152 162 179 / .1),0 2px 6px 0 rgb(152 162 179 / .25)}.content-chip--has-desc{align-items:flex-start;padding:20px!important}.content-chip--has-desc .snowflake-content-chip-image{max-width:100px}.content-chip--has-desc .snowflake-content-chip-image__image{aspect-ratio:1}.content-chip--has-desc .snowflake-title-v2-line:first-child{font-size:18px!important}.content-chip--has-desc .snowflake-title-v2-line:nth-child(2){color:#000!important;font-weight:500!important;font-size:16px!important;line-height:22px!important;margin-top:2px!important}.content-chip--has-desc .snowflake-content-chip-button{margin-top:6px!important;font-size:18px!important;display:none}.square-image .snowflake-content-chip-image{aspect-ratio:1;max-width:120px}.section--logo-bar.smaller-logos .snowflake-image-container .cmp-image__image{max-width:200px;margin:0 auto}.snowflake-card-v2-advanced-tag,.snowflake-content-chip-tag{padding:3px 6px!important}.sc-overview__webinar-promo-banner .snowflake-content-chip-button,.snowflake-card-v2-advanced-title:first-child,.summit-pricing-block__aside ul{margin-top:0}.dot-tabs .snowflake-navigation-container .snowflake-tabs-navigation-item{width:40px;height:40px;display:flex;justify-content:center;align-items:center;margin:0!important}.dot-tabs .snowflake-navigation-container .snowflake-tabs-navigation-item p{width:12px;height:12px;background:var(--ui-12);border-radius:100%}.dot-tabs .snowflake-navigation-container .snowflake-tabs-navigation-item p,.logo-tabs .snowflake-navigation-container .snowflake-tabs-navigation-item p{font-size:0!important}.dot-tabs .snowflake-navigation-container .snowflake-tabs-navigation-item.active p{background:var(--ui-01)}.button-tabs .snowflake-navigation-container .swiper-wrapper{padding:8px 0}.button-tabs .snowflake-navigation-container .swiper-slide{margin:0 6px}.button-tabs .snowflake-navigation-container .snowflake-tabs-navigation-item{padding:8px 24px;background-color:#f6f9fa;border-radius:48px;margin:0}.button-tabs .snowflake-navigation-container .snowflake-tabs-navigation-item p{text-transform:uppercase;font-family:Texta,sans-serif;font-weight:700}.button-tabs .border-top{border-top:1px solid #ccc}.button-tabs .snowflake-navigation-container .snowflake-tabs-navigation-item.active{background-color:var(--ui-01);box-shadow:0 2px 6px 0 rgb(152 162 179 / .25),0 10px 20px 0 rgb(152 162 179 / .1)}.button-tabs .snowflake-navigation-container .snowflake-tabs-navigation-item.active p{color:#fff}.button-tabs.has-icons .snowflake-navigation-container .snowflake-tabs-navigation-item p::before{content:\"\";display:inline-block;width:20px;height:20px;background-size:contain;background-repeat:no-repeat;background-position:center center;margin-right:12px;vertical-align:middle;margin-top:-3px}.logo-tabs .snowflake-navigation-container .snowflake-tabs-navigation-item{width:220px;padding-bottom:50%;height:0;margin:0 8px!important;background-size:cover;background-repeat:no-repeat;opacity:.5;transition:opacity .3s}.logo-tabs .snowflake-navigation-container .snowflake-tabs-navigation-item:hover{opacity:.75;transition:opacity .3s}.logo-tabs .snowflake-navigation-container .snowflake-tabs-navigation-item.active{opacity:1;transition:opacity .3s}.dot-tabs .aem-container.cmp-tabs,.logo-tabs .aem-container.cmp-tabs{display:flex;flex-direction:column-reverse}.snowflake-icon.is-center{margin:0 auto;display:block}#industryPartnerSlider .snowflake-flexible-column-container-items,#partnerLogoSquare .snowflake-flexible-column-container-items{gap:24px}#techResourceOuter::after{content:\"\";display:block;position:absolute;top:0;left:0;width:100%;height:40%;background:#f6f9fa}#techResourceInner{z-index:1}.partner-tier-tag h6{display:inline-block!important;padding:2px 6px;border-radius:2px;color:#666}.partner-tier-tag.registered h6{background-color:#f6f9fa}.partner-tier-tag.elite h6{background-color:#11567f;color:#fff}.partner-tier-tag.premier h6{background-color:#b14c77;color:#fff}.partner-tier-tag.select h6{background-color:#5094a0;color:#fff}.partner-details\u003Espan{display:flex;gap:24px}.partner-details a{color:inherit!important;font-weight:400!important}.partner-details p::before{content:\"\";display:inline-block;vertical-align:middle;width:16px;height:16px;background-repeat:no-repeat;background-position:center;transform:translateY(-1px);background-size:auto 90%;margin-right:6px}.partner-details__location::before{background-image:url(\"data:image/svg+xml,%3Csvg width='13' height='18' viewBox='0 0 13 18' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M6.25 17.7531C6.4375 17.7531 6.6 17.6844 6.7375 17.5531C6.875 17.4219 6.95 17.2531 6.95 17.0531C6.95 16.8531 7.075 16.4281 7.3 15.7969C7.5875 15.0281 7.925 14.3156 8.30625 13.6406C8.8 12.7781 9.3125 12.1031 9.85 11.6094C10.75 10.7969 11.4125 9.96563 11.85 9.12188C12.2875 8.27813 12.5063 7.40313 12.5063 6.49063C12.5063 5.36563 12.2187 4.31563 11.6437 3.33438C11.0937 2.40313 10.3438 1.65938 9.4 1.10938C8.43125 .534376 7.375 .246876 6.24375 .246876C5.1125 .246876 4.06875 .534376 3.0875 1.10938C2.15625 1.65938 1.4125 2.40313 .862498 3.33438C.287498 4.31563 0 5.36563 0 6.49063C0 7.47188 .262499 8.42813 .787499 9.35938C1.14375 10.0031 1.65625 10.6656 2.3125 11.3344C2.75625 11.8031 3.24375 12.4781 3.78125 13.3656C4.225 14.0969 4.63125 14.8594 5 15.6656C5.35 16.3844 5.53125 16.8531 5.55625 17.0656C5.55625 17.2594 5.625 17.4156 5.7625 17.5531C5.9 17.6844 6.0625 17.7531 6.25 17.7531ZM6.16875 14.9156C5.775 14.0656 5.325 13.2469 4.825 12.4594C4.275 11.5594 3.7625 10.8719 3.28125 10.3969C2.625 9.71563 2.1375 9.05938 1.825 8.43438C1.5125 7.80313 1.35625 7.16563 1.35625 6.50313C1.35625 5.61563 1.575 4.80313 2.0125 4.05313C2.45 3.30313 3.04375 2.71563 3.7875 2.27813C4.5375 1.84063 5.35 1.62188 6.2375 1.62188C7.125 1.62188 7.9375 1.84063 8.6875 2.27813C9.4375 2.71563 10.0312 3.30313 10.475 4.04688C10.9187 4.80313 11.1375 5.62188 11.1375 6.50313C11.1375 7.90313 10.3937 9.26563 8.9125 10.5969C8.35 11.1094 7.8125 11.7906 7.3 12.6406C6.88125 13.3344 6.50625 14.0969 6.16875 14.9219V14.9156ZM6.26875 8.36563C6.65625 8.36563 7.01875 8.26563 7.35625 8.07188C7.69375 7.87813 7.95625 7.60938 8.14375 7.28438C8.3375 6.95313 8.43125 6.59063 8.43125 6.19688C8.43125 5.80313 8.33125 5.43438 8.1375 5.10313C7.9375 4.76563 7.675 4.50313 7.3375 4.31563C7 4.12813 6.6375 4.02813 6.24375 4.02813C5.85 4.02813 5.4875 4.12813 5.15625 4.32188C4.825 4.52188 4.56875 4.78438 4.375 5.12188C4.18125 5.45938 4.0875 5.82188 4.0875 6.20938C4.0875 6.59688 4.1875 6.95938 4.38125 7.29688C4.58125 7.63438 4.84375 7.89688 5.18125 8.08438C5.51875 8.27813 5.88125 8.37188 6.26875 8.37188V8.36563ZM6.24375 7.50313C5.8875 7.50313 5.575 7.37188 5.31875 7.11563C5.0625 6.85938 4.93125 6.55313 4.93125 6.19063C4.93125 5.82813 5.0625 5.52188 5.31875 5.26563C5.575 5.00938 5.88125 4.87813 6.24375 4.87813C6.60625 4.87813 6.9125 5.00938 7.16875 5.26563C7.425 5.52188 7.55625 5.82813 7.55625 6.19063C7.55625 6.55313 7.425 6.85938 7.16875 7.11563C6.9125 7.37188 6.60625 7.50313 6.24375 7.50313Z' fill='%2329B5E8'/%3E%3C/svg%3E%0A\")}.partner-details__website::before{background-image:url(\"data:image/svg+xml,%3Csvg width='18' height='16' viewBox='0 0 18 16' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M2.61587 2.96889C2.61587 2.75109 2.79633 2.57062 3.01413 2.57062C3.23192 2.57062 3.41238 2.75109 3.41238 2.96889C3.41238 3.18669 3.23192 3.36716 3.01413 3.36716C2.79633 3.36716 2.61587 3.18669 2.61587 2.96889ZM4.21512 2.96889C4.21512 2.75109 4.39558 2.57062 4.61338 2.57062C4.83117 2.57062 5.01163 2.75109 5.01163 2.96889C5.01163 3.18669 4.83117 3.36716 4.61338 3.36716C4.39558 3.36716 4.21512 3.18669 4.21512 2.96889ZM5.81438 2.96889C5.81438 2.75109 5.99484 2.57062 6.21264 2.57062C6.43043 2.57062 6.61089 2.75109 6.61089 2.96889C6.61089 3.18669 6.43043 3.36716 6.21264 3.36716C5.99484 3.36716 5.81438 3.18669 5.81438 2.96889ZM17.2518 .697559H1.19085C.811258 .697559 .506348 1.0025 .506348 1.38209V14.6179C.506348 14.9975 .811258 15.3024 1.19085 15.3024H17.2518C17.6314 15.3024 17.9363 14.9975 17.9363 14.6179V1.38209C17.9363 1.0025 17.6314 .697559 17.2518 .697559ZM16.5673 2.06035V3.90853H1.86914V2.06035H16.5673ZM1.86914 13.9334V4.78593H16.5673V13.9334H1.86914Z' fill='%2329B5E8'/%3E%3C/svg%3E%0A\")}#partnerSidebar{border-radius:4px;background-color:#fff;padding:24px 24px 32px;border-bottom:6px solid #29b5e8}#partnerSidebar h5,.newsletter-disclaimer p{font-size:14px!important}#partnerSidebar ul{margin-top:0;list-style-type:none;padding:0;display:flex;flex-wrap:wrap;gap:8px}#partnerSidebar li{border:1px solid;border-radius:2px;padding:0 4px!important;font-size:11px!important;letter-spacing:.25px;text-transform:uppercase}div.snowflake-partner-hero-card{width:100%;margin:0}.partner-details__logo{max-width:380px;margin:0 auto}@media screen and (max-width:767px){.left-alignment .hp-hero__subheadline{margin-left:auto;margin-right:auto}.left-alignment .hp-hero__headline .snowflake-title-v2-line,.left-alignment .hp-hero__subheadline .snowflake-title-v2-line{text-align:center}.hero--home__inner .snowflake-flexible-column-container-items-top-padding-large{padding-top:var(--spacing-02)}.section--logo-bar\u003E.snowflake-flexible-column-container-items{display:flex;flex-wrap:wrap;flex-direction:row;justify-content:center;gap:8px}.section--logo-bar\u003E.snowflake-flexible-column-container-items\u003Ediv{width:calc(33.33% - 8px)}.partner-sidebar__mobile-expand{display:inline-block;color:#249edc;border-color:#249edc!important}#partnerSidebar li:nth-child(n+6),.summit-nav__links .snowflake-button-tertiary{display:none}.sc-body__sidebar{background-color:#f6f9fa;padding:24px}.sc-body__content{padding:0 24px 24px}.summit-speaker-card .snowflake-card-v2-advanced-content{padding:24px}}#partnerResources h6,.snowflake-tabs-navigation-item p.body-1{font-size:16px!important}#partnerResources .section--resource-hub{padding:0 16px}#partnerResources .section--resource-hub a,.bwalignl{text-align:left}@media screen and (max-width:1023px){.hero--workload .snowflake-hero-system-media-container{width:100%}}.section--timely-content .snowflake-content-chip,.snowflake-mega-nav-dropdown-footer-wrapper{align-items:center}.section--timely-content .snowflake-content-chip-image{max-width:94px}.section--timely-content .snowflake-content-chip-image__inner{line-height:0}.section--timely-content .snowflake-content-chip-image__image{aspect-ratio:1;height:auto}.section--workload-overview .workload-overview__headline{max-width:280px;margin:0 auto}#industryPartnerSlider .swiper-slide{margin-top:0!important;padding:0 12px}#industryPartnerSlider .snowflake-tabs-navigation-item{margin-left:0!important;margin-right:0!important}#industryPartnerSlider .snowflake-premium-content-banner-background-grad-white .snowflake-premium-content-banner{box-shadow:none}#industryPartnerSlider .logo-slider__slide .aem-container{display:flex;padding:0 8px!important;flex-wrap:wrap;gap:16px!important;justify-content:center}#industryPartnerSlider .logo-slider__slide .aem-container\u003Ediv{width:48%;max-width:200px}#useCaseTabs{padding-top:24px;padding-bottom:24px;padding-right:24px}#useCaseTabs .tab-content.is-active{display:block}#useCaseTabs .vert-tab{border-bottom:1px solid #a0bbcc;padding-bottom:16px}#useCaseTabs .vert-tab p{display:inline-block}#useCaseTabs .vert-tab p:hover{cursor:pointer}#useCaseTabs .vert-tab p,#useCaseTabs .vert-tab.is-active p.not-active{color:#249edc}#useCaseTabs .vert-tab p.is-active,#useCaseTabs .vert-tab.is-active p{color:#000}#industryPlatformSection{background-image:url(/adobe/dynamicmedia/deliver/dm-aid--db074ad5-7122-4c51-87a3-76c3aa466182/double-arrow-bg%403x.png);background-repeat:no-repeat}.snowflake-text p.featured-quote__source{font-weight:900!important;text-transform:uppercase;font-size:16px!important;margin-top:2rem!important}.snowflake-text p.featured-quote__title{margin-top:0!important;font-size:16px!important}.snowflake-case-study-card-logo img{width:auto!important;height:100px!important;transform:translateX(-15%)}.snowflake-quote-item-quote-text{font-weight:600!important}#customerStoryStatsInner\u003E.container\u003E.cmp-container\u003E.aem-container{display:flex;flex-direction:row}#customerStoryStat1,#customerStoryStat2{max-width:240px}#storyHighlights{border-radius:4px;padding:1rem}.sc-overview__webinar-promo-banner .snowflake-content-chip-content .snowflake-title-v2-line,.summit-pricing-block__tile .black-blue-text-color .snowflake-title-v2-line{color:#000!important}.snowflake-youtube-embedded-wrapper{border-radius:var(--small-border-radius)}#arcticNavItem::before,#offset::before,#open-source::before{color:var(--text-05);font-family:Texta,sans-serif!important}#offset,.sc-architecture-caption{margin-top:16px}.hero--press .snowflake-title-v2-line{text-transform:none!important}@media screen and (min-width:768px){.subpage-timely-content__inner\u003E.snowflake-flexible-column-container-items{box-shadow:0 10px 20px 0 rgb(152 162 179 / .1),0 2px 6px 0 rgb(152 162 179 / .25);padding:var(--spacing-04);border-radius:4px;overflow:hidden}#partnerLogoSquare{padding:0 0 0 48px}.hero--workload .snowflake-container{max-width:1440px;margin:0 auto!important;align-items:center}#industryPartnerSlider.snowflake-flexible-column-container-2-column-40-60\u003E.snowflake-flexible-column-container-items{grid-template-columns:minmax(40%,4fr) minmax(0,6fr)}#industryPartnerSlider .swiper-slide{padding:0 24px}.sc-body{padding:48px}.sc-body\u003E.snowflake-flexible-column-container-items{grid-template-columns:7fr 3fr;gap:124px}}.snowflake-button-container.has-icon{display:inline-flex;justify-content:center;align-items:center;text-align:left}.snowflake-button-container.has-icon::before{content:\"\";display:inline-block;width:20px;height:20px;margin-right:12px;background-size:contain;background-repeat:no-repeat;background-position:center}.snowflake-button-container.is-video::before{background-image:url(\"data:image/svg+xml,%3Csvg width='18' height='18' viewBox='0 0 18 18' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M9 1.28663C13.2523 1.28663 16.7134 4.74768 16.7134 9C16.7134 13.2523 13.2523 16.7134 9 16.7134C4.74768 16.7198 1.28663 13.2588 1.28663 9C1.28663 4.74124 4.74768 1.28663 9 1.28663ZM9 0C4.0336 0 0 4.0336 0 9C0 13.9664 4.0336 18 9 18C13.9728 18 18 13.9664 18 9C18 4.0336 13.9728 0 9 0Z' fill='white'/%3E%3Cpath d='M7.75106 6.18211C7.42941 6.16925 7.16565 6.42658 7.16565 6.74823V11.2772C7.16565 11.7082 7.65457 11.9848 8.02126 11.7597L11.7975 9.4952C12.1578 9.27647 12.1578 8.74252 11.7975 8.52379L8.02126 6.25931C7.93763 6.21428 7.84756 6.18211 7.75106 6.18211Z' fill='white'/%3E%3C/svg%3E%0A\")}.snowflake-button-container.is-github::before{background-image:url(\"data:image/svg+xml,%3Csvg width='20' height='21' viewBox='0 0 20 21' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M10 .651794C4.475 .651794 0 5.12679 0 10.6518C0 15.0768 2.8625 18.8143 6.8375 20.1393C7.3375 20.2268 7.525 19.9268 7.525 19.6643C7.525 19.4268 7.5125 18.6393 7.5125 17.8018C5 18.2643 4.35 17.1893 4.15 16.6268C4.0375 16.3393 3.55 15.4518 3.125 15.2143C2.775 15.0268 2.275 14.5643 3.1125 14.5518C3.9 14.5393 4.4625 15.2768 4.65 15.5768C5.55 17.0893 6.9875 16.6643 7.5625 16.4018C7.65 15.7518 7.9125 15.3143 8.2 15.0643C5.975 14.8143 3.65 13.9518 3.65 10.1268C3.65 9.03929 4.0375 8.13929 4.675 7.43929C4.575 7.18929 4.225 6.16429 4.775 4.78929C4.775 4.78929 5.6125 4.52679 7.525 5.81429C8.325 5.58929 9.175 5.47679 10.025 5.47679C10.875 5.47679 11.725 5.58929 12.525 5.81429C14.4375 4.51429 15.275 4.78929 15.275 4.78929C15.825 6.16429 15.475 7.18929 15.375 7.43929C16.0125 8.13929 16.4 9.02679 16.4 10.1268C16.4 13.9643 14.0625 14.8143 11.8375 15.0643C12.2 15.3768 12.5125 15.9768 12.5125 16.9143C12.5125 18.2518 12.5 19.3268 12.5 19.6643C12.5 19.9268 12.6875 20.2393 13.1875 20.1393C17.1375 18.8143 20 15.0643 20 10.6518C20 5.12679 15.525 .651794 10 .651794Z' fill='%23249EDC'/%3E%3C/svg%3E%0A\")}.snowflake-button-container.is-quickstart::before{background-image:url(\"data:image/svg+xml,%3Csvg width='15' height='21' viewBox='0 0 15 21' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M13.8489 2.79368H11.6439V2.38493C11.6439 1.71368 11.1451 .967427 10.4251 .967427H8.94762C8.80887 .359927 8.37387 .299927 7.89762 .299927H7.23012C6.85512 .299927 6.26637 .299927 6.08637 .967427H4.68387C3.94887 .967427 3.35637 1.74368 3.35637 2.38493V2.79368H1.15137C.738867 2.79368 .401367 3.13118 .401367 3.54368V20.2537C.401367 20.6662 .738867 21.0037 1.15137 21.0037H13.8489C14.2614 21.0037 14.5989 20.6662 14.5989 20.2537V3.54368C14.5989 3.13118 14.2614 2.79368 13.8489 2.79368ZM4.29387 2.38493C4.29387 2.18243 4.54137 1.90493 4.68387 1.90493H6.50262C6.76137 1.90493 6.97137 1.69493 6.97137 1.43618C6.97137 1.33868 6.97887 1.27868 6.98637 1.24118C7.05012 1.23368 7.15512 1.23368 7.23387 1.23368H7.90137C7.95012 1.23368 8.00637 1.23368 8.05137 1.23368C8.05512 1.27868 8.05887 1.34243 8.05887 1.43243C8.05887 1.69118 8.26887 1.90118 8.52762 1.90118H10.4289C10.5301 1.90118 10.7101 2.14493 10.7101 2.38118V2.78993H4.29762V2.38118L4.29387 2.38493ZM13.0989 19.4999H1.90137V4.29368H13.0989V19.5037V19.4999Z' fill='%23249EDC'/%3E%3Cpath d='M3.82512 16.0424H11.1751C11.4339 16.0424 11.6439 15.8324 11.6439 15.5736V6.88486C11.6439 6.62611 11.4339 6.41611 11.1751 6.41611H3.82512C3.56637 6.41611 3.35637 6.62611 3.35637 6.88486V15.5736C3.35637 15.8324 3.56637 16.0424 3.82512 16.0424ZM4.29387 15.1049V13.3686H10.7064V15.1049H4.29387ZM10.7101 7.35361V12.4311H4.29762V7.35361H10.7101Z' fill='%23249EDC'/%3E%3Cpath d='M6.16512 9.35989H8.83887C9.09762 9.35989 9.30762 9.14989 9.30762 8.89114C9.30762 8.63239 9.09762 8.42239 8.83887 8.42239H6.16512C5.90637 8.42239 5.69637 8.63239 5.69637 8.89114C5.69637 9.14989 5.90637 9.35989 6.16512 9.35989Z' fill='%23249EDC'/%3E%3Cpath d='M6.16512 11.3624H8.83887C9.09762 11.3624 9.30762 11.1524 9.30762 10.8937C9.30762 10.6349 9.09762 10.4249 8.83887 10.4249H6.16512C5.90637 10.4249 5.69637 10.6349 5.69637 10.8937C5.69637 11.1524 5.90637 11.3624 6.16512 11.3624Z' fill='%23249EDC'/%3E%3C/svg%3E%0A\")}.snowflake-button-container.is-download::before{background-image:url(\"data:image/svg+xml,%3Csvg width='16' height='18' viewBox='0 0 16 18' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M15.2017 17.1637H.798265C.364425 17.1637 0 16.7993 0 16.3655V12.3568C0 11.923 .364425 11.5585 .798265 11.5585C1.2321 11.5585 1.59653 11.923 1.59653 12.3568V15.5498H14.4035V12.3568C14.4035 11.923 14.7679 11.5585 15.2017 11.5585C15.6356 11.5585 16 11.923 16 12.3568V16.3655C16 16.7993 15.6529 17.1637 15.2017 17.1637Z' fill='%23249EDC'/%3E%3Cpath d='M7.94793 12.9642C7.84381 12.9642 7.73969 12.9468 7.63557 12.8947C7.34056 12.7733 7.14967 12.4783 7.14967 12.1485L7.18437 .938127C7.18437 .504287 7.5488 .139862 7.98264 .139862C8.41648 .139862 8.7809 .504287 8.7809 .938127L8.7462 10.257L12.8416 6.33509C13.154 6.02273 13.6746 6.04008 13.9696 6.35244C14.282 6.66481 14.2646 7.18542 13.9523 7.48043L8.50325 12.7386C8.36442 12.8774 8.15617 12.9642 7.94793 12.9642Z' fill='%23249EDC'/%3E%3Cpath d='M7.94793 12.9642C7.73969 12.9642 7.54881 12.8947 7.39262 12.7386L2.03037 7.53249C1.718 7.22012 1.70065 6.71687 2.01301 6.40451C2.32538 6.09214 2.82863 6.07479 3.141 6.38715L8.50325 11.5932C8.81562 11.9056 8.83297 12.4088 8.52061 12.7212C8.36442 12.8774 8.15617 12.9642 7.94793 12.9642Z' fill='%23249EDC'/%3E%3C/svg%3E%0A\")}.snowflake-button-container.is-expand::before{background-image:url(\"data:image/svg+xml,%3Csvg width='18' height='18' viewBox='0 0 18 18' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M6.64375 10.9125C6.9375 11.2062 6.93125 11.6812 6.64375 11.9687L2.57502 16H3.79375C4.20625 16 4.54376 16.3375 4.54376 16.75C4.54376 17.1625 4.20625 17.5 3.79375 17.5H.756264C.556264 17.5 .36876 17.4187 .22501 17.2812C.22501 17.2812 .206248 17.25 .193748 17.2375C.143748 17.1812 .100004 17.1125 .0625038 17.0437C.0375038 16.9687 .0187492 16.8937 .0187492 16.8187C.0187492 16.8 .0062561 16.7813 .0062561 16.7625V13.725C.0187561 13.3125 .356257 12.9875 .768757 12.9937C1.16876 13 1.48752 13.325 1.50002 13.725V14.9688L5.5875 10.9187C5.88125 10.6312 6.35 10.6312 6.64375 10.9187V10.9125ZM17.5063 .743732C17.5063 .543732 17.425 .356235 17.2875 .218735C17.2875 .218735 17.2562 .199998 17.2437 .193748C17.1875 .137498 17.1188 .0937347 17.0438 .0624847C16.9688 .0374847 16.8938 .0187492 16.8188 .0187492C16.8 .0187492 16.7813 .00623703 16.7625 .00623703H13.725C13.3125 .00623703 12.975 .343745 12.975 .756245C12.975 1.16874 13.3125 1.50623 13.725 1.50623H14.9688L11.1312 5.37498C10.8437 5.67498 10.8563 6.14999 11.1563 6.43124C11.45 6.71249 11.9063 6.70624 12.1938 6.43124L16.0125 2.575V3.79375C16.0125 4.20625 16.35 4.54372 16.7625 4.54372C17.175 4.54372 17.5125 4.20625 17.5125 3.79375V.756245L17.5063 .743732ZM16.7562 12.9688C16.3437 12.9688 16.0063 13.3063 16.0063 13.7188V14.8937L12.1938 10.925C11.9063 10.625 11.4375 10.6188 11.1375 10.9063C10.8375 11.1938 10.8313 11.6625 11.1188 11.9625L15 16.0062H13.7188C13.3063 16.0062 12.9688 16.3437 12.9688 16.7562C12.9688 17.1687 13.3063 17.5063 13.7188 17.5063H16.7562C16.85 17.5063 16.95 17.4875 17.0375 17.45C17.0875 17.425 17.1313 17.3937 17.175 17.3625C17.2063 17.3437 17.2438 17.325 17.275 17.3C17.3313 17.2375 17.375 17.1687 17.4125 17.1C17.4188 17.0875 17.4375 17.075 17.4438 17.0562C17.45 17.025 17.4563 16.9938 17.4625 16.9625C17.4813 16.9 17.5 16.8375 17.5 16.7687V13.725C17.5 13.3125 17.1687 12.975 16.7562 12.975V12.9688ZM.750008 4.53125C1.16251 4.53125 1.50002 4.19374 1.50002 3.78124V2.5L5.59376 6.43124C5.89376 6.71874 6.36251 6.70626 6.65001 6.41251C6.93751 6.11876 6.92501 5.64375 6.63126 5.35625L2.61251 1.49998H3.7875C4.2 1.49998 4.53751 1.16249 4.53751 .749989C4.53751 .337489 4.2 0 3.7875 0H.743752C.668752 0 .600004 .0187355 .531254 .0437355C.506254 .0499855 .481263 .0437477 .462513 .0562477C.443763 .0687477 .425015 .0812462 .406265 .0937462C.337515 .124996 .275004 .168741 .218754 .224991H.212498C.212498 .224991 .175 .28125 .15625 .3125C.11875 .3625 .0812477 .4125 .0562477 .46875C.0374977 .525 .0249992 .587499 .0187492 .643749C.0124992 .674999 0 .712482 0 .743732V3.78124C0 4.19374 .337508 4.53125 .750008 4.53125Z' fill='white'/%3E%3C/svg%3E%0A\")}@keyframes slow-scroll{100%{transform:translateY(-50%)}}.sc-hero{overflow:hidden;background-color:#212d35;background-repeat:repeat-y;background-image:url(\"data:image/svg+xml,%3Csvg width='389' height='17' viewBox='0 0 389 17' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M.638672 7.80824L.638672 9.2566C.638672 9.52364 .85538 9.74024 1.12262 9.74024H2.57204C2.83928 9.74024 3.05598 9.52364 3.05598 9.2566V7.80824C3.05598 7.54119 2.83928 7.32472 2.57204 7.32472L1.12262 7.32472C.85538 7.32472 .638672 7.54119 .638672 7.80824Z' fill='url(%23paint0_linear_8295_70635)'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M10.9639 7.80824V9.2566C10.9639 9.52364 11.1806 9.74024 11.4478 9.74024L12.8972 9.74024C13.1645 9.74024 13.3812 9.52364 13.3812 9.2566V7.80824C13.3812 7.54119 13.1645 7.32471 12.8972 7.32471L11.4478 7.32471C11.1806 7.32471 10.9639 7.54119 10.9639 7.80824Z' fill='url(%23paint1_linear_8295_70635)'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M21.2891 7.80823V9.2566C21.2891 9.52364 21.5058 9.74024 21.773 9.74024L23.2224 9.74024C23.4897 9.74024 23.7064 9.52364 23.7064 9.2566V7.80823C23.7064 7.54119 23.4897 7.32471 23.2224 7.32471L21.773 7.32471C21.5058 7.32471 21.2891 7.54119 21.2891 7.80823Z' fill='url(%23paint2_linear_8295_70635)'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M31.6143 7.80823V9.2566C31.6143 9.52364 31.831 9.74024 32.0982 9.74024H33.5476C33.8149 9.74024 34.0316 9.52364 34.0316 9.2566V7.80823C34.0316 7.54119 33.8149 7.32471 33.5476 7.32471L32.0982 7.32471C31.831 7.32471 31.6143 7.54119 31.6143 7.80823Z' fill='url(%23paint3_linear_8295_70635)'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M41.9395 7.80823V9.2566C41.9395 9.52364 42.1562 9.74024 42.4234 9.74024H43.8728C44.1401 9.74024 44.3568 9.52364 44.3568 9.2566V7.80823C44.3568 7.54119 44.1401 7.32471 43.8728 7.32471L42.4234 7.32471C42.1562 7.32471 41.9395 7.54119 41.9395 7.80823Z' fill='url(%23paint4_linear_8295_70635)'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M52.5076 7.80823V9.2566C52.5076 9.52364 52.7243 9.74024 52.9916 9.74024H54.441C54.7082 9.74024 54.9249 9.52364 54.9249 9.2566V7.80823C54.9249 7.54119 54.7082 7.32471 54.441 7.32471L52.9916 7.32471C52.7243 7.32471 52.5076 7.54119 52.5076 7.80823Z' fill='url(%23paint5_linear_8295_70635)'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M62.8331 7.80823V9.2566C62.8331 9.52364 63.0493 9.74024 63.3165 9.74024H64.7664C65.0332 9.74024 65.2504 9.52364 65.2504 9.2566V7.80823C65.2504 7.54119 65.0332 7.32471 64.7664 7.32471L63.3165 7.32471C63.0493 7.32471 62.8331 7.54119 62.8331 7.80823Z' fill='url(%23paint6_linear_8295_70635)'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M73.1583 7.80823V9.2566C73.1583 9.52364 73.3745 9.74024 73.6417 9.74024H75.0916C75.3584 9.74024 75.5756 9.52364 75.5756 9.2566V7.80823C75.5756 7.54119 75.3584 7.32471 75.0916 7.32471L73.6417 7.32471C73.3745 7.32471 73.1583 7.54119 73.1583 7.80823Z' fill='url(%23paint7_linear_8295_70635)'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M83.4835 7.80823V9.2566C83.4835 9.52364 83.6997 9.74024 83.9669 9.74024H85.4168C85.6836 9.74024 85.9008 9.52364 85.9008 9.2566V7.80823C85.9008 7.54119 85.6836 7.32471 85.4168 7.32471L83.9669 7.32471C83.6997 7.32471 83.4835 7.54119 83.4835 7.80823Z' fill='url(%23paint8_linear_8295_70635)'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M93.8087 7.80823V9.2566C93.8087 9.52364 94.0249 9.74024 94.2921 9.74024H95.742C96.0088 9.74024 96.226 9.52364 96.226 9.2566V7.80823C96.226 7.54119 96.0088 7.32471 95.742 7.32471L94.2921 7.32471C94.0249 7.32471 93.8087 7.54119 93.8087 7.80823Z' fill='url(%23paint9_linear_8295_70635)'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M104.134 7.80823V9.2566C104.134 9.52364 104.35 9.74024 104.617 9.74024H106.067C106.334 9.74024 106.551 9.52364 106.551 9.2566V7.80823C106.551 7.54119 106.334 7.32471 106.067 7.32471L104.617 7.32471C104.35 7.32471 104.134 7.54119 104.134 7.80823Z' fill='url(%23paint10_linear_8295_70635)'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M114.702 7.80823V9.2566C114.702 9.52364 114.918 9.74024 115.185 9.74024L116.635 9.74024C116.902 9.74024 117.119 9.52364 117.119 9.25659V7.80823C117.119 7.54119 116.902 7.32471 116.635 7.32471L115.185 7.32471C114.918 7.32471 114.702 7.54119 114.702 7.80823Z' fill='url(%23paint11_linear_8295_70635)'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M125.027 7.80823V9.25659C125.027 9.52364 125.243 9.74024 125.511 9.74024L126.961 9.74024C127.227 9.74024 127.445 9.52364 127.445 9.25659V7.80823C127.445 7.54119 127.227 7.32471 126.961 7.32471L125.511 7.32471C125.243 7.32471 125.027 7.54119 125.027 7.80823Z' fill='url(%23paint12_linear_8295_70635)'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M135.352 7.80823V9.25659C135.352 9.52364 135.569 9.74024 135.836 9.74024H137.286C137.553 9.74024 137.77 9.52364 137.77 9.25659V7.80823C137.77 7.54119 137.553 7.32471 137.286 7.32471L135.836 7.32471C135.569 7.32471 135.352 7.54119 135.352 7.80823Z' fill='url(%23paint13_linear_8295_70635)'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M145.678 7.80823V9.25659C145.678 9.52364 145.894 9.74024 146.161 9.74024H147.611C147.878 9.74024 148.095 9.52364 148.095 9.25659V7.80823C148.095 7.54119 147.878 7.32471 147.611 7.32471L146.161 7.32471C145.894 7.32471 145.678 7.54119 145.678 7.80823Z' fill='url(%23paint14_linear_8295_70635)'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M156.003 7.80823V9.25659C156.003 9.52364 156.219 9.74024 156.486 9.74024H157.936C158.203 9.74024 158.42 9.52364 158.42 9.25659V7.80823C158.42 7.54119 158.203 7.32471 157.936 7.32471L156.486 7.32471C156.219 7.32471 156.003 7.54119 156.003 7.80823Z' fill='url(%23paint15_linear_8295_70635)'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M166.328 7.80823V9.25659C166.328 9.52363 166.544 9.74024 166.811 9.74024H168.261C168.528 9.74024 168.745 9.52363 168.745 9.25659V7.80823C168.745 7.54119 168.528 7.32471 168.261 7.32471L166.811 7.32471C166.544 7.32471 166.328 7.54119 166.328 7.80823Z' fill='url(%23paint16_linear_8295_70635)'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M176.896 7.80823V9.25659C176.896 9.52363 177.112 9.74023 177.38 9.74023H178.83C179.096 9.74023 179.313 9.52363 179.313 9.25659V7.80823C179.313 7.54119 179.096 7.32471 178.83 7.32471L177.38 7.32471C177.112 7.32471 176.896 7.54119 176.896 7.80823Z' fill='url(%23paint17_linear_8295_70635)'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M187.221 7.80823V9.25659C187.221 9.52363 187.438 9.74023 187.705 9.74023H189.155C189.421 9.74023 189.639 9.52363 189.639 9.25659V7.80823C189.639 7.54119 189.421 7.32471 189.155 7.32471L187.705 7.32471C187.438 7.32471 187.221 7.54119 187.221 7.80823Z' fill='url(%23paint18_linear_8295_70635)'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M199.639 7.80824V9.2566C199.639 9.52364 199.855 9.74024 200.123 9.74024H201.572C201.839 9.74024 202.056 9.52364 202.056 9.2566V7.80824C202.056 7.54119 201.839 7.32472 201.572 7.32472L200.123 7.32472C199.855 7.32472 199.639 7.54119 199.639 7.80824Z' fill='url(%23paint19_linear_8295_70635)'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M209.964 7.80824V9.2566C209.964 9.52364 210.181 9.74024 210.448 9.74024L211.897 9.74024C212.164 9.74024 212.381 9.52364 212.381 9.2566V7.80824C212.381 7.54119 212.164 7.32471 211.897 7.32471L210.448 7.32471C210.181 7.32471 209.964 7.54119 209.964 7.80824Z' fill='url(%23paint20_linear_8295_70635)'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M220.289 7.80823V9.2566C220.289 9.52364 220.506 9.74024 220.773 9.74024L222.222 9.74024C222.49 9.74024 222.706 9.52364 222.706 9.2566V7.80823C222.706 7.54119 222.49 7.32471 222.222 7.32471L220.773 7.32471C220.506 7.32471 220.289 7.54119 220.289 7.80823Z' fill='url(%23paint21_linear_8295_70635)'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M230.614 7.80823V9.2566C230.614 9.52364 230.831 9.74024 231.098 9.74024H232.548C232.815 9.74024 233.032 9.52364 233.032 9.2566V7.80823C233.032 7.54119 232.815 7.32471 232.548 7.32471L231.098 7.32471C230.831 7.32471 230.614 7.54119 230.614 7.80823Z' fill='url(%23paint22_linear_8295_70635)'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M240.939 7.80823V9.2566C240.939 9.52364 241.156 9.74024 241.423 9.74024H242.873C243.14 9.74024 243.357 9.52364 243.357 9.2566V7.80823C243.357 7.54119 243.14 7.32471 242.873 7.32471L241.423 7.32471C241.156 7.32471 240.939 7.54119 240.939 7.80823Z' fill='url(%23paint23_linear_8295_70635)'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M251.508 7.80823V9.2566C251.508 9.52364 251.724 9.74024 251.992 9.74024H253.441C253.708 9.74024 253.925 9.52364 253.925 9.2566V7.80823C253.925 7.54119 253.708 7.32471 253.441 7.32471L251.992 7.32471C251.724 7.32471 251.508 7.54119 251.508 7.80823Z' fill='url(%23paint24_linear_8295_70635)'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M261.833 7.80823V9.2566C261.833 9.52364 262.049 9.74024 262.317 9.74024H263.766C264.033 9.74024 264.25 9.52364 264.25 9.2566V7.80823C264.25 7.54119 264.033 7.32471 263.766 7.32471L262.317 7.32471C262.049 7.32471 261.833 7.54119 261.833 7.80823Z' fill='url(%23paint25_linear_8295_70635)'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M272.158 7.80823V9.2566C272.158 9.52364 272.374 9.74024 272.642 9.74024H274.092C274.358 9.74024 274.576 9.52364 274.576 9.2566L274.576 7.80823C274.576 7.54119 274.358 7.32471 274.092 7.32471L272.642 7.32471C272.374 7.32471 272.158 7.54119 272.158 7.80823Z' fill='url(%23paint26_linear_8295_70635)'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M282.483 7.80823V9.2566C282.483 9.52364 282.7 9.74024 282.967 9.74024H284.417C284.684 9.74024 284.901 9.52364 284.901 9.2566V7.80823C284.901 7.54119 284.684 7.32471 284.417 7.32471L282.967 7.32471C282.7 7.32471 282.483 7.54119 282.483 7.80823Z' fill='url(%23paint27_linear_8295_70635)'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M292.809 7.80823L292.809 9.2566C292.809 9.52364 293.025 9.74024 293.292 9.74024H294.742C295.009 9.74024 295.226 9.52364 295.226 9.2566V7.80823C295.226 7.54119 295.009 7.32471 294.742 7.32471L293.292 7.32471C293.025 7.32471 292.809 7.54119 292.809 7.80823Z' fill='url(%23paint28_linear_8295_70635)'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M303.134 7.80823L303.134 9.2566C303.134 9.52364 303.35 9.74024 303.617 9.74024H305.067C305.334 9.74024 305.551 9.52364 305.551 9.2566V7.80823C305.551 7.54119 305.334 7.32471 305.067 7.32471L303.617 7.32471C303.35 7.32471 303.134 7.54119 303.134 7.80823Z' fill='url(%23paint29_linear_8295_70635)'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M313.702 7.80823L313.702 9.2566C313.702 9.52364 313.918 9.74024 314.185 9.74024L315.635 9.74024C315.902 9.74024 316.119 9.52364 316.119 9.25659V7.80823C316.119 7.54119 315.902 7.32471 315.635 7.32471L314.185 7.32471C313.918 7.32471 313.702 7.54119 313.702 7.80823Z' fill='url(%23paint30_linear_8295_70635)'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M324.027 7.80823V9.25659C324.027 9.52364 324.243 9.74024 324.511 9.74024L325.961 9.74024C326.227 9.74024 326.445 9.52364 326.445 9.25659V7.80823C326.445 7.54119 326.227 7.32471 325.961 7.32471L324.511 7.32471C324.243 7.32471 324.027 7.54119 324.027 7.80823Z' fill='url(%23paint31_linear_8295_70635)'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M334.352 7.80823V9.25659C334.352 9.52364 334.569 9.74024 334.836 9.74024H336.286C336.553 9.74024 336.77 9.52364 336.77 9.25659L336.77 7.80823C336.77 7.54119 336.553 7.32471 336.286 7.32471L334.836 7.32471C334.569 7.32471 334.352 7.54119 334.352 7.80823Z' fill='url(%23paint32_linear_8295_70635)'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M344.678 7.80823V9.25659C344.678 9.52364 344.894 9.74024 345.161 9.74024H346.611C346.878 9.74024 347.095 9.52364 347.095 9.25659L347.095 7.80823C347.095 7.54119 346.878 7.32471 346.611 7.32471L345.161 7.32471C344.894 7.32471 344.678 7.54119 344.678 7.80823Z' fill='url(%23paint33_linear_8295_70635)'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M355.003 7.80823V9.25659C355.003 9.52364 355.219 9.74024 355.486 9.74024H356.936C357.203 9.74024 357.42 9.52364 357.42 9.25659L357.42 7.80823C357.42 7.54119 357.203 7.32471 356.936 7.32471L355.486 7.32471C355.219 7.32471 355.003 7.54119 355.003 7.80823Z' fill='url(%23paint34_linear_8295_70635)'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M365.328 7.80823V9.25659C365.328 9.52363 365.544 9.74024 365.811 9.74024H367.261C367.528 9.74024 367.745 9.52363 367.745 9.25659V7.80823C367.745 7.54119 367.528 7.32471 367.261 7.32471L365.811 7.32471C365.544 7.32471 365.328 7.54119 365.328 7.80823Z' fill='url(%23paint35_linear_8295_70635)'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M375.896 7.80823V9.25659C375.896 9.52363 376.112 9.74023 376.38 9.74023H377.83C378.096 9.74023 378.313 9.52363 378.313 9.25659V7.80823C378.313 7.54119 378.096 7.32471 377.829 7.32471L376.38 7.32471C376.112 7.32471 375.896 7.54119 375.896 7.80823Z' fill='url(%23paint36_linear_8295_70635)'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M386.221 7.80823V9.25659C386.221 9.52363 386.438 9.74023 386.705 9.74023H388.155C388.421 9.74023 388.639 9.52363 388.639 9.25659V7.80823C388.639 7.54119 388.421 7.32471 388.155 7.32471L386.705 7.32471C386.438 7.32471 386.221 7.54119 386.221 7.80823Z' fill='url(%23paint37_linear_8295_70635)'/%3E%3Cdefs%3E%3ClinearGradient id='paint0_linear_8295_70635' x1='-47.5' y1='8.99989' x2='332' y2='8.99989' gradientUnits='userSpaceOnUse'%3E%3Cstop stop-color='%2329B5E8' stop-opacity='.8'/%3E%3Cstop offset='1' stop-color='%2329B5E8' stop-opacity='0'/%3E%3C/linearGradient%3E%3ClinearGradient id='paint1_linear_8295_70635' x1='-47.5' y1='8.99989' x2='332' y2='8.99989' gradientUnits='userSpaceOnUse'%3E%3Cstop stop-color='%2329B5E8' stop-opacity='.8'/%3E%3Cstop offset='1' stop-color='%2329B5E8' stop-opacity='0'/%3E%3C/linearGradient%3E%3ClinearGradient id='paint2_linear_8295_70635' x1='-47.5' y1='8.99989' x2='332' y2='8.99989' gradientUnits='userSpaceOnUse'%3E%3Cstop stop-color='%2329B5E8' stop-opacity='.8'/%3E%3Cstop offset='1' stop-color='%2329B5E8' stop-opacity='0'/%3E%3C/linearGradient%3E%3ClinearGradient id='paint3_linear_8295_70635' x1='-47.5' y1='8.99989' x2='332' y2='8.99989' gradientUnits='userSpaceOnUse'%3E%3Cstop stop-color='%2329B5E8' stop-opacity='.8'/%3E%3Cstop offset='1' stop-color='%2329B5E8' stop-opacity='0'/%3E%3C/linearGradient%3E%3ClinearGradient id='paint4_linear_8295_70635' x1='-47.5' y1='8.99989' x2='332' y2='8.99989' gradientUnits='userSpaceOnUse'%3E%3Cstop stop-color='%2329B5E8' stop-opacity='.8'/%3E%3Cstop offset='1' stop-color='%2329B5E8' stop-opacity='0'/%3E%3C/linearGradient%3E%3ClinearGradient id='paint5_linear_8295_70635' x1='-47.5' y1='8.99989' x2='332' y2='8.99989' gradientUnits='userSpaceOnUse'%3E%3Cstop stop-color='%2329B5E8' stop-opacity='.8'/%3E%3Cstop offset='1' stop-color='%2329B5E8' stop-opacity='0'/%3E%3C/linearGradient%3E%3ClinearGradient id='paint6_linear_8295_70635' x1='-47.5' y1='8.99989' x2='332' y2='8.99989' gradientUnits='userSpaceOnUse'%3E%3Cstop stop-color='%2329B5E8' stop-opacity='.8'/%3E%3Cstop offset='1' stop-color='%2329B5E8' stop-opacity='0'/%3E%3C/linearGradient%3E%3ClinearGradient id='paint7_linear_8295_70635' x1='-47.5' y1='8.99989' x2='332' y2='8.99989' gradientUnits='userSpaceOnUse'%3E%3Cstop stop-color='%2329B5E8' stop-opacity='.8'/%3E%3Cstop offset='1' stop-color='%2329B5E8' stop-opacity='0'/%3E%3C/linearGradient%3E%3ClinearGradient id='paint8_linear_8295_70635' x1='-47.5' y1='8.99989' x2='332' y2='8.99989' gradientUnits='userSpaceOnUse'%3E%3Cstop stop-color='%2329B5E8' stop-opacity='.8'/%3E%3Cstop offset='1' stop-color='%2329B5E8' stop-opacity='0'/%3E%3C/linearGradient%3E%3ClinearGradient id='paint9_linear_8295_70635' x1='-47.5' y1='8.99989' x2='332' y2='8.99989' gradientUnits='userSpaceOnUse'%3E%3Cstop stop-color='%2329B5E8' stop-opacity='.8'/%3E%3Cstop offset='1' stop-color='%2329B5E8' stop-opacity='0'/%3E%3C/linearGradient%3E%3ClinearGradient id='paint10_linear_8295_70635' x1='-47.5' y1='8.99989' x2='332' y2='8.99989' gradientUnits='userSpaceOnUse'%3E%3Cstop stop-color='%2329B5E8' stop-opacity='.8'/%3E%3Cstop offset='1' stop-color='%2329B5E8' stop-opacity='0'/%3E%3C/linearGradient%3E%3ClinearGradient id='paint11_linear_8295_70635' x1='-47.5' y1='8.99989' x2='332' y2='8.99989' gradientUnits='userSpaceOnUse'%3E%3Cstop stop-color='%2329B5E8' stop-opacity='.8'/%3E%3Cstop offset='1' stop-color='%2329B5E8' stop-opacity='0'/%3E%3C/linearGradient%3E%3ClinearGradient id='paint12_linear_8295_70635' x1='-47.5' y1='8.99989' x2='332' y2='8.99989' gradientUnits='userSpaceOnUse'%3E%3Cstop stop-color='%2329B5E8' stop-opacity='.8'/%3E%3Cstop offset='1' stop-color='%2329B5E8' stop-opacity='0'/%3E%3C/linearGradient%3E%3ClinearGradient id='paint13_linear_8295_70635' x1='-47.5' y1='8.99989' x2='332' y2='8.99989' gradientUnits='userSpaceOnUse'%3E%3Cstop stop-color='%2329B5E8' stop-opacity='.8'/%3E%3Cstop offset='1' stop-color='%2329B5E8' stop-opacity='0'/%3E%3C/linearGradient%3E%3ClinearGradient id='paint14_linear_8295_70635' x1='-47.5' y1='8.99989' x2='332' y2='8.99989' gradientUnits='userSpaceOnUse'%3E%3Cstop stop-color='%2329B5E8' stop-opacity='.8'/%3E%3Cstop offset='1' stop-color='%2329B5E8' stop-opacity='0'/%3E%3C/linearGradient%3E%3ClinearGradient id='paint15_linear_8295_70635' x1='-47.5' y1='8.99989' x2='332' y2='8.99989' gradientUnits='userSpaceOnUse'%3E%3Cstop stop-color='%2329B5E8' stop-opacity='.8'/%3E%3Cstop offset='1' stop-color='%2329B5E8' stop-opacity='0'/%3E%3C/linearGradient%3E%3ClinearGradient id='paint16_linear_8295_70635' x1='-47.5' y1='8.99989' x2='332' y2='8.99989' gradientUnits='userSpaceOnUse'%3E%3Cstop stop-color='%2329B5E8' stop-opacity='.8'/%3E%3Cstop offset='1' stop-color='%2329B5E8' stop-opacity='0'/%3E%3C/linearGradient%3E%3ClinearGradient id='paint17_linear_8295_70635' x1='-47.5' y1='8.99989' x2='332' y2='8.99989' gradientUnits='userSpaceOnUse'%3E%3Cstop stop-color='%2329B5E8' stop-opacity='.8'/%3E%3Cstop offset='1' stop-color='%2329B5E8' stop-opacity='0'/%3E%3C/linearGradient%3E%3ClinearGradient id='paint18_linear_8295_70635' x1='-47.5' y1='8.99989' x2='332' y2='8.99989' gradientUnits='userSpaceOnUse'%3E%3Cstop stop-color='%2329B5E8' stop-opacity='.8'/%3E%3Cstop offset='1' stop-color='%2329B5E8' stop-opacity='0'/%3E%3C/linearGradient%3E%3ClinearGradient id='paint19_linear_8295_70635' x1='-47.5' y1='8.99989' x2='332' y2='8.99989' gradientUnits='userSpaceOnUse'%3E%3Cstop stop-color='%2329B5E8' stop-opacity='.8'/%3E%3Cstop offset='1' stop-color='%2329B5E8' stop-opacity='0'/%3E%3C/linearGradient%3E%3ClinearGradient id='paint20_linear_8295_70635' x1='-47.5' y1='8.99989' x2='332' y2='8.99989' gradientUnits='userSpaceOnUse'%3E%3Cstop stop-color='%2329B5E8' stop-opacity='.8'/%3E%3Cstop offset='1' stop-color='%2329B5E8' stop-opacity='0'/%3E%3C/linearGradient%3E%3ClinearGradient id='paint21_linear_8295_70635' x1='-47.5' y1='8.99989' x2='332' y2='8.99989' gradientUnits='userSpaceOnUse'%3E%3Cstop stop-color='%2329B5E8' stop-opacity='.8'/%3E%3Cstop offset='1' stop-color='%2329B5E8' stop-opacity='0'/%3E%3C/linearGradient%3E%3ClinearGradient id='paint22_linear_8295_70635' x1='-47.5' y1='8.99989' x2='332' y2='8.99989' gradientUnits='userSpaceOnUse'%3E%3Cstop stop-color='%2329B5E8' stop-opacity='.8'/%3E%3Cstop offset='1' stop-color='%2329B5E8' stop-opacity='0'/%3E%3C/linearGradient%3E%3ClinearGradient id='paint23_linear_8295_70635' x1='-47.5' y1='8.99989' x2='332' y2='8.99989' gradientUnits='userSpaceOnUse'%3E%3Cstop stop-color='%2329B5E8' stop-opacity='.8'/%3E%3Cstop offset='1' stop-color='%2329B5E8' stop-opacity='0'/%3E%3C/linearGradient%3E%3ClinearGradient id='paint24_linear_8295_70635' x1='-47.5' y1='8.99989' x2='332' y2='8.99989' gradientUnits='userSpaceOnUse'%3E%3Cstop stop-color='%2329B5E8' stop-opacity='.8'/%3E%3Cstop offset='1' stop-color='%2329B5E8' stop-opacity='0'/%3E%3C/linearGradient%3E%3ClinearGradient id='paint25_linear_8295_70635' x1='-47.5' y1='8.99989' x2='332' y2='8.99989' gradientUnits='userSpaceOnUse'%3E%3Cstop stop-color='%2329B5E8' stop-opacity='.8'/%3E%3Cstop offset='1' stop-color='%2329B5E8' stop-opacity='0'/%3E%3C/linearGradient%3E%3ClinearGradient id='paint26_linear_8295_70635' x1='-47.5' y1='8.99989' x2='332' y2='8.99989' gradientUnits='userSpaceOnUse'%3E%3Cstop stop-color='%2329B5E8' stop-opacity='.8'/%3E%3Cstop offset='1' stop-color='%2329B5E8' stop-opacity='0'/%3E%3C/linearGradient%3E%3ClinearGradient id='paint27_linear_8295_70635' x1='-47.5' y1='8.99989' x2='332' y2='8.99989' gradientUnits='userSpaceOnUse'%3E%3Cstop stop-color='%2329B5E8' stop-opacity='.8'/%3E%3Cstop offset='1' stop-color='%2329B5E8' stop-opacity='0'/%3E%3C/linearGradient%3E%3ClinearGradient id='paint28_linear_8295_70635' x1='-47.5' y1='8.99989' x2='332' y2='8.99989' gradientUnits='userSpaceOnUse'%3E%3Cstop stop-color='%2329B5E8' stop-opacity='.8'/%3E%3Cstop offset='1' stop-color='%2329B5E8' stop-opacity='0'/%3E%3C/linearGradient%3E%3ClinearGradient id='paint29_linear_8295_70635' x1='-47.5' y1='8.99989' x2='332' y2='8.99989' gradientUnits='userSpaceOnUse'%3E%3Cstop stop-color='%2329B5E8' stop-opacity='.8'/%3E%3Cstop offset='1' stop-color='%2329B5E8' stop-opacity='0'/%3E%3C/linearGradient%3E%3ClinearGradient id='paint30_linear_8295_70635' x1='-47.5' y1='8.99989' x2='332' y2='8.99989' gradientUnits='userSpaceOnUse'%3E%3Cstop stop-color='%2329B5E8' stop-opacity='.8'/%3E%3Cstop offset='1' stop-color='%2329B5E8' stop-opacity='0'/%3E%3C/linearGradient%3E%3ClinearGradient id='paint31_linear_8295_70635' x1='-47.5' y1='8.99989' x2='332' y2='8.99989' gradientUnits='userSpaceOnUse'%3E%3Cstop stop-color='%2329B5E8' stop-opacity='.8'/%3E%3Cstop offset='1' stop-color='%2329B5E8' stop-opacity='0'/%3E%3C/linearGradient%3E%3ClinearGradient id='paint32_linear_8295_70635' x1='-47.5' y1='8.99989' x2='332' y2='8.99989' gradientUnits='userSpaceOnUse'%3E%3Cstop stop-color='%2329B5E8' stop-opacity='.8'/%3E%3Cstop offset='1' stop-color='%2329B5E8' stop-opacity='0'/%3E%3C/linearGradient%3E%3ClinearGradient id='paint33_linear_8295_70635' x1='-47.5' y1='8.99989' x2='332' y2='8.99989' gradientUnits='userSpaceOnUse'%3E%3Cstop stop-color='%2329B5E8' stop-opacity='.8'/%3E%3Cstop offset='1' stop-color='%2329B5E8' stop-opacity='0'/%3E%3C/linearGradient%3E%3ClinearGradient id='paint34_linear_8295_70635' x1='-47.5' y1='8.99989' x2='332' y2='8.99989' gradientUnits='userSpaceOnUse'%3E%3Cstop stop-color='%2329B5E8' stop-opacity='.8'/%3E%3Cstop offset='1' stop-color='%2329B5E8' stop-opacity='0'/%3E%3C/linearGradient%3E%3ClinearGradient id='paint35_linear_8295_70635' x1='-47.5' y1='8.99989' x2='332' y2='8.99989' gradientUnits='userSpaceOnUse'%3E%3Cstop stop-color='%2329B5E8' stop-opacity='.8'/%3E%3Cstop offset='1' stop-color='%2329B5E8' stop-opacity='0'/%3E%3C/linearGradient%3E%3ClinearGradient id='paint36_linear_8295_70635' x1='-47.5' y1='8.99989' x2='332' y2='8.99989' gradientUnits='userSpaceOnUse'%3E%3Cstop stop-color='%2329B5E8' stop-opacity='.8'/%3E%3Cstop offset='1' stop-color='%2329B5E8' stop-opacity='0'/%3E%3C/linearGradient%3E%3ClinearGradient id='paint37_linear_8295_70635' x1='-47.5' y1='8.99989' x2='332' y2='8.99989' gradientUnits='userSpaceOnUse'%3E%3Cstop stop-color='%2329B5E8' stop-opacity='.8'/%3E%3Cstop offset='1' stop-color='%2329B5E8' stop-opacity='0'/%3E%3C/linearGradient%3E%3C/defs%3E%3C/svg%3E%0A\")}.sc-hero__inner\u003E.snowflake-flexible-column-container-items\u003Ediv:first-child{position:relative;z-index:3}.sc-hero__inner\u003E.snowflake-flexible-column-container-items\u003Ediv:last-child{position:absolute;height:100%;width:100%;top:0;left:-24px}.sc-hero__inner\u003E.snowflake-flexible-column-container-items\u003Ediv:last-child::before{content:\"\";display:block;z-index:1;position:absolute;top:-64px;left:0;width:150%;height:calc(100% + 160px);background-color:rgb(32 44 53 / .9)}.sc-body__content .heading-3-v2,.sc-hero__headline .heading-1-v2{text-transform:none}.sc-body__content span.snowflake-image-caption{display:block!important;font-style:italic}.sc-body__content .snowflake-text p+ul{margin-top:24px!important;padding-left:16px!important}.white-blue-text-color .snowflake-title-v2.solution-center-hero__certification .snowflake-typographyv2\u003Espan.snowflake-title-v2-line{color:#e9eaeb!important;font-size:16px}.white-blue-text-color .snowflake-title-v2.solution-center-hero__certification.is-large .snowflake-typographyv2\u003Espan.snowflake-title-v2-line{color:#fff!important;font-size:18px}.solution-center-hero__certification\u003E.snowflake-title-v2-line\u003Espan:first-child{display:flex;justify-content:flex-start;align-items:center;gap:8px}.solution-center-hero__certification\u003E.snowflake-title-v2-line\u003Espan:first-child::before{content:\"\";display:inline-block;width:16px;height:16px;background-image:url(\"data:image/svg+xml,%3Csvg width='16' height='16' viewBox='0 0 16 16' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M8 0C3.58146 0 0 3.58146 0 8C0 12.4185 3.58146 16 8 16C12.4185 16 16 12.4185 16 8C16 3.58146 12.4185 0 8 0ZM12.7184 5.91984L7.33471 11.3026C7.31293 11.3244 7.31293 11.3454 7.29198 11.3454L7.20653 11.4308C6.94933 11.688 6.54132 11.7525 6.21962 11.6235C6.11238 11.5808 6.00514 11.5163 5.9197 11.4308L5.83425 11.3454C5.83425 11.3454 5.83425 11.3236 5.81246 11.3236L3.28149 8.79347C2.93799 8.44997 2.93799 7.87107 3.28149 7.50664L3.36694 7.42119C3.71044 7.07769 4.28934 7.07769 4.65377 7.42119L6.58401 9.35143L11.3877 4.5477C11.7312 4.2042 12.3101 4.2042 12.6746 4.5477L12.76 4.63315C13.0826 4.99758 13.0828 5.55541 12.7184 5.91984Z' fill='%230E8A16'/%3E%3C/svg%3E%0A\");background-size:contain;background-repeat:no-repeat;background-color:#fff;border-radius:100%}.sc-hero__byline{padding-top:8px}.sc-hero__byline p{color:#e2e2e2;margin-top:0!important}.sc-hero pre[class*=language-]{overflow:visible}.snowflake-code-snippet,.snowflake-code-snippet code,.snowflake-code-snippet pre{font-size:16px}.sc-hero__code-snippet:not(pre)\u003Ecode[class*=language-],.sc-hero__code-snippet pre[class*=language-]{background:0 0}.sc-hero__code-snippet{opacity:.8;background-color:transparent!important;position:absolute;top:0;right:0;width:100%;animation:240s linear 1s forwards slow-scroll}.sc-hero__button-container .snowflake-flexible-column-container-items{padding:0 0 24px;margin-top:-8px;margin-left:24px}.sc-sidebar__partner-logo{width:100%;max-width:140px;margin-top:8px}.sc-sidebar__partner-logo .cmp-image__image{border-radius:0}.sc-tag-cluster.snowflake-text ul{list-style-type:none;padding:0;display:flex;flex-wrap:wrap;gap:8px;margin:0}.sc-tag-cluster.snowflake-text li{color:#373f41;border-radius:4px;display:inline-block;padding:6px;text-transform:uppercase;letter-spacing:1px;font-size:12px!important;line-height:12px!important;margin:0!important;background-color:#f3f3f3}.sc-body .share-icon svg{height:24px;cursor:pointer}.sc-body .share-icon svg:hover path{fill:var(--ui-02)}.sc-overview__webinar-promo-banner{align-items:center;border:1px solid #ccc;padding:var(--spacing-02)}.sc-overview__webinar-promo-banner .snowflake-content-chip-image{max-width:32px;margin-right:var(--spacing-02);line-height:0}.sc-overview__webinar-promo-banner .snowflake-content-chip-image__image,.summit-speaker-card .snowflake-card-v2-advanced-image__image{aspect-ratio:1}.sc-overview__webinar-promo-banner .snowflake-content-chip-content .heading-5-v2{font-size:14px;font-family:Lato,sans-serif}.sc-overview__webinar-promo-banner .snowflake-content-chip-content .snowflake-title-v2-line:not(:first-child){font-weight:400}.sc-overview__webinar-promo-banner .snowflake-content-chip-button .snowflake-button-container{font-size:14px!important}.diagram-group__button{position:absolute;bottom:24px;right:24px;background-color:#212c35!important}.section--mountains-bottom,.summit-hp-hero{position:relative}.sc-cert-banner{background-color:#212d35;border-radius:8px;padding:24px;overflow:hidden}.sc-cert-banner\u003E.container\u003E.cmp-container\u003E.aem-container{display:flex;flex-direction:row;align-items:center}:root{--text-secondary:#706f6f;--summit-bg-ltblue:#eaf8fd;--summit-bg-blue:#249edc;--summit-border:#d2d1d4;--summit-border-radius:8px;--summit-card-padding:32px;--summit-card-padding-sm:28px}.section--mountains-bottom::after,.section--mountains-bottom::before{content:\"\";display:block;position:absolute;bottom:-1px;max-width:400px;background-size:100% auto;height:100%;width:30%;line-height:0;background-repeat:no-repeat}.button-group\u003E.container\u003E.cmp-container\u003E.aem-container{justify-content:center;align-items:center}.button-group\u003E.container\u003E.cmp-container\u003E.aem-container\u003Ediv{width:auto!important;margin:0 8px!important}.button-group .snowflake-button-container{font-family:Texta,sans-serif}.section--summit-bg-ltblue{background-color:var(--summit-bg-ltblue)}.section--summit-bg-blue,.summit-hero-secondary{background-color:var(--summit-bg-blue)}.section--mountains-bottom::before{left:0;background-image:url(\"data:image/svg+xml,%3Csvg width='402' height='309' viewBox='0 0 402 309' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M401.523 308.761H0V0L181.63 182.431L228.479 135.531L401.523 308.761Z' fill='%23249EDC'/%3E%3C/svg%3E%0A\");background-position:bottom left}.section--mountains-bottom::after{right:0;background-image:url(\"data:image/svg+xml,%3Csvg width='402' height='309' viewBox='0 0 402 309' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M0 308.761H401.523V0L219.893 182.431L173.044 135.531L0 308.761Z' fill='%23249EDC'/%3E%3C/svg%3E%0A\");background-position:bottom right}.summit-hp-hero{overflow:hidden}.summit-hero__bg-video{position:absolute;top:50%;left:50%;width:120%;height:100%;opacity:.3;transform:translate(-50%,-50%)}.summit-hero__bg-svg,.summit-prefooter__bg-image,.summit-secondary-hero__bg-image{position:absolute;bottom:0;left:0;width:100%}.summit-hp-promo-banner__headline .heading-4-v2{font-weight:900}.summit-hero-secondary .hero-lottie__left{position:absolute;bottom:0;left:0;width:30%;line-height:0}.summit-timeline__card::after,.summit-timeline__card::before{bottom:0;left:50%;position:absolute;display:block;background-color:var(--ui-01);content:\"\"}.summit-hero-secondary .snowflake-text p{font-size:24px!important;line-height:32px!important;max-width:720px;margin:0 auto}.summit-stat-container\u003E.container\u003E.cmp-container\u003E.aem-container{display:flex;justify-content:center}.summit-stat-container\u003E.container\u003E.cmp-container\u003E.aem-container\u003Ediv{width:auto!important;max-width:25%}.summit-stat-container\u003E.container\u003E.cmp-container\u003E.aem-container\u003Ediv:not(:last-child){border-right:1px solid #fff}.summit-timeline__card{border:1px solid var(--summit-border);border-radius:var(--summit-border-radius);padding:var(--summit-card-padding);position:relative;background-color:#fff}.summit-timeline__card::before{width:20px;height:20px;border-radius:100%;transform:translate(-50%,50%)}.summit-timeline__card::after{width:3px;height:50px;transform:translate(-50%,100%)}.summit-timeline-card__icon{width:48px;height:48px}.summit-timeline-card__headline .heading-3-v2{font-size:32px}.faq-group{border:1px solid var(--ui-12);border-radius:4px;background-color:#fff}.faq-group__question{padding:24px}.faq-group__question:hover{color:var(--ui-01);cursor:pointer}.faq-group__question .heading-4-v2,.faq-group__question .heading-5-v2{position:relative;padding-right:64px}.faq-group__question .heading-4-v2::after,.faq-group__question .heading-5-v2::after{content:\"\";display:block;width:32px;height:32px;background-image:url(\"data:image/svg+xml,%3Csvg width='29' height='16' viewBox='0 0 29 16' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M14.16 14.6807C14.2537 14.7957 14.3719 14.8884 14.506 14.952C14.64 15.0157 14.7866 15.0487 14.935 15.0487C15.0834 15.0487 15.2299 15.0157 15.3639 14.952C15.498 14.8884 15.6162 14.7957 15.71 14.6807V14.6807L28.51 2.00068C29.07 1.43068 29.07 .92068 28.51 .44068C27.95 -.0393204 27.43 -.11932 26.96 .44068L14.94 12.0007L2.99996 .45068C2.90725 .322624 2.7855 .218374 2.6447 .146483C2.50389 .0745926 2.34805 .0371094 2.18996 .0371094C2.03187 .0371094 1.87603 .0745926 1.73522 .146483C1.59442 .218374 1.47267 .322624 1.37996 .45068C.819961 .93068 .819961 1.45068 1.37996 2.01068L14.16 14.6807Z' fill='black'/%3E%3C/svg%3E%0A\");background-size:80% auto;background-repeat:no-repeat;background-position:center;position:absolute;top:-2px;right:0;transition:.3s 150ms}.faq-group__question .heading-5-v2::after{top:-4px}.faq-group__answer{max-height:0;overflow:hidden;width:95%;padding:0 24px;transition:.5s}.faq-group__answer\u003Espan{display:block;padding-bottom:24px}.is-open .faq-group__answer{max-height:600px;transition:1s}.is-open .faq-group__question .heading-4-v2::after,.is-open .faq-group__question .heading-5-v2::after{transform:rotate(180deg);transition:.3s}.summit-agenda{box-shadow:2px 4px 10px 0 rgb(156 156 156 / .52);border-radius:8px;background-color:#fff;max-width:980px;margin-left:auto;margin-right:auto;padding:40px;width:90%}.agenda-item{border-radius:8px;background-color:#d4f0fa;padding:16px;border-left:4px solid var(--ui-01);position:relative}.summit-pricing-block__tile.is-past,.summit-pricing-block__tile.is-upcoming{pointer-events:none;border-color:#d2d1d4}p.agenda-item__time{width:25%;font-family:Texta!important;font-size:32px!important;font-weight:900!important;text-transform:uppercase!important;max-width:140px}@media screen and (max-width:991px){#partnerResources .section--resource-hub .snowflake-button-link .snowflake-button-container{font-size:14px!important;line-height:20px!important;margin-top:4px}#industryPartnerSlider\u003E.snowflake-flexible-column-container-items{display:flex;flex-direction:column}#industryPartnerSlider\u003E.snowflake-flexible-column-container-items\u003Ediv{width:100%}.sc-cert-banner__left{text-align:center}.sc-cert-banner__left .solution-center-hero__certification .snowflake-title-v2-line{justify-content:center}.summit-hero__bg-video{width:200%}.summit-leadership-grid .snowflake-flexible-column-container-items{grid-template-columns:repeat(2,1fr)}.summit-stat-container\u003E.container\u003E.cmp-container\u003E.aem-container\u003Ediv{width:50%!important;max-width:50%!important}.summit-stat-container\u003E.container\u003E.cmp-container\u003E.aem-container\u003Ediv:not(:last-child){border-right:none!important}.summit-agenda{padding:24px}p.agenda-item__time{font-size:24px!important;width:auto;white-space:nowrap;padding-right:24px}}.agenda-item\u003Espan{display:flex;align-items:center}.summit-add-on-block,.summit-pricing-block{border:1px solid #d2d1d4;border-radius:8px;overflow:hidden;box-shadow:2px 4px 10px 0 rgb(156 156 156 / .52);background-color:#fff}.summit-add-on-block__content,.summit-pricing-block__content{padding:0 20px 20px}.summit-pricing-block__tile{padding:24px 20px;border-radius:4px;background:#fff;border:1px solid var(--ui-01);position:relative;transition:background-color .3s}.summit-pricing-block__tile:hover{background-color:var(--ui-01);transition:background-color .3s}.summit-pricing-block__tile.is-past{background-color:#d4f0fa}.summit-pricing-block__tile:hover .black-blue-text-color .snowflake-title-v2-line{color:#fff!important;transition:color .3s}.partner-card__logo-grid\u003E.container\u003E.cmp-container\u003E.aem-container::after,.partner-card__logo-grid\u003E.container\u003E.cmp-container\u003E.aem-container::before,.summit-add-on-block__content\u003E.container\u003E.cmp-container\u003E.aem-container::after,.summit-add-on-block__content\u003E.container\u003E.cmp-container\u003E.aem-container::before,.summit-pricing-block__tile.is-past .snowflake-content-chip-button,.summit-pricing-block__tile.is-upcoming .snowflake-content-chip-button,.summit-speaker-card .snowflake-card-v2-advanced-tag-indicator{display:none}.summit-pricing-block__tile.is-past .black-blue-text-color .snowflake-title-v2-line{color:#7cc7eb!important}.summit-pricing-block__tile.is-upcoming .black-blue-text-color .snowflake-title-v2-line{color:#8c8c8c!important}.summit-pricing-block__aside{background-color:#d4f0fa;border:1px solid #d2d1d4;border-radius:8px;padding:24px;width:100%}.summit-pricing-block__aside li::marker{color:var(--ui-01)}.summit-pricing-block__aside-headline .heading-5-v2{font-weight:900;margin-bottom:12px}.summit-pricing-block__header{background:#000;padding:24px 40px}.summit-pricing-block__header .heading-4-v2{font-weight:900;letter-spacing:.5px}.bwwidth100,.snowflake-mega-nav-dropdown-footer-content,.summit-pricing-block__tile .black-blue-text-color{width:100%}.summit-pricing-block__tile .heading-5-v2{position:static}.summit-pricing-block__tile .heading-5-v2 span.snowflake-title-v2-line:first-child{text-transform:uppercase;font-weight:900!important;letter-spacing:.25px;font-size:24px!important}.summit-pricing-block__tile .heading-5-v2 span.snowflake-title-v2-line:nth-child(2){margin-top:8px;font-family:Lato,sans-serif;font-size:14px;font-style:normal;font-weight:400;line-height:16px}.summit-pricing-block__tile .heading-5-v2 span.snowflake-title-v2-line:last-child{font-weight:900!important;font-size:40px!important}.snowflake-mega-nav-nav-item\u003Ea:hover .snowflake-mega-nav-nav-item-title-wrapper\u003E.snowflake-mega-nav-nav-item-title,.summit-pricing-block__tile:not(.is-upcoming):not(.is-past) .heading-5-v2 span.snowflake-title-v2-line:last-child{color:var(--ui-01)!important}.summit-pricing-block__tile:hover:not(.is-upcoming):not(.is-past) .heading-5-v2 span.snowflake-title-v2-line:last-child{color:#fff!important}.summit-pricing-block__tile.is-past .heading-5-v2 span.snowflake-title-v2-line:last-child{text-decoration:line-through}.summit-pricing-block__tile .snowflake-content-chip-button{margin-top:0;white-space:nowrap;display:none}.snowflake-card-v2-advanced.no-link{pointer-events:none!important}.snowpro-card{border:1px solid var(--summit-border);border-radius:var(--summit-border-radius);padding:var(--summit-card-padding-sm);display:flex;height:100%}.snowpro-card__headline{margin:24px 0 12px}.snowpro-card__pricing{margin-top:48px}.snowpro-card .snowflake-text .snowpro-card__price{color:var(--ui-01);font-weight:900;font-size:40px!important;font-family:Texta,sans-serif}.summit-stat-container\u003E.container\u003E.cmp-container\u003E.aem-container{display:flex;flex-direction:row;flex-wrap:wrap}.summit-stat-container\u003E.container\u003E.cmp-container\u003E.aem-container\u003Ediv:not(:last-child){border-right:1px solid var(--summit-border)}.summit-stat-card{padding:0 40px}.summit-stat .heading-2-v2 .snowflake-title-v2-line:first-child{font-size:64px;line-height:52px;margin-bottom:8px}.summit-stat .heading-2-v2 .snowflake-title-v2-line:last-child{font-size:32px;line-height:30px;margin-bottom:16px}.summit-speaker-card .snowflake-card-v2-advanced-title{margin-bottom:var(--spacing-01)}.summit-add-on-card{padding:24px;border:1px solid #d2d1d4;border-radius:8px}.summit-add-on__subhead{padding-left:40px;padding-right:40px}.partner-card__logo-grid,.partner-card__logo-single{padding:40px}.partner-card__logo-grid .snowflake-image-container .cmp-image__image,.partner-card__logo-single .snowflake-image-container .cmp-image__image{border-radius:0;max-width:240px;margin:0 auto}.partner-card\u003E.container,.partner-card\u003E.container\u003E.aem-container,.partner-card\u003E.container\u003E.cmp-container{height:100%}.summit-add-on-block__content\u003E.container\u003E.cmp-container\u003E.aem-container{display:flex;flex-direction:row;gap:24px;align-items:stretch}.partner-card__logo-grid\u003E.container\u003E.cmp-container\u003E.aem-container{display:flex;flex-direction:row;flex-wrap:wrap;gap:40px 24px;justify-content:center;align-items:center}.partner-card__logo-grid\u003E.container\u003E.cmp-container\u003E.aem-container\u003Ediv{width:calc(33.3333% - 24px);margin:0!important}.partner-card{border-radius:8px;border:1px solid #d2d1d4;overflow:hidden;height:100%;background-color:#fff}.partner-card__header{padding:16px 24px;border-bottom:1px solid #d2d1d4}.partner-card__header.is-purple{background-color:#7d44cf}.partner-card__header h4{display:flex;flex-direction:row!important;align-items:center;gap:12px}.partner-card__header h4::before{vertical-align:middle;content:\"\";display:inline-block;width:20px;height:20px;background-size:contain;background-repeat:no-repeat;background-image:url(\"data:image/svg+xml,%3Csvg width='21' height='23' viewBox='0 0 21 23' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M20.0375 12.8374C20.1644 12.439 20.2172 12.0289 20.2077 11.6237C20.193 11.3305 20.1548 11.0373 20.0712 10.7441C19.8196 9.83306 19.223 9.01989 18.3294 8.50724L5.61817 1.2017C3.82388 .173815 1.53618 .784335 .506483 2.56804C-.533615 4.34915 .0797871 6.62351 1.87408 7.65398L8.97715 11.7427L1.87408 15.8201C.0797871 16.8527 -.531016 19.1271 .506483 20.9156C1.53618 22.6941 3.82388 23.302 5.61817 22.2746L18.3294 14.9643C19.1871 14.4728 19.7693 13.7027 20.0375 12.8374Z' fill='black'/%3E%3C/svg%3E%0A\")}.partner-card__header.is-purple h4::before{background-image:url(\"data:image/svg+xml,%3Csvg width='21' height='23' viewBox='0 0 21 23' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M20.0375 12.8374C20.1644 12.439 20.2172 12.0289 20.2077 11.6237C20.193 11.3305 20.1548 11.0373 20.0712 10.7441C19.8196 9.83306 19.223 9.01989 18.3294 8.50724L5.61817 1.2017C3.82388 .173815 1.53618 .784335 .506483 2.56804C-.533615 4.34915 .0797871 6.62351 1.87408 7.65398L8.97715 11.7427L1.87408 15.8201C.0797871 16.8527 -.531016 19.1271 .506483 20.9156C1.53618 22.6941 3.82388 23.302 5.61817 22.2746L18.3294 14.9643C19.1871 14.4728 19.7693 13.7027 20.0375 12.8374Z' fill='white'/%3E%3C/svg%3E%0A\")}.sf-blue-mountains{background-size:90% auto;background-repeat:no-repeat;background-position:center bottom;background-image:url(\"data:image/svg+xml,%3Csvg width='1361' height='410' viewBox='0 0 1361 410' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M1360.25 410L1065.53 114.309L976.256 203.875L773.049 0L364.393 410H1360.25Z' fill='%233AA8DF'/%3E%3Cpath d='M274.778 410L137.467 272.238L.15625 410H274.778Z' fill='%233AA8DF'/%3E%3C/svg%3E%0A\")}.bwalignr,.main-pr-body .bwalignr{text-align:right}.bwblockalignl{margin-left:0;margin-right:auto}.bwcellpmargin{margin-top:0;margin-bottom:0}.bwlistdisc{list-style-type:disc}.bwpadb3{padding-bottom:4px}.bwpadb4{padding-bottom:5px}.bwpadl0{padding-left:0}.bwpadl3{padding-left:15px}.bwpadl6{padding-left:30px}.bwpadl9{padding-left:45px}.bwpadl12{padding-left:60px}.bwpadr0{padding-right:0}.bwtablemarginb{margin-bottom:10px}.bwvertalignb{vertical-align:bottom}.bwvertalignt{vertical-align:top}.bwsinglebottom{border-bottom:1pt solid #000}.bwdoublebottom{border-bottom:2.25pt double #000}.bwwidth1{width:1%}.bwwidth2{width:2%}.bwwidth6{width:6%}.bwwidth7{width:7%}.bwwidth8{width:8%}.bwwidth10{width:10%}.bwwidth12{width:12%}.bwwidth32{width:32%}.bwwidth44{width:44%}.bwwidth72{width:72%}.bwwidth97{width:97%}.main-pr-body{font-size:18px;line-height:26px}.main-pr-body img{display:block;width:100%;height:auto!important;border-radius:var(--small-border-radius)}.main-pr-body table{width:100%;display:block}.main-pr-body tbody{background-color:#f7f7f7}.main-pr-body .bwsinglebottom{border-bottom:1pt solid #000!important}.main-pr-body td.bwwidth44{padding-right:40px}.main-pr-body .bw-release-story{font-family:Lato,sans-serif}.main-pr-body .bw-release-story sup,.snowflake-mega-nav-dropdown-header-content-right a{white-space:nowrap}.main-pr-body .bw-release-story\u003E*,.main-pr-body\u003Espan\u003E*{margin-bottom:2rem!important}.snowflake-text.main-pr-body tbody,.snowflake-text.main-pr-body tbody p{font-size:14px!important;line-height:20px!important;width:100%;display:block}.press-body .snowflake-flexible-column-container-items{gap:var(--spacing-08)}.about-snowflake{border:1px solid #ccc;background-color:var(--ui-background-05);padding:24px;border-radius:8px;margin-top:0}.about-snowflake__logo{max-width:140px;margin-top:16px}.hero--press .snowflake-hero-system-inner{max-width:1408px;margin:0 auto!important}#arcticNavItem{flex-direction:column}#arcticNavItem::before{content:\"Featured Open Source Technologies\";display:block;margin-top:48px;margin-bottom:24px;font-size:16px!important;line-height:16px!important;font-weight:800!important;text-transform:uppercase}@media screen and (min-width:768px){.sc-hero__inner\u003E.snowflake-flexible-column-container-items\u003Ediv:last-child{position:relative;height:100%;top:auto;left:auto;width:auto}.sc-hero__inner\u003E.snowflake-flexible-column-container-items\u003Ediv:last-child::before{background:linear-gradient(180deg,#202c35 -7.5%,#fff0 51.25%,#202c35 107.69%)}.sc-hero__byline\u003Espan{display:flex;flex-wrap:wrap}.sc-hero__byline p:not(:last-child)::after{content:\"|\";margin:0 12px;opacity:.5}.sc-hero__button-container .snowflake-flexible-column-container-items{position:absolute;bottom:0;padding:0;margin:0 24px 0 0}.sc-hero__button-container .hero-watch-the-demo{padding:12px 16px!important;float:right;margin-bottom:48px;background-color:rgb(35 45 54 / .8)}.summit-overview-stat{padding:0 40px}.summit-timeline{border-bottom:3px solid var(--ui-01);margin-bottom:64px}.summit-add-on-block__content,.summit-pricing-block__content{padding:0 40px 40px}#arcticNavItem::before{font-size:12px!important;margin-bottom:8px;margin-top:16px}.snowflake-mega-nav-nav-item-title-wrapper\u003E.snowflake-mega-nav-nav-item-title{line-height:20px!important}.snowflake-card .heading-2.snowflake-title-line{font-size:24px!important;line-height:28px!important}}@media screen and (min-width:992px){.hp-hero__eyebrow a{gap:12px;margin-left:0;margin-right:0}.hp-hero__eyebrow a::after{content:\"\";background-image:url(\"data:image/svg+xml,%3Csvg width='6' height='11' viewBox='0 0 6 11' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M5.49134 5.79438C5.53447 5.75922 5.56923 5.71489 5.5931 5.66463C5.61697 5.61436 5.62935 5.55941 5.62935 5.50376C5.62935 5.44811 5.61697 5.39316 5.5931 5.34289C5.56923 5.29263 5.53447 5.2483 5.49134 5.21314L.736339 .413136C.522589 .203135 .331339 .203135 .151339 .413136C-.0286612 .623135 -.0586612 .818135 .151339 .994386L4.48634 5.50188L.155089 9.97938C.107068 10.0142 .0679743 10.0598 .0410153 10.1126C.0140562 10.1654 0 10.2238 0 10.2831C0 10.3424 .0140562 10.4009 .0410153 10.4537C.0679743 10.5065 .107068 10.5521 .155089 10.5869C.335089 10.7969 .530089 10.7969 .740089 10.5869L5.49134 5.79438Z' fill='black'/%3E%3C/svg%3E%0A\");display:inline-block;width:12px;height:12px;background-repeat:no-repeat;background-size:auto 100%;background-position:left center}.promo-banner--homepage{padding-top:32px}.homepage-banner-offset-container::after{height:50%}#storyHighlights{padding:2rem}.body-display-v2.snowflake-quote-item-quote-text{line-height:28px!important}.snowflake-hero-system-headline .heading-1-v2{line-height:48px;font-size:54px!important}.sc-overview__webinar-promo-banner .snowflake-content-chip-content{flex-direction:row;justify-content:space-between;align-items:center;width:100%}.sc-overview__webinar-promo-banner .snowflake-content-chip-content .heading-5-v2{flex-direction:row}.sc-overview__webinar-promo-banner .snowflake-content-chip-content .snowflake-title-v2-line:not(:first-child)::before{content:\"|\";margin:0 6px}.sc-cert-banner{padding:40px}.sc-cert-banner\u003E.container\u003E.cmp-container\u003E.aem-container\u003Ediv{margin:0!important;width:50%}.sc-cert-banner\u003E.container\u003E.cmp-container\u003E.aem-container\u003Ediv:first-child{flex-grow:1;padding-right:24px}.sc-cert-banner\u003E.container\u003E.cmp-container\u003E.aem-container\u003Ediv:last-child{max-width:240px}.summit-pricing-block__content\u003E.container\u003E.cmp-container\u003E.aem-container\u003Ediv:last-child{width:70%;padding-left:40px}.summit-pricing-block__content\u003E.container\u003E.cmp-container\u003E.aem-container\u003Ediv:first-child{width:30%}.summit-add-on-block__content\u003E.container\u003E.cmp-container\u003E.aem-container\u003Ediv{width:calc(33.3333% - 24px);margin:0!important;display:flex}.summit-pricing-block__tile .snowflake-content-chip-content{display:flex;flex-direction:row;align-items:center;width:calc(100% - 200px)}.summit-pricing-block__tile .heading-5-v2 span.snowflake-title-v2-line:last-child{position:absolute;top:50%;transform:translate(0,-50%);right:40px}.press-body\u003E.snowflake-flexible-column-container-items\u003Ediv:last-child{position:sticky;top:120px}.snowflake-mega-nav-navigation-title:hover{color:var(--ui-01)}}@media screen and (min-width:1024px){.about-snowflake{padding:28px}.about-snowflake__logo{max-width:none;padding:0 0 0 48px;margin-bottom:0}.hero--press .snowflake-hero-system-layout-70-30 .snowflake-hero-system-content-container{width:85%}.snowflake-hero-system{padding-bottom:var(--spacing-04);padding-top:var(--spacing-07)}.hero--press .display-2-v2{font-size:64px;line-height:56px}.about-snowflake\u003E.container\u003E.cmp-container\u003E.aem-container{flex-direction:row;flex-wrap:nowrap;align-items:center}.about-snowflake\u003E.container\u003E.cmp-container\u003E.aem-container\u003Ediv:last-child{max-width:280px}.about-snowflake\u003E.container\u003E.cmp-container\u003E.aem-container\u003Ediv:first-child{flex-grow:1;margin-bottom:0!important}#polarisNavItem{margin-top:40px}.snowflake-mega-nav-nav-item-description{line-height:18px!important}.snowflake-mega-nav-column-items{gap:var(--spacing-01);grid-gap:var(--spacing-01)}.snowflake-mega-nav-navigation-title{text-transform:none}}div[id*=blueIcon] .snowflake-mega-nav-nav-item-icon__inner{background:var(--ui-01);padding:8px}div[id*=blueIcon]:hover .snowflake-mega-nav-nav-item-icon__inner{background:var(--ui-01)!important}.snowflake-mega-nav-nav-item-icon__inner{border-radius:4px;background:var(--ui-background-05);padding:6px}.snowflake-mega-nav-nav-item:hover .snowflake-mega-nav-nav-item-icon__inner{background:#fff!important}.snowflake-mega-nav-nav-item-icon.snowflake-image-container{height:40px;width:40px}.snowflake-mega-nav-dropdown-footer-links\u003E.snowflake-button-link\u003E.snowflake-button-container{font-size:16px!important;font-family:Texta!important;font-weight:800!important}.snowflake-mega-nav-dropdown-footer-icon.snowflake-image-container{margin-right:8px;width:40px!important;height:40px!important}#viewAllCapabilities a:hover{background:0 0!important}#platformFooter .snowflake-title-v2 .snowflake-title-v2-line:last-child{font-family:Lato;font-size:14px;font-weight:500}#platformFooter .snowflake-mega-nav-dropdown-footer-links{flex-grow:1;justify-content:flex-end;align-items:center}#platformFooter .snowflake-mega-nav-dropdown-footer-content{flex-direction:row}#offset,#open-source{flex-direction:column;border-top:1px solid #ccc}#offset::before,#open-source::before{content:\" \";display:block;width:100%;font-weight:800!important;font-size:12px!important;line-height:14px;text-transform:uppercase;white-space:nowrap;margin-top:16px;margin-bottom:8px}#open-source::before{content:\"Open Source Technologies\"}.snowflake-mega-nav-dropdown-menu-close-button{margin:var(--spacing-04) 0 var(--spacing-03)}.snowflake-mega-nav-column{gap:var(--spacing-02)!important}.snowflake-mega-nav-nav-item\u003Ea{width:100%;margin-left:-8px;padding:8px;border-radius:4px}.snowflake-mega-nav-nav-item\u003Ea:hover{background-color:var(--ui-background-05)}.snowflake-mega-nav-nav-item-description{margin-top:2px;display:block}#promobanner_overflowBottomDarkBlue::before{content:'';display:block;position:absolute;bottom:0;left:0;width:100%;height:50%;background:#212d35}#promobanner_overflowTopDarkBlue::before{content:'';display:block;position:absolute;top:0;left:0;width:100%;height:50%;background:#212d35}.overview-card\u003Ediv{box-shadow:0 0 14px 0 rgba(0,0,0,.10);background-color:#fff;border-radius:16px;overflow:hidden}.overview-card-text{padding:40px}.overview-card-image img{border-radius:0 !important}.overview-card-text h3,.overview-card-text .heading-3-v2{font-size:18px;line-height:1.1;margin-top:0}","isGSAPEnabled":false,":type":"snowflake-site/components/markup-editor"},"mega_header":{"additionalClasses":"heap-nav-header","layout":"SIMPLE","id":"container-9fbf0c8b8d",":type":"snowflake-site/components/mega-header",":items":{"nav_mega":{"activeItem":"item_1719963657751_c_663444255","id":"tabs-c7f1d7aa3f",":type":"snowflake-site/components/nav/nav-mega",":items":{"item_1719963657751_c_663444255":{"id":"nav-dropdown-menu-87a975eafd","enableDropdown":true,"nav_column_container":{"layout":"SIMPLE","id":"container-998809d462",":type":"snowflake-site/components/nav/nav-column/nav-column-container",":items":{"nav_column":{"additionalClasses":"nav-platform-sidebar","numberOfSubColumns":"one-column","minWidth":"230","maxWidth":"350","layout":"SIMPLE","id":"container-a747e5b0ee",":type":"snowflake-site/components/nav/nav-column",":items":{"nav_item_copy_copy_2_793631646":{"id":"nav-item-713e6d4055","additionalClasses":"nav-item__platform-parent is-platform","linkDescription":"Develop AI products, apps and more on a fully managed platform that securely connects businesses globally — across any type or scale of data.","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/product/platform/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_INTERNAL",":type":"snowflake-site/components/button","text":"The Snowflake Platform"},":type":"snowflake-site/components/nav/nav-item"},"nav_item":{"id":"nav-item-847b06bee4","additionalClasses":"nav-item nav-item--si is-si","linkDescription":"All your knowledge. One trusted enterprise agent.","flag":"NOW GA","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/product/snowflake-cowork/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_INTERNAL",":type":"snowflake-site/components/button","text":"Snowflake CoWork"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy_copy_2_836345186":{"id":"nav-item-40128ba8fd","additionalClasses":"blue-icon is-analytics","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/product/analytics/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_INTERNAL",":type":"snowflake-site/components/button","text":"Analytics"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy_copy_2":{"id":"nav-item-127f2c0b7a","additionalClasses":"blue-icon is-ai","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/product/ai/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_INTERNAL",":type":"snowflake-site/components/button","text":"AI"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy_copy_2_1314771042":{"id":"nav-item-26d1fb4263","additionalClasses":"blue-icon is-data-eng","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/product/data-engineering/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_INTERNAL",":type":"snowflake-site/components/button","text":"Data Engineering"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy_144634":{"id":"nav-item-f3a7464f5f","additionalClasses":"blue-icon is-apps-collab","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/product/applications-and-collaboration/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_INTERNAL",":type":"snowflake-site/components/button","text":"Applications & Collaboration"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy_144634_2013333117":{"id":"nav-item-4b82877983","additionalClasses":"blue-icon is-transactions","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/product/transactions/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_INTERNAL",":type":"snowflake-site/components/button","text":"Transactions"},":type":"snowflake-site/components/nav/nav-item"}},":itemsOrder":["nav_item_copy_copy_2_793631646","nav_item","nav_item_copy_copy_2_836345186","nav_item_copy_copy_2","nav_item_copy_copy_2_1314771042","nav_item_copy_144634","nav_item_copy_144634_2013333117"]},"nav_column_copy_copy":{"additionalClasses":"meganav-platform-features","navColumnTitle":"Featured Capabilities","numberOfSubColumns":"one-column","layout":"SIMPLE","id":"container-854876d0cd",":type":"snowflake-site/components/nav/nav-column",":items":{"nav_item_copy_212715":{"id":"nav-item-3238b6a382","additionalClasses":"is-cortex-code","linkDescription":"Snowflake-native AI coding agent ","flag":"New","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/product/snowflake-coco/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_INTERNAL",":type":"snowflake-site/components/button","text":"Snowflake CoCo"},":type":"snowflake-site/components/nav/nav-item"},"nav_item":{"id":"nav-item-a2aa51071a","additionalClasses":"is-cortex-ai","linkDescription":"Instant access to industry-leading LLMs","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"https://www.snowflake.com/en/product/features/cortex/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_EXTERNAL",":type":"snowflake-site/components/button","text":"Cortex AI"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy_660590635":{"id":"nav-item-4ce773b499","additionalClasses":"is-marketplace","linkDescription":"Third-party data sources connected within minutes","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"https://www.snowflake.com/en/product/features/marketplace/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_EXTERNAL",":type":"snowflake-site/components/button","text":"Marketplace"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy_660590":{"id":"nav-item-4bf1c0b4ef","additionalClasses":"is-snowpark","linkDescription":"Libraries and code execution environments that run Python and more","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"https://www.snowflake.com/en/product/features/snowpark/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_EXTERNAL",":type":"snowflake-site/components/button","text":"Snowpark"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy_660590_983061516":{"id":"nav-item-6ad9c909a1","additionalClasses":"is-streamlit","linkDescription":"Framework for transforming Python scripts into web apps","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"https://www.snowflake.com/en/product/features/streamlit-in-snowflake/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_EXTERNAL",":type":"snowflake-site/components/button","text":"Streamlit"},":type":"snowflake-site/components/nav/nav-item"}},":itemsOrder":["nav_item_copy_212715","nav_item","nav_item_copy_660590635","nav_item_copy_660590","nav_item_copy_660590_983061516"]},"nav_column_692142673":{"navColumnTitle":" ","numberOfSubColumns":"one-column","layout":"SIMPLE","id":"container-cc57c76278",":type":"snowflake-site/components/nav/nav-column",":items":{"nav_item_copy_660590_1739526127":{"id":"nav-item-c7867a5c59","additionalClasses":"is-postgres","linkDescription":"Fully compatible open source Postgres running on Snowflake","flag":"Now GA","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/product/features/postgres/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_INTERNAL",":type":"snowflake-site/components/button","text":"Postgres"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy_185565":{"id":"nav-item-e8f302d1c3","additionalClasses":"is-dcr","linkDescription":"Streamlined model development and MLOps from a centralized UI","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/product/features/end-to-end-ml-workflows/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_INTERNAL",":type":"snowflake-site/components/button","text":"Snowflake ML"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy_212715":{"id":"nav-item-8fb9e849b2","additionalClasses":"is-openflow","linkDescription":"Effortless data movement for integrations","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"https://www.snowflake.com/en/product/features/openflow/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_EXTERNAL",":type":"snowflake-site/components/button","text":"Openflow"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy_660590":{"id":"nav-item-16b7ba4c04","additionalClasses":"is-notebooks","linkDescription":"Interactive dev environment for data and AI teams","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"https://www.snowflake.com/en/product/features/notebooks/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_EXTERNAL",":type":"snowflake-site/components/button","text":"Notebooks"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_258535199":{"id":"nav-item-a16c5db29c","propertiesId":"workload-nav-1","additionalClasses":"is-native-apps","linkDescription":"End-to-end, Snowflake-native app creation and distribution","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"https://www.snowflake.com/en/product/features/native-apps/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_EXTERNAL",":type":"snowflake-site/components/button","text":"Native Apps"},":type":"snowflake-site/components/nav/nav-item"}},":itemsOrder":["nav_item_copy_660590_1739526127","nav_item_copy_185565","nav_item_copy_212715","nav_item_copy_660590","nav_item_258535199"]},"nav_column_782221091":{"navColumnTitle":" ","numberOfSubColumns":"one-column","layout":"SIMPLE","id":"container-2b5a7f94cb",":type":"snowflake-site/components/nav/nav-column",":items":{"nav_item_copy":{"id":"nav-item-222520bc29","additionalClasses":"is-light-gray-icon is-horizon-catalog","linkDescription":"Universal AI catalog","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/product/features/horizon/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_INTERNAL",":type":"snowflake-site/components/button","text":"Horizon Catalog"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy_660590_1293798742":{"id":"nav-item-972520e96a","additionalClasses":"is-snowflake-ml","linkDescription":"Governed context layer that keeps AI, BI and data apps working from one truth","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/product/features/horizon-context/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_INTERNAL",":type":"snowflake-site/components/button","text":"Horizon Context"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_511717659_c":{"id":"nav-item-4f69d27258","additionalClasses":"is-unistore","linkDescription":"Unify transactional and analytical workloads in Snowflake for enhanced simplicity","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/product/features/unistore/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_INTERNAL",":type":"snowflake-site/components/button","text":"Unistore"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_511717659_c_1443811525":{"id":"nav-item-073e5ebead","additionalClasses":"is-observe","linkDescription":"AI-powered observability for faster production troubleshooting","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/product/observe/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_INTERNAL",":type":"snowflake-site/components/button","text":"Observe"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_511717659_c_1006104884":{"id":"nav-item-8074e7bfca","additionalClasses":"is-observe","linkDescription":"Use any engine on a single governed data copy","flag":"Now GA","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/product/use-cases/interoperable-lakehouse/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_INTERNAL",":type":"snowflake-site/components/button","text":"Interoperable Lakehouse"},":type":"snowflake-site/components/nav/nav-item"}},":itemsOrder":["nav_item_copy","nav_item_copy_660590_1293798742","nav_item_511717659_c","nav_item_511717659_c_1443811525","nav_item_511717659_c_1006104884"]}},":itemsOrder":["nav_column","nav_column_copy_copy","nav_column_692142673","nav_column_782221091"]},":type":"snowflake-site/components/nav/nav-dropdown-menu","cq:panelTitle":"Product"},"nav_dropdown_menu_2":{"id":"nav-dropdown-menu-ed87eb4097","enableDropdown":true,"nav_column_container":{"layout":"SIMPLE","id":"container-3fbfa4acd7",":type":"snowflake-site/components/nav/nav-column/nav-column-container",":items":{"nav_column":{"navColumnTitle":"INDUSTRIES","numberOfSubColumns":"one-column","minWidth":"280","layout":"SIMPLE","id":"container-c806c9d3fa",":type":"snowflake-site/components/nav/nav-column",":items":{"nav_item_copy_361384_2056203141":{"id":"nav-item-7d8d276721","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/solutions/industries/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_INTERNAL",":type":"snowflake-site/components/button","text":"All Industries"},":type":"snowflake-site/components/nav/nav-item"},"nav_item":{"id":"nav-item-8bb5f949b3","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/solutions/industries/advertising-media-entertainment/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_INTERNAL",":type":"snowflake-site/components/button","text":"Advertising, Media & Entertainment"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy":{"id":"nav-item-641109ace6","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/solutions/industries/financial-services/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_INTERNAL",":type":"snowflake-site/components/button","text":"Financial Services"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy_1970515619":{"id":"nav-item-cbf2c712cb","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/solutions/industries/healthcare-and-life-sciences/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_INTERNAL",":type":"snowflake-site/components/button","text":"Healthcare & Life Sciences"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy_1533429516":{"id":"nav-item-ca2f878480","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/solutions/industries/manufacturing/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_INTERNAL",":type":"snowflake-site/components/button","text":"Manufacturing"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy_1444458226":{"id":"nav-item-2df4b73c3b","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/solutions/industries/public-sector/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_INTERNAL",":type":"snowflake-site/components/button","text":"Public Sector"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy_1149488919":{"id":"nav-item-666c92154d","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/solutions/industries/retail-consumer-goods/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_INTERNAL",":type":"snowflake-site/components/button","text":"Retail & Consumer Goods"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy_57417040":{"id":"nav-item-b13ddc56fa","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/solutions/industries/technology/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_INTERNAL",":type":"snowflake-site/components/button","text":"Technology"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy_361384674":{"id":"nav-item-19a45e599c","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/solutions/industries/telecom/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_INTERNAL",":type":"snowflake-site/components/button","text":"Telecom"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy_361384":{"id":"nav-item-c8ce06c660","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/solutions/industries/travel-hospitality/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_INTERNAL",":type":"snowflake-site/components/button","text":"Travel & Hospitality"},":type":"snowflake-site/components/nav/nav-item"}},":itemsOrder":["nav_item_copy_361384_2056203141","nav_item","nav_item_copy","nav_item_copy_1970515619","nav_item_copy_1533429516","nav_item_copy_1444458226","nav_item_copy_1149488919","nav_item_copy_57417040","nav_item_copy_361384674","nav_item_copy_361384"],"appliedCssClassNames":"snowflake-responsive-container-inner-padding-extra-small"},"nav_column_copy":{"navColumnTitle":"DEPARTMENTS","numberOfSubColumns":"one-column","minWidth":"160","layout":"SIMPLE","id":"container-e0dcd6b120",":type":"snowflake-site/components/nav/nav-column",":items":{"nav_item":{"id":"nav-item-a680a98bb6","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"https://www.snowflake.com/en/solutions/departments/finance/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_EXTERNAL",":type":"snowflake-site/components/button","text":"Finance"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy":{"id":"nav-item-bdf274e837","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"https://www.snowflake.com/en/solutions/departments/information-technology/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_EXTERNAL",":type":"snowflake-site/components/button","text":"IT"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy_1970515619":{"id":"nav-item-a24a7d37a3","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"https://www.snowflake.com/en/solutions/departments/marketing/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_EXTERNAL",":type":"snowflake-site/components/button","text":"Marketing"},":type":"snowflake-site/components/nav/nav-item"}},":itemsOrder":["nav_item","nav_item_copy","nav_item_copy_1970515619"]},"nav_column_833417450":{"navColumnTitle":"Enablement Solutions","numberOfSubColumns":"one-column","layout":"SIMPLE","id":"container-9fa18f94a6",":type":"snowflake-site/components/nav/nav-column",":items":{"nav_item_copy_107772":{"id":"nav-item-79e1fc12dd","linkDescription":"Confident migration to a unified platform","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/migrate-to-the-cloud/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_INTERNAL",":type":"snowflake-site/components/button","text":"Migrate to the AI Data Cloud"},"icon":{"id":"icon","alt":"Cloud icon","src":"https://www.snowflake.com/content/experience-fragments/snowflake-site/language-masters/en/site/mega-nav-header/master/_jcr_content/root/mega_header/nav_mega/nav_dropdown_menu_2/nav_column_container/nav_column_833417450/nav_item_copy_107772/icon.coreimg.svg/1723828484100/nav-icon-cloud.svg","lazyEnabled":true,"width":"64","height":"64",":type":"snowflake-site/components/image"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy_copy":{"id":"nav-item-768111427e","linkDescription":"Snowflake experts to help you accelerate and achieve business goals","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/solutions/services-delivery/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_INTERNAL",":type":"snowflake-site/components/button","text":"Services Delivery"},"icon":{"id":"icon","alt":"Migrate icon","src":"https://www.snowflake.com/content/experience-fragments/snowflake-site/language-masters/en/site/mega-nav-header/master/_jcr_content/root/mega_header/nav_mega/nav_dropdown_menu_2/nav_column_container/nav_column_833417450/nav_item_copy_copy/icon.coreimg.svg/1768354429188/nav-icon--migrate.svg","lazyEnabled":true,"width":"64","height":"64",":type":"snowflake-site/components/image"},":type":"snowflake-site/components/nav/nav-item"}},":itemsOrder":["nav_item_copy_107772","nav_item_copy_copy"]},"nav_column_copy_copy":{"navColumnTitle":"PARTNER SOLUTIONS","numberOfSubColumns":"one-column","layout":"SIMPLE","id":"container-d4acb08d1b",":type":"snowflake-site/components/nav/nav-column",":items":{"nav_item":{"id":"nav-item-ccb5eee731","linkDescription":"Programs with product, solutions and cloud partners","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/why-snowflake/partners/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_INTERNAL",":type":"snowflake-site/components/button","text":"Snowflake Partner Network"},"icon":{"id":"icon","alt":"Partner Network icon","src":"https://www.snowflake.com/content/experience-fragments/snowflake-site/language-masters/en/site/mega-nav-header/master/_jcr_content/root/mega_header/nav_mega/nav_dropdown_menu_2/nav_column_container/nav_column_copy_copy/nav_item/icon.coreimg.svg/1723828498700/nav-icon--partner-network.svg","lazyEnabled":true,"width":"64","height":"64",":type":"snowflake-site/components/image"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy":{"id":"nav-item-92f292886d","linkDescription":"Partners, apps and solutions for enhanced deployment","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/why-snowflake/partners/all-partners/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_INTERNAL",":type":"snowflake-site/components/button","text":"Partner Finder"},"icon":{"id":"icon","alt":"Partner Finder icon","src":"https://www.snowflake.com/content/experience-fragments/snowflake-site/language-masters/en/site/mega-nav-header/master/_jcr_content/root/mega_header/nav_mega/nav_dropdown_menu_2/nav_column_container/nav_column_copy_copy/nav_item_copy/icon.coreimg.svg/1726173927645/nav-icon--partner-finder.svg","lazyEnabled":true,"width":"64","height":"64",":type":"snowflake-site/components/image"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy_1970515619":{"id":"nav-item-7fa487d7a8","linkDescription":"Live and virtual events","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/why-snowflake/partners/event-partnership-opportunities/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_INTERNAL",":type":"snowflake-site/components/button","text":"Event Partnership Opportunities"},"icon":{"id":"icon","alt":"Calendar icon","src":"https://www.snowflake.com/content/experience-fragments/snowflake-site/language-masters/en/site/mega-nav-header/master/_jcr_content/root/mega_header/nav_mega/nav_dropdown_menu_2/nav_column_container/nav_column_copy_copy/nav_item_copy_1970515619/icon.coreimg.svg/1726173935655/nav-icon--events.svg","lazyEnabled":true,"width":"64","height":"64",":type":"snowflake-site/components/image"},":type":"snowflake-site/components/nav/nav-item"}},":itemsOrder":["nav_item","nav_item_copy","nav_item_copy_1970515619"]}},":itemsOrder":["nav_column","nav_column_copy","nav_column_833417450","nav_column_copy_copy"]},":type":"snowflake-site/components/nav/nav-dropdown-menu","cq:panelTitle":"Solutions"},"item_1719963657751_c":{"id":"nav-dropdown-menu-5853ee40bb","enableDropdown":true,"nav_column_container":{"layout":"SIMPLE","id":"container-347219ac33",":type":"snowflake-site/components/nav/nav-column/nav-column-container",":items":{"nav_column":{"numberOfSubColumns":"one-column","minWidth":"230","maxWidth":"350","layout":"SIMPLE","id":"container-0649c17526",":type":"snowflake-site/components/nav/nav-column",":items":{"nav_item_copy_copy_2_793631646":{"id":"nav-item-995af45a5b","additionalClasses":"nav-item__platform-parent-why-sf","linkDescription":"Collaborate locally and globally to reveal new insights, create previously unforeseen business opportunities, and identify your customers with seamless experiences.","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/why-snowflake/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_INTERNAL",":type":"snowflake-site/components/button","text":"Why Snowflake"},":type":"snowflake-site/components/nav/nav-item"}},":itemsOrder":["nav_item_copy_copy_2_793631646"]},"nav_column_copy_copy":{"additionalClasses":"meganav-platform-features","numberOfSubColumns":"two-columns","maxWidth":"1200","layout":"SIMPLE","id":"container-610a368e0b",":type":"snowflake-site/components/nav/nav-column",":items":{"nav_item":{"id":"nav-item-6c3a884d09","propertiesId":"testID","linkDescription":"Case studies and videos showcasing how global organizations use Snowflake","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/customers/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_INTERNAL",":type":"snowflake-site/components/button","text":"Customers"},"icon":{"id":"icon","alt":"Customer icon","src":"https://www.snowflake.com/content/experience-fragments/snowflake-site/language-masters/en/site/mega-nav-header/master/_jcr_content/root/mega_header/nav_mega/item_1719963657751_c/nav_column_container/nav_column_copy_copy/nav_item/icon.coreimg.svg/1739839279367/nav-icon--partner-network.svg","lazyEnabled":true,"width":"64","height":"64",":type":"snowflake-site/components/image"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_258535199":{"id":"nav-item-31990ccd62","propertiesId":"workload-nav-1","linkDescription":"Learn how to connect, share and integrate the data and apps on the AI Data Cloud","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/why-snowflake/what-is-data-cloud/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_INTERNAL",":type":"snowflake-site/components/button","text":"The AI Data Cloud Explained"},"icon":{"id":"icon","alt":"Cloud icon","src":"https://www.snowflake.com/content/experience-fragments/snowflake-site/language-masters/en/site/mega-nav-header/master/_jcr_content/root/mega_header/nav_mega/item_1719963657751_c/nav_column_container/nav_column_copy_copy/nav_item_258535199/icon.coreimg.svg/1739840490955/nav-icon-cloud.svg","lazyEnabled":true,"width":"64","height":"64",":type":"snowflake-site/components/image"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy_185565":{"id":"nav-item-72026dfd5b","linkDescription":"Comprehensive security through built-in features, robust cloud infrastructure protection, and more","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/why-snowflake/snowflake-security-hub/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_INTERNAL",":type":"snowflake-site/components/button","text":"Security Hub"},"icon":{"id":"icon","alt":"User with security lock icon","src":"https://www.snowflake.com/content/experience-fragments/snowflake-site/language-masters/en/site/mega-nav-header/master/_jcr_content/root/mega_header/nav_mega/item_1719963657751_c/nav_column_container/nav_column_copy_copy/nav_item_copy_185565/icon.coreimg.svg/1758909528089/user-security-admins-ciso-icon.svg","lazyEnabled":true,"width":"64","height":"64",":type":"snowflake-site/components/image"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy":{"id":"nav-item-7f1881a271","additionalClasses":"is-light-gray-icon","linkDescription":"Maximize economic value through minimizing TCO and continuously optimizing price for performance","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/pricing-options/cost-and-performance-optimization/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_INTERNAL",":type":"snowflake-site/components/button","text":"Cost and Performance Optimization"},"icon":{"id":"icon","alt":"Cost Optimization icon","src":"https://www.snowflake.com/content/experience-fragments/snowflake-site/language-masters/en/site/mega-nav-header/master/_jcr_content/root/mega_header/nav_mega/item_1719963657751_c/nav_column_container/nav_column_copy_copy/nav_item_copy/icon.coreimg.svg/1758909542267/nav-icon-cost-optimization-performance.svg","lazyEnabled":true,"width":"64","height":"64",":type":"snowflake-site/components/image"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy_185565_903555964":{"id":"nav-item-8cc47214cb","linkDescription":"Startups building applications in the AI Data Cloud","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/why-snowflake/startup-program/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_INTERNAL",":type":"snowflake-site/components/button","text":"Snowflake for Startups"},"icon":{"id":"icon","alt":"Launch","src":"https://www.snowflake.com/content/experience-fragments/snowflake-site/language-masters/en/site/mega-nav-header/master/_jcr_content/root/mega_header/nav_mega/item_1719963657751_c/nav_column_container/nav_column_copy_copy/nav_item_copy_185565_903555964/icon.coreimg.svg/1758732224323/launch.svg","lazyEnabled":true,"width":"65","height":"64",":type":"snowflake-site/components/image"},":type":"snowflake-site/components/nav/nav-item"}},":itemsOrder":["nav_item","nav_item_258535199","nav_item_copy_185565","nav_item_copy","nav_item_copy_185565_903555964"]}},":itemsOrder":["nav_column","nav_column_copy_copy"]},":type":"snowflake-site/components/nav/nav-dropdown-menu","cq:panelTitle":"Why Snowflake"},"item_1719961362824":{"id":"nav-dropdown-menu-2bc0c03d42","enableDropdown":true,"nav_column_container":{"layout":"SIMPLE","id":"container-60364836c8",":type":"snowflake-site/components/nav/nav-column/nav-column-container",":items":{"nav_column_copy":{"navColumnTitle":"Connect","numberOfSubColumns":"one-column","minWidth":"124","layout":"SIMPLE","id":"container-7aed43394c",":type":"snowflake-site/components/nav/nav-column",":items":{"nav_item":{"id":"nav-item-b1c0cef9c0","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/blog/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_INTERNAL",":type":"snowflake-site/components/button","text":"Blog"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_180298689":{"id":"nav-item-2a0d15c6ff","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/events/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_INTERNAL",":type":"snowflake-site/components/button","text":"Events"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_1639361946":{"id":"nav-item-8f5bd46a4a","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"https://www.snowflake.com/en/support/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_EXTERNAL",":type":"snowflake-site/components/button","text":"Support"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_680912746":{"id":"nav-item-98297c4f5f","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"https://www.snowflake.com/en/contact/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_EXTERNAL",":type":"snowflake-site/components/button","text":"Contact us"},":type":"snowflake-site/components/nav/nav-item"}},":itemsOrder":["nav_item","nav_item_180298689","nav_item_1639361946","nav_item_680912746"]},"nav_column_44600420__826130542":{"navColumnTitle":"Learn","numberOfSubColumns":"two-columns","layout":"SIMPLE","id":"container-71e6e9458e",":type":"snowflake-site/components/nav/nav-column",":items":{"nav_item_copy":{"id":"nav-item-6f44fb26f7","linkDescription":"Ebooks, videos, white papers and more","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/resources/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_INTERNAL",":type":"snowflake-site/components/button","text":"Resource Library"},"icon":{"id":"icon","alt":"Notebooks icon","src":"https://www.snowflake.com/content/experience-fragments/snowflake-site/language-masters/en/site/mega-nav-header/master/_jcr_content/root/mega_header/nav_mega/item_1719961362824/nav_column_container/nav_column_44600420__826130542/nav_item_copy/icon.coreimg.svg/1736877128196/nav-icon--notebooks.svg","lazyEnabled":true,"width":"64","height":"64",":type":"snowflake-site/components/image"},":type":"snowflake-site/components/nav/nav-item"},"nav_item":{"id":"nav-item-6279ecf709","linkDescription":"Overview of Snowflake's educational offerings","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"https://www.snowflake.com/en/resources/learn/training/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_EXTERNAL",":type":"snowflake-site/components/button","text":"Training"},"icon":{"id":"icon","alt":"Training icon","src":"https://www.snowflake.com/content/experience-fragments/snowflake-site/language-masters/en/site/mega-nav-header/master/_jcr_content/root/mega_header/nav_mega/item_1719961362824/nav_column_container/nav_column_44600420__826130542/nav_item/icon.coreimg.svg/1722385094416/nav-icon--training.svg","lazyEnabled":true,"width":"64","height":"64",":type":"snowflake-site/components/image"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy_144634_1984107859":{"id":"nav-item-591e974bb7","linkDescription":"Expert-led discussions and demos across industries and use cases","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/webinars/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_INTERNAL",":type":"snowflake-site/components/button","text":"Webinars"},"icon":{"id":"icon","alt":"Webinars icon","src":"https://www.snowflake.com/content/experience-fragments/snowflake-site/language-masters/en/site/mega-nav-header/master/_jcr_content/root/mega_header/nav_mega/item_1719961362824/nav_column_container/nav_column_44600420__826130542/nav_item_copy_144634_1984107859/icon.coreimg.svg/1759424691990/nav-icon--webinars.svg","lazyEnabled":true,"width":"64","height":"64",":type":"snowflake-site/components/image"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy_1438098918":{"id":"nav-item-744717fcd9","linkDescription":"Snowflake's technical industry professional certifications","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"https://www.snowflake.com/en/resources/learn/certifications/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_EXTERNAL",":type":"snowflake-site/components/button","text":"Certifications"},"icon":{"id":"icon","alt":"Certification icon","src":"https://www.snowflake.com/content/experience-fragments/snowflake-site/language-masters/en/site/mega-nav-header/master/_jcr_content/root/mega_header/nav_mega/item_1719961362824/nav_column_container/nav_column_44600420__826130542/nav_item_copy_1438098918/icon.coreimg.svg/1722382780833/nav-icon--cert.svg","lazyEnabled":true,"width":"64","height":"64",":type":"snowflake-site/components/image"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy_143809":{"id":"nav-item-002b04357c","linkDescription":"Weekly product demos showcasing key features and live Q&A ","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/webinars/demo/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_INTERNAL",":type":"snowflake-site/components/button","text":"Live Demos"},"icon":{"id":"icon","alt":"Live Demo icon","src":"https://www.snowflake.com/content/experience-fragments/snowflake-site/language-masters/en/site/mega-nav-header/master/_jcr_content/root/mega_header/nav_mega/item_1719961362824/nav_column_container/nav_column_44600420__826130542/nav_item_copy_143809/icon.coreimg.svg/1759424359543/nav-icon--live-demo.svg","lazyEnabled":true,"width":"64","height":"64",":type":"snowflake-site/components/image"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy_333890638":{"id":"nav-item-ddbedf56d5","linkDescription":"Training courses for all levels, on-demand or instructor-led","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"attributes":{"target":"_blank"},"url":"https://learn.snowflake.com/en/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_EXTERNAL",":type":"snowflake-site/components/button","text":"Snowflake University"},"icon":{"id":"icon","alt":"Education icon","src":"https://www.snowflake.com/content/experience-fragments/snowflake-site/language-masters/en/site/mega-nav-header/master/_jcr_content/root/mega_header/nav_mega/item_1719961362824/nav_column_container/nav_column_44600420__826130542/nav_item_copy_333890638/icon.coreimg.svg/1722382769808/nav-icon--education.svg","lazyEnabled":true,"width":"64","height":"64",":type":"snowflake-site/components/image"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy_189945":{"id":"nav-item-b5e9e02668","linkDescription":"Instructor-led virtual workshops for exploring key Snowflake features","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/webinars/virtual-hands-on-lab/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_INTERNAL",":type":"snowflake-site/components/button","text":"Hands-On Labs"},"icon":{"id":"icon","alt":"Hands-on Labs icon","src":"https://www.snowflake.com/content/experience-fragments/snowflake-site/language-masters/en/site/mega-nav-header/master/_jcr_content/root/mega_header/nav_mega/item_1719961362824/nav_column_container/nav_column_44600420__826130542/nav_item_copy_189945/icon.coreimg.svg/1759388182903/nav-icon--labs.svg","lazyEnabled":true,"width":"64","height":"64",":type":"snowflake-site/components/image"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy_333890":{"id":"nav-item-8c25e7dc2a","linkDescription":"Academic papers written by Snowflake researchers","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/resources/publications/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_INTERNAL",":type":"snowflake-site/components/button","text":"Snowflake Research Publications"},"icon":{"id":"icon","alt":"Copy","src":"https://www.snowflake.com/content/experience-fragments/snowflake-site/language-masters/en/site/mega-nav-header/master/_jcr_content/root/mega_header/nav_mega/item_1719961362824/nav_column_container/nav_column_44600420__826130542/nav_item_copy_333890/icon.coreimg.svg/1756326371387/copy.svg","lazyEnabled":true,"width":"65","height":"64",":type":"snowflake-site/components/image"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy_333890_930852828":{"id":"nav-item-028b2076a5","linkDescription":"Informative articles about AI and data topics","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/fundamentals/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_INTERNAL",":type":"snowflake-site/components/button","text":"Fundamentals"},"icon":{"id":"icon","alt":"Document with list","src":"https://www.snowflake.com/content/experience-fragments/snowflake-site/language-masters/en/site/mega-nav-header/master/_jcr_content/root/mega_header/nav_mega/item_1719961362824/nav_column_container/nav_column_44600420__826130542/nav_item_copy_333890_930852828/icon.coreimg.svg/1756853637155/data-sheet.svg","lazyEnabled":true,"width":"65","height":"64",":type":"snowflake-site/components/image"},":type":"snowflake-site/components/nav/nav-item"}},":itemsOrder":["nav_item_copy","nav_item","nav_item_copy_144634_1984107859","nav_item_copy_1438098918","nav_item_copy_143809","nav_item_copy_333890638","nav_item_copy_189945","nav_item_copy_333890","nav_item_copy_333890_930852828"]}},":itemsOrder":["nav_column_copy","nav_column_44600420__826130542"]},"nav_promo_section":{"id":"nav-promo-section-f030701abb","experience_fragment_1":{"id":"experiencefragment-516c135b2a","localizedFragmentVariationPath":"/content/experience-fragments/snowflake-site/language-masters/en/site/nav-promo-card/master1/jcr:content","configured":true,":type":"snowflake-site/components/experiencefragment",":items":{"root":{"columnClassNames":{"nav_promo_card":"aem-GridColumn aem-GridColumn--default--12"},"gridClassNames":"aem-Grid aem-Grid--12 aem-Grid--default--12","layout":"RESPONSIVE_GRID","columnCount":12,"id":"container-89a99a6adf",":type":"snowflake-site/components/container",":items":{"nav_promo_card":{"id":"nav-promo-card-49d5e77a52","openInNewWindow":true,"layout":"horizontal","headline":"Dev Day Virtual - June 25","description":"Don’t just hear about AI — build it. Luminary talks and hands-on labs","linkTitle":"Learn more","linkUrl":"/en/dev-day/americas-virtual/","image":{"id":"image","alt":"dev day","src":"https://www.snowflake.com/adobe/dynamicmedia/deliver/dm-aid--de231e36-6645-4550-abd9-0f8de758ac66/web-dev-day-26-960x540-1x.png?quality=85&preferwebp=true","lazyEnabled":true,"width":"960","height":"540",":type":"snowflake-site/components/image"},":type":"snowflake-site/components/nav/nav-promo-card"}},":itemsOrder":["nav_promo_card"]},"cq:metadata":{":type":"nt:unstructured"}},":itemsOrder":["root","cq:metadata"],"classNames":"aem-xf"},"experience_fragment_2":{"id":"experiencefragment-d5082a802c","localizedFragmentVariationPath":"/content/experience-fragments/snowflake-site/language-masters/en/site/nav-promo-card/navigation-promo-card-2/jcr:content","configured":true,":type":"snowflake-site/components/experiencefragment",":items":{"root":{"columnClassNames":{"nav_promo_card":"aem-GridColumn aem-GridColumn--default--12"},"gridClassNames":"aem-Grid aem-Grid--12 aem-Grid--default--12","layout":"RESPONSIVE_GRID","columnCount":12,"id":"container-437b65ed95",":type":"snowflake-site/components/container",":items":{"nav_promo_card":{"id":"nav-promo-card-b5f572ea9a","openInNewWindow":true,"layout":"horizontal","headline":"The ROI of Gen AI and Agents 2026","description":"Discover how 92% of early adopters are achieving positive ROI with gen AI.","linkTitle":"Learn More","linkUrl":"/en/lp/radical-roi-generative-ai/","image":{"id":"image","alt":"roi of gen ai and agents","src":"https://www.snowflake.com/adobe/dynamicmedia/deliver/dm-aid--0c15edae-1a97-4739-8b16-c7f3941a6d9e/web-roi-of-gen-ai-and-agents-2026-r02-960x540.png?quality=85&preferwebp=true","lazyEnabled":true,"width":"960","height":"540",":type":"snowflake-site/components/image"},":type":"snowflake-site/components/nav/nav-promo-card"}},":itemsOrder":["nav_promo_card"]},"cq:metadata":{":type":"nt:unstructured"}},":itemsOrder":["root","cq:metadata"],"classNames":"aem-xf"},"experience_fragment_3":{"id":"experiencefragment-c4b973a27a","localizedFragmentVariationPath":"/content/experience-fragments/snowflake-site/language-masters/en/site/nav-promo-card/navigation-promo-card-3/jcr:content","configured":true,":type":"snowflake-site/components/experiencefragment",":items":{"root":{"columnClassNames":{"nav_promo_card":"aem-GridColumn aem-GridColumn--default--12"},"gridClassNames":"aem-Grid aem-Grid--12 aem-Grid--default--12","layout":"RESPONSIVE_GRID","columnCount":12,"id":"container-b8b84d448e",":type":"snowflake-site/components/container",":items":{"nav_promo_card":{"id":"nav-promo-card-052899d73e","openInNewWindow":true,"layout":"horizontal","headline":"Startup 2026: AI Agents Mean Business","description":"Venture leaders weigh in on agentic AI. ","linkTitle":"Learn more","linkUrl":"/en/lp/building-startup-ai-age/","image":{"id":"image","alt":"alt","src":"https://www.snowflake.com/adobe/dynamicmedia/deliver/dm-aid--a320b404-dca1-4477-b033-c79708538657/web-startup-2026-960x540.png?quality=85&preferwebp=true","lazyEnabled":true,"width":"960","height":"540",":type":"snowflake-site/components/image"},":type":"snowflake-site/components/nav/nav-promo-card"}},":itemsOrder":["nav_promo_card"]},"cq:metadata":{":type":"nt:unstructured"}},":itemsOrder":["root","cq:metadata"],"classNames":"aem-xf"},":type":"snowflake-site/components/nav/nav-promo-section"},":type":"snowflake-site/components/nav/nav-dropdown-menu","cq:panelTitle":"Resources"},"item_1719963657751":{"id":"nav-dropdown-menu-fbdab752da","enableDropdown":true,"nav_column_container":{"layout":"SIMPLE","id":"container-526d7cf157",":type":"snowflake-site/components/nav/nav-column/nav-column-container",":items":{"nav_column_copy_copy":{"navColumnTitle":"Build","numberOfSubColumns":"one-column","layout":"SIMPLE","id":"container-9ba69197be",":type":"snowflake-site/components/nav/nav-column",":items":{"nav_item":{"id":"nav-item-c1bb68d30f","propertiesId":"testID","linkDescription":"Overview of the dev resources you need to build and scale","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/developers/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_INTERNAL",":type":"snowflake-site/components/button","text":"Snowflake for Developers"},"icon":{"id":"icon","alt":"Developers icon","src":"https://www.snowflake.com/content/experience-fragments/snowflake-site/language-masters/en/site/mega-nav-header/master/_jcr_content/root/mega_header/nav_mega/item_1719963657751/nav_column_container/nav_column_copy_copy/nav_item/icon.coreimg.svg/1731362494574/nav-icon--devs.svg","lazyEnabled":true,"width":"64","height":"64",":type":"snowflake-site/components/image"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy_1855651246":{"id":"nav-item-a37e2fd88a","linkDescription":"Reference architectures, use cases and best practices","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/developers/guides/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_INTERNAL",":type":"snowflake-site/components/button","text":"Developer Guides"},"icon":{"id":"icon","alt":"Solution Center icon","src":"https://www.snowflake.com/content/experience-fragments/snowflake-site/language-masters/en/site/mega-nav-header/master/_jcr_content/root/mega_header/nav_mega/item_1719963657751/nav_column_container/nav_column_copy_copy/nav_item_copy_1855651246/icon.coreimg.svg/1761677891705/nav-icon--solution-center.svg","lazyEnabled":true,"width":"64","height":"64",":type":"snowflake-site/components/image"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy":{"id":"nav-item-f5a1afb42c","additionalClasses":"is-light-gray-icon","linkDescription":"The latest software versions, drivers, libraries and relevant docs","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/developers/downloads/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_INTERNAL",":type":"snowflake-site/components/button","text":"Downloads"},"icon":{"id":"icon","alt":"Download icon","src":"https://www.snowflake.com/content/experience-fragments/snowflake-site/language-masters/en/site/mega-nav-header/master/_jcr_content/root/mega_header/nav_mega/item_1719963657751/nav_column_container/nav_column_copy_copy/nav_item_copy/icon.coreimg.svg/1731362660050/nav-icon-download.svg","lazyEnabled":true,"width":"28","height":"28",":type":"snowflake-site/components/image"},":type":"snowflake-site/components/nav/nav-item"}},":itemsOrder":["nav_item","nav_item_copy_1855651246","nav_item_copy"]},"nav_column_copy_copy_1367930678":{"navColumnTitle":"Learn","numberOfSubColumns":"one-column","layout":"SIMPLE","id":"container-07bab1dc8c",":type":"snowflake-site/components/nav/nav-column",":items":{"nav_item":{"id":"nav-item-cda65c4f88","propertiesId":"testID","linkDescription":"Reference docs, guides, tutorials and announcements","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"attributes":{"target":"_blank"},"url":"https://docs.snowflake.com/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_EXTERNAL",":type":"snowflake-site/components/button","text":"Documentation"},"icon":{"id":"icon","alt":"Docs icon","src":"https://www.snowflake.com/content/experience-fragments/snowflake-site/language-masters/en/site/mega-nav-header/master/_jcr_content/root/mega_header/nav_mega/item_1719963657751/nav_column_container/nav_column_copy_copy_1367930678/nav_item/icon.coreimg.svg/1731361950527/nav-icon--docs.svg","lazyEnabled":true,"width":"64","height":"64",":type":"snowflake-site/components/image"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy":{"id":"nav-item-6223bc1a7b","additionalClasses":"is-light-gray-icon","linkDescription":"Key projects Snowflake engineers maintain and support","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/developers/open-source/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_INTERNAL",":type":"snowflake-site/components/button","text":"Open Source"},"icon":{"id":"icon","alt":"Open Source icon","src":"https://www.snowflake.com/content/experience-fragments/snowflake-site/language-masters/en/site/mega-nav-header/master/_jcr_content/root/mega_header/nav_mega/item_1719963657751/nav_column_container/nav_column_copy_copy_1367930678/nav_item_copy/icon.coreimg.svg/1731365437016/nav-icon-open-source.svg","lazyEnabled":true,"width":"32","height":"32",":type":"snowflake-site/components/image"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy_copy":{"id":"nav-item-a6d36dfb9d","additionalClasses":"is-light-gray-icon","linkDescription":"Online and in-person classes and workshops to upskill on Snowflake","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/developers/northstar/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_INTERNAL",":type":"snowflake-site/components/button","text":"Builder Education"},"icon":{"id":"icon","alt":"Northstar logo","src":"https://www.snowflake.com/content/experience-fragments/snowflake-site/language-masters/en/site/mega-nav-header/master/_jcr_content/root/mega_header/nav_mega/item_1719963657751/nav_column_container/nav_column_copy_copy_1367930678/nav_item_copy_copy/icon.coreimg.svg/1731362475640/nav-icon--northstar.svg","lazyEnabled":true,"width":"32","height":"32",":type":"snowflake-site/components/image"},":type":"snowflake-site/components/nav/nav-item"}},":itemsOrder":["nav_item","nav_item_copy","nav_item_copy_copy"]},"nav_column_copy_copy_1101894776":{"navColumnTitle":"Connect","numberOfSubColumns":"one-column","layout":"SIMPLE","id":"container-7d8f6bf019",":type":"snowflake-site/components/nav/nav-column",":items":{"nav_item":{"id":"nav-item-18eb0585fc","propertiesId":"testID","linkDescription":"Snowflake’s technical leaders on what, why and how they build features","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"https://www.snowflake.com/engineering-blog/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_EXTERNAL",":type":"snowflake-site/components/button","text":"Engineering Blog"},"icon":{"id":"icon","alt":"Developers icon","src":"https://www.snowflake.com/content/experience-fragments/snowflake-site/language-masters/en/site/mega-nav-header/master/_jcr_content/root/mega_header/nav_mega/item_1719963657751/nav_column_container/nav_column_copy_copy_1101894776/nav_item/icon.coreimg.svg/1757101368571/nav-icon--developer-center.svg","lazyEnabled":true,"width":"32","height":"32",":type":"snowflake-site/components/image"},":type":"snowflake-site/components/nav/nav-item"},"nav_item_copy_1855651246":{"id":"nav-item-7f564ffdee","linkDescription":"Tips, tricks and discussion with fellow Snowflake developers","button":{"id":"button","showOutboundIcon":false,"buttonLink":{"valid":true,"attributes":{"target":"_blank"},"url":"https://community.snowflake.com/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_EXTERNAL",":type":"snowflake-site/components/button","text":"Community"},"icon":{"id":"icon","alt":"Partner Network icon","src":"https://www.snowflake.com/content/experience-fragments/snowflake-site/language-masters/en/site/mega-nav-header/master/_jcr_content/root/mega_header/nav_mega/item_1719963657751/nav_column_container/nav_column_copy_copy_1101894776/nav_item_copy_1855651246/icon.coreimg.svg/1731362644348/nav-icon--partner-network.svg","lazyEnabled":true,"width":"64","height":"64",":type":"snowflake-site/components/image"},":type":"snowflake-site/components/nav/nav-item"}},":itemsOrder":["nav_item","nav_item_copy_1855651246"]}},":itemsOrder":["nav_column_copy_copy","nav_column_copy_copy_1367930678","nav_column_copy_copy_1101894776"]},"nav_promo_section":{"id":"nav-promo-section-a53c0b9fbc","experience_fragment_1":{"id":"experiencefragment-55d4affa2d","localizedFragmentVariationPath":"/content/experience-fragments/snowflake-site/language-masters/en/site/nav-promo-card/nav-promo-5/jcr:content","configured":true,":type":"snowflake-site/components/experiencefragment",":items":{"root":{"columnClassNames":{"nav_promo_card":"aem-GridColumn aem-GridColumn--default--12"},"gridClassNames":"aem-Grid aem-Grid--12 aem-Grid--default--12","layout":"RESPONSIVE_GRID","columnCount":12,"id":"container-4e44a78c11",":type":"snowflake-site/components/container",":items":{"nav_promo_card":{"id":"nav-promo-card-f414bf6953","openInNewWindow":false,"layout":"horizontal","headline":"Get started with your first Snowflake Notebook","description":"Write and execute code, visualize results, and tell the story of your analysis all in one place.","linkTitle":"Learn More","linkUrl":"/en/developers/solutions-center/getting-started-with-your-first-snowflake-notebook-project/","image":{"id":"image","alt":"alt","src":"https://www.snowflake.com/adobe/dynamicmedia/deliver/dm-aid--dc7e334a-c38b-4283-b1de-fcf829952eef/nav-promo-first-notebook.jpg?quality=85&preferwebp=true","lazyEnabled":true,"width":"415","height":"210",":type":"snowflake-site/components/image"},":type":"snowflake-site/components/nav/nav-promo-card"}},":itemsOrder":["nav_promo_card"]},"cq:LiveSyncConfig":{"cq:isDeep":true,"cq:rolloutConfigs":[],"cq:master":"/content/experience-fragments/snowflake-site/language-masters/en/site/nav-promo-card/nav-promo-card-4",":type":"cq:LiveCopy"}},":itemsOrder":["root","cq:LiveSyncConfig"],"classNames":"aem-xf"},"experience_fragment_2":{"id":"experiencefragment-59690043e6","localizedFragmentVariationPath":"/content/experience-fragments/snowflake-site/language-masters/en/site/nav-promo-card/nav-promo-card-4/jcr:content","configured":true,":type":"snowflake-site/components/experiencefragment",":items":{"root":{"columnClassNames":{"nav_promo_card":"aem-GridColumn aem-GridColumn--default--12"},"gridClassNames":"aem-Grid aem-Grid--12 aem-Grid--default--12","layout":"RESPONSIVE_GRID","columnCount":12,"id":"container-5ab60f7428",":type":"snowflake-site/components/container",":items":{"nav_promo_card":{"id":"nav-promo-card-1a39f7f339","openInNewWindow":true,"layout":"horizontal","headline":"Northstar Builder Workshops","description":"Join other developers as you roll up your sleeves and explore the possibilities of Snowflake.","linkTitle":"Learn More","linkUrl":"/en/nav-promos/northstar-builders-workshop/","image":{"id":"image","alt":"Snowflake Northstar logo","src":"https://www.snowflake.com/adobe/dynamicmedia/deliver/dm-aid--14341ced-bc5e-4a29-9762-b7857f6cadfc/nav-promo-northstar.jpg?quality=85&preferwebp=true","lazyEnabled":true,"width":"1440","height":"700",":type":"snowflake-site/components/image"},":type":"snowflake-site/components/nav/nav-promo-card"}},":itemsOrder":["nav_promo_card"]},"cq:LiveSyncConfig":{"cq:isDeep":true,"cq:rolloutConfigs":[],"cq:master":"/content/experience-fragments/snowflake-site/language-masters/en/site/nav-promo-card/master",":type":"cq:LiveCopy"}},":itemsOrder":["root","cq:LiveSyncConfig"],"classNames":"aem-xf"},":type":"snowflake-site/components/nav/nav-promo-section"},":type":"snowflake-site/components/nav/nav-dropdown-menu","cq:panelTitle":"Developers"},"item_1718247180324":{"id":"nav-dropdown-menu-5790483914","enableDropdown":false,"link_url":"/en/pricing-options/",":type":"snowflake-site/components/nav/nav-dropdown-menu","cq:panelTitle":"Pricing"}},":itemsOrder":["item_1719963657751_c_663444255","nav_dropdown_menu_2","item_1719963657751_c","item_1719961362824","item_1719963657751","item_1718247180324"]},"languagenavigation":{"id":"language-navigation-e4d2b821d0","languageNavItems":[{"title":"English","path":"/en/developers/guides/well-architected-framework-performance/","locale":"en","active":true},{"title":"日本語","path":"/ja/","locale":"ja","active":false},{"title":"한국어","path":"/ko/","locale":"ko","active":false},{"title":"中文（简体）","path":"/zh_cn/","locale":"zh-cn","active":false},{"title":"Português","path":"/pt_br/","locale":"pt-br","active":false},{"title":"Deutsch","path":"/de/","locale":"de","active":false},{"title":"Français","path":"/fr/","locale":"fr","active":false},{"title":"Español","path":"/es/","locale":"es","active":false},{"title":"Italiano","path":"/it/","locale":"it","active":false}],":type":"snowflake-site/components/nav/language-navigation"},"button_1177328691":{"id":"button-252f96e496","heapButtonClasses":["mega-nav__sign-in"],"showOutboundIcon":false,"buttonLink":{"valid":true,"attributes":{"target":"_blank"},"url":"https://app.snowflake.com/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_EXTERNAL",":type":"snowflake-site/components/button","appliedCssClassNames":"snowflake-button-link snowflake-button-black snowflake-button-compact","text":"Sign in"},"button":{"id":"button-6581ed670f","heapButtonClasses":["contact_nav","heap-nav-contact"],"showOutboundIcon":true,"buttonLink":{"valid":true,"url":"/en/contact-sales/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_INTERNAL",":type":"snowflake-site/components/button","appliedCssClassNames":"snowflake-button-secondary snowflake-button-blue snowflake-button-compact","text":"CONTACT SALES"},"button_288358396":{"id":"button-a777175eb9","heapButtonClasses":["start_for_free_nav","heap-nav-start-for-free"],"showOutboundIcon":false,"buttonLink":{"valid":true,"url":"https://signup.snowflake.com/"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_EXTERNAL",":type":"snowflake-site/components/button","appliedCssClassNames":"snowflake-button-primary snowflake-button-blue snowflake-button-compact","text":"start for free"}},":itemsOrder":["nav_mega","languagenavigation","button_1177328691","button","button_288358396"],"appliedCssClassNames":"snowflake-header-container white"}},":itemsOrder":["markup_editor","mega_header"]},"image":{":type":"nt:unstructured"},"cq:targetMetadata":{"cq:targetStatus":"OUT_OF_SYNC","cq:exportTime":1781280015540,"cq:targetOfferId":860250,":type":"nt:unstructured"}},":itemsOrder":["root","image","cq:targetMetadata"],"classNames":"aem-xf"},"markup_editor_1950346551":{"id":"markup-editor-f8da98626b","title":" ","cssContent":".snowflake-markdown-table code[class*=language-],.snowflake-markdown-table code[class*=language-],.snowflake-markdown .snowflake-text code[class*=language-],.snowflake-markdown .snowflake-text pre[class*=language-]{background-color:rgba(var(--ui-12-rgb),.5);color:var(--text-01);text-shadow:none;padding:var(--spacing-00);border-radius:var(--spacing-00);font-size:smaller}","isGSAPEnabled":false,":type":"snowflake-site/components/markup-editor"},"responsivegrid":{"columnClassNames":{"quickstart_hero":"aem-GridColumn aem-GridColumn--default--12","flexible_column_cont":"aem-GridColumn aem-GridColumn--default--12","markup_editor":"aem-GridColumn aem-GridColumn--default--12"},"gridClassNames":"aem-Grid aem-Grid--12 aem-Grid--default--12","columnCount":12,":items":{"quickstart_hero":{"id":"quickstart-hero-c350c5e01a","quickstartHeroTitle":{"lines":["Performance"],"type":"heading2",":type":"snowflake-site/components/title-v2"},"quickstartHeroForkRepoLink":{"id":"button-dfe401031e","showOutboundIcon":false,"buttonLink":{"valid":true,"attributes":{"target":"_blank"},"url":"https://github.com/Snowflake-Labs/sfquickstarts/tree/master/site/sfguides/src/well-architected-framework-performance"},"linkTargetContentType":"GENERIC","linkType":"SNOWFLAKE_EXTERNAL",":type":"snowflake-site/components/button","text":"Fork Repo"},"isDeveloperGuidesPage":false,"quickstartHeroFirstCertifiedTag":{"tagText":"Well Architected Framework","tagColor":"#29B5E8","tagPath":"/content/cq:tags/snowflake-site/taxonomy/solution-center/certification/well-architected-framework","tagIcon":""},"quickstartHeroAuthor":"Well Architected Framework Team","quickstartHeroBreadcrumbs":[{"title":"Performance","url":"https://www.snowflake.com/content/snowflake-site/global/en/developers/guides/well-architected-framework-performance","currentPage":true},{"title":"Guides","url":"https://www.snowflake.com/content/snowflake-site/global/en/developers/guides","currentPage":false},{"title":"Snowflake for Developers","url":"https://www.snowflake.com/content/snowflake-site/global/en/developers","currentPage":false}],":type":"snowflake-site/components/quickstart/quickstart-hero","fragmentPath":"/content/dam/snowflake-site/en/content-fragments/quickstarts/well-architected-framework-performance"},"flexible_column_cont":{"id":"flexible-column-container-5b3699a29d","propertiesId":"quickstart-template-main-flexible-container","type":"2-column-75-25","alignColumns":"top","containerMaxWidth":"extra-large","topPadding":"none","bottomPadding":"none","spaceBetween":"small","reverseOnMobile":false,"carouselOnMobile":false,"backgroundImageOption":"none","flexible_column_content_container_1":{"layout":"SIMPLE","id":"container-4fd28692d1",":type":"snowflake-site/components/flexible-column-container/flexible-column-content-container",":items":{"contentfragment":{"id":"contentfragment-76cc8a4d85","paragraphs":["\u003Ch2\u003EOverview\u003C/h2\u003E\n","\u003Cp\u003EOptimizing performance on Snowflake is crucial for efficient data\nanalysis. This guidance, for data architects, developers, and\nadministrators, outlines best practices for designing, implementing, and\nmaintaining data workloads.\u003C/p\u003E\n","\u003Cp\u003EApplying these recommendations streamlines operations, enhances user\nexperience, and improves business value through increased revenue and\nreduced costs. For instance, faster query execution translates to\nquicker insights and greater adoption.\u003C/p\u003E\n","\u003Cp\u003EPerformance tuning often balances performance and cost, with\nimprovements frequently benefiting both. Snowflake's autoscaling\ncapabilities, for example, ensure consistent performance by dynamically\nallocating resources as concurrency increases, while also providing cost\nefficiency by scaling down during lower demand.\u003C/p\u003E\n","\u003Ch2\u003EPrinciples and recommendations\u003C/h2\u003E\n","\u003Ch3\u003EPrinciples\u003C/h3\u003E\n","\u003Ch4\u003EEstablish and validate performance objectives\u003C/h4\u003E\n\u003Cblockquote\u003E\n","\u003Cp\u003EDefine clear, measurable, and achievable performance targets within\ntechnical and budgetary limits before application design. Consider key\nworkload characteristics.\u003C/p\u003E\n\u003C/blockquote\u003E\n","\u003Ch4\u003EOptimize data architecture and access\u003C/h4\u003E\n\u003Cblockquote\u003E\n","\u003Cp\u003EDesign efficient data models and access patterns to minimize data\nscanned. Leverage appropriate data types, clustering, indexing, and\nperformance features.\u003C/p\u003E\n\u003C/blockquote\u003E\n","\u003Ch4\u003EArchitect for scalability and workload partitioning\u003C/h4\u003E\n\u003Cblockquote\u003E\n","\u003Cp\u003EUtilize Snowflake&rsquo;s elastic warehouse features and application design\nto strategically partition workloads, optimizing resource utilization,\nconcurrency, and latency.\u003C/p\u003E\n\u003C/blockquote\u003E\n","\u003Ch4\u003EImplement continuous performance monitoring and optimization\u003C/h4\u003E\n\u003Cblockquote\u003E\n","\u003Cp\u003EEstablish comprehensive monitoring and logging to identify performance\nbottlenecks. Proactively optimize the system over time, adapting to\nevolving requirements.\u003C/p\u003E\n\u003C/blockquote\u003E\n","\u003Ch3\u003ERecommendations\u003C/h3\u003E\n","\u003Cp\u003EThe following key recommendations are covered within the principles of\nPerformance:\u003C/p\u003E\n\u003Cul\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003ELeveraging Elasticity\u003C/strong\u003E\nDynamically adjust resources based on workload. Utilize horizontal\nscaling (multi-cluster warehouses) and vertical sizing to match query\ncomplexity. Employ manual scaling for predictable peaks and\nauto-scaling for real-time fluctuations.\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003EPeak Load Planning\u003C/strong\u003E\nProactively plan for high-demand periods. Use manual scaling for\npredictable surges; enable auto-scaling and predictive scaling for\nless predictable demand.\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003EContinuous Performance Improvement\u003C/strong\u003E\nMonitor key performance indicators like latency, throughput, and\nutilization. Foster continuous tuning through training, feedback, and\nmetric review.\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003ETest-First Design\u003C/strong\u003E\nIntegrate performance testing into the design phase. Define KPIs,\nestablish baselines, and simulate workloads early. Use load,\nscalability, and stress testing throughout development to prevent\nbottlenecks.\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003EEffective Data Shaping\u003C/strong\u003E\nLeverage Snowflake micro-partition clustering. Define clustering keys\nfor frequently filtered/joined columns to enable efficient pruning and\nreduce I/O. Regularly monitor clustering depth.\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003EWell-Designed SQL\u003C/strong\u003E\nWrite efficient queries by avoiding \u003Ccode\u003ESELECT \\*\u003C/code\u003E, specifying needed\ncolumns, and using efficient joins. Use query profiling tools to\nrefine performance and minimize resource consumption.\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003EOptimizing Warehouses\u003C/strong\u003E\nReduce queues and spillage, scale appropriately, and use query\nacceleration. Right-size warehouses and manage concurrency to reduce\ncontention and optimize resource use.\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003EOptimizing Storage\u003C/strong\u003E\nUse automatic clustering, Search Optimization Service, and\nmaterialized views strategically. Match the technique to your\nworkload.\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003EHigh-Level Practices\u003C/strong\u003E\nTo optimize query performance, select fewer columns, leverage query\npruning with clustered columns, and use pre-aggregated tables.\nSimplify SQL by reducing unnecessary sorts, preferring window\nfunctions, and avoiding OR conditions in joins. Minimize view\ncomplexity, maximize cache usage, scale warehouses, and tune cluster\nscaling policies for balanced performance and cost.\u003C/p\u003E\n\u003C/li\u003E\u003C/ul\u003E\n","\u003Ch2\u003EEstablish and validate performance objectives\u003C/h2\u003E\n","\u003Ch3\u003EOverview\u003C/h3\u003E\n","\u003Cp\u003ESnowflake optimizes performance through its Performance by Design\nmethodology, integrating performance as a core architectural feature.\nThis approach links business objectives with efficient resource\nmanagement, leveraging key principles, careful configurations, and\nSnowflake's elasticity for scalability and cost-efficiency.\u003C/p\u003E\n","\u003Ch4\u003EDesired outcome\u003C/h4\u003E\n","\u003Cp\u003EBy implementing these best practices, you can achieve a highly\nresponsive and cost-optimized Snowflake environment. Expect predictable\nquery performance that consistently meets Service Level Objectives\n(SLOs), eliminate costly architectural debt, and effectively manage\noperational expenses by aligning compute resources with workload\ndemands. Ultimately, businesses can claim a well-architected data\nplatform that supports their needs without unnecessary expenditure.\u003C/p\u003E\n","\u003Ch4\u003ERecommendations\u003C/h4\u003E\n","\u003Cp\u003EPerformance is a core, cost-driven feature. Prioritize &quot;as fast as\nnecessary&quot; over &quot;as fast as possible&quot; to prevent over-provisioning.\nDefine performance (latency, throughput, concurrency) as a negotiable\nbusiness metric requiring cost-benefit analysis, as it directly impacts\nSnowflake's operational expenses through credit consumption.\nUnderstanding cloud architecture's continuous financial implications is\ncrucial. Performance planning from the start is essential to avoid\ninefficiencies, poor user experience, and costly re-engineering.\u003C/p\u003E\n","\u003Ch3\u003EPerformance by Design\u003C/h3\u003E\n","\u003Cp\u003EAchieve a high-performing Snowflake environment by implementing a\ndeliberate strategy before coding. The Performance by Design methodology\nensures performance is a core architectural feature from a project's\nstart, aligning business objectives, user experience, and financial\ngovernance. Proactive decisions establish an efficiently scalable\nfoundation, preventing expensive architectural debt.\u003C/p\u003E\n","\u003Cp\u003E\u003Cstrong\u003EPerformance as a feature\u003C/strong\u003E\u003C/p\u003E\n","\u003Cp\u003EPrior to solution design, it is imperative to internalize a key\nprinciple of cloud computing: every performance requirement entails a\ndirect and quantifiable cost. The paradigm shift from &quot;maximize speed&quot;\nto &quot;achieve necessary speed&quot; represents the initial stride toward a\nmeticulously architected system.\u003C/p\u003E\n","\u003Cp\u003E\u003Cstrong\u003EPerformance as a negotiable business metric\u003C/strong\u003E\u003C/p\u003E\n","\u003Cp\u003EPerformance, latency, and concurrency are more than fixed technical\nspecs; they're business requirements that need to be defined and\njustified like any other product feature. If someone asks for a\n&quot;five-second query response time,&quot; that should invite a discussion about\nvalue and cost, not be treated as an absolute must-have. Different\nworkloads have different performance needs, and a one-size-fits-all\napproach leads to overspending and wasted resources.\u003C/p\u003E\n","\u003Cp\u003E\u003Cstrong\u003EThe Cloud Paradigm: From capital to operational expense\u003C/strong\u003E\u003C/p\u003E\n","\u003Cp\u003EIn a traditional on-premises setup, performance often hinges on\nsignificant upfront spending for hardware. Once purchased, the cost to\nrun each query is very low. The cloud, however, uses a completely\ndifferent financial model. With Snowflake, performance is an ongoing\noperational cost. Every active virtual warehouse uses credits, meaning\nthat your architectural and query design decisions have immediate and\ncontinuous financial consequences.\u003C/p\u003E\n","\u003Cp\u003E\u003Cstrong\u003EAvoiding architectural debt: The cost of unplanned implementation\u003C/strong\u003E\u003C/p\u003E\n","\u003Cp\u003ESnowflake's inherent simplicity can lead to solutions implemented\nwithout adequate upfront planning, fostering architectural debt. This\ndebt manifests as excessive credit consumption from inefficient queries,\nsuboptimal user experience due to unpredictable performance, and\nexpensive re-engineering projects. To avoid these issues, establish\nclear project plans and formalize performance metrics from the outset,\nensuring optimal system health and cost efficiency.\u003C/p\u003E\n","\u003Ch4\u003EThe Core Process: The Design Document\u003C/h4\u003E\n","\u003Cp\u003ETo translate principle into practice, any significant data project\nshould begin with a design document. This is not just a technical\ndocument, but a formal agreement that forces critical trade-off\nconversations to happen at the project's inception.\u003C/p\u003E\n","\u003Cp\u003E\u003Cstrong\u003EAssembling the Stakeholders: A Cross-Functional Responsibility\u003C/strong\u003E\u003C/p\u003E\n","\u003Cp\u003ECreating a design document is a collaborative effort. It ensures that\nbusiness goals are accurately translated into technical and financial\nrealities. The key participants include:\u003C/p\u003E\n\u003Cul\u003E\u003Cli\u003E\n","\u003Cp\u003EBusiness Stakeholders: To define the goals and the value of the\ndesired outcomes.\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003EProduct Managers: To translate business needs into specific features\nand user stories.\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003EEngineering Leads: To evaluate technical feasibility and design the\narchitecture.\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003EFinOps/Finance: To provide budget oversight and model the cost\nimplications of different service levels.\u003C/p\u003E\n\u003C/li\u003E\u003C/ul\u003E\n","\u003Cp\u003E\u003Cstrong\u003EService Level Objectives (SLOs)\u003C/strong\u003E\u003C/p\u003E\n","\u003Cp\u003EService Level Objectives (SLOs) are essential for optimizing\nperformance. They establish measurable and acceptable performance\nbenchmarks for a system or service. By continuously monitoring and\nevaluating against these concrete targets, organizations can ensure\ntheir services consistently fulfill both user expectations and business\nneeds.\u003C/p\u003E\n","\u003Cp\u003EEffective SLOs should be:\u003C/p\u003E\n\u003Cul\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003ESpecific:\u003C/strong\u003E Avoid vague goals. Define precise targets, such as &quot;95%\nof interactive dashboard queries under 10 seconds,&quot; to allow for\naccurate measurement.\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003EMeasurable:\u003C/strong\u003E Establish clear metrics and the tools for data\ncollection and analysis. For example, to measure &quot;nightly ETL of 1TB\nin under 60 minutes,&quot; systems must track data volume and processing\ntime.\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003EAchievable:\u003C/strong\u003E Set realistic and attainable targets given current\nresources and technology, to avoid excessive costs without business\nvalue.\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003ERelevant:\u003C/strong\u003E Align SLOs with business needs and end-user\nexpectations, focusing on critical user experience or business\nprocesses.\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003ETime-bound:\u003C/strong\u003E Many SLOs benefit from a defined timeframe, aiding in\nperformance evaluation over a specific period.\u003C/p\u003E\n\u003C/li\u003E\u003C/ul\u003E\n","\u003Cp\u003EDefining and monitoring SLOs helps organizations proactively identify\nand address performance bottlenecks, ensuring consistent service\nquality, enhanced user satisfaction, and better business outcomes.\nRegular review and adjustment of SLOs are crucial to adapt to evolving\nbusiness needs and technological advancements.\u003C/p\u003E\n","\u003Ch4\u003EDefining the four pillars of workload requirements\u003C/h4\u003E\n","\u003Cp\u003EDefine a workload&rsquo;s performance profile using these four key pillars:\u003C/p\u003E\n\u003Cul\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003EWorkload Categorization\u003C/strong\u003E: Not all work is the same. The first step\nis to classify each workload based on its usage pattern and\nperformance characteristics. Common categories include:\u003C/p\u003E\n\u003Cul\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003EInteractive:\u003C/strong\u003E User-facing queries, typically from dashboards\n(e.g., Tableau, Power BI, Looker), where low latency and high\nconcurrency are critical for a good user experience.\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003EAd-Hoc/Exploratory:\u003C/strong\u003E Queries from data scientists or analysts\nthat are often complex, unpredictable, and long-running. Latency is\nless critical than preventing impact on other workloads.\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003EBatch:\u003C/strong\u003E Scheduled, large-scale data processing jobs like ELT/ETL\npipelines. Throughput and predictability are the primary goals.\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003EProgrammatic:\u003C/strong\u003E Automated queries from applications or services\nthat often have highly predictable patterns and strict performance\nrequirements.\u003C/p\u003E\n\u003C/li\u003E\u003C/ul\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003EWorkload Performance Targets\u003C/strong\u003E: For each category, establish\nspecific, measurable, and realistic performance targets. Avoid overly\ngeneral goals, such as &quot;all queries must return in 10 seconds,&quot; in\nfavor of concrete objectives.\u003C/p\u003E\n\u003Cul\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003ELatency Example:\u003C/strong\u003E &quot;95% of all interactive dashboard filter\nqueries must complete in under 10 seconds.&quot;\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003EThroughput Example:\u003C/strong\u003E &quot;The nightly ETL process must load and\ntransform 1 TB of data in under 60 minutes.&quot;\u003C/p\u003E\n\u003C/li\u003E\u003C/ul\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003EData Freshness Tiers:\u003C/strong\u003E The demand for real-time data must be\nbalanced against its often higher cost. Define explicit data freshness\ntiers to align business value with architectural complexity and credit\nconsumption.\u003C/p\u003E\n\u003Cul\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003ENear Real-Time (Seconds to Minutes):\u003C/strong\u003E Highest cost; requires a\nstreaming architecture (e.g., Snowpipe, Dynamic Tables). Justified\nfor use cases like fraud detection, real-time ad selection, etc.\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003EHourly:\u003C/strong\u003E Medium cost; suitable for operational reporting.\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003EDaily:\u003C/strong\u003E Lowest cost; standard for most strategic business\nintelligence and analytics.\u003C/p\u003E\n\u003C/li\u003E\u003C/ul\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003EConcurrency and Scale Projections:\u003C/strong\u003E Plan for the expected load and\nfuture growth to inform warehouse sizing and scaling strategies.\nExamples of key questions to answer include:\u003C/p\u003E\n\u003Cul\u003E\u003Cli\u003E\n","\u003Cp\u003EHow many users are expected to use this system simultaneously during\npeak hours?\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003EWhat is the anticipated data volume growth over the next 6-12\nmonths?\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003EAre there predictable spikes in usage (e.g., end-of-quarter\nreporting, Black Friday)?\u003C/p\u003E\n\u003C/li\u003E\u003C/ul\u003E\n\u003C/li\u003E\u003C/ul\u003E\n","\u003Cp\u003E\u003Cstrong\u003EIntegrating performance into the development lifecycle\u003C/strong\u003E\u003C/p\u003E\n","\u003Cp\u003EValidate agreements from the design phase throughout development.\nProactive performance testing, a &quot;shift-left&quot; methodology, mitigates\nproject risks and prevents launch-time performance issues.\u003C/p\u003E\n","\u003Cp\u003EDo not await large-scale data for performance analysis. Early on, review\nquery profiles and EXPLAIN plans to identify potential problems like\nexploding joins (join with a missing or incorrect condition, causing a\nmassive, unintended multiplication of rows) or full table scans, which\nindicate ineffective query pruning.\u003C/p\u003E\n","\u003Ch4\u003EMandatory pre-release benchmarking\u003C/h4\u003E\n","\u003Cp\u003EBefore deploying a new workload to production, benchmark it as a formal\nquality gate. This involves running it on a production-sized data clone\nin a staging environment to validate that it meets the Workload\nRequirements Agreement's SLOs.\u003C/p\u003E\n","\u003Cp\u003EFor critical workloads, integrate performance benchmarks into the CI/CD\npipeline. This practice automatically detects performance regressions\nfrom code changes, allowing for immediate fixes rather than user\ndiscovery in production.\u003C/p\u003E\n","\u003Ch3\u003ECommon design shortcomings to avoid\u003C/h3\u003E\n","\u003Cp\u003EFailing to implement a Performance by Design methodology often leads to\none of the following common and costly mistakes.\u003C/p\u003E\n","\u003Cp\u003E\u003Cstrong\u003EApplying a single, aggressive SLA universally\u003C/strong\u003E\u003C/p\u003E\n","\u003Cp\u003EApplying a single, aggressive performance target (e.g., &quot;all queries\nunder 5 seconds&quot;) to every workload leads to inefficiencies. This forces\nad-hoc analysis, outlier queries, and interactive dashboards to share\nthe same expensive configuration, increasing credit usage unnecessarily.\u003C/p\u003E\n","\u003Cp\u003E\u003Cstrong\u003EDisregarding the cost of data freshness\u003C/strong\u003E\u003C/p\u003E\n","\u003Cp\u003EAn unexamined data latency requirement, such as &quot;data must be 1 minute\nfresh,&quot; can significantly increase credit consumption. Often, data\nfreshness exceeds actual needs without fully discussing associated\ncosts. This can lead to paying a high price for a streaming architecture\nthat may not deliver proportional business value.\u003C/p\u003E\n","\u003Cp\u003E\u003Cstrong\u003EPerformance discrepancies at deployment\u003C/strong\u003E\u003C/p\u003E\n","\u003Cp\u003EDeferring performance testing until a project's end results in\nunacceptably slow or expensive processes discovered just before launch.\nThis often leads to emergency fixes, missed deadlines, and the\nbrute-force solution of running workloads on oversized warehouses. This\nobscures underlying design flaws at a significant ongoing cost.\u003C/p\u003E\n","\u003Ch2\u003EFoundational First Steps\u003C/h2\u003E\n","\u003Ch4\u003EPerformance in the cloud\u003C/h4\u003E\n","\u003Cp\u003EIn an on-premises environment, performance is often a sunk cost. The\ncloud, particularly Snowflake, links performance and cost optimization.\nEvery query, active virtual warehouse, and background service consumes\ncredits, making performance an ongoing operational consideration.\u003C/p\u003E\n","\u003Cp\u003EThis guide focuses on initial steps to build a performant, scalable, and\ncost-effective environment. Make conscious performance and cost\ndecisions before significant development to establish a solid\narchitectural foundation, preventing costly re-engineering.\u003C/p\u003E\n","\u003Ch4\u003EEstablish and validate performance objectives\u003C/h4\u003E\n","\u003Cp\u003EEffective performance objectives are specific, measurable, and\nrealistic. They serve as the benchmark against which you can measure the\nsuccess of your architecture. When defining your targets, you should\nfocus on key metrics that directly impact your workloads.\u003C/p\u003E\n","\u003Cp\u003EConsider the following core performance characteristics:\u003C/p\u003E\n\u003Cul\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003ELatency\u003C/strong\u003E: Ensure queries complete quickly for interactive\napplications. For example, 95% of dashboard filter queries should\ncomplete in under 10 seconds.\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003EThroughput\u003C/strong\u003E: Measure the work your system accomplishes over time,\nvital for batch processing and data ingestion. For instance, the\nnightly ETL process must load and transform 1 TB in under 60 minutes.\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003EConcurrency\u003C/strong\u003E: Determine how many simultaneous queries your system\nsupports without performance issues, crucial for applications with\nnumerous users. The primary BI warehouse should support 200 concurrent\nusers during peak hours without query queuing.\u003C/p\u003E\n\u003C/li\u003E\u003C/ul\u003E\n","\u003Cp\u003EThese objectives must be aligned with specific workload characteristics\nand balanced against the real-world business and budget constraints of\nyour project. They are established for a specific workload and rarely\napply across all workloads.\u003C/p\u003E\n","\u003Ch3\u003ETactical Day One configurations &amp; concepts\u003C/h3\u003E\n","\u003Cp\u003EOnce you have a strategic plan, you can implement tactical\nconfigurations that set a baseline for good performance and cost\nmanagement.\u003C/p\u003E\n","\u003Ch4\u003EProactive guardrails\u003C/h4\u003E\n","\u003Cp\u003EOptimizing warehouse performance involves strategic configuration. These\nsettings are your first line of defense against runaway queries and\nunexpected costs.\u003C/p\u003E\n\u003Cul\u003E\u003Cli\u003E\n","\u003Cp\u003EAn effective \u003Cstrong\u003EWarehouse auto-suspend strategy\u003C/strong\u003E balances credit\nsavings and performance. Suspended warehouses consume no credits but\nlose their data cache, leading to slower subsequent queries. Tailor\nthe strategy to your workload:\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003EELT/ETL warehouses:\u003C/strong\u003E Use an aggressive suspend time (e.g., 1-2\nminutes). These jobs are typically bursty, making it inefficient to\nkeep the warehouse running after completion.\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003EBI/dashboard warehouses:\u003C/strong\u003E Employ a more lenient suspend time (e.g.,\n10-20 minutes). The performance benefit of a warm cache for\nlatency-sensitive users often outweighs the cost of brief idle\nperiods.\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003ESetting statement timeouts\u003C/strong\u003E is crucial to prevent long-running,\ncostly queries. The default timeout (48 hours) is often too long.\nConfigure the\n\u003Ca href=\"https://docs.snowflake.com/en/sql-reference/parameters#statement-timeout-in-seconds\"\u003E&lt;u&gt;STATEMENT_TIMEOUT_IN_SECONDS&lt;/u&gt;\u003C/a\u003E\nparameter on your warehouses to a sensible maximum, such as 15 minutes\nfor a dashboard warehouse or 8 hours for a complex ETL warehouse.\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003EConfiguring Resource Monitors\u003C/strong\u003E provides a safety net for budget\ncontrol. These monitors track warehouse credit consumption and can\ntrigger actions like notifications or automatic suspension when\nthresholds are exceeded. It's best practice to set up monitors at both\nthe account and individual warehouse levels. Refer to \u003Ca href=\"https://docs.snowflake.com/en/user-guide/resource-monitors\"\u003E&lt;u&gt;Working with\nresource monitors in the Snowflake\ndocumentation&lt;/u&gt;\u003C/a\u003E\nfor more information.\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003EBudgets\u003C/strong\u003E offer a flexible way to monitor and control spending\nacross your Snowflake account. They track credit usage for\ncustomizable objects, including warehouses and serverless features.\nBudgets can alert stakeholders when projected costs approach or exceed\npredefined limits, enabling a proactive approach to managing overall\nspend. See \u003Ca href=\"https://docs.snowflake.com/en/user-guide/budgets\"\u003E&lt;u&gt;Monitor credit usage with budgets in the Snowflake\ndocumentation&lt;/u&gt;\u003C/a\u003E\nfor details.\u003C/p\u003E\n\u003C/li\u003E\u003C/ul\u003E\n","\u003Ch4\u003EFundamental architectural concepts\u003C/h4\u003E\n\u003Cul\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003EScale up for complexity:\u003C/strong\u003E Increase warehouse size (e.g., from\nMedium to Large) to improve a single, large, or complex query's\nperformance. A larger warehouse provides more resources&mdash;memory, CPU,\nand temporary storage&mdash;to complete the work faster.\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003EScale out for concurrency:\u003C/strong\u003E For a higher number of concurrent users\nand queries, increase the number of clusters in a multi-cluster\nwarehouse. This doesn't make individual queries faster but allows more\nto run simultaneously without performance bottlenecks.\u003C/p\u003E\n\u003C/li\u003E\u003C/ul\u003E\n","\u003Ch4\u003EUsing the right tool for the job (targeted acceleration)\u003C/h4\u003E\n","\u003Cp\u003ESnowflake offers several powerful features that accelerate performance\nfor specific use cases. Using them correctly is key.\u003C/p\u003E\n\u003Cul\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003ESearch Optimization Service\u003C/strong\u003E This service accelerates point-lookup\nqueries on large tables. It creates a lightweight search access path,\nallowing Snowflake to pinpoint data in micro-partitions and bypass\nfull table scans. It's most effective on high-cardinality columns like\nUUIDs or email addresses. See \u003Ca href=\"https://medium.com/snowflake/search-optimization-c99b2117cb2e\"\u003E&lt;u&gt;The Expat Guide to Search\nOptimization\nService&lt;/u&gt;\u003C/a\u003E.\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003EMaterialized Views (MVs)\u003C/strong\u003E MVs are for massive-scale problems, not\ngeneral tuning. Consider them only when data reduction from the base\ntable is substantial, such as for pre-calculating large dashboard\naggregations or optimizing multi-billion row tables. MVs incur\ncontinuous storage and compute costs for maintenance, which must be\njustified by performance gains. See \u003Ca href=\"https://docs.snowflake.com/en/user-guide/views-materialized\"\u003E&lt;u&gt;Working with Materialized\nViews in the Snowflake\ndocumentation&lt;/u&gt;\u003C/a\u003E.\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003EQuery Acceleration Service (QAS)\u003C/strong\u003E QAS acts as a safety net for your\nwarehouse, handling outlier queries with unexpectedly large scans. It\noffloads parts of this work to shared Snowflake compute resources,\npreventing large queries from monopolizing your warehouse and\nimpacting other users. QAS is not a primary tuning tool, but it\nimproves warehouse stability. See \u003Ca href=\"https://docs.snowflake.com/en/user-guide/query-acceleration-service\"\u003E&lt;u&gt;Using the Query Acceleration\nService (QAS) in the Snowflake\ndocumentation&lt;/u&gt;\u003C/a\u003E.\u003C/p\u003E\n\u003C/li\u003E\u003C/ul\u003E\n","\u003Ch4\u003EModern data transformation\u003C/h4\u003E\n","\u003Cp\u003EDynamic Tables offer declarative data transformation. When designing\nthem, simplicity is key. Performance depends on the query and a hidden\nChange Data Capture (CDC) process checking source tables. Complex\nqueries with many joins create intricate CDC dependency graphs, slowing\nrefresh times. Chaining simpler Dynamic Tables is often more performant\nand manageable than a single, complex one. For more information, see\n\u003Ca href=\"https://docs.snowflake.com/en/user-guide/dynamic-tables-about\"\u003E&lt;u&gt;Dynamic tables in the Snowflake\ndocumentation&lt;/u&gt;\u003C/a\u003E.\u003C/p\u003E\n","\u003Ch3\u003EConclusion\u003C/h3\u003E\n","\u003Cp\u003EA high-performing Snowflake environment starts on day one. By moving\nfrom strategic planning to tactical configurations, you establish a\nrobust framework. These initial steps&mdash;defining objectives, configuring\nguardrails, and using the right tools&mdash;are essential for building a\nperformant, scalable, and cost-effective architecture in the Snowflake\nData Cloud.\u003C/p\u003E\n","\u003Ch2\u003ELeveraging elasticity for performance\u003C/h2\u003E\n","\u003Ch4\u003EThe power of elastic compute\u003C/h4\u003E\n","\u003Cp\u003ESnowflake&rsquo;s architecture separates storage and compute, enabling\nindependent and dynamic scaling. This ensures the precise processing\npower needed for your workloads. Leveraging this elasticity is crucial\nfor a well-architected Snowflake environment.\u003C/p\u003E\n","\u003Cp\u003EThe goal is optimal price-for-performance, avoiding both\nunder-provisioning (slow queries, missed SLOs) and over-provisioning\n(unnecessary credit consumption).\u003C/p\u003E\n","\u003Cp\u003EThis guide details three primary elasticity mechanisms. Understanding\nhow and when to use each helps build a responsive, efficient, and\ncost-effective data platform. The three mechanisms are:\u003C/p\u003E\n\u003Cul\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003EVertical Scaling:\u003C/strong\u003E Adjusting the size of a warehouse (for example\nfrom Medium to Large) to handle more complex queries and larger data\nvolumes.\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003EHorizontal Scaling:\u003C/strong\u003E Adjusting the number of clusters in a\nwarehouse to manage workload concurrency.\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003EQuery Acceleration Service:\u003C/strong\u003E Augmenting a warehouse with serverless\nresources to handle unpredictable, outlier queries.\u003C/p\u003E\n\u003C/li\u003E\u003C/ul\u003E\n","\u003Ch4\u003EIsolate your workloads\u003C/h4\u003E\n","\u003Cp\u003EBefore applying any scaling strategy, you must first isolate your\nworkloads. A common performance anti-pattern is to direct all users and\nprocesses to a single, large virtual warehouse. This approach makes it\nimpossible to apply the correct scaling strategy, as the warehouse is\nforced to handle workloads with conflicting performance profiles.\u003C/p\u003E\n","\u003Cp\u003EA fundamental best practice is to create separate, dedicated warehouses\nfor distinct workloads. For example, your architecture should include\ndifferent warehouses for:\u003C/p\u003E\n\u003Cul\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003EETL/ELT:\u003C/strong\u003E These workloads are often characterized by complex,\nlong-running transformations that benefit from larger warehouses but\nmay not require high concurrency.\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003EBI Dashboards:\u003C/strong\u003E These workloads typically involve many concurrent,\nshort-running, repetitive queries. They demand low latency and benefit\nfrom horizontal scaling.\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003EData Science:\u003C/strong\u003E These workloads can be highly variable, often\ninvolving exploratory analysis and long-running model training that\nrequire specific sizing and timeouts.\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003EAd-Hoc Analysis:\u003C/strong\u003E These queries from data analysts are often\nunpredictable in both complexity and concurrency.\u003C/p\u003E\n\u003C/li\u003E\u003C/ul\u003E\n","\u003Cp\u003EBy isolating workloads, you can observe the specific performance profile\nof each and apply the most appropriate and cost-effective scaling\nstrategy described below.\u003C/p\u003E\n","\u003Ch3\u003EVertical scaling: sizing up for complexity and scale\u003C/h3\u003E\n","\u003Cp\u003EVertical scaling, or resizing, modifies a warehouse's compute power.\nSnowflake warehouses, offered in &quot;t-shirt sizes&quot; (X-Small, Small,\nMedium, etc.), double compute resources&mdash;CPU, memory, and local disk\ncache&mdash;with each size increase.\u003C/p\u003E\n","\u003Cp\u003EConsider scaling up when a single query or complex operations demand\nmore resources than the current warehouse size can efficiently provide.\nA larger warehouse can accelerate complex queries by parallelizing work\nacross more nodes. However, increasing warehouse size is not a universal\nsolution for slow queries; diagnose the performance bottleneck first.\u003C/p\u003E\n","\u003Ch4\u003EWhen to scale up: A diagnostic checklist\u003C/h4\u003E\n","\u003Cp\u003EBefore increasing a warehouse&rsquo;s size, use the following checklist to\nvalidate that it is the appropriate solution.\u003C/p\u003E\n","\u003Cp\u003E\u003Cstrong\u003ESymptom 1: Disk spilling\u003C/strong\u003E\u003C/p\u003E\n","\u003Cp\u003ESpilling occurs when a query&rsquo;s intermediate results exceed a warehouse&rsquo;s\navailable memory and must be written to disk. This is a primary\nindicator of an undersized warehouse. You can identify spilling in the\nQuery Profile. There are two types of spilling, each with a different\nlevel of severity:\u003C/p\u003E\n\u003Cul\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003ELocal Spilling:\u003C/strong\u003E This indicates a \u003Cstrong\u003Ewarning\u003C/strong\u003E. Data is written from\nmemory to the warehouse&rsquo;s local disk, impacting query performance.\nEvaluate local spilling within your workload's SLA and the\nspill-to-RAM ratio. For instance, if 1 TB of data is processed in\nmemory with 10 GB spilled, the impact might be minor. However, if 20\nGB is processed with 10 GB spilled, the warehouse is likely\nundersized.\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003ERemote Spilling:\u003C/strong\u003E This is a \u003Cstrong\u003Ecritical alert\u003C/strong\u003E. Data has exhausted\nboth memory and local disk, spilling to remote cloud storage. This\nseverely degrades performance. Queries exhibiting significant remote\nspilling are strong candidates for a larger warehouse.\u003C/p\u003E\n\u003C/li\u003E\u003C/ul\u003E\n","\u003Cp\u003E\u003Cstrong\u003ESymptom 2: Slow, CPU-bound queries (non-spilling)\u003C/strong\u003E\u003C/p\u003E\n","\u003Cp\u003ESometimes a query is slow even without spilling significant data. This\noften indicates that the query is CPU-bound and could benefit from the\nadditional processing power of a larger warehouse. However, before\nresizing, you must first verify that the query can actually take\nadvantage of the added resources.\u003C/p\u003E\n\u003Cul\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003EPrerequisite 1: Verify Sufficient Parallelism Potential.\u003C/strong\u003E A query&rsquo;s\nparallelism is limited by the number of micro-partitions it scans. If\nthere are not enough partitions, additional nodes in a larger\nwarehouse will sit idle. As a rule of thumb, a query should scan at\nleast \u003Cstrong\u003E~40 micro-partitions per node\u003C/strong\u003E in the warehouse for a size\nincrease to be effective. You can find the number of partitions\nscanned in the Table Scan operator within the Query Profile.\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003EPrerequisite 2: Verify a Lack of Execution Skew.\u003C/strong\u003E Performance\nissues can also arise from data skew, where most of the processing is\nforced onto a single node. In the \u003Ca href=\"https://docs.google.com/document/d/1LDeFasziRlYL1Z5t9BqJ_MwhECtJHbRDKG5BNWUAuwU/edit?tab=t.lhzra61et1j6\"\u003E&lt;u&gt;Query\nProfile&lt;/u&gt;\u003C/a\u003E,\ncheck the per-node execution time. If one node is active for\nsignificantly longer than its peers, the problem lies in the data\ndistribution or query structure, not the warehouse size. Sizing up\nwill not solve this problem.\u003C/p\u003E\n\u003C/li\u003E\u003C/ul\u003E\n","\u003Cp\u003EOnly after confirming that a query has sufficient parallelism potential\nand is not suffering from execution skew should you test it on a larger\nwarehouse to address a CPU bottleneck.\u003C/p\u003E\n","\u003Cp\u003ESee \u003Ca href=\"https://docs.snowflake.com/en/user-guide/performance-query-warehouse-size\"\u003E&lt;u&gt;Increasing warehouse size in the Snowflake\ndocumentation&lt;/u&gt;\u003C/a\u003E\nfor more information.\u003C/p\u003E\n","\u003Ch4\u003EReference Table: Warehouse sizing for parallelism\u003C/h4\u003E\n","\u003Cp\u003EUse the following table to determine the minimum number of\nmicro-partitions a query should scan to effectively utilize a given\nwarehouse size.\u003C/p\u003E\n\u003Ctable\u003E\u003Cthead\u003E\u003Ctr\u003E\u003Cth colspan=\"1\" rowspan=\"1\"\u003E\u003Cstrong\u003EWarehouse Size\u003C/strong\u003E\u003C/th\u003E\u003Cth colspan=\"1\" rowspan=\"1\"\u003E\u003Cstrong\u003EMinimum Micro-partitions Scanned\u003C/strong\u003E\u003C/th\u003E\u003C/tr\u003E\u003C/thead\u003E\u003Ctbody\u003E\u003Ctr\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003EX-Small\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E40\u003C/td\u003E\u003C/tr\u003E\u003Ctr\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003ESmall\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E80\u003C/td\u003E\u003C/tr\u003E\u003Ctr\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003EMedium\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E160\u003C/td\u003E\u003C/tr\u003E\u003Ctr\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003ELarge\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E320\u003C/td\u003E\u003C/tr\u003E\u003Ctr\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003EX-Large\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E640\u003C/td\u003E\u003C/tr\u003E\u003Ctr\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E2X-Large\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E1,280\u003C/td\u003E\u003C/tr\u003E\u003Ctr\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E3X-Large\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E2,560\u003C/td\u003E\u003C/tr\u003E\u003Ctr\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E4X-Large\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E5,120\u003C/td\u003E\u003C/tr\u003E\u003Ctr\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E5X-Large\u003C/td\u003E\u003Ctd colspan=\"1\" rowspan=\"1\"\u003E10,240\u003C/td\u003E\u003C/tr\u003E\u003C/tbody\u003E\u003C/table\u003E\n","\u003Ch3\u003EHorizontal scaling: scaling out for concurrency\u003C/h3\u003E\n","\u003Cp\u003EHorizontal scaling increases the number of compute clusters available to\nyour warehouse. This is the primary tool for managing high\nconcurrency&mdash;that is, a high volume of simultaneous queries. When you\nconfigure a multi-cluster warehouse, Snowflake automatically adds and\nremoves clusters of the same size in response to query load.\u003C/p\u003E\n","\u003Cp\u003EThis allows your warehouse to handle fluctuating numbers of users and\nqueries without queueing. As more queries arrive, new clusters are\nstarted to run them in parallel. As the query load subsides, clusters\nare automatically suspended to save credits.\u003C/p\u003E\n","\u003Ch4\u003EConfiguration modes\u003C/h4\u003E\n","\u003Cp\u003EYou can configure a multi-cluster warehouse to run in one of two modes:\u003C/p\u003E\n\u003Cul\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003EAuto-scale Mode:\u003C/strong\u003E The default and most common setting, this mode\nautomatically adjusts the number of clusters within a defined minimum\nand maximum (e.g., 1 to 8). This is ideal for varying concurrency, as\nSnowflake starts and stops clusters to match query load.\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003EMaximized Mode:\u003C/strong\u003E This mode continuously runs the maximum specified\nnumber of clusters (e.g., 8 clusters if both minimum and maximum are\nset to 8). It suits workloads with consistently high and predictable\nconcurrency, eliminating latency from new cluster starts.\u003C/p\u003E\n\u003C/li\u003E\u003C/ul\u003E\n","\u003Ch4\u003ETuning auto-scale with scaling policies\u003C/h4\u003E\n","\u003Cp\u003EWhen using Auto-scale mode, you can further refine its behavior by\nsetting a scaling policy. This allows you to define the warehouse&rsquo;s\npriority: minimizing wait time or maximizing credit savings.\u003C/p\u003E\n\u003Cul\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003EStandard Policy (Performance-First):\u003C/strong\u003E This policy prioritizes a\nfast user experience, minimizing queueing by launching new clusters if\na query is queued for a few seconds. It is ideal for time-sensitive,\nuser-facing workloads such as BI dashboards and analytical\napplications.\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003EEconomy Policy (Cost-First):\u003C/strong\u003E This policy prioritizes cost savings\nby starting new clusters more conservatively. A new cluster launches\nonly if a query backlog is estimated to keep it busy for at least six\nminutes. This makes it a good choice for non-urgent background\nprocesses like ETL/ELT pipelines, where some queueing is an acceptable\ntrade-off for lower credit consumption.\u003C/p\u003E\n\u003C/li\u003E\u003C/ul\u003E\n","\u003Cp\u003ESee \u003Ca href=\"https://docs.snowflake.com/en/user-guide/warehouses-multicluster\"\u003E&lt;u&gt;Multi-cluster warehouses in the Snowflake\ndocumentation&lt;/u&gt;\u003C/a\u003E\nfor more information.\u003C/p\u003E\n","\u003Ch3\u003EQuery Acceleration Service (QAS): Handling workload volatility\u003C/h3\u003E\n","\u003Cp\u003EThe Query Acceleration Service (QAS) enhances warehouse performance by\nproviding serverless compute resources to accelerate specific, eligible\nqueries, particularly large table scans. QAS addresses \u003Cstrong\u003Eworkload\nvolatility\u003C/strong\u003E, handling unpredictable, large &quot;outlier&quot; queries that\noccasionally burden a correctly sized warehouse. This service ensures\nsmooth performance without requiring a larger, more expensive warehouse\nfor infrequent, costly queries.\u003C/p\u003E\n","\u003Ch4\u003EThe use case for QAS\u003C/h4\u003E\n","\u003Cp\u003EYou should consider enabling QAS for a warehouse when you observe\nqueries that fit the following profile:\u003C/p\u003E\n\u003Col\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003EThe query is an outlier:\u003C/strong\u003E The warehouse performs well for the\nmajority of its queries but struggles with a few long-running\nqueries.\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003EThe query is dominated by table scans:\u003C/strong\u003E The performance\nbottleneck is the part of the query reading large amounts of data.\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003EThe query reduces the number of rows:\u003C/strong\u003E After scanning a large\namount of data, filters or aggregates reduce the row count\nsignificantly.\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003EThe estimated scan time is greater than one minute:\u003C/strong\u003E QAS has a\nsmall startup overhead, making it ineffective for shorter queries.\nIt only provides a benefit when accelerating scan operations that\nare estimated to take longer than 60 seconds.\u003C/p\u003E\n\u003C/li\u003E\u003C/ol\u003E\n","\u003Cp\u003EUsing QAS for this specific use case allows you to improve the\nperformance of a volatile workload in a highly cost-effective manner.\u003C/p\u003E\n","\u003Cp\u003ESee \u003Ca href=\"https://docs.snowflake.com/en/user-guide/query-acceleration-service\"\u003E&lt;u&gt;Using the Query Acceleration Service (QAS) in the Snowflake\ndocumentation&lt;/u&gt;\u003C/a\u003E\nfor more information on QAS\u003C/p\u003E\n","\u003Ch3\u003ESummary: A strategic decision framework\u003C/h3\u003E\n","\u003Cp\u003EChoosing the right elasticity tool begins with understanding your\nworkload and identifying the specific performance problem you are\nfacing. Once you have isolated your workloads into dedicated warehouses,\nuse the following framework to guide your scaling strategy.\u003C/p\u003E\n","\u003Cp\u003EStart by asking: \u003Cstrong\u003E&quot;What is making my warehouse slow?&quot;\u003C/strong\u003E\u003C/p\u003E\n\u003Cul\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003ESymptom:\u003C/strong\u003E &quot;My queries are waiting in a queue because too many are\nrunning at once.&quot;\u003C/p\u003E\n\u003Cul\u003E\u003Cli\u003E\u003Cstrong\u003ESolution:\u003C/strong\u003E Your problem is \u003Cstrong\u003Econcurrency\u003C/strong\u003E. Use \u003Cstrong\u003EHorizontal\nScaling\u003C/strong\u003E by configuring a multi-cluster warehouse. Tune the scaling\npolicy (Standard or Economy) based on the workload&rsquo;s time\nsensitivity.\u003C/li\u003E\u003C/ul\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003ESymptom:\u003C/strong\u003E &quot;A single, complex query is taking too long to complete,\neven when running by itself.&quot;\u003C/p\u003E\n\u003Cul\u003E\u003Cli\u003E\u003Cstrong\u003ESolution:\u003C/strong\u003E Your problem is \u003Cstrong\u003Ecomplexity\u003C/strong\u003E. Use the diagnostic\nchecklist for \u003Cstrong\u003EVertical Scaling\u003C/strong\u003E. First, check for disk spilling.\nIf there is none, verify that the query has sufficient parallelism\npotential and is not skewed before testing it on a larger warehouse.\u003C/li\u003E\u003C/ul\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003ESymptom:\u003C/strong\u003E &quot;My warehouse is usually fast, but occasionally a single\nhuge query slows everything down.&quot;\u003C/p\u003E\n\u003Cul\u003E\u003Cli\u003E\u003Cstrong\u003ESolution:\u003C/strong\u003E Your problem is \u003Cstrong\u003Evolatility\u003C/strong\u003E. Investigate using the\n\u003Cstrong\u003EQuery Acceleration Service\u003C/strong\u003E. Verify that the outlier queries are\nscan-heavy and meet the one-minute scan time threshold.\u003C/li\u003E\u003C/ul\u003E\n\u003C/li\u003E\u003C/ul\u003E\n","\u003Cp\u003EPerformance management is not a one-time setup. It is an iterative\nprocess. You should continuously monitor your query performance and\nwarehouse utilization, using these elasticity tools to tune your\nenvironment and maintain the optimal balance between performance and\ncost.\u003C/p\u003E\n","\u003Ch2\u003ETest-first design: Building performance into every stage\u003C/h2\u003E\n","\u003Cp\u003EA high-performing Snowflake environment stems from a deliberate\nstrategy. Performance validation is integrated into every development\nphase. This &quot;Test-First Design&quot; approach shifts performance\nconsiderations to a proactive, continuous process, preventing\narchitectural debt and ensuring efficient resource utilization. It\nsupports the Performance by Design philosophy, ensuring that defined\nService Level Objectives (SLOs) are met, validated, and sustained with\noptimal cost efficiency.\u003C/p\u003E\n","\u003Ch3\u003EProactive performance validation\u003C/h3\u003E\n","\u003Cp\u003EIn Snowflake's consumption model, performance cost is tied to resource\nusage. Deferring performance testing creates technical debt, as flaws\nbecome expensive to fix. This can lead to re-engineering, missed\ndeadlines, or over-provisioning compute, masking inefficiencies at\nsignificant cost.\u003C/p\u003E\n","\u003Cp\u003ESnowflake's ease of use and elasticity can lead to an informal approach\nto performance. Vague directives like &quot;queries should be fast&quot; are\ninsufficient. Without clear, measurable, agreed-upon performance\nmetrics, designing, validating, or guaranteeing objectives is\nimpossible.\u003C/p\u003E\n","\u003Cp\u003EProactive performance validation addresses these challenges head-on by:\u003C/p\u003E\n\u003Cul\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003EMitigating Technical Debt:\u003C/strong\u003E Identifying and correcting design flaws\nearly, when they are cheapest to fix.\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003EEnsuring Predictable Outcomes:\u003C/strong\u003E Translating business expectations\ninto quantifiable performance objectives that guide design and\ndevelopment.\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003EOptimizing Cost Efficiency:\u003C/strong\u003E Balancing performance needs with\nresource consumption to achieve the best price-for-performance.\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003EReducing Risk:\u003C/strong\u003E Preventing performance problems before production\ndeployment.\u003C/p\u003E\n\u003C/li\u003E\u003C/ul\u003E\n","\u003Ch4\u003EFormalizing performance: KPIs, SLOs, and baselines\u003C/h4\u003E\n","\u003Cp\u003ESuccessful performance validation starts with clearly defined\nexpectations. Vague expectations cannot be tested, measured, or\noptimized. Formalize performance requirements using Key Performance\nIndicators (KPIs) and Service Level Objectives (SLOs) to establish\nbaselines for testing and operational monitoring. This process extends\nthe Workload Requirements Agreements (WRA) detailed in the Performance\nby Design guidance.\u003C/p\u003E\n","\u003Cp\u003E\u003Cstrong\u003EKey Performance Indicators (KPIs) for Snowflake Workloads:\u003C/strong\u003E\u003C/p\u003E\n\u003Cul\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003EData Freshness (Latency):\u003C/strong\u003E The elapsed time from when data is\ngenerated in source systems to when it is available for querying in\nSnowflake.\u003C/p\u003E\n\u003Cul\u003E\u003Cli\u003E\u003Cem\u003EExample SLO:\u003C/em\u003E &quot;99% of all point-of-sale transaction data must be\navailable in the SALES_ANALYTICS table within 5 minutes of the\ntransaction occurring.&quot;\u003C/li\u003E\u003C/ul\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003EQuery Latency (Response Time):\u003C/strong\u003E The time taken for a query to\nexecute and return results to the user or application. This is often\nexpressed using percentiles to account for variability.\u003C/p\u003E\n\u003Cul\u003E\u003Cli\u003E\u003Cem\u003EExample SLO:\u003C/em\u003E &quot;For the EXECUTIVE_DASHBOARD_WH, P90 (90th\npercentile) of interactive queries must complete in under 3 seconds,\nand P99 must complete in under 5 seconds.&quot;\u003C/li\u003E\u003C/ul\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003EThroughput:\u003C/strong\u003E The volume of data or number of operations processed\nwithin a given timeframe, crucial for batch and ingestion workloads.\u003C/p\u003E\n\u003Cul\u003E\u003Cli\u003E\u003Cem\u003EExample SLO:\u003C/em\u003E &quot;The nightly ETL_LOAD_WH must ingest and transform 50\nGB of raw transactional data into aggregated analytical tables\nwithin 30 minutes.&quot;\u003C/li\u003E\u003C/ul\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003EConcurrency:\u003C/strong\u003E The number of simultaneous queries or users the\nsystem can support without significant performance degradation or\nexcessive queuing.\u003C/p\u003E\n\u003Cul\u003E\u003Cli\u003E\u003Cem\u003EExample SLO:\u003C/em\u003E &quot;The primary BI_REPORTING_WH must seamlessly support\n100 concurrent users during peak hours (9 AM - 11 AM PST) with\naverage query queue time not exceeding 5 seconds.&quot;\u003C/li\u003E\u003C/ul\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003ECost Efficiency:\u003C/strong\u003E The credit consumption relative to the business\nvalue or volume of work performed. This is a critical KPI for CDOs and\nFinOps.\u003C/p\u003E\n\u003Cul\u003E\u003Cli\u003E\u003Cem\u003EExample SLO:\u003C/em\u003E &quot;The DAILY_REPORTING_JOB must process 1 TB of raw\ndata at a cost of no more than 100 credits per run, across all\nassociated warehouses.&quot;\u003C/li\u003E\u003C/ul\u003E\n\u003C/li\u003E\u003C/ul\u003E\n","\u003Ch3\u003EEstablishing baselines:\u003C/h3\u003E\n","\u003Cp\u003EBaselines represent the expected or target performance. For new\nprojects, these are often derived from:\u003C/p\u003E\n\u003Cul\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003EDesign document:\u003C/strong\u003E The formally agreed-upon SLOs become the initial\ntarget baselines.\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003ESynthetic data &amp; Proof-of-Concept (PoC):\u003C/strong\u003E Early tests with\nrepresentative, scaled-down data can provide initial estimates.\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003EHistorical data:\u003C/strong\u003E For migrations, existing system performance can\ninform baselines, with adjustments for Snowflake's capabilities.\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003EIndustry benchmarks:\u003C/strong\u003E Comparisons with similar workloads in\ncomparable environments.\u003C/p\u003E\n\u003C/li\u003E\u003C/ul\u003E\n","\u003Cp\u003EThese formalized metrics transform abstract goals into concrete,\ntestable objectives, laying the groundwork for effective performance\nvalidation.\u003C/p\u003E\n","\u003Ch4\u003EShifting left: Integrating performance testing into design &amp; development\u003C/h4\u003E\n","\u003Cp\u003EThe shift-left principle for performance involves embedding testing\nactivities as early as possible in the development lifecycle. This\nensures that performance considerations are an inherent part of the\ndesign and implementation, preventing the accumulation of technical\ndebt.\u003C/p\u003E\n","\u003Ch4\u003EPerformance in the design phase:\u003C/h4\u003E\n","\u003Cp\u003EEven before a single line of code is written, critical performance\ndecisions are made. This phase focuses on architectural review and\nproactive estimation.\u003C/p\u003E\n\u003Cul\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003EArchitectural Review:\u003C/strong\u003E Evaluate data models, ingestion, and access\npatterns, and transformation logic for performance. Consider the\nimpact of large JOINs on data shuffling or complex views on query\nexecution.\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003EEarly Warehouse Sizing Estimates:\u003C/strong\u003E Based on workload categorization\nand concurrency projections, make initial projections for warehouse\nsizes and multi-cluster configurations. Validate these estimates\nthrough subsequent testing.\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003EQuery Review:\u003C/strong\u003E Analyze proposed high-impact SQL queries or\ntransformation logic. Use EXPLAIN on hypothetical queries to\nunderstand the planned execution and identify potential anti-patterns\nlike full table scans or excessive data movement.\u003C/p\u003E\n\u003C/li\u003E\u003C/ul\u003E\n","\u003Ch4\u003EPerformance in the development phase:\u003C/h4\u003E\n","\u003Cp\u003EAs development progresses, unit-level and integration-level performance\ntesting becomes crucial. Developers must be empowered with the knowledge\nand tools to self-diagnose and optimize their code.\u003C/p\u003E\n\u003Cul\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003EUnit Testing for Queries:\u003C/strong\u003E Developers should test individual SQL\nqueries, views, or stored procedures with representative (often\nscaled-down or synthetic) data. The focus here is on the efficiency of\nthe specific logic.\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003EQuery Profile and EXPLAIN Plan Mastery:\u003C/strong\u003E For developers,\nunderstanding the Snowflake \u003Ca href=\"https://docs.google.com/document/d/1LDeFasziRlYL1Z5t9BqJ_MwhECtJHbRDKG5BNWUAuwU/edit?tab=t.lhzra61et1j6\"\u003E&lt;u&gt;Query\nProfile&lt;/u&gt;\u003C/a\u003E\nis paramount. It provides a detailed breakdown of query execution,\nidentifying bottlenecks, spilling, data shuffling, and operator costs.\u003C/p\u003E\n\u003Cul\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003ECritical Early Warning Signs:\u003C/strong\u003E Beyond obvious remote spilling,\ndevelopers should look for:\u003C/p\u003E\n\u003Cul\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003EHigh Remote I/O:\u003C/strong\u003E Indicates excessive data reads from remote\nstorage, potentially due to poor filtering or table design.\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003ELarge Data Shuffled:\u003C/strong\u003E Signifies inefficient joins or\naggregations causing significant data movement between warehouse\nnodes.\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003EIneffective Pruning:\u003C/strong\u003E Scanning many more micro-partitions than\nnecessary, suggesting missing WHERE clause filters or suboptimal\nclustering.\u003C/p\u003E\n\u003C/li\u003E\u003C/ul\u003E\n\u003C/li\u003E\u003C/ul\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003EDedicated Dev/Test Environments with Data Cloning:\u003C/strong\u003E Leverage\nSnowflake's Zero-Copy Cloning capability to create isolated,\nfull-scale, or representative copies of production data in development\nand testing environments. This allows developers and testers to run\nrealistic performance tests without impacting production or incurring\nhigh costs for duplicate data storage.\u003C/p\u003E\n\u003C/li\u003E\u003C/ul\u003E\n","\u003Ch4\u003EComprehensive performance validation: load, scale, and stress testing\u003C/h4\u003E\n","\u003Cp\u003EBefore promoting any significant change or new workload to production, a\nstructured approach to load, scalability, and stress testing is\nessential. These tests validate the architecture under various\nreal-world and extreme conditions, directly addressing the risks of\ndeploying untested changes and ensuring performance at scale.\u003C/p\u003E\n","\u003Ch4\u003ELoad testing:\u003C/h4\u003E\n","\u003Cp\u003ELoad testing simulates the expected peak concurrent user and query\nvolumes defined in the SLOs. The goal is to verify that the system can\nconsistently meet its performance objectives under anticipated\nproduction loads.\u003C/p\u003E\n\u003Cul\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003EValidation:\u003C/strong\u003E Confirm that query latency and throughput SLOs are\nmet, and that query queuing is within acceptable limits.\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003EMulti-Cluster warehouse behavior:\u003C/strong\u003E Observe how multi-cluster\nwarehouses (in auto-scale mode) respond to increasing load, ensuring\nclusters spin up and down efficiently according to the chosen scaling\npolicy (Standard for performance-first, Economy for cost-first).\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003ETools:\u003C/strong\u003E Can involve custom scripting, industry-standard load\ntesting frameworks (e.g., JMeter configured for JDBC/ODBC), or\nspecialized Snowflake testing partners.\u003C/p\u003E\n\u003C/li\u003E\u003C/ul\u003E\n","\u003Ch4\u003EScalability testing:\u003C/h4\u003E\n","\u003Cp\u003EScalability testing assesses how the system performs as data volumes\nand/or user growth increase significantly beyond current expectations.\nThis helps identify limitations in the architecture that might not\nappear under typical load.\u003C/p\u003E\n\u003Cul\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003EData volume growth:\u003C/strong\u003E Simulate increased data over projected periods\n(e.g., 6-12 months). This ensures queries maintain performance or\ndegrade predictably, informing long-term warehouse sizing and\narchitectural decisions.\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003EUser growth:\u003C/strong\u003E Test with more concurrent users than the current\npeak. This helps understand system capacity and identify potential\nbottlenecks.\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003EDetection:\u003C/strong\u003E Look for non-linear performance degradation, where\nsmall load increases lead to disproportionately large performance\ndecreases, often signaling a scaling bottleneck.\u003C/p\u003E\n\u003C/li\u003E\u003C/ul\u003E\n","\u003Ch4\u003EStress testing:\u003C/h4\u003E\n","\u003Cp\u003EStress testing is crucial for identifying the true limits of a system,\nvalidating its resilience, and understanding its failure modes. This\nprocess aims to uncover the performance limitations in the system as\ndesigned, and if necessary correct early &ndash; well in advance of\ndeployment.\u003C/p\u003E\n\u003Cul\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003EExtreme Load:\u003C/strong\u003E Subject the system to sustained, extreme concurrency\nor data processing volumes.\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003EWarehouse Size\u003C/strong\u003E: Determine if a larger warehouse size is needed to\nhandle the workload.\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003EMulti-Cluster Width\u003C/strong\u003E: Explore options for horizontal scale-out to\ndistribute the load across multiple clusters.\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003EAnalyze query performance:\u003C/strong\u003E Identify slow-running queries and\noptimize their execution plan.\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003EMonitor warehouse usage:\u003C/strong\u003E Regularly review warehouse credit\nconsumption and adjust size as needed.\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003ERecovery:\u003C/strong\u003E Evaluate how the system recovers after extreme load,\nensuring stability and data integrity.\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003EQuery Acceleration Service (QAS) Behavior:\u003C/strong\u003E Observe how QAS\nmitigates the impact of unpredictable, outlier queries under stress.\u003C/p\u003E\n\u003C/li\u003E\u003C/ul\u003E\n","\u003Ch4\u003ERegression testing and CI/CD integration:\u003C/h4\u003E\n","\u003Cp\u003ETo prevent performance degradation from new features or code changes,\nintegrate performance benchmarks into the Continuous\nIntegration/Continuous Deployment (CI/CD) pipeline.\u003C/p\u003E\n\u003Cul\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003EBest practice\u003C/strong\u003E: Major code changes should initiate performance\ntests using representative data.\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003EEarly detection:\u003C/strong\u003E Identify performance regressions immediately,\nallowing developers to fix issues before they propagate downstream or\nreach production.\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003EControlled environments:\u003C/strong\u003E Establish dedicated, isolated test\nenvironments (often using\n\u003Ca href=\"https://docs.snowflake.com/en/sql-reference/sql/create-clone\"\u003E&lt;u&gt;CLONE&lt;/u&gt;\u003C/a\u003E\nof production data) for consistent and repeatable performance\nmeasurements.\u003C/p\u003E\n\u003C/li\u003E\u003C/ul\u003E\n","\u003Ch4\u003EPerformance and cost tradeoffs: the continuous optimization loop\u003C/h4\u003E\n","\u003Cp\u003EIn Snowflake, every performance decision is inherently a cost decision.\nIgnoring these tradeoffs can lead to overspending, even with a\nperformant system. The Test-First Design philosophy extends into a\ncontinuous optimization loop, where cost is a primary KPI.\u003C/p\u003E\n","\u003Cp\u003EBy integrating performance and cost considerations from design to\ncontinuous operation, organizations can build a Snowflake environment\nthat is not only robust and responsive but also financially prudent.\nThis proactive, data-driven approach ensures that the investment in\nSnowflake delivers maximum value while avoiding the common pitfalls of\ndeferred performance management.\u003C/p\u003E\n","\u003Ch2\u003EOptimize data architecture and access\u003C/h2\u003E\n","\u003Ch3\u003EOverview\u003C/h3\u003E\n","\u003Cp\u003EOptimal performance relies on solid architectural practices. This\nentails implementing and upholding a comprehensive architectural review\nprocess, employing a layered design to efficiently handle complexity,\nand making the best possible design decisions. This process should\nactively gather input from diverse teams involved in business\napplication development, ensuring all business needs are addressed, and\nthe resulting design accommodates a broad spectrum of requirements.\u003C/p\u003E\n","\u003Cp\u003EKey components of this process are periodic application performance\nreviews, incorporating data quality validations and data lifecycle\nmanagement. Planning physical data access paths to support peak\nperformance is also crucial. Tools for achieving this include effective\ndata modeling techniques, appropriate data type selections for storing\nvalues, and creating favorable data access pathways.\u003C/p\u003E\n","\u003Ch3\u003EDesired outcome\u003C/h3\u003E\n","\u003Cp\u003EAdhering to sound architectural and data access recommendations helps\nSnowflake applications achieve optimal performance and scalability. This\nproactive approach ensures that the application's foundation is robust,\nenabling it to efficiently handle evolving business demands and large\nvolumes of data. The outcome is a highly responsive application that\ndelivers a superior user experience, while simultaneously minimizing\noperational overhead and resource consumption.\u003C/p\u003E\n","\u003Cp\u003EA well-defined architectural review process, coupled with a layered\ndesign, leads to a more maintainable and adaptable Snowflake\napplication. This structured approach simplifies future enhancements,\nbug fixes, and integrations, reducing the total cost of ownership. The\nability to incorporate diverse team input throughout the design phase\nguarantees that the application effectively addresses a broad spectrum\nof business requirements, resulting in a solution that is both\ncomprehensive and future-proof.\u003C/p\u003E\n","\u003Cp\u003EFinally, strategic planning for physical data access paths, along with\neffective data modeling and appropriate data type selections, directly\ntranslates to accelerated query execution and improved data integrity.\nRegular performance reviews, including data quality validations and\nlifecycle management, ensure that data remains accurate, accessible, and\noptimized for peak performance. This integrated approach ultimately\nempowers users with timely and reliable insights, driving better\nbusiness decisions and maximizing the value derived from the Snowflake\nplatform.\u003C/p\u003E\n","\u003Ch3\u003ERecommendations\u003C/h3\u003E\n","\u003Cp\u003EThe following list provides actionable recommendations for a database\npractitioner to achieve strong performance in a Snowflake environment:\u003C/p\u003E\n\u003Col\u003E\u003Cli\u003E\n","\u003Cp\u003EMaintain high data quality\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003EOptimize data models\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003ECarefully choose data types\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003ERefine data access\u003C/p\u003E\n\u003C/li\u003E\u003C/ol\u003E\n","\u003Ch4\u003EMaintain high data quality\u003C/h4\u003E\n","\u003Cp\u003EMaintaining high data quality is critical for achieving optimal query\nperformance and deriving reliable business insights within Snowflake. By\nstrategically utilizing Snowflake's inherent capabilities, such as the\ncareful selection of datatypes and the implementation of NOT NULL\nconstraints, you can establish a robust foundation for data accuracy and\nconsistency. This approach not only streamlines development efforts but\nalso significantly improves the efficiency of join operations.\u003C/p\u003E\n","\u003Cp\u003EWhile Snowflake offers declarative constraints like PRIMARY KEY, UNIQUE,\nand FOREIGN KEY, it's crucial to understand that these are not actively\nenforced by the database. As a result, ensuring true data integrity,\nuniqueness, and accurate referential relationships requires external\nenforcement. You can achieve this by designing application logic or\nintegrated data integration processes. Such external validation is\nindispensable for optimizing query execution, guaranteeing the\ntrustworthiness of analytical results, and ultimately maximizing the\nvalue of your data in Snowflake.\u003C/p\u003E\n","\u003Ch4\u003EOptimize data models\u003C/h4\u003E\n","\u003Cp\u003EOptimizing data models can enhance Snowflake's performance. When\ndesigning schemas, consider the impact of very wide tables. While\nSnowflake is efficient, extensive wide table schemas can increase query\ncompilation time, particularly for complex queries or deep view/CTE\nhierarchies. For short, interactive queries, this impact can be more\nnoticeable. As an alternative, consider VARIANT for numerous scalar\nelements, or VARCHAR structured as JSON, utilizing PARSE_JSON().\nHowever, avoid filtering or joining on scalar attributes in complex\nVARIANT/VARCHAR values, as this can hinder pruning effectiveness.\u003C/p\u003E\n","\u003Cp\u003EStrategic denormalization is another valid technique, especially for\nanalytical workloads. By pre-joining and storing relevant data together,\nyou reduce the number of join operations, benefiting from Snowflake's\ncolumnar storage and micro-partitioning. This co-locates frequently\naccessed attributes, improving data locality and enhancing\nmicro-partition pruning for faster query execution and optimized\nresource consumption.\u003C/p\u003E\n","\u003Ch4\u003ECarefully choose data types\u003C/h4\u003E\n","\u003Cp\u003EOptimizing application query performance in Snowflake relies on data\ntype selection during schema design. Specifically, the data types of\ncolumns used in filter predicates, join keys, and aggregation keys\nsignificantly influence the query optimizer's efficiency and can\nintroduce computational overhead.\u003C/p\u003E\n","\u003Cp\u003EFor optimal performance, use numeric data types for join keys. Temporal\ndata types like DATE and TIMESTAMP_NTZ also generally outperform others\nin filtering and join key scenarios due to their numerical nature.\u003C/p\u003E\n","\u003Cp\u003ECoordinating data types for common join keys across tables within the\nsame schema is crucial. Mismatched data types require explicit or\nimplicit type casting, which consumes CPU cycles and can reduce the\neffectiveness of dynamic (execution time) pruning, leading to measurable\nperformance degradation, especially on the probe side of a join.\u003C/p\u003E\n","\u003Cp\u003EFinally, while collation is sometimes necessary, it introduces\nsignificant performance overhead and should be used sparingly, ideally\nonly for presentation values and never for join keys, as it can\ninterfere with crucial performance features like pruning.\u003C/p\u003E\n","\u003Ch4\u003ERefine data access\u003C/h4\u003E\n","\u003Cp\u003EOptimizing data access in Snowflake is crucial for achieving peak query\nperformance. Several techniques are recommended, starting with\n\u003Cstrong\u003EPruning\u003C/strong\u003E, which minimizes scanned micro-partitions by leveraging\nmetadata. Both static pruning (compile-time, based on WHERE clauses) and\ndynamic pruning (runtime, based on join filters) are utilized. Static\npruning is generally preferred due to its predictability.\u003C/p\u003E\n","\u003Cp\u003E\u003Ca href=\"https://docs.snowflake.com/en/user-guide/tables-clustering-micropartitions\"\u003E&lt;u&gt;Clustering&lt;/u&gt;\u003C/a\u003E\nsignificantly enhances pruning by physically co-locating similar data\nwithin micro-partitions. This reduces the data range for filtered\ncolumns, leading to more efficient micro-partition elimination.\nEffective clustering also benefits join operations, aggregations, and\nDML (UPDATE, DELETE, MERGE) by reducing I/O requirements.\u003C/p\u003E\n","\u003Cp\u003EThe \u003Ca href=\"https://docs.snowflake.com/en/user-guide/search-optimization-service\"\u003E&lt;u&gt;Search Optimization\nService&lt;/u&gt;\u003C/a\u003E\ndramatically accelerates various query types, including selective point\nlookups, searches on character data (using SEARCH, LIKE, RLIKE), and\nqueries on semi-structured or geospatial data.\u003C/p\u003E\n","\u003Cp\u003E\u003Ca href=\"https://docs.snowflake.com/en/user-guide/views-materialized\"\u003E&lt;u&gt;Materialized\nViews&lt;/u&gt;\u003C/a\u003E\nimprove performance by pre-computing and storing expensive query\nresults, offering faster access for frequently executed or complex\noperations. They are particularly useful for aggregations and queries on\nexternal tables, with Snowflake handling automatic updates.\u003C/p\u003E\n","\u003Cp\u003E\u003Ca href=\"https://docs.snowflake.com/en/user-guide/dynamic-tables-about\"\u003E&lt;u&gt;Dynamic\nTables&lt;/u&gt;\u003C/a\u003E\nalso pre-compute query results, but offer continuous refreshment, ideal\nfor BI dashboards needing low-latency data. They leverage Snowflake's\nquery optimizations and can be further enhanced with clustering and\nsearch optimization.\u003C/p\u003E\n","\u003Cp\u003EFinally, \u003Cstrong\u003EJoin Elimination\u003C/strong\u003E optimizes queries by removing unnecessary\njoins when they don't alter the result set, typically in primary/foreign\nkey relationships where joined columns aren't projected, significantly\nreducing data processing overhead.\u003C/p\u003E\n\u003Cul\u003E\u003Cli\u003E\n","\u003Cp\u003EStep-by-step Instruction\u003C/p\u003E\n\u003Cul\u003E\u003Cli\u003E\u003Ca href=\"/en/developers/guides/getting-started-with-snowflake-cluster-key-selection/\"\u003E&lt;u&gt;A Data-Driven Methodology for Choosing a Snowflake Clustering\nKey&lt;/u&gt;\u003C/a\u003E\u003C/li\u003E\u003C/ul\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003EBlog Articles\u003C/p\u003E\n\u003Cul\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Ca href=\"https://medium.com/snowflake/turbo-charge-your-data-model-with-snowflakes-join-elimination-4fedc8a47d26\"\u003E&lt;u&gt;Turbo-charge your Data Model with Snowflake&rsquo;s Join\nElimination&lt;/u&gt;\u003C/a\u003E\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Ca href=\"https://medium.com/snowflake/automatic-clustering-at-snowflake-317e0bb45541\"\u003E&lt;u&gt;Automatic Clustering at\nSnowflake&lt;/u&gt;\u003C/a\u003E\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Ca href=\"https://medium.com/snowflake/snowflake-clustering-demystified-8042fa81289e\"\u003E&lt;u&gt;Snowfake Clustering\nDemystified&lt;/u&gt;\u003C/a\u003E\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Ca href=\"https://medium.com/snowflake/snowflake-dynamic-table-complete-guide-6-final-c363aa7e273a\"\u003E&lt;u&gt;Snowflake Dynamic Table Complete\nGuide&lt;/u&gt;\u003C/a\u003E\u003C/p\u003E\n\u003C/li\u003E\u003C/ul\u003E\n\u003C/li\u003E\u003C/ul\u003E\n","\u003Ch3\u003EData quality for better performance\u003C/h3\u003E\n","\u003Cp\u003EMaintaining high data quality is crucial for optimal query performance\nwithin your application workflow. Snowflake offers built-in features for\nautomatic data quality enforcement and declarative capabilities for\nexternal implementations.\u003C/p\u003E\n","\u003Cp\u003EOperating on well-structured, high-quality data provides benefits across\nthe data lifecycle, from ingestion to advanced analytics and reporting.\nThese advantages lead to greater efficiency, reduced costs, and more\nreliable business insights.\u003C/p\u003E\n\u003Cul\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003ECleaner SQL code and reduced development effort:\u003C/strong\u003E Clean data\nminimizes defensive coding, simplifying SQL for transparency and\nmaintainability. This allows focus on business logic over data\ncleansing, accelerating development, reducing support, and freeing\nengineering resources. Predictable query behavior and fewer errors\nresult.\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003EFaster join performance:\u003C/strong\u003E Efficient join operations require\nequality predicates, clean data, and matching data types. Inconsistent\ndata types or dirty data impede the optimizer, creating performance\nbottlenecks. Data cleanliness and type consistency enable efficient\njoin algorithms, speeding query execution for complex analytical\nworkloads.\u003C/p\u003E\n\u003C/li\u003E\u003C/ul\u003E\n","\u003Ch4\u003EUsing data types for data quality enforcement\u003C/h4\u003E\n","\u003Cp\u003EProper datatype selection is a fundamental aspect of robust data quality\npractices. While often overlooked, correct datatype assignment provides\ninherent constraints and optimizations, significantly contributing to\ndata accuracy, consistency, and integrity. For instance, storing\nnumerical values as numbers, rather than strings, prevents invalid\nentries like &quot;abc&quot; and enables accurate mathematical operations.\nSimilarly, date/time datatypes ensure chronological order and allow for\nprecise time-based filtering and analysis.\u003C/p\u003E\n","\u003Cp\u003EStricter data types offer significant advantages for database\nperformance, primarily by establishing a clear domain of valid values,\nwhich benefits the query optimizer, reduces storage utilization, and\nimproves join performance.\u003C/p\u003E\n","\u003Cp\u003E\u003Cstrong\u003EOptimizing query performance through stricter data types\u003C/strong\u003E\u003C/p\u003E\n\u003Cul\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003EImproved query optimizer efficiency:\u003C/strong\u003E Variability in data values\ncan lead to complex filters and join predicates, hindering query\nperformance. Stricter data types limit this variability, reducing\ncardinality and enhancing micro-partition statistics.\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003E**Accurate cardinality estimation:**Data statistics are gathered at\nthe micro-partition level. Varying values with the same meaning\ndistort the query optimizer's cardinality estimations. Stricter data\ntypes, such as BOOLEAN or DATE, provide precise information, leading\nto accurate cardinality estimates.\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003EEnhanced performance with numerical data types:\u003C/strong\u003E Stricter data\ntypes, often numerical, optimize performance. This facilitates binary\npredicates in filters and joins, resulting in faster database\napplication performance.\u003C/p\u003E\n\u003C/li\u003E\u003C/ul\u003E\n","\u003Cp\u003E\u003Cstrong\u003EReduced storage utilization\u003C/strong\u003E\u003C/p\u003E\n\u003Cul\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003EEfficient data storage:\u003C/strong\u003E Numerical data types generally consume\nless storage due to their inherent efficiency in how computer systems\nrepresent and process numbers. Integers and floating-point numbers\nstore in fixed-size memory blocks, with size determining range and\nprecision. This contrasts with variable-length types like strings or\ncomplex objects.\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003EImproved data compression\u003C/strong\u003E occurs with strictly defined data types,\nreducing cardinality within micro-partitions. Tighter constraints\nincrease value unification, enabling more efficient compression\nalgorithms. This minimizes storage footprint and accelerates data\nretrieval and processing due to reduced data volume, optimizing\nstorage and performance in modern data warehousing and database\nsystems.\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003EPhysical I/O reduction:\u003C/strong\u003E For large tables, storage optimization\nsignificantly reduces the physical storage footprint, directly\ndecreasing the number of physical I/O operations for data access and\nprocessing. This leads to substantial overall performance improvement.\nMinimizing disk read/write needs allows systems to complete queries\nand operations more quickly, enhancing responsiveness and efficiency\nfor users and applications, and optimizing resources for a more\nefficient data processing pipeline.\u003C/p\u003E\n\u003C/li\u003E\u003C/ul\u003E\n","\u003Cp\u003E\u003Cstrong\u003EOptimized join performance\u003C/strong\u003E\u003C/p\u003E\n\u003Cul\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003EConsistent data types for join keys:\u003C/strong\u003E For optimal query\nperformance, ensure columns used in equality join conditions have\nidentical data types. Mismatched data types lead to implicit\nconversions, degrading performance. Meticulous data type assignment\nduring design, matching frequently joined columns across tables, is\ncrucial for a performant database application.\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003ESuperior performance of numerical types in joins:\u003C/strong\u003E Numerical data\ntypes generally offer better performance in equality join conditions\ncompared to VARCHAR.\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003ETemporal data type efficiency:\u003C/strong\u003E For optimal performance in join\nkeys and filters, consider using DATE and TIMESTAMP_NTZ. These data\ntypes do not store timezone information, eliminating runtime\nadjustments and allowing the optimizer to utilize Min/Max statistics\neffectively.\u003C/p\u003E\n\u003C/li\u003E\u003C/ul\u003E\n","\u003Ch4\u003ENOT NULL constraints for data quality enforcement\u003C/h4\u003E\n","\u003Cp\u003ESnowflake's NOT NULL constraints ensure data quality by requiring\nspecified columns to always contain a value, preventing incomplete or\nmissing data. This establishes a baseline for critical data points,\nreducing the need for later cleansing.\u003C/p\u003E\n","\u003Cp\u003EBeyond data quality, NOT NULL constraints enhance query performance. The\noptimizer can make more efficient query plan decisions when a column is\nknown to contain no NULL values, especially in equality join conditions.\nThis allows for more streamlined equality predicates.\u003C/p\u003E\n","\u003Cp\u003E\u003Cstrong\u003EPerformance benefits of NOT NULL constraints:\u003C/strong\u003E\u003C/p\u003E\n\u003Cul\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003ESimplified query logic:\u003C/strong\u003E Eliminates the need for separate IS\n[NOT] NULL predicates, streamlining query construction. You can\nwrite cleaner, more concise SQL, reducing complexity and improving\nreadability, maintainability, and debugging. This approach minimizes\npotential errors, leading to more robust and efficient database\noperations.\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003EReduced query overhead:\u003C/strong\u003E Snowflake's query optimizer automatically\nintroduces a nullability filter when a nullable column is used in an\nequality inner join. This additional filter consumes CPU time,\nresulting in performance overhead that you can avoid by using NOT NULL\nconstraints.\u003C/p\u003E\n\u003C/li\u003E\u003C/ul\u003E\n","\u003Ch4\u003EThe role of primary key and unique constraints\u003C/h4\u003E\n","\u003Cp\u003ESnowflake supports PRIMARY KEY and UNIQUE constraints for SQL\ncompatibility, but these are not enforced. Maintaining data integrity is\nyour application's responsibility.\u003C/p\u003E\n","\u003Cp\u003EExternal enforcement of these constraints is vital for data integrity in\nanalytical workloads, ensuring reliable reporting and correct\naggregations. Validation checks, deduplication, or upsert mechanisms in\nyour data pipelines ensure only valid, unique records are loaded.\u003C/p\u003E\n","\u003Cp\u003EBeyond integrity, external enforcement benefits query performance. When\ndata is guaranteed unique externally, Snowflake's query optimizer\ngenerates more efficient execution plans by leveraging metadata and\nstatistics. This avoids unexpected data duplication in joins and\npromotes cleaner query code, reducing complexity.\u003C/p\u003E\n","\u003Cp\u003E\u003Cstrong\u003EOptimizing query performance with primary key and unique constraints\u003C/strong\u003E\u003C/p\u003E\n\u003Cul\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003EEnhanced query optimizer selectivity:\u003C/strong\u003E Enforcing Primary Key and\nUnique constraints ensures cleaner data, which benefits\nmicro-partition statistics. Accurate record counts and distinct values\nare crucial for the query optimizer to estimate selectivity precisely,\nleading to more effective query plans.\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003EEnabling join elimination:\u003C/strong\u003E The RELY property, when set for a\nPrimary Key or Unique constraint, is a prerequisite for Snowflake's\nJoin Elimination. This dynamically removes unnecessary joins,\nimproving query performance, and relies on externally enforced\nuniqueness.\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003EReduced defensive coding:\u003C/strong\u003E External uniqueness enforcement\nminimizes defensive SQL coding in downstream applications,\nstreamlining development and enhancing application robustness.\u003C/p\u003E\n\u003C/li\u003E\u003C/ul\u003E\n","\u003Ch4\u003EForeign key constraints\u003C/h4\u003E\n","\u003Cp\u003ESnowflake supports foreign key constraints for SQL compatibility but\ndoes not enforce them. Maintaining referential integrity is your\nresponsibility. Enforcing these constraints ensures data consistency and\naccuracy, improving downstream query performance by assuming valid table\nrelationships. This simplifies query logic and streamlines join\noperations, leading to faster, more predictable query execution.\u003C/p\u003E\n","\u003Cp\u003E\u003Cstrong\u003EPerformance benefits of foreign key constraints\u003C/strong\u003E\u003C/p\u003E\n\u003Cul\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003ESnowflake Join Elimination:\u003C/strong\u003E Setting the RELY property on a foreign\nkey constraint enables Snowflake's Join Elimination, improving query\nefficiency by removing unnecessary joins.\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003EINNER JOIN optimization:\u003C/strong\u003E When a foreign key is externally\nenforced, INNER JOINs offer optimizations not available with OUTER\nJOIN. Use OUTER JOIN only for inconsistent data where foreign key\nconstraints are not strictly enforced.\u003C/p\u003E\n\u003C/li\u003E\u003C/ul\u003E\n","\u003Ch3\u003EData modeling for performance\u003C/h3\u003E\n","\u003Cp\u003EOptimizing data models can significantly enhance Snowflake's already\nimpressive performance. Most industry-standard data modeling techniques\nare applicable when designing a schema in Snowflake. The following\nsections explore common and model-specific considerations.\u003C/p\u003E\n","\u003Ch4\u003EStar Schema\u003C/h4\u003E\n","\u003Cp\u003EThe Star Schema model works well with Snowflake, favoring right-deep\nquery execution plans. This positions the largest fact table on the far\nprobe side of joins. The model also benefits from Join Elimination,\nwhich excludes optional dimensions (joined with OUTER JOIN) if they're\nnot part of the final projections.\u003C/p\u003E\n","\u003Cp\u003E\u003Cstrong\u003EConsiderations:\u003C/strong\u003E\u003C/p\u003E\n\u003Cul\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003EFact table clustering:\u003C/strong\u003E You should consider clustering large fact\ntables. Clustering key candidates should include frequently used\nfilters, join keys, and a temporal attribute reflecting the natural\ndata ingestion order.\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003ENumerical data types for keys:\u003C/strong\u003E Use of numerical data types for key\ncolumns involved in equality joins is strongly recommended for optimal\nperformance.\u003C/p\u003E\n\u003C/li\u003E\u003C/ul\u003E\n","\u003Ch4\u003EData Vault 2.0\u003C/h4\u003E\n","\u003Cp\u003E\u003Cstrong\u003EConsiderations:\u003C/strong\u003E\u003C/p\u003E\n\u003Cul\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003ENumerical keys:\u003C/strong\u003E For optimal performance, use numerical keys\ninstead of hash keys (e.g., MD5). Hash keys, being alphanumeric\nVARCHAR, are less effective for clustering because Snowflake only\nconsiders the first five bytes for clustering, ignoring the rest.\nTheir random nature also prevents natural record co-location, leading\nto higher reclustering costs and suboptimal states.\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003EStrategic table clustering:\u003C/strong\u003E Data Vault schemas, with their higher\nnormalization, often involve queries across many large tables. To\nimprove performance, strategically cluster these tables using a shared\nattribute that is also part of join and filter conditions. This\nenhances pruning and improves query performance.\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003ELocal materializations:\u003C/strong\u003E For performance issues when joining\nmultiple large tables, consider limited materializations using Dynamic\nTables to boost query execution speed.\u003C/p\u003E\n\u003C/li\u003E\u003C/ul\u003E\n","\u003Ch4\u003EVery wide tables\u003C/h4\u003E\n","\u003Cp\u003EQuery compilation time in Snowflake can be affected by very wide tables\n(hundreds of columns). The optimizer processes more metadata at\ncompilation, extending the time from submission to execution. This is\nmore noticeable in complex queries referencing many columns or involving\nintricate logic, especially with deep dynamic views or \u003Ca href=\"https://docs.snowflake.com/en/user-guide/queries-cte\"\u003E&lt;u&gt;CTE\nhierarchies&lt;/u&gt;\u003C/a\u003E.\nWhile often minor for long-running analytical queries, it can impact\nshort interactive queries.\u003C/p\u003E\n","\u003Cp\u003EA balanced schema design is key. Consider using a VARIANT data type for\nnumerous individual scalar data elements, or a large VARCHAR structured\nas JSON. The PARSE_JSON() function allows for easy data access.\nSnowflake automatically subcolumnarizes up to a set number of unique\nelements within a VARIANT, though this is not guaranteed and has\nrestrictions.\u003C/p\u003E\n","\u003Cp\u003EAvoid combining scalar attributes frequently used for filtering and\njoins into a single VARIANT or VARCHAR, as this can reduce pruning\neffectiveness due to a lack of collected statistics for these complex\nvalues.\u003C/p\u003E\n","\u003Ch4\u003EDenormalization\u003C/h4\u003E\n","\u003Cp\u003EDenormalization can optimize query performance in Snowflake,\nparticularly for analytical tasks. While a normalized schema ensures\ndata integrity, it often necessitates multiple joins, adding\ncomputational overhead. Strategic denormalization pre-joins relevant\ndata, reducing the need for joins at query time.\u003C/p\u003E\n","\u003Cp\u003EThis approach leverages Snowflake's columnar storage and\nmicro-partitioning. By co-locating frequently accessed attributes within\nthe same micro-partition, data locality improves for common queries,\nminimizing I/O operations. Micro-partition pruning is also enhanced,\nallowing the warehouse to efficiently skip irrelevant data during scans.\u003C/p\u003E\n","\u003Cp\u003EStrategic denormalization significantly improves query performance and\noptimizes resource usage. By reducing complex joins and leveraging\nmicro-partition pruning, you can design schemas for highly performant\nanalytical workloads. This provides faster access to insights and a more\nresponsive user experience, balancing performance with data integrity.\u003C/p\u003E\n","\u003Ch4\u003EFinding the balance\u003C/h4\u003E\n","\u003Cp\u003EAchieving the right balance among these concepts requires careful\ntesting. There's no universal guideline or ideal degree of\ndenormalization; each data model and dataset is unique. Therefore,\nextensive testing is crucial to determine the most effective approach\nfor your specific business needs.\u003C/p\u003E\n","\u003Ch3\u003EData type for performance\u003C/h3\u003E\n","\u003Cp\u003EOptimizing query performance depends on the data type choices made\nduring schema design. The physical data type of a column can\nsignificantly impact the query optimizer's choices and introduce\ncomputational overhead. This is especially true when the column is used\nin filter predicates, join key predicates, or as an aggregation key.\u003C/p\u003E\n","\u003Ch4\u003EData type recommendations\u003C/h4\u003E\n","\u003Cp\u003EConsider the following data type recommendations when designing a\nschema:\u003C/p\u003E\n\u003Cul\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003EJoin key data types:\u003C/strong\u003E Use numerical data types for join keys for\nsuperior performance. Snowflake often pushes join filters to the probe\nside, and numerical values create a more robust filter.\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003ETemporal data types:\u003C/strong\u003E Understand the performance implications of\ntemporal data types. DATE and TIMESTAMP_NTZ generally perform better\nin filtering and join key scenarios.\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003ECollation considerations:\u003C/strong\u003E Use collation only when essential due to\nits performance impact. Avoid using collation for join keys.\u003C/p\u003E\n\u003C/li\u003E\u003C/ul\u003E\n","\u003Ch4\u003EData types and join performance\u003C/h4\u003E\n","\u003Cp\u003EFor optimal performance, use identical data types for common join keys\nacross tables in the same schema. Type casting of join keys, whether\nexplicit or implicit, introduces performance overhead due to CPU cycles\nand can hinder dynamic pruning.\u003C/p\u003E\n","\u003Cp\u003ESnowflake automatically casts columns with lower precision to match the\ndata type of the opposite join key, but this still incurs the same\nperformance disadvantages as explicit casting. When type casting is\napplied to a key on the probe side of a join, it typically leads to\nmeasurable performance degradation. You can observe type casting in a\njoin on the query profile for each join operation.\u003C/p\u003E\n","\u003Cp\u003EThe Snowflake query optimizer pushes join filters derived from equality\njoin conditions in inner joins to the probe side. Filters based on\nnumerical values offer superior initial filtering and enhanced\nperformance. DATE and TIMESTAMP_NTZ data types are numerical and share\nthese performance characteristics, meaning the impact of non-coordinated\ndata types also applies to them.\u003C/p\u003E\n","\u003Cp\u003ESee ​​\u003Ca href=\"https://medium.com/snowflake/data-type-considerations-for-join-keys-in-snowflake-304d515d2b91\"\u003E&lt;u&gt;Data Type Considerations for Join Keys in\nSnowflake&lt;/u&gt;\u003C/a\u003E\nfor further exploration of this topic.\u003C/p\u003E\n","\u003Ch4\u003ETemporal data type choices and performance\u003C/h4\u003E\n","\u003Cp\u003ESnowflake offers various temporal data types, all stored numerically.\nFor optimal \u003Cstrong\u003Efiltering\u003C/strong\u003E performance, DATE and TIMESTAMP_NTZ are\nsuperior.\u003C/p\u003E\n","\u003Cp\u003EThese types are offsets from EPOCH. DATE uses smaller numerical values,\nleading to better performance for equality join keys due to its smaller\nmemory and storage footprint. TIMESTAMP_NTZ offers greater precision\nwith only slightly lower performance.\u003C/p\u003E\n","\u003Cp\u003ETIMESTAMP_TZ and TIMESTAMP_LTZ, which include a timezone component, are\nstored using UTC and a dynamic timezone offset. This dynamic calculation\nconsumes CPU cycles and interferes with pruning. While suitable for\npresentation, if precise filtering or joining on timestamp values with\ntimezones is needed, use two columns: one without a timezone (DATE or\nTIMESTAMP_NTZ) for pruning, and another with a timezone for accurate\nrepresentation.\u003C/p\u003E\n","\u003Ch4\u003ECollation\u003C/h4\u003E\n","\u003Cp\u003ECollation introduces measurable performance overhead, especially for\njoin keys. Numerical join keys are faster, regardless of collation. You\nshould restrict collation use to presentation values only for optimal\nperformance.\u003C/p\u003E\n","\u003Cp\u003EEven with a collation definition at the DATABASE, SCHEMA, or TABLE\nlevel, data is physically stored without collation. The transformation\nis dynamic upon data access. While column statistics at the\nmicro-partition level reflect the default (no collation) state for\nmin/max values, filters and join keys must adhere to collation rules.\nThis misalignment hinders important performance features like pruning.\u003C/p\u003E\n","\u003Cp\u003ESee \u003Ca href=\"https://docs.snowflake.com/en/sql-reference/collation#performance-implications-of-using-collation\"\u003E&lt;u&gt;Performance implications of using\ncollation&lt;/u&gt;\u003C/a\u003E\nfor further exploration of this topic.\u003C/p\u003E\n","\u003Ch3\u003ESummary\u003C/h3\u003E\n","\u003Cp\u003ETaking the time to thoughtfully choose data types can make a significant\ndifference in performance, particularly at scale. Data types matter in\nSnowflake, but not always in expected ways. Pay special attention to the\ndata types for join keys, temporal data types, and avoid the use of\ncollations where possible.\u003C/p\u003E\n","\u003Ch2\u003EData access\u003C/h2\u003E\n","\u003Ch3\u003EPruning\u003C/h3\u003E\n","\u003Cp\u003EPruning eliminates unnecessary Snowflake scanning. This efficiency is\nmeasured by the ratio of unscanned to total micro-partitions during\ntable access. For instance, scanning only one out of 100\nmicro-partitions yields 99% pruning efficiency. Pruning decisions are\nbased on the minimum and maximum values stored as metadata for columns\ninvolved in filters or join keys.\u003C/p\u003E\n","\u003Ch4\u003EStatic vs dynamic pruning\u003C/h4\u003E\n","\u003Cp\u003ESnowflake utilizes both static and dynamic pruning. Static pruning,\nwhich occurs during query compilation in the Cloud Services Layer, uses\nWHERE clause filters to optimize queries. Its impact on the execution\nplan is analyzed and factored into cost calculations.\u003C/p\u003E\n","\u003Cp\u003EDynamic pruning, performed at runtime by the Virtual Warehouse, employs\njoin filters to prune unnecessary scans. Its effectiveness is not known\nduring compilation, thus it doesn't affect execution plan cost or table\njoin order.\u003C/p\u003E\n","\u003Cp\u003EStatic pruning is generally preferred. Regardless, a query profile will\nalways show actual scanning statistics and the number of\nmicro-partitions scanned.\u003C/p\u003E\n","\u003Ch3\u003EClustering\u003C/h3\u003E\n","\u003Cp\u003ESnowflake performance is significantly enhanced by clustering, which\nminimizes micro-partition scans by co-locating frequently queried\nrecords. The primary goal is to reduce the range of values in\nmicro-partition statistics for columns used in query filter predicates,\nimproving pruning.\u003C/p\u003E\n","\u003Cp\u003ETo select an effective clustering key, identify queries needing\noptimization and choose potential candidates based on filters and join\npredicates. Evaluate the cardinality of these candidates to determine an\noptimal combined clustering key cardinality relative to the total number\nof full-size micro-partitions. Finally, test the chosen key on a subset\nof actual data.\u003C/p\u003E\n","\u003Cp\u003EClustering also benefits DML operations (UPDATE, DELETE, MERGE). By\nusing a specific clustering key combination, you can facilitate the\nco-location of records frequently modified by the same DML query. This\nreduces the number of micro-partitions affected by DML logic, leading to\nlower physical write I/O and improved query execution performance.\u003C/p\u003E\n","\u003Ch3\u003ESearch Optimization Service\u003C/h3\u003E\n","\u003Cp\u003EThe Snowflake \u003Ca href=\"https://docs.snowflake.com/en/user-guide/search-optimization-service\"\u003E&lt;u&gt;Search Optimization\nService&lt;/u&gt;\u003C/a\u003E\nsignificantly improves query performance for faster response times and a\nbetter user experience. This service helps data consumers, from business\nanalysts to data scientists, gain insights with unmatched speed.\u003C/p\u003E\n","\u003Cp\u003EA key benefit is the acceleration of selective point lookup queries,\nwhich return a small number of distinct rows. These queries are vital\nfor applications requiring immediate data retrieval, such as critical\ndashboards needing real-time data for decision-making.\u003C/p\u003E\n","\u003Cp\u003ESearch Optimization Service also improves the speed of searches\ninvolving character data and IPv4 addresses using the\n\u003Ca href=\"https://docs.snowflake.com/en/sql-reference/functions/search\"\u003E&lt;u&gt;SEARCH&lt;/u&gt;\u003C/a\u003E\nand\n\u003Ca href=\"https://docs.snowflake.com/en/sql-reference/functions/search_ip\"\u003E&lt;u&gt;SEARCH_IP&lt;/u&gt;\u003C/a\u003E\nfunctions. This is particularly beneficial for applications relying on\ntext-based queries, such as log analysis or security monitoring, where\nquick identification of specific text patterns or IP addresses is\ncritical.\u003C/p\u003E\n","\u003Cp\u003EThe service extends performance enhancements to substring and regular\nexpression searches, supporting functions like\n\u003Ca href=\"https://docs.snowflake.com/en/sql-reference/functions/like\"\u003E&lt;u&gt;LIKE&lt;/u&gt;\u003C/a\u003E,\n\u003Ca href=\"https://docs.snowflake.com/en/sql-reference/functions/ilike\"\u003E&lt;u&gt;ILIKE&lt;/u&gt;\u003C/a\u003E,\nand\n\u003Ca href=\"https://docs.snowflake.com/en/sql-reference/functions/rlike\"\u003E&lt;u&gt;RLIKE&lt;/u&gt;\u003C/a\u003E.\nThis capability is vital for scenarios requiring fuzzy matching or\ncomplex pattern recognition, allowing for quicker and more comprehensive\ndata exploration without typical performance bottlenecks.\u003C/p\u003E\n","\u003Cp\u003EFinally, search optimization delivers substantial performance\nimprovements for queries on semi-structured data (VARIANT, OBJECT, and\nARRAY columns) and geospatial data. For semi-structured data, it\noptimizes equality,\n\u003Ca href=\"https://docs.snowflake.com/en/sql-reference/functions/in\"\u003E&lt;u&gt;IN&lt;/u&gt;\u003C/a\u003E,\n\u003Ca href=\"https://docs.snowflake.com/en/sql-reference/functions/array_contains\"\u003E&lt;u&gt;ARRAY_CONTAINS&lt;/u&gt;\u003C/a\u003E,\n\u003Ca href=\"https://docs.snowflake.com/en/sql-reference/functions/arrays_overlap\"\u003E&lt;u&gt;ARRAYS_OVERLAP&lt;/u&gt;\u003C/a\u003E,\nfull-text search, substring, regular expression, and NULL value\npredicates. For geospatial data, it speeds up queries using selected\n\u003Ca href=\"https://docs.snowflake.com/en/sql-reference/functions-geospatial\"\u003E&lt;u&gt;GEOGRAPHY&lt;/u&gt;\u003C/a\u003E\nfunctions. These optimizations are crucial for efficiently handling\ndiverse and complex data structures, ensuring modern applications can\nrapidly query and analyze all data types.\u003C/p\u003E\n","\u003Ch3\u003EMaterialized views\u003C/h3\u003E\n","\u003Cp\u003E\u003Ca href=\"https://docs.snowflake.com/en/user-guide/views-materialized\"\u003E&lt;u&gt;Materialized\nviews&lt;/u&gt;\u003C/a\u003E\nimprove query performance by pre-computing and storing data sets, making\nqueries inherently faster than repeatedly executing complex queries\nagainst base tables. This is especially beneficial for frequently\nexecuted or computationally complex queries, accelerating data retrieval\nand analysis.\u003C/p\u003E\n","\u003Cp\u003EThese views speed up expensive operations like aggregation, projection,\nand selection. This includes scenarios where query results represent a\nsmall subset of the base table's rows and columns, or when queries\ndemand significant processing power, such as analyzing semi-structured\ndata or calculating time-intensive aggregates.\u003C/p\u003E\n","\u003Cp\u003EMaterialized views also offer an advantage when querying external\ntables, which can sometimes exhibit slower performance. By materializing\nviews on these external sources, you can mitigate performance\nbottlenecks, ensuring quicker data access and more efficient analytical\nworkflows.\u003C/p\u003E\n","\u003Cp\u003ESnowflake's implementation ensures data currency and transparent\nmaintenance. A background service automatically updates the materialized\nview as base table changes occur, eliminating manual upkeep and reducing\nerrors. This guarantees that data accessed through materialized views is\nalways current, providing consistent and reliable performance.\u003C/p\u003E\n","\u003Ch3\u003ELeverage Dynamic Tables for query performance\u003C/h3\u003E\n","\u003Cp\u003EDynamic Tables boost query performance by materializing data. Unlike\nstandard views that re-execute queries, Dynamic Tables pre-compute and\nstore results, creating continuously refreshed data. This means complex\nqueries are computed once per refresh, not every time a user queries.\u003C/p\u003E\n","\u003Cp\u003EThis benefits applications like BI dashboards and embedded analytics,\nwhere low latency is crucial. Directing these applications to a Dynamic\nTable makes end-user queries simple SELECT statements on pre-computed\nresults. This significantly improves performance by bypassing complex\nlogic, leading to quicker execution and better response for many\nconcurrent users.\u003C/p\u003E\n","\u003Cp\u003EAs periodically refreshed tables, Dynamic Tables share performance\nadvantages with standard tables. Snowflake automatically collects\nstatistical metadata and applies advanced query optimizations. You can\nfurther optimize Dynamic Tables with features like automatic clustering,\nSearch Optimization Service for improved partition pruning, and\nadditional serverless features such as Materialized Views and the Query\nAcceleration Service.\u003C/p\u003E\n","\u003Ch3\u003EJoin elimination\u003C/h3\u003E\n","\u003Cp\u003E\u003Ca href=\"https://docs.snowflake.com/en/user-guide/join-elimination\"\u003E&lt;u&gt;Join\nelimination&lt;/u&gt;\u003C/a\u003E,\na powerful Snowflake query optimization, significantly enhances query\nperformance by removing unnecessary joins. This occurs when the\noptimizer determines a join won't change the query result, typically\ninvolving primary/foreign key relationships declared with the RELY\nkeyword. Columns from the &quot;joined&quot; table must not be required in the\nfinal projection (e.g., not selected or used in WHERE, GROUP BY, or\nORDER BY clauses that would alter the outcome).\u003C/p\u003E\n","\u003Cp\u003EThe primary benefit of join elimination is a substantial reduction in\nprocessed and transferred data, leading to faster query execution and\nlower compute costs. By eliminating a join, Snowflake avoids reading\nunnecessary data and performing the join operation, which is\nparticularly beneficial in complex queries. This intelligent\nsimplification allows Snowflake to focus computational resources on\nessential query components, delivering results more efficiently.\u003C/p\u003E\n","\u003Ch3\u003EData Lifecycle Management\u003C/h3\u003E\n","\u003Cp\u003EData Lifecycle Management (DLM) is crucial for optimizing Snowflake\nperformance. By setting clear policies for data retention, archiving,\nand deletion, organizations ensure that only actively used data resides\nin frequently accessed objects. This proactive approach minimizes data\nprocessed for queries, leading to faster execution and reduced compute\ncosts. Efficiently managed data also improves micro-partition pruning,\nmaking your dataset more concise.\u003C/p\u003E\n","\u003Cp\u003EAs data ages and access declines, keeping seldom-accessed historical\ndata in active tables with many micro-partitions can create performance\noverhead during query compilation. Isolating historical data into\nseparate tables maintains peak query performance for frequently used\ndata, while ensuring full access for analytical purposes. This also\nallows for alternative clustering strategies that benefit analytical\nquery performance. Since data is often transferred in large batches,\nperiodic reordering may be unnecessary. You can choose manual data\nclustering by sorting records in each batch to reduce ongoing automatic\nclustering costs.\u003C/p\u003E\n","\u003Ch2\u003EArchitect for scalability and workload partitioning\u003C/h2\u003E\n","\u003Ch4\u003EOverview\u003C/h4\u003E\n","\u003Cp\u003ETo achieve highly performant, scalable solutions on Snowflake, fully\nleverage its multi-cluster shared data architecture. This architecture\nseparates compute from storage, allowing independent scaling. Assigning\ndifferent workloads to dedicated virtual warehouses lets you match\ncompute resources to query complexity. This ensures one workload (e.g.,\ndata engineering) doesn't negatively impact another (e.g., a critical BI\ndashboard). Workload isolation typically improves cache hit ratios and\ncompute resource utilization, leading to faster performance and better\nprice-performance.\u003C/p\u003E\n","\u003Ch4\u003EDesired outcomes\u003C/h4\u003E\n","\u003Cp\u003EAdhering to this principle improves business agility and\ndecision-making. Quickly available data insights help you respond to\nmarket changes and adapt strategic plans. This principle also\ncontributes to greater data operation stability and reliability.\nWorkload isolation prevents poorly performing queries from crippling\nanalytical operations, creating a more robust data platform, increasing\nuser trust, and reducing troubleshooting. Finally, it leads to reduced\noperational costs and simplified performance administration.\nRight-sizing virtual warehouses avoids over-provisioning and\nunder-provisioning. Simplifying administration frees technical resources\nto focus on business advancement.\u003C/p\u003E\n","\u003Ch3\u003ERecommendations\u003C/h3\u003E\n","\u003Cp\u003EHere are some specific and actionable recommendations to architect\nhigh-performance, scalable solutions on Snowflake:\u003C/p\u003E\n","\u003Ch4\u003EOptimize virtual warehouses for cost and performance\u003C/h4\u003E\n","\u003Cp\u003EOptimizing for cost and performance is a key best practice on Snowflake,\ninvolving the strategic tuning of warehouse-level parameters to match\nworkload needs. Leveraging parameters like AUTO_RESUME and AUTO_SUSPEND\nis a great way to ensure you're only paying for compute resources when\nqueries are actively running. You often right-size the warehouse's\nt-shirt size to match query complexity, while using multi-cluster\nsettings like MIN_CLUSTER_COUNT and MAX_CLUSTER_COUNT allows for\nautomatic scaling to handle any potential ebbs and flows of concurrent\nactivity. Finer control over how clusters scale and handle queries can\nbe achieved with the scaling policy and MAX_CONCURRENCY_LEVEL parameter,\nwhich helps teams achieve the best price-performance for their specific\nworkload.\u003C/p\u003E\n","\u003Ch4\u003EImplement strategies for handling concurrent queries\u003C/h4\u003E\n","\u003Cp\u003EEffectively handling concurrent queries is a key architectural\nconsideration on Snowflake, and the preferred approach is using\nmulti-cluster virtual warehouses which automatically scale compute\nresources in response to query load. You can fine-tune this behavior\nwith parameters like MIN_CLUSTER_COUNT and MAX_CLUSTER_COUNT to define\nthe scaling boundaries, and MAX_CONCURRENCY_LEVEL to control the number\nof queries per cluster. For predictable batch workloads, a great\nstrategy is to stagger scheduled jobs to reduce concurrency spikes and\nlessen demand on warehouses. Additionally, isolating large,\nrarely-executed scheduled jobs into a dedicated warehouse is a best\npractice, as it prevents resource contention and allows for programmatic\nresume and suspend to eliminate idle time and save on cost.\u003C/p\u003E\n","\u003Ch4\u003EUtilize Snowflake's serverless features\u003C/h4\u003E\n","\u003Cp\u003ESnowflake's serverless features abstract away the manual configuration\nof virtual warehouses by leveraging shared compute that is typically\nmetered by the second. In contrast, virtual warehouses are dedicated to\na customer and have a one-minute minimum for billing. This allows for\nbetter utilization of shared compute resources via an economy of scale,\nwhich in turn enables Snowflake to provide excellent price-performance.\nBy leveraging these services, teams can achieve significant compute\nefficiency gains for a variety of specific workloads.\u003C/p\u003E\n","\u003Cp\u003EThe Search Optimization Service automatically builds a data structure\nthat drastically reduces the amount of data scanned for highly selective\nqueries. The Query Acceleration Service offloads parts of resource-heavy\nqueries to shared compute pools, which prevents long-running &quot;outlier&quot;\nqueries from monopolizing a warehouse. For repeatable, complex\naggregations, the Materialized View Service automatically maintains\npre-computed results, allowing subsequent queries to bypass\nrecomputation entirely. Finally, Serverless Tasks automatically manage\nand right-size the compute for scheduled jobs, eliminating the need for\nmanual warehouse configuration and ensuring efficient credit\nconsumption.\u003C/p\u003E\n","\u003Ch4\u003ELeverage Dynamic Tables for data engineering pipelines\u003C/h4\u003E\n","\u003Cp\u003EDynamic Tables are a powerful new feature that dramatically simplifies\nthe creation and management of data pipelines on Snowflake. By using a\ndeclarative SQL syntax, they automate the complex incremental DML\noperations required to keep a table up-to-date, eliminating the need for\nmanual orchestration, which can be tedious, suboptimal, and prone to\nerrors. Similar to materialized views, they pre-compute and store query\nresults, which significantly improves the performance of downstream\nqueries. This declarative approach simplifies pipeline development and\nmonitoring, leading to enhanced data engineering productivity and a more\nstreamlined architecture.\u003C/p\u003E\n","\u003Ch2\u003EOptimize virtual warehouses for cost and performance\u003C/h2\u003E\n","\u003Ch4\u003EIsolate workloads\u003C/h4\u003E\n","\u003Cp\u003EImplementing workload isolation with multiple virtual warehouses is\ncrucial for optimizing Snowflake performance. This strategy prevents\nresource contention by dedicating separate compute resources to distinct\ntasks, such as isolating long-running ETL from time-sensitive BI\nqueries. It also provides a robust mechanism for cost management and\naccountability, especially for organizations with a single Snowflake\naccount and many business units, by simplifying internal chargeback and\nencouraging teams to optimize their compute usage.\u003C/p\u003E\n","\u003Cp\u003E\u003Cstrong\u003EExamples include:\u003C/strong\u003E\u003C/p\u003E\n\u003Cul\u003E\u003Cli\u003E\n","\u003Cp\u003EA smaller, multi-cluster warehouse (e.g., X-Small or Small with an\nupper bound of 5-10 clusters) is ideal for ad-hoc queries from\nbusiness users and analysts. This setup dynamically scales to meet\nvariable, bursty query loads, ensuring performance objectives are met\nwithout over-provisioning and keeping costs in check.\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003EA Medium or Large single-cluster warehouse suits data ingestion and\ndata engineering jobs. These jobs often process larger data sets and\nrequire more compute, especially with complex transformations.\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003EA very large dedicated warehouse (e.g., 2X-Large or higher) is best\nfor complex, high-volume monthly batch jobs. Isolating such jobs\nprevents negative impact on others and allows for precise\nright-sizing. You can programmatically resume the warehouse before the\njob and suspend it afterward, avoiding idle time costs.\u003C/p\u003E\n\u003C/li\u003E\u003C/ul\u003E\n","\u003Ch4\u003EUse meaningful names for warehouses\u003C/h4\u003E\n","\u003Cp\u003EUse descriptive names (e.g., BI_REPORTING_WH, ETL_LOADER_WH) to make it\neasy for users and administrators to understand the purpose of each\nwarehouse and prevent mixing workloads. This will also make it easier to\nunderstand dashboards and reports that provide insights into performance\nand cost metrics by warehouse name.\u003C/p\u003E\n","\u003Ch4\u003ELeverage auto-resume and auto-suspend\u003C/h4\u003E\n","\u003Cp\u003EWarehouses typically benefit from auto-resume (default). This allows a\nwarehouse to spin up automatically from a suspended state when a query\nis issued. Disabling this requires manual resumption via an ALTER\nWAREHOUSE RESUME command, leading to:\u003C/p\u003E\n\u003Cul\u003E\u003Cli\u003E\n","\u003Cp\u003Ea query failing because it's issued against a suspended warehouse.\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003Ea manually resumed warehouse sitting idle, accruing credits without\nservicing queries.\u003C/p\u003E\n\u003C/li\u003E\u003C/ul\u003E\n","\u003Cp\u003EConfigure virtual warehouses to automatically suspend after inactivity\n(e.g., 60-300 seconds). This saves credit when not in use, benefiting\nintermittent workloads. However, suspension flushes the data cache,\nwhich avoids expensive remote reads. For a BI dashboard, a longer\nsuspension (e.g., ten minutes) might be better to keep the cache warm.\nFor data engineering, where caching often yields less benefit, a shorter\nauto-suspend interval is often optimal.\u003C/p\u003E\n","\u003Ch4\u003ERight-size your warehouses\u003C/h4\u003E\n","\u003Cp\u003EStart with a smaller warehouse size and scale up if queries spill or\ntake too long. For slow queries, if stepping up the warehouse size\n(doubling CPU, memory, and SSD) does not roughly halve the query time,\nconsider a smaller size for better resource utilization. If necessary,\nperform performance profiling to identify why it isn't scaling linearly,\noften due to uneven processing.\u003C/p\u003E\n","\u003Cp\u003EWarehouse size should primarily be driven by workload complexity, not\naverage or peak concurrency, which is often better handled by\nmulti-cluster warehouses. Increasing warehouse size for concurrency,\nespecially peak, typically results in over-provisioning and increased\ncredit consumption without a corresponding price-performance ratio.\u003C/p\u003E\n","\u003Cp\u003ESpilling occurs when a fixed-size resource (memory or local SSD) is\nfully utilized, requiring additional resources. Local spilling moves\nmemory contents to SSD; remote spilling moves SSD contents to remote\nstorage. Excessive spilling, particularly remote, often signals an\nundersized warehouse for its assigned workload. The QUERY_HISTORY view\nin ACCOUNT_USAGE provides insights into local and remote spilling via\nbytes_spilled_to_local_storage and bytes_spilled_to_remote_storage\nattributes. These metrics can identify warehouses for upsizing due to\nexcessive spilling.\u003C/p\u003E\n","\u003Ch4\u003EEnable multi-cluster warehouses (MCWs)\u003C/h4\u003E\n","\u003Cp\u003EFor high-concurrency BI reporting, enable \u003Ca href=\"https://docs.snowflake.com/en/user-guide/warehouses-multicluster\"\u003E&lt;u&gt;multi-cluster\nwarehouses&lt;/u&gt;\u003C/a\u003E\n(Enterprise Edition and above). This allows Snowflake to automatically\nscale out clusters when queries queue and scale in when load decreases,\nensuring consistent performance during peak times without\nover-provisioning.\u003C/p\u003E\n","\u003Cp\u003EThe SCALING_POLICY parameter can be configured to influence scale-out\nbehavior with STANDARD (default) and ECONOMY values. While STANDARD\nsuits most workloads, ECONOMY can conserve credits by establishing a\nhigher bar for spinning up new clusters, leading to increased queuing.\nThis tradeoff may be worthwhile for cost-optimized workloads.\u003C/p\u003E\n","\u003Cp\u003EMulti-cluster warehouses often provide better price-performance for\n&quot;bursty&quot; workloads by elastically adjusting clusters. However, if\nadditional compute is required for complex individual queries,\nincreasing cluster size is more appropriate, as a single query executes\nagainst a single cluster.\u003C/p\u003E\n","\u003Ch4\u003EDrive accountability via warehouse-level chargeback\u003C/h4\u003E\n","\u003Cp\u003EIn larger organizations with a single Snowflake account, workload isolation promotes accountability and effective administration. Virtual warehouses are often the dominant cost driver, so dedicating specific warehouses to business units provides a clear mechanism for internal chargeback. This drives cost control and empowers each team to manage their own compute usage. This simplifies governance, as each business unit can manage its dedicated warehouse with local control, minimizing the risk of one team's actions affecting another's workload. Always secure access to warehouses via an effective RBAC (Role-based access control) strategy to ensure only authorized users/roles/teams have access.\u003C/p\u003E\n","\u003Ch4\u003EQuery Acceleration Service (and Scale Factor)\u003C/h4\u003E\n","\u003Cp\u003EEnable \u003Ca href=\"https://docs.snowflake.com/en/user-guide/query-acceleration-service#evaluating-cost-and-performance\"\u003E&lt;u&gt;Query\nAcceleration&lt;/u&gt;\u003C/a\u003E\non your warehouse to parallelize parts of qualifying queries, reducing\nthe need to over-provision for &quot;outlier&quot; queries with heavy table scans.\nThe \u003Cstrong\u003EQUERY_ACCELERATION_MAX_SCALE_FACTOR\u003C/strong\u003E parameter defines the\nsupplemental compute available. While the default is eight, begin with a\nlower value (even one) to validate its benefits before increasing it to\noptimize price-performance.\u003C/p\u003E\n","\u003Ch2\u003EImplement strategies for handling concurrent queries\u003C/h2\u003E\n","\u003Ch4\u003ETune max concurrency level\u003C/h4\u003E\n","\u003Cp\u003EFor multi-cluster warehouses, fine-tune concurrency with the\nMAX_CONCURRENCY_LEVEL parameter, which sets the maximum queries per\ncluster. Reducing this value can benefit resource-intensive queries by\nproviding more compute power, potentially improving throughput by\nminimizing concurrency overhead and optimizing resource utilization.\u003C/p\u003E\n","\u003Cp\u003EThis parameter's &quot;unit of measurement&quot; is not strictly a query count,\nbut rather &quot;full, cluster-wide queries.&quot; While no single query counts\nfor more than one unit, some, like stored procedure CALL statements,\ncount for less. A CALL statement, being a single control thread, uses\nonly a fraction of a cluster's &quot;width,&quot; representing a fraction of a\nunit. Thus, multiple CALL statements might aggregate into one unit,\nmeaning a MAX_CONCURRENCY_LEVEL of eight could support more than eight\nconcurrent CALL statements. Snowflake automatically manages these\ncalculations for optimized resource utilization.\u003C/p\u003E\n","\u003Cp\u003EWhile query concurrency can exceed MAX_CONCURRENCY_LEVEL due to lower\ndegrees of parallelism, fewer queries might be assigned to a cluster\nbefore queueing due to memory budgeting. Each query has a memory metric\nthat determines if a cluster can accept it without exceeding its budget.\nIf exceeded, the query is not assigned. If no clusters are available,\nthe query queues, awaiting capacity. Larger or more complex queries\nincrease the memory metric, reducing net concurrency for warehouses\nprocessing heavyweight queries.\u003C/p\u003E\n","\u003Cp\u003EThis parameter also applies to single-cluster warehouses. Reducing its\nvalue will cause queueing. Without a multi-cluster warehouse (MCW),\nqueries will wait for capacity to free up when others complete, rather\nthan a new cluster spinning up. However, for some scenarios, tuning this\nvalue for a single-cluster warehouse may be appropriate.\u003C/p\u003E\n","\u003Ch4\u003EStagger scheduled jobs\u003C/h4\u003E\n","\u003Cp\u003EFor predictable, high-concurrency workloads like scheduled batch jobs,\nstaggering their start times effectively avoids concurrency spikes,\nallowing more efficient use of warehouse resources. This prevents jobs\nfrom running simultaneously and competing for resources, mitigating the\nnegative impacts of concurrency spikes.\u003C/p\u003E\n","\u003Cp\u003ESince most jobs begin with scan-based activity (I/O), even slight\nstaggering of heavyweight queries can prevent &quot;stampedes&quot; that arise\nfrom simultaneous dispatch. While Snowflake and cloud storage are highly\nscalable, making staggering not a strict requirement, it is a best\npractice for optimal resource utilization.\u003C/p\u003E\n","\u003Cp\u003EThis principle also applies to concurrent queries dispatched from an\napplication. Introducing a slight delay, sometimes via a small random\noffset for each query, provides similar benefits to staggering scheduled\njobs.\u003C/p\u003E\n","\u003Ch4\u003EMonitor for queuing\u003C/h4\u003E\n","\u003Cp\u003EWhen queries queue on a warehouse, it's a signal that the warehouse\nmight be under-provisioned for the workload, and either a larger\nwarehouse size or a multi-cluster warehouse (with an increased maximum\ncluster count) would be beneficial. You can use Snowflake's\n\u003Ca href=\"https://docs.snowflake.com/en/sql-reference/account-usage/query_history\"\u003E&lt;u&gt;QUERY_HISTORY&lt;/u&gt;\u003C/a\u003E\nview in the ACCOUNT_USAGE share to monitor query queuing and identify\nconcurrency issues. There are three queueing-related attributes in the\nview:\u003C/p\u003E\n\u003Cul\u003E\u003Cli\u003E\n","\u003Cp\u003Equeued_provisioning_time\u003C/p\u003E\n\u003Cul\u003E\u003Cli\u003EWarehouse start up (resume from suspended; less relevant here)\u003C/li\u003E\u003C/ul\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003Equeued_repair_time\u003C/p\u003E\n\u003Cul\u003E\u003Cli\u003EWarehouse repair (less common; not relevant here)\u003C/li\u003E\u003C/ul\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003Equeued_overload_time\u003C/p\u003E\n\u003Cul\u003E\u003Cli\u003EQuery waiting for warehouse resources to free up (most relevant\nhere)\u003C/li\u003E\u003C/ul\u003E\n\u003C/li\u003E\u003C/ul\u003E\n","\u003Cp\u003EWhen coupled with the following attributes that are also included in the\nview:\u003C/p\u003E\n\u003Cul\u003E\u003Cli\u003E\n","\u003Cp\u003Ewarehouse_id / warehouse_name\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003Ewarehouse_size\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003Estart_time\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003Eend_time\u003C/p\u003E\n\u003C/li\u003E\u003C/ul\u003E\n","\u003Cp\u003EIt is fairly straightforward to identify warehouses that require\nadditional compute resources, and also whether this is periodic or\nsustained.\u003C/p\u003E\n","\u003Ch4\u003ESpecial considerations for concurrent stored procedures\u003C/h4\u003E\n","\u003Cp\u003ESnowflake stored procedures, invoked via a CALL statement, coordinate\nchild SQL statements. The CALL statement itself uses minimal warehouse\nresources, but child statements, executing as separate queries, can\nfully utilize a warehouse cluster. By default, child statements run on\nthe same warehouse as the parent.\u003C/p\u003E\n","\u003Cp\u003EIn environments with extensive stored procedure use and high CALL\nstatement concurrency, parent and child statements can intertwine on a\nsingle warehouse. While lightweight parent statements are easily\nassigned, high concurrency can lead to child statements queuing. A\nparent statement cannot complete until all its children do. This can\ncause a subtle deadlock: many parent statements wait for children, but\nsome children are blocked due to insufficient warehouse capacity.\u003C/p\u003E\n","\u003Cp\u003ETo prevent this, isolate parent and child statements on different\nwarehouses. This is achieved by having the parent issue a USE WAREHOUSE\ncommand before launching child statements. This simple strategy\neffectively avoids deadlocks in high stored procedure concurrency.\nAdditionally, using two warehouses allows each to be optimally\nconfigured for its specific purpose.\u003C/p\u003E\n","\u003Ch2\u003EUtilize Snowflake's serverless features\u003C/h2\u003E\n","\u003Ch3\u003EAutomatic Clustering Service\u003C/h3\u003E\n","\u003Cp\u003E\u003Ca href=\"https://docs.snowflake.com/en/user-guide/tables-auto-reclustering\"\u003E&lt;u&gt;Automatic\nclustering&lt;/u&gt;\u003C/a\u003E\nin Snowflake is a background service that continuously manages data\nreclustering for tables with a defined and enabled cluster key.\nClustering table data effectively, based on columns or expressions, is a\nhighly effective performance optimization. It directly supports pruning,\nwhere specific micro-partitions are eliminated from a query's table\nscan. This micro-partition elimination provides direct performance\nbenefits, as I/O operations, especially across a network to remote\nstorage, can be expensive. By clustering data to align with common\naccess paths, MIN-MAX ranges for columns become narrower, reducing the\nnumber of micro-partitions scanned for a query.\u003C/p\u003E\n","\u003Cp\u003E\u003Ca href=\"https://docs.snowflake.com/en/user-guide/tables-clustering-keys\"\u003E&lt;u&gt;Defining the correct cluster\nkey&lt;/u&gt;\u003C/a\u003E\nis crucial for achieving excellent query performance and optimizing\ncredit consumption. While the Automatic Clustering Service incurs credit\ncharges to maintain a table's clustering state, when implemented\ncorrectly, overall credit consumption should be lower, often by an order\nor two of magnitude, compared to not managing clustering. Best practices\nfor cluster key selection include:\u003C/p\u003E\n\u003Cul\u003E\u003Cli\u003E\n","\u003Cp\u003EThe order of expressions in a multi-part cluster key is crucial. The\nfirst expression, or &quot;leading edge,&quot; has the greatest impact on\nclustering.\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003ECurrently, Snowflake ignores any expressions beyond the fourth in a\ncluster key. Do not define a cluster key with more than four\nexpressions.\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003EEven with four or fewer expressions, not all may affect clustering.\nClustering co-locates rows into micro-partitions to achieve narrow\nMIN-MAX ranges. If the composite cluster key's cardinality exceeds the\nnumber of micro-partitions, further co-location is not possible.\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003EFor activity-based tables that continually grow (e.g., sales, web\nclicks), a date/time-based leading edge is often effective. Unless\nolder data is restated, micro-partitions stabilize quickly, reducing\nchurn. This benefits Search Optimization, Materialized Views, Dynamic\nTables, and Replication through reduced churn.\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003EIf a column has high cardinality but is valuable as an access path,\nconsider reducing its cardinality with a system function. Ensure the\nfunction maintains the original column's partial ordering, segmenting\nvalues into &quot;buckets&quot; that preserve relative order. To reduce the\ncardinality of:\u003C/p\u003E\n\u003Cul\u003E\u003Cli\u003E\n","\u003Cp\u003EA string (VARCHAR), use LEFT().\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003EA timestamp, use TO_DATE to truncate to a DATE, or DATE_TRUNC for\nother units (HOUR, WEEK, MONTH, etc.).\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003EAn integer, use TRUNC(&lt;COL&gt;, &lt;BUCKETSIZE&gt;).\u003C/p\u003E\n\u003C/li\u003E\u003C/ul\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003EFor string expressions in a cluster key, Snowflake rarely considers\nmore than five characters (never more than six). For multi-byte\nnon-Latin characters, this can be as low as one. Therefore, COL_X as a\ncluster key expression is functionally equivalent to LEFT(COL_X, 5)\nfor Latin characters. To consider more characters, stitch them\ntogether as multiple expressions, e.g., CLUSTER BY (LEFT(COL_X, 5),\nSUBSTR(COL_X, 6, 5)) for the first ten characters.\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003EDo not use functions like MOD, as they do not result in narrow MIN-MAX\nranges. For example, MOD(COL, 10) treats 1, 11, and 100000001 as\nequivalent for clustering, but results in a very wide MIN-MAX range,\nsignificantly diminishing pruning effectiveness.\u003C/p\u003E\n\u003C/li\u003E\u003C/ul\u003E\n","\u003Ch3\u003ESearch Optimization (SO) Service\u003C/h3\u003E\n","\u003Cp\u003EFor highly selective queries on large tables, enable the \u003Ca href=\"https://docs.snowflake.com/en/user-guide/search-optimization-service\"\u003E&lt;u&gt;Search\nOptimization\nService&lt;/u&gt;\u003C/a\u003E.\nThis serverless feature creates a persistent data structure (index) for\nefficient micro-partition pruning, significantly reducing scanned data\nand improving query performance. It is effective for point lookups and\nsubstring searches, even on semi-structured data.\u003C/p\u003E\n","\u003Cp\u003EConsider Search Optimization indexes when clustering alone doesn't meet\nperformance objectives. Search Optimization enhances pruning without\nrequiring narrow MIN-MAX ranges, using Bloom filters to identify\nmicro-partitions that do not contain matching rows.\u003C/p\u003E\n","\u003Cp\u003EClustering often affects Search Optimization's effectiveness.\nEstablishing a cluster key before assessing Search Optimization's\npruning is often advantageous, as altering clustering can change pruning\neffectiveness.\u003C/p\u003E\n","\u003Cp\u003ESearch Optimization builds incrementally on registered micro-partitions.\nAn index may cover 0% to 100% of active micro-partitions. If a query is\nissued with partial coverage, the index is leveraged for covered\nmicro-partitions, providing an additional pruning option beyond MIN-MAX\npruning. Uncovered micro-partitions miss this secondary pruning. Heavy\ntable churn can diminish Search Optimization's effectiveness, so\nminimize unnecessary churn when the service is configured.\u003C/p\u003E\n","\u003Ch3\u003EMaterialized View (MV) Service\u003C/h3\u003E\n","\u003Cp\u003EFor frequently-run queries with repeated subquery results, such as\ncomplex aggregations, use a materialized view. The \u003Ca href=\"https://docs.snowflake.com/en/user-guide/views-materialized\"\u003E&lt;u&gt;Materialized View\nService&lt;/u&gt;\u003C/a\u003E\nautomatically refreshes the view when the underlying base table changes,\nallowing subsequent queries to use pre-computed results for faster\nperformance.\u003C/p\u003E\n","\u003Cp\u003ESimilar to Search Optimization, Materialized View maintenance is\nincremental on active micro-partitions. If a table experiences extensive\nmicro-partition churn, performance benefits diminish. Queries\nencountering non-covered micro-partitions revert to the base table,\nimpacting performance.\u003C/p\u003E\n","\u003Cp\u003EFor MVs that aggregate data (via DISTINCT or GROUP BY), results are\nstored per source micro-partition, requiring a query-time final\naggregation. This final aggregation is usually negligible, but if\nsignificant, consider alternative data materialization via manual ETL or\nDynamic Tables, balancing data access and latency.\u003C/p\u003E\n","\u003Ch3\u003EQuery Acceleration Service (QAS)\u003C/h3\u003E\n","\u003Cp\u003ETo speed up portions of a query workload on an existing warehouse,\nenable the Query Acceleration Service. This service automatically\noffloads parts of the query processing work, particularly large scans\nwith selective filters, to shared compute resources. It's ideal for ad\nhoc analytics or workloads with unpredictable data volumes, as it\nreduces the impact of resource-hungry &quot;outlier queries&quot; without needing\nto manually scale up the entire warehouse.\u003C/p\u003E\n","\u003Cp\u003EIt is important to understand that QAS is limited to a subset of\noperation types within the processing of a query. Specifically, there\nare two primary scenarios where QAS can be employed within a query\ntoday:\u003C/p\u003E\n\u003Cul\u003E\u003Cli\u003E\n","\u003Cp\u003EFor a COPY INTO, it can participate in the entire operation for a\nsubset of the source files that are being ingested. It can scan,\ntransform, and write out rows.\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003EFor SELECT and INSERT (including CTAS), QAS can only participate in\nthe following operation types:\u003C/p\u003E\n\u003Cul\u003E\u003Cli\u003E\n","\u003Cp\u003ETable Scan\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003ETransformation (computed columns)\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003EFilter (predicate and join filters)\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003EAggregation (GROUP BY)\u003C/p\u003E\n\u003C/li\u003E\u003C/ul\u003E\n\u003C/li\u003E\u003C/ul\u003E\n","\u003Cp\u003EIf any other operation type is encountered within a query execution\nplan, QAS will share its partial result with the warehouse and will not\nparticipate in that query any further. This includes (but is not limited\nto):\u003C/p\u003E\n\u003Cul\u003E\u003Cli\u003E\n","\u003Cp\u003EJoin\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003ESort\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003EInsert (write data to new micro-partitions)\u003C/p\u003E\n\u003C/li\u003E\u003C/ul\u003E\n","\u003Ch3\u003EServerless tasks\u003C/h3\u003E\n","\u003Cp\u003EFor scheduled, single-statement SQL or stored procedure-based workloads,\nconsider using serverless tasks instead of user-managed warehouses. With\nserverless tasks, Snowflake automatically manages the compute resources,\ndynamically allocating the optimal warehouse size for each run based on\npast performance. This eliminates the need for manual warehouse sizing,\nautomates cost management, and ensures that your data pipelines run\nefficiently without consuming credits when idle.\u003C/p\u003E\n","\u003Ch2\u003ELeverage Dynamic Tables for data engineering pipelines\u003C/h2\u003E\n","\u003Ch3\u003EImprove downstream query performance\u003C/h3\u003E\n","\u003Cp\u003EDynamic Tables enhance query performance for downstream consumers by\nmaterializing data. Unlike standard views, which re-execute their\nunderlying query each time they are called, Dynamic Tables pre-compute\nand store query results, providing a periodically refreshed version of\nthe data. This means complex, performance-intensive queries, such as\nthose with multiple joins and aggregations, are computed once during the\nrefresh cycle, rather than every time the result is queried.\u003C/p\u003E\n","\u003Cp\u003EThis significantly benefits applications like BI dashboards and embedded\nanalytics, where low latency is crucial. By directing these applications\nto a fast-responding Dynamic Table instead of a complex view, end-user\nqueries become simple SELECT statements on pre-computed results. This\ncan substantially boost performance, as the query engine bypasses\ntransformation logic, leading to quicker query execution and a more\nresponsive analytical experience for many concurrent users.\u003C/p\u003E\n","\u003Cp\u003EAs materialized tables, Dynamic Tables offer powerful performance\nadvantages similar to standard tables. They collect the same statistical\nmetadata automatically, and Snowflake's advanced query optimizations\napply when Dynamic Tables are the query source. Effectively, from a\nquery perspective, Dynamic Tables function as materialized standard\ntables.\u003C/p\u003E\n","\u003Cp\u003EAdditionally, Dynamic Tables are compatible with serverless features for\nfurther performance enhancements. You can apply Automatic Clustering for\nbetter partition pruning during data scanning. A Search Optimization\nService index can be built to accelerate scans for highly selective\nfilter criteria. Other serverless features, like Materialized Views and\nthe Query Acceleration Service, can also be layered on top of a Dynamic\nTable for even greater optimization.\u003C/p\u003E\n","\u003Ch3\u003EEnhance organizational productivity\u003C/h3\u003E\n","\u003Cp\u003EDynamic Tables simplify data engineering by allowing you to define a\ntable's desired final state with a CREATE DYNAMIC TABLE AS SELECT...\nstatement, rather than complex MERGE or INSERT, UPDATE, DELETE commands.\nThis declarative approach removes the burden of managing incremental\nlogic, which is often error-prone.\u003C/p\u003E\n","\u003Cp\u003EBeyond initial pipeline creation, Dynamic Tables automate data\norchestration by intelligently performing full or incremental refreshes,\napplying only necessary changes. This eliminates the need for manual\npipeline construction using STREAMS and TASKS, and facilitates chaining\nDynamic Tables for complex dependencies without external tools.\u003C/p\u003E\n","\u003Cp\u003EAdministration and monitoring are also streamlined. Snowflake's\ndedicated Snowsight graphical interface provides a visual representation\nof your pipeline's status, refresh history, and dependencies,\nsimplifying troubleshooting and governance. This &quot;single pane of glass&quot;\nidentifies bottlenecks or failures quickly, replacing manual log\ninspection or metadata queries.\u003C/p\u003E\n","\u003Cp\u003EUltimately, Dynamic Tables' declarative syntax, automated refresh logic,\nand integrated monitoring transform data engineering. You can configure\nthem to run on a set schedule or on-demand. By automating low-level\ntasks, Dynamic Tables enable data teams to focus on building new data\nproducts and driving business value, resulting in a more efficient and\nagile data platform.\u003C/p\u003E\n","\u003Ch3\u003E\u003Ca href=\"https://docs.snowflake.com/en/user-guide/dynamic-table-performance-guide\"\u003E&lt;u&gt;Best practices for Dynamic Tables&lt;/u&gt;\u003C/a\u003E\u003C/h3\u003E\n","\u003Cp\u003E\u003Cstrong\u003ESimplify the core definition:\u003C/strong\u003E Avoid overly complex single Dynamic\nTable definitions. For clarity and performance, it's a best practice to\nkeep the number of joined tables in a single definition to a minimum,\nideally no more than five. For more complex transformations, chain\nmultiple Dynamic Tables together, with each one building on the\nprevious.\u003C/p\u003E\n","\u003Cp\u003E\u003Cstrong\u003ELeverage dependency chaining:\u003C/strong\u003E Use the DOWNSTREAM keyword to specify\ndependencies between Dynamic Tables, which ensures that a dependent\ntable is only refreshed after its upstream source has been updated. This\nalso allows Snowflake to optimize processing by permitting refreshes on\na Dynamic Table to be deferred until it is required by a downstream\nDynamic Table.\u003C/p\u003E\n","\u003Cp\u003E\u003Cstrong\u003ESet the TARGET_LAG parameter appropriately:\u003C/strong\u003E The \u003Ca href=\"https://docs.snowflake.com/en/user-guide/dynamic-tables-target-lag\"\u003E&lt;u&gt;TARGET_LAG&lt;/u&gt;\n&lt;u&gt;parameter&lt;/u&gt;\u003C/a\u003E\ncontrols the maximum delay of the data in the Dynamic Table relative to\nits source. It's crucial to set this value to the highest number that\nstill meets your business requirements. Setting a TARGET_LAG that is\nlower than necessary can cause more frequent, less efficient refreshes,\nwhich increases credit consumption and resource usage without providing\nany tangible business benefit.\u003C/p\u003E\n","\u003Cp\u003E\u003Cstrong\u003EAvoid high DML churn on source tables\u003C/strong\u003E\u003C/p\u003E\n","\u003Cp\u003EExcessive DML operations like UPDATE or DELETE on a source table can\nsignificantly impact the performance of its dependent Dynamic Table.\nThis is because the underlying change data capture (CDC) mechanism has\nto process a higher volume of changes, which requires more compute and\ncan lead to slower refresh times. Designing data pipelines to be\nappend-only when possible is a key best practice for maximizing\nefficiency.\u003C/p\u003E\n","\u003Cp\u003E\u003Cstrong\u003EUtilize the IMMUTABLE WHERE clause\u003C/strong\u003E\u003C/p\u003E\n","\u003Cp\u003EUse the \u003Cstrong\u003EIMMUTABLE WHERE\u003C/strong\u003E clause in your Dynamic Table definition to\nspecify a predicate for immutable source data. This allows the refresh\nservice to avoid re-scanning historical data that is guaranteed not to\nchange, which can significantly improve the efficiency and performance\nof incremental refreshes.\u003C/p\u003E\n","\u003Cp\u003E\u003Cstrong\u003EManage backfills with BACKFILL FROM clause\u003C/strong\u003E\u003C/p\u003E\n","\u003Cp\u003ETo load historical data into a new Dynamic Table, or one that is\nundergoing a change to its schema definition, use the BACKFILL FROM\nparameter in the CREATE DYNAMIC TABLE syntax. This allows you to specify\na timestamp from which the initial refresh should begin, providing a\nsimple, declarative way to backfill the table with historical records.\nIt eliminates the need for manual, complex backfilling scripts.\u003C/p\u003E\n","\u003Cp\u003E\u003Cstrong\u003ERight-size the refresh warehouse:\u003C/strong\u003E Ensure the warehouse specified for\nthe Dynamic Table refresh is appropriately sized for the workload. A\nlarger warehouse can process large refreshes more quickly, while a\nsmaller one may be more cost-effective for frequent, smaller incremental\nupdates.\u003C/p\u003E\n","\u003Cp\u003E\u003Cstrong\u003EMonitor refresh history:\u003C/strong\u003E Regularly monitor the refresh history of\nyour Dynamic Tables using the DYNAMIC_TABLE_REFRESH_HISTORY view. This\nprovides insights into the refresh performance, latency, and costs,\nallowing you to fine-tune your definitions and warehouse sizes for\ncontinuous optimization.\u003C/p\u003E\n","\u003Ch2\u003EImplement continuous performance monitoring and optimization\u003C/h2\u003E\n","\u003Ch3\u003EOverview\u003C/h3\u003E\n","\u003Cp\u003EEstablish comprehensive monitoring and logging to identify performance\nbottlenecks. Proactively optimize the system by analyzing queries and\nworkloads to adapt to evolving requirements.\u003C/p\u003E\n","\u003Ch4\u003EDesired outcome\u003C/h4\u003E\n","\u003Cp\u003EEffective performance monitoring and optimization yield a system with\npredictable performance and stable costs, even as data and applications\nevolve. This foundation supports future growth in data volume and query\nactivity, enabling better root cause analysis and cost management.\u003C/p\u003E\n","\u003Ch3\u003ERecommendations\u003C/h3\u003E\n","\u003Cp\u003EPerformance optimization often follows the 80/20 rule, where a minimal\ninvestment can yield significant improvements. While definitive rules\nare elusive due to diverse workloads, these recommendations establish a\nfoundation for a performant, cost-stable workload on the Snowflake\nplatform.\u003C/p\u003E\n","\u003Ch4\u003EUnderstand how Snowflake works\u003C/h4\u003E\n","\u003Cp\u003EA technical understanding of the Snowflake architecture is crucial for\ndiagnosing performance issues and identifying optimization\nopportunities. While most workloads perform well without deep expertise,\nperformance tuning requires a greater investment in understanding the\nplatform's fundamentals.\u003C/p\u003E\n","\u003Ch4\u003EMeasure performance\u003C/h4\u003E\n","\u003Cp\u003EObjective measurement is a prerequisite for meaningful optimization.\nWithout a clear and objective baseline, success cannot be defined,\nleaving initiatives without direction.\u003C/p\u003E\n","\u003Ch4\u003EIdentify bottlenecks\u003C/h4\u003E\n","\u003Cp\u003EFocus optimization efforts on significant bottlenecks at the macro\n(application), workload, or micro (query) level. Addressing\ninconsequential components yields minimal overall improvement.\u003C/p\u003E\n","\u003Ch4\u003EProactively optimize\u003C/h4\u003E\n","\u003Cp\u003EAddress performance proactively, not just reactively. Regular analysis\nof performance patterns and slow queries can prevent emergencies.\nEstablishing a performance baseline is key to tracking trends and\ndetermining if performance is improving or degrading over time.\u003C/p\u003E\n","\u003Ch4\u003EThoroughly test performance optimizations\u003C/h4\u003E\n","\u003Cp\u003EPredicting query performance is difficult; therefore, testing is\nessential. Validate that changes improve the target workload without\nnegatively impacting others. Testing proves whether a proposed solution\nhas the desired effect.\u003C/p\u003E\n","\u003Ch4\u003EMeticulously validate AI suggestions\u003C/h4\u003E\n","\u003Cp\u003EAI can be a useful tool, but suggestions require critical validation.\nTest AI-driven recommendations thoroughly against platform knowledge and\nreliable sources before implementation.\u003C/p\u003E\n","\u003Ch3\u003ETrade-offs &amp; considerations\u003C/h3\u003E\n","\u003Ch4\u003ECost versus performance\u003C/h4\u003E\n","\u003Cp\u003EThe relationship between cost and performance is not linear. While some\noptimizations increase cost, others can reduce it. For example, a query\nthat takes 10 minutes on an XS warehouse and spills to remote storage\nmight complete in one minute on a Small warehouse without spilling. In\nthis case, selecting a larger, more expensive warehouse results in a\nfaster, cheaper query execution.\u003C/p\u003E\n","\u003Ch4\u003EMonitoring versus analysis\u003C/h4\u003E\n","\u003Cp\u003ESnowflake's rich performance data favors targeted analysis over constant\nmonitoring. A proactive approach to reviewing and comparing performance\ndata is required. The optimal balance depends on workload criticality;\nsensitive operations may benefit from continuous analysis, while stable\nprocesses can rely on retrospective analysis.\u003C/p\u003E\n","\u003Ch4\u003EStatistical rigor versus agility\u003C/h4\u003E\n","\u003Cp\u003EAccurate performance insights require statistically sound metrics.\nHowever, this rigor can slow down the optimization process. Balance the\nneed for statistically valid data with the need for agile\ndecision-making. Less rigorous measurements may suffice for initial\ntroubleshooting, with comprehensive testing reserved for validating\nmajor changes.\u003C/p\u003E\n","\u003Ch4\u003EFactors impacting performance\u003C/h4\u003E\n","\u003Cp\u003ENumerous factors can impact query and workload performance. This list is\na starting point for consideration.\u003C/p\u003E\n\u003Cul\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003EData volume\u003C/strong\u003E: Significant changes in data volume can impact\nperformance, especially if a threshold is crossed that causes\noperations like remote spilling.\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003EData distribution\u003C/strong\u003E: Data value distribution affects micro-partition\nscanning and overall performance. Changes can alter query plans and\nthe amount of data processed.\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003EData clustering\u003C/strong\u003E: Clustering, the physical grouping of data in\nmicro-partitions, is critical. Poor clustering increases\nmicro-partition scanning, degrading performance. Maintaining good\nclustering improves partition pruning.\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003EData model\u003C/strong\u003E: The logical data organization profoundly impacts\nperformance. Poorly designed models can lead to inefficient query\nplans, while overly wide tables can also present challenges.\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003EQuery syntax\u003C/strong\u003E: The structure of a SQL query significantly affects\nits execution plan. Inefficient syntax, like poor JOIN conditions, can\nprevent the optimizer from choosing an efficient plan.\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003EView definitions\u003C/strong\u003E: A view's underlying definition impacts the\nperformance of queries that use it. A complex view can hide\nperformance problems and introduce computational overhead with every\nexecution.\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003EData share changes\u003C/strong\u003E: Changes to shared data, such as new columns or\nmodified clustering keys, can impact consumer query performance.\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003ESearch Optimization changes\u003C/strong\u003E: The Search Optimization Service can\naccelerate point lookups. Adding or removing it can have a massive\nimpact on the performance of applicable queries.\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003EUse of Hybrid Tables\u003C/strong\u003E: Hybrid Tables blend OLTP and OLAP\ncapabilities. Their performance characteristics for analytical queries\nmay differ from standard tables, requiring specific workload\nconsiderations.\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003EWarehouse characteristics\u003C/strong\u003E: Virtual warehouse configuration has a\ndirect impact on performance. This includes:\u003C/p\u003E\n\u003Cul\u003E\u003Cli\u003E\n","\u003Cp\u003EVirtual warehouse size\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003EMulti-Cluster Warehouse (MCW) settings\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003EMAX_CONCURRENCY_LEVEL\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003EQuery Acceleration Service (QAS)\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003ESnowpark-optimized warehouse settings\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003EWarehouse generation (Gen1 vs. Gen2)\u003C/p\u003E\n\u003C/li\u003E\u003C/ul\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003ECaching\u003C/strong\u003E: Snowflake uses metadata, result set, and warehouse data\ncaching. A valid cache hit accelerates query execution, while a cache\nmiss can be slower.\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003EConcurrency\u003C/strong\u003E: Multiple queries competing for resources can slow\nindividual execution times. Proper warehouse sizing and MCW\nconfiguration can prevent concurrency bottlenecks.\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003EQueuing due to load\u003C/strong\u003E: When a warehouse is at capacity, new queries\nare queued, increasing total execution time. This indicates a need for\na larger warehouse or more clusters.\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003EQueuing due to locks\u003C/strong\u003E: Locks ensure data integrity during DML\noperations. While minimal, lock contention can occur and must be\nresolved to maintain a responsive system.\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003ESnowflake updates\u003C/strong\u003E: Regular platform updates, which often include\nperformance enhancements, can occasionally alter query optimizer\nbehavior and execution plans, potentially impacting specific\nworkloads.\u003C/p\u003E\n\u003C/li\u003E\u003C/ul\u003E\n","\u003Cp\u003EThis list is not exhaustive, and some of these things are much more\nlikely than others.\u003C/p\u003E\n","\u003Ch3\u003EMeasuring performance\u003C/h3\u003E\n","\u003Ch4\u003EOverview\u003C/h4\u003E\n","\u003Cp\u003ERigorous measurement is essential for achieving performance targets,\nconfirming improvements, and preventing performance issues. Snowflake\nprovides a wealth of performance data, which reduces the need for\nconstant monitoring. This data only gains meaning through consistent\nreview and comparative analysis.\u003C/p\u003E\n","\u003Cp\u003E\u003Cstrong\u003EDesired outcome\u003C/strong\u003E\u003C/p\u003E\n","\u003Cp\u003EUnderstanding current performance allows identification of anomalies and\ntheir origins. It can also help understand how time spent within\nSnowflake relates to other parts of an application or pipeline.\u003C/p\u003E\n","\u003Ch3\u003ERecommendations\u003C/h3\u003E\n","\u003Cp\u003EA robust performance measurement strategy is built on a clear purpose, a\ndefined scope, and a consistent process for evaluating critical\nworkloads. These recommendations are essential to properly measuring\nperformance:\u003C/p\u003E\n","\u003Ch4\u003EClarify reasons for measuring performance\u003C/h4\u003E\n","\u003Cp\u003EIdentifying the reason for measuring performance guides the effort and\ntime invested. The common reasons for measuring the performance of a\nquery or workload include establishing a baseline, comparing to a\nbaseline, troubleshooting, controlling costs, and understanding\ncontributions to Service Level Objectives (SLOs) or performance targets.\u003C/p\u003E\n","\u003Ch4\u003EDefine measurement scope\u003C/h4\u003E\n","\u003Cp\u003EDefine the dimensions of the analysis. Pinpoint the object of\nmeasurement, since performance in Snowflake can be evaluated at\ndifferent levels of granularity.\u003C/p\u003E\n","\u003Cp\u003EUnderstanding the granularity of performance measurement guides the\ntechniques and tools employed.\u003C/p\u003E\n","\u003Ch4\u003EIdentify priority workloads and queries\u003C/h4\u003E\n","\u003Cp\u003EThe choice of what to measure depends on the reason for performance\nanalysis and the desired granularity. There are different considerations\nfor measuring single queries, workloads , and workloads with\nconcurrency. The overall goal is to focus effort where it will have the\nmost impact.\u003C/p\u003E\n","\u003Ch4\u003ESelect metrics\u003C/h4\u003E\n","\u003Cp\u003ECarefully choose and measure performance metrics in Snowflake to ensure\neffective analysis.There are many valid metrics, including overall query\nexecution time, query cost, and metrics like files scanned. Statistical\nsignificance is important in measuring performance.\u003C/p\u003E\n","\u003Ch4\u003EDefine your measurement cadence\u003C/h4\u003E\n","\u003Cp\u003EEstablish a clear schedule and triggers for measuring performance.\nUnderstanding when to measure performance allows for focused effort and\nhelps avoid over-reacting to perceived performance problems. The goal is\nto provide a valid comparison point and understand the impact of various\nfactors on performance.\u003C/p\u003E\n","\u003Ch3\u003EClarify reasons for measuring performance\u003C/h3\u003E\n","\u003Ch4\u003EOverview\u003C/h4\u003E\n","\u003Cp\u003EEstablishing a clear reason for measuring performance from the outset is\nparamount for understanding what data to examine and which strategic\ndirections to pursue.\u003C/p\u003E\n","\u003Cp\u003E\u003Cstrong\u003EDesired outcome\u003C/strong\u003E\u003C/p\u003E\n","\u003Cp\u003EDefining the &quot;why&quot; behind a performance initiative guides the level of\neffort and ensures resources are directed to the most impactful areas.\u003C/p\u003E\n","\u003Ch4\u003ERecommendations\u003C/h4\u003E\n","\u003Cp\u003ECommon reasons for measuring the performance of a query or workload\ninclude:\u003C/p\u003E\n\u003Cul\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003EEstablishing a baseline:\u003C/strong\u003E A baseline provides a reference point for\ncomparing future changes or problems. This comparison helps determine\nthe value of potential modifications and the importance of addressing\nan issue. It is crucial to gather metrics in a statistically sound\nmanner to avoid skewed results from transitory differences.\u003C/p\u003E\n\u003Cul\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003EQuery-Level baseline:\u003C/strong\u003E A single query is the simplest unit for a\nbaseline. Measure a query along several dimensions and record the\nvalues for later comparison. Establishing a query-level baseline\noften involves accessing information already stored by Snowflake.\nRecording a timestamp and query ID for lookup in QUERY_HISTORY is\noften sufficient, though longer retention may require storing this\ndata in a separate table. A baseline can be as simple as execution\ntime and micro-partitions scanned, or more detailed using\nGET_QUERY_OPERATOR_STATS().\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003EWorkload-level baseline:\u003C/strong\u003E A workload is a logical grouping of\nqueries, often identified by query tags, user, or warehouse. Since\nthe number of queries in a workload can change, a simple\nquery-by-query analysis is often insufficient.\u003C/p\u003E\n\u003C/li\u003E\u003C/ul\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003EComparing to a baseline:\u003C/strong\u003E Once established, a baseline is used to\nevaluate the impact of optimizations. When making changes, measure\nperformance against the baseline to quantify the improvement. This can\nbe applied to both individual queries and entire workloads.\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003ETroubleshooting:\u003C/strong\u003E A primary reason to collect performance data is\nto make a query or workload faster. To quantify an improvement, one\nmust first measure the initial performance. Understanding the scale of\na performance problem helps determine the appropriate level of urgency\nand resource allocation. Without a baseline, it is impossible to\ndetermine if performance has degraded, or by how much.\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003EUnderstanding contributions to SLOs:\u003C/strong\u003E The performance of a query or\nworkload is often critical to a larger application or pipeline with a\nService Level Objective (SLO). Understanding the contribution of each\ncomponent is essential for overall performance improvement and for\nassessing the severity of any performance issues.\u003C/p\u003E\n\u003C/li\u003E\u003C/ul\u003E\n","\u003Ch3\u003EDefine measurement scope\u003C/h3\u003E\n","\u003Ch4\u003EOverview\u003C/h4\u003E\n","\u003Cp\u003EA successful performance measurement strategy begins with a clear\ndefinition of the scope of the analysis. It is important to identify the\nspecific object of measurement, as performance in Snowflake can be\nevaluated at several different levels of granularity.\u003C/p\u003E\n","\u003Cp\u003E\u003Cstrong\u003EDesired outcome\u003C/strong\u003E\u003C/p\u003E\n","\u003Cp\u003EThe level of granularity chosen for performance measurement will guide\nsubsequent decisions, such as the appropriate measurement techniques.\nThis clarity is essential for directing performance tuning efforts in\nthe most effective way.\u003C/p\u003E\n","\u003Ch4\u003ERecommendations\u003C/h4\u003E\n","\u003Cp\u003EPerformance can be measured at various levels of granularity. The most\ncommon granularities for performance measurement are:\u003C/p\u003E\n\u003Cul\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003ESingle query:\u003C/strong\u003E The performance of a single query is often a\ncritical factor. A single query can be the most resource-intensive\ncomponent of a pipeline or application, or it may be executed with\nsuch high frequency that its individual performance has a significant\ncumulative impact. Analyzing individual queries can also reveal\npatterns in performance or data modeling that can be applied to\nimprove a broader set of queries. A focus on individual query\nperformance is generally a necessary part of any effort to improve\noverall performance or reduce costs.\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003EWorkload:\u003C/strong\u003E In many cases, optimizing the performance of a single\nquery is not enough. An improvement to one query can sometimes lead to\na degradation in the performance of another. To achieve significant\nperformance gains, it may be necessary to analyze the performance of\nall queries within a pipeline or application. A comprehensive approach\nto workload analysis, including the establishment of a baseline and a\nwell-defined testing methodology, is essential for effective\nregression testing and overall performance improvement.\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003EConcurrency:\u003C/strong\u003E Concurrency testing is a specialized area of testing\nthat is most likely to be something that is needed for high\nconcurrency and low latency applications. It is rare to engage in\nconcurrency testing to simply reduce costs or in the pursuit of better\nmetrics on paper. Concurrency testing generally involves using a\nthird-party app, such as JMeter, to run queries in specific patterns.\u003C/p\u003E\n\u003C/li\u003E\u003C/ul\u003E\n","\u003Ch4\u003EConcurrency testing anti-patterns\u003C/h4\u003E\n","\u003Cp\u003EAs mentioned above, there are many potential anti-patterns for\nconcurrency testing. Here are several to avoid:\u003C/p\u003E\n\u003Cul\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003EFailing to simulate a realistic ramp-up:\u003C/strong\u003E Starting a concurrency\ntest with a sudden, massive spike of concurrent queries rather than a\ngradual ramp-up. A sudden burst does not allow time for proper scaling\nat the virtual warehouse and the cloud services layer, unless those\nlayers are specifically configured to handle bursting workloads. Such\na pattern can trigger queuing and auto-scaling. This pattern may not\nbe representative of how users naturally log on and begin their work\nthroughout the day, and may have negative performance patterns that\nare not representative of a real workload.\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003ENot validating the test environment:\u003C/strong\u003E Failing to ensure the testing\nenvironment (including data volume, data distribution, and data\nclustering) is a true representation of the production environment. A\ntest run on a small, non-representative dataset may yield results that\nare not applicable to the real-world workload.\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003EFailing to use separate warehouses for distinct workloads:\u003C/strong\u003E Lumping\ntogether disparate workloads&mdash;such as ETL and BI dashboards&mdash;on the same\nwarehouse. This is an anti-pattern for performance in general, but in\nconcurrency testing, it can skew results and hide the true bottlenecks\nfor each workload type.\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003EUsing a single, large warehouse for all workloads:\u003C/strong\u003E Testing a mix\nof small, fast-running queries and large, resource-intensive queries\non a single, oversized warehouse. This can lead to resource contention\nand queuing for the smaller queries, which could be handled more\nefficiently on a smaller, separate warehouse. It also wastes credits\nby over-provisioning for the smaller workloads.\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003EIgnoring the multi-cluster warehouse's scaling policies:\u003C/strong\u003E Not\nunderstanding the difference between the &quot;Standard&quot; and &quot;Economy&quot;\nscaling policies. Testing with &quot;Economy&quot; can lead to high queuing as\nSnowflake attempts to fully utilize existing clusters before spinning\nup new ones, while a workload requiring low latency might need the\n&quot;Standard&quot; policy's more rapid scaling.\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003EUsing an un-representative test workload:\u003C/strong\u003E Simulating concurrency\nwith a small, static set of queries that do not accurately reflect\nreal-world user behavior. A good concurrency test needs a mix of query\ntypes, complexities, and data access patterns that mirror the\nproduction workload.\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003EOverlooking the impact of caching:\u003C/strong\u003E Not accounting for the various\ncache layers in Snowflake (result, warehouse, and metadata cache). A\npoorly designed test may repeatedly hit the same cached result, giving\na false impression of performance under load. A true concurrency test\nmust be designed to invalidate the cache and simulate a realistic mix\nof cold and warm queries. Disabling the result set cache is a bad idea\nfor concurrency testing - if the test is properly designed, the result\nset cache will be used appropriately.\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003ENot establishing a baseline without concurrency:\u003C/strong\u003E Running a\nconcurrency test without first measuring the performance of individual\nqueries in isolation. Without this baseline, it is impossible to\nattribute performance degradation to concurrency versus other factors,\nlike query complexity or data changes.\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003ETreating Snowflake like an OLTP database:\u003C/strong\u003E For optimal performance\nin Snowflake, some level of denormalization is often advantageous.\nGrouping DML operations logically, rather than executing a large\nnumber of individual INSERT, UPDATE, DELETE, or MERGE operations that\naffect only a few rows, tends to be more cost-efficient and perform\nbetter.\u003C/p\u003E\n\u003C/li\u003E\u003C/ul\u003E\n","\u003Ch3\u003EIdentify priority workloads and queries\u003C/h3\u003E\n","\u003Ch4\u003EOverview\u003C/h4\u003E\n","\u003Cp\u003EAfter establishing the reason for performance analysis and the required\ngranularity \u003Ca href=\"https://docs.google.com/document/d/1LDeFasziRlYL1Z5t9BqJ_MwhECtJHbRDKG5BNWUAuwU/edit?tab=t.l1pikt37o4sn\"\u003E&lt;u&gt;of what you&rsquo;re\nmeasuring&lt;/u&gt;\u003C/a\u003E,\nthe next step is to identify the specific workloads or queries that will\nbe the focus of the investigation.\u003C/p\u003E\n","\u003Cp\u003E\u003Cstrong\u003EDesired outcome\u003C/strong\u003E\u003C/p\u003E\n","\u003Cp\u003ETargeting performance measurements allows for the efficient allocation\nof time and resources to the areas where they will have the most\nsignificant impact.\u003C/p\u003E\n","\u003Ch4\u003ERecommendations\u003C/h4\u003E\n","\u003Cp\u003EThe selection of a query or workload for performance measurement may be\napparent based on the reason for measuring performance. However, if a\nspecific target has not yet been identified, the following\nrecommendations can help guide the selection process based on the chosen\nlevel of granularity.\u003C/p\u003E\n","\u003Ch4\u003ESingle query\u003C/h4\u003E\n","\u003Cp\u003EIdentifying a single query for performance analysis from a large volume\nof queries requires a systematic approach. Queries can be prioritized\nbased on various dimensions, including:\u003C/p\u003E\n\u003Cul\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003ECost:\u003C/strong\u003E The most expensive queries in terms of resource consumption.\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003EExpectations:\u003C/strong\u003E Queries that deviate from expected performance\nnorms.\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003ECriticality:\u003C/strong\u003E Queries that are essential to the functionality of an\napplication, dashboard, or pipeline.\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003EUser impact:\u003C/strong\u003E Queries that directly affect the end-user experience.\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003EHistorical performance:\u003C/strong\u003E Queries that have been identified as\nproblematic in the past.\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003EComplexity:\u003C/strong\u003E Queries with a high degree of complexity.\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003EData access:\u003C/strong\u003E Queries that scan a large number of micro-partitions.\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003EPerformance variance:\u003C/strong\u003E Queries that exhibit a wide range of\nexecution times.\u003C/p\u003E\n\u003C/li\u003E\u003C/ul\u003E\n","\u003Cp\u003EIt is important to focus on queries that are meaningful and relevant to\nthe overall performance goals. Analyzing random queries is unlikely to\nyield significant improvements. The insights gained from optimizing a\nsingle query can often be applied to other queries with similar\npatterns.\u003C/p\u003E\n","\u003Cp\u003EThe QUERY_HISTORY view in ACCOUNT_USAGE is a valuable resource for\nidentifying queries that meet specific criteria. Aggregating data on the\nQUERY_PARAMETERIZED_HASH can help identify patterns across multiple\nexecutions of a query with different parameters, which is a common\ncharacteristic of workloads that support BI dashboards.\u003C/p\u003E\n","\u003Ch4\u003EWorkload\u003C/h4\u003E\n","\u003Cp\u003EThe process of selecting a workload for performance analysis is similar\nto that of selecting a single query. However, the decision is often\ninfluenced by business-related factors, such as the impact of the\nworkload on a critical metric. A workload is typically chosen for\nanalysis because it is a source of user frustration or because it is\nassociated with high costs, rather than solely because of its technical\ncomplexity.\u003C/p\u003E\n","\u003Cp\u003EA workload can be defined as a group of queries, and the criteria for\ngrouping can vary. Queries can be grouped by user, virtual warehouse, or\napplication. The use of query tags can be a helpful mechanism for\nidentifying and tracking the queries that constitute a specific workload\nin QUERY_HISTORY and other monitoring tools.\u003C/p\u003E\n","\u003Ch4\u003EConcurrency\u003C/h4\u003E\n","\u003Cp\u003EConcurrency testing is a specialized form of performance analysis that\nis typically reserved for applications with high-concurrency and\nlow-latency requirements. It is not generally employed for the sole\npurpose of cost reduction or for improving metrics that are not directly\nrelated to concurrency. Concurrency testing usually involves the use of\nthird-party tools, such as JMeter, to simulate specific query patterns.\u003C/p\u003E\n","\u003Ch3\u003ESelect metrics\u003C/h3\u003E\n","\u003Ch4\u003EOverview\u003C/h4\u003E\n","\u003Cp\u003EAfter deciding to measure performance, the next step is to determine\nwhich metrics to use and how to apply them. Using inappropriate metrics\nor applying them incorrectly can be counterproductive. A thoughtful and\ndeliberate approach to choosing and measuring metrics ensures a better\nreturn on the time and effort invested in performance analysis.\u003C/p\u003E\n","\u003Ch4\u003ERecommendations\u003C/h4\u003E\n","\u003Cp\u003EThere are two main aspects to consider when selecting metrics for\nperformance measurement: what to measure and how to measure it. The\nchoices made will depend on the overall goals of the performance\nanalysis and the specific context of the measurement. It is crucial to\nensure that the measurement methodology is valid.\u003C/p\u003E\n","\u003Ch4\u003EWhat to measure\u003C/h4\u003E\n\u003Cul\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003EQuery execution time:\u003C/strong\u003E The most common metric for analyzing the\nperformance of a single query or a workload is its execution time. In\nSnowflake, it is generally not beneficial to focus on individual\ncomponents of the execution time, such as compilation time, as a\nlonger compilation time can sometimes result in a shorter overall\nexecution time.\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003EQuery cost:\u003C/strong\u003E There is a nuanced relationship between performance\nand cost in Snowflake. A query that runs for 2 minutes on an X-Small\nwarehouse may cost the same as the same query running for 1 minute on\na Small warehouse. It is even possible for a query to be both faster\nand cheaper on a larger warehouse. Rigorous testing is essential to\ndetermine if changes that might seem to increase costs, such as using\na larger warehouse or clustering a table, actually lead to a reduction\nin overall cost.\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003EFiles scanned and other metrics:\u003C/strong\u003E Other metrics should also be\nconsidered. For example, the number of files scanned can be a key\nperformance indicator, especially when working with large datasets.\nMinimizing the amount of data that needs to be processed is often a\ncrucial step in improving performance.\u003C/p\u003E\n\u003C/li\u003E\u003C/ul\u003E\n","\u003Ch4\u003EHow to measure\u003C/h4\u003E\n","\u003Cp\u003EOnce a metric has been selected, it is important to decide how to\nmeasure it. A single execution of a query or workload is not a\nsufficient basis for a reliable measurement due to the many variables\nthat can affect performance, such as warehouse startup times and cache\npopulation. For a representative sample, it is recommended to run each\nquery or workload at least 10 times, preferably at different times of\nthe day and on different days. The results can then be aggregated to\nprovide a single, comparable number. Here are a few examples of common\naggregations:\u003C/p\u003E\n\u003Cul\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003EMean/average:\u003C/strong\u003E The average of a metric across multiple executions\nprovides a good understanding of what to expect. While the average\nwill not be the exact value for every execution, it is a simple and\nwidely understood calculation that can be used to put performance in\nthe context of a larger pipeline or application.\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003EP90 or higher:\u003C/strong\u003E When meeting a Service Level Objective (SLO) is the\nprimary goal, edge cases become more important. The 90th percentile\n(P90) can provide insight into what to expect when conditions are not\nideal. This is particularly useful in concurrency testing but can also\nbe applied to other types of performance analysis.\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003ESum across multiple executions:\u003C/strong\u003E The sum of a metric across\nmultiple executions can be a useful way to incorporate both the\nexpected performance and the variance into a single metric, although\nit does not provide an easy way to understand the performance in\ncontext.\u003C/p\u003E\n\u003C/li\u003E\u003C/ul\u003E\n","\u003Ch4\u003EPerformance metric anti-patterns\u003C/h4\u003E\n","\u003Cp\u003EWhen measuring performance, it is important to avoid common pitfalls\nthat can lead to inaccurate conclusions.\u003C/p\u003E\n\u003Cul\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003EBasing analysis on a single query execution\u003C/strong\u003E - Basing performance\nconclusions on a single execution of a query should be avoided, as\nthis approach lacks statistical significance. Numerous transient\nfactors can cause a single execution to run unusually fast or slow,\nleading to flawed assumptions based on a best-case or worst-case\nscenario rather than on a representative performance sample.\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003EFocusing on isolated execution phases\u003C/strong\u003E - Avoid focusing on isolated\ncomponents of query execution, such as compilation time. A longer\ncompilation phase can sometimes result in a more optimized execution\nplan and a shorter total execution time. The primary metric for\nanalysis should be the total elapsed time for the query, not the\nduration of its individual phases.\u003C/p\u003E\n\u003C/li\u003E\u003C/ul\u003E\n","\u003Ch3\u003EDefine your measurement cadence\u003C/h3\u003E\n","\u003Ch4\u003EOverview\u003C/h4\u003E\n","\u003Cp\u003EWhile there are often specific motivations for measuring performance,\nsuch as investigating a reported issue, establishing a regular cadence\nfor performance measurement is a critical practice. Even basic\nmeasurements, like recording a timestamp and query ID, become more\nvaluable when collected as part of a structured approach.\u003C/p\u003E\n","\u003Cp\u003E\u003Cstrong\u003EDesired Outcome\u003C/strong\u003E\u003C/p\u003E\n","\u003Cp\u003EA well-defined cadence for performance measurement allows for the\nfocused allocation of time and effort, ensuring that performance\nanalysis is conducted when it is most impactful.\u003C/p\u003E\n","\u003Ch4\u003ERecommendations\u003C/h4\u003E\n","\u003Cp\u003EPerformance should be measured at several key moments to ensure a\ncomprehensive understanding of the system's behavior. The following\ncatalysts and cadences are recommended:\u003C/p\u003E\n\u003Cul\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003EEstablish a baseline:\u003C/strong\u003E A performance baseline provides a reference\npoint for all future comparisons. Without a baseline, it is difficult\nto objectively determine if performance has degraded, or to quantify\nthe severity of a performance issue. A defined measurement\nmethodology, combined with a baseline, allows for a straightforward\ncomparison to identify and assess performance problems.\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003EBefore and after significant changes\u003C/strong\u003E: It is important to validate\nor re-establish a performance baseline before any significant change,\nsuch as an application upgrade, a data model alteration, or a\nsubstantial data change. This ensures a recent and valid point of\ncomparison. Following the change, performance should be measured again\nto assess the impact and to establish a new baseline for future\nanalysis.\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003ETesting potential changes:\u003C/strong\u003E Snowflake's table cloning capabilities\nprovide an efficient and cost-effective way to test the impact of\npotential changes. This is particularly useful for regression testing,\nwhere the goal is to determine if a change will negatively affect\nperformance before it is implemented in production.\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003EOn a periodic interval:\u003C/strong\u003E Regular performance checks are valuable\neven in the absence of known issues. Periodic measurement can help\nidentify gradual performance degradation caused by changes in data or\nother subtle factors within an application or pipeline. For workloads\nwith annual peak periods, it may be beneficial to retain performance\ndata, such as that found in QUERY_HISTORY, for longer than the\nstandard retention period to allow for year-over-year comparisons.\u003C/p\u003E\n\u003C/li\u003E\u003C/ul\u003E\n","\u003Ch3\u003EIdentifying bottlenecks\u003C/h3\u003E\n","\u003Ch4\u003EOverview\u003C/h4\u003E\n","\u003Cp\u003EIdentifying performance bottlenecks is a critical step in any\noptimization process. To ensure that time and resources are used\neffectively, it is essential to focus on the parts of a query or\nworkload where improvements will have the most significant impact on\noverall performance metrics.\u003C/p\u003E\n","\u003Ch4\u003ERecommendations\u003C/h4\u003E\n","\u003Cp\u003EA multi-faceted approach is recommended for identifying performance\nbottlenecks. It's best to begin with a holistic understanding of the\napplication's context to focus optimization efforts where they will have\nthe most impact. Analysis can then be performed at two levels using\nSnowflake's native tools.\u003C/p\u003E\n","\u003Ch4\u003ETools for query-level analysis\u003C/h4\u003E\n","\u003Cp\u003EFor granular analysis of individual queries, several tools provide\ndetailed insights into the execution plan and performance\ncharacteristics.\u003C/p\u003E\n\u003Cul\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003EQuery profile:\u003C/strong\u003E The &lt;span class=&quot;mark&quot;&gt;query profile&lt;/span&gt; offers\na detailed visual representation of a query's execution. It is the\nprimary tool for identifying common issues such as poor\nmicro-partition pruning, join explosions, remote spilling, and the\nspecific operators consuming the most resources. The profile displays\nactual execution statistics after a query has completed (or a partial\nview while it is running) but is not accessible programmatically. Data\nis available for 14 days.\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003EGET_QUERY_OPERATOR_STATS():\u003C/strong\u003E For programmatic access to the data\nfound in the query profile, use the\n\u003Ca href=\"https://docs.snowflake.com/en/sql-reference/functions/get_query_operator_stats\"\u003E&lt;span class=&quot;mark&quot;&gt;&lt;u&gt;GET_QUERY_OPERATOR_STATS()&lt;/u&gt;&lt;/span&gt;\u003C/a\u003E\nfunction. This table function returns detailed, operator-level\nstatistics in a structured format, making it ideal for automated\nanalysis or for capturing performance data for long-term storage and\ncomparison.\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003EEXPLAIN:\u003C/strong\u003E The\n\u003Ca href=\"https://docs.snowflake.com/en/sql-reference/sql/explain\"\u003E&lt;u&gt;EXPLAIN&lt;/u&gt;\u003C/a\u003E\ncommand provides a look at a query's logical execution plan \u003Cem\u003Ebefore\u003C/em\u003E\nit runs. It is useful for understanding the optimizer's choices but\nshould be treated as an estimate, as it does not contain the actual\nrun-time statistics available in the query profile.\u003C/p\u003E\n\u003C/li\u003E\u003C/ul\u003E\n","\u003Ch4\u003ETools for workload-level analysis\u003C/h4\u003E\n","\u003Cp\u003EAnalyzing performance across an entire workload requires a broader\nperspective. The following ACCOUNT_USAGE views are invaluable for\nidentifying trends and high-impact queries.\u003C/p\u003E\n\u003Cul\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003EQUERY_HISTORY:\u003C/strong\u003E The \u003Ca href=\"https://docs.snowflake.com/en/sql-reference/account-usage/query_history\"\u003E&lt;u&gt;QUERY_HISTORY&lt;/u&gt;\n&lt;u&gt;view&lt;/u&gt;\u003C/a\u003E\nis the foundational tool for workload analysis. It contains a\ncomprehensive record of executed queries, allowing for the\nidentification of performance patterns. It is particularly useful for:\u003C/p\u003E\n\u003Cul\u003E\u003Cli\u003E\n","\u003Cp\u003EFinding queries with specific characteristics, such as long queue\ntimes (queued_overload_time).\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003EComparing workload performance against a baseline, especially when\nusing query tags for easy filtering.\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003EAggregating metrics for queries that have the same structure but\ndifferent literal values, using the query_parameterized_hash.\u003C/p\u003E\n\u003C/li\u003E\u003C/ul\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003ESpecialized views:\u003C/strong\u003E\u003C/p\u003E\n\u003Cul\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Ca href=\"https://docs.snowflake.com/en/sql-reference/account-usage/aggregate_query_history\"\u003E&lt;u&gt;AGGERGATE_QUERY_HISTORY&lt;/u&gt;\u003C/a\u003E:\nThis view is comparable to QUERY_HISTORY when using hybrid tables.\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Ca href=\"https://docs.snowflake.com/en/sql-reference/account-usage/query_attribution_history\"\u003E&lt;u&gt;QUERY_ATTRIBUTION_HISTORY&lt;/u&gt;\u003C/a\u003E\u003Cstrong\u003E:\u003C/strong\u003E\nThis view is designed to provide a more accurate picture of the\ncompute cost of a query, taking concurrency into account. It is\nexcellent when the primary concern is attributing costs to specific\nqueries or workloads.\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Ca href=\"https://docs.snowflake.com/en/sql-reference/account-usage/query_insights\"\u003E&lt;u&gt;QUERY_INSIGHTS&lt;/u&gt;\u003C/a\u003E\u003Cstrong\u003E:\u003C/strong\u003E\nThis view proactively identifies queries that match known\nperformance anti-patterns. It can help pinpoint queries to\ninvestigate, but it is important to note that not every insight\nrequires immediate action. See \u003Ca href=\"https://docs.snowflake.com/en/user-guide/query-insights\"\u003E&lt;u&gt;the documentation for details on\nthe types of insights currently available and what they\nmean&lt;/u&gt;\u003C/a\u003E.\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Ca href=\"https://docs.snowflake.com/sql-reference/account-usage/table_query_pruning_history\"\u003E&lt;u&gt;TABLE_QUERY_PRUNING_HISTORY&lt;/u&gt;\u003C/a\u003E\nand\n\u003Ca href=\"https://docs.snowflake.com/sql-reference/account-usage/table_query_pruning_history\"\u003E&lt;u&gt;COLUMN_QUERY_PRUNING_HISTORY&lt;/u&gt;\u003C/a\u003E\u003Cstrong\u003E:\u003C/strong\u003E\nThese views provide targeted data on micro-partition pruning\neffectiveness. Analyzing this data can help identify tables that may\nbenefit from a clustering key. See \u003Ca href=\"https://medium.com/snowflake/supercharging-snowflake-pruning-using-new-account-usage-views-52530b24bf2e\"\u003E&lt;u&gt;Tim Sander&rsquo;s article on using\nthe pruning history\nviews&lt;/u&gt;\u003C/a\u003E\nfor more information.\u003C/p\u003E\n\u003C/li\u003E\u003C/ul\u003E\n\u003C/li\u003E\u003C/ul\u003E\n","\u003Ch3\u003EMeticulously validating AI suggestions\u003C/h3\u003E\n","\u003Ch4\u003EOverview\u003C/h4\u003E\n","\u003Cp\u003EAI can be a source of suggestions for performance improvement. However,\nall suggestions require critical evaluation and comprehensive testing\nbefore implementation. An unverified recommendation can waste time and\ncredits or even degrade performance.\u003C/p\u003E\n","\u003Ch4\u003ERecommendations\u003C/h4\u003E\n\u003Cul\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003EApply foundational knowledge\u003C/strong\u003E Evaluate AI suggestions against a\nfoundational understanding of the Snowflake platform. For complex or\ncostly recommendations, consult the Snowflake documentation, conduct\nfurther research, or engage with Snowflake staff like Sales Engineers,\nSolutions Architects, and if appropriate, Technical Support.\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003EConsider data timeliness\u003C/strong\u003E AI training data can be months or years\nold, failing to reflect Snowflake's rapid evolution. A suggestion\nmight be correct based on old information but suboptimal given new\nfeatures.\u003C/p\u003E\n\u003C/li\u003E\u003Cli\u003E\n","\u003Cp\u003E\u003Cstrong\u003ETest thoroughly\u003C/strong\u003E Performance improvements involve time and cost.\nThoroughly test all suggestions in a controlled environment to verify\nthey meet business requirements. Proper validation prevents unexpected\nissues, saving resources and improving outcomes.\u003C/p\u003E\n\u003C/li\u003E\u003C/ul\u003E\n","\u003Ch2\u003EConclusion\u003C/h2\u003E\n","\u003Cp\u003EA strong understanding of the Snowflake platform provides the necessary\ncontext to assess whether an AI suggestion warrants further\ninvestigation and testing.\u003C/p\u003E\n","\u003Cp\u003EFor additional information, see \u003Ca href=\"https://docs.snowflake.com/en/guides-overview-performance\"\u003E&lt;u&gt;Optimizing performance in\nSnowflake&lt;/u&gt;\u003C/a\u003E\u003C/p\u003E"],"description":"","title":"Performance","isDeveloperGuidesPage":false,":type":"snowflake-site/components/contentfragment","elements":{"quickstartArticleBody":{"dataType":"string","title":"Quickstart Article Body","value":"## Overview\n\nOptimizing performance on Snowflake is crucial for efficient data\nanalysis. This guidance, for data architects, developers, and\nadministrators, outlines best practices for designing, implementing, and\nmaintaining data workloads.\n\nApplying these recommendations streamlines operations, enhances user\nexperience, and improves business value through increased revenue and\nreduced costs. For instance, faster query execution translates to\nquicker insights and greater adoption.\n\nPerformance tuning often balances performance and cost, with\nimprovements frequently benefiting both. Snowflake's autoscaling\ncapabilities, for example, ensure consistent performance by dynamically\nallocating resources as concurrency increases, while also providing cost\nefficiency by scaling down during lower demand.\n\n## Principles and recommendations\n### Principles\n\n#### Establish and validate performance objectives\n\n\u003E Define clear, measurable, and achievable performance targets within\n\u003E technical and budgetary limits before application design. Consider key\n\u003E workload characteristics.\n\n#### Optimize data architecture and access\n\n\u003E Design efficient data models and access patterns to minimize data\n\u003E scanned. Leverage appropriate data types, clustering, indexing, and\n\u003E performance features.\n\n#### Architect for scalability and workload partitioning\n\n\u003E Utilize Snowflake’s elastic warehouse features and application design\n\u003E to strategically partition workloads, optimizing resource utilization,\n\u003E concurrency, and latency.\n\n#### Implement continuous performance monitoring and optimization\n\n\u003E Establish comprehensive monitoring and logging to identify performance\n\u003E bottlenecks. Proactively optimize the system over time, adapting to\n\u003E evolving requirements.\n\n### Recommendations\n\nThe following key recommendations are covered within the principles of\nPerformance:\n\n- **Leveraging Elasticity**\n  Dynamically adjust resources based on workload. Utilize horizontal\n  scaling (multi-cluster warehouses) and vertical sizing to match query\n  complexity. Employ manual scaling for predictable peaks and\n  auto-scaling for real-time fluctuations.\n\n- **Peak Load Planning**\n  Proactively plan for high-demand periods. Use manual scaling for\n  predictable surges; enable auto-scaling and predictive scaling for\n  less predictable demand.\n\n- **Continuous Performance Improvement**\n  Monitor key performance indicators like latency, throughput, and\n  utilization. Foster continuous tuning through training, feedback, and\n  metric review.\n\n- **Test-First Design**\n  Integrate performance testing into the design phase. Define KPIs,\n  establish baselines, and simulate workloads early. Use load,\n  scalability, and stress testing throughout development to prevent\n  bottlenecks.\n\n- **Effective Data Shaping**\n  Leverage Snowflake micro-partition clustering. Define clustering keys\n  for frequently filtered/joined columns to enable efficient pruning and\n  reduce I/O. Regularly monitor clustering depth.\n\n- **Well-Designed SQL**\n  Write efficient queries by avoiding `SELECT \\*`, specifying needed\n  columns, and using efficient joins. Use query profiling tools to\n  refine performance and minimize resource consumption.\n\n- **Optimizing Warehouses**\n  Reduce queues and spillage, scale appropriately, and use query\n  acceleration. Right-size warehouses and manage concurrency to reduce\n  contention and optimize resource use.\n\n- **Optimizing Storage**\n  Use automatic clustering, Search Optimization Service, and\n  materialized views strategically. Match the technique to your\n  workload.\n\n- **High-Level Practices**\n  To optimize query performance, select fewer columns, leverage query\n  pruning with clustered columns, and use pre-aggregated tables.\n  Simplify SQL by reducing unnecessary sorts, preferring window\n  functions, and avoiding OR conditions in joins. Minimize view\n  complexity, maximize cache usage, scale warehouses, and tune cluster\n  scaling policies for balanced performance and cost.\n\n \n\n## Establish and validate performance objectives\n\n### Overview\n\nSnowflake optimizes performance through its Performance by Design\nmethodology, integrating performance as a core architectural feature.\nThis approach links business objectives with efficient resource\nmanagement, leveraging key principles, careful configurations, and\nSnowflake's elasticity for scalability and cost-efficiency.\n\n#### Desired outcome\n\nBy implementing these best practices, you can achieve a highly\nresponsive and cost-optimized Snowflake environment. Expect predictable\nquery performance that consistently meets Service Level Objectives\n(SLOs), eliminate costly architectural debt, and effectively manage\noperational expenses by aligning compute resources with workload\ndemands. Ultimately, businesses can claim a well-architected data\nplatform that supports their needs without unnecessary expenditure.\n\n#### Recommendations\n\nPerformance is a core, cost-driven feature. Prioritize \"as fast as\nnecessary\" over \"as fast as possible\" to prevent over-provisioning.\nDefine performance (latency, throughput, concurrency) as a negotiable\nbusiness metric requiring cost-benefit analysis, as it directly impacts\nSnowflake's operational expenses through credit consumption.\nUnderstanding cloud architecture's continuous financial implications is\ncrucial. Performance planning from the start is essential to avoid\ninefficiencies, poor user experience, and costly re-engineering.\n\n### Performance by Design\n\nAchieve a high-performing Snowflake environment by implementing a\ndeliberate strategy before coding. The Performance by Design methodology\nensures performance is a core architectural feature from a project's\nstart, aligning business objectives, user experience, and financial\ngovernance. Proactive decisions establish an efficiently scalable\nfoundation, preventing expensive architectural debt.\n\n**Performance as a feature**\n\nPrior to solution design, it is imperative to internalize a key\nprinciple of cloud computing: every performance requirement entails a\ndirect and quantifiable cost. The paradigm shift from \"maximize speed\"\nto \"achieve necessary speed\" represents the initial stride toward a\nmeticulously architected system.\n\n**Performance as a negotiable business metric**\n\nPerformance, latency, and concurrency are more than fixed technical\nspecs; they're business requirements that need to be defined and\njustified like any other product feature. If someone asks for a\n\"five-second query response time,\" that should invite a discussion about\nvalue and cost, not be treated as an absolute must-have. Different\nworkloads have different performance needs, and a one-size-fits-all\napproach leads to overspending and wasted resources.\n\n**The Cloud Paradigm: From capital to operational expense**\n\nIn a traditional on-premises setup, performance often hinges on\nsignificant upfront spending for hardware. Once purchased, the cost to\nrun each query is very low. The cloud, however, uses a completely\ndifferent financial model. With Snowflake, performance is an ongoing\noperational cost. Every active virtual warehouse uses credits, meaning\nthat your architectural and query design decisions have immediate and\ncontinuous financial consequences.\n\n**Avoiding architectural debt: The cost of unplanned implementation**\n\nSnowflake's inherent simplicity can lead to solutions implemented\nwithout adequate upfront planning, fostering architectural debt. This\ndebt manifests as excessive credit consumption from inefficient queries,\nsuboptimal user experience due to unpredictable performance, and\nexpensive re-engineering projects. To avoid these issues, establish\nclear project plans and formalize performance metrics from the outset,\nensuring optimal system health and cost efficiency.\n\n#### The Core Process: The Design Document\n\nTo translate principle into practice, any significant data project\nshould begin with a design document. This is not just a technical\ndocument, but a formal agreement that forces critical trade-off\nconversations to happen at the project's inception.\n\n**Assembling the Stakeholders: A Cross-Functional Responsibility**\n\nCreating a design document is a collaborative effort. It ensures that\nbusiness goals are accurately translated into technical and financial\nrealities. The key participants include:\n\n- Business Stakeholders: To define the goals and the value of the\n  desired outcomes.\n\n- Product Managers: To translate business needs into specific features\n  and user stories.\n\n- Engineering Leads: To evaluate technical feasibility and design the\n  architecture.\n\n- FinOps/Finance: To provide budget oversight and model the cost\n  implications of different service levels.\n\n**Service Level Objectives (SLOs)**\n\nService Level Objectives (SLOs) are essential for optimizing\nperformance. They establish measurable and acceptable performance\nbenchmarks for a system or service. By continuously monitoring and\nevaluating against these concrete targets, organizations can ensure\ntheir services consistently fulfill both user expectations and business\nneeds.\n\nEffective SLOs should be:\n\n- **Specific:** Avoid vague goals. Define precise targets, such as \"95%\n  of interactive dashboard queries under 10 seconds,\" to allow for\n  accurate measurement.\n\n- **Measurable:** Establish clear metrics and the tools for data\n  collection and analysis. For example, to measure \"nightly ETL of 1TB\n  in under 60 minutes,\" systems must track data volume and processing\n  time.\n\n- **Achievable:** Set realistic and attainable targets given current\n  resources and technology, to avoid excessive costs without business\n  value.\n\n- **Relevant:** Align SLOs with business needs and end-user\n  expectations, focusing on critical user experience or business\n  processes.\n\n- **Time-bound:** Many SLOs benefit from a defined timeframe, aiding in\n  performance evaluation over a specific period.\n\nDefining and monitoring SLOs helps organizations proactively identify\nand address performance bottlenecks, ensuring consistent service\nquality, enhanced user satisfaction, and better business outcomes.\nRegular review and adjustment of SLOs are crucial to adapt to evolving\nbusiness needs and technological advancements.\n\n#### Defining the four pillars of workload requirements\n\nDefine a workload’s performance profile using these four key pillars:\n\n- **Workload Categorization**: Not all work is the same. The first step\n  is to classify each workload based on its usage pattern and\n  performance characteristics. Common categories include:\n\n  - **Interactive:** User-facing queries, typically from dashboards\n    (e.g., Tableau, Power BI, Looker), where low latency and high\n    concurrency are critical for a good user experience.\n\n  - **Ad-Hoc/Exploratory:** Queries from data scientists or analysts\n    that are often complex, unpredictable, and long-running. Latency is\n    less critical than preventing impact on other workloads.\n\n  - **Batch:** Scheduled, large-scale data processing jobs like ELT/ETL\n    pipelines. Throughput and predictability are the primary goals.\n\n  - **Programmatic:** Automated queries from applications or services\n    that often have highly predictable patterns and strict performance\n    requirements.\n\n- **Workload Performance Targets**: For each category, establish\n  specific, measurable, and realistic performance targets. Avoid overly\n  general goals, such as \"all queries must return in 10 seconds,\" in\n  favor of concrete objectives.\n\n  - **Latency Example:** \"95% of all interactive dashboard filter\n    queries must complete in under 10 seconds.\"\n\n  - **Throughput Example:** \"The nightly ETL process must load and\n    transform 1 TB of data in under 60 minutes.\"\n\n- **Data Freshness Tiers:** The demand for real-time data must be\n  balanced against its often higher cost. Define explicit data freshness\n  tiers to align business value with architectural complexity and credit\n  consumption.\n\n  - **Near Real-Time (Seconds to Minutes):** Highest cost; requires a\n    streaming architecture (e.g., Snowpipe, Dynamic Tables). Justified\n    for use cases like fraud detection, real-time ad selection, etc.\n\n  - **Hourly:** Medium cost; suitable for operational reporting.\n\n  - **Daily:** Lowest cost; standard for most strategic business\n    intelligence and analytics.\n\n- **Concurrency and Scale Projections:** Plan for the expected load and\n  future growth to inform warehouse sizing and scaling strategies.\n  Examples of key questions to answer include:\n\n  - How many users are expected to use this system simultaneously during\n    peak hours?\n\n  - What is the anticipated data volume growth over the next 6-12\n    months?\n\n  - Are there predictable spikes in usage (e.g., end-of-quarter\n    reporting, Black Friday)?\n\n**Integrating performance into the development lifecycle**\n\nValidate agreements from the design phase throughout development.\nProactive performance testing, a \"shift-left\" methodology, mitigates\nproject risks and prevents launch-time performance issues.\n\nDo not await large-scale data for performance analysis. Early on, review\nquery profiles and EXPLAIN plans to identify potential problems like\nexploding joins (join with a missing or incorrect condition, causing a\nmassive, unintended multiplication of rows) or full table scans, which\nindicate ineffective query pruning.\n\n#### Mandatory pre-release benchmarking\n\nBefore deploying a new workload to production, benchmark it as a formal\nquality gate. This involves running it on a production-sized data clone\nin a staging environment to validate that it meets the Workload\nRequirements Agreement's SLOs.\n\nFor critical workloads, integrate performance benchmarks into the CI/CD\npipeline. This practice automatically detects performance regressions\nfrom code changes, allowing for immediate fixes rather than user\ndiscovery in production.\n\n### Common design shortcomings to avoid\n\nFailing to implement a Performance by Design methodology often leads to\none of the following common and costly mistakes.\n\n**Applying a single, aggressive SLA universally**\n\nApplying a single, aggressive performance target (e.g., \"all queries\nunder 5 seconds\") to every workload leads to inefficiencies. This forces\nad-hoc analysis, outlier queries, and interactive dashboards to share\nthe same expensive configuration, increasing credit usage unnecessarily.\n\n**Disregarding the cost of data freshness**\n\nAn unexamined data latency requirement, such as \"data must be 1 minute\nfresh,\" can significantly increase credit consumption. Often, data\nfreshness exceeds actual needs without fully discussing associated\ncosts. This can lead to paying a high price for a streaming architecture\nthat may not deliver proportional business value.\n\n**Performance discrepancies at deployment**\n\nDeferring performance testing until a project's end results in\nunacceptably slow or expensive processes discovered just before launch.\nThis often leads to emergency fixes, missed deadlines, and the\nbrute-force solution of running workloads on oversized warehouses. This\nobscures underlying design flaws at a significant ongoing cost.\n\n## Foundational First Steps\n\n#### Performance in the cloud\n\nIn an on-premises environment, performance is often a sunk cost. The\ncloud, particularly Snowflake, links performance and cost optimization.\nEvery query, active virtual warehouse, and background service consumes\ncredits, making performance an ongoing operational consideration.\n\nThis guide focuses on initial steps to build a performant, scalable, and\ncost-effective environment. Make conscious performance and cost\ndecisions before significant development to establish a solid\narchitectural foundation, preventing costly re-engineering.\n\n#### Establish and validate performance objectives\n\nEffective performance objectives are specific, measurable, and\nrealistic. They serve as the benchmark against which you can measure the\nsuccess of your architecture. When defining your targets, you should\nfocus on key metrics that directly impact your workloads.\n\nConsider the following core performance characteristics:\n\n- **Latency**: Ensure queries complete quickly for interactive\n  applications. For example, 95% of dashboard filter queries should\n  complete in under 10 seconds.\n\n- **Throughput**: Measure the work your system accomplishes over time,\n  vital for batch processing and data ingestion. For instance, the\n  nightly ETL process must load and transform 1 TB in under 60 minutes.\n\n- **Concurrency**: Determine how many simultaneous queries your system\n  supports without performance issues, crucial for applications with\n  numerous users. The primary BI warehouse should support 200 concurrent\n  users during peak hours without query queuing.\n\nThese objectives must be aligned with specific workload characteristics\nand balanced against the real-world business and budget constraints of\nyour project. They are established for a specific workload and rarely\napply across all workloads.\n\n### Tactical Day One configurations & concepts\n\nOnce you have a strategic plan, you can implement tactical\nconfigurations that set a baseline for good performance and cost\nmanagement.\n\n#### Proactive guardrails\n\nOptimizing warehouse performance involves strategic configuration. These\nsettings are your first line of defense against runaway queries and\nunexpected costs.\n\n- An effective **Warehouse auto-suspend strategy** balances credit\n  savings and performance. Suspended warehouses consume no credits but\n  lose their data cache, leading to slower subsequent queries. Tailor\n  the strategy to your workload:\n\n- **ELT/ETL warehouses:** Use an aggressive suspend time (e.g., 1-2\n  minutes). These jobs are typically bursty, making it inefficient to\n  keep the warehouse running after completion.\n\n- **BI/dashboard warehouses:** Employ a more lenient suspend time (e.g.,\n  10-20 minutes). The performance benefit of a warm cache for\n  latency-sensitive users often outweighs the cost of brief idle\n  periods.\n\n- **Setting statement timeouts** is crucial to prevent long-running,\n  costly queries. The default timeout (48 hours) is often too long.\n  Configure the\n  [\u003Cu\u003ESTATEMENT_TIMEOUT_IN_SECONDS\u003C/u\u003E](https://docs.snowflake.com/en/sql-reference/parameters#statement-timeout-in-seconds)\n  parameter on your warehouses to a sensible maximum, such as 15 minutes\n  for a dashboard warehouse or 8 hours for a complex ETL warehouse.\n\n- **Configuring Resource Monitors** provides a safety net for budget\n  control. These monitors track warehouse credit consumption and can\n  trigger actions like notifications or automatic suspension when\n  thresholds are exceeded. It's best practice to set up monitors at both\n  the account and individual warehouse levels. Refer to [\u003Cu\u003EWorking with\n  resource monitors in the Snowflake\n  documentation\u003C/u\u003E](https://docs.snowflake.com/en/user-guide/resource-monitors)\n  for more information.\n\n- **Budgets** offer a flexible way to monitor and control spending\n  across your Snowflake account. They track credit usage for\n  customizable objects, including warehouses and serverless features.\n  Budgets can alert stakeholders when projected costs approach or exceed\n  predefined limits, enabling a proactive approach to managing overall\n  spend. See [\u003Cu\u003EMonitor credit usage with budgets in the Snowflake\n  documentation\u003C/u\u003E](https://docs.snowflake.com/en/user-guide/budgets)\n  for details.\n\n#### Fundamental architectural concepts\n\n- **Scale up for complexity:** Increase warehouse size (e.g., from\n  Medium to Large) to improve a single, large, or complex query's\n  performance. A larger warehouse provides more resources—memory, CPU,\n  and temporary storage—to complete the work faster.\n\n- **Scale out for concurrency:** For a higher number of concurrent users\n  and queries, increase the number of clusters in a multi-cluster\n  warehouse. This doesn't make individual queries faster but allows more\n  to run simultaneously without performance bottlenecks.\n\n#### Using the right tool for the job (targeted acceleration)\n\nSnowflake offers several powerful features that accelerate performance\nfor specific use cases. Using them correctly is key.\n\n- **Search Optimization Service** This service accelerates point-lookup\n  queries on large tables. It creates a lightweight search access path,\n  allowing Snowflake to pinpoint data in micro-partitions and bypass\n  full table scans. It's most effective on high-cardinality columns like\n  UUIDs or email addresses. See [\u003Cu\u003EThe Expat Guide to Search\n  Optimization\n  Service\u003C/u\u003E](https://medium.com/snowflake/search-optimization-c99b2117cb2e).\n\n- **Materialized Views (MVs)** MVs are for massive-scale problems, not\n  general tuning. Consider them only when data reduction from the base\n  table is substantial, such as for pre-calculating large dashboard\n  aggregations or optimizing multi-billion row tables. MVs incur\n  continuous storage and compute costs for maintenance, which must be\n  justified by performance gains. See [\u003Cu\u003EWorking with Materialized\n  Views in the Snowflake\n  documentation\u003C/u\u003E](https://docs.snowflake.com/en/user-guide/views-materialized).\n\n- **Query Acceleration Service (QAS)** QAS acts as a safety net for your\n  warehouse, handling outlier queries with unexpectedly large scans. It\n  offloads parts of this work to shared Snowflake compute resources,\n  preventing large queries from monopolizing your warehouse and\n  impacting other users. QAS is not a primary tuning tool, but it\n  improves warehouse stability. See [\u003Cu\u003EUsing the Query Acceleration\n  Service (QAS) in the Snowflake\n  documentation\u003C/u\u003E](https://docs.snowflake.com/en/user-guide/query-acceleration-service).\n\n#### Modern data transformation\n\nDynamic Tables offer declarative data transformation. When designing\nthem, simplicity is key. Performance depends on the query and a hidden\nChange Data Capture (CDC) process checking source tables. Complex\nqueries with many joins create intricate CDC dependency graphs, slowing\nrefresh times. Chaining simpler Dynamic Tables is often more performant\nand manageable than a single, complex one. For more information, see\n[\u003Cu\u003EDynamic tables in the Snowflake\ndocumentation\u003C/u\u003E](https://docs.snowflake.com/en/user-guide/dynamic-tables-about).\n\n### Conclusion\n\nA high-performing Snowflake environment starts on day one. By moving\nfrom strategic planning to tactical configurations, you establish a\nrobust framework. These initial steps—defining objectives, configuring\nguardrails, and using the right tools—are essential for building a\nperformant, scalable, and cost-effective architecture in the Snowflake\nData Cloud.\n\n## Leveraging elasticity for performance\n\n#### The power of elastic compute\n\nSnowflake’s architecture separates storage and compute, enabling\nindependent and dynamic scaling. This ensures the precise processing\npower needed for your workloads. Leveraging this elasticity is crucial\nfor a well-architected Snowflake environment.\n\nThe goal is optimal price-for-performance, avoiding both\nunder-provisioning (slow queries, missed SLOs) and over-provisioning\n(unnecessary credit consumption).\n\nThis guide details three primary elasticity mechanisms. Understanding\nhow and when to use each helps build a responsive, efficient, and\ncost-effective data platform. The three mechanisms are:\n\n- **Vertical Scaling:** Adjusting the size of a warehouse (for example\n  from Medium to Large) to handle more complex queries and larger data\n  volumes.\n\n- **Horizontal Scaling:** Adjusting the number of clusters in a\n  warehouse to manage workload concurrency.\n\n- **Query Acceleration Service:** Augmenting a warehouse with serverless\n  resources to handle unpredictable, outlier queries.\n\n#### Isolate your workloads\n\nBefore applying any scaling strategy, you must first isolate your\nworkloads. A common performance anti-pattern is to direct all users and\nprocesses to a single, large virtual warehouse. This approach makes it\nimpossible to apply the correct scaling strategy, as the warehouse is\nforced to handle workloads with conflicting performance profiles.\n\nA fundamental best practice is to create separate, dedicated warehouses\nfor distinct workloads. For example, your architecture should include\ndifferent warehouses for:\n\n- **ETL/ELT:** These workloads are often characterized by complex,\n  long-running transformations that benefit from larger warehouses but\n  may not require high concurrency.\n\n- **BI Dashboards:** These workloads typically involve many concurrent,\n  short-running, repetitive queries. They demand low latency and benefit\n  from horizontal scaling.\n\n- **Data Science:** These workloads can be highly variable, often\n  involving exploratory analysis and long-running model training that\n  require specific sizing and timeouts.\n\n- **Ad-Hoc Analysis:** These queries from data analysts are often\n  unpredictable in both complexity and concurrency.\n\nBy isolating workloads, you can observe the specific performance profile\nof each and apply the most appropriate and cost-effective scaling\nstrategy described below.\n\n### Vertical scaling: sizing up for complexity and scale\n\nVertical scaling, or resizing, modifies a warehouse's compute power.\nSnowflake warehouses, offered in \"t-shirt sizes\" (X-Small, Small,\nMedium, etc.), double compute resources—CPU, memory, and local disk\ncache—with each size increase.\n\nConsider scaling up when a single query or complex operations demand\nmore resources than the current warehouse size can efficiently provide.\nA larger warehouse can accelerate complex queries by parallelizing work\nacross more nodes. However, increasing warehouse size is not a universal\nsolution for slow queries; diagnose the performance bottleneck first.\n\n#### When to scale up: A diagnostic checklist\n\nBefore increasing a warehouse’s size, use the following checklist to\nvalidate that it is the appropriate solution.\n\n**Symptom 1: Disk spilling**\n\nSpilling occurs when a query’s intermediate results exceed a warehouse’s\navailable memory and must be written to disk. This is a primary\nindicator of an undersized warehouse. You can identify spilling in the\nQuery Profile. There are two types of spilling, each with a different\nlevel of severity:\n\n- **Local Spilling:** This indicates a **warning**. Data is written from\n  memory to the warehouse’s local disk, impacting query performance.\n  Evaluate local spilling within your workload's SLA and the\n  spill-to-RAM ratio. For instance, if 1 TB of data is processed in\n  memory with 10 GB spilled, the impact might be minor. However, if 20\n  GB is processed with 10 GB spilled, the warehouse is likely\n  undersized.\n\n- **Remote Spilling:** This is a **critical alert**. Data has exhausted\n  both memory and local disk, spilling to remote cloud storage. This\n  severely degrades performance. Queries exhibiting significant remote\n  spilling are strong candidates for a larger warehouse.\n\n**Symptom 2: Slow, CPU-bound queries (non-spilling)**\n\nSometimes a query is slow even without spilling significant data. This\noften indicates that the query is CPU-bound and could benefit from the\nadditional processing power of a larger warehouse. However, before\nresizing, you must first verify that the query can actually take\nadvantage of the added resources.\n\n- **Prerequisite 1: Verify Sufficient Parallelism Potential.** A query’s\n  parallelism is limited by the number of micro-partitions it scans. If\n  there are not enough partitions, additional nodes in a larger\n  warehouse will sit idle. As a rule of thumb, a query should scan at\n  least **~40 micro-partitions per node** in the warehouse for a size\n  increase to be effective. You can find the number of partitions\n  scanned in the Table Scan operator within the Query Profile.\n\n- **Prerequisite 2: Verify a Lack of Execution Skew.** Performance\n  issues can also arise from data skew, where most of the processing is\n  forced onto a single node. In the [\u003Cu\u003EQuery\n  Profile\u003C/u\u003E](https://docs.google.com/document/d/1LDeFasziRlYL1Z5t9BqJ_MwhECtJHbRDKG5BNWUAuwU/edit?tab=t.lhzra61et1j6),\n  check the per-node execution time. If one node is active for\n  significantly longer than its peers, the problem lies in the data\n  distribution or query structure, not the warehouse size. Sizing up\n  will not solve this problem.\n\nOnly after confirming that a query has sufficient parallelism potential\nand is not suffering from execution skew should you test it on a larger\nwarehouse to address a CPU bottleneck.\n\nSee [\u003Cu\u003EIncreasing warehouse size in the Snowflake\ndocumentation\u003C/u\u003E](https://docs.snowflake.com/en/user-guide/performance-query-warehouse-size)\nfor more information.\n\n#### Reference Table: Warehouse sizing for parallelism\n\nUse the following table to determine the minimum number of\nmicro-partitions a query should scan to effectively utilize a given\nwarehouse size.\n\n| **Warehouse Size** | **Minimum Micro-partitions Scanned** |\n|---|---|\n| X-Small | 40 |\n| Small | 80 |\n| Medium | 160 |\n| Large | 320 |\n| X-Large | 640 |\n| 2X-Large | 1,280 |\n| 3X-Large | 2,560 |\n| 4X-Large | 5,120 | \n| 5X-Large | 10,240 |\n\n\n### Horizontal scaling: scaling out for concurrency\n\nHorizontal scaling increases the number of compute clusters available to\nyour warehouse. This is the primary tool for managing high\nconcurrency—that is, a high volume of simultaneous queries. When you\nconfigure a multi-cluster warehouse, Snowflake automatically adds and\nremoves clusters of the same size in response to query load.\n\nThis allows your warehouse to handle fluctuating numbers of users and\nqueries without queueing. As more queries arrive, new clusters are\nstarted to run them in parallel. As the query load subsides, clusters\nare automatically suspended to save credits.\n\n#### Configuration modes\n\nYou can configure a multi-cluster warehouse to run in one of two modes:\n\n- **Auto-scale Mode:** The default and most common setting, this mode\n  automatically adjusts the number of clusters within a defined minimum\n  and maximum (e.g., 1 to 8). This is ideal for varying concurrency, as\n  Snowflake starts and stops clusters to match query load.\n\n- **Maximized Mode:** This mode continuously runs the maximum specified\n  number of clusters (e.g., 8 clusters if both minimum and maximum are\n  set to 8). It suits workloads with consistently high and predictable\n  concurrency, eliminating latency from new cluster starts.\n\n#### Tuning auto-scale with scaling policies\n\nWhen using Auto-scale mode, you can further refine its behavior by\nsetting a scaling policy. This allows you to define the warehouse’s\npriority: minimizing wait time or maximizing credit savings.\n\n- **Standard Policy (Performance-First):** This policy prioritizes a\n  fast user experience, minimizing queueing by launching new clusters if\n  a query is queued for a few seconds. It is ideal for time-sensitive,\n  user-facing workloads such as BI dashboards and analytical\n  applications.\n\n- **Economy Policy (Cost-First):** This policy prioritizes cost savings\n  by starting new clusters more conservatively. A new cluster launches\n  only if a query backlog is estimated to keep it busy for at least six\n  minutes. This makes it a good choice for non-urgent background\n  processes like ETL/ELT pipelines, where some queueing is an acceptable\n  trade-off for lower credit consumption.\n\nSee [\u003Cu\u003EMulti-cluster warehouses in the Snowflake\ndocumentation\u003C/u\u003E](https://docs.snowflake.com/en/user-guide/warehouses-multicluster)\nfor more information.\n\n### Query Acceleration Service (QAS): Handling workload volatility\n\nThe Query Acceleration Service (QAS) enhances warehouse performance by\nproviding serverless compute resources to accelerate specific, eligible\nqueries, particularly large table scans. QAS addresses **workload\nvolatility**, handling unpredictable, large \"outlier\" queries that\noccasionally burden a correctly sized warehouse. This service ensures\nsmooth performance without requiring a larger, more expensive warehouse\nfor infrequent, costly queries.\n\n#### The use case for QAS\n\nYou should consider enabling QAS for a warehouse when you observe\nqueries that fit the following profile:\n\n1.  **The query is an outlier:** The warehouse performs well for the\n    majority of its queries but struggles with a few long-running\n    queries.\n\n2.  **The query is dominated by table scans:** The performance\n    bottleneck is the part of the query reading large amounts of data.\n\n3.  **The query reduces the number of rows:** After scanning a large\n    amount of data, filters or aggregates reduce the row count\n    significantly.\n\n4.  **The estimated scan time is greater than one minute:** QAS has a\n    small startup overhead, making it ineffective for shorter queries.\n    It only provides a benefit when accelerating scan operations that\n    are estimated to take longer than 60 seconds.\n\nUsing QAS for this specific use case allows you to improve the\nperformance of a volatile workload in a highly cost-effective manner.\n\nSee [\u003Cu\u003EUsing the Query Acceleration Service (QAS) in the Snowflake\ndocumentation\u003C/u\u003E](https://docs.snowflake.com/en/user-guide/query-acceleration-service)\nfor more information on QAS\n\n### Summary: A strategic decision framework\n\nChoosing the right elasticity tool begins with understanding your\nworkload and identifying the specific performance problem you are\nfacing. Once you have isolated your workloads into dedicated warehouses,\nuse the following framework to guide your scaling strategy.\n\nStart by asking: **\"What is making my warehouse slow?\"**\n\n- **Symptom:** \"My queries are waiting in a queue because too many are\n  running at once.\"\n\n  - **Solution:** Your problem is **concurrency**. Use **Horizontal\n    Scaling** by configuring a multi-cluster warehouse. Tune the scaling\n    policy (Standard or Economy) based on the workload’s time\n    sensitivity.\n\n- **Symptom:** \"A single, complex query is taking too long to complete,\n  even when running by itself.\"\n\n  - **Solution:** Your problem is **complexity**. Use the diagnostic\n    checklist for **Vertical Scaling**. First, check for disk spilling.\n    If there is none, verify that the query has sufficient parallelism\n    potential and is not skewed before testing it on a larger warehouse.\n\n- **Symptom:** \"My warehouse is usually fast, but occasionally a single\n  huge query slows everything down.\"\n\n  - **Solution:** Your problem is **volatility**. Investigate using the\n    **Query Acceleration Service**. Verify that the outlier queries are\n    scan-heavy and meet the one-minute scan time threshold.\n\nPerformance management is not a one-time setup. It is an iterative\nprocess. You should continuously monitor your query performance and\nwarehouse utilization, using these elasticity tools to tune your\nenvironment and maintain the optimal balance between performance and\ncost.\n\n## Test-first design: Building performance into every stage\n\nA high-performing Snowflake environment stems from a deliberate\nstrategy. Performance validation is integrated into every development\nphase. This \"Test-First Design\" approach shifts performance\nconsiderations to a proactive, continuous process, preventing\narchitectural debt and ensuring efficient resource utilization. It\nsupports the Performance by Design philosophy, ensuring that defined\nService Level Objectives (SLOs) are met, validated, and sustained with\noptimal cost efficiency.\n\n### Proactive performance validation\n\nIn Snowflake's consumption model, performance cost is tied to resource\nusage. Deferring performance testing creates technical debt, as flaws\nbecome expensive to fix. This can lead to re-engineering, missed\ndeadlines, or over-provisioning compute, masking inefficiencies at\nsignificant cost.\n\nSnowflake's ease of use and elasticity can lead to an informal approach\nto performance. Vague directives like \"queries should be fast\" are\ninsufficient. Without clear, measurable, agreed-upon performance\nmetrics, designing, validating, or guaranteeing objectives is\nimpossible.\n\nProactive performance validation addresses these challenges head-on by:\n\n- **Mitigating Technical Debt:** Identifying and correcting design flaws\n  early, when they are cheapest to fix.\n\n- **Ensuring Predictable Outcomes:** Translating business expectations\n  into quantifiable performance objectives that guide design and\n  development.\n\n- **Optimizing Cost Efficiency:** Balancing performance needs with\n  resource consumption to achieve the best price-for-performance.\n\n- **Reducing Risk:** Preventing performance problems before production\n  deployment.\n\n#### Formalizing performance: KPIs, SLOs, and baselines\n\nSuccessful performance validation starts with clearly defined\nexpectations. Vague expectations cannot be tested, measured, or\noptimized. Formalize performance requirements using Key Performance\nIndicators (KPIs) and Service Level Objectives (SLOs) to establish\nbaselines for testing and operational monitoring. This process extends\nthe Workload Requirements Agreements (WRA) detailed in the Performance\nby Design guidance.\n\n**Key Performance Indicators (KPIs) for Snowflake Workloads:**\n\n- **Data Freshness (Latency):** The elapsed time from when data is\n  generated in source systems to when it is available for querying in\n  Snowflake.\n\n  - *Example SLO:* \"99% of all point-of-sale transaction data must be\n    available in the SALES_ANALYTICS table within 5 minutes of the\n    transaction occurring.\"\n\n- **Query Latency (Response Time):** The time taken for a query to\n  execute and return results to the user or application. This is often\n  expressed using percentiles to account for variability.\n\n  - *Example SLO:* \"For the EXECUTIVE_DASHBOARD_WH, P90 (90th\n    percentile) of interactive queries must complete in under 3 seconds,\n    and P99 must complete in under 5 seconds.\"\n\n- **Throughput:** The volume of data or number of operations processed\n  within a given timeframe, crucial for batch and ingestion workloads.\n\n  - *Example SLO:* \"The nightly ETL_LOAD_WH must ingest and transform 50\n    GB of raw transactional data into aggregated analytical tables\n    within 30 minutes.\"\n\n- **Concurrency:** The number of simultaneous queries or users the\n  system can support without significant performance degradation or\n  excessive queuing.\n\n  - *Example SLO:* \"The primary BI_REPORTING_WH must seamlessly support\n    100 concurrent users during peak hours (9 AM - 11 AM PST) with\n    average query queue time not exceeding 5 seconds.\"\n\n- **Cost Efficiency:** The credit consumption relative to the business\n  value or volume of work performed. This is a critical KPI for CDOs and\n  FinOps.\n\n  - *Example SLO:* \"The DAILY_REPORTING_JOB must process 1 TB of raw\n    data at a cost of no more than 100 credits per run, across all\n    associated warehouses.\"\n\n### Establishing baselines:\n\nBaselines represent the expected or target performance. For new\nprojects, these are often derived from:\n\n- **Design document:** The formally agreed-upon SLOs become the initial\n  target baselines.\n\n- **Synthetic data & Proof-of-Concept (PoC):** Early tests with\n  representative, scaled-down data can provide initial estimates.\n\n- **Historical data:** For migrations, existing system performance can\n  inform baselines, with adjustments for Snowflake's capabilities.\n\n- **Industry benchmarks:** Comparisons with similar workloads in\n  comparable environments.\n\nThese formalized metrics transform abstract goals into concrete,\ntestable objectives, laying the groundwork for effective performance\nvalidation.\n\n#### Shifting left: Integrating performance testing into design & development\n\nThe shift-left principle for performance involves embedding testing\nactivities as early as possible in the development lifecycle. This\nensures that performance considerations are an inherent part of the\ndesign and implementation, preventing the accumulation of technical\ndebt.\n\n#### Performance in the design phase:\n\nEven before a single line of code is written, critical performance\ndecisions are made. This phase focuses on architectural review and\nproactive estimation.\n\n- **Architectural Review:** Evaluate data models, ingestion, and access\n  patterns, and transformation logic for performance. Consider the\n  impact of large JOINs on data shuffling or complex views on query\n  execution.\n\n- **Early Warehouse Sizing Estimates:** Based on workload categorization\n  and concurrency projections, make initial projections for warehouse\n  sizes and multi-cluster configurations. Validate these estimates\n  through subsequent testing.\n\n- **Query Review:** Analyze proposed high-impact SQL queries or\n  transformation logic. Use EXPLAIN on hypothetical queries to\n  understand the planned execution and identify potential anti-patterns\n  like full table scans or excessive data movement.\n\n#### Performance in the development phase:\n\nAs development progresses, unit-level and integration-level performance\ntesting becomes crucial. Developers must be empowered with the knowledge\nand tools to self-diagnose and optimize their code.\n\n- **Unit Testing for Queries:** Developers should test individual SQL\n  queries, views, or stored procedures with representative (often\n  scaled-down or synthetic) data. The focus here is on the efficiency of\n  the specific logic.\n\n- **Query Profile and EXPLAIN Plan Mastery:** For developers,\n  understanding the Snowflake [\u003Cu\u003EQuery\n  Profile\u003C/u\u003E](https://docs.google.com/document/d/1LDeFasziRlYL1Z5t9BqJ_MwhECtJHbRDKG5BNWUAuwU/edit?tab=t.lhzra61et1j6)\n  is paramount. It provides a detailed breakdown of query execution,\n  identifying bottlenecks, spilling, data shuffling, and operator costs.\n\n  - **Critical Early Warning Signs:** Beyond obvious remote spilling,\n    developers should look for:\n\n    - **High Remote I/O:** Indicates excessive data reads from remote\n      storage, potentially due to poor filtering or table design.\n\n    - **Large Data Shuffled:** Signifies inefficient joins or\n      aggregations causing significant data movement between warehouse\n      nodes.\n\n    - **Ineffective Pruning:** Scanning many more micro-partitions than\n      necessary, suggesting missing WHERE clause filters or suboptimal\n      clustering.\n\n- **Dedicated Dev/Test Environments with Data Cloning:** Leverage\n  Snowflake's Zero-Copy Cloning capability to create isolated,\n  full-scale, or representative copies of production data in development\n  and testing environments. This allows developers and testers to run\n  realistic performance tests without impacting production or incurring\n  high costs for duplicate data storage.\n\n#### Comprehensive performance validation: load, scale, and stress testing\n\nBefore promoting any significant change or new workload to production, a\nstructured approach to load, scalability, and stress testing is\nessential. These tests validate the architecture under various\nreal-world and extreme conditions, directly addressing the risks of\ndeploying untested changes and ensuring performance at scale.\n\n#### Load testing:\n\nLoad testing simulates the expected peak concurrent user and query\nvolumes defined in the SLOs. The goal is to verify that the system can\nconsistently meet its performance objectives under anticipated\nproduction loads.\n\n- **Validation:** Confirm that query latency and throughput SLOs are\n  met, and that query queuing is within acceptable limits.\n\n- **Multi-Cluster warehouse behavior:** Observe how multi-cluster\n  warehouses (in auto-scale mode) respond to increasing load, ensuring\n  clusters spin up and down efficiently according to the chosen scaling\n  policy (Standard for performance-first, Economy for cost-first).\n\n- **Tools:** Can involve custom scripting, industry-standard load\n  testing frameworks (e.g., JMeter configured for JDBC/ODBC), or\n  specialized Snowflake testing partners.\n\n#### Scalability testing:\n\nScalability testing assesses how the system performs as data volumes\nand/or user growth increase significantly beyond current expectations.\nThis helps identify limitations in the architecture that might not\nappear under typical load.\n\n- **Data volume growth:** Simulate increased data over projected periods\n  (e.g., 6-12 months). This ensures queries maintain performance or\n  degrade predictably, informing long-term warehouse sizing and\n  architectural decisions.\n\n- **User growth:** Test with more concurrent users than the current\n  peak. This helps understand system capacity and identify potential\n  bottlenecks.\n\n- **Detection:** Look for non-linear performance degradation, where\n  small load increases lead to disproportionately large performance\n  decreases, often signaling a scaling bottleneck.\n\n#### Stress testing:\n\nStress testing is crucial for identifying the true limits of a system,\nvalidating its resilience, and understanding its failure modes. This\nprocess aims to uncover the performance limitations in the system as\ndesigned, and if necessary correct early – well in advance of\ndeployment.\n\n- **Extreme Load:** Subject the system to sustained, extreme concurrency\n  or data processing volumes.\n\n- **Warehouse Size**: Determine if a larger warehouse size is needed to\n  handle the workload.\n\n- **Multi-Cluster Width**: Explore options for horizontal scale-out to\n  distribute the load across multiple clusters.\n\n- **Analyze query performance:** Identify slow-running queries and\n  optimize their execution plan.\n\n- **Monitor warehouse usage:** Regularly review warehouse credit\n  consumption and adjust size as needed.\n\n- **Recovery:** Evaluate how the system recovers after extreme load,\n  ensuring stability and data integrity.\n\n- **Query Acceleration Service (QAS) Behavior:** Observe how QAS\n  mitigates the impact of unpredictable, outlier queries under stress.\n\n#### Regression testing and CI/CD integration:\n\nTo prevent performance degradation from new features or code changes,\nintegrate performance benchmarks into the Continuous\nIntegration/Continuous Deployment (CI/CD) pipeline.\n\n- **Best practice**: Major code changes should initiate performance\n  tests using representative data.\n\n- **Early detection:** Identify performance regressions immediately,\n  allowing developers to fix issues before they propagate downstream or\n  reach production.\n\n- **Controlled environments:** Establish dedicated, isolated test\n  environments (often using\n  [\u003Cu\u003ECLONE\u003C/u\u003E](https://docs.snowflake.com/en/sql-reference/sql/create-clone)\n  of production data) for consistent and repeatable performance\n  measurements.\n\n#### Performance and cost tradeoffs: the continuous optimization loop\n\nIn Snowflake, every performance decision is inherently a cost decision.\nIgnoring these tradeoffs can lead to overspending, even with a\nperformant system. The Test-First Design philosophy extends into a\ncontinuous optimization loop, where cost is a primary KPI.\n\nBy integrating performance and cost considerations from design to\ncontinuous operation, organizations can build a Snowflake environment\nthat is not only robust and responsive but also financially prudent.\nThis proactive, data-driven approach ensures that the investment in\nSnowflake delivers maximum value while avoiding the common pitfalls of\ndeferred performance management.\n\n## Optimize data architecture and access\n\n### Overview\n\nOptimal performance relies on solid architectural practices. This\nentails implementing and upholding a comprehensive architectural review\nprocess, employing a layered design to efficiently handle complexity,\nand making the best possible design decisions. This process should\nactively gather input from diverse teams involved in business\napplication development, ensuring all business needs are addressed, and\nthe resulting design accommodates a broad spectrum of requirements.\n\nKey components of this process are periodic application performance\nreviews, incorporating data quality validations and data lifecycle\nmanagement. Planning physical data access paths to support peak\nperformance is also crucial. Tools for achieving this include effective\ndata modeling techniques, appropriate data type selections for storing\nvalues, and creating favorable data access pathways.\n\n### Desired outcome\n\nAdhering to sound architectural and data access recommendations helps\nSnowflake applications achieve optimal performance and scalability. This\nproactive approach ensures that the application's foundation is robust,\nenabling it to efficiently handle evolving business demands and large\nvolumes of data. The outcome is a highly responsive application that\ndelivers a superior user experience, while simultaneously minimizing\noperational overhead and resource consumption.\n\nA well-defined architectural review process, coupled with a layered\ndesign, leads to a more maintainable and adaptable Snowflake\napplication. This structured approach simplifies future enhancements,\nbug fixes, and integrations, reducing the total cost of ownership. The\nability to incorporate diverse team input throughout the design phase\nguarantees that the application effectively addresses a broad spectrum\nof business requirements, resulting in a solution that is both\ncomprehensive and future-proof.\n\nFinally, strategic planning for physical data access paths, along with\neffective data modeling and appropriate data type selections, directly\ntranslates to accelerated query execution and improved data integrity.\nRegular performance reviews, including data quality validations and\nlifecycle management, ensure that data remains accurate, accessible, and\noptimized for peak performance. This integrated approach ultimately\nempowers users with timely and reliable insights, driving better\nbusiness decisions and maximizing the value derived from the Snowflake\nplatform.\n\n### Recommendations\n\nThe following list provides actionable recommendations for a database\npractitioner to achieve strong performance in a Snowflake environment:\n\n1.  Maintain high data quality\n\n2.  Optimize data models\n\n3.  Carefully choose data types\n\n4.  Refine data access\n\n#### Maintain high data quality\n\nMaintaining high data quality is critical for achieving optimal query\nperformance and deriving reliable business insights within Snowflake. By\nstrategically utilizing Snowflake's inherent capabilities, such as the\ncareful selection of datatypes and the implementation of NOT NULL\nconstraints, you can establish a robust foundation for data accuracy and\nconsistency. This approach not only streamlines development efforts but\nalso significantly improves the efficiency of join operations.\n\nWhile Snowflake offers declarative constraints like PRIMARY KEY, UNIQUE,\nand FOREIGN KEY, it's crucial to understand that these are not actively\nenforced by the database. As a result, ensuring true data integrity,\nuniqueness, and accurate referential relationships requires external\nenforcement. You can achieve this by designing application logic or\nintegrated data integration processes. Such external validation is\nindispensable for optimizing query execution, guaranteeing the\ntrustworthiness of analytical results, and ultimately maximizing the\nvalue of your data in Snowflake.\n\n#### Optimize data models\n\nOptimizing data models can enhance Snowflake's performance. When\ndesigning schemas, consider the impact of very wide tables. While\nSnowflake is efficient, extensive wide table schemas can increase query\ncompilation time, particularly for complex queries or deep view/CTE\nhierarchies. For short, interactive queries, this impact can be more\nnoticeable. As an alternative, consider VARIANT for numerous scalar\nelements, or VARCHAR structured as JSON, utilizing PARSE_JSON().\nHowever, avoid filtering or joining on scalar attributes in complex\nVARIANT/VARCHAR values, as this can hinder pruning effectiveness.\n\nStrategic denormalization is another valid technique, especially for\nanalytical workloads. By pre-joining and storing relevant data together,\nyou reduce the number of join operations, benefiting from Snowflake's\ncolumnar storage and micro-partitioning. This co-locates frequently\naccessed attributes, improving data locality and enhancing\nmicro-partition pruning for faster query execution and optimized\nresource consumption.\n\n#### Carefully choose data types\n\nOptimizing application query performance in Snowflake relies on data\ntype selection during schema design. Specifically, the data types of\ncolumns used in filter predicates, join keys, and aggregation keys\nsignificantly influence the query optimizer's efficiency and can\nintroduce computational overhead.\n\nFor optimal performance, use numeric data types for join keys. Temporal\ndata types like DATE and TIMESTAMP_NTZ also generally outperform others\nin filtering and join key scenarios due to their numerical nature.\n\nCoordinating data types for common join keys across tables within the\nsame schema is crucial. Mismatched data types require explicit or\nimplicit type casting, which consumes CPU cycles and can reduce the\neffectiveness of dynamic (execution time) pruning, leading to measurable\nperformance degradation, especially on the probe side of a join.\n\nFinally, while collation is sometimes necessary, it introduces\nsignificant performance overhead and should be used sparingly, ideally\nonly for presentation values and never for join keys, as it can\ninterfere with crucial performance features like pruning.\n\n#### Refine data access\n\nOptimizing data access in Snowflake is crucial for achieving peak query\nperformance. Several techniques are recommended, starting with\n**Pruning**, which minimizes scanned micro-partitions by leveraging\nmetadata. Both static pruning (compile-time, based on WHERE clauses) and\ndynamic pruning (runtime, based on join filters) are utilized. Static\npruning is generally preferred due to its predictability.\n\n[\u003Cu\u003EClustering\u003C/u\u003E](https://docs.snowflake.com/en/user-guide/tables-clustering-micropartitions)\nsignificantly enhances pruning by physically co-locating similar data\nwithin micro-partitions. This reduces the data range for filtered\ncolumns, leading to more efficient micro-partition elimination.\nEffective clustering also benefits join operations, aggregations, and\nDML (UPDATE, DELETE, MERGE) by reducing I/O requirements.\n\nThe [\u003Cu\u003ESearch Optimization\nService\u003C/u\u003E](https://docs.snowflake.com/en/user-guide/search-optimization-service)\ndramatically accelerates various query types, including selective point\nlookups, searches on character data (using SEARCH, LIKE, RLIKE), and\nqueries on semi-structured or geospatial data.\n\n[\u003Cu\u003EMaterialized\nViews\u003C/u\u003E](https://docs.snowflake.com/en/user-guide/views-materialized)\nimprove performance by pre-computing and storing expensive query\nresults, offering faster access for frequently executed or complex\noperations. They are particularly useful for aggregations and queries on\nexternal tables, with Snowflake handling automatic updates.\n\n[\u003Cu\u003EDynamic\nTables\u003C/u\u003E](https://docs.snowflake.com/en/user-guide/dynamic-tables-about)\nalso pre-compute query results, but offer continuous refreshment, ideal\nfor BI dashboards needing low-latency data. They leverage Snowflake's\nquery optimizations and can be further enhanced with clustering and\nsearch optimization.\n\nFinally, **Join Elimination** optimizes queries by removing unnecessary\njoins when they don't alter the result set, typically in primary/foreign\nkey relationships where joined columns aren't projected, significantly\nreducing data processing overhead.\n\n- Step-by-step Instruction\n\n  - [\u003Cu\u003EA Data-Driven Methodology for Choosing a Snowflake Clustering\n    Key\u003C/u\u003E](/en/developers/guides/getting-started-with-snowflake-cluster-key-selection/)\n\n- Blog Articles\n\n  - [\u003Cu\u003ETurbo-charge your Data Model with Snowflake’s Join\n    Elimination\u003C/u\u003E](https://medium.com/snowflake/turbo-charge-your-data-model-with-snowflakes-join-elimination-4fedc8a47d26)\n\n  - [\u003Cu\u003EAutomatic Clustering at\n    Snowflake\u003C/u\u003E](https://medium.com/snowflake/automatic-clustering-at-snowflake-317e0bb45541)\n\n  - [\u003Cu\u003ESnowfake Clustering\n    Demystified\u003C/u\u003E](https://medium.com/snowflake/snowflake-clustering-demystified-8042fa81289e)\n\n  - [\u003Cu\u003ESnowflake Dynamic Table Complete\n    Guide\u003C/u\u003E](https://medium.com/snowflake/snowflake-dynamic-table-complete-guide-6-final-c363aa7e273a)\n\n\n\n### Data quality for better performance\n\nMaintaining high data quality is crucial for optimal query performance\nwithin your application workflow. Snowflake offers built-in features for\nautomatic data quality enforcement and declarative capabilities for\nexternal implementations.\n\nOperating on well-structured, high-quality data provides benefits across\nthe data lifecycle, from ingestion to advanced analytics and reporting.\nThese advantages lead to greater efficiency, reduced costs, and more\nreliable business insights.\n\n- **Cleaner SQL code and reduced development effort:** Clean data\n  minimizes defensive coding, simplifying SQL for transparency and\n  maintainability. This allows focus on business logic over data\n  cleansing, accelerating development, reducing support, and freeing\n  engineering resources. Predictable query behavior and fewer errors\n  result.\n\n- **Faster join performance:** Efficient join operations require\n  equality predicates, clean data, and matching data types. Inconsistent\n  data types or dirty data impede the optimizer, creating performance\n  bottlenecks. Data cleanliness and type consistency enable efficient\n  join algorithms, speeding query execution for complex analytical\n  workloads.\n\n#### Using data types for data quality enforcement\n\nProper datatype selection is a fundamental aspect of robust data quality\npractices. While often overlooked, correct datatype assignment provides\ninherent constraints and optimizations, significantly contributing to\ndata accuracy, consistency, and integrity. For instance, storing\nnumerical values as numbers, rather than strings, prevents invalid\nentries like \"abc\" and enables accurate mathematical operations.\nSimilarly, date/time datatypes ensure chronological order and allow for\nprecise time-based filtering and analysis.\n\nStricter data types offer significant advantages for database\nperformance, primarily by establishing a clear domain of valid values,\nwhich benefits the query optimizer, reduces storage utilization, and\nimproves join performance.\n\n**Optimizing query performance through stricter data types**\n\n- **Improved query optimizer efficiency:** Variability in data values\n  can lead to complex filters and join predicates, hindering query\n  performance. Stricter data types limit this variability, reducing\n  cardinality and enhancing micro-partition statistics.\n\n- **Accurate cardinality estimation:**Data statistics are gathered at\n  the micro-partition level. Varying values with the same meaning\n  distort the query optimizer's cardinality estimations. Stricter data\n  types, such as BOOLEAN or DATE, provide precise information, leading\n  to accurate cardinality estimates.\n\n- **Enhanced performance with numerical data types:** Stricter data\n  types, often numerical, optimize performance. This facilitates binary\n  predicates in filters and joins, resulting in faster database\n  application performance.\n\n**Reduced storage utilization**\n\n- **Efficient data storage:** Numerical data types generally consume\n  less storage due to their inherent efficiency in how computer systems\n  represent and process numbers. Integers and floating-point numbers\n  store in fixed-size memory blocks, with size determining range and\n  precision. This contrasts with variable-length types like strings or\n  complex objects.\n\n- **Improved data compression** occurs with strictly defined data types,\n  reducing cardinality within micro-partitions. Tighter constraints\n  increase value unification, enabling more efficient compression\n  algorithms. This minimizes storage footprint and accelerates data\n  retrieval and processing due to reduced data volume, optimizing\n  storage and performance in modern data warehousing and database\n  systems.\n\n- **Physical I/O reduction:** For large tables, storage optimization\n  significantly reduces the physical storage footprint, directly\n  decreasing the number of physical I/O operations for data access and\n  processing. This leads to substantial overall performance improvement.\n  Minimizing disk read/write needs allows systems to complete queries\n  and operations more quickly, enhancing responsiveness and efficiency\n  for users and applications, and optimizing resources for a more\n  efficient data processing pipeline.\n\n**Optimized join performance**\n\n- **Consistent data types for join keys:** For optimal query\n  performance, ensure columns used in equality join conditions have\n  identical data types. Mismatched data types lead to implicit\n  conversions, degrading performance. Meticulous data type assignment\n  during design, matching frequently joined columns across tables, is\n  crucial for a performant database application.\n\n- **Superior performance of numerical types in joins:** Numerical data\n  types generally offer better performance in equality join conditions\n  compared to VARCHAR.\n\n- **Temporal data type efficiency:** For optimal performance in join\n  keys and filters, consider using DATE and TIMESTAMP_NTZ. These data\n  types do not store timezone information, eliminating runtime\n  adjustments and allowing the optimizer to utilize Min/Max statistics\n  effectively.\n\n#### NOT NULL constraints for data quality enforcement\n\nSnowflake's NOT NULL constraints ensure data quality by requiring\nspecified columns to always contain a value, preventing incomplete or\nmissing data. This establishes a baseline for critical data points,\nreducing the need for later cleansing.\n\nBeyond data quality, NOT NULL constraints enhance query performance. The\noptimizer can make more efficient query plan decisions when a column is\nknown to contain no NULL values, especially in equality join conditions.\nThis allows for more streamlined equality predicates.\n\n**Performance benefits of NOT NULL constraints:**\n\n- **Simplified query logic:** Eliminates the need for separate IS\n  \\[NOT\\] NULL predicates, streamlining query construction. You can\n  write cleaner, more concise SQL, reducing complexity and improving\n  readability, maintainability, and debugging. This approach minimizes\n  potential errors, leading to more robust and efficient database\n  operations.\n\n- **Reduced query overhead:** Snowflake's query optimizer automatically\n  introduces a nullability filter when a nullable column is used in an\n  equality inner join. This additional filter consumes CPU time,\n  resulting in performance overhead that you can avoid by using NOT NULL\n  constraints.\n\n#### The role of primary key and unique constraints\n\nSnowflake supports PRIMARY KEY and UNIQUE constraints for SQL\ncompatibility, but these are not enforced. Maintaining data integrity is\nyour application's responsibility.\n\nExternal enforcement of these constraints is vital for data integrity in\nanalytical workloads, ensuring reliable reporting and correct\naggregations. Validation checks, deduplication, or upsert mechanisms in\nyour data pipelines ensure only valid, unique records are loaded.\n\nBeyond integrity, external enforcement benefits query performance. When\ndata is guaranteed unique externally, Snowflake's query optimizer\ngenerates more efficient execution plans by leveraging metadata and\nstatistics. This avoids unexpected data duplication in joins and\npromotes cleaner query code, reducing complexity.\n\n**Optimizing query performance with primary key and unique constraints**\n\n- **Enhanced query optimizer selectivity:** Enforcing Primary Key and\n  Unique constraints ensures cleaner data, which benefits\n  micro-partition statistics. Accurate record counts and distinct values\n  are crucial for the query optimizer to estimate selectivity precisely,\n  leading to more effective query plans.\n\n- **Enabling join elimination:** The RELY property, when set for a\n  Primary Key or Unique constraint, is a prerequisite for Snowflake's\n  Join Elimination. This dynamically removes unnecessary joins,\n  improving query performance, and relies on externally enforced\n  uniqueness.\n\n- **Reduced defensive coding:** External uniqueness enforcement\n  minimizes defensive SQL coding in downstream applications,\n  streamlining development and enhancing application robustness.\n\n#### Foreign key constraints\n\nSnowflake supports foreign key constraints for SQL compatibility but\ndoes not enforce them. Maintaining referential integrity is your\nresponsibility. Enforcing these constraints ensures data consistency and\naccuracy, improving downstream query performance by assuming valid table\nrelationships. This simplifies query logic and streamlines join\noperations, leading to faster, more predictable query execution.\n\n**Performance benefits of foreign key constraints**\n\n- **Snowflake Join Elimination:** Setting the RELY property on a foreign\n  key constraint enables Snowflake's Join Elimination, improving query\n  efficiency by removing unnecessary joins.\n\n- **INNER JOIN optimization:** When a foreign key is externally\n  enforced, INNER JOINs offer optimizations not available with OUTER\n  JOIN. Use OUTER JOIN only for inconsistent data where foreign key\n  constraints are not strictly enforced.\n\n### Data modeling for performance\n\nOptimizing data models can significantly enhance Snowflake's already\nimpressive performance. Most industry-standard data modeling techniques\nare applicable when designing a schema in Snowflake. The following\nsections explore common and model-specific considerations.\n\n#### Star Schema\n\nThe Star Schema model works well with Snowflake, favoring right-deep\nquery execution plans. This positions the largest fact table on the far\nprobe side of joins. The model also benefits from Join Elimination,\nwhich excludes optional dimensions (joined with OUTER JOIN) if they're\nnot part of the final projections.\n\n**Considerations:**\n\n- **Fact table clustering:** You should consider clustering large fact\n  tables. Clustering key candidates should include frequently used\n  filters, join keys, and a temporal attribute reflecting the natural\n  data ingestion order.\n\n- **Numerical data types for keys:** Use of numerical data types for key\n  columns involved in equality joins is strongly recommended for optimal\n  performance.\n\n#### Data Vault 2.0\n\n**Considerations:**\n\n- **Numerical keys:** For optimal performance, use numerical keys\n  instead of hash keys (e.g., MD5). Hash keys, being alphanumeric\n  VARCHAR, are less effective for clustering because Snowflake only\n  considers the first five bytes for clustering, ignoring the rest.\n  Their random nature also prevents natural record co-location, leading\n  to higher reclustering costs and suboptimal states.\n\n- **Strategic table clustering:** Data Vault schemas, with their higher\n  normalization, often involve queries across many large tables. To\n  improve performance, strategically cluster these tables using a shared\n  attribute that is also part of join and filter conditions. This\n  enhances pruning and improves query performance.\n\n- **Local materializations:** For performance issues when joining\n  multiple large tables, consider limited materializations using Dynamic\n  Tables to boost query execution speed.\n\n#### Very wide tables\n\nQuery compilation time in Snowflake can be affected by very wide tables\n(hundreds of columns). The optimizer processes more metadata at\ncompilation, extending the time from submission to execution. This is\nmore noticeable in complex queries referencing many columns or involving\nintricate logic, especially with deep dynamic views or [\u003Cu\u003ECTE\nhierarchies\u003C/u\u003E](https://docs.snowflake.com/en/user-guide/queries-cte).\nWhile often minor for long-running analytical queries, it can impact\nshort interactive queries.\n\nA balanced schema design is key. Consider using a VARIANT data type for\nnumerous individual scalar data elements, or a large VARCHAR structured\nas JSON. The PARSE_JSON() function allows for easy data access.\nSnowflake automatically subcolumnarizes up to a set number of unique\nelements within a VARIANT, though this is not guaranteed and has\nrestrictions.\n\nAvoid combining scalar attributes frequently used for filtering and\njoins into a single VARIANT or VARCHAR, as this can reduce pruning\neffectiveness due to a lack of collected statistics for these complex\nvalues.\n\n#### Denormalization\n\nDenormalization can optimize query performance in Snowflake,\nparticularly for analytical tasks. While a normalized schema ensures\ndata integrity, it often necessitates multiple joins, adding\ncomputational overhead. Strategic denormalization pre-joins relevant\ndata, reducing the need for joins at query time.\n\nThis approach leverages Snowflake's columnar storage and\nmicro-partitioning. By co-locating frequently accessed attributes within\nthe same micro-partition, data locality improves for common queries,\nminimizing I/O operations. Micro-partition pruning is also enhanced,\nallowing the warehouse to efficiently skip irrelevant data during scans.\n\nStrategic denormalization significantly improves query performance and\noptimizes resource usage. By reducing complex joins and leveraging\nmicro-partition pruning, you can design schemas for highly performant\nanalytical workloads. This provides faster access to insights and a more\nresponsive user experience, balancing performance with data integrity.\n\n#### Finding the balance\n\nAchieving the right balance among these concepts requires careful\ntesting. There's no universal guideline or ideal degree of\ndenormalization; each data model and dataset is unique. Therefore,\nextensive testing is crucial to determine the most effective approach\nfor your specific business needs.\n\n### Data type for performance\n\nOptimizing query performance depends on the data type choices made\nduring schema design. The physical data type of a column can\nsignificantly impact the query optimizer's choices and introduce\ncomputational overhead. This is especially true when the column is used\nin filter predicates, join key predicates, or as an aggregation key.\n\n#### Data type recommendations\n\nConsider the following data type recommendations when designing a\nschema:\n\n- **Join key data types:** Use numerical data types for join keys for\n  superior performance. Snowflake often pushes join filters to the probe\n  side, and numerical values create a more robust filter.\n\n- **Temporal data types:** Understand the performance implications of\n  temporal data types. DATE and TIMESTAMP_NTZ generally perform better\n  in filtering and join key scenarios.\n\n- **Collation considerations:** Use collation only when essential due to\n  its performance impact. Avoid using collation for join keys.\n\n#### Data types and join performance\n\nFor optimal performance, use identical data types for common join keys\nacross tables in the same schema. Type casting of join keys, whether\nexplicit or implicit, introduces performance overhead due to CPU cycles\nand can hinder dynamic pruning.\n\nSnowflake automatically casts columns with lower precision to match the\ndata type of the opposite join key, but this still incurs the same\nperformance disadvantages as explicit casting. When type casting is\napplied to a key on the probe side of a join, it typically leads to\nmeasurable performance degradation. You can observe type casting in a\njoin on the query profile for each join operation.\n\nThe Snowflake query optimizer pushes join filters derived from equality\njoin conditions in inner joins to the probe side. Filters based on\nnumerical values offer superior initial filtering and enhanced\nperformance. DATE and TIMESTAMP_NTZ data types are numerical and share\nthese performance characteristics, meaning the impact of non-coordinated\ndata types also applies to them.\n\nSee ​​[\u003Cu\u003EData Type Considerations for Join Keys in\nSnowflake\u003C/u\u003E](https://medium.com/snowflake/data-type-considerations-for-join-keys-in-snowflake-304d515d2b91)\nfor further exploration of this topic.\n\n#### Temporal data type choices and performance \n\nSnowflake offers various temporal data types, all stored numerically.\nFor optimal **filtering** performance, DATE and TIMESTAMP_NTZ are\nsuperior.\n\nThese types are offsets from EPOCH. DATE uses smaller numerical values,\nleading to better performance for equality join keys due to its smaller\nmemory and storage footprint. TIMESTAMP_NTZ offers greater precision\nwith only slightly lower performance.\n\nTIMESTAMP_TZ and TIMESTAMP_LTZ, which include a timezone component, are\nstored using UTC and a dynamic timezone offset. This dynamic calculation\nconsumes CPU cycles and interferes with pruning. While suitable for\npresentation, if precise filtering or joining on timestamp values with\ntimezones is needed, use two columns: one without a timezone (DATE or\nTIMESTAMP_NTZ) for pruning, and another with a timezone for accurate\nrepresentation.\n\n#### Collation\n\nCollation introduces measurable performance overhead, especially for\njoin keys. Numerical join keys are faster, regardless of collation. You\nshould restrict collation use to presentation values only for optimal\nperformance.\n\nEven with a collation definition at the DATABASE, SCHEMA, or TABLE\nlevel, data is physically stored without collation. The transformation\nis dynamic upon data access. While column statistics at the\nmicro-partition level reflect the default (no collation) state for\nmin/max values, filters and join keys must adhere to collation rules.\nThis misalignment hinders important performance features like pruning.\n\nSee [\u003Cu\u003EPerformance implications of using\ncollation\u003C/u\u003E](https://docs.snowflake.com/en/sql-reference/collation#performance-implications-of-using-collation)\nfor further exploration of this topic.\n\n### Summary\n\nTaking the time to thoughtfully choose data types can make a significant\ndifference in performance, particularly at scale. Data types matter in\nSnowflake, but not always in expected ways. Pay special attention to the\ndata types for join keys, temporal data types, and avoid the use of\ncollations where possible.\n\n## Data access\n\n### Pruning\n\nPruning eliminates unnecessary Snowflake scanning. This efficiency is\nmeasured by the ratio of unscanned to total micro-partitions during\ntable access. For instance, scanning only one out of 100\nmicro-partitions yields 99% pruning efficiency. Pruning decisions are\nbased on the minimum and maximum values stored as metadata for columns\ninvolved in filters or join keys.\n\n#### Static vs dynamic pruning\n\nSnowflake utilizes both static and dynamic pruning. Static pruning,\nwhich occurs during query compilation in the Cloud Services Layer, uses\nWHERE clause filters to optimize queries. Its impact on the execution\nplan is analyzed and factored into cost calculations.\n\nDynamic pruning, performed at runtime by the Virtual Warehouse, employs\njoin filters to prune unnecessary scans. Its effectiveness is not known\nduring compilation, thus it doesn't affect execution plan cost or table\njoin order.\n\nStatic pruning is generally preferred. Regardless, a query profile will\nalways show actual scanning statistics and the number of\nmicro-partitions scanned.\n\n### Clustering\n\nSnowflake performance is significantly enhanced by clustering, which\nminimizes micro-partition scans by co-locating frequently queried\nrecords. The primary goal is to reduce the range of values in\nmicro-partition statistics for columns used in query filter predicates,\nimproving pruning.\n\nTo select an effective clustering key, identify queries needing\noptimization and choose potential candidates based on filters and join\npredicates. Evaluate the cardinality of these candidates to determine an\noptimal combined clustering key cardinality relative to the total number\nof full-size micro-partitions. Finally, test the chosen key on a subset\nof actual data.\n\nClustering also benefits DML operations (UPDATE, DELETE, MERGE). By\nusing a specific clustering key combination, you can facilitate the\nco-location of records frequently modified by the same DML query. This\nreduces the number of micro-partitions affected by DML logic, leading to\nlower physical write I/O and improved query execution performance.\n\n### Search Optimization Service\n\nThe Snowflake [\u003Cu\u003ESearch Optimization\nService\u003C/u\u003E](https://docs.snowflake.com/en/user-guide/search-optimization-service)\nsignificantly improves query performance for faster response times and a\nbetter user experience. This service helps data consumers, from business\nanalysts to data scientists, gain insights with unmatched speed.\n\nA key benefit is the acceleration of selective point lookup queries,\nwhich return a small number of distinct rows. These queries are vital\nfor applications requiring immediate data retrieval, such as critical\ndashboards needing real-time data for decision-making.\n\nSearch Optimization Service also improves the speed of searches\ninvolving character data and IPv4 addresses using the\n[\u003Cu\u003ESEARCH\u003C/u\u003E](https://docs.snowflake.com/en/sql-reference/functions/search)\nand\n[\u003Cu\u003ESEARCH_IP\u003C/u\u003E](https://docs.snowflake.com/en/sql-reference/functions/search_ip)\nfunctions. This is particularly beneficial for applications relying on\ntext-based queries, such as log analysis or security monitoring, where\nquick identification of specific text patterns or IP addresses is\ncritical.\n\nThe service extends performance enhancements to substring and regular\nexpression searches, supporting functions like\n[\u003Cu\u003ELIKE\u003C/u\u003E](https://docs.snowflake.com/en/sql-reference/functions/like),\n[\u003Cu\u003EILIKE\u003C/u\u003E](https://docs.snowflake.com/en/sql-reference/functions/ilike),\nand\n[\u003Cu\u003ERLIKE\u003C/u\u003E](https://docs.snowflake.com/en/sql-reference/functions/rlike).\nThis capability is vital for scenarios requiring fuzzy matching or\ncomplex pattern recognition, allowing for quicker and more comprehensive\ndata exploration without typical performance bottlenecks.\n\nFinally, search optimization delivers substantial performance\nimprovements for queries on semi-structured data (VARIANT, OBJECT, and\nARRAY columns) and geospatial data. For semi-structured data, it\noptimizes equality,\n[\u003Cu\u003EIN\u003C/u\u003E](https://docs.snowflake.com/en/sql-reference/functions/in),\n[\u003Cu\u003EARRAY_CONTAINS\u003C/u\u003E](https://docs.snowflake.com/en/sql-reference/functions/array_contains),\n[\u003Cu\u003EARRAYS_OVERLAP\u003C/u\u003E](https://docs.snowflake.com/en/sql-reference/functions/arrays_overlap),\nfull-text search, substring, regular expression, and NULL value\npredicates. For geospatial data, it speeds up queries using selected\n[\u003Cu\u003EGEOGRAPHY\u003C/u\u003E](https://docs.snowflake.com/en/sql-reference/functions-geospatial)\nfunctions. These optimizations are crucial for efficiently handling\ndiverse and complex data structures, ensuring modern applications can\nrapidly query and analyze all data types.\n\n### Materialized views\n\n[\u003Cu\u003EMaterialized\nviews\u003C/u\u003E](https://docs.snowflake.com/en/user-guide/views-materialized)\nimprove query performance by pre-computing and storing data sets, making\nqueries inherently faster than repeatedly executing complex queries\nagainst base tables. This is especially beneficial for frequently\nexecuted or computationally complex queries, accelerating data retrieval\nand analysis.\n\nThese views speed up expensive operations like aggregation, projection,\nand selection. This includes scenarios where query results represent a\nsmall subset of the base table's rows and columns, or when queries\ndemand significant processing power, such as analyzing semi-structured\ndata or calculating time-intensive aggregates.\n\nMaterialized views also offer an advantage when querying external\ntables, which can sometimes exhibit slower performance. By materializing\nviews on these external sources, you can mitigate performance\nbottlenecks, ensuring quicker data access and more efficient analytical\nworkflows.\n\nSnowflake's implementation ensures data currency and transparent\nmaintenance. A background service automatically updates the materialized\nview as base table changes occur, eliminating manual upkeep and reducing\nerrors. This guarantees that data accessed through materialized views is\nalways current, providing consistent and reliable performance.\n\n### Leverage Dynamic Tables for query performance\n\nDynamic Tables boost query performance by materializing data. Unlike\nstandard views that re-execute queries, Dynamic Tables pre-compute and\nstore results, creating continuously refreshed data. This means complex\nqueries are computed once per refresh, not every time a user queries.\n\nThis benefits applications like BI dashboards and embedded analytics,\nwhere low latency is crucial. Directing these applications to a Dynamic\nTable makes end-user queries simple SELECT statements on pre-computed\nresults. This significantly improves performance by bypassing complex\nlogic, leading to quicker execution and better response for many\nconcurrent users.\n\nAs periodically refreshed tables, Dynamic Tables share performance\nadvantages with standard tables. Snowflake automatically collects\nstatistical metadata and applies advanced query optimizations. You can\nfurther optimize Dynamic Tables with features like automatic clustering,\nSearch Optimization Service for improved partition pruning, and\nadditional serverless features such as Materialized Views and the Query\nAcceleration Service.\n\n### Join elimination\n\n[\u003Cu\u003EJoin\nelimination\u003C/u\u003E](https://docs.snowflake.com/en/user-guide/join-elimination),\na powerful Snowflake query optimization, significantly enhances query\nperformance by removing unnecessary joins. This occurs when the\noptimizer determines a join won't change the query result, typically\ninvolving primary/foreign key relationships declared with the RELY\nkeyword. Columns from the \"joined\" table must not be required in the\nfinal projection (e.g., not selected or used in WHERE, GROUP BY, or\nORDER BY clauses that would alter the outcome).\n\nThe primary benefit of join elimination is a substantial reduction in\nprocessed and transferred data, leading to faster query execution and\nlower compute costs. By eliminating a join, Snowflake avoids reading\nunnecessary data and performing the join operation, which is\nparticularly beneficial in complex queries. This intelligent\nsimplification allows Snowflake to focus computational resources on\nessential query components, delivering results more efficiently.\n\n### Data Lifecycle Management\n\nData Lifecycle Management (DLM) is crucial for optimizing Snowflake\nperformance. By setting clear policies for data retention, archiving,\nand deletion, organizations ensure that only actively used data resides\nin frequently accessed objects. This proactive approach minimizes data\nprocessed for queries, leading to faster execution and reduced compute\ncosts. Efficiently managed data also improves micro-partition pruning,\nmaking your dataset more concise.\n\nAs data ages and access declines, keeping seldom-accessed historical\ndata in active tables with many micro-partitions can create performance\noverhead during query compilation. Isolating historical data into\nseparate tables maintains peak query performance for frequently used\ndata, while ensuring full access for analytical purposes. This also\nallows for alternative clustering strategies that benefit analytical\nquery performance. Since data is often transferred in large batches,\nperiodic reordering may be unnecessary. You can choose manual data\nclustering by sorting records in each batch to reduce ongoing automatic\nclustering costs.\n\n## Architect for scalability and workload partitioning\n\n#### Overview\n\nTo achieve highly performant, scalable solutions on Snowflake, fully\nleverage its multi-cluster shared data architecture. This architecture\nseparates compute from storage, allowing independent scaling. Assigning\ndifferent workloads to dedicated virtual warehouses lets you match\ncompute resources to query complexity. This ensures one workload (e.g.,\ndata engineering) doesn't negatively impact another (e.g., a critical BI\ndashboard). Workload isolation typically improves cache hit ratios and\ncompute resource utilization, leading to faster performance and better\nprice-performance.\n\n#### Desired outcomes\n\nAdhering to this principle improves business agility and\ndecision-making. Quickly available data insights help you respond to\nmarket changes and adapt strategic plans. This principle also\ncontributes to greater data operation stability and reliability.\nWorkload isolation prevents poorly performing queries from crippling\nanalytical operations, creating a more robust data platform, increasing\nuser trust, and reducing troubleshooting. Finally, it leads to reduced\noperational costs and simplified performance administration.\nRight-sizing virtual warehouses avoids over-provisioning and\nunder-provisioning. Simplifying administration frees technical resources\nto focus on business advancement.\n\n### Recommendations\n\nHere are some specific and actionable recommendations to architect\nhigh-performance, scalable solutions on Snowflake:\n\n#### Optimize virtual warehouses for cost and performance\n\nOptimizing for cost and performance is a key best practice on Snowflake,\ninvolving the strategic tuning of warehouse-level parameters to match\nworkload needs. Leveraging parameters like AUTO_RESUME and AUTO_SUSPEND\nis a great way to ensure you're only paying for compute resources when\nqueries are actively running. You often right-size the warehouse's\nt-shirt size to match query complexity, while using multi-cluster\nsettings like MIN_CLUSTER_COUNT and MAX_CLUSTER_COUNT allows for\nautomatic scaling to handle any potential ebbs and flows of concurrent\nactivity. Finer control over how clusters scale and handle queries can\nbe achieved with the scaling policy and MAX_CONCURRENCY_LEVEL parameter,\nwhich helps teams achieve the best price-performance for their specific\nworkload.\n\n#### Implement strategies for handling concurrent queries\n\nEffectively handling concurrent queries is a key architectural\nconsideration on Snowflake, and the preferred approach is using\nmulti-cluster virtual warehouses which automatically scale compute\nresources in response to query load. You can fine-tune this behavior\nwith parameters like MIN_CLUSTER_COUNT and MAX_CLUSTER_COUNT to define\nthe scaling boundaries, and MAX_CONCURRENCY_LEVEL to control the number\nof queries per cluster. For predictable batch workloads, a great\nstrategy is to stagger scheduled jobs to reduce concurrency spikes and\nlessen demand on warehouses. Additionally, isolating large,\nrarely-executed scheduled jobs into a dedicated warehouse is a best\npractice, as it prevents resource contention and allows for programmatic\nresume and suspend to eliminate idle time and save on cost.\n\n#### Utilize Snowflake's serverless features\n\nSnowflake's serverless features abstract away the manual configuration\nof virtual warehouses by leveraging shared compute that is typically\nmetered by the second. In contrast, virtual warehouses are dedicated to\na customer and have a one-minute minimum for billing. This allows for\nbetter utilization of shared compute resources via an economy of scale,\nwhich in turn enables Snowflake to provide excellent price-performance.\nBy leveraging these services, teams can achieve significant compute\nefficiency gains for a variety of specific workloads.\n\nThe Search Optimization Service automatically builds a data structure\nthat drastically reduces the amount of data scanned for highly selective\nqueries. The Query Acceleration Service offloads parts of resource-heavy\nqueries to shared compute pools, which prevents long-running \"outlier\"\nqueries from monopolizing a warehouse. For repeatable, complex\naggregations, the Materialized View Service automatically maintains\npre-computed results, allowing subsequent queries to bypass\nrecomputation entirely. Finally, Serverless Tasks automatically manage\nand right-size the compute for scheduled jobs, eliminating the need for\nmanual warehouse configuration and ensuring efficient credit\nconsumption.\n\n#### Leverage Dynamic Tables for data engineering pipelines\n\nDynamic Tables are a powerful new feature that dramatically simplifies\nthe creation and management of data pipelines on Snowflake. By using a\ndeclarative SQL syntax, they automate the complex incremental DML\noperations required to keep a table up-to-date, eliminating the need for\nmanual orchestration, which can be tedious, suboptimal, and prone to\nerrors. Similar to materialized views, they pre-compute and store query\nresults, which significantly improves the performance of downstream\nqueries. This declarative approach simplifies pipeline development and\nmonitoring, leading to enhanced data engineering productivity and a more\nstreamlined architecture.\n\n## Optimize virtual warehouses for cost and performance\n\n#### Isolate workloads\n\nImplementing workload isolation with multiple virtual warehouses is\ncrucial for optimizing Snowflake performance. This strategy prevents\nresource contention by dedicating separate compute resources to distinct\ntasks, such as isolating long-running ETL from time-sensitive BI\nqueries. It also provides a robust mechanism for cost management and\naccountability, especially for organizations with a single Snowflake\naccount and many business units, by simplifying internal chargeback and\nencouraging teams to optimize their compute usage.\n\n**Examples include:**\n\n- A smaller, multi-cluster warehouse (e.g., X-Small or Small with an\n  upper bound of 5-10 clusters) is ideal for ad-hoc queries from\n  business users and analysts. This setup dynamically scales to meet\n  variable, bursty query loads, ensuring performance objectives are met\n  without over-provisioning and keeping costs in check.\n\n- A Medium or Large single-cluster warehouse suits data ingestion and\n  data engineering jobs. These jobs often process larger data sets and\n  require more compute, especially with complex transformations.\n\n- A very large dedicated warehouse (e.g., 2X-Large or higher) is best\n  for complex, high-volume monthly batch jobs. Isolating such jobs\n  prevents negative impact on others and allows for precise\n  right-sizing. You can programmatically resume the warehouse before the\n  job and suspend it afterward, avoiding idle time costs.\n\n#### Use meaningful names for warehouses\n\nUse descriptive names (e.g., BI_REPORTING_WH, ETL_LOADER_WH) to make it\neasy for users and administrators to understand the purpose of each\nwarehouse and prevent mixing workloads. This will also make it easier to\nunderstand dashboards and reports that provide insights into performance\nand cost metrics by warehouse name.\n\n#### Leverage auto-resume and auto-suspend\n\nWarehouses typically benefit from auto-resume (default). This allows a\nwarehouse to spin up automatically from a suspended state when a query\nis issued. Disabling this requires manual resumption via an ALTER\nWAREHOUSE RESUME command, leading to:\n\n- a query failing because it's issued against a suspended warehouse.\n\n- a manually resumed warehouse sitting idle, accruing credits without\n  servicing queries.\n\nConfigure virtual warehouses to automatically suspend after inactivity\n(e.g., 60-300 seconds). This saves credit when not in use, benefiting\nintermittent workloads. However, suspension flushes the data cache,\nwhich avoids expensive remote reads. For a BI dashboard, a longer\nsuspension (e.g., ten minutes) might be better to keep the cache warm.\nFor data engineering, where caching often yields less benefit, a shorter\nauto-suspend interval is often optimal.\n\n#### Right-size your warehouses\n\nStart with a smaller warehouse size and scale up if queries spill or\ntake too long. For slow queries, if stepping up the warehouse size\n(doubling CPU, memory, and SSD) does not roughly halve the query time,\nconsider a smaller size for better resource utilization. If necessary,\nperform performance profiling to identify why it isn't scaling linearly,\noften due to uneven processing.\n\nWarehouse size should primarily be driven by workload complexity, not\naverage or peak concurrency, which is often better handled by\nmulti-cluster warehouses. Increasing warehouse size for concurrency,\nespecially peak, typically results in over-provisioning and increased\ncredit consumption without a corresponding price-performance ratio.\n\nSpilling occurs when a fixed-size resource (memory or local SSD) is\nfully utilized, requiring additional resources. Local spilling moves\nmemory contents to SSD; remote spilling moves SSD contents to remote\nstorage. Excessive spilling, particularly remote, often signals an\nundersized warehouse for its assigned workload. The QUERY_HISTORY view\nin ACCOUNT_USAGE provides insights into local and remote spilling via\nbytes_spilled_to_local_storage and bytes_spilled_to_remote_storage\nattributes. These metrics can identify warehouses for upsizing due to\nexcessive spilling.\n\n#### Enable multi-cluster warehouses (MCWs)\n\nFor high-concurrency BI reporting, enable [\u003Cu\u003Emulti-cluster\nwarehouses\u003C/u\u003E](https://docs.snowflake.com/en/user-guide/warehouses-multicluster)\n(Enterprise Edition and above). This allows Snowflake to automatically\nscale out clusters when queries queue and scale in when load decreases,\nensuring consistent performance during peak times without\nover-provisioning.\n\nThe SCALING_POLICY parameter can be configured to influence scale-out\nbehavior with STANDARD (default) and ECONOMY values. While STANDARD\nsuits most workloads, ECONOMY can conserve credits by establishing a\nhigher bar for spinning up new clusters, leading to increased queuing.\nThis tradeoff may be worthwhile for cost-optimized workloads.\n\nMulti-cluster warehouses often provide better price-performance for\n\"bursty\" workloads by elastically adjusting clusters. However, if\nadditional compute is required for complex individual queries,\nincreasing cluster size is more appropriate, as a single query executes\nagainst a single cluster.\n\n#### Drive accountability via warehouse-level chargeback\n\nIn larger organizations with a single Snowflake account, workload isolation promotes accountability and effective administration. Virtual warehouses are often the dominant cost driver, so dedicating specific warehouses to business units provides a clear mechanism for internal chargeback. This drives cost control and empowers each team to manage their own compute usage. This simplifies governance, as each business unit can manage its dedicated warehouse with local control, minimizing the risk of one team's actions affecting another's workload. Always secure access to warehouses via an effective RBAC (Role-based access control) strategy to ensure only authorized users/roles/teams have access.\n\n#### Query Acceleration Service (and Scale Factor)\n\nEnable [\u003Cu\u003EQuery\nAcceleration\u003C/u\u003E](https://docs.snowflake.com/en/user-guide/query-acceleration-service#evaluating-cost-and-performance)\non your warehouse to parallelize parts of qualifying queries, reducing\nthe need to over-provision for \"outlier\" queries with heavy table scans.\nThe **QUERY_ACCELERATION_MAX_SCALE_FACTOR** parameter defines the\nsupplemental compute available. While the default is eight, begin with a\nlower value (even one) to validate its benefits before increasing it to\noptimize price-performance.\n\n## Implement strategies for handling concurrent queries\n\n#### Tune max concurrency level\n\nFor multi-cluster warehouses, fine-tune concurrency with the\nMAX_CONCURRENCY_LEVEL parameter, which sets the maximum queries per\ncluster. Reducing this value can benefit resource-intensive queries by\nproviding more compute power, potentially improving throughput by\nminimizing concurrency overhead and optimizing resource utilization.\n\nThis parameter's \"unit of measurement\" is not strictly a query count,\nbut rather \"full, cluster-wide queries.\" While no single query counts\nfor more than one unit, some, like stored procedure CALL statements,\ncount for less. A CALL statement, being a single control thread, uses\nonly a fraction of a cluster's \"width,\" representing a fraction of a\nunit. Thus, multiple CALL statements might aggregate into one unit,\nmeaning a MAX_CONCURRENCY_LEVEL of eight could support more than eight\nconcurrent CALL statements. Snowflake automatically manages these\ncalculations for optimized resource utilization.\n\nWhile query concurrency can exceed MAX_CONCURRENCY_LEVEL due to lower\ndegrees of parallelism, fewer queries might be assigned to a cluster\nbefore queueing due to memory budgeting. Each query has a memory metric\nthat determines if a cluster can accept it without exceeding its budget.\nIf exceeded, the query is not assigned. If no clusters are available,\nthe query queues, awaiting capacity. Larger or more complex queries\nincrease the memory metric, reducing net concurrency for warehouses\nprocessing heavyweight queries.\n\nThis parameter also applies to single-cluster warehouses. Reducing its\nvalue will cause queueing. Without a multi-cluster warehouse (MCW),\nqueries will wait for capacity to free up when others complete, rather\nthan a new cluster spinning up. However, for some scenarios, tuning this\nvalue for a single-cluster warehouse may be appropriate.\n\n#### Stagger scheduled jobs\n\nFor predictable, high-concurrency workloads like scheduled batch jobs,\nstaggering their start times effectively avoids concurrency spikes,\nallowing more efficient use of warehouse resources. This prevents jobs\nfrom running simultaneously and competing for resources, mitigating the\nnegative impacts of concurrency spikes.\n\nSince most jobs begin with scan-based activity (I/O), even slight\nstaggering of heavyweight queries can prevent \"stampedes\" that arise\nfrom simultaneous dispatch. While Snowflake and cloud storage are highly\nscalable, making staggering not a strict requirement, it is a best\npractice for optimal resource utilization.\n\nThis principle also applies to concurrent queries dispatched from an\napplication. Introducing a slight delay, sometimes via a small random\noffset for each query, provides similar benefits to staggering scheduled\njobs.\n\n#### Monitor for queuing\n\nWhen queries queue on a warehouse, it's a signal that the warehouse\nmight be under-provisioned for the workload, and either a larger\nwarehouse size or a multi-cluster warehouse (with an increased maximum\ncluster count) would be beneficial. You can use Snowflake's\n[\u003Cu\u003EQUERY_HISTORY\u003C/u\u003E](https://docs.snowflake.com/en/sql-reference/account-usage/query_history)\nview in the ACCOUNT_USAGE share to monitor query queuing and identify\nconcurrency issues. There are three queueing-related attributes in the\nview:\n\n- queued_provisioning_time\n\n  - Warehouse start up (resume from suspended; less relevant here)\n\n- queued_repair_time\n\n  - Warehouse repair (less common; not relevant here)\n\n- queued_overload_time\n\n  - Query waiting for warehouse resources to free up (most relevant\n    here)\n\nWhen coupled with the following attributes that are also included in the\nview:\n\n- warehouse_id / warehouse_name\n\n- warehouse_size\n\n- start_time\n\n- end_time\n\nIt is fairly straightforward to identify warehouses that require\nadditional compute resources, and also whether this is periodic or\nsustained.\n\n#### Special considerations for concurrent stored procedures\n\nSnowflake stored procedures, invoked via a CALL statement, coordinate\nchild SQL statements. The CALL statement itself uses minimal warehouse\nresources, but child statements, executing as separate queries, can\nfully utilize a warehouse cluster. By default, child statements run on\nthe same warehouse as the parent.\n\nIn environments with extensive stored procedure use and high CALL\nstatement concurrency, parent and child statements can intertwine on a\nsingle warehouse. While lightweight parent statements are easily\nassigned, high concurrency can lead to child statements queuing. A\nparent statement cannot complete until all its children do. This can\ncause a subtle deadlock: many parent statements wait for children, but\nsome children are blocked due to insufficient warehouse capacity.\n\nTo prevent this, isolate parent and child statements on different\nwarehouses. This is achieved by having the parent issue a USE WAREHOUSE\ncommand before launching child statements. This simple strategy\neffectively avoids deadlocks in high stored procedure concurrency.\nAdditionally, using two warehouses allows each to be optimally\nconfigured for its specific purpose.\n\n## Utilize Snowflake's serverless features\n\n### Automatic Clustering Service\n\n[\u003Cu\u003EAutomatic\nclustering\u003C/u\u003E](https://docs.snowflake.com/en/user-guide/tables-auto-reclustering)\nin Snowflake is a background service that continuously manages data\nreclustering for tables with a defined and enabled cluster key.\nClustering table data effectively, based on columns or expressions, is a\nhighly effective performance optimization. It directly supports pruning,\nwhere specific micro-partitions are eliminated from a query's table\nscan. This micro-partition elimination provides direct performance\nbenefits, as I/O operations, especially across a network to remote\nstorage, can be expensive. By clustering data to align with common\naccess paths, MIN-MAX ranges for columns become narrower, reducing the\nnumber of micro-partitions scanned for a query.\n\n[\u003Cu\u003EDefining the correct cluster\nkey\u003C/u\u003E](https://docs.snowflake.com/en/user-guide/tables-clustering-keys)\nis crucial for achieving excellent query performance and optimizing\ncredit consumption. While the Automatic Clustering Service incurs credit\ncharges to maintain a table's clustering state, when implemented\ncorrectly, overall credit consumption should be lower, often by an order\nor two of magnitude, compared to not managing clustering. Best practices\nfor cluster key selection include:\n\n- The order of expressions in a multi-part cluster key is crucial. The\n  first expression, or \"leading edge,\" has the greatest impact on\n  clustering.\n\n- Currently, Snowflake ignores any expressions beyond the fourth in a\n  cluster key. Do not define a cluster key with more than four\n  expressions.\n\n- Even with four or fewer expressions, not all may affect clustering.\n  Clustering co-locates rows into micro-partitions to achieve narrow\n  MIN-MAX ranges. If the composite cluster key's cardinality exceeds the\n  number of micro-partitions, further co-location is not possible.\n\n- For activity-based tables that continually grow (e.g., sales, web\n  clicks), a date/time-based leading edge is often effective. Unless\n  older data is restated, micro-partitions stabilize quickly, reducing\n  churn. This benefits Search Optimization, Materialized Views, Dynamic\n  Tables, and Replication through reduced churn.\n\n- If a column has high cardinality but is valuable as an access path,\n  consider reducing its cardinality with a system function. Ensure the\n  function maintains the original column's partial ordering, segmenting\n  values into \"buckets\" that preserve relative order. To reduce the\n  cardinality of:\n\n  - A string (VARCHAR), use LEFT().\n\n  - A timestamp, use TO_DATE to truncate to a DATE, or DATE_TRUNC for\n    other units (HOUR, WEEK, MONTH, etc.).\n\n  - An integer, use TRUNC(\\\u003CCOL\\\u003E, \\\u003CBUCKETSIZE\\\u003E).\n\n- For string expressions in a cluster key, Snowflake rarely considers\n  more than five characters (never more than six). For multi-byte\n  non-Latin characters, this can be as low as one. Therefore, COL_X as a\n  cluster key expression is functionally equivalent to LEFT(COL_X, 5)\n  for Latin characters. To consider more characters, stitch them\n  together as multiple expressions, e.g., CLUSTER BY (LEFT(COL_X, 5),\n  SUBSTR(COL_X, 6, 5)) for the first ten characters.\n\n- Do not use functions like MOD, as they do not result in narrow MIN-MAX\n  ranges. For example, MOD(COL, 10) treats 1, 11, and 100000001 as\n  equivalent for clustering, but results in a very wide MIN-MAX range,\n  significantly diminishing pruning effectiveness.\n\n### Search Optimization (SO) Service\n\nFor highly selective queries on large tables, enable the [\u003Cu\u003ESearch\nOptimization\nService\u003C/u\u003E](https://docs.snowflake.com/en/user-guide/search-optimization-service).\nThis serverless feature creates a persistent data structure (index) for\nefficient micro-partition pruning, significantly reducing scanned data\nand improving query performance. It is effective for point lookups and\nsubstring searches, even on semi-structured data.\n\nConsider Search Optimization indexes when clustering alone doesn't meet\nperformance objectives. Search Optimization enhances pruning without\nrequiring narrow MIN-MAX ranges, using Bloom filters to identify\nmicro-partitions that do not contain matching rows.\n\nClustering often affects Search Optimization's effectiveness.\nEstablishing a cluster key before assessing Search Optimization's\npruning is often advantageous, as altering clustering can change pruning\neffectiveness.\n\nSearch Optimization builds incrementally on registered micro-partitions.\nAn index may cover 0% to 100% of active micro-partitions. If a query is\nissued with partial coverage, the index is leveraged for covered\nmicro-partitions, providing an additional pruning option beyond MIN-MAX\npruning. Uncovered micro-partitions miss this secondary pruning. Heavy\ntable churn can diminish Search Optimization's effectiveness, so\nminimize unnecessary churn when the service is configured.\n\n### Materialized View (MV) Service\n\nFor frequently-run queries with repeated subquery results, such as\ncomplex aggregations, use a materialized view. The [\u003Cu\u003EMaterialized View\nService\u003C/u\u003E](https://docs.snowflake.com/en/user-guide/views-materialized)\nautomatically refreshes the view when the underlying base table changes,\nallowing subsequent queries to use pre-computed results for faster\nperformance.\n\nSimilar to Search Optimization, Materialized View maintenance is\nincremental on active micro-partitions. If a table experiences extensive\nmicro-partition churn, performance benefits diminish. Queries\nencountering non-covered micro-partitions revert to the base table,\nimpacting performance.\n\nFor MVs that aggregate data (via DISTINCT or GROUP BY), results are\nstored per source micro-partition, requiring a query-time final\naggregation. This final aggregation is usually negligible, but if\nsignificant, consider alternative data materialization via manual ETL or\nDynamic Tables, balancing data access and latency.\n\n### Query Acceleration Service (QAS)\n\nTo speed up portions of a query workload on an existing warehouse,\nenable the Query Acceleration Service. This service automatically\noffloads parts of the query processing work, particularly large scans\nwith selective filters, to shared compute resources. It's ideal for ad\nhoc analytics or workloads with unpredictable data volumes, as it\nreduces the impact of resource-hungry \"outlier queries\" without needing\nto manually scale up the entire warehouse.\n\nIt is important to understand that QAS is limited to a subset of\noperation types within the processing of a query. Specifically, there\nare two primary scenarios where QAS can be employed within a query\ntoday:\n\n- For a COPY INTO, it can participate in the entire operation for a\n  subset of the source files that are being ingested. It can scan,\n  transform, and write out rows.\n\n- For SELECT and INSERT (including CTAS), QAS can only participate in\n  the following operation types:\n\n  - Table Scan\n\n  - Transformation (computed columns)\n\n  - Filter (predicate and join filters)\n\n  - Aggregation (GROUP BY)\n\nIf any other operation type is encountered within a query execution\nplan, QAS will share its partial result with the warehouse and will not\nparticipate in that query any further. This includes (but is not limited\nto):\n\n- Join\n\n- Sort\n\n- Insert (write data to new micro-partitions)\n\n### Serverless tasks\n\nFor scheduled, single-statement SQL or stored procedure-based workloads,\nconsider using serverless tasks instead of user-managed warehouses. With\nserverless tasks, Snowflake automatically manages the compute resources,\ndynamically allocating the optimal warehouse size for each run based on\npast performance. This eliminates the need for manual warehouse sizing,\nautomates cost management, and ensures that your data pipelines run\nefficiently without consuming credits when idle.\n\n## Leverage Dynamic Tables for data engineering pipelines\n\n### Improve downstream query performance\n\nDynamic Tables enhance query performance for downstream consumers by\nmaterializing data. Unlike standard views, which re-execute their\nunderlying query each time they are called, Dynamic Tables pre-compute\nand store query results, providing a periodically refreshed version of\nthe data. This means complex, performance-intensive queries, such as\nthose with multiple joins and aggregations, are computed once during the\nrefresh cycle, rather than every time the result is queried.\n\nThis significantly benefits applications like BI dashboards and embedded\nanalytics, where low latency is crucial. By directing these applications\nto a fast-responding Dynamic Table instead of a complex view, end-user\nqueries become simple SELECT statements on pre-computed results. This\ncan substantially boost performance, as the query engine bypasses\ntransformation logic, leading to quicker query execution and a more\nresponsive analytical experience for many concurrent users.\n\nAs materialized tables, Dynamic Tables offer powerful performance\nadvantages similar to standard tables. They collect the same statistical\nmetadata automatically, and Snowflake's advanced query optimizations\napply when Dynamic Tables are the query source. Effectively, from a\nquery perspective, Dynamic Tables function as materialized standard\ntables.\n\nAdditionally, Dynamic Tables are compatible with serverless features for\nfurther performance enhancements. You can apply Automatic Clustering for\nbetter partition pruning during data scanning. A Search Optimization\nService index can be built to accelerate scans for highly selective\nfilter criteria. Other serverless features, like Materialized Views and\nthe Query Acceleration Service, can also be layered on top of a Dynamic\nTable for even greater optimization.\n\n### Enhance organizational productivity\n\nDynamic Tables simplify data engineering by allowing you to define a\ntable's desired final state with a CREATE DYNAMIC TABLE AS SELECT...\nstatement, rather than complex MERGE or INSERT, UPDATE, DELETE commands.\nThis declarative approach removes the burden of managing incremental\nlogic, which is often error-prone.\n\nBeyond initial pipeline creation, Dynamic Tables automate data\norchestration by intelligently performing full or incremental refreshes,\napplying only necessary changes. This eliminates the need for manual\npipeline construction using STREAMS and TASKS, and facilitates chaining\nDynamic Tables for complex dependencies without external tools.\n\nAdministration and monitoring are also streamlined. Snowflake's\ndedicated Snowsight graphical interface provides a visual representation\nof your pipeline's status, refresh history, and dependencies,\nsimplifying troubleshooting and governance. This \"single pane of glass\"\nidentifies bottlenecks or failures quickly, replacing manual log\ninspection or metadata queries.\n\nUltimately, Dynamic Tables' declarative syntax, automated refresh logic,\nand integrated monitoring transform data engineering. You can configure\nthem to run on a set schedule or on-demand. By automating low-level\ntasks, Dynamic Tables enable data teams to focus on building new data\nproducts and driving business value, resulting in a more efficient and\nagile data platform.\n\n### [\u003Cu\u003EBest practices for Dynamic Tables\u003C/u\u003E](https://docs.snowflake.com/en/user-guide/dynamic-table-performance-guide)\n\n**Simplify the core definition:** Avoid overly complex single Dynamic\nTable definitions. For clarity and performance, it's a best practice to\nkeep the number of joined tables in a single definition to a minimum,\nideally no more than five. For more complex transformations, chain\nmultiple Dynamic Tables together, with each one building on the\nprevious.\n\n**Leverage dependency chaining:** Use the DOWNSTREAM keyword to specify\ndependencies between Dynamic Tables, which ensures that a dependent\ntable is only refreshed after its upstream source has been updated. This\nalso allows Snowflake to optimize processing by permitting refreshes on\na Dynamic Table to be deferred until it is required by a downstream\nDynamic Table.\n\n**Set the TARGET_LAG parameter appropriately:** The [\u003Cu\u003ETARGET_LAG\u003C/u\u003E\n\u003Cu\u003Eparameter\u003C/u\u003E](https://docs.snowflake.com/en/user-guide/dynamic-tables-target-lag)\ncontrols the maximum delay of the data in the Dynamic Table relative to\nits source. It's crucial to set this value to the highest number that\nstill meets your business requirements. Setting a TARGET_LAG that is\nlower than necessary can cause more frequent, less efficient refreshes,\nwhich increases credit consumption and resource usage without providing\nany tangible business benefit.\n\n**Avoid high DML churn on source tables**\n\nExcessive DML operations like UPDATE or DELETE on a source table can\nsignificantly impact the performance of its dependent Dynamic Table.\nThis is because the underlying change data capture (CDC) mechanism has\nto process a higher volume of changes, which requires more compute and\ncan lead to slower refresh times. Designing data pipelines to be\nappend-only when possible is a key best practice for maximizing\nefficiency.\n\n**Utilize the IMMUTABLE WHERE clause**\n\nUse the **IMMUTABLE WHERE** clause in your Dynamic Table definition to\nspecify a predicate for immutable source data. This allows the refresh\nservice to avoid re-scanning historical data that is guaranteed not to\nchange, which can significantly improve the efficiency and performance\nof incremental refreshes.\n\n**Manage backfills with BACKFILL FROM clause**\n\nTo load historical data into a new Dynamic Table, or one that is\nundergoing a change to its schema definition, use the BACKFILL FROM\nparameter in the CREATE DYNAMIC TABLE syntax. This allows you to specify\na timestamp from which the initial refresh should begin, providing a\nsimple, declarative way to backfill the table with historical records.\nIt eliminates the need for manual, complex backfilling scripts.\n\n**Right-size the refresh warehouse:** Ensure the warehouse specified for\nthe Dynamic Table refresh is appropriately sized for the workload. A\nlarger warehouse can process large refreshes more quickly, while a\nsmaller one may be more cost-effective for frequent, smaller incremental\nupdates.\n\n**Monitor refresh history:** Regularly monitor the refresh history of\nyour Dynamic Tables using the DYNAMIC_TABLE_REFRESH_HISTORY view. This\nprovides insights into the refresh performance, latency, and costs,\nallowing you to fine-tune your definitions and warehouse sizes for\ncontinuous optimization.\n\n## Implement continuous performance monitoring and optimization\n\n### Overview\n\nEstablish comprehensive monitoring and logging to identify performance\nbottlenecks. Proactively optimize the system by analyzing queries and\nworkloads to adapt to evolving requirements.\n\n#### Desired outcome\n\nEffective performance monitoring and optimization yield a system with\npredictable performance and stable costs, even as data and applications\nevolve. This foundation supports future growth in data volume and query\nactivity, enabling better root cause analysis and cost management.\n\n### Recommendations\n\nPerformance optimization often follows the 80/20 rule, where a minimal\ninvestment can yield significant improvements. While definitive rules\nare elusive due to diverse workloads, these recommendations establish a\nfoundation for a performant, cost-stable workload on the Snowflake\nplatform.\n\n#### Understand how Snowflake works\n\nA technical understanding of the Snowflake architecture is crucial for\ndiagnosing performance issues and identifying optimization\nopportunities. While most workloads perform well without deep expertise,\nperformance tuning requires a greater investment in understanding the\nplatform's fundamentals.\n\n#### Measure performance\n\nObjective measurement is a prerequisite for meaningful optimization.\nWithout a clear and objective baseline, success cannot be defined,\nleaving initiatives without direction.\n\n#### Identify bottlenecks\n\nFocus optimization efforts on significant bottlenecks at the macro\n(application), workload, or micro (query) level. Addressing\ninconsequential components yields minimal overall improvement.\n\n#### Proactively optimize\n\nAddress performance proactively, not just reactively. Regular analysis\nof performance patterns and slow queries can prevent emergencies.\nEstablishing a performance baseline is key to tracking trends and\ndetermining if performance is improving or degrading over time.\n\n#### Thoroughly test performance optimizations\n\nPredicting query performance is difficult; therefore, testing is\nessential. Validate that changes improve the target workload without\nnegatively impacting others. Testing proves whether a proposed solution\nhas the desired effect.\n\n#### Meticulously validate AI suggestions\n\nAI can be a useful tool, but suggestions require critical validation.\nTest AI-driven recommendations thoroughly against platform knowledge and\nreliable sources before implementation.\n\n### Trade-offs & considerations \n\n#### Cost versus performance\n\nThe relationship between cost and performance is not linear. While some\noptimizations increase cost, others can reduce it. For example, a query\nthat takes 10 minutes on an XS warehouse and spills to remote storage\nmight complete in one minute on a Small warehouse without spilling. In\nthis case, selecting a larger, more expensive warehouse results in a\nfaster, cheaper query execution.\n\n#### Monitoring versus analysis\n\nSnowflake's rich performance data favors targeted analysis over constant\nmonitoring. A proactive approach to reviewing and comparing performance\ndata is required. The optimal balance depends on workload criticality;\nsensitive operations may benefit from continuous analysis, while stable\nprocesses can rely on retrospective analysis.\n\n#### Statistical rigor versus agility\n\nAccurate performance insights require statistically sound metrics.\nHowever, this rigor can slow down the optimization process. Balance the\nneed for statistically valid data with the need for agile\ndecision-making. Less rigorous measurements may suffice for initial\ntroubleshooting, with comprehensive testing reserved for validating\nmajor changes.\n\n#### Factors impacting performance\n\nNumerous factors can impact query and workload performance. This list is\na starting point for consideration.\n\n- **Data volume**: Significant changes in data volume can impact\n  performance, especially if a threshold is crossed that causes\n  operations like remote spilling.\n\n- **Data distribution**: Data value distribution affects micro-partition\n  scanning and overall performance. Changes can alter query plans and\n  the amount of data processed.\n\n- **Data clustering**: Clustering, the physical grouping of data in\n  micro-partitions, is critical. Poor clustering increases\n  micro-partition scanning, degrading performance. Maintaining good\n  clustering improves partition pruning.\n\n- **Data model**: The logical data organization profoundly impacts\n  performance. Poorly designed models can lead to inefficient query\n  plans, while overly wide tables can also present challenges.\n\n- **Query syntax**: The structure of a SQL query significantly affects\n  its execution plan. Inefficient syntax, like poor JOIN conditions, can\n  prevent the optimizer from choosing an efficient plan.\n\n- **View definitions**: A view's underlying definition impacts the\n  performance of queries that use it. A complex view can hide\n  performance problems and introduce computational overhead with every\n  execution.\n\n- **Data share changes**: Changes to shared data, such as new columns or\n  modified clustering keys, can impact consumer query performance.\n\n- **Search Optimization changes**: The Search Optimization Service can\n  accelerate point lookups. Adding or removing it can have a massive\n  impact on the performance of applicable queries.\n\n- **Use of Hybrid Tables**: Hybrid Tables blend OLTP and OLAP\n  capabilities. Their performance characteristics for analytical queries\n  may differ from standard tables, requiring specific workload\n  considerations.\n\n- **Warehouse characteristics**: Virtual warehouse configuration has a\n  direct impact on performance. This includes:\n\n  - Virtual warehouse size\n\n  - Multi-Cluster Warehouse (MCW) settings\n\n  - MAX_CONCURRENCY_LEVEL\n\n  - Query Acceleration Service (QAS)\n\n  - Snowpark-optimized warehouse settings\n\n  - Warehouse generation (Gen1 vs. Gen2)\n\n- **Caching**: Snowflake uses metadata, result set, and warehouse data\n  caching. A valid cache hit accelerates query execution, while a cache\n  miss can be slower.\n\n- **Concurrency**: Multiple queries competing for resources can slow\n  individual execution times. Proper warehouse sizing and MCW\n  configuration can prevent concurrency bottlenecks.\n\n- **Queuing due to load**: When a warehouse is at capacity, new queries\n  are queued, increasing total execution time. This indicates a need for\n  a larger warehouse or more clusters.\n\n- **Queuing due to locks**: Locks ensure data integrity during DML\n  operations. While minimal, lock contention can occur and must be\n  resolved to maintain a responsive system.\n\n- **Snowflake updates**: Regular platform updates, which often include\n  performance enhancements, can occasionally alter query optimizer\n  behavior and execution plans, potentially impacting specific\n  workloads.\n\nThis list is not exhaustive, and some of these things are much more\nlikely than others.\n\n### Measuring performance\n\n#### Overview\n\nRigorous measurement is essential for achieving performance targets,\nconfirming improvements, and preventing performance issues. Snowflake\nprovides a wealth of performance data, which reduces the need for\nconstant monitoring. This data only gains meaning through consistent\nreview and comparative analysis.\n\n**Desired outcome**\n\nUnderstanding current performance allows identification of anomalies and\ntheir origins. It can also help understand how time spent within\nSnowflake relates to other parts of an application or pipeline.\n\n### Recommendations\n\nA robust performance measurement strategy is built on a clear purpose, a\ndefined scope, and a consistent process for evaluating critical\nworkloads. These recommendations are essential to properly measuring\nperformance:\n\n#### Clarify reasons for measuring performance\n\nIdentifying the reason for measuring performance guides the effort and\ntime invested. The common reasons for measuring the performance of a\nquery or workload include establishing a baseline, comparing to a\nbaseline, troubleshooting, controlling costs, and understanding\ncontributions to Service Level Objectives (SLOs) or performance targets.\n\n#### Define measurement scope\n\nDefine the dimensions of the analysis. Pinpoint the object of\nmeasurement, since performance in Snowflake can be evaluated at\ndifferent levels of granularity.\n\nUnderstanding the granularity of performance measurement guides the\ntechniques and tools employed.\n\n#### Identify priority workloads and queries\n\nThe choice of what to measure depends on the reason for performance\nanalysis and the desired granularity. There are different considerations\nfor measuring single queries, workloads , and workloads with\nconcurrency. The overall goal is to focus effort where it will have the\nmost impact.\n\n#### Select metrics\n\nCarefully choose and measure performance metrics in Snowflake to ensure\neffective analysis.There are many valid metrics, including overall query\nexecution time, query cost, and metrics like files scanned. Statistical\nsignificance is important in measuring performance.\n\n#### Define your measurement cadence\n\nEstablish a clear schedule and triggers for measuring performance.\nUnderstanding when to measure performance allows for focused effort and\nhelps avoid over-reacting to perceived performance problems. The goal is\nto provide a valid comparison point and understand the impact of various\nfactors on performance.\n\n### Clarify reasons for measuring performance\n\n#### Overview\n\nEstablishing a clear reason for measuring performance from the outset is\nparamount for understanding what data to examine and which strategic\ndirections to pursue.\n\n**Desired outcome**\n\nDefining the \"why\" behind a performance initiative guides the level of\neffort and ensures resources are directed to the most impactful areas.\n\n#### Recommendations\n\nCommon reasons for measuring the performance of a query or workload\ninclude:\n\n- **Establishing a baseline:** A baseline provides a reference point for\n  comparing future changes or problems. This comparison helps determine\n  the value of potential modifications and the importance of addressing\n  an issue. It is crucial to gather metrics in a statistically sound\n  manner to avoid skewed results from transitory differences.\n\n  - **Query-Level baseline:** A single query is the simplest unit for a\n    baseline. Measure a query along several dimensions and record the\n    values for later comparison. Establishing a query-level baseline\n    often involves accessing information already stored by Snowflake.\n    Recording a timestamp and query ID for lookup in QUERY_HISTORY is\n    often sufficient, though longer retention may require storing this\n    data in a separate table. A baseline can be as simple as execution\n    time and micro-partitions scanned, or more detailed using\n    GET_QUERY_OPERATOR_STATS().\n\n  - **Workload-level baseline:** A workload is a logical grouping of\n    queries, often identified by query tags, user, or warehouse. Since\n    the number of queries in a workload can change, a simple\n    query-by-query analysis is often insufficient.\n\n- **Comparing to a baseline:** Once established, a baseline is used to\n  evaluate the impact of optimizations. When making changes, measure\n  performance against the baseline to quantify the improvement. This can\n  be applied to both individual queries and entire workloads.\n\n- **Troubleshooting:** A primary reason to collect performance data is\n  to make a query or workload faster. To quantify an improvement, one\n  must first measure the initial performance. Understanding the scale of\n  a performance problem helps determine the appropriate level of urgency\n  and resource allocation. Without a baseline, it is impossible to\n  determine if performance has degraded, or by how much.\n\n- **Understanding contributions to SLOs:** The performance of a query or\n  workload is often critical to a larger application or pipeline with a\n  Service Level Objective (SLO). Understanding the contribution of each\n  component is essential for overall performance improvement and for\n  assessing the severity of any performance issues.\n\n### Define measurement scope\n\n#### Overview\n\nA successful performance measurement strategy begins with a clear\ndefinition of the scope of the analysis. It is important to identify the\nspecific object of measurement, as performance in Snowflake can be\nevaluated at several different levels of granularity.\n\n**Desired outcome**\n\nThe level of granularity chosen for performance measurement will guide\nsubsequent decisions, such as the appropriate measurement techniques.\nThis clarity is essential for directing performance tuning efforts in\nthe most effective way.\n\n#### Recommendations\n\nPerformance can be measured at various levels of granularity. The most\ncommon granularities for performance measurement are:\n\n- **Single query:** The performance of a single query is often a\n  critical factor. A single query can be the most resource-intensive\n  component of a pipeline or application, or it may be executed with\n  such high frequency that its individual performance has a significant\n  cumulative impact. Analyzing individual queries can also reveal\n  patterns in performance or data modeling that can be applied to\n  improve a broader set of queries. A focus on individual query\n  performance is generally a necessary part of any effort to improve\n  overall performance or reduce costs.\n\n- **Workload:** In many cases, optimizing the performance of a single\n  query is not enough. An improvement to one query can sometimes lead to\n  a degradation in the performance of another. To achieve significant\n  performance gains, it may be necessary to analyze the performance of\n  all queries within a pipeline or application. A comprehensive approach\n  to workload analysis, including the establishment of a baseline and a\n  well-defined testing methodology, is essential for effective\n  regression testing and overall performance improvement.\n\n- **Concurrency:** Concurrency testing is a specialized area of testing\n  that is most likely to be something that is needed for high\n  concurrency and low latency applications. It is rare to engage in\n  concurrency testing to simply reduce costs or in the pursuit of better\n  metrics on paper. Concurrency testing generally involves using a\n  third-party app, such as JMeter, to run queries in specific patterns.\n\n#### Concurrency testing anti-patterns\n\nAs mentioned above, there are many potential anti-patterns for\nconcurrency testing. Here are several to avoid:\n\n- **Failing to simulate a realistic ramp-up:** Starting a concurrency\n  test with a sudden, massive spike of concurrent queries rather than a\n  gradual ramp-up. A sudden burst does not allow time for proper scaling\n  at the virtual warehouse and the cloud services layer, unless those\n  layers are specifically configured to handle bursting workloads. Such\n  a pattern can trigger queuing and auto-scaling. This pattern may not\n  be representative of how users naturally log on and begin their work\n  throughout the day, and may have negative performance patterns that\n  are not representative of a real workload.\n\n- **Not validating the test environment:** Failing to ensure the testing\n  environment (including data volume, data distribution, and data\n  clustering) is a true representation of the production environment. A\n  test run on a small, non-representative dataset may yield results that\n  are not applicable to the real-world workload.\n\n- **Failing to use separate warehouses for distinct workloads:** Lumping\n  together disparate workloads—such as ETL and BI dashboards—on the same\n  warehouse. This is an anti-pattern for performance in general, but in\n  concurrency testing, it can skew results and hide the true bottlenecks\n  for each workload type.\n\n- **Using a single, large warehouse for all workloads:** Testing a mix\n  of small, fast-running queries and large, resource-intensive queries\n  on a single, oversized warehouse. This can lead to resource contention\n  and queuing for the smaller queries, which could be handled more\n  efficiently on a smaller, separate warehouse. It also wastes credits\n  by over-provisioning for the smaller workloads.\n\n- **Ignoring the multi-cluster warehouse's scaling policies:** Not\n  understanding the difference between the \"Standard\" and \"Economy\"\n  scaling policies. Testing with \"Economy\" can lead to high queuing as\n  Snowflake attempts to fully utilize existing clusters before spinning\n  up new ones, while a workload requiring low latency might need the\n  \"Standard\" policy's more rapid scaling.\n\n- **Using an un-representative test workload:** Simulating concurrency\n  with a small, static set of queries that do not accurately reflect\n  real-world user behavior. A good concurrency test needs a mix of query\n  types, complexities, and data access patterns that mirror the\n  production workload.\n\n- **Overlooking the impact of caching:** Not accounting for the various\n  cache layers in Snowflake (result, warehouse, and metadata cache). A\n  poorly designed test may repeatedly hit the same cached result, giving\n  a false impression of performance under load. A true concurrency test\n  must be designed to invalidate the cache and simulate a realistic mix\n  of cold and warm queries. Disabling the result set cache is a bad idea\n  for concurrency testing - if the test is properly designed, the result\n  set cache will be used appropriately.\n\n- **Not establishing a baseline without concurrency:** Running a\n  concurrency test without first measuring the performance of individual\n  queries in isolation. Without this baseline, it is impossible to\n  attribute performance degradation to concurrency versus other factors,\n  like query complexity or data changes.\n\n- **Treating Snowflake like an OLTP database:** For optimal performance\n  in Snowflake, some level of denormalization is often advantageous.\n  Grouping DML operations logically, rather than executing a large\n  number of individual INSERT, UPDATE, DELETE, or MERGE operations that\n  affect only a few rows, tends to be more cost-efficient and perform\n  better.\n\n### Identify priority workloads and queries\n\n#### Overview\n\nAfter establishing the reason for performance analysis and the required\ngranularity [\u003Cu\u003Eof what you’re\nmeasuring\u003C/u\u003E](https://docs.google.com/document/d/1LDeFasziRlYL1Z5t9BqJ_MwhECtJHbRDKG5BNWUAuwU/edit?tab=t.l1pikt37o4sn),\nthe next step is to identify the specific workloads or queries that will\nbe the focus of the investigation.\n\n**Desired outcome**\n\nTargeting performance measurements allows for the efficient allocation\nof time and resources to the areas where they will have the most\nsignificant impact.\n\n#### Recommendations\n\nThe selection of a query or workload for performance measurement may be\napparent based on the reason for measuring performance. However, if a\nspecific target has not yet been identified, the following\nrecommendations can help guide the selection process based on the chosen\nlevel of granularity.\n\n#### Single query\n\nIdentifying a single query for performance analysis from a large volume\nof queries requires a systematic approach. Queries can be prioritized\nbased on various dimensions, including:\n\n- **Cost:** The most expensive queries in terms of resource consumption.\n\n- **Expectations:** Queries that deviate from expected performance\n  norms.\n\n- **Criticality:** Queries that are essential to the functionality of an\n  application, dashboard, or pipeline.\n\n- **User impact:** Queries that directly affect the end-user experience.\n\n- **Historical performance:** Queries that have been identified as\n  problematic in the past.\n\n- **Complexity:** Queries with a high degree of complexity.\n\n- **Data access:** Queries that scan a large number of micro-partitions.\n\n- **Performance variance:** Queries that exhibit a wide range of\n  execution times.\n\nIt is important to focus on queries that are meaningful and relevant to\nthe overall performance goals. Analyzing random queries is unlikely to\nyield significant improvements. The insights gained from optimizing a\nsingle query can often be applied to other queries with similar\npatterns.\n\nThe QUERY_HISTORY view in ACCOUNT_USAGE is a valuable resource for\nidentifying queries that meet specific criteria. Aggregating data on the\nQUERY_PARAMETERIZED_HASH can help identify patterns across multiple\nexecutions of a query with different parameters, which is a common\ncharacteristic of workloads that support BI dashboards.\n\n#### Workload\n\nThe process of selecting a workload for performance analysis is similar\nto that of selecting a single query. However, the decision is often\ninfluenced by business-related factors, such as the impact of the\nworkload on a critical metric. A workload is typically chosen for\nanalysis because it is a source of user frustration or because it is\nassociated with high costs, rather than solely because of its technical\ncomplexity.\n\nA workload can be defined as a group of queries, and the criteria for\ngrouping can vary. Queries can be grouped by user, virtual warehouse, or\napplication. The use of query tags can be a helpful mechanism for\nidentifying and tracking the queries that constitute a specific workload\nin QUERY_HISTORY and other monitoring tools.\n\n#### Concurrency\n\nConcurrency testing is a specialized form of performance analysis that\nis typically reserved for applications with high-concurrency and\nlow-latency requirements. It is not generally employed for the sole\npurpose of cost reduction or for improving metrics that are not directly\nrelated to concurrency. Concurrency testing usually involves the use of\nthird-party tools, such as JMeter, to simulate specific query patterns.\n\n### Select metrics\n\n#### Overview\n\nAfter deciding to measure performance, the next step is to determine\nwhich metrics to use and how to apply them. Using inappropriate metrics\nor applying them incorrectly can be counterproductive. A thoughtful and\ndeliberate approach to choosing and measuring metrics ensures a better\nreturn on the time and effort invested in performance analysis.\n\n#### Recommendations\n\nThere are two main aspects to consider when selecting metrics for\nperformance measurement: what to measure and how to measure it. The\nchoices made will depend on the overall goals of the performance\nanalysis and the specific context of the measurement. It is crucial to\nensure that the measurement methodology is valid.\n\n#### What to measure\n\n- **Query execution time:** The most common metric for analyzing the\n  performance of a single query or a workload is its execution time. In\n  Snowflake, it is generally not beneficial to focus on individual\n  components of the execution time, such as compilation time, as a\n  longer compilation time can sometimes result in a shorter overall\n  execution time.\n\n- **Query cost:** There is a nuanced relationship between performance\n  and cost in Snowflake. A query that runs for 2 minutes on an X-Small\n  warehouse may cost the same as the same query running for 1 minute on\n  a Small warehouse. It is even possible for a query to be both faster\n  and cheaper on a larger warehouse. Rigorous testing is essential to\n  determine if changes that might seem to increase costs, such as using\n  a larger warehouse or clustering a table, actually lead to a reduction\n  in overall cost.\n\n- **Files scanned and other metrics:** Other metrics should also be\n  considered. For example, the number of files scanned can be a key\n  performance indicator, especially when working with large datasets.\n  Minimizing the amount of data that needs to be processed is often a\n  crucial step in improving performance.\n\n#### How to measure\n\nOnce a metric has been selected, it is important to decide how to\nmeasure it. A single execution of a query or workload is not a\nsufficient basis for a reliable measurement due to the many variables\nthat can affect performance, such as warehouse startup times and cache\npopulation. For a representative sample, it is recommended to run each\nquery or workload at least 10 times, preferably at different times of\nthe day and on different days. The results can then be aggregated to\nprovide a single, comparable number. Here are a few examples of common\naggregations:\n\n- **Mean/average:** The average of a metric across multiple executions\n  provides a good understanding of what to expect. While the average\n  will not be the exact value for every execution, it is a simple and\n  widely understood calculation that can be used to put performance in\n  the context of a larger pipeline or application.\n\n- **P90 or higher:** When meeting a Service Level Objective (SLO) is the\n  primary goal, edge cases become more important. The 90th percentile\n  (P90) can provide insight into what to expect when conditions are not\n  ideal. This is particularly useful in concurrency testing but can also\n  be applied to other types of performance analysis.\n\n- **Sum across multiple executions:** The sum of a metric across\n  multiple executions can be a useful way to incorporate both the\n  expected performance and the variance into a single metric, although\n  it does not provide an easy way to understand the performance in\n  context.\n\n#### Performance metric anti-patterns\n\nWhen measuring performance, it is important to avoid common pitfalls\nthat can lead to inaccurate conclusions.\n\n- **Basing analysis on a single query execution** - Basing performance\n  conclusions on a single execution of a query should be avoided, as\n  this approach lacks statistical significance. Numerous transient\n  factors can cause a single execution to run unusually fast or slow,\n  leading to flawed assumptions based on a best-case or worst-case\n  scenario rather than on a representative performance sample.\n\n- **Focusing on isolated execution phases** - Avoid focusing on isolated\n  components of query execution, such as compilation time. A longer\n  compilation phase can sometimes result in a more optimized execution\n  plan and a shorter total execution time. The primary metric for\n  analysis should be the total elapsed time for the query, not the\n  duration of its individual phases.\n\n### Define your measurement cadence\n\n#### Overview\n\nWhile there are often specific motivations for measuring performance,\nsuch as investigating a reported issue, establishing a regular cadence\nfor performance measurement is a critical practice. Even basic\nmeasurements, like recording a timestamp and query ID, become more\nvaluable when collected as part of a structured approach.\n\n**Desired Outcome**\n\nA well-defined cadence for performance measurement allows for the\nfocused allocation of time and effort, ensuring that performance\nanalysis is conducted when it is most impactful.\n\n#### Recommendations\n\nPerformance should be measured at several key moments to ensure a\ncomprehensive understanding of the system's behavior. The following\ncatalysts and cadences are recommended:\n\n- **Establish a baseline:** A performance baseline provides a reference\n  point for all future comparisons. Without a baseline, it is difficult\n  to objectively determine if performance has degraded, or to quantify\n  the severity of a performance issue. A defined measurement\n  methodology, combined with a baseline, allows for a straightforward\n  comparison to identify and assess performance problems.\n\n- **Before and after significant changes**: It is important to validate\n  or re-establish a performance baseline before any significant change,\n  such as an application upgrade, a data model alteration, or a\n  substantial data change. This ensures a recent and valid point of\n  comparison. Following the change, performance should be measured again\n  to assess the impact and to establish a new baseline for future\n  analysis.\n\n- **Testing potential changes:** Snowflake's table cloning capabilities\n  provide an efficient and cost-effective way to test the impact of\n  potential changes. This is particularly useful for regression testing,\n  where the goal is to determine if a change will negatively affect\n  performance before it is implemented in production.\n\n- **On a periodic interval:** Regular performance checks are valuable\n  even in the absence of known issues. Periodic measurement can help\n  identify gradual performance degradation caused by changes in data or\n  other subtle factors within an application or pipeline. For workloads\n  with annual peak periods, it may be beneficial to retain performance\n  data, such as that found in QUERY_HISTORY, for longer than the\n  standard retention period to allow for year-over-year comparisons.\n\n### Identifying bottlenecks\n\n#### Overview\n\nIdentifying performance bottlenecks is a critical step in any\noptimization process. To ensure that time and resources are used\neffectively, it is essential to focus on the parts of a query or\nworkload where improvements will have the most significant impact on\noverall performance metrics.\n\n#### Recommendations\n\nA multi-faceted approach is recommended for identifying performance\nbottlenecks. It's best to begin with a holistic understanding of the\napplication's context to focus optimization efforts where they will have\nthe most impact. Analysis can then be performed at two levels using\nSnowflake's native tools.\n\n#### Tools for query-level analysis\n\nFor granular analysis of individual queries, several tools provide\ndetailed insights into the execution plan and performance\ncharacteristics.\n\n- **Query profile:** The \u003Cspan class=\"mark\"\u003Equery profile\u003C/span\u003E offers\n  a detailed visual representation of a query's execution. It is the\n  primary tool for identifying common issues such as poor\n  micro-partition pruning, join explosions, remote spilling, and the\n  specific operators consuming the most resources. The profile displays\n  actual execution statistics after a query has completed (or a partial\n  view while it is running) but is not accessible programmatically. Data\n  is available for 14 days.\n\n- **GET_QUERY_OPERATOR_STATS():** For programmatic access to the data\n  found in the query profile, use the\n  [\u003Cspan class=\"mark\"\u003E\u003Cu\u003EGET_QUERY_OPERATOR_STATS()\u003C/u\u003E\u003C/span\u003E](https://docs.snowflake.com/en/sql-reference/functions/get_query_operator_stats)\n  function. This table function returns detailed, operator-level\n  statistics in a structured format, making it ideal for automated\n  analysis or for capturing performance data for long-term storage and\n  comparison.\n\n- **EXPLAIN:** The\n  [\u003Cu\u003EEXPLAIN\u003C/u\u003E](https://docs.snowflake.com/en/sql-reference/sql/explain)\n  command provides a look at a query's logical execution plan *before*\n  it runs. It is useful for understanding the optimizer's choices but\n  should be treated as an estimate, as it does not contain the actual\n  run-time statistics available in the query profile.\n\n#### Tools for workload-level analysis\n\nAnalyzing performance across an entire workload requires a broader\nperspective. The following ACCOUNT_USAGE views are invaluable for\nidentifying trends and high-impact queries.\n\n- **QUERY_HISTORY:** The [\u003Cu\u003EQUERY_HISTORY\u003C/u\u003E\n  \u003Cu\u003Eview\u003C/u\u003E](https://docs.snowflake.com/en/sql-reference/account-usage/query_history)\n  is the foundational tool for workload analysis. It contains a\n  comprehensive record of executed queries, allowing for the\n  identification of performance patterns. It is particularly useful for:\n\n  - Finding queries with specific characteristics, such as long queue\n    times (queued_overload_time).\n\n  - Comparing workload performance against a baseline, especially when\n    using query tags for easy filtering.\n\n  - Aggregating metrics for queries that have the same structure but\n    different literal values, using the query_parameterized_hash.\n\n- **Specialized views:**\n\n  - [\u003Cu\u003EAGGERGATE_QUERY_HISTORY\u003C/u\u003E](https://docs.snowflake.com/en/sql-reference/account-usage/aggregate_query_history):\n    This view is comparable to QUERY_HISTORY when using hybrid tables.\n\n  - [\u003Cu\u003EQUERY_ATTRIBUTION_HISTORY\u003C/u\u003E](https://docs.snowflake.com/en/sql-reference/account-usage/query_attribution_history)**:**\n    This view is designed to provide a more accurate picture of the\n    compute cost of a query, taking concurrency into account. It is\n    excellent when the primary concern is attributing costs to specific\n    queries or workloads.\n\n  - [\u003Cu\u003EQUERY_INSIGHTS\u003C/u\u003E](https://docs.snowflake.com/en/sql-reference/account-usage/query_insights)**:**\n    This view proactively identifies queries that match known\n    performance anti-patterns. It can help pinpoint queries to\n    investigate, but it is important to note that not every insight\n    requires immediate action. See [\u003Cu\u003Ethe documentation for details on\n    the types of insights currently available and what they\n    mean\u003C/u\u003E](https://docs.snowflake.com/en/user-guide/query-insights).\n\n  - [\u003Cu\u003ETABLE_QUERY_PRUNING_HISTORY\u003C/u\u003E](https://docs.snowflake.com/sql-reference/account-usage/table_query_pruning_history)\n    and\n    [\u003Cu\u003ECOLUMN_QUERY_PRUNING_HISTORY\u003C/u\u003E](https://docs.snowflake.com/sql-reference/account-usage/table_query_pruning_history)**:**\n    These views provide targeted data on micro-partition pruning\n    effectiveness. Analyzing this data can help identify tables that may\n    benefit from a clustering key. See [\u003Cu\u003ETim Sander’s article on using\n    the pruning history\n    views\u003C/u\u003E](https://medium.com/snowflake/supercharging-snowflake-pruning-using-new-account-usage-views-52530b24bf2e)\n    for more information.\n\n### Meticulously validating AI suggestions\n\n#### Overview\n\nAI can be a source of suggestions for performance improvement. However,\nall suggestions require critical evaluation and comprehensive testing\nbefore implementation. An unverified recommendation can waste time and\ncredits or even degrade performance.\n\n#### Recommendations\n\n- **Apply foundational knowledge** Evaluate AI suggestions against a\n  foundational understanding of the Snowflake platform. For complex or\n  costly recommendations, consult the Snowflake documentation, conduct\n  further research, or engage with Snowflake staff like Sales Engineers,\n  Solutions Architects, and if appropriate, Technical Support.\n\n- **Consider data timeliness** AI training data can be months or years\n  old, failing to reflect Snowflake's rapid evolution. A suggestion\n  might be correct based on old information but suboptimal given new\n  features.\n\n- **Test thoroughly** Performance improvements involve time and cost.\n  Thoroughly test all suggestions in a controlled environment to verify\n  they meet business requirements. Proper validation prevents unexpected\n  issues, saving resources and improving outcomes.\n\n## Conclusion\n\nA strong understanding of the Snowflake platform provides the necessary\ncontext to assess whether an AI suggestion warrants further\ninvestigation and testing.\n\nFor additional information, see [\u003Cu\u003EOptimizing performance in\nSnowflake\u003C/u\u003E](https://docs.snowflake.com/en/guides-overview-performance)\n",":type":"text/x-markdown","multiValue":false},"quickstartArticleLogoImage":{"dataType":"string","title":"Quickstart Article Logo Image",":type":"text/plain","multiValue":false}},"elementsOrder":["quickstartArticleBody","quickstartArticleLogoImage"],":items":{},":itemsOrder":[],"model":"snowflake-site/models/quickstart-article"},"flexible_column_cont":{"id":"flexible-column-container-48b64c4a64","type":"2-column-75-25","alignColumns":"top","containerMaxWidth":"extra-large","topPadding":"none","bottomPadding":"none","spaceBetween":"none","reverseOnMobile":false,"carouselOnMobile":false,"backgroundImageOption":"none","flexible_column_content_container_1":{"layout":"SIMPLE","id":"container-e641f7fe50",":type":"snowflake-site/components/flexible-column-container/flexible-column-content-container",":items":{"quickstart_last_modi":{"id":"quickstart-last-modified-26b5077637","icon":{"id":"icon","icon":"calendar",":type":"snowflake-site/components/icon","appliedCssClassNames":"snowflake-icon-blue"},"lastModifiedDatePrefix":"Updated","lastModifiedDate":"2026-06-17",":type":"snowflake-site/components/quickstart/quickstart-last-modified","appliedCssClassNames":"snowflake-responsive-component-top-padding-small"},"text":{"id":"text-8c5fa5e074","additionalClasses":"qs-disclaimer-text","text":"\u003Cp\u003E\u003Cspan style=\"color: #666;\"\u003EThis content is provided as is, and is not maintained on an ongoing basis. It may be out of date with current Snowflake instances\u003C/span\u003E\u003C/p\u003E\r\n","richText":true,":type":"snowflake-site/components/text","appliedCssClassNames":"snowflake-responsive-component-top-padding-small"}},":itemsOrder":["quickstart_last_modi","text"]},"flexible_column_content_container_2":{"layout":"SIMPLE","id":"container-112c9545b8",":type":"snowflake-site/components/flexible-column-container/flexible-column-content-container",":items":{},":itemsOrder":[]},"isBlogPage":false,"isActiveTOC":false,":type":"snowflake-site/components/flexible-column-container"}},":itemsOrder":["contentfragment","flexible_column_cont"]},"flexible_column_content_container_2":{"layout":"SIMPLE","id":"container-0cae58483c",":type":"snowflake-site/components/flexible-column-container/flexible-column-content-container",":items":{"quickstart_table_of_":{"layout":"SIMPLE","id":"container-a5766a633a","isDeveloperGuidesPage":false,":type":"snowflake-site/components/quickstart/quickstart-table-of-content/quickstart-table-of-content-container",":items":{"quickstart_table_of_":{"id":"quickstart-table-of-content-36402171b3",":type":"snowflake-site/components/quickstart/quickstart-table-of-content","fragmentPath":"/content/dam/snowflake-site/en/content-fragments/quickstarts/well-architected-framework-performance","headings":["\u003Ch2\u003EOverview\u003C/h2\u003E","\u003Ch2\u003EPrinciples and recommendations\u003C/h2\u003E","\u003Ch2\u003EEstablish and validate performance objectives\u003C/h2\u003E","\u003Ch2\u003EFoundational First Steps\u003C/h2\u003E","\u003Ch2\u003ELeveraging elasticity for performance\u003C/h2\u003E","\u003Ch2\u003ETest-first design: Building performance into every stage\u003C/h2\u003E","\u003Ch2\u003EOptimize data architecture and access\u003C/h2\u003E","\u003Ch2\u003EData access\u003C/h2\u003E","\u003Ch2\u003EArchitect for scalability and workload partitioning\u003C/h2\u003E","\u003Ch2\u003EOptimize virtual warehouses for cost and performance\u003C/h2\u003E","\u003Ch2\u003EImplement strategies for handling concurrent queries\u003C/h2\u003E","\u003Ch2\u003EUtilize Snowflake's serverless features\u003C/h2\u003E","\u003Ch2\u003ELeverage Dynamic Tables for data engineering pipelines\u003C/h2\u003E","\u003Ch2\u003EImplement continuous performance monitoring and optimization\u003C/h2\u003E","\u003Ch2\u003EConclusion\u003C/h2\u003E"]},"quickstart_button":{"id":"quickstart-button-cff10bf2dc",":type":"snowflake-site/components/quickstart/quickstart-button","fragmentPath":"/content/dam/snowflake-site/en/content-fragments/quickstarts/well-architected-framework-performance","appliedCssClassNames":"snowflake-responsive-component-top-padding-none"}},":itemsOrder":["quickstart_table_of_","quickstart_button"]}},":itemsOrder":["quickstart_table_of_"]},"isBlogPage":false,"isActiveTOC":false,":type":"snowflake-site/components/flexible-column-container"},"markup_editor":{"id":"markup-editor-bcedbdcabe","title":"Page CSS","cssContent":"#quickstart-template-main-flexible-container{padding:24px}#quickstart-template-main-flexible-container \u003E .snowflake-flexible-column-container-items{grid-template-columns:1fr 0}.qs-disclaimer-text p \u003E span{font-size:15px !important}@media (min-width:768px){#quickstart-template-main-flexible-container{padding:24px 32px}#quickstart-template-main-flexible-container \u003E .snowflake-flexible-column-container-items{grid-template-columns:7fr 3fr;gap:48px}}@media (max-width:767px){#quickstart-template-main-flexible-container \u003E .snowflake-flexible-column-container-items{gap:0}}@media (min-width:1024px){#quickstart-template-main-flexible-container{padding:0 92px 48px 92px}#quickstart-template-main-flexible-container \u003E .snowflake-flexible-column-container-items{gap:117px}}","isGSAPEnabled":false,":type":"snowflake-site/components/markup-editor"}},":itemsOrder":["quickstart_hero","flexible_column_cont","markup_editor"],":type":"wcm/foundation/components/responsivegrid"},"modal_container":{"layout":"SIMPLE","id":"container-4662f9a65f",":type":"snowflake-site/components/modal/modal-container",":items":{},":itemsOrder":[]},"experiencefragment-footer":{"id":"experiencefragment-19bfab3b0d","localizedFragmentVariationPath":"/content/experience-fragments/snowflake-site/language-masters/en/site/footer/master/jcr:content","configured":true,":type":"snowflake-site/components/experiencefragment",":items":{"root":{"additionalClasses":"sf-footer","layout":"SIMPLE","id":"container-911ba40a63",":type":"snowflake-site/components/container",":items":{"container_copy":{"additionalClasses":"sf-footer__inner","columnClassNames":{"flexible_column_cont":"aem-GridColumn aem-GridColumn--default--12"},"gridClassNames":"aem-Grid aem-Grid--12 aem-Grid--default--12","layout":"RESPONSIVE_GRID","columnCount":12,"id":"container-92ec7d264a",":type":"snowflake-site/components/container",":items":{"flexible_column_cont":{"id":"flexible-column-container-3c9e7143cb","type":"1-column","alignColumns":"top","containerMaxWidth":"extra-large","topPadding":"medium","bottomPadding":"extra-small","spaceBetween":"small","reverseOnMobile":false,"carouselOnMobile":false,"propertiesCSSClasses":"sf-footer-grid","backgroundImageOption":"none","flexible_column_content_container_1":{"layout":"SIMPLE","id":"container-a4f4ded78b",":type":"snowflake-site/components/flexible-column-container/flexible-column-content-container",":items":{"container":{"additionalClasses":"sf-footer-grid__inner","columnClassNames":{"container":"aem-GridColumn aem-GridColumn--default--12","container_1622723482":"aem-GridColumn aem-GridColumn--default--12","container_copy_copy_":"aem-GridColumn aem-GridColumn--default--12","container_copy_copy":"aem-GridColumn aem-GridColumn--default--12","container_copy":"aem-GridColumn aem-GridColumn--default--12"},"gridClassNames":"aem-Grid aem-Grid--12 aem-Grid--default--12","layout":"RESPONSIVE_GRID","columnCount":12,"id":"container-161c27cdad",":type":"snowflake-site/components/container",":items":{"container_1622723482":{"additionalClasses":"sf-footer__column","columnClassNames":{"container":"aem-GridColumn aem-GridColumn--default--12"},"gridClassNames":"aem-Grid aem-Grid--12 aem-Grid--default--12","layout":"RESPONSIVE_GRID","columnCount":12,"id":"container-8e95b4c7b6",":type":"snowflake-site/components/container",":items":{"container":{"additionalClasses":"sf-footer__newsletter-group","columnClassNames":{"text":"aem-GridColumn aem-GridColumn--default--12","marketo_v2":"aem-GridColumn aem-GridColumn--default--12"},"gridClassNames":"aem-Grid aem-Grid--12 aem-Grid--default--12","layout":"RESPONSIVE_GRID","columnCount":12,"id":"container-0d24a4d9f5",":type":"snowflake-site/components/container",":items":{"text":{"id":"text-6c81763971","additionalClasses":"sf-footer__newsletter-title","text":"\u003Cp\u003E\u003Cb\u003ESubscribe to our monthly newsletter\u003C/b\u003E\u003C/p\u003E\r\n\u003Cp\u003EStay up to date on Snowflake’s latest products, expert insights and resources—right in your inbox!\u003C/p\u003E\r\n","richText":true,":type":"snowflake-site/components/text","appliedCssClassNames":"text-size-regular text-color-text-04"},"marketo_v2":{"id":"marketo-v2-663e9bb6af","marketoForm":{"edit":false,"successUrl":null,"formId":"45871","hidden":null,"script":null,"values":null},"munchkinId":"252-RFO-227","serverInstance":"252-RFO-227.mktoweb.com","marketoConfigured":true,"formConfigured":true,":type":"snowflake-site/components/form/marketo-v2"}},":itemsOrder":["text","marketo_v2"],"appliedCssClassNames":"snowflake-responsive-container-inner-padding-small"}},":itemsOrder":["container"],"appliedCssClassNames":"snowflake-responsive-container-inner-padding-small"},"container":{"columnClassNames":{"text_copy":"aem-GridColumn aem-GridColumn--default--12","text":"aem-GridColumn aem-GridColumn--default--12"},"gridClassNames":"aem-Grid aem-Grid--12 aem-Grid--default--12","layout":"RESPONSIVE_GRID","columnCount":12,"id":"container-b803bf4f11",":type":"snowflake-site/components/container",":items":{"text":{"id":"text-15f5fb19d0","additionalClasses":"sf-footer__link-group","text":"\u003Cp class=\"sf-footer__column-title\"\u003EProduct\u003C/p\u003E\r\n\u003Cul\u003E\r\n\u003Cli\u003E\u003Ca href=\"https://www.snowflake.com/en/product/platform/\"\u003EPlatform\u003C/a\u003E\u003C/li\u003E\r\n\u003Cli\u003E\u003Ca href=\"/en/product/snowflake-cowork/\"\u003ESnowflake CoWork\u003C/a\u003E\u003C/li\u003E\r\n\u003Cli\u003E\u003Ca href=\"https://www.snowflake.com/en/product/data-engineering/\"\u003EData Engineering\u003C/a\u003E\u003C/li\u003E\r\n\u003Cli\u003E\u003Ca href=\"https://www.snowflake.com/en/product/analytics/\"\u003EAnalytics\u003C/a\u003E\u003C/li\u003E\r\n\u003Cli\u003E\u003Ca href=\"https://www.snowflake.com/en/product/ai/\"\u003EAI\u003C/a\u003E\u003C/li\u003E\r\n\u003Cli\u003E\u003Ca href=\"https://www.snowflake.com/en/product/applications-and-collaboration/\"\u003EApplications &amp; Collaboration\u003C/a\u003E\u003C/li\u003E\r\n\u003Cli\u003E\u003Ca href=\"https://www.snowflake.com/en/pricing-options/\"\u003EPricing\u003C/a\u003E\u003C/li\u003E\r\n\u003C/ul\u003E\r\n","richText":true,":type":"snowflake-site/components/text","appliedCssClassNames":"text-size-small text-color-text-04"},"text_copy":{"id":"text-95e89d61b8","additionalClasses":"sf-footer__link-group","text":"\u003Cp class=\"sf-footer__column-title\"\u003ESupport\u003C/p\u003E\r\n\u003Cul\u003E\r\n\u003Cli\u003E\u003Ca href=\"https://www.snowflake.com/en/support/\"\u003ESupport\u003C/a\u003E\u003C/li\u003E\r\n\u003Cli\u003E\u003Ca href=\"https://www.snowflake.com/en/legal/addenda/priority-support-services-description/\"\u003EPriority Support\u003C/a\u003E\u003C/li\u003E\r\n\u003Cli\u003E\u003Ca href=\"https://status.snowflake.com/\" target=\"_blank\" rel=\"noopener noreferrer\"\u003EStatus\u003C/a\u003E\u003C/li\u003E\r\n\u003C/ul\u003E\r\n","richText":true,":type":"snowflake-site/components/text","appliedCssClassNames":"text-size-small text-color-text-04"}},":itemsOrder":["text","text_copy"],"appliedCssClassNames":"snowflake-responsive-container-inner-padding-medium"},"container_copy_copy":{"columnClassNames":{"text":"aem-GridColumn aem-GridColumn--default--12"},"gridClassNames":"aem-Grid aem-Grid--12 aem-Grid--default--12","layout":"RESPONSIVE_GRID","columnCount":12,"id":"container-f0b25228c3",":type":"snowflake-site/components/container",":items":{"text":{"id":"text-0d2072f769","additionalClasses":"sf-footer__link-group","text":"\u003Cp class=\"sf-footer__column-title\"\u003E\u003Ca href=\"/en/solutions/industries/\"\u003EIndustries\u003C/a\u003E\u003C/p\u003E\r\n\u003Cul\u003E\r\n\u003Cli\u003E\u003Ca href=\"/en/solutions/industries/advertising-media-entertainment/\"\u003EAdvertising, Media &amp; Entertainment\u003C/a\u003E\u003C/li\u003E\r\n\u003Cli\u003E\u003Ca href=\"/en/solutions/industries/financial-services/\"\u003EFinancial Services\u003C/a\u003E\u003C/li\u003E\r\n\u003Cli\u003E\u003Ca href=\"/en/solutions/industries/healthcare-and-life-sciences/\"\u003EHealthcare &amp; Life Sciences\u003C/a\u003E\u003C/li\u003E\r\n\u003Cli\u003E\u003Ca href=\"/en/solutions/industries/manufacturing/\"\u003EManufacturing\u003C/a\u003E\u003C/li\u003E\r\n\u003Cli\u003E\u003Ca href=\"/en/solutions/industries/public-sector/\"\u003EPublic Sector\u003C/a\u003E\u003C/li\u003E\r\n\u003Cli\u003E\u003Ca href=\"/en/solutions/industries/retail-consumer-goods/\"\u003ERetail &amp; Consumer Goods\u003C/a\u003E\u003C/li\u003E\r\n\u003Cli\u003E\u003Ca href=\"/en/solutions/industries/telecom/\"\u003ETelecom\u003C/a\u003E\u003C/li\u003E\r\n\u003Cli\u003E\u003Ca href=\"https://www.snowflake.com/en/solutions/industries/technology/\"\u003ETechnology\u003C/a\u003E\u003C/li\u003E\r\n\u003C/ul\u003E\r\n","richText":true,":type":"snowflake-site/components/text","appliedCssClassNames":"text-size-small text-color-text-04"}},":itemsOrder":["text"],"appliedCssClassNames":"snowflake-responsive-container-inner-padding-small"},"container_copy":{"columnClassNames":{"text":"aem-GridColumn aem-GridColumn--default--12"},"gridClassNames":"aem-Grid aem-Grid--12 aem-Grid--default--12","layout":"RESPONSIVE_GRID","columnCount":12,"id":"container-fa4e1b6141",":type":"snowflake-site/components/container",":items":{"text":{"id":"text-2c3b8b5120","additionalClasses":"sf-footer__link-group","text":"\u003Cp class=\"sf-footer__column-title\"\u003ECompany\u003C/p\u003E\r\n\u003Cul\u003E\r\n\u003Cli\u003E\u003Ca href=\"https://www.snowflake.com/en/company/overview/about-snowflake/\"\u003EAbout Snowflake\u003C/a\u003E\u003C/li\u003E\r\n\u003Cli\u003E\u003Ca href=\"https://www.snowflake.com/en/company/overview/leadership-and-board/\"\u003ELeadership &amp; Board\u003C/a\u003E\u003C/li\u003E\r\n\u003Cli\u003E\u003Ca href=\"https://careers.snowflake.com/us/en\" target=\"_blank\" rel=\"noopener noreferrer\"\u003ECareers\u003C/a\u003E\u003C/li\u003E\r\n\u003Cli\u003E\u003Ca href=\"https://investors.snowflake.com/overview/default.aspx\" target=\"_blank\" rel=\"noopener noreferrer\"\u003EInvestor Relations\u003C/a\u003E\u003C/li\u003E\r\n\u003Cli\u003E\u003Ca href=\"https://trust.snowflake.com/\" target=\"_blank\" rel=\"noopener noreferrer\"\u003ETrust Center\u003C/a\u003E\u003C/li\u003E\r\n\u003Cli\u003E\u003Ca href=\"https://www.snowflake.com/brand-guidelines/\" target=\"_blank\" rel=\"noopener noreferrer\"\u003EBrand Guidelines\u003C/a\u003E\u003C/li\u003E\r\n\u003Cli\u003E\u003Ca href=\"https://www.snowflake.com/en/contact/\"\u003EContact\u003C/a\u003E\u003C/li\u003E\r\n\u003Cli\u003E\u003Ca href=\"https://www.snowflake.com/en/news/\"\u003ENewsroom\u003C/a\u003E\u003C/li\u003E\r\n\u003Cli\u003E\u003Ca href=\"https://www.snowflake.com/en/company/overview/esg/\"\u003EEnvironmental, Social &amp; Governance\u003C/a\u003E\u003C/li\u003E\r\n\u003Cli\u003E\u003Ca href=\"https://www.snowflake.com/en/company/overview/snowflake-ventures/\"\u003ESnowflake Ventures\u003C/a\u003E\u003C/li\u003E\r\n\u003Cli\u003E\u003Ca href=\"https://www.snowflake.com/en/company/overview/end-data-disparity/\"\u003EEnd Data Disparity\u003C/a\u003E\u003C/li\u003E\r\n\u003Cli\u003E\u003Ca href=\"/en/summit/\"\u003ESnowflake Summit 26\u003C/a\u003E\u003C/li\u003E\r\n\u003C/ul\u003E\r\n","richText":true,":type":"snowflake-site/components/text","appliedCssClassNames":"text-size-small text-color-text-04"}},":itemsOrder":["text"],"appliedCssClassNames":"snowflake-responsive-container-inner-padding-small"},"container_copy_copy_":{"columnClassNames":{"text":"aem-GridColumn aem-GridColumn--default--12"},"gridClassNames":"aem-Grid aem-Grid--12 aem-Grid--default--12","layout":"RESPONSIVE_GRID","columnCount":12,"id":"container-18dbc832a0",":type":"snowflake-site/components/container",":items":{"text":{"id":"text-4e5cd890bb","additionalClasses":"sf-footer__link-group","text":"\u003Cp class=\"sf-footer__column-title\"\u003ELearn\u003C/p\u003E\r\n\u003Cul\u003E\r\n\u003Cli\u003E\u003Ca href=\"https://snowflake.com/en/resources/\"\u003EResource Library\u003C/a\u003E\u003C/li\u003E\r\n\u003Cli\u003E\u003Ca href=\"/en/webinars/demo/\"\u003ELive Demos\u003C/a\u003E\u003C/li\u003E\r\n\u003Cli\u003E\u003Ca href=\"https://www.snowflake.com/en/fundamentals/\"\u003EFundamentals\u003C/a\u003E\u003C/li\u003E\r\n\u003Cli\u003E\u003Ca href=\"https://www.snowflake.com/en/resources/learn/training/\"\u003ETraining\u003C/a\u003E\u003C/li\u003E\r\n\u003Cli\u003E\u003Ca href=\"https://www.snowflake.com/en/resources/learn/certifications/\"\u003ECertifications\u003C/a\u003E\u003C/li\u003E\r\n\u003Cli\u003E\u003Ca rel=\"noopener noreferrer\" target=\"_blank\" href=\"https://learn.snowflake.com/en/\"\u003ESnowflake University\u003C/a\u003E\u003C/li\u003E\r\n\u003Cli\u003E\u003Ca href=\"https://www.snowflake.com/en/developers/guides\"\u003EDeveloper Guides\u003C/a\u003E\u003C/li\u003E\r\n\u003Cli\u003E\u003Ca rel=\"noopener noreferrer\" target=\"_blank\" href=\"https://docs.snowflake.com/\"\u003EDocumentation\u003C/a\u003E\u003C/li\u003E\r\n\u003Cli\u003E\u003Ca href=\"/en/data-governance/\"\u003EData Governance\u003C/a\u003E\u003C/li\u003E\r\n\u003C/ul\u003E\r\n","richText":true,":type":"snowflake-site/components/text","appliedCssClassNames":"text-size-small text-color-text-04"}},":itemsOrder":["text"],"appliedCssClassNames":"snowflake-responsive-container-inner-padding-small"}},":itemsOrder":["container_1622723482","container","container_copy_copy","container_copy","container_copy_copy_"],"appliedCssClassNames":"snowflake-responsive-container-inner-padding-small"}},":itemsOrder":["container"]},"isBlogPage":false,"isActiveTOC":false,":type":"snowflake-site/components/flexible-column-container"}},":itemsOrder":["flexible_column_cont"],"appliedCssClassNames":"snowflake-container snowflake-responsive-container-inner-padding-small"},"container_573483281_":{"additionalClasses":"sf-footer__bottom","columnClassNames":{"container_112062425":"aem-GridColumn aem-GridColumn--default--12"},"gridClassNames":"aem-Grid aem-Grid--12 aem-Grid--default--12","layout":"RESPONSIVE_GRID","columnCount":12,"id":"container-2f5c20dbe8",":type":"snowflake-site/components/container",":items":{"container_112062425":{"columnClassNames":{"flexible_column_cont":"aem-GridColumn aem-GridColumn--default--12"},"gridClassNames":"aem-Grid aem-Grid--12 aem-Grid--default--12","layout":"RESPONSIVE_GRID","columnCount":12,"id":"container-f34094aa1e",":type":"snowflake-site/components/container",":items":{"flexible_column_cont":{"id":"flexible-column-container-d8b9cf10ae","type":"1-column","alignColumns":"top","containerMaxWidth":"extra-large","topPadding":"none","bottomPadding":"none","spaceBetween":"small","reverseOnMobile":false,"carouselOnMobile":false,"backgroundImageOption":"none","flexible_column_content_container_1":{"layout":"SIMPLE","id":"container-1402454a4c",":type":"snowflake-site/components/flexible-column-container/flexible-column-content-container",":items":{"container":{"additionalClasses":"sf-footer__legal-container","columnClassNames":{"container":"aem-GridColumn aem-GridColumn--default--12","text_copy_copy_16360":"aem-GridColumn aem-GridColumn--default--12","markup_editor":"aem-GridColumn aem-GridColumn--default--12"},"gridClassNames":"aem-Grid aem-Grid--12 aem-Grid--default--12","layout":"RESPONSIVE_GRID","columnCount":12,"id":"container-0584a967be",":type":"snowflake-site/components/container",":items":{"container":{"columnClassNames":{"image":"aem-GridColumn aem-GridColumn--default--12"},"gridClassNames":"aem-Grid aem-Grid--12 aem-Grid--default--12","layout":"RESPONSIVE_GRID","columnCount":12,"id":"container-72a8429c9f",":type":"snowflake-site/components/container",":items":{"image":{"id":"image-bf3f8279ae","additionalClasses":"sf-footer__logo","alt":"Snowflake logo","imageLink":{"valid":true,"url":"/en/"},"src":"https://www.snowflake.com/content/experience-fragments/snowflake-site/language-masters/en/site/footer/master/_jcr_content/root/container_573483281_/container_112062425/flexible_column_cont/flexible_column_content_container_1/container/container/image.coreimg.svg/1747882370694/nav-icon-snowflake-bug.svg","lazyEnabled":true,"width":"64","height":"64",":type":"snowflake-site/components/image"}},":itemsOrder":["image"],"appliedCssClassNames":"snowflake-responsive-container-inner-padding-extra-small"},"text_copy_copy_16360":{"id":"text-5510157026","additionalClasses":"sf-footer__legal-links","text":"\u003Cul\u003E\r\n\u003Cli\u003E© 2026 Snowflake Inc. All Rights Reserved\u003C/li\u003E\r\n\u003Cli\u003E\u003Ca href=\"https://www.snowflake.com/en/legal/privacy/privacy-policy/\"\u003EPrivacy Policy\u003C/a\u003E\u003C/li\u003E\r\n\u003Cli\u003E\u003Ca href=\"https://snowflake.com/en/legal/snowflake-site-terms/\"\u003ESite Terms\u003C/a\u003E\u003C/li\u003E\r\n\u003Cli\u003E\u003Ca href=\"https://info.snowflake.com/Preference-center.html\"\u003ECommunication Preferences\u003C/a\u003E\u003C/li\u003E\r\n\u003Cli\u003E\u003Cbutton id=\"ot-sdk-btn\" class=\"ot-sdk-show-settings\"\u003ECookie Settings\u003C/button\u003E\u003C/li\u003E\r\n\u003Cli\u003E\u003Ca href=\"https://www.snowflake.com/en/legal/privacy/privacy-policy/#12\"\u003EDo Not Share My Personal Information\u003C/a\u003E\u003C/li\u003E\r\n\u003Cli\u003E\u003Ca href=\"https://www.snowflake.com/en/legal/\"\u003ELegal\u003C/a\u003E\u003C/li\u003E\r\n\u003C/ul\u003E\r\n","richText":true,":type":"snowflake-site/components/text","appliedCssClassNames":"text-size-small text-color-text-04"},"markup_editor":{"id":"markup-editor-4abb74eff5","title":" ","htmlContent":"\u003Cdiv class=\"sf-footer__social\"\u003E\r\n\u003Cdiv data-testid=\"snowflake-footer-twitter\" class=\"snowflake-button-icon snowflake-button-white snowflake-footer-social-item\"\u003E\u003Cdiv class=\"snowflake-button-icon \"\u003E\u003Ca href=\"https://x.com/Snowflake\" data-testid=\"button-external\" aria-label=\"X (Twitter)\" role=\"button\" class=\"snowflake-button-container\" title=\"X (Twitter)\" tabindex=\"0\" target=\"_blank\" rel=\"noreferrer\"\u003E\u003Cdiv data-testid=\"button-icon-wrapper\"\u003E\u003Csvg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 59 53\" class=\"button-icon\"\u003E\u003Cpath fill=\"currentColor\" d=\"M46.614 0h9.044L35.8 22.49 59 53H40.795L26.54 34.46 10.223 53H1.18l21.036-24.055L0 0h18.657l12.878 16.937zM43.45 47.72h5.013L16.023 5.085h-5.387z\"\u003E\u003C/path\u003E\u003C/svg\u003E\u003C/div\u003E\u003C/a\u003E\u003Cdiv\u003E\u003C/div\u003E\u003C/div\u003E\u003C/div\u003E\u003Cdiv data-testid=\"snowflake-footer-linkedin\" class=\"snowflake-button-icon snowflake-button-white snowflake-footer-social-item\"\u003E\u003Cdiv class=\"snowflake-button-icon \"\u003E\u003Ca href=\"https://www.linkedin.com/company/3653845\" data-testid=\"button-external\" aria-label=\"LinkedIn\" role=\"button\" class=\"snowflake-button-container\" title=\"LinkedIn\" tabindex=\"0\" target=\"_blank\" rel=\"noreferrer\"\u003E\u003Cdiv data-testid=\"button-icon-wrapper\"\u003E\u003Csvg xmlns=\"http://www.w3.org/2000/svg\" fill=\"currentColor\" viewBox=\"0 0 24 24\" class=\"button-icon\"\u003E\u003Cpath d=\"M22.223 0H1.772C.792 0 0 .773 0 1.73v20.536C0 23.222.792 24 1.772 24h20.451c.98 0 1.777-.778 1.777-1.73V1.73C24 .773 23.203 0 22.223 0ZM7.12 20.452H3.558V8.995H7.12v11.457ZM5.34 7.434a2.064 2.064 0 1 1 0-4.125 2.063 2.063 0 0 1 0 4.125Zm15.112 13.018h-3.558v-5.57c0-1.326-.024-3.037-1.852-3.037-1.851 0-2.133 1.449-2.133 2.944v5.663H9.356V8.995h3.413v1.566h.047c.473-.9 1.636-1.852 3.365-1.852 3.605 0 4.27 2.372 4.27 5.457v6.286Z\"\u003E\u003C/path\u003E\u003C/svg\u003E\u003C/div\u003E\u003C/a\u003E\u003Cdiv\u003E\u003C/div\u003E\u003C/div\u003E\u003C/div\u003E\u003Cdiv data-testid=\"snowflake-footer-facebook\" class=\"snowflake-button-icon snowflake-button-white snowflake-footer-social-item\"\u003E\u003Cdiv class=\"snowflake-button-icon \"\u003E\u003Ca href=\"https://www.facebook.com/snowflakedb/\" data-testid=\"button-external\" aria-label=\"Facebook\" role=\"button\" class=\"snowflake-button-container\" title=\"Facebook\" tabindex=\"0\" target=\"_blank\" rel=\"noreferrer\"\u003E\u003Cdiv data-testid=\"button-icon-wrapper\"\u003E\u003Csvg xmlns=\"http://www.w3.org/2000/svg\" fill=\"currentColor\" viewBox=\"0 0 24 24\" class=\"button-icon\"\u003E\u003Cpath d=\"M24 12c0-6.627-5.373-12-12-12S0 5.373 0 12c0 5.99 4.388 10.954 10.125 11.854V15.47H7.078V12h3.047V9.356c0-3.007 1.792-4.668 4.533-4.668 1.312 0 2.686.234 2.686.234v2.953H15.83c-1.491 0-1.956.925-1.956 1.875V12h3.328l-.532 3.469h-2.796v8.385C19.612 22.954 24 17.99 24 12Z\"\u003E\u003C/path\u003E\u003C/svg\u003E\u003C/div\u003E\u003C/a\u003E\u003Cdiv\u003E\u003C/div\u003E\u003C/div\u003E\u003C/div\u003E\u003Cdiv data-testid=\"snowflake-footer-youtube\" class=\"snowflake-button-icon snowflake-button-white snowflake-footer-social-item\"\u003E\u003Cdiv class=\"snowflake-button-icon \"\u003E\u003Ca href=\"https://www.youtube.com/user/snowflakecomputing\" data-testid=\"button-external\" aria-label=\"YouTube\" role=\"button\" class=\"snowflake-button-container\" title=\"YouTube\" tabindex=\"0\" target=\"_blank\" rel=\"noreferrer\"\u003E\u003Cdiv data-testid=\"button-icon-wrapper\"\u003E\u003Csvg xmlns=\"http://www.w3.org/2000/svg\" fill=\"currentColor\" viewBox=\"0 0 24 24\" class=\"button-icon\"\u003E\u003Cpath d=\"M23.76 7.2s-.233-1.655-.955-2.381c-.914-.956-1.936-.961-2.405-1.017-3.356-.244-8.395-.244-8.395-.244h-.01s-5.039 0-8.395.244c-.469.056-1.49.06-2.405 1.017C.473 5.545.244 7.2.244 7.2S0 9.145 0 11.086v1.819c0 1.94.24 3.886.24 3.886s.233 1.654.95 2.38c.915.957 2.115.924 2.65 1.027 1.92.183 8.16.24 8.16.24s5.044-.01 8.4-.249c.469-.056 1.49-.06 2.405-1.017.722-.727.956-2.381.956-2.381S24 14.85 24 12.905v-1.819c0-1.94-.24-3.886-.24-3.886ZM9.52 15.113V8.367l6.483 3.385-6.483 3.36Z\"\u003E\u003C/path\u003E\u003C/svg\u003E\u003C/div\u003E\u003C/a\u003E\u003Cdiv\u003E\u003C/div\u003E\u003C/div\u003E\u003C/div\u003E\r\n\u003C/div\u003E","isGSAPEnabled":false,":type":"snowflake-site/components/markup-editor"}},":itemsOrder":["container","text_copy_copy_16360","markup_editor"],"appliedCssClassNames":"snowflake-responsive-container-inner-padding-none"}},":itemsOrder":["container"]},"isBlogPage":false,"isActiveTOC":false,":type":"snowflake-site/components/flexible-column-container"}},":itemsOrder":["flexible_column_cont"],"appliedCssClassNames":"snowflake-container snowflake-responsive-container-inner-padding-small"}},":itemsOrder":["container_112062425"],"appliedCssClassNames":"snowflake-responsive-container-inner-padding-none"},"markup_editor_copy":{"id":"markup-editor-ec1716177c","title":"New css","cssContent":".snowflake-image-container img{background-color:transparent}div.snowflake-person-chip-avatar{width:80px !important}#snowflake-blog-template-main-container .aem-GridColumn:has(.vertical-video){background-color:#000;border-radius:16px;overflow:hidden}#snowflake-blog-template-main-container .vertical-video{max-width:240px;margin-left:auto;margin-right:auto}@media screen and (min-width:1367px){.dynamic .heading-1-v2 .snowflake-title-v2-line{font-size:72px !important;line-height:60px !important}}.snowflake-flexible-column-container-items-alignment-match-height .download-card,.snowflake-flexible-column-container-items-alignment-match-height .download-card\u003E.container{height:100%}.download-card div.code-toolbar\u003E.toolbar .copy-to-clipboard-button{background-color:white;border:1px solid #a9e1f6;margin-right:4px;top:6px;border-radius:16px;height:26px;width:40px}.download-card .snowflake-code-snippet\u003Ediv.code-toolbar\u003E.toolbar\u003E.toolbar-item\u003Ebutton:before{content:'';background-image:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 24 24' fill='none' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='9' y='9' width='13' height='13' rx='2' ry='2' style='stroke:%23249EDC;'%3E%3C/rect%3E%3Cpath d='M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1' style='stroke:%23249EDC;'%3E%3C/path%3E%3C/svg%3E\");background-size:auto 65%;background-position:center;background-repeat:no-repeat;top:0;left:0;width:100%;height:100%}.download-card .snowflake-code-snippet\u003Ediv.code-toolbar\u003E.toolbar\u003E.toolbar-item\u003Ebutton:hover:before{background-image:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 24 24' fill='none' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='9' y='9' width='13' height='13' rx='2' ry='2' style='stroke:%23fff;'%3E%3C/rect%3E%3Cpath d='M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1' style='stroke:%23fff;'%3E%3C/path%3E%3C/svg%3E\")}.download-card\u003Ediv{background-color:#fff;border:1px solid #ccc;border-radius:8px;padding:24px}.download-chip__headline{border-bottom:1px solid #ccc;padding-bottom:16px;margin-bottom:16px}.download-chip{padding:8px 12px !important;border-radius:4px;transition:300ms ease background-color}.download-chip .black-blue-text-color .snowflake-title-v2-line{color:#000 !important;padding-right:24px;font-family:'Lato',sans-serif;font-size:14px !important;font-weight:500 !important}.download-chip .black-blue-text-color .snowflake-title-v2-line:not(:first-child){opacity:.6;font-style:italic !important}.download-chip .snowflake-content-chip-button{display:none}.download-chip.is-external-link{background-size:16px 16px;background-image:url(\"data:image/svg+xml,%3Csvg width='15' height='15' viewBox='0 0 15 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M1.06055 13.0607L11.8605 2.26067M13.0605 10.6607V1.06067H3.46055' stroke='%23249EDC' stroke-width='2.12132' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E%0A\")}.download-chip{background-image:url(\"data:image/svg+xml,%3Csvg width='18' height='18' viewBox='0 0 18 18' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cg clip-path='url(%23clip0_883_7979)'%3E%3Cpath d='M3.375 16.875H14.625' stroke='%23249EDC' stroke-width='1.40625' stroke-linecap='round' stroke-linejoin='round'/%3E%3Cpath d='M9 1.125V11.25' stroke='%23249EDC' stroke-width='1.40625' stroke-linecap='round' stroke-linejoin='round'/%3E%3Cpath d='M4.5 7.875L9 12.375L13.5 7.875' stroke='%23249EDC' stroke-width='1.40625' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/g%3E%3Cdefs%3E%3CclipPath id='clip0_883_7979'%3E%3Crect width='18' height='18' fill='white'/%3E%3C/clipPath%3E%3C/defs%3E%3C/svg%3E%0A\");background-size:24px auto;background-repeat:no-repeat;background-position:calc(100% - 12px) center}.download-chip__headline{display:flex;gap:16px;flex-direction:row !important;flex-wrap:nowrap}.download-chip__headline::before{content:'';display:inline-block;width:24px;height:24px;background-position:center;background-image:url(\"data:image/svg+xml,%3Csvg width='21' height='21' viewBox='0 0 21 21' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M7.50005 9.89999C8.13657 9.89999 8.74702 9.64713 9.19711 9.19704C9.64719 8.74696 9.90005 8.13651 9.90005 7.49999V2.69999C9.90005 2.06347 9.64719 1.45302 9.19711 1.00293C8.74702 .552844 8.13657 .299988 7.50005 .299988H2.70005C2.06353 .299988 1.45308 .552844 1.00299 1.00293C.552905 1.45302 .300049 2.06347 .300049 2.69999V7.49999C.300049 8.13651 .552905 8.74696 1.00299 9.19704C1.45308 9.64713 2.06353 9.89999 2.70005 9.89999H7.50005ZM7.50005 7.49999H2.70005V2.69999H7.50005V7.49999Z' fill='%23249EDC' stroke='white' stroke-width='.6'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M7.50005 20.3C8.13657 20.3 8.74702 20.0472 9.19711 19.5971C9.64719 19.147 9.90005 18.5365 9.90005 17.9V13.1C9.90005 12.4635 9.64719 11.853 9.19711 11.403C8.74702 10.9529 8.13657 10.7 7.50005 10.7H2.70005C2.06353 10.7 1.45308 10.9529 1.00299 11.403C.552905 11.853 .300049 12.4635 .300049 13.1V17.9C.300049 18.5365 .552905 19.147 1.00299 19.5971C1.45308 20.0472 2.06353 20.3 2.70005 20.3H7.50005ZM7.50005 17.9H2.70005V13.1H7.50005V17.9Z' fill='%23249EDC' stroke='white' stroke-width='.6'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M17.9001 9.89999C18.5366 9.89999 19.147 9.64713 19.5971 9.19704C20.0472 8.74696 20.3001 8.13651 20.3001 7.49999V2.69999C20.3001 2.06347 20.0472 1.45302 19.5971 1.00293C19.147 .552844 18.5366 .299988 17.9001 .299988H13.1001C12.4636 .299988 11.8531 .552844 11.403 1.00293C10.9529 1.45302 10.7001 2.06347 10.7001 2.69999V7.49999C10.7001 8.13651 10.9529 8.74696 11.403 9.19704C11.8531 9.64713 12.4636 9.89999 13.1001 9.89999H17.9001ZM17.9001 7.49999H13.1001V2.69999H17.9001V7.49999Z' fill='%23249EDC' stroke='white' stroke-width='.6'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M17.9001 20.3C18.5366 20.3 19.147 20.0472 19.5971 19.5971C20.0472 19.147 20.3001 18.5365 20.3001 17.9V13.1C20.3001 12.4635 20.0472 11.853 19.5971 11.403C19.147 10.9529 18.5366 10.7 17.9001 10.7H13.1001C12.4636 10.7 11.8531 10.9529 11.403 11.403C10.9529 11.853 10.7001 12.4635 10.7001 13.1V17.9C10.7001 18.5365 10.9529 19.147 11.403 19.5971C11.8531 20.0472 12.4636 20.3 13.1001 20.3H17.9001ZM17.9001 17.9H13.1001V13.1H17.9001V17.9Z' fill='%23249EDC' stroke='white' stroke-width='.6'/%3E%3C/svg%3E%0A\");background-size:contain;background-repeat:no-repeat}.download-chip__headline.is-cli::before{background-image:url(\"data:image/svg+xml,%3Csvg width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M4 17L10 11L4 5' stroke='%23000' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'/%3E%3Cpath d='M12 19H20' stroke='%23000' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E%0A\")}.download-card pre[class*=language-]{padding:8px 12px;background-color:var(--ui-background-05);overflow:hidden}.download-chip__headline.is-windows,.download-chip__headline.is-mac{gap:12px}.download-chip__headline.is-windows::before{width:16px;height:20px;background-image:url(\"data:image/svg+xml,%3Csvg width='4875' height='4875' viewBox='0 0 4875 4875' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cg clip-path='url(%23clip0_122_201)'%3E%3Cpath d='M0 0H2311V2310H0V0ZM2564 0H4875V2310H2564V0ZM0 2564H2311V4875H0V2564ZM2564 2564H4875V4875H2564' fill='%23000'/%3E%3C/g%3E%3C/svg%3E\")}.download-chip__headline.is-mac::before{width:16px;height:20px;background-image:url(\"data:image/svg+xml,%3Csvg version='1.1' id='Layer_1' xmlns:x='ns_extend;' xmlns:i='ns_ai;' xmlns:graph='ns_graphs;' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' x='0' y='0' viewBox='0 0 41.5 51' style='enable-background:new 0 0 41.5 51;' xml:space='preserve'%3E%3Cmetadata%3E%3Csfw xmlns='ns_sfw;'%3E%3Cslices%3E%3C/slices%3E%3CsliceSourceBounds bottomLeftOrigin='true' height='51' width='41.5' x='166.1' y='-208.1'%3E%3C/sliceSourceBounds%3E%3C/sfw%3E%3C/metadata%3E%3Cg%3E%3Cpath d='M40.2,17.4c-3.4,2.1-5.5,5.7-5.5,9.7c0,4.5,2.7,8.6,6.8,10.3c-.8,2.6-2,5-3.5,7.2c-2.2,3.1-4.5,6.3-7.9,6.3s-4.4-2-8.4-2 c-3.9,0-5.3,2.1-8.5,2.1s-5.4-2.9-7.9-6.5C2,39.5,.1,33.7,0,27.6c0-9.9,6.4-15.2,12.8-15.2c3.4,0,6.2,2.2,8.3,2.2 c2,0,5.2-2.3,9-2.3C34.1,12.2,37.9,14.1,40.2,17.4z M28.3,8.1C30,6.1,30.9,3.6,31,1c0-.3,0-.7-.1-1c-2.9,.3-5.6,1.7-7.5,3.9 c-1.7,1.9-2.7,4.3-2.8,6.9c0,.3,0,.6,.1,.9c.2,0,.5,.1,.7,.1C24.1,11.6,26.6,10.2,28.3,8.1z'%3E%3C/path%3E%3C/g%3E%3C/svg%3E\")}.download-chip__headline.is-desktop::before{background-image:url(\"data:image/svg+xml,%3Csvg width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cg opacity='.8'%3E%3Cpath d='M1.5 21H22.5V18H1.5V21Z' fill='%23000' stroke='white' stroke-width='.75'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M19.5 15C20.2956 15 21.0587 14.6839 21.6213 14.1213C22.1839 13.5587 22.5 12.7956 22.5 12V6C22.5 5.20435 22.1839 4.44129 21.6213 3.87868C21.0587 3.31607 20.2956 3 19.5 3H4.5C3.70435 3 2.94129 3.31607 2.37868 3.87868C1.81607 4.44129 1.5 5.20435 1.5 6V12C1.5 12.7956 1.81607 13.5587 2.37868 14.1213C2.94129 14.6839 3.70435 15 4.5 15H19.5ZM19.5 12H4.5V6H19.5V12Z' fill='%23000' stroke='white' stroke-width='.75'/%3E%3C/g%3E%3C/svg%3E%0A\")}.download-card .snowflake-code-snippet,.download-card .snowflake-code-snippet code,.download-card .snowflake-code-snippet pre{font-size:14px;color:#000;text-shadow:none !important}.download-chip:hover{background-color:var(--ui-background-05) !important;transition:300ms ease background-color}body:has(.snowflake-skip-to-content[style]) #subNav,.pushdown-banner-dismissed #subNav{top:var(--scroll-padding-top) !important;transition:300ms ease top}body:has(.snowflake-skip-to-content[style*=\"58\"]) #subNav{top:34px !important}body:has(.snowflake-skip-to-content[style*=\"82\"]) #subNav{top:58px !important}body:has(.snowflake-skip-to-content[style*=\"130\"]) #subNav{top:106px !important}body:has(.snowflake-skip-to-content[style*=\"138\"]) #subNav{top:114px !important}body:has(.snowflake-skip-to-content[style*=\"146\"]) #subNav{top:122px !important}.is-hidden .snowflake-person-chip-avatar{display:none}.is-small .snowflake-person-chip-avatar{width:56px;height:56px}.ai-summary ul{margin:16px 0 0 0 !important;padding:0 !important;list-style-type:none}.ai-summary li{margin:0;padding:0 0 0 32px;position:relative}.ai-summary li::before{content:\"\";display:block;border-radius:100%;background:#29b5e8;width:18px;height:18px;position:absolute;top:4px;left:0;border:5px solid #e5f2f7;box-sizing:border-box}.ai-summary li:not(:last-child){margin-bottom:1rem}.snowflake-content-chip-image__image{aspect-ratio:5 / 3 !important}.content-chip-new .snowflake-content-chip-image__image{height:100% !important;aspect-ratio:unset !important}.snapshot-card .snowflake-text p:not(:first-child){margin-top:var(--spacing-01)}.snapshot-card\u003E.container\u003E.cmp-container\u003E.aem-container\u003Ediv:nth-child(2) p:has(b){font-family:'Texta',sans-serif;margin-top:24px}.snapshot-card\u003E.container\u003E.cmp-container\u003E.aem-container\u003Ediv:nth-child(2) p b{font-weight:700 !important}.snapshot-card\u003E.container\u003E.cmp-container\u003E.aem-container\u003Ediv:nth-child(2){border-bottom:1px solid #ccc;padding-bottom:24px}.snapshot-card\u003E.container\u003E.cmp-container\u003E.aem-container\u003Ediv:nth-child(3) p:first-child:has(b){font-family:'Texta',sans-serif;font-size:20px !important;margin-bottom:1rem !important}.snapshot-card\u003E.container\u003E.cmp-container\u003E.aem-container\u003Ediv:nth-child(3) li{display:inline-block}.snapshot-card\u003E.container\u003E.cmp-container\u003E.aem-container\u003Ediv:nth-child(3) li a{display:inline-block;text-decoration:none;padding:4px 16px !important;border:1px solid #ccc;border-radius:24px;color:#666 !important}.snapshot-card\u003E.container\u003E.cmp-container\u003E.aem-container\u003Ediv:nth-child(3) ul{list-style-type:none;display:flex;padding:0 !important;margin:0 !important;gap:12px}.snapshot-card\u003E.container\u003E.cmp-container\u003E.aem-container img{width:90%;max-width:240px;margin:0 auto}.snapshot-card\u003E.container\u003E.cmp-container\u003E.aem-container{padding:40px;max-width:450px;margin:0 0 0 auto;background-color:#fff;box-shadow:0 2px 6px 0 rgba(152,162,179,.25),0 10px 20px 0 rgba(152,162,179,.10);border-radius:8px;border-top:4px solid var(--ui-01)}.ai-summary{background-color:#f3fbfe;border-left:2px solid var(--ui-01);padding:40px}.ai-summary\u003Espan p:last-child:has(i){color:#666;font-size:14px !important}.ai-summary\u003Espan p:last-child:has(i) a{color:#666 !important;text-decoration:underline !important}.ai-summary\u003Espan p:last-child:has(i) a:hover{color:var(--ui-01) !Important}.ai-summary\u003Espan p:first-child:has(b)::after{content:'';display:inline-block;width:20px;height:20px;background-image:url(\"data:image/svg+xml,%3Csvg width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M9.3158 3.15226C8.6475 6.2258 6.22698 8.64545 3.15232 9.31587C2.94923 9.36072 2.94923 9.63928 3.15232 9.68413C6.22698 10.3522 8.6475 12.7742 9.3158 15.8477C9.36067 16.0508 9.63933 16.0508 9.6842 15.8477C10.3525 12.7742 12.773 10.3545 15.8477 9.68413C16.0508 9.63928 16.0508 9.36072 15.8477 9.31587C12.773 8.64781 10.3525 6.2258 9.6842 3.15226C9.63933 2.94925 9.36067 2.94925 9.3158 3.15226Z' fill='%23249EDC'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M17.3725 11.5461C16.9098 13.6739 15.2341 15.3491 13.1054 15.8132C12.9649 15.8443 12.9649 16.0371 13.1054 16.0681C15.2341 16.5307 16.9098 18.2074 17.3725 20.3353C17.4035 20.4758 17.5965 20.4758 17.6275 20.3353C18.0902 18.2074 19.7659 16.5323 21.8946 16.0681C22.0352 16.0371 22.0352 15.8443 21.8946 15.8132C19.7659 15.3507 18.0902 13.6739 17.6275 11.5461C17.5965 11.4055 17.4035 11.4055 17.3725 11.5461Z' fill='%23249EDC'/%3E%3C/svg%3E%0A\");background-repeat:no-repeat;background-size:contain;background-position:center;vertical-align:middle;margin-left:8px}.ai-summary\u003Espan p:first-child:has(b){color:var(--ui-01) !important;text-transform:uppercase}.border-top{border-top:1px solid rgba(0,0,0,.2)}.border-top\u003Espan{display:block;padding-top:32px}body .snowflake-card-v2-advanced-image__image{aspect-ratio:16 / 9 !important}.content-chip-new .snowflake-content-chip-image__image{border-radius:0;object-fit:cover;height:100%}.sf-footer #ot-sdk-btn.ot-sdk-show-settings,.sf-footer #ot-sdk-btn.optanon-show-settings{color:rgba(255,255,255,.7) !important;text-underline-offset:4px;border-top:none;border-left:none;border-right:none;border-bottom:1px dotted transparent;background-color:transparent !important;background-image:none !important;transition:300ms ease text-decoration-color;padding:0 !important;font-size:12px;font-family:'Lato',sans-serif}.sf-footer #ot-sdk-btn.ot-sdk-show-settings:hover,.sf-footer #ot-sdk-btn.optanon-show-settings:hover{color:rgba(255,255,255,1) !important;border-bottom:1px dotted var(--ui-01);transition:300ms ease text-decoration-color}.sf-footer__legal-container\u003E.container\u003E.cmp-container\u003E.aem-container\u003Ediv:last-child{flex-shrink:0}.sf-footer__disclaimers{background-color:#042130}.sf-footer__disclaimers .snowflake-simple-stat-disclaimer p a{color:inherit;text-decoration:none !important}.sf-footer__disclaimers .snowflake-simple-stat-disclaimer p sup{margin-right:2px}.sf-footer__disclaimers .snowflake-simple-stat-disclaimer p{text-indent:-5px;padding-left:5px}.sf-footer__disclaimers-inner{border-top:1px solid rgba(255,255,255,.25);padding:40px 0}.sf-footer__disclaimers .snowflake-simple-stat{align-items:flex-start;text-align:left;color:rgba(255,255,255,.7);margin-bottom:10px}.sf-footer__social{display:flex;justify-content:center;gap:12px}.sf-footer .snowflake-footer-social-item{margin:0 !important}.sf-footer .snowflake-footer-social-item a{line-height:0;background-color:rgba(3,24,35,.8);display:inline-block;width:48px !important;height:48px;border-radius:8px;display:inline-flex;justify-content:center;align-items:center;transition:300ms ease background-color}.sf-footer .snowflake-footer-social-item a:hover{background-color:var(--ui-01) !important;transition:300ms ease background-color}.sf-footer__bottom{padding-bottom:40px}.sf-footer .snowflake-marketo-form .mktoFormRow .mktoFieldWrap .mktoError .mktoErrorMsg{max-width:100%;color:#fff}.sf-footer .mktoForm .mktoError .mktoErrorMsg .mktoErrorDetail{display:inline-block}.sf-footer .mktoFormRow:has(.mktoHtmlText:empty){display:none}.sf-footer .mktoFormRow .mktoHtmlText span{color:#fff !important}.sf-footer{background-color:#042130}.sf-footer .optanon-toggle-display:hover{text-decoration-color:var(--ui-01) !important;cursor:pointer !important;text-underline-offset:4px;text-decoration-style:dotted !important;text-decoration-color:var(--ui-01);color:#fff !important;transition:300ms ease text-decoration-color;text-decoration:underline;opacity:1}.sf-footer__logo{width:40px}.sf-footer-grid__inner\u003E.container\u003E.cmp-container\u003E.aem-container{row-gap:32px}.sf-footer__legal-container\u003E.container\u003E.cmp-container\u003E.aem-container{display:flex;justify-content:space-between;align-items:center;text-align:center;row-gap:16px}.sf-footer__legal-container\u003E.container\u003E.cmp-container\u003E.aem-container\u003Ediv:nth-child(2){text-align:center;flex-grow:1}.sf-footer__legal-links li button,.sf-footer__legal-links li a,.sf-footer__legal-links li{margin:0;color:rgba(255,255,255,.7) !important;font-weight:500}.sf-footer__legal-links li a:hover{color:rgba(255,255,255,1) !important}.sf-footer div.sf-footer__copyright p,.sf-footer div.sf-footer__legal-links li,.sf-footer div.sf-footer__legal-links a,.sf-footer div.sf-footer__legal-links p{font-size:12px !important}.sf-footer__legal-links ul{list-style-type:none;margin:0;padding:0;display:flex;gap:20px;row-gap:4px;justify-content:center;flex-wrap:wrap;text-align:center}.sf-footer__legal-links li:last-child{width:100%}.sf-footer .mktoFormRow:has(.mktoPlaceholder),.sf-footer .mktoFormRow:has(input[type=\"hidden\"]){display:none !important}.sf-footer .mktoFormCol{margin-bottom:0 !important}.sf-footer label[for=\"adhoc1\"]{width:auto !important;flex-grow:1;margin-left:16px}.sf-footer .mktoFieldWrap:has(label[for=\"adhoc1\"]){display:flex;flex-direction:row-reverse;margin-top:22px}.sf-footer .snowflake-marketo-form .mktoFormRow .mktoFieldWrap .mktoCheckboxList input[type=checkbox]{background-color:transparent !important;border:1px solid rgba(255,255,255,.4) !important;border-radius:4px !important}.sf-footer .snowflake-marketo-form .mktoFormRow .mktoFieldWrap .mktoEmailField,.sf-footer .snowflake-marketo-form .mktoFormRow .mktoFieldWrap .mktoTelField,.sf-footer .snowflake-marketo-form .mktoFormRow .mktoFieldWrap .mktoTextField,.sf-footer .snowflake-marketo-form .mktoFormRow .mktoFieldWrap select{background-color:transparent !important;color:#fff !important;height:auto !important;border:1px solid rgba(255,255,255,.4) !important;border-radius:4px !important;padding:12px 18px !important}.sf-footer .snowflake-marketo-form .mktoFormRow .mktoFieldWrap .mktoEmailField:focus,.sf-footer .snowflake-marketo-form .mktoFormRow .mktoFieldWrap .mktoTelField:focus,.sf-footer .snowflake-marketo-form .mktoFormRow .mktoFieldWrap .mktoTextField:focus,.sf-footer .snowflake-marketo-form .mktoFormRow .mktoFieldWrap select:focus{border-color:var(--ui-01) !important}.sf-footer .mktoForm *{padding:0 !important}.sf-footer .mktoForm,.sf-footer .snowflake-marketo-form-container{padding:0 !important;background:transparent;margin-bottom:0;box-shadow:none}.sf-footer .mktoHtmlText.mktoHasWidth{width:100% !important;margin:24px 0}.sf-footer .mktoFormRow{flex-direction:column}.sf-footer .mktoForm .mktoButtonWrap{margin:0 !important}.sf-footer select{background-image:url(\"data:image/svg+xml,%3Csvg width='14' height='8' viewBox='0 0 14 8' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M.981445 1.43496L6.90897 7.32496L12.9314 1.33496' stroke='white' stroke-width='1.33333' stroke-miterlimit='10' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E%0A\") !important}.sf-footer .snowflake-marketo-form .mktoButtonWrap.mktoNative{justify-content:flex-start}.sf-footer *::placeholder{color:#fff !important;opacity:.8}.sf-footer .mktoForm .mktoButtonWrap.mktoSimple .mktoButton{background-color:var(--ui-01) !important;color:#fff !important;width:100% !important;padding:12px 16px !important;border:1px solid var(--ui-01) !important;background-image:none !important;border-radius:48px;text-transform:uppercase;font-weight:800 !important;font-family:'Texta',sans-serif !important;font-size:16px !important;line-height:1.2}.sf-footer .snowflake-marketo-form .mktoFormRow .mktoFieldWrap .mktoHtmlText\u003Espan,.sf-footer .snowflake-marketo-form .mktoFormRow .mktoFieldWrap .mktoLabel\u003Espan,.sf-footer .snowflake-marketo-form .mktoFormRow .mktoFieldWrap label.mktoLabel{color:#fff !important}.sf-footer__newsletter-title p:not(:first-child){margin-top:8px !important}.sf-footer__newsletter-title p b{font-weight:800 !important;font-family:'Texta',sans-serif !important;font-size:22px !important;line-height:1.2}.sf-footer__newsletter-title p:last-child{font-size:14px !important;opacity:.8}.sf-footer__link-group li a[target=\"_blank\"]::after{content:'';display:inline-block;width:10px;height:10px;margin-left:5px;background-image:url(\"data:image/svg+xml,%3Csvg width='11' height='11' viewBox='0 0 11 11' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M6.72222 1.22222C6.38471 1.22222 6.11111 .948616 6.11111 .611111C6.11111 .273607 6.38471 0 6.72222 0H10.3889C10.551 0 10.7064 .0643867 10.821 .178988C10.9356 .293596 11 .449032 11 .611111V4.27778C11 4.61529 10.7264 4.88889 10.3889 4.88889C10.0514 4.88889 9.77778 4.61529 9.77778 4.27778V2.08647L4.09879 7.76545C3.86013 8.00409 3.4732 8.00409 3.23454 7.76545C2.99589 7.52681 2.99589 7.13986 3.23454 6.90122L8.91355 1.22222H6.72222ZM0 2.44444C0 1.76943 .547207 1.22222 1.22222 1.22222H4.27778C4.61529 1.22222 4.88889 1.49583 4.88889 1.83333C4.88889 2.17084 4.61529 2.44444 4.27778 2.44444H1.22222V9.77778H8.55556V6.72222C8.55556 6.38471 8.82915 6.11111 9.16667 6.11111C9.50418 6.11111 9.77778 6.38471 9.77778 6.72222V9.77778C9.77778 10.4528 9.23059 11 8.55556 11H1.22222C.547207 11 0 10.4528 0 9.77778V2.44444Z' fill='white'/%3E%3C/svg%3E%0A\");background-size:contain;background-repeat:no-repeat;background-position:center}.sf-footer__link-group ul,.sf-footer__link-group li{margin:0;padding:0;list-style-type:none}.sf-footer__link-group ul{margin-top:20px !important}.sf-footer__link-group li{margin-top:15px}.sf-footer div.sf-footer__link-group\u003Espan\u003Ep\u003Ea,.sf-footer div.sf-footer__link-group\u003Espan\u003Ep{color:var(--ui-01) !important;font-weight:800 !important;font-family:'Texta',sans-serif !important;font-size:20px !important;line-height:1.2}.sf-footer__link-group li a{opacity:.9;color:#fff !important;font-weight:500 !important;font-size:15px !important;line-height:1.3}.sf-footer__link-group li a:hover{opacity:1}.sf-footer-grid__inner\u003E.container\u003E.cmp-container\u003E.aem-container::before,.sf-footer-grid__inner\u003E.container\u003E.cmp-container\u003E.aem-container::after{display:none}.sf-footer__column{flex-grow:1}.sf-footer-grid__inner\u003E.container\u003E.cmp-container\u003E.aem-container\u003Ediv:not(:first-child){width:50%}@media (min-width:800px){.sf-footer__legal-links ul{justify-content:flex-start;text-align:left}.sf-footer__social{justify-content:flex-end}.sf-footer__legal-links ul{padding-left:24px}.sf-footer__legal-container\u003E.container\u003E.cmp-container\u003E.aem-container{text-align:right;flex-wrap:nowrap}.sf-footer__legal-links.align-left ul{justify-content:flex-start}.sf-footer-grid__inner\u003E.container\u003E.cmp-container\u003E.aem-container{display:flex;justify-content:space-between;flex-direction:row}.sf-footer-grid__inner\u003E.container\u003E.cmp-container\u003E.aem-container\u003Ediv{width:auto !important;max-width:200px}.sf-footer-grid__inner\u003E.container\u003E.cmp-container\u003E.aem-container\u003Ediv:first-child{flex-grow:1;order:2;width:100% !important;max-width:none}.sf-footer__legal-container\u003E.container\u003E.cmp-container\u003E.aem-container\u003Ediv{width:auto}}@media screen and (min-width:1380px){.sf-footer-grid__inner\u003E.container\u003E.cmp-container\u003E.aem-container{flex-wrap:nowrap}.sf-footer-grid__inner\u003E.container\u003E.cmp-container\u003E.aem-container\u003Ediv:first-child{padding-right:48px;max-width:380px;background-color:rgba(3,24,35,.4);padding:32px;margin-left:48px;border-radius:16px}.sf-footer__link-group li,.sf-footer__link-group li a{font-size:14px !important;line-height:1.3}}@media screen and (max-width:991px){.sf-footer-grid__inner\u003E.container\u003E.cmp-container\u003E.aem-container\u003Ediv:first-child{order:2;margin-top:24px !important}}@media screen and (max-width:420px){.is-reduced-mobile .heading-1-v2,.is-reduced-mobile .heading-1-v2-sm{font-size:32px;line-height:28px}}.quote-content-chip{background-color:var(--ui-background-05);padding:24px;border-radius:12px;position:relative}.quote-content-chip .black-blue-text-color .snowflake-title-v2-line\u003Espan{color:rgba(0,0,0,.8) !important;font-size:15px !important;line-height:1.5 !important;font-family:'Lato',sans-serif;font-weight:400 !important}.quote-content-chip .black-blue-text-color .snowflake-title-v2-line\u003Espan:not(:first-child){max-width:calc(100% - 200px)}.quote-content-chip .black-blue-text-color .snowflake-title-v2-line\u003Espan:nth-child(2){font-family:'Texta',sans-serif;color:#000 !important;font-size:20px !important;font-weight:800 !important;margin-top:24px}.quote-content-chip .snowflake-content-chip-image{width:140px !important}@media screen and (min-width:992px){.quote-content-chip .snowflake-content-chip-image{position:absolute !important;bottom:24px;right:16px}}@media screen and (max-width:991px){.quote-content-chip .snowflake-content-chip-image{margin-bottom:40px}.quote-content-chip{flex-direction:column}}#spa-root{background-color:#fff}.lowercase .snowflake-title-v2-line{text-transform:none !important}.centered .snowflake-logo-content-container-inner{justify-content:center}div.snowflake-linklist-dropdown-menu{max-height:380px}.first-line-blue .snowflake-typographyv2 .snowflake-title-v2-line:first-child{color:var(--ui-01) !important}.is-front{position:relative;z-index:2}.use-case-body .snowflake-text h1,.use-case-body .snowflake-text h2,.use-case-body .snowflake-text h3,.use-case-body .snowflake-text h4,.use-case-body .snowflake-text h5,.use-case-body .snowflake-text h6{font-family:'Texta',sans-serif;color:#000;margin:.25rem 0 0 0}.pc-hero .button-group\u003E.container\u003E.cmp-container\u003E.aem-container{justify-content:flex-start}.sf-footer .mktoFormRow .mktoHtmlText span{font-family:'Lato',sans-serif !important}.snowflake-button-primary.snowflake-button-blue .snowflake-button-container{justify-content:center}.related-chip-25{background-color:#fff;border:1px solid rgba(204,204,204,.5);border-radius:8px;padding:20px;position:relative}.related-chip-25:hover{box-shadow:rgba(152,162,179,.1) 0 10px 20px 0}.related-chip-25:hover::after{right:24px;transition:300ms ease right}.related-chip-25::after{content:'';display:block;transition:300ms ease right;background-image:url(\"data:image/svg+xml,%3Csvg width='8' height='14' viewBox='0 0 8 14' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M7.66699 7C7.66699 6.6571 7.53559 6.32825 7.30169 6.08578L2.34446 .947072C1.84529 .429617 1.0164 .429617 .517219 .947072C.0427878 1.43887 .042788 2.21798 .517219 2.70978L4.65591 7L.51722 11.2902C.0427889 11.782 .0427887 12.5611 .51722 13.0529C1.0164 13.5704 1.84529 13.5704 2.34447 13.0529L7.30169 7.91421C7.53559 7.67175 7.66699 7.34289 7.66699 7Z' fill='%2329B5E8'/%3E%3C/svg%3E%0A\");width:8px;height:14px;display:block;position:absolute;right:30px;top:50%;transform:translateY(-50%);background-size:contain;background-position:center;background-repeat:no-repeat}.related-chip-25 .heading-5-v2{font-size:22px;line-height:1.1}.related-chip-25 .snowflake-content-chip-image{width:48px;flex-shrink:0}.related-chip-25 .snowflake-content-chip-image__image{aspect-ratio:1;height:auto;object-fit:contain}.related-chip-25 .snowflake-content-chip-button{display:none}.related-chip-25 .snowflake-content-chip-content-without-tag{flex-grow:1;padding-right:24px}.case-study-25.small-logo .snowflake-case-study-card-logo img{width:60px !important}.swiper-slide .case-study-25{width:95%;margin-left:auto;margin-right:auto}.case-study-25 .snowflake-case-study-card-logo img{width:140px !important;height:auto !important;transform:none !important;margin:24px 0 8px 0}.case-study-25 .snowflake-case-study-card-image__image{object-position:left center}.case-study-25 .snowflake-case-study-card-information-container{padding-right:24px}.case-study-25 ul{list-style-type:none;padding:0;margin:8px 0 0 0}.case-study-25 li{font-size:15px !important;line-height:1.3 !important;display:flex;flex-direction:column;border-left:4px solid var(--ui-01);padding-left:24px;margin-top:24px;color:#535862;gap:4px}.case-study-25 li b{display:block;font-family:'Texta',sans-serif;font-weight:900 !important;font-size:48px !important;line-height:.9 !important;color:var(--ui-01)}.case-study-25 .snowflake-case-study-card-description p{color:#535862}.case-study-25 .snowflake-case-study-card-description p:nth-child(2):not(:has(a)){color:#000;font-family:Texta;font-size:30px !important;line-height:1 !important;font-style:normal;font-weight:700;text-indent:-8px}.case-study-25.is-story .snowflake-case-study-card-description p:nth-child(2):not(:has(a)){text-indent:0}.case-study-25 .snowflake-case-study-card-key-card{background-color:transparent}.case-study-25 .snowflake-case-study-card-button{display:none}.case-study-25{border-radius:24px;overflow:hidden}@media screen and (min-width:1024px){.case-study-25 .snowflake-case-study-card-left-container{position:static;width:60%;min-height:0}.case-study-25 .snowflake-case-study-card-right-container::after{content:'';display:block;width:60%;max-width:340px;padding-bottom:50%;background-image:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 22 16' class='snowflake-pushdown-banner-placeholder-arrow'%3E%3Cpath fill='%2329B5E8' fill-rule='evenodd' d='M17.865 8.756c.088-.274.124-.555.118-.834a2.551 2.551 0 0 0-1.3-2.142L7.887.76C6.645.055 5.063.475 4.35 1.7a2.535 2.535 0 0 0 .947 3.494l4.916 2.809-4.916 2.801a2.543 2.543 0 0 0-.947 3.502c.713 1.222 2.295 1.64 3.537.934l8.796-5.024a2.541 2.541 0 0 0 1.182-1.46Z' clip-rule='evenodd'%3E%3C/path%3E%3C/svg%3E\");background-size:contain;background-repeat:no-repeat;position:absolute;top:-10%;left:-20%}.case-study-25 .snowflake-case-study-card-right-container{max-width:none;width:40%;position:absolute;top:-5%;right:-5%;z-index:0;height:110%}}@media screen and (min-width:768px){.case-study-25 li{max-width:50%}.case-study-25 ul{display:flex;gap:48px}}.snowflake-text.section-eyebrow p{margin-left:auto;margin-right:auto;margin-bottom:16px !important}.snowflake-text.section-eyebrow p,.snowflake-text.eyebrow-text p{text-transform:uppercase;font-family:'Texta',sans-serif !important;font-weight:800 !important;letter-spacing:.025em;margin-bottom:12px;line-height:1.1 !important}.snowflake-title-v2.dynamic .heading-2-v2 span.snowflake-title-v2-line{font-size:clamp(2.5rem,4.5vw,4rem) !important;line-height:.82 !important}.checklist ul{padding:0;margin:0}.checklist ul li{list-style-type:none;padding-left:32px;position:relative}.checklist ul li:not(:last-child){margin-bottom:1em}.checklist ul li::before{content:'';display:inline-block;width:20px;height:20px;background-image:url(\"data:image/svg+xml,%3Csvg width='24' height='25' viewBox='0 0 24 25' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Crect y='.985352' width='24' height='24' rx='12' fill='%23D4F0FA'/%3E%3Cpath d='M7.28613 13.2967L10.7147 16.7253L17.5718 9.86816' stroke='%2329B5E8' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E%0A\");background-size:contain;background-repeat:no-repeat;position:absolute;top:3px;left:0}.last-line-blue .snowflake-typographyv2 .snowflake-title-v2-line:last-child{color:var(--ui-01)}.snowflake-text p sup{line-height:0}.snowflake-title-v2.lowercase .heading-3-v2{font-size:28px;line-height:1;text-transform:none;font-weight:700}.snowflake-title-v2.lowercase .heading-2-v2{font-size:32px;line-height:1;text-transform:none;font-weight:700}.content-chip-new{border:1px solid rgba(204,204,204,.5);border-radius:16px;overflow:hidden}.content-chip-new .snowflake-image-container{border-radius:0;display:none}.content-chip-new .snowflake-content-chip-image{margin-right:0;max-width:180px;flex-shrink:0}.content-chip-new .snowflake-content-chip-content{padding:24px}.content-chip-new .black-blue-text-color .snowflake-title-v2-line:first-child{font-size:24px;line-height:1.1}.content-chip-new .black-blue-text-color .snowflake-title-v2-line:not(:first-child){font-family:'Lato',sans-serif;font-size:17px;color:#535862 !important;font-weight:500;line-height:1.45;margin-top:8px;display:none}div.snowflake-text a{font-weight:normal;color:var(--ui-01);text-decoration:underline;text-underline-offset:4px;text-decoration-style:dotted !important;text-decoration-color:transparent;transition:300ms ease text-decoration-color}div.snowflake-text a:hover{text-decoration-color:var(--ui-01);transition:300ms ease text-decoration-color}.footer-nav__link-group .snowflake-button-container,.subnav__item--button,.snowflake-card-v2-advanced-button .snowflake-button-container{justify-content:flex-start}.button-container\u003E.container\u003E.cmp-container\u003E.aem-container{align-items:center}.button-container\u003E.container\u003E.cmp-container\u003E.aem-container .snowflake-button-primary+.snowflake-button-link{margin-left:12px !important}.snowflake-button-regular.snowflake-button-link .snowflake-button-container{font-size:18px !important;text-align:left;justify-content:flex-start;line-height:1.4 !important}body .snowflake-card-v2-advanced{border:1px solid rgba(204,204,204,.5);border-radius:var(--spacing-02);transition:300ms ease all}body .snowflake-card-v2-advanced:hover{transform:translateY(-10px);box-shadow:rgba(152,162,179,.1) 0 10px 20px 0;transition:300ms ease all}body .snowflake-card-v2-advanced-inner{border-bottom:none}body .snowflake-card-v2-advanced-image{line-height:0}body .snowflake-card-v2-advanced-image__image{aspect-ratio:16 / 9}body .snowflake-card-v2-advanced-content{position:relative}body .snowflake-card-v2-advanced-content::after{content:'';display:block;position:absolute;bottom:0;left:0;transition:300ms ease all;width:20%;height:4px;background-color:var(--ui-01);opacity:0}body .snowflake-card-v2-advanced:hover .snowflake-card-v2-advanced-content::after{width:100%;opacity:1;transition:300ms ease all}body .snowflake-card-v2-advanced .snowflake-button-link.snowflake-button-blue .snowflake-button-container\u003E.link-icon{transition:300ms ease transform}body .snowflake-card-v2-advanced:hover .snowflake-button-link.snowflake-button-blue .snowflake-button-container\u003E.link-icon{transform:translateX(4px);transition:300ms ease transform}.six-columns\u003E.container\u003E.cmp-container\u003E.aem-container,.three-columns\u003E.container\u003E.cmp-container\u003E.aem-container,.four-columns\u003E.container\u003E.cmp-container\u003E.aem-container,.five-columns\u003E.container\u003E.cmp-container\u003E.aem-container{display:flex;flex-wrap:wrap;gap:24px}.six-columns.align-center\u003E.container\u003E.cmp-container\u003E.aem-container,.three-columns.align-center\u003E.container\u003E.cmp-container\u003E.aem-container,.four-columns.align-center\u003E.container\u003E.cmp-container\u003E.aem-container,.five-columns.align-center\u003E.container\u003E.cmp-container\u003E.aem-container{justify-content:center}.three-columns\u003E.container\u003E.cmp-container\u003E.aem-container\u003Ediv{width:100%;margin:0 !important}.six-columns\u003E.container\u003E.cmp-container\u003E.aem-container\u003Ediv,.four-columns\u003E.container\u003E.cmp-container\u003E.aem-container\u003Ediv,.five-columns\u003E.container\u003E.cmp-container\u003E.aem-container\u003Ediv{width:calc(50% - 12px);margin:0 !important}@media screen and (min-width:768px){.three-columns\u003E.container\u003E.cmp-container\u003E.aem-container\u003Ediv{width:calc(50% - 12px)}.six-columns\u003E.container\u003E.cmp-container\u003E.aem-container\u003Ediv,.four-columns\u003E.container\u003E.cmp-container\u003E.aem-container\u003Ediv,.five-columns\u003E.container\u003E.cmp-container\u003E.aem-container\u003Ediv{width:calc(33.333% - 16px)}}@media screen and (min-width:1024px){.snowflake-title-v2.lowercase .heading-3-v2{font-size:34px}.snowflake-title-v2.lowercase.larger .heading-2-v2{font-size:44px;line-height:.95}.three-columns\u003E.container\u003E.cmp-container\u003E.aem-container\u003Ediv{width:calc(33.333% - 16px)}.four-columns\u003E.container\u003E.cmp-container\u003E.aem-container\u003Ediv{width:calc(25% - 18px)}.five-columns\u003E.container\u003E.cmp-container\u003E.aem-container\u003Ediv{width:calc(20% - 19.2px)}.six-columns\u003E.container\u003E.cmp-container\u003E.aem-container\u003Ediv{width:calc(16.6666% - 20px)}.snowflake-title-v2.lowercase .heading-3-v2{font-size:28px !important}}@media screen and (min-width:1200px){.snowflake-title-v2.lowercase .heading-2-v2{font-size:40px}.content-chip-new .snowflake-content-chip-content{padding:32px}.content-chip-new .snowflake-image-container,.content-chip-new .black-blue-text-color .snowflake-title-v2-line:not(:first-child){display:block}}.promo-banner-25{border-radius:16px;overflow:hidden}.promo-banner-25 .snowflake-premium-content-banner-image-container{position:relative;max-width:380px}.promo-banner-25 .snowflake-text{color:#535862}.promo-banner-25 .snowflake-premium-content-banner-image__image{transform:translateY(8px);transition:300ms ease transform;border-radius:0;width:85%;margin:0 auto;display:block;position:relative;z-index:1}.promo-banner-25 .snowflake-premium-content-banner-image__link:hover .snowflake-premium-content-banner-image__image{transform:translateY(0);transition:300ms ease transform}.promo-banner-25 .snowflake-premium-content-banner-image__inner{height:auto;padding-top:24px}.promo-banner-25 .snowflake-premium-content-banner-image__link{position:relative;z-index:1;height:auto}.promo-banner-25 .snowflake-premium-content-banner-image__link::after{content:'';display:block;position:absolute;clip-path:polygon(0 0,66% 0,100% 100%,0 100%);bottom:0;left:0;width:100%;height:100%;background:var(--ui-01);transition:300ms ease width}.promo-banner-25 .snowflake-premium-content-banner-image__link:hover::after{width:110%;transition:300ms ease width}.sf-footer .snowflake-marketo-form .mktoFormRow .mktoFieldWrap select{background-position:95% 50%}.sf-footer__disclaimers .text-size-small .snowflake-text p{color:#fff !important;font-size:10px !important;opacity:.8}@media screen and (min-width:768px){.sf-footer__disclaimers .text-size-small .snowflake-text p{font-size:12px !important}}@media screen and (max-width:1023px){.mobile-top-padding{padding-top:64px}}@media (max-width:799px){.sf-footer .snowflake-marketo-form .mktoButtonWrap.mktoNative .mktoButton{width:100% !important}.sf-footer__logo{text-align:center;display:block;margin:0 auto}}.customer-card .snowflake-card-v2-advanced-image{aspect-ratio:4.35 / 1}.customer-card .snowflake-card-v2-advanced-image__image{width:100%;height:100%;padding-left:8px;object-fit:contain;object-position:left center;margin:0 !important;aspect-ratio:initial}.customer-card .snowflake-card-v2-advanced-image__inner{height:110px}.customer-card .snowflake-card-v2-advanced-tag-indicator{display:none}.pc-hero .snowflake-container-arrow-small-gray-image{top:-34% !important;width:18% !important}.pc-hero .snowflake-container-arrow-small-gray-image path{fill:var(--ui-01);opacity:1}@media screen and (max-width:767px){.mobile-padding-top{padding-top:64px}.hide-mobile{display:none !important}.pc-hero{padding-top:52px}.pc-hero .snowflake-text p,.pc-hero .left-alignment .snowflake-title-v2-line,.pc-hero h1 span{text-align:center !important}}div.snowflake-pushdown-banner-button{margin-top:0}.button-group.align-center\u003E.container\u003E.cmp-container\u003E.aem-container{align-items:center;justify-content:center !important}.text-center .snowflake-breadcrumb-swiper .swiper-wrapper{justify-content:center}div.snowflake-breadcrumb a.snowflake-breadcrumb-item,.snowflake-breadcrumb div.snowflake-breadcrumb-item{text-transform:none;font-weight:500}.snowflake-breadcrumb svg{display:none !important}.snowflake-breadcrumb a:has(svg)::after{content:'/';margin:0 12px;color:#666}.hide-filters .snowflake-filterable-and-searchable-grid-top-part{display:none !important}.page-section{padding-left:24px;padding-right:24px}@media screen and (min-width:768px){.page-section{padding-left:48px;padding-right:48px}}.download-card pre[class*=language-]{overflow-x:scroll !important}","isGSAPEnabled":false,":type":"snowflake-site/components/markup-editor"}},":itemsOrder":["container_copy","container_573483281_","markup_editor_copy"]}},":itemsOrder":["root"],"classNames":"aem-xf"},"markup_editor":{"id":"markup-editor-bb70355865","title":"Quickstarts Overrides","cssContent":".snowflake-markdown blockquote{padding:24px 32px;background:#f6f9fa;border:1px solid #29b5e8;border-radius:16px}.snowflake-markdown .snowflake-image-container img{width:auto !important;max-width:100%}.snowflake-markdown .snowflake-text ol{padding-left:20px !important}.snowflake-markdown .snowflake-text li{margin:0 0 12px 0 !important}.snowflake-markdown h3.snowflake-markdown-h3{font-size:20px !important;font-family:Texta,sans-serif !important}@media (min-width:768px){.snowflake-markdown h3.snowflake-markdown-h3{font-size:28px !important}}","isGSAPEnabled":false,":type":"snowflake-site/components/markup-editor"}},":itemsOrder":["experiencefragment-banner","experiencefragment-header","markup_editor_1950346551","responsivegrid","modal_container","experiencefragment-footer","markup_editor"],":type":"wcm/foundation/components/responsivegrid"}},":itemsOrder":["root"],"locale":"en"}
  