{"templateName":"blog-page","cssClassNames":"blog-page page basicpage summit-page","canonicalLink":"https://www.snowflake.com/en/blog/engineering/accelerate-snowpark-udf-dynamic-skew-mitigation/","robotsTags":["index","follow"],"allowedRenditionsWidth":["320","480","640","768","960","1200","1440","1920"],"description":"Discover how DySkew replaces static compile-time distribution in Snowpark UDFs with dynamic skew detection to reduce P99 execution times by up to 30%.","language":"en","title":"Optimizing Snowpark UDFs: Dynamic Skew Mitigation","analyticsPageType":"homepage","analyticsCategory":"general","analyticsSubCategory":"","excludeFromAnalytics":false,":mappedPath":"/en/blog/engineering/accelerate-snowpark-udf-dynamic-skew-mitigation/",":type":"snowflake-site/components/structure/page",":itemsOrder":["root"],":items":{"root":{"columnClassNames":{"experiencefragment-banner":"aem-GridColumn aem-GridColumn--default--12","experiencefragment-sub-header":"aem-GridColumn aem-GridColumn--default--12","experiencefragment-pre-footer":"aem-GridColumn aem-GridColumn--default--12","experiencefragment-header":"aem-GridColumn aem-GridColumn--default--12","markup_editor-table":"aem-GridColumn aem-GridColumn--default--12","responsivegrid":"aem-GridColumn aem-GridColumn--default--12","experiencefragment-footer":"aem-GridColumn aem-GridColumn--default--12","markup_editor":"aem-GridColumn aem-GridColumn--default--12","container_47873732":"aem-GridColumn aem-GridColumn--default--12"},"gridClassNames":"aem-Grid aem-Grid--12 aem-Grid--default--12","columnCount":12,":itemsOrder":["experiencefragment-banner","experiencefragment-header","experiencefragment-sub-header","responsivegrid","container_47873732","experiencefragment-pre-footer","markup_editor","markup_editor-table","experiencefragment-footer"],":items":{"experiencefragment-banner":{"id":"experiencefragment-618dedeb35","localizedFragmentVariationPath":"/content/experience-fragments/snowflake-site/language-masters/en/site/pushdown-banner/pushdown-banner-blank/jcr:content","configured":true,":type":"snowflake-site/components/experiencefragment","xfModelPath":"/content/experience-fragments/snowflake-site/language-masters/en/site/pushdown-banner/pushdown-banner-blank.xfmodel.json"},"experiencefragment-header":{"id":"experiencefragment-da46f6c719","localizedFragmentVariationPath":"/content/experience-fragments/snowflake-site/language-masters/en/site/mega-nav-header/master/jcr:content","configured":true,":type":"snowflake-site/components/experiencefragment","xfModelPath":"/content/experience-fragments/snowflake-site/language-masters/en/site/mega-nav-header/master.xfmodel.json","languageNavPath":"/content/snowflake-site/global/en/blog/engineering/accelerate-snowpark-udf-dynamic-skew-mitigation.languagenav.json","appliedCssClassNames":"snowflake-sticky-nav-host"},"experiencefragment-sub-header":{"id":"experiencefragment-1d452c8e49","localizedFragmentVariationPath":"/content/experience-fragments/snowflake-site/language-masters/en/site/sub-navigation/engineering-blog-sub-nav/jcr:content","configured":true,":type":"snowflake-site/components/experiencefragment","xfModelPath":"/content/experience-fragments/snowflake-site/language-masters/en/site/sub-navigation/engineering-blog-sub-nav.xfmodel.json"},"responsivegrid":{"columnClassNames":{"container_breadcrumb":"aem-GridColumn aem-GridColumn--default--12","container_main_content":"aem-GridColumn aem-GridColumn--default--12"},"gridClassNames":"aem-Grid aem-Grid--12 aem-Grid--default--12","columnCount":12,":itemsOrder":["container_breadcrumb","container_main_content"],":items":{"container_breadcrumb":{"columnClassNames":{"breadcrumb":"aem-GridColumn aem-GridColumn--default--12"},"gridClassNames":"aem-Grid aem-Grid--12 aem-Grid--default--12","layout":"RESPONSIVE_GRID","columnCount":12,"id":"blog-page-breadcrumb-indentation",":type":"snowflake-site/components/container",":itemsOrder":["breadcrumb"],":items":{"breadcrumb":{"id":"breadcrumb-7646aba016","breadcrumbItems":[{"title":"Blog","path":"/en/blog/engineering/","active":false},{"title":"Data Engineering","path":"/en/blog/engineering/data-engineering/","active":false},{"title":"Accelerating Snowpark UDFs with Dynamic Data Redistribution","path":"/en/blog/engineering/accelerate-snowpark-udf-dynamic-skew-mitigation/","active":false}],":type":"snowflake-site/components/blog/breadcrumb"}},"appliedCssClassNames":"snowflake-container"},"container_main_content":{"columnClassNames":{"flexible_column_container":"aem-GridColumn aem-GridColumn--default--12","related_content":"aem-GridColumn aem-GridColumn--default--12"},"gridClassNames":"aem-Grid aem-Grid--12 aem-Grid--default--12","layout":"RESPONSIVE_GRID","columnCount":12,"id":"main-content",":type":"snowflake-site/components/container",":itemsOrder":["flexible_column_container","related_content"],":items":{"flexible_column_container":{"id":"flexible-column-container-86f0fe6d69","propertiesId":"snowflake-blog-template-main-container","type":"2-column-60-40","alignColumns":"top","containerMaxWidth":"extra-large","topPadding":"none","bottomPadding":"none","spaceBetween":"none","reverseOnMobile":true,"carouselOnMobile":false,"backgroundImageOption":"none","flexible_column_content_container_1":{"layout":"SIMPLE","id":"container-ba4011f7d7",":type":"snowflake-site/components/flexible-column-container/flexible-column-content-container",":itemsOrder":["container_hero","responsivegrid_content","responsivegrid_premium_content_banner","container_author_chip","container_share_article"],":items":{"container_hero":{"columnClassNames":{"blog_hero":"aem-GridColumn aem-GridColumn--default--12"},"gridClassNames":"aem-Grid aem-Grid--12 aem-Grid--default--12","layout":"RESPONSIVE_GRID","columnCount":12,"id":"container-6fb1bbe495",":type":"snowflake-site/components/container",":itemsOrder":["blog_hero"],":items":{"blog_hero":{"id":"blog-hero-f7390e5d9b","showClaude":true,"showChatGpt":true,"authors":[{"authorImage":{"id":"image-e9ebd823f5","height":"809","src":"https://www.snowflake.com/adobe/dynamicmedia/deliver/dm-aid--14199e88-cd8d-4cc3-97df-ed89fff34c03/urjeet-shrestha.jpg?preferwebp=true&quality=85","isLcpImage":false,"lazyEnabled":true,"width":"900",":type":"snowflake-site/components/image"},"authorCta":{"id":"button-08ac80e07b","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/blog/authors/urjeet-shrestha/"},"linkTargetContentType":"DOCUMENT_LEARN",":type":"snowflake-site/components/button","linkType":"SNOWFLAKE_INTERNAL","text":"Urjeet Shrestha"}}],"image":{"id":"image-e194aa5f61","height":"720","src":"https://www.snowflake.com/adobe/dynamicmedia/deliver/dm-aid--5802ecd3-9104-41ce-ba1d-b68593bb9c70/sf-eng-blog-ml-2.png?preferwebp=true&quality=85","isLcpImage":false,"lazyEnabled":true,"width":"1680",":type":"snowflake-site/components/image"},"timeToRead":"6","publicationDate":"JUL 30, 2026","tag":{"tagText":"Data Engineering","tagColor":"#29B5E8"},"title":{"lines":["Accelerating Snowpark UDFs with Dynamic Data Redistribution"],"type":"heading2",":type":"snowflake-site/components/title-v2"},":type":"snowflake-site/components/blog/blog-hero"}}},"responsivegrid_content":{"columnClassNames":{"blog_text_1753871526":"aem-GridColumn aem-GridColumn--default--12","image":"aem-GridColumn aem-GridColumn--default--12","blog_text_992204197":"aem-GridColumn aem-GridColumn--default--12","blog_text":"aem-GridColumn aem-GridColumn--default--12","image_1491625243":"aem-GridColumn aem-GridColumn--default--12","blog_text_1323360474":"aem-GridColumn aem-GridColumn--default--12","image_438041398":"aem-GridColumn aem-GridColumn--default--12","blog_text_69886544":"aem-GridColumn aem-GridColumn--default--12","blog_text_1811921976":"aem-GridColumn aem-GridColumn--default--12"},"gridClassNames":"aem-Grid aem-Grid--12 aem-Grid--default--12","columnCount":12,"appliedCssClassNames":"snowflake-layout-container-inner-padding-small",":itemsOrder":["blog_text","blog_text_69886544","blog_text_1753871526","image","blog_text_1811921976","image_1491625243","blog_text_1323360474","image_438041398","blog_text_992204197"],":items":{"blog_text":{"id":"blog-text-552520e136","text":"\u003Cp\u003ESnowpark is Snowflake's developer framework that lets engineers write data transformations, pipelines and business logic in Python, Java or Scala and run that code directly on Snowflake's virtual warehouses, without moving data out of Snowflake. Rather than pulling data into an external environment to process it, developers use a familiar DataFrame API or write user-defined functions (UDFs) that execute natively inside Snowflake's query engine, keeping data secure, governed and close to the source. As Snowpark adoption has grown and UDF workloads have become more computationally demanding, the Snowpark Execution Infrastructure team has invested heavily in runtime performance.\u003C/p\u003E\r\n\u003Cp\u003EOne of the hardest problems that surfaces at scale is data skew: the uneven distribution of work across compute nodes during query execution. Unlike traditional SQL operators, UDFs introduce highly variable per-row processing costs, which makes skew both more common and more impactful. This blog explains how we tackled that problem by building DySkew, a dynamic redistribution system that replaces our previous static, compile-time approach and has reduced P99 UDF execution times by approximately 30% in production.\u003C/p\u003E\r\n\u003Ch1\u003ELimitations with existing data skew solution\u003C/h1\u003E\r\n\u003Cp\u003EHistorically, we've relied on a static round-robin redistribution strategy that we've discussed in \u003Ca href=\"https://www.snowflake.com/en/blog/engineering/snowpark-parallel-python-udf-optimization/\" target=\"_blank\" rel=\"noopener noreferrer\"\u003Ethis blog\u003C/a\u003E. By inserting a rebalancing link before the UDF execution operator during compile time, the system redistributes rows evenly across parallel processes. While effective for simple input skew, this approach has three fundamental limitations:\u003C/p\u003E\r\n\u003Col\u003E\r\n\u003Cli\u003E\u003Cb\u003ECompile time skew detection:\u003C/b\u003E We determine redistribution eligibility at compile time which means we must be conservative with the query plans we apply round-robin to as we cannot change our decision once made.\u003C/li\u003E\r\n\u003Cli\u003E\u003Cb\u003EComputational blindness:\u003C/b\u003E Round-robin distribution balances row counts, not computational effort. It cannot account for variability in processing time caused by user code.\u003C/li\u003E\r\n\u003Cli\u003E\u003Cb\u003EPoor handling of redistribution overhead:\u003C/b\u003E Row redistribution isn't free as we need to pack, unpack and send rows across the network. There are queries where redistribution isn't optimal, so we stored the per-row execution time of the last N invocations to determine whether redistribution was &quot;profitable&quot;. If a function's per row execution time was below a threshold, we would assume that overhead was worse than skew and we should not apply round-robin redistribution. However, this was a binary optimization which led to performance cliffs for users when their function execution time teetered the threshold.\u003C/li\u003E\r\n\u003C/ol\u003E\r\n","richText":true,":type":"snowflake-site/components/blog/blog-text"},"blog_text_69886544":{"id":"blog-text-9d61db32ab","text":"\u003Ch1\u003EDySkew: Adaptive redistribution\u003C/h1\u003E\r\n\u003Cp\u003ETo address these limitations, we developed DySkew, a dynamic execution strategy that moves away from static, compile-time partitioning. Instead, DySkew employs an adaptive data distribution mechanism using per-thread state machines that observe runtime conditions.\u003C/p\u003E\r\n\u003Cp\u003EFour core principles guide the framework:\u003C/p\u003E\r\n\u003Cul\u003E\r\n\u003Cli\u003E\u003Cb\u003EDynamic adaptation:\u003C/b\u003E Decisions are made at the link-instance level rather than globally. Each link monitors performance metrics and can transition between local processing and distributed execution in real time.\u003C/li\u003E\r\n\u003Cli\u003E\u003Cb\u003ESkew detection models:\u003C/b\u003E We explored several different models designed to identify skew without triggering false positives but we'll discuss two.\u003Cul\u003E\r\n\u003Cli\u003E\u003Cb\u003ERow Percentage Model:\u003C/b\u003E This detects skew by monitoring whether a thread has processed significantly more rows than other threads on the same server. While this solves data skew, it doesn't solve temporal skew caused by unequal row processing times.\u003C/li\u003E\r\n\u003Cli\u003E\u003Cb\u003EIdle Time Model:\u003C/b\u003E This detects skew by monitoring sibling instances. If a worker remains idle — indicating it has finished its portion of the work while others are busy — the system triggers redistribution to balance the load. This was the most successful model as it solved both data skew and temporal skew.\u003C/li\u003E\r\n\u003C/ul\u003E\r\n\u003C/li\u003E\r\n\u003Cli\u003E\u003Cb\u003EN-strikes framework:\u003C/b\u003E To avoid overreacting to transient fluctuations, the system requires skew detection over \u003Ci\u003EN\u003C/i\u003E consecutive samples before committing to a redistribution state.\u003C/li\u003E\r\n\u003Cli\u003E\u003Cb\u003ECost-aware redistribution:\u003C/b\u003E We implemented an &quot;Eager Redistribution&quot; strategy. For UDFs, the latency penalty for waiting to confirm skew is often higher than the cost of redistribution. By distributing early, the system prioritizes parallelism from the start of the operator's lifecycle. However, we still need to determine when redistribution can cause worse performance. Since redistribution overhead scales with row size, we introduced a Row Size Model which calculates runtime statistics, leverages the Idle Time Model for skew detection and turns off redistribution if row sizes are large while we aren't heavily skewed.\u003C/li\u003E\r\n\u003C/ul\u003E\r\n","richText":true,":type":"snowflake-site/components/blog/blog-text"},"blog_text_1753871526":{"id":"blog-text-9fd5ed7a7d","text":"\u003Ch1\u003EPerformance and results\u003C/h1\u003E\r\n\u003Cp\u003EBy moving the responsibility of skew management from compile time to execution time, we're able to make significantly better redistribution decisions which lets us apply redistribution to much more queries.\u003C/p\u003E\r\n\u003Ch2\u003ETPCx-BB\u003C/h2\u003E\r\n","richText":true,":type":"snowflake-site/components/blog/blog-text"},"image":{"id":"image-3dec8f32eb","height":"734","src":"https://www.snowflake.com/adobe/dynamicmedia/deliver/dm-aid--a4811b63-2e93-4226-bdf0-d54cc9cccb13/figure-1.-accelerating-snowpark-udfs-with-dynamic-data-redistribution.png?preferwebp=true&quality=85","isLcpImage":true,"alt":"Figure 1","lazyEnabled":true,"width":"1196",":type":"snowflake-site/components/image"},"blog_text_1811921976":{"id":"blog-text-9a406b04ac","text":"\u003Cp\u003E\u003Cb\u003EFigure 1: Performance Improvements with DySkew on TPCx-BB.\u003C/b\u003E\u003C/p\u003E\r\n\u003Cp\u003EWe ran the TPCx-BB benchmark on a Medium warehouse five times which confirmed significant latency reductions. There were eight queries that used UDFs and from those queries, Queries 10 and 19 showed performance improvements of 43% and 36%, respectively. At the lower end of the distribution, queries without significant skew (that is, Query 29) saw a slight regression — a deliberate tradeoff: DySkew is tuned to err toward redistributing rather than risk missing skew, since the cost of undetected skew far outweighs the overhead of occasional unnecessary redistribution.\u003C/p\u003E\r\n\u003Ch2\u003EReplayed production queries\u003C/h2\u003E\r\n","richText":true,":type":"snowflake-site/components/blog/blog-text"},"image_1491625243":{"id":"image-922a72563d","height":"742","src":"https://www.snowflake.com/adobe/dynamicmedia/deliver/dm-aid--36de7340-15b1-4d70-b823-441b5ee5e1b8/figure-2.-accelerating-snowpark-udfs-with-dynamic-data-redistribution.png?preferwebp=true&quality=85","isLcpImage":false,"alt":"Figure 2","lazyEnabled":true,"width":"1202",":type":"snowflake-site/components/image"},"blog_text_1323360474":{"id":"blog-text-be74196b72","text":"\u003Cp\u003E\u003Cb\u003EFigure 2: Performance Improvements with DySkew on Replayed Queries.\u003C/b\u003E\u003C/p\u003E\r\n\u003Cp\u003EWe randomly sampled hundreds of customer production queries and replayed them with DySkew enabled vs. disabled, leading to average execution time improvement by 8% on medium and 12% on large warehouses; P90 improvement of 22% and 27%, respectively. Large warehouses saw the biggest performance gains as the likelihood and impact of skew increases with the amount of compute.\u003C/p\u003E\r\n\u003Ch2\u003EProduction impact\u003C/h2\u003E\r\n","richText":true,":type":"snowflake-site/components/blog/blog-text"},"image_438041398":{"id":"image-80e7bcc508","height":"756","src":"https://www.snowflake.com/adobe/dynamicmedia/deliver/dm-aid--605bdc45-c80d-4a4d-be40-f64189e5ec4c/figure-3.-accelerating-snowpark-udfs-with-dynamic-data-redistribution.png?preferwebp=true&quality=85","isLcpImage":false,"alt":"Figure 3","lazyEnabled":true,"width":"1222",":type":"snowflake-site/components/image"},"blog_text_992204197":{"id":"blog-text-f57480e593","text":"\u003Cp\u003E\u003Cb\u003EFigure 3: Production UDxF P99 Execution Time over Time.\u003C/b\u003E\u003C/p\u003E\r\n\u003Cp\u003EThe above graph plots the P99 UDxF (UDF, UDAF, UDTF) execution time during rollout of DySkew. While the raw execution times are obscured, we saw an approximately 30% reduction in P99 execution times after rollout. While not pictured, we also saw CPU utilization on UDxF queries increase by approximately 17% after the rollout of DySkew.\u003C/p\u003E\r\n\u003Ch1\u003ELooking forward\u003C/h1\u003E\r\n\u003Cp\u003EDySkew demonstrates that a dynamic redistribution strategy is essential for managing the unpredictability of user-defined code in distributed systems. As we continue to refine these skew-detection models, we are exploring how to extend these adaptive capabilities to other complex query shapes, including window functions that require strict ordering. DySkew is just one example showing that Snowflake remains deeply committed to ensuring users receive the best price-performance with minimal tuning on their end.\u003C/p\u003E\r\n","richText":true,":type":"snowflake-site/components/blog/blog-text"}},":type":"wcm/foundation/components/responsivegrid"},"responsivegrid_premium_content_banner":{"columnClassNames":{},"gridClassNames":"aem-Grid aem-Grid--12 aem-Grid--default--12","columnCount":12,"appliedCssClassNames":"snowflake-responsive-component-top-padding-medium",":itemsOrder":[],":items":{},":type":"wcm/foundation/components/responsivegrid"},"container_author_chip":{"columnClassNames":{"author_chip":"aem-GridColumn aem-GridColumn--default--12"},"gridClassNames":"aem-Grid aem-Grid--12 aem-Grid--default--12","layout":"RESPONSIVE_GRID","columnCount":12,"id":"container-e543cadb70",":type":"snowflake-site/components/container",":itemsOrder":["author_chip"],":items":{"author_chip":{"id":"author-chip-ec34cc72f3","title":{"id":"title","type":"heading2","lines":["Learn more about the authors"],":type":"snowflake-site/components/title-v2"},"authors":[{"authorImage":{"id":"image-e9ebd823f5","height":"809","src":"https://www.snowflake.com/adobe/dynamicmedia/deliver/dm-aid--14199e88-cd8d-4cc3-97df-ed89fff34c03/urjeet-shrestha.jpg?preferwebp=true&quality=85","isLcpImage":false,"lazyEnabled":true,"width":"900",":type":"snowflake-site/components/image"},"authorCta":{"id":"button-08ac80e07b","showOutboundIcon":false,"buttonLink":{"valid":true,"url":"/en/blog/authors/urjeet-shrestha/"},"linkTargetContentType":"DOCUMENT_LEARN",":type":"snowflake-site/components/button","linkType":"SNOWFLAKE_INTERNAL","text":"Urjeet Shrestha"},"authorTitle":"Software Engineer"}],":type":"snowflake-site/components/blog/author-chip"}},"appliedCssClassNames":"snowflake-responsive-component-top-padding-medium"},"container_share_article":{"columnClassNames":{"share_article":"aem-GridColumn aem-GridColumn--default--12"},"gridClassNames":"aem-Grid aem-Grid--12 aem-Grid--default--12","layout":"RESPONSIVE_GRID","columnCount":12,"id":"container-97c14f58e5",":type":"snowflake-site/components/container",":itemsOrder":["share_article"],":items":{"share_article":{"id":"share-article-64a135b58e","linkedInShareUrl":"https://www.linkedin.com/shareArticle?mini=true&url=https%3A%2F%2Fwww.snowflake.com%2Fcontent%2Fsnowflake-site%2Fglobal%2Fen%2Fblog%2Fengineering%2Faccelerate-snowpark-udf-dynamic-skew-mitigation&title=Accelerating+Snowpark+UDFs+with+Dynamic+Data+Redistribution","twitterShareUrl":"https://x.com/intent/post?url=https%3A%2F%2Fwww.snowflake.com%2Fcontent%2Fsnowflake-site%2Fglobal%2Fen%2Fblog%2Fengineering%2Faccelerate-snowpark-udf-dynamic-skew-mitigation&text=Accelerating+Snowpark+UDFs+with+Dynamic+Data+Redistribution","facebookShareUrl":"https://www.facebook.com/sharer/sharer.php?u=https%3A%2F%2Fwww.snowflake.com%2Fcontent%2Fsnowflake-site%2Fglobal%2Fen%2Fblog%2Fengineering%2Faccelerate-snowpark-udf-dynamic-skew-mitigation",":type":"snowflake-site/components/blog/share-article"}},"appliedCssClassNames":"snowflake-responsive-component-top-padding-small"}}},"flexible_column_content_container_2":{"layout":"SIMPLE","id":"container-ee961ae3b1",":type":"snowflake-site/components/flexible-column-container/flexible-column-content-container",":itemsOrder":["blog_table_of_content"],":items":{"blog_table_of_content":{"id":"blog-table-of-content-0bd2e6f528",":type":"snowflake-site/components/blog/blog-table-of-content","tableOfContents":[]}}},":type":"snowflake-site/components/flexible-column-container","isBlogPage":true,"isActiveTOC":false},"related_content":{"id":"related-content-6973eaa0b8","relatedContent":[],":type":"snowflake-site/components/blog/related-content","isBlogPage":true}},"appliedCssClassNames":"snowflake-container"}},":type":"wcm/foundation/components/responsivegrid"},"container_47873732":{"additionalClasses":"section--blog-newsletter","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-c11eac0631",":type":"snowflake-site/components/container",":itemsOrder":["flexible_column_cont"],":items":{"flexible_column_cont":{"id":"flexible-column-container-61831d9001","type":"1-column","alignColumns":"top","containerMaxWidth":"extra-large","topPadding":"small","bottomPadding":"none","spaceBetween":"small","reverseOnMobile":false,"carouselOnMobile":false,"propertiesCSSClasses":"section--blog-newsletter","backgroundImageOption":"none","flexible_column_content_container_1":{"layout":"SIMPLE","id":"container-81ed280a1a",":type":"snowflake-site/components/flexible-column-container/flexible-column-content-container",":itemsOrder":["marketo_v2","text"],":items":{"marketo_v2":{"id":"marketo-v2-1b8e2eaee5","marketoForm":{"hidden":null,"formId":"3320","edit":false,"successUrl":null,"script":null,"values":null},"title":{"id":"title","type":"heading3","lines":["Subscribe to our blog newsletter","Get the best, coolest and latest delivered to your inbox each week"],":type":"snowflake-site/components/title-v2"},"marketoConfigured":true,"formConfigured":true,"partnerCampaignPage":false,"serverInstance":"252-RFO-227.mktoweb.com","munchkinId":"252-RFO-227",":type":"snowflake-site/components/form/marketo-v2"},"text":{"id":"text-cd396728a9","additionalClasses":"newsletter-disclaimer","text":"\u003Cp\u003EBy submitting this form, I understand Snowflake will process my personal information in accordance with their Privacy Notice.\u003C/p\u003E\r\n","richText":true,":type":"snowflake-site/components/text"}}},":type":"snowflake-site/components/flexible-column-container","isBlogPage":true,"isActiveTOC":false}},"appliedCssClassNames":"snowflake-container"},"experiencefragment-pre-footer":{"id":"experiencefragment-d2c6286bc0","localizedFragmentVariationPath":"/content/experience-fragments/snowflake-site/language-masters/en/site/get-started-pre-footer/get-started-pre-footer/jcr:content","configured":true,":type":"snowflake-site/components/experiencefragment","xfModelPath":"/content/experience-fragments/snowflake-site/language-masters/en/site/get-started-pre-footer/get-started-pre-footer.xfmodel.json"},"markup_editor":{"id":"markup-editor-11cfb84dec","title":"Page CSS","cssContent":"@media screen and (min-width:768px){.snowflake-blog-author-chip-wrapper{justify-content:flex-start}.snowflake-blog-related-content-on-blog-page{max-width:1408px;margin-left:auto;margin-right:auto}.snowflake-text{font-family:Lato,sans-serif;font-weight:400;font-size:16px;line-height:24px}}.section--blog-newsletter{max-width:none;width:100%;padding-left:0;padding-right:0;margin-left:0;margin-right:0;margin-bottom:0}.section--blog-newsletter .mktoField{background-color:transparent !important}.section--blog-newsletter\u003E.container{padding-left:0;padding-right:0}@media screen and (min-width:768px){.section--blog-newsletter\u003E.container{padding-left:0;padding-right:0}}.newsletter-disclaimer p{font-size:14px !important}.section--blog-newsletter .snowflake-marketo-form-container{margin-bottom:24px;background-color:#f6f9fa;gap:48px;box-shadow:none}.section--blog-newsletter .snowflake-title p.snowflake-title-line:first-child{font-family:Texta;font-size:24px;line-height:26px;font-weight:700;margin-bottom:4px}.section--blog-newsletter .snowflake-title p.snowflake-title-line{text-transform:none;font-family:\"Lato\",sans-serif;font-size:16px;line-height:24px;font-weight:normal}@media screen and (min-width:1024px){.section--blog-newsletter .snowflake-marketo-form-container{display:flex;justify-content:center}.section--blog-newsletter .snowflake-title .snowflake-title-line{text-align:left}.section--blog-newsletter .snowflake-marketo-form .mktoFormRow:has(\u003E input[type=\"hidden\"]){flex-grow:0}.section--blog-newsletter .snowflake-marketo-form{display:flex;width:50% !important}.section--blog-newsletter .snowflake-marketo-form .mktoButtonRow{flex-grow:0;width:auto !important;margin-left:0;margin-right:0}.section--blog-newsletter .snowflake-marketo-form .mktoFormRow{flex-grow:1}.section--blog-newsletter\u003E.container{padding-left:0;padding-right:0}.section--blog-newsletter .snowflake-marketo-form-title{width:50%;margin-bottom:0 !important}.section--blog-newsletter .center .snowflake-title{align-items:flex-start}}.snowflake-sub-navigation a.snowflake-sub-navigation-primary-link{width:auto !important}.snowflake-blog-hero{align-items:stretch !important}",":type":"snowflake-site/components/markup-editor","isGSAPEnabled":false},"markup_editor-table":{"id":"markup-editor-4fee99dfd8","title":"Table Styling CSS","cssContent":"#snowflake-blog-template-main-container table{width:100%;background-color:var(--ui-background-01);border-collapse:collapse;border:2px solid var(--ui-background-09);font-family:'Lato',sans-serif;color:var(--ui-background-09)}#snowflake-blog-template-main-container table thead{background-color:var(--ui-01)}#snowflake-blog-template-main-container table th,#snowflake-blog-template-main-container table td{border:2px solid var(--ui-background-09);padding:var(--spacing-01)}",":type":"snowflake-site/components/markup-editor","isGSAPEnabled":false},"experiencefragment-footer":{"id":"experiencefragment-6f0fbda83c","localizedFragmentVariationPath":"/content/experience-fragments/snowflake-site/language-masters/en/site/footer/master/jcr:content","configured":true,":type":"snowflake-site/components/experiencefragment","xfModelPath":"/content/experience-fragments/snowflake-site/language-masters/en/site/footer/master.xfmodel.json"}},":type":"wcm/foundation/components/responsivegrid"}},":hierarchyType":"page",":path":"/content/snowflake-site/global/en/blog/engineering/accelerate-snowpark-udf-dynamic-skew-mitigation","isPasswordProtected":false,"analyticsContentTags":["snowflake-site:taxonomy/blog/engineering-blog/core-platform","snowflake-site:taxonomy/blog/engineering-blog/data-engineering"],"analyticsEnabled":true,"coveoConfig":{"searchHub":"snowflake.com","organizationId":"snowflakecomputingproduction8neljofn","apiKey":"xx335921a6-2a0a-40f2-a167-e390b4766c3d","pipeline":"snowflake.com"},"analyticsDebugMode":false,"analyticsData":{"excludeFromAnalytics":false,"subCategory":"","pageType":"homepage","templateName":"blog-page","siteName":"snowflake","pageUrl":"/content/snowflake-site/global/en/blog/engineering/accelerate-snowpark-udf-dynamic-skew-mitigation","language":"en","category":"general","pageName":"Accelerating Snowpark UDFs with Dynamic Data Redistribution","contentTags":["snowflake-site:taxonomy/blog/engineering-blog/core-platform","snowflake-site:taxonomy/blog/engineering-blog/data-engineering"]},"locale":"en"}
  