CINXE.COM
Designing a Serverless, Cost-Efficient Tool for Data Traceability | ZoomInfo Engineering Blog
<!DOCTYPE html> <html lang="en-US"> <head><meta charset="UTF-8"><script>if(navigator.userAgent.match(/MSIE|Internet Explorer/i)||navigator.userAgent.match(/Trident\/7\..*?rv:11/i)){var href=document.location.href;if(!href.match(/[?&]nowprocket/)){if(href.indexOf("?")==-1){if(href.indexOf("#")==-1){document.location.href=href+"?nowprocket=1"}else{document.location.href=href.replace("#","?nowprocket=1#")}}else{if(href.indexOf("#")==-1){document.location.href=href+"&nowprocket=1"}else{document.location.href=href.replace("#","&nowprocket=1#")}}}}</script><script>class RocketLazyLoadScripts{constructor(e){this.triggerEvents=e,this.eventOptions={passive:!0},this.userEventListener=this.triggerListener.bind(this),this.delayedScripts={normal:[],async:[],defer:[]},this.allJQueries=[]}_addUserInteractionListener(e){this.triggerEvents.forEach((t=>window.addEventListener(t,e.userEventListener,e.eventOptions)))}_removeUserInteractionListener(e){this.triggerEvents.forEach((t=>window.removeEventListener(t,e.userEventListener,e.eventOptions)))}triggerListener(){this._removeUserInteractionListener(this),"loading"===document.readyState?document.addEventListener("DOMContentLoaded",this._loadEverythingNow.bind(this)):this._loadEverythingNow()}async _loadEverythingNow(){this._delayEventListeners(),this._delayJQueryReady(this),this._handleDocumentWrite(),this._registerAllDelayedScripts(),this._preloadAllScripts(),await this._loadScriptsFromList(this.delayedScripts.normal),await this._loadScriptsFromList(this.delayedScripts.defer),await this._loadScriptsFromList(this.delayedScripts.async),await this._triggerDOMContentLoaded(),await this._triggerWindowLoad(),window.dispatchEvent(new Event("rocket-allScriptsLoaded"))}_registerAllDelayedScripts(){document.querySelectorAll("script[type=rocketlazyloadscript]").forEach((e=>{e.hasAttribute("src")?e.hasAttribute("async")&&!1!==e.async?this.delayedScripts.async.push(e):e.hasAttribute("defer")&&!1!==e.defer||"module"===e.getAttribute("data-rocket-type")?this.delayedScripts.defer.push(e):this.delayedScripts.normal.push(e):this.delayedScripts.normal.push(e)}))}async _transformScript(e){return await this._requestAnimFrame(),new Promise((t=>{const n=document.createElement("script");let r;[...e.attributes].forEach((e=>{let t=e.nodeName;"type"!==t&&("data-rocket-type"===t&&(t="type",r=e.nodeValue),n.setAttribute(t,e.nodeValue))})),e.hasAttribute("src")?(n.addEventListener("load",t),n.addEventListener("error",t)):(n.text=e.text,t()),e.parentNode.replaceChild(n,e)}))}async _loadScriptsFromList(e){const t=e.shift();return t?(await this._transformScript(t),this._loadScriptsFromList(e)):Promise.resolve()}_preloadAllScripts(){var e=document.createDocumentFragment();[...this.delayedScripts.normal,...this.delayedScripts.defer,...this.delayedScripts.async].forEach((t=>{const n=t.getAttribute("src");if(n){const t=document.createElement("link");t.href=n,t.rel="preload",t.as="script",e.appendChild(t)}})),document.head.appendChild(e)}_delayEventListeners(){let e={};function t(t,n){!function(t){function n(n){return e[t].eventsToRewrite.indexOf(n)>=0?"rocket-"+n:n}e[t]||(e[t]={originalFunctions:{add:t.addEventListener,remove:t.removeEventListener},eventsToRewrite:[]},t.addEventListener=function(){arguments[0]=n(arguments[0]),e[t].originalFunctions.add.apply(t,arguments)},t.removeEventListener=function(){arguments[0]=n(arguments[0]),e[t].originalFunctions.remove.apply(t,arguments)})}(t),e[t].eventsToRewrite.push(n)}function n(e,t){let n=e[t];Object.defineProperty(e,t,{get:()=>n||function(){},set(r){e["rocket"+t]=n=r}})}t(document,"DOMContentLoaded"),t(window,"DOMContentLoaded"),t(window,"load"),t(window,"pageshow"),t(document,"readystatechange"),n(document,"onreadystatechange"),n(window,"onload"),n(window,"onpageshow")}_delayJQueryReady(e){let t=window.jQuery;Object.defineProperty(window,"jQuery",{get:()=>t,set(n){if(n&&n.fn&&!e.allJQueries.includes(n)){n.fn.ready=n.fn.init.prototype.ready=function(t){e.domReadyFired?t.bind(document)(n):document.addEventListener("rocket-DOMContentLoaded",(()=>t.bind(document)(n)))};const t=n.fn.on;n.fn.on=n.fn.init.prototype.on=function(){if(this[0]===window){function e(e){return e.split(" ").map((e=>"load"===e||0===e.indexOf("load.")?"rocket-jquery-load":e)).join(" ")}"string"==typeof arguments[0]||arguments[0]instanceof String?arguments[0]=e(arguments[0]):"object"==typeof arguments[0]&&Object.keys(arguments[0]).forEach((t=>{delete Object.assign(arguments[0],{[e(t)]:arguments[0][t]})[t]}))}return t.apply(this,arguments),this},e.allJQueries.push(n)}t=n}})}async _triggerDOMContentLoaded(){this.domReadyFired=!0,await this._requestAnimFrame(),document.dispatchEvent(new Event("rocket-DOMContentLoaded")),await this._requestAnimFrame(),window.dispatchEvent(new Event("rocket-DOMContentLoaded")),await this._requestAnimFrame(),document.dispatchEvent(new Event("rocket-readystatechange")),await this._requestAnimFrame(),document.rocketonreadystatechange&&document.rocketonreadystatechange()}async _triggerWindowLoad(){await this._requestAnimFrame(),window.dispatchEvent(new Event("rocket-load")),await this._requestAnimFrame(),window.rocketonload&&window.rocketonload(),await this._requestAnimFrame(),this.allJQueries.forEach((e=>e(window).trigger("rocket-jquery-load"))),window.dispatchEvent(new Event("rocket-pageshow")),await this._requestAnimFrame(),window.rocketonpageshow&&window.rocketonpageshow()}_handleDocumentWrite(){const e=new Map;document.write=document.writeln=function(t){const n=document.currentScript,r=document.createRange(),i=n.parentElement;let o=e.get(n);void 0===o&&(o=n.nextSibling,e.set(n,o));const a=document.createDocumentFragment();r.setStart(a,0),a.appendChild(r.createContextualFragment(t)),i.insertBefore(a,o)}}async _requestAnimFrame(){return new Promise((e=>requestAnimationFrame(e)))}static run(){const e=new RocketLazyLoadScripts(["keydown","mousemove","touchmove","touchstart","touchend","wheel"]);e._addUserInteractionListener(e)}}RocketLazyLoadScripts.run();</script> <title>Designing a Serverless, Cost-Efficient Tool for Data Traceability | ZoomInfo Engineering Blog</title> <style>img:is([sizes="auto" i], [sizes^="auto," i]) { contain-intrinsic-size: 3000px 1500px }</style> <meta name="dc.title" content="Designing a Serverless, Cost-Efficient Tool for Data Traceability | ZoomInfo Engineering Blog"> <meta name="dc.description" content="What is it for? The accuracy and integrity of company data are critical for business operations. However, there are instances when the values of certain company attributes appear incorrect. Internal teams often struggle to identify the root cause of these discrepancies without substantial engineering support. To address this issue, we…"> <meta name="dc.relation" content="https://engineering.zoominfo.com/designing-a-serverless-cost-efficient-tool-for-data-traceability"> <meta name="dc.source" content="https://engineering.zoominfo.com"> <meta name="dc.language" content="en_US"> <meta name="description" content="What is it for? The accuracy and integrity of company data are critical for business operations. However, there are instances when the values of certain company attributes appear incorrect. Internal teams often struggle to identify the root cause of these discrepancies without substantial engineering support. To address this issue, we…"> <meta name="robots" content="index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1"> <link rel="canonical" href="https://engineering.zoominfo.com/designing-a-serverless-cost-efficient-tool-for-data-traceability" /> <meta property="og:url" content="https://engineering.zoominfo.com/designing-a-serverless-cost-efficient-tool-for-data-traceability"> <meta property="og:site_name" content="ZoomInfo Engineering Blog"> <meta property="og:locale" content="en_US"> <meta property="og:type" content="article"> <meta property="og:title" content="Designing a Serverless, Cost-Efficient Tool for Data Traceability | ZoomInfo Engineering Blog"> <meta property="og:description" content="What is it for? The accuracy and integrity of company data are critical for business operations. However, there are instances when the values of certain company attributes appear incorrect. Internal teams often struggle to identify the root cause of these discrepancies without substantial engineering support. To address this issue, we…"> <meta property="og:image" content="https://engineering.zoominfo.com/wp-content/uploads/2024/06/Screenshot-2024-06-06-at-1.46.47 PM.png"> <meta property="og:image:secure_url" content="https://engineering.zoominfo.com/wp-content/uploads/2024/06/Screenshot-2024-06-06-at-1.46.47 PM.png"> <meta property="og:image:width" content="1330"> <meta property="og:image:height" content="578"> <meta name="twitter:card" content="summary"> <meta name="twitter:title" content="Designing a Serverless, Cost-Efficient Tool for Data Traceability | ZoomInfo Engineering Blog"> <meta name="twitter:description" content="What is it for? The accuracy and integrity of company data are critical for business operations. However, there are instances when the values of certain company attributes appear incorrect. Internal teams often struggle to identify the root cause of these discrepancies without substantial engineering support. To address this issue, we…"> <meta name="twitter:image" content="https://engineering.zoominfo.com/wp-content/uploads/2024/06/Screenshot-2024-06-06-at-1.46.47 PM-1024x445.png"> <link rel="alternate" type="application/rss+xml" title="ZoomInfo Engineering Blog » Designing a Serverless, Cost-Efficient Tool for Data Traceability Comments Feed" href="https://engineering.zoominfo.com/designing-a-serverless-cost-efficient-tool-for-data-traceability/feed" /> <style id='wp-emoji-styles-inline-css' type='text/css'> img.wp-smiley, img.emoji { display: inline !important; border: none !important; box-shadow: none !important; height: 1em !important; width: 1em !important; margin: 0 0.07em !important; vertical-align: -0.1em !important; background: none !important; padding: 0 !important; } </style> <link rel='stylesheet' id='wp-block-library-css' href='https://engineering.zoominfo.com/wp-includes/css/dist/block-library/style.min.css?ver=6.7.1' type='text/css' media='all' /> <style id='wpseopress-local-business-style-inline-css' type='text/css'> span.wp-block-wpseopress-local-business-field{margin-right:8px} </style> <style id='classic-theme-styles-inline-css' type='text/css'> /*! This file is auto-generated */ .wp-block-button__link{color:#fff;background-color:#32373c;border-radius:9999px;box-shadow:none;text-decoration:none;padding:calc(.667em + 2px) calc(1.333em + 2px);font-size:1.125em}.wp-block-file__button{background:#32373c;color:#fff;text-decoration:none} </style> <style id='global-styles-inline-css' type='text/css'> :root{--wp--preset--aspect-ratio--square: 1;--wp--preset--aspect-ratio--4-3: 4/3;--wp--preset--aspect-ratio--3-4: 3/4;--wp--preset--aspect-ratio--3-2: 3/2;--wp--preset--aspect-ratio--2-3: 2/3;--wp--preset--aspect-ratio--16-9: 16/9;--wp--preset--aspect-ratio--9-16: 9/16;--wp--preset--color--black: #000000;--wp--preset--color--cyan-bluish-gray: #abb8c3;--wp--preset--color--white: #ffffff;--wp--preset--color--pale-pink: #f78da7;--wp--preset--color--vivid-red: #cf2e2e;--wp--preset--color--luminous-vivid-orange: #ff6900;--wp--preset--color--luminous-vivid-amber: #fcb900;--wp--preset--color--light-green-cyan: #7bdcb5;--wp--preset--color--vivid-green-cyan: #00d084;--wp--preset--color--pale-cyan-blue: #8ed1fc;--wp--preset--color--vivid-cyan-blue: #0693e3;--wp--preset--color--vivid-purple: #9b51e0;--wp--preset--gradient--vivid-cyan-blue-to-vivid-purple: linear-gradient(135deg,rgba(6,147,227,1) 0%,rgb(155,81,224) 100%);--wp--preset--gradient--light-green-cyan-to-vivid-green-cyan: linear-gradient(135deg,rgb(122,220,180) 0%,rgb(0,208,130) 100%);--wp--preset--gradient--luminous-vivid-amber-to-luminous-vivid-orange: linear-gradient(135deg,rgba(252,185,0,1) 0%,rgba(255,105,0,1) 100%);--wp--preset--gradient--luminous-vivid-orange-to-vivid-red: linear-gradient(135deg,rgba(255,105,0,1) 0%,rgb(207,46,46) 100%);--wp--preset--gradient--very-light-gray-to-cyan-bluish-gray: linear-gradient(135deg,rgb(238,238,238) 0%,rgb(169,184,195) 100%);--wp--preset--gradient--cool-to-warm-spectrum: linear-gradient(135deg,rgb(74,234,220) 0%,rgb(151,120,209) 20%,rgb(207,42,186) 40%,rgb(238,44,130) 60%,rgb(251,105,98) 80%,rgb(254,248,76) 100%);--wp--preset--gradient--blush-light-purple: linear-gradient(135deg,rgb(255,206,236) 0%,rgb(152,150,240) 100%);--wp--preset--gradient--blush-bordeaux: linear-gradient(135deg,rgb(254,205,165) 0%,rgb(254,45,45) 50%,rgb(107,0,62) 100%);--wp--preset--gradient--luminous-dusk: linear-gradient(135deg,rgb(255,203,112) 0%,rgb(199,81,192) 50%,rgb(65,88,208) 100%);--wp--preset--gradient--pale-ocean: linear-gradient(135deg,rgb(255,245,203) 0%,rgb(182,227,212) 50%,rgb(51,167,181) 100%);--wp--preset--gradient--electric-grass: linear-gradient(135deg,rgb(202,248,128) 0%,rgb(113,206,126) 100%);--wp--preset--gradient--midnight: linear-gradient(135deg,rgb(2,3,129) 0%,rgb(40,116,252) 100%);--wp--preset--font-size--small: 13px;--wp--preset--font-size--medium: 20px;--wp--preset--font-size--large: 36px;--wp--preset--font-size--x-large: 42px;--wp--preset--spacing--20: 0.44rem;--wp--preset--spacing--30: 0.67rem;--wp--preset--spacing--40: 1rem;--wp--preset--spacing--50: 1.5rem;--wp--preset--spacing--60: 2.25rem;--wp--preset--spacing--70: 3.38rem;--wp--preset--spacing--80: 5.06rem;--wp--preset--shadow--natural: 6px 6px 9px rgba(0, 0, 0, 0.2);--wp--preset--shadow--deep: 12px 12px 50px rgba(0, 0, 0, 0.4);--wp--preset--shadow--sharp: 6px 6px 0px rgba(0, 0, 0, 0.2);--wp--preset--shadow--outlined: 6px 6px 0px -3px rgba(255, 255, 255, 1), 6px 6px rgba(0, 0, 0, 1);--wp--preset--shadow--crisp: 6px 6px 0px rgba(0, 0, 0, 1);}:where(.is-layout-flex){gap: 0.5em;}:where(.is-layout-grid){gap: 0.5em;}body .is-layout-flex{display: flex;}.is-layout-flex{flex-wrap: wrap;align-items: center;}.is-layout-flex > :is(*, div){margin: 0;}body .is-layout-grid{display: grid;}.is-layout-grid > :is(*, div){margin: 0;}:where(.wp-block-columns.is-layout-flex){gap: 2em;}:where(.wp-block-columns.is-layout-grid){gap: 2em;}:where(.wp-block-post-template.is-layout-flex){gap: 1.25em;}:where(.wp-block-post-template.is-layout-grid){gap: 1.25em;}.has-black-color{color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-color{color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-color{color: var(--wp--preset--color--white) !important;}.has-pale-pink-color{color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-color{color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-color{color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-color{color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-color{color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-color{color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-color{color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-color{color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-color{color: var(--wp--preset--color--vivid-purple) !important;}.has-black-background-color{background-color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-background-color{background-color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-background-color{background-color: var(--wp--preset--color--white) !important;}.has-pale-pink-background-color{background-color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-background-color{background-color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-background-color{background-color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-background-color{background-color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-background-color{background-color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-background-color{background-color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-background-color{background-color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-background-color{background-color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-background-color{background-color: var(--wp--preset--color--vivid-purple) !important;}.has-black-border-color{border-color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-border-color{border-color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-border-color{border-color: var(--wp--preset--color--white) !important;}.has-pale-pink-border-color{border-color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-border-color{border-color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-border-color{border-color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-border-color{border-color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-border-color{border-color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-border-color{border-color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-border-color{border-color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-border-color{border-color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-border-color{border-color: var(--wp--preset--color--vivid-purple) !important;}.has-vivid-cyan-blue-to-vivid-purple-gradient-background{background: var(--wp--preset--gradient--vivid-cyan-blue-to-vivid-purple) !important;}.has-light-green-cyan-to-vivid-green-cyan-gradient-background{background: var(--wp--preset--gradient--light-green-cyan-to-vivid-green-cyan) !important;}.has-luminous-vivid-amber-to-luminous-vivid-orange-gradient-background{background: var(--wp--preset--gradient--luminous-vivid-amber-to-luminous-vivid-orange) !important;}.has-luminous-vivid-orange-to-vivid-red-gradient-background{background: var(--wp--preset--gradient--luminous-vivid-orange-to-vivid-red) !important;}.has-very-light-gray-to-cyan-bluish-gray-gradient-background{background: var(--wp--preset--gradient--very-light-gray-to-cyan-bluish-gray) !important;}.has-cool-to-warm-spectrum-gradient-background{background: var(--wp--preset--gradient--cool-to-warm-spectrum) !important;}.has-blush-light-purple-gradient-background{background: var(--wp--preset--gradient--blush-light-purple) !important;}.has-blush-bordeaux-gradient-background{background: var(--wp--preset--gradient--blush-bordeaux) !important;}.has-luminous-dusk-gradient-background{background: var(--wp--preset--gradient--luminous-dusk) !important;}.has-pale-ocean-gradient-background{background: var(--wp--preset--gradient--pale-ocean) !important;}.has-electric-grass-gradient-background{background: var(--wp--preset--gradient--electric-grass) !important;}.has-midnight-gradient-background{background: var(--wp--preset--gradient--midnight) !important;}.has-small-font-size{font-size: var(--wp--preset--font-size--small) !important;}.has-medium-font-size{font-size: var(--wp--preset--font-size--medium) !important;}.has-large-font-size{font-size: var(--wp--preset--font-size--large) !important;}.has-x-large-font-size{font-size: var(--wp--preset--font-size--x-large) !important;} :where(.wp-block-post-template.is-layout-flex){gap: 1.25em;}:where(.wp-block-post-template.is-layout-grid){gap: 1.25em;} :where(.wp-block-columns.is-layout-flex){gap: 2em;}:where(.wp-block-columns.is-layout-grid){gap: 2em;} :root :where(.wp-block-pullquote){font-size: 1.5em;line-height: 1.6;} </style> <link data-minify="1" rel='stylesheet' id='contact-form-7-css' href='https://engineering.zoominfo.com/wp-content/cache/min/1/wp-content/plugins/contact-form-7/includes/css/styles.css?ver=1737475415' type='text/css' media='all' /> <link data-minify="1" rel='stylesheet' id='styles-css' href='https://engineering.zoominfo.com/wp-content/cache/min/1/wp-content/themes/engineering/style.css?ver=1737475415' type='text/css' media='all' /> <link data-minify="1" rel='stylesheet' id='footer-css' href='https://engineering.zoominfo.com/wp-content/cache/min/1/wp-content/themes/engineering/assets/footer.css?ver=1737475415' type='text/css' media='all' /> <link data-minify="1" rel='stylesheet' id='header-main-css' href='https://engineering.zoominfo.com/wp-content/cache/min/1/wp-assets/header-footer/header-main.css?ver=1737475415' type='text/css' media='all' /> <link rel="EditURI" type="application/rsd+xml" title="RSD" href="https://engineering.zoominfo.com/xmlrpc.php?rsd" /> <link rel='shortlink' href='https://engineering.zoominfo.com/?p=333' /> <link rel="alternate" title="oEmbed (JSON)" type="application/json+oembed" href="https://engineering.zoominfo.com/wp-json/oembed/1.0/embed?url=https%3A%2F%2Fengineering.zoominfo.com%2Fdesigning-a-serverless-cost-efficient-tool-for-data-traceability" /> <link rel="alternate" title="oEmbed (XML)" type="text/xml+oembed" href="https://engineering.zoominfo.com/wp-json/oembed/1.0/embed?url=https%3A%2F%2Fengineering.zoominfo.com%2Fdesigning-a-serverless-cost-efficient-tool-for-data-traceability&format=xml" /> <link rel="icon" href="https://engineering.zoominfo.com/wp-content/uploads/2020/02/cropped-favicon-1-1-32x32.png" sizes="32x32" /> <link rel="icon" href="https://engineering.zoominfo.com/wp-content/uploads/2020/02/cropped-favicon-1-1-192x192.png" sizes="192x192" /> <link rel="apple-touch-icon" href="https://engineering.zoominfo.com/wp-content/uploads/2020/02/cropped-favicon-1-1-180x180.png" /> <meta name="msapplication-TileImage" content="https://engineering.zoominfo.com/wp-content/uploads/2020/02/cropped-favicon-1-1-270x270.png" /> <script type="rocketlazyloadscript" async src='https://www.googletagmanager.com/gtag/js?id='></script><script type="rocketlazyloadscript"> window.dataLayer = window.dataLayer || []; function gtag(){dataLayer.push(arguments);}gtag('js', new Date()); gtag('config', '' , {}); </script> <base href="/"> <meta name="viewport" content="width=device-width"> <meta name="description" content="Code, Build, Iterate"> <script type="rocketlazyloadscript"> dataLayer = []; </script> <script type="rocketlazyloadscript" data-rocket-type="text/javascript"> /* var countryNon = 0; var cookies = document.cookie; function get_cookies_array() { var cookies = {}; if (document.cookie && document.cookie != '') { var split = document.cookie.split(';'); for (var i = 0; i < split.length; i++) { var name_value = split[i].split("="); name_value[0] = name_value[0].replace(/^ /, ''); cookies[decodeURIComponent(name_value[0])] = decodeURIComponent(name_value[1]); } } return cookies; } var cookiesArray = get_cookies_array(); if ( (!cookiesArray['CookieConsent'] && countryNon) || cookiesArray['CookieConsent'] === 'true' ) {*/ /*var _elqQ = _elqQ || []; _elqQ.push(['elqSetSiteId', '1250979615']); _elqQ.push(['elqUseFirstPartyCookie', 'web.zoominfo.com']); _elqQ.push(['elqTrackPageView',window.location.href]); (function () { function async_load() { var s = document.createElement('script'); s.type = 'text/javascript'; s.async = true; s.src = '//img04.en25.com/i/elqCfg.min.js'; var x = document.getElementsByTagName('script')[0]; x.parentNode.insertBefore(s, x); } if (window.addEventListener) window.addEventListener('DOMContentLoaded', async_load, false); else if (window.attachEvent) window.attachEvent('onload', async_load); })();*/ // var GOOGLE_TAG_MANAGER_ID = config.isProd ? 'GTM-PHWTRTJ' : 'GTM-MQM5HKH'; var GOOGLE_TAG_MANAGER_ID = 'GTM-PHWTRTJ'; (function (w, d, s, l, i) { w[l] = w[l] || []; w[l].push({ 'gtm.start': new Date().getTime(), event: 'gtm.js' }); var f = d.getElementsByTagName(s)[0], j = d.createElement(s), dl = l != 'dataLayer' ? '&l=' + l : ''; j.async = true; j.src = 'https://www.googletagmanager.com/gtm.js?id=' + i + dl; f.parentNode.insertBefore(j, f); })(window, document, 'script', 'dataLayer', GOOGLE_TAG_MANAGER_ID); //} </script> <script type="rocketlazyloadscript" data-rocket-type="text/javascript"> // function to pull cookie value function getCookie(name) { var value = "; " + document.cookie; var parts = value.split("; " + name + "="); if (parts.length == 2) return parts.pop().split(";").shift(); } function OptanonWrapper() { console.log("OptanonWrapper called"); var OABCcookieName = "OptanonAlertBoxClosed"; var bannerAcceptBtn = document.getElementById("onetrust-accept-btn-handler"); var pcAllowAllBtn = document.getElementById("accept-recommended-btn-handler"); var pcSaveBtn = document.getElementsByClassName("save-preference-btn-handler onetrust-close-btn-handler")[0]; var OABCcookie = getCookie(OABCcookieName); // IF logic needed here because ot-banner-sdk DIV is not injected on page loads if banner is not exposed if (!OABCcookie && bannerAcceptBtn) { bannerAcceptBtn.addEventListener('click', function() { console.log("Allowed all via Banner"); location.reload(); }); } if (pcAllowAllBtn) pcAllowAllBtn.addEventListener('click', function() { console.log("Allowed all via Preference Center"); location.reload(); }); if(pcSaveBtn){ pcSaveBtn.addEventListener('click', function() { setTimeout(()=> { console.log("Set custom settings via Preference Center"); location.reload(); }, 1000) //quick timeout so that the consent receipt can be sent and the cookie can be updated }); } } </script> </head> <header class="header"> <div class="nav-header"> <!-- DESKTOP NAVIGATION --> <a class="header-logo" href="//www.zoominfo.com/"><img src="/wp-assets/header-footer/images/zoominfo-logo-new.svg" alt="ZoomInfo logo"></a> <div class="desktop-nav"> <!-- Main Menu --> <div class="menu-top-menu-container"> <ul class="main-nav"> <li class="menu-item"> <a href="//www.zoominfo.com/pricing">Pricing</a> </li> <li id="solutions-menu-item" class="columns-sub-menu-header menu-item menu-item-has-children"> <!-- Sub Menu --> <a class="">Solutions</a> <ul class="sub-menu-header"> <!-- Sub Menu Left --> <li id="solutions-submenu-left" class="sub-menu-header-title menu-item menu-item-has-children"> <p>BY ROLE</p> <ul class="sub-menu-header"> <li class="menu-item"> <a href="//www.zoominfo.com/solutions/sales">Sales</a> </li> <li class="menu-item"> <a href="//www.zoominfo.com/solutions/marketing">Marketing</a> </li> <li class="menu-item"> <a href="//www.zoominfo.com/solutions/enterprise">Enterprise</a> </li> <li class="menu-item"> <a href="//www.zoominfo.com/solutions/account-management-platform">Account Management</a> </li> <li class="menu-item"> <a href="//www.zoominfo.com/solutions/recruiting">Recruiting</a> </li> </ul> </li> <!-- END Sub Menu Left --> <!-- Sub Menu Right --> <li id="solutions-submenu-right" class="sub-menu-header-title menu-item menu-item-has-children"> <p>BY USE CASE</p> <ul class="sub-menu-header"> <li class="menu-item"> <a>Prospecting</a> </li> <li class="menu-item"> <a>Demand Generation</a> </li> <li class="menu-item"> <a>Data Management</a> </li> <li class="menu-item"> <a>Data Custom Solutions</a> </li> <div class="menu-item new"> <a href="//engage.zoominfo.com">Sales Engagement</a> </div> </ul> </li> <!-- END Sub Menu Right --> <!-- Sub Menus Extended --> <li id="solutions-submenus-extended" class="menu-item menu-item-has-children"> <!-- Extended Sub Menu 1 --> <ul class="sub-menu-header-extended closed-extend"> <li class="menu-item"> <a href="//www.zoominfo.com/solutions/contact-company-search">Contact & Company Search<p>B2B intelligence, at your fingertips</p></a> </li> <li class="menu-item"> <a href="//www.zoominfo.com/solutions/intent-data-alerts">Buyer Intent<p>Insights you can’t get anywhere else</p></a> </li> <li class="menu-item"> <a href="//www.zoominfo.com/solutions/reachout">Web Research & Social Selling<p>Access data, on-demand</p></a> </li> <li class="menu-item"> <a href="//www.zoominfo.com/solutions/workflows">Automated Intelligence & Outreach<p>Deliver the right message to the perfect prospect</p></a> </li> <li class="menu-item"> <a href="//www.zoominfo.com/solutions/ai-icp">Ideal Customer Profile<p>Reveal the prospects you should be targeting</p></a> </li> </ul> <!-- Extended Sub Menu 2 --> <ul class="sub-menu-header-extended closed-extend"> <li class="menu-item"> <a href="//www.zoominfo.com/solutions/formcomplete">Webform Optimizations<p>Convert more leads using less form fields</p></a> </li> <li class="menu-item"> <a href="//www.zoominfo.com/solutions/websights">Website Visitor Tracking<p>Capture anonymous visitors & take immediate action</p></a> </li> </ul> <!-- Extended Sub Menu 3 --> <ul class="sub-menu-header-extended closed-extend"> <li class="menu-item"> <a href="//www.zoominfo.com/solutions/enrich">Lead Enrichment<p>Append existing & incoming lead records</p></a> </li> <li class="menu-item"> <a href="//www.zoominfo.com/solutions/inboxai">Activity & Pipeline Management<p>Capture contacts & sync communications into your CRM</p></a> </li> <li class="menu-item"> <a href="//www.zoominfo.com/solutions/compliance">Compliance API<p>Ensure your data complies with GDPR & CCPA</p></a> </li> </ul> <!-- Extended Sub Menu 4 --> <ul class="sub-menu-header-extended closed-extend"> <li class="menu-item"> <a href="//www.zoominfo.com/solutions/enterprise-api">Enterprise API<p>Add ZoomInfo's B2B intelligence to your infrastructure</p></a> </li> <li class="menu-item"> <a href="//www.zoominfo.com/solutions/integrations">Integrations<p>Integrate best-in-class B2B intelligence into your business applications</p></a> </li> </ul> </li> <!-- END Sub Menus Extended --> </ul> <!-- END Sub Menu --> </li> <li class="menu-item"> <a href="//www.zoominfo.com/our-data">Our Data</a> </li> <li id="resources-menu-item" class="resources-sub-menu-header menu-item menu-item-has-children"> <!-- Sub Menu --> <a class="">Resources</a> <ul class="sub-menu-header"> <li class="menu-item"> <a href="//pipeline.zoominfo.com/">The Pipeline</a> </li> <li class="menu-item"> <a href="//www.zoominfo.com/b2b/customer-success">Case Studies</a> </li> <li class="menu-item"> <a href="//www.zoominfo.com/b2b/partner">Partner Program</a> </li> <li class="menu-item"> <a href="//www.zoominfo.com/resources">Resource Center</a> </li><!-- <li class="menu-item"> <a href="//www.zoominfo.com/business/about/news-press/">News & Press</a> </li> <li class="menu-item"> <a href="http://www.zoominfo.com/b2b/success-recipes">Recipes for Success</a> </li>--> <li class="menu-item"> <a href="//www.zoominfo.com/hub">Learning Hub</a> </li> <li class="menu-item"> <a href="//www.zoominfo.com/b2b-tools">Interactive Tools</a> </li> <li class="menu-item"> <a href="//www.zoominfo.com/about">About Us</a> </li><!-- <li class="menu-item"> <a href="//www.zoominfo.com/covid-19-news">Covid-19 Newsfeed</a> </li> <li class="menu-item"> <a href="//ir.zoominfo.com">Investor Relations</a> </li> <li class="menu-item"> <a href="//www.zoominfo.com/b2b/data-sources">Data Transparency</a> </li>--> </ul> <!-- END Sub Menu --> </li> </ul> </div> <!-- END Main Menu --> <!-- Side Menu --> <div class="menu-free-trial-container"> <ul id="menu-free-trial" class="main-nav"> <li class="menu-item"> <a href="//login.zoominfo.com/">Login</a> </li> <li class="menu-item"> <a href="//www.zoominfo.com/business/free-trial?camp_id=7011U000000US9wQAG"><button class="btn-nav">Free Trial</button></a> </li> </ul> </div> <!-- END Side Menu --> </div> <!-- END DESKTOP NAVIGATION --> <!-- MOBILE NAVIGATION --> <div class="mobile-nav"> <img src="/wp-assets/header-footer/images/new-website-hamburger.svg" alt="Navigation" class="nav-trigger"> <nav> <!-- Mobile Menus --> <ul> <!-- Mobile - Main Menu --> <div id="menu-main-mobile-container"> <ul id="menu-main-mobile" class="mobile-nav-menu"> <li class="menu-item"> <a href="//www.zoominfo.com/pricing">Pricing</a> </li> <li class="mobile-solutions-role menu-item menu-item-has-children"> <a>Solutions by Role</a> </li> <li class="mobile-solutions-case menu-item menu-item-has-children"> <a>Solutions by Use Case</a> </li> <li class="menu-item"> <a href="//www.zoominfo.com/our-data">Our Data</a> </li> <li class="mobile-resources menu-item menu-item-has-children"> <a>Resources</a> </li> <li class="menu-item"> <a href="//login.zoominfo.com/">Login</a> </li> </ul> </div> <!-- END Mobile - Main Menu --> <!-- Mobile - Solutions by Role Menu --> <div id="menu-solutions-role-container" class="mobile-sub-menu-header"> <ul id="menu-solutions-role" class="mobile-nav-menu"> <li class="solutions-role-go-back menu-item"> <a>Solutions by Role</a> </li> <li class="menu-item"> <a href="//www.zoominfo.com/solutions/sales">Sales</a> </li> <li class="menu-item"> <a href="//www.zoominfo.com/solutions/marketing">Marketing</a> </li> <li class="menu-item"> <a href="//www.zoominfo.com/solutions/enterprise">Enterprise</a> </li> <li class="menu-item"> <a href="//www.zoominfo.com/solutions/account-management-platform">Account Management</a> </li> <li class="menu-item"> <a href="//www.zoominfo.com/solutions/recruiting">Recruiting</a> </li> </ul> </div> <!-- END Mobile - Solutions Menu --> <!-- Mobile - Solutions by Use Case Menu --> <div id="menu-solutions-case-container" class="mobile-sub-menu-header""> <ul id="menu-solutions-case" class="mobile-nav-menu"> <li class="solutions-case-go-back menu-item"> <a>Solutions by Use Case</a> </li> <li class="menu-item menu-item-has-children mobile-solutions-case-prospecting"> <a>Prospecting</a> </li> <li class="menu-item menu-item-has-children mobile-solutions-case-demand"> <a>Demand Generation</a> </li> <li class="menu-item menu-item-has-children mobile-solutions-case-data"> <a>Data Management</a> </li> <li class="menu-item menu-item-has-children mobile-solutions-case-custom"> <a>Data Custom Solutions</a> </li> <li class="menu-item new"> <a href="//engage.zoominfo.com">Sales Engagement</a> </li> </ul> </div> <!-- END Mobile - Solutions by Use Case Menu --> <!-- Mobile - Prospecting Menu - child of Solutions by Use Case --> <div id="menu-solutions-case-prospecting-container" class="mobile-sub-menu-header"> <ul id="menu-solutions-case-prospecting" class="mobile-nav-menu"> <li class="solutions-case-go-back-child menu-item"> <a>Prospecting</a> </li> <li class="menu-item "> <a class="menu-item-description" href="//www.zoominfo.com/solutions/contact-company-search">Contact & Company Search <p>B2B intelligence, at your fingertips</p> </a> </li> <li class="menu-item "> <a class="menu-item-description" href="//www.zoominfo.com/solutions/intent-data-alerts">Buyer Intent <p>Insights you can’t get anywhere else</p> </a> </li> <li class="menu-item"> <a class="menu-item-description" href="//www.zoominfo.com/solutions/reachout">Web Research & Social Selling <p>Access data, on-demand</p> </a> </li> <li class="menu-item"> <a class="menu-item-description" href="//www.zoominfo.com/solutions/workflows">Automated Intelligence & Outreach <p>Deliver the right message to the perfect prospect</p> </a> </li> <li class="menu-item"> <a class="menu-item-description" href="//www.zoominfo.com/solutions/ai-icp">Ideal Customer Profile <p>Reveal the prospects you should be targeting</p> </a> </li> </ul> </div> <!-- END Mobile - Prospecting Menu --> <!-- Mobile - Demand Generation Menu - child of Solutions by Use Case --> <div id="menu-solutions-case-demand-container" class="mobile-sub-menu-header"> <ul id="menu-solutions-case-demand" class="mobile-nav-menu"> <li class="solutions-case-go-back-child menu-item"> <a>Demand Generation</a> </li> <li class="menu-item "> <a class="menu-item-description" href="//www.zoominfo.com/solutions/formcomplete">Webform Optimizations <p>Convert more leads using less form fields</p> </a> </li> <li class="menu-item"> <a class="menu-item-description" href="//www.zoominfo.com/solutions/websights">Website Visitor Tracking <p>Capture anonymous visitors & take immediate action</p> </a> </li> </ul> </div> <!-- END Mobile - Demand Generation Menu --> <!-- Mobile - Data Management Menu - child of Solutions by Use Case --> <div id="menu-solutions-case-data-container" class="mobile-sub-menu-header"> <ul id="menu-solutions-case-data" class="mobile-nav-menu"> <li class="solutions-case-go-back-child menu-item"> <a>Data Management</a> </li> <li class="menu-item "> <a class="menu-item-description" href="//www.zoominfo.com/solutions/enrich">Lead Enrichment <p>Append existing & incoming lead records</p> </a> </li> <li class="menu-item"> <a class="menu-item-description" href="//www.zoominfo.com/solutions/inboxai">Activity & Pipeline Management <p>Capture contacts & sync communications into your CRM</p> </a> </li> <li class="menu-item"> <a class="menu-item-description" href="//www.zoominfo.com/solutions/compliance">Compliance API <p>Ensure your data complies with GDPR & CCPA</p> </a> </li> </ul> </div> <!-- END Mobile - Data Management Menu --> <!-- Mobile - Custom Solutions Menu - child of Solutions by Use Case --> <div id="menu-solutions-case-custom-container" class="mobile-sub-menu-header"> <ul id="menu-solutions-case-custom" class="mobile-nav-menu"> <li class="solutions-case-go-back-child menu-item"> <a>Data Custom Solutions</a> </li> <li class="menu-item "> <a class="menu-item-description" href="//www.zoominfo.com/solutions/enterprise-api">Enterprise API <p>Add ZoomInfo's B2B intelligence to your infrastructure</p> </a> </li> <li class="menu-item"> <a class="menu-item-description" href="//www.zoominfo.com/solutions/integrations">Integrations <p>Integrate best-in-class B2B intelligence into your business applications</p> </a> </li> </ul> </div> <!-- END Mobile - Custom Solutions Menu --> <!-- Mobile - Resources Menu --> <div id="menu-resources-container" class="mobile-sub-menu-header"> <ul id="menu-resources" class="mobile-nav-menu"> <li class="resources-go-back menu-item"> <a>Resources</a> </li> <li class="menu-item"> <a href="//pipeline.zoominfo.com/">The Pipeline</a> </li> <li class="menu-item"> <a href="//www.zoominfo.com/b2b/customer-success">Case Studies</a> </li> <li class="menu-item"> <a href="//www.zoominfo.com/b2b/partner">Partner Program</a> </li> <li class="menu-item"> <a href="//www.zoominfo.com/resources">Resource Center</a> </li><!-- <li class="menu-item"> <a href="//www.zoominfo.com/business/about/news-press/">News & Press</a> </li> <li class="menu-item"> <a href="http://www.zoominfo.com/b2b/success-recipes">Recipes for Success</a> </li>--> <li class="menu-item"> <a href="//www.zoominfo.com/hub">Learning Hub</a> </li> <li class="menu-item"> <a href="//www.zoominfo.com/b2b-tools">Interactive Tools</a> </li> <li class="menu-item"> <a href="//www.zoominfo.com/about">About Us</a> </li><!-- <li class="menu-item"> <a href="//www.zoominfo.com/covid-19-news">Covid-19 Newsfeed</a> </li> <li class="menu-item"> <a href="//ir.zoominfo.com">Investor Relations</a> </li> <li class="menu-item"> <a href="//www.zoominfo.com/b2b/data-sources">Data Transparency</a> </li>--> </ul> </div> <!-- END Mobile - Resources Menu --> </ul> <!-- END Mobile Menus --> <!-- Mobile Bottom Menu --> <ul id="mobile-bottom-nav" class="mobile-nav-menu"> <li class="menu-item"> <a href="//www.zoominfo.com/business/free-trial?camp_id=7011U000000US9wQAG"><button class="btn-nav">Free Trial</button></a> </li> </ul> <!-- END Mobile Bottom Menu --> </nav> </div> <!-- END MOBILE NAVIGATION --> </div> </header> <div id="progress" data-top="width:0%;" data-center-bottom="width:100%;" data-anchor-target=".single-post-wrapper"></div> <div class="single-post-wrapper"> <section class="post-padding-section black-background"> <div class="extra-large-wrapper"> <div class="flex-wrapper space-between"> <div class="blog-link"> <a href="/" class="text-link" rel="noopener">Back to Blog</a> </div> <div class="relative"> <ul class="category-list"> <li><a href="https://engineering.zoominfo.com/category/application">Application</a></li><li><a href="https://engineering.zoominfo.com/category/data-application">Data Application</a></li> </ul> <h1 class="h1 monospace white">Designing a Serverless, Cost-Efficient Tool for Data Traceability</h1> <span class="margin-top-longest small-text"> By ZoomInfo Engineering, <span>Jason Zhang,</span> June 6, 2024 </span> <div class="post-thumbnail-image"><img width="1330" height="578" src="https://engineering.zoominfo.com/wp-content/uploads/2024/06/Screenshot-2024-06-06-at-1.46.47 PM.png" class="attachment-post-thumbnail size-post-thumbnail wp-post-image" alt="" decoding="async" fetchpriority="high" srcset="https://engineering.zoominfo.com/wp-content/uploads/2024/06/Screenshot-2024-06-06-at-1.46.47 PM.png 1330w, https://engineering.zoominfo.com/wp-content/uploads/2024/06/Screenshot-2024-06-06-at-1.46.47 PM-300x130.png 300w, https://engineering.zoominfo.com/wp-content/uploads/2024/06/Screenshot-2024-06-06-at-1.46.47 PM-1024x445.png 1024w, https://engineering.zoominfo.com/wp-content/uploads/2024/06/Screenshot-2024-06-06-at-1.46.47 PM-768x334.png 768w" sizes="(max-width: 1330px) 100vw, 1330px" /></div> </div> </div> </div> </section> <section class="long-padding-section"> <div class="medium-small-wrapper"> <img src="https://engineering.zoominfo.com/wp-content/themes/engineering/images/shapes.svg" alt="" class="shapes-image"> <div class="main-copy-section margin-top"> <h2 class="wp-block-heading">What is it for?</h2> <p>The accuracy and integrity of company data are critical for business operations. However, there are instances when the values of certain company attributes appear incorrect. Internal teams often struggle to identify the root cause of these discrepancies without substantial engineering support. To address this issue, we recognized the need for a tool that enables internal users to understand the underlying problems without requiring constant intervention from engineers. Our solution was to create traceability data and make it accessible through an API and an user-friendly interface.</p> <p>Key Objectives:</p> <ul class="wp-block-list"> <li>Provide Insight: Enable internal users to understand why company attributes have specific values.</li> <li>Facilitate Investigation: Simplify the investigation of data issues.</li> <li>Historical Context: Offer insight into the historical values of attributes.</li> <li>Evidence Presentation: Present the underlying evidence for a particular version of a value.</li> </ul> <p>This tool aims to streamline the investigative process, reduce dependency on engineering teams, and ultimately enhance data reliability across the organization.</p> <h2 class="wp-block-heading">What is the Solution?<br></h2> <p><img decoding="async" src="https://lh7-us.googleusercontent.com/docsz/AD_4nXeUSqsyW7W5InpNQ0OEMZaIofjL8jaVzKwQEvkNe28HTTpivIirrTwAUz6bXdgLWIs0neY54xgsF3wZRR9XWbD9f-l-P6M_TND9NRJ9uFbCRd7xnfkNE_-y_myCK0ZnbYmi_adlVq3A4dt2XIaLWo4Nnqg?key=xPsjO4JuVLwrc2c_6-BZ_g" width="624" height="261"></p> <p>To develop this tool, we leveraged a serverless infrastructure, which offers scalability, cost efficiency, and ease of maintenance. The primary components of our solution include:</p> <ul class="wp-block-list"> <li>API Gateway: Acts as the entry point for API requests, ensuring secure and efficient routing.</li> <li>AWS Lambda: Provides the compute power for executing our code in response to API calls, enabling a scalable and cost-effective solution.</li> <li>Amazon Athena: Enables SQL queries on the traceability data stored in Amazon S3/HUDI, providing an interactive and cost-effective way to query large datasets without needing to set up or manage infrastructure. Charging only for the data scanned.</li> <li>Amazon S3: Serves as our storage solution for traceability data, ensuring durability and easy access.</li> <li>Apache Hudi: Manages the large datasets involved, facilitating quick queries and maintaining historical data changes efficiently.</li> </ul> <h2 class="wp-block-heading">Why this solution?</h2> <p>The solution offer several key benefits:</p> <ul class="wp-block-list"> <li>Cost Efficiency: With serverless, we only pay for the actual compute time used, avoiding the cost of idle resources. The underlined huge amount of data is saved on s3 which is a cheap storage compared to any database solution. </li> <li>Maintenance: The reduced need for managing servers allows our team to focus on core development tasks rather than infrastructure management.</li> <li>Scalability: Serverless architectures automatically scale to handle varying loads, ensuring the system remains responsive even during peak usage.</li> </ul> <p>This combination of technologies ensures that our tool is powerful, reliable, and optimized for both performance and cost.</p> <h2 class="wp-block-heading">Performance Tuning</h2> <p>Performance tuning is a critical aspect of our solution, especially given the large volumes of data we handle. Data partition strategy plays the critical role for the performance. The partition metadata is saved in amazon glue(Hive datastore). Query will fetch partition metadata during query planning.</p> <p>Here are the key strategies we employed to ensure optimal performance:</p> <h3 class="wp-block-heading">Partitioning</h3> <p>We partitioned our data in S3 based query pattern, given the query involved on fields like time, attribute_name, company id, So those attributes are considered as part of partition’s definition, and for company id, we use mod(company id, N) which is similar to bucketing. This approach minimizes the data scanned during queries, significantly speeding up retrieval times.</p> <h3 class="wp-block-heading">Partition Indexing</h3> <p>When we run the query, we found that the query planning time takes the majority of the part, so we enable partition indexing to reduce the query plan time(query the partition metadata). </p> <h3 class="wp-block-heading">Partition Projection</h3> <p>Proper way to partition data with partition indexing, the query speed did increase significantly, But when data grows, query starts slowing down due to the growth of the number of partitions which lead query planning time to increase. Using partition projection can actually solve this problem, partition projection can let you define how the partition looks without saving all the partition metadata in glue which nearly reduces query planning time to 0. The partition projection brings those benefits: Automatically handles partitioning based on a defined template, removing the need for manual updates; No need to store extensive partition metadata, as partitions are computed dynamically at query time; Efficiently processes queries for large datasets with many partitions, leading to faster query execution. </p> <p>To enable partition projection in Athena, configure the TBLPROPERTIES(sample) as demonstrated below when creating an external table for various partition field types:</p> <p><em>TBLPROPERTIES (</em><em><br></em><em> ‘projection.enabled’=’true’, </em></p> <p><em> ‘projection.attribute_name.type’=’enum’, </em></p> <p><em> ‘projection.attribute_name.values’=’employees,revenue,linkedin_url,founded_year,industry’,</em></p> <p><em> ‘projection.entity_id_mod.type’=’integer’,</em></p> <p><em> ‘projection.entity_id_mod.interval’=’1’, </em></p> <p><em> ‘projection.entity_id_mod.range’=’0,9’, </em></p> <p><em> ‘projection.created_date.type’=’date’, </em></p> <p><em> ‘projection.created_date.format’=’yyyy-MM-dd’, </em></p> <p><em> ‘projection.created_date.interval’=’1’, </em></p> <p><em> ‘projection.created_date.interval.unit’=’days’, </em></p> <p><em> ‘projection.created_date.range’=’2022-01-01,NOW’ </em></p> <p><em>)</em></p> <p>By focusing on these performance tuning techniques, <strong>We can efficiently retrieve the necessary data from terabyte-scale datasets within 1-2 seconds</strong>, while keeping infrastructure costs minimal, and it is scalable even as the datasets grow volume because we can quickly find the data paths and scan the data we need.</p> <h2 class="wp-block-heading">Summary</h2> <p>An effective partition strategy is vital. Choosing an improper partition key or having excessive partitions can harm performance. It’s important to grasp the business use case, query patterns, and data characteristics to create an optimal data layout. We developed a tool that revolutionizes how our teams explore and resolve data issues. By utilizing a serverless infrastructure and fine-tuned performance, we crafted a robust, efficient, scalable solution. This tool boosts data integrity, enabling our teams to address data problems and enhance quality with reduced dependency on engineering support.</p> </div> <ul class="category-list margin-top-longer no-bottom-margin"> </ul> </section> </div> <section class="normal-padding-section border-top-section center"> <div class="extra-large-wrapper"> <h3 class="h2">Related Content</h3> <ul class="three-column-list space-around"> <li> <div class="shadow-box link no-padding"> <a href="https://engineering.zoominfo.com/zoominfo-data-platform-zdp-ingestion-process-improvement" class="thumbnail-link"> <div class="thumbnail-image"><img width="2112" height="1366" src="https://engineering.zoominfo.com/wp-content/uploads/2024/12/Screenshot-2024-12-18-at-9.00.58 AM.png" class="attachment-post-thumbnail size-post-thumbnail wp-post-image" alt="" decoding="async" loading="lazy" srcset="https://engineering.zoominfo.com/wp-content/uploads/2024/12/Screenshot-2024-12-18-at-9.00.58 AM.png 2112w, https://engineering.zoominfo.com/wp-content/uploads/2024/12/Screenshot-2024-12-18-at-9.00.58 AM-300x194.png 300w, https://engineering.zoominfo.com/wp-content/uploads/2024/12/Screenshot-2024-12-18-at-9.00.58 AM-1024x662.png 1024w, https://engineering.zoominfo.com/wp-content/uploads/2024/12/Screenshot-2024-12-18-at-9.00.58 AM-768x497.png 768w, https://engineering.zoominfo.com/wp-content/uploads/2024/12/Screenshot-2024-12-18-at-9.00.58 AM-1536x993.png 1536w, https://engineering.zoominfo.com/wp-content/uploads/2024/12/Screenshot-2024-12-18-at-9.00.58 AM-2048x1325.png 2048w" sizes="auto, (max-width: 2112px) 100vw, 2112px" /></div> </a> <ul class="post-categories"> <li><a href="https://engineering.zoominfo.com/category/data-application" rel="category tag">Data Application</a></li> <li><a href="https://engineering.zoominfo.com/category/data-platform" rel="category tag">Data Platform</a></li></ul> <a href="https://engineering.zoominfo.com/zoominfo-data-platform-zdp-ingestion-process-improvement" class="padding-wrapper"> <h3 class="h4">Zoominfo Data Platform (ZDP) ingestion process improvement</h3> <p class="paragraph-text"> <!-- wp:heading --> Background <!-- /wp:heading --> <!-- wp:paragraph --> The Zoominfo Data Plat... </p> </a> </div> </li> <li> <div class="shadow-box link no-padding"> <a href="https://engineering.zoominfo.com/gcp-dataflow-advanced-topics-part-ii" class="thumbnail-link"> <div class="thumbnail-image"><img width="1024" height="1024" src="https://engineering.zoominfo.com/wp-content/uploads/2024/02/dataflow-advanced-topics1.jpg" class="attachment-post-thumbnail size-post-thumbnail wp-post-image" alt="" decoding="async" loading="lazy" srcset="https://engineering.zoominfo.com/wp-content/uploads/2024/02/dataflow-advanced-topics1.jpg 1024w, https://engineering.zoominfo.com/wp-content/uploads/2024/02/dataflow-advanced-topics1-300x300.jpg 300w, https://engineering.zoominfo.com/wp-content/uploads/2024/02/dataflow-advanced-topics1-150x150.jpg 150w, https://engineering.zoominfo.com/wp-content/uploads/2024/02/dataflow-advanced-topics1-768x768.jpg 768w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></div> </a> <ul class="post-categories"> <li><a href="https://engineering.zoominfo.com/category/application" rel="category tag">Application</a></li></ul> <a href="https://engineering.zoominfo.com/gcp-dataflow-advanced-topics-part-ii" class="padding-wrapper"> <h3 class="h4">GCP DataFlow – Advanced Topics: Part II</h3> <p class="paragraph-text"> <!-- wp:heading {\"level\":3} --> Using Testing Mocking framework for dataflow tests: <!-- /wp:he... </p> </a> </div> </li> <li> <div class="shadow-box link no-padding"> <a href="https://engineering.zoominfo.com/gcp-dataflow-advanced-topics-part-i" class="thumbnail-link"> <div class="thumbnail-image"><img width="1024" height="1024" src="https://engineering.zoominfo.com/wp-content/uploads/2024/02/dataflow-advanced-topics1.jpg" class="attachment-post-thumbnail size-post-thumbnail wp-post-image" alt="" decoding="async" loading="lazy" srcset="https://engineering.zoominfo.com/wp-content/uploads/2024/02/dataflow-advanced-topics1.jpg 1024w, https://engineering.zoominfo.com/wp-content/uploads/2024/02/dataflow-advanced-topics1-300x300.jpg 300w, https://engineering.zoominfo.com/wp-content/uploads/2024/02/dataflow-advanced-topics1-150x150.jpg 150w, https://engineering.zoominfo.com/wp-content/uploads/2024/02/dataflow-advanced-topics1-768x768.jpg 768w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></div> </a> <ul class="post-categories"> <li><a href="https://engineering.zoominfo.com/category/application" rel="category tag">Application</a></li></ul> <a href="https://engineering.zoominfo.com/gcp-dataflow-advanced-topics-part-i" class="padding-wrapper"> <h3 class="h4">GCP DataFlow – Advanced Topics: Part I</h3> <p class="paragraph-text"> <!-- wp:paragraph --> In ZoomInfo, we analyze and ingest big quantities of data through different... </p> </a> </div> </li> </ul> </div> </section> <script type="rocketlazyloadscript" data-rocket-type="text/javascript"> jQuery(document).ready(function($){ /*============================================================================ FUNCTIONS ============================================================================*/ function reading_time() { const wordsPerMinute = 200; // Average case. let result; let textLength = $('.main-copy-section').text().split(" ").length; // Split by words if(textLength > 0){ let value = Math.ceil(textLength / wordsPerMinute); result = `${value} min read`; } return result; } /*============================================================================*/ /*------------------------------------------------------ PUSH DATALAYER ON SINGLE PAGE VIEW ------------------------------------------------------*/ var categories = []; categories.push('Application'); categories.push('Data Application'); var author = []; author.push('ZoomInfo Engineering'); if('Jason Zhang') { author.push('Jason Zhang'); } dataLayer.push({ 'BlogArticleLength': reading_time(), 'BlogCategory': categories, 'BlogAuthor': author, 'BlogReleaseDate': 'June 6, 2024', }); /*------------------------------------------------------*/ }); </script> <footer class="footer-new medium-padding-section"> <div class="extra-large-wrapper"> <div class="flex-wrapper space-between"> <div class="flex-wrapper"> <div class="flex-wrapper mobile-flex space-between"> <a href="https://www.zoominfo.com"><img src="/wp-content/themes/engineering/images/footer-logo-new.svg" alt="ZoomInfo Logo"/></a> <div class="top-footer-cta-button"> <a id="Footer_Free_Trial" href="https://www.zoominfo.com/b2b/free-trial?camp_id=7011U000000US9RQAW" class="cta-button">Free Trial</a> </div> </div> <div class="flex-wrapper footer-list-outer-wrapper"> <div class="footer-list-wrapper"> <span class="small-uppercase-text">popular features</span> <ul class="footer-list top"> <li><a href="https://www.zoominfo.com/solutions/sales">Sales Solutions</a></li> <li><a href="https://www.zoominfo.com/solutions/marketing">Marketing Solutions</a></li> <li><a href="https://www.zoominfo.com/solutions/contact-company-search">Company Contact Search</a></li> <li><a href="https://www.zoominfo.com/solutions/intent-data-alerts">Buyer Intent Data</a></li> <li><a href="https://www.zoominfo.com/solutions/enrich">CRM Lead Enrichment</a></li> </ul> </div> <div class="footer-list-wrapper"> <span class="small-uppercase-text">Company</span> <ul class="footer-list top"> <li><a href="https://www.zoominfo.com/about">About Us</a></li> <li><a href="https://www.zoominfo.com/about/leadership">Our Leadership</a></li> <li><a href="//ir.zoominfo.com/">Investor Relations</a></li> <li><a href="https://www.zoominfo.com/b2b/faqs/business">FAQs</a></li> <li><a href="https://www.zoominfo.com/about/careers">Careers</a></li> <li><a href="https://www.zoominfo.com/about/contact?bullet_type=support">Contact Us</a></li> </ul> </div> <div class="footer-list-wrapper"> <span class="small-uppercase-text">B2B Database</span> <ul class="footer-list top"> <li><a href="https://www.zoominfo.com/our-data">Our Data</a></li> <li><a href="https://www.zoominfo.com/b2b/data-sources">Data Transparency</a></li> <li><a href="https://www.zoominfo.com/update/company">Update Your Company</a></li> <li><a href="https://www.zoominfo.com/update/profile">Claim Profile</a></li> <li><a href="https://www.zoominfo.com/s/search">Browse Directories</a></li> </ul> </div> <div class="footer-list-wrapper"> <span class="small-uppercase-text">More Resources</span> <ul class="footer-list top"> <li><a href="//videos.zoominfo.com/">ZoomInfo Videos</a></li> <li><a href="https://www.zoominfo.com/newsroom">Newsroom</a></li> <li><a href="//engineering.zoominfo.com/">Engineering Blog</a></li> <li><a href="https://www.zoominfo.com/covid-19-news">COVID-19 Newsfeed</a></li> <li><a href="https://www.zoominfo.com/b2b/success-recipes">Recipes for Success</a></li> <li><a href="https://www.zoominfo.com/about-zoominfo/privacy-center">Privacy Center</a></li> </ul> </div> </div> </div> <div class="footer-cta-wrapper"> <a id="Footer_Free_Trial" href="https://www.zoominfo.com/b2b/free-trial?camp_id=7011U000000US9RQAW" class="cta-button bottom-footer-cta-button">Free Trial</a> <ul class="footer-list top"> <li> <a id="Footer_Log_In" href="//login.zoominfo.com/">Login</a> </li> <li> <a id="Footer_Phone" href="tel:+18669049666">866.904.9666</a> </li> </ul> </div> </div> <div class="flex-wrapper footer-bottom-wrapper space-between"> <ul class="footer-legal-list"> <li>© <span id="year"></span> ZoomInfo Technologies LLC</li> <li><a id="Footer_Privacy" href="https://www.zoominfo.com/about-zoominfo/privacy-policy">Privacy Policy</a></li> <li><a id="Footer_Terms_Conditions" href="https://www.zoominfo.com/about-zoominfo/terms-of-use">Terms of Use</a></li> <li><a style="cursor: pointer" class="SimpleFooter_legal_link__QDOqz ot-sdk-show-settings">Cookies Settings</a></li> <li><a id="Footer_Status" href="//status.zoominfo.com">Status</a></li> <li id="Footer_Do_not_sell_my_info_container"><a id="Footer_Do_not_sell_my_info" href="https://www.zoominfo.com/about-zoominfo/privacy-manage-profile">Do Not Sell My Personal Information</a></li> </ul> <div class="footer-social-list"> <a id="Footer_Linkedin_Mobile" href="//www.linkedin.com/company/16272?trk=tyah" rel="noopener" target="_blank"><img src="/wp-content/themes/engineering/images/linkedin-icon.svg" alt="LinkedIn logo"></a> <a id="Footer_Twitter_Mobile" href="//twitter.com/zoominfo" rel="noopener" target="_blank"><img src="/wp-content/themes/engineering/images/twitter-icon.svg" alt="Twitter logo"></a> <a id="Instagram_Mobile" href="//instagram.com/zoominfo/" rel="noopener" target="_blank"><img src="/wp-content/themes/engineering/images/instagram-icon.svg" alt="Instagram logo"></a> <a id="Footer_Facebook_Mobile" href="//www.facebook.com/ZoomInformation" rel="noopener" target="_blank"><img src="/wp-content/themes/engineering/images/facebook-icon.svg" alt="Facebook logo"></a> <a id="Footer_Youtube_Mobile" href="//www.youtube.com/c/zoominformation" rel="noopener" target="_blank"><img src="/wp-content/themes/engineering/images/youtube-icon-round.svg" alt="Youtube logo"></a> </div> </div> </div> </footer> <div id="cookies_note"></div> <script type="text/plain" src="/wp-content/themes/engineering/analytics/amplitude.js?ver=1.0.0" id="amplitude-js" class="optanon-category-C0002" defer></script> <script type="text/plain" src="/wp-content/themes/engineering/analytics/amplitude-events.js" id="amplitude-events-js" class="optanon-category-C0002" defer></script> <script type="rocketlazyloadscript" data-rocket-type="text/javascript" src="https://engineering.zoominfo.com/wp-includes/js/dist/hooks.min.js?ver=4d63a3d491d11ffd8ac6" id="wp-hooks-js"></script> <script type="rocketlazyloadscript" data-rocket-type="text/javascript" src="https://engineering.zoominfo.com/wp-includes/js/dist/i18n.min.js?ver=5e580eb46a90c2b997e6" id="wp-i18n-js"></script> <script type="rocketlazyloadscript" data-rocket-type="text/javascript" id="wp-i18n-js-after"> /* <![CDATA[ */ wp.i18n.setLocaleData( { 'text direction\u0004ltr': [ 'ltr' ] } ); /* ]]> */ </script> <script type="rocketlazyloadscript" data-rocket-type="text/javascript" src="https://engineering.zoominfo.com/wp-content/plugins/contact-form-7/includes/swv/js/index.js?ver=6.0.1" id="swv-js" defer></script> <script type="rocketlazyloadscript" data-rocket-type="text/javascript" id="contact-form-7-js-before"> /* <![CDATA[ */ var wpcf7 = { "api": { "root": "https:\/\/engineering.zoominfo.com\/wp-json\/", "namespace": "contact-form-7\/v1" }, "cached": 1 }; /* ]]> */ </script> <script type="rocketlazyloadscript" data-rocket-type="text/javascript" src="https://engineering.zoominfo.com/wp-content/plugins/contact-form-7/includes/js/index.js?ver=6.0.1" id="contact-form-7-js" defer></script> <script type="rocketlazyloadscript" data-rocket-type="text/javascript" src="https://engineering.zoominfo.com/wp-content/themes/engineering/js/jquery-3.3.1.min.js" id="jquery-3.3.1.min-js"></script> <script type="rocketlazyloadscript" data-rocket-type="text/javascript" src="https://engineering.zoominfo.com/wp-content/themes/engineering/js/skrollr.js" id="skrollr-js" defer></script> <script type="rocketlazyloadscript" data-rocket-type="text/javascript" src="https://engineering.zoominfo.com/wp-content/themes/engineering/js/single.js" id="singlejs-js" defer></script> <script type="rocketlazyloadscript" data-rocket-type="text/javascript" src="https://engineering.zoominfo.com/wp-content/themes/engineering/js/jquery.validate.min.js?ver=1.0.0" id="validate-js" defer></script> <script type="text/javascript" id="forms-js-extra"> /* <![CDATA[ */ var location_vars = {"countryCode":"SG","countryIP":"8.222.208.146"}; /* ]]> */ </script> <script type="rocketlazyloadscript" data-rocket-type="text/javascript" src="https://engineering.zoominfo.com/wp-content/themes/engineering/js/forms.js" id="forms-js" defer></script> <script type="text/javascript" id="global-js-extra"> /* <![CDATA[ */ var listed_countries = {"countryNon":""}; /* ]]> */ </script> <script type="rocketlazyloadscript" data-rocket-type="text/javascript" src="https://engineering.zoominfo.com/wp-content/themes/engineering/js/global.js?ver=1.0.4" id="global-js" defer></script> <script type="rocketlazyloadscript" data-rocket-type="text/javascript" src="https://engineering.zoominfo.com/wp-assets/header-footer/navigation.js" id="navigation-js" defer></script> <script type="rocketlazyloadscript" data-rocket-type="text/javascript" src="https://engineering.zoominfo.com/wp-content/themes/engineering/analytics/datalayer.js" id="datalayer-js" defer></script> <script type="rocketlazyloadscript"> /** * Footer Copyright year */ document.getElementById("year").innerHTML = new Date().getFullYear(); </script> </body> </html> <!-- This website is like a Rocket, isn't it? Performance optimized by WP Rocket. Learn more: https://wp-rocket.me -->