# Spice AI - Full Content

> Spice.ai is a data and AI platform that combines federated SQL query, hybrid search, and LLM inference in a portable, open-source runtime

This file contains the complete content from the Spice AI website for AI/LLM consumption.

---

# Local Content

## About Us
URL: https://spice.ai/about-us
Date: 2025-11-19T21:05:55
Description: Learn about Spice AI's mission, team, and vision for empowering developers to build intelligent apps with unified data and AI infrastructure.

<HeroCenteredText
  fields={{
    graphic_position: 'graphic-left',
    heading_tag: 'h1',
    heading: 'Powering the next generation of applications',
    paragraph:
      "We're a team of builders and engineers delivering a unified data and AI engine that enables developers to deploy intelligent applications anywhere.",
    cta: [
      {
        type: 'filled',
        cta: {
          title: 'Meet the team',
          url: '/careers/',
          target: '',
        },
      },
      {
        type: 'bordered',
        cta: {
          title: 'Careers',
          url: 'https://jobs.lever.co/spiceai',
          target: '',
        },
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<ContentFiftyFiftyMediaTab
  fields={{
    tab_items: [
      {
        tab_title: 'Mission',
        title: 'Our mission',
        paragraph:
          'With Spice AI, developers no longer need to be data or AI, or ML experts to build AI-driven software. Our mission is to help every developer leverage the latest technology and infrastructure to build the next generation of applications.',
        media_type: 'image',
        media_image: {
          ID: 965,
          id: 965,
          title: 'about_us_spice',
          filename: 'about_us_spice.png',
          filesize: 4349638,
          url: '/website-assets/media/2025/11/about_us_spice.png',
          link: '/about-us/attachment/about_us_spice/',
          alt: '',
          author: '5',
          description: '',
          caption: '',
          name: 'about_us_spice',
          status: 'inherit',
          uploaded_to: 963,
          date: '2025-11-19 20:50:36',
          modified: '2025-11-19 20:50:36',
          menu_order: 0,
          mime_type: 'image/png',
          type: 'image',
          subtype: 'png',
          icon: '/website-assets/media/default.png',
          width: 2720,
          height: 1824,
          sizes: {
            thumbnail: '/website-assets/media/2025/11/about_us_spice.png',
            'thumbnail-width': 150,
            'thumbnail-height': 150,
            medium: '/website-assets/media/2025/11/about_us_spice.png',
            'medium-width': 300,
            'medium-height': 201,
            medium_large: '/website-assets/media/2025/11/about_us_spice.png',
            'medium_large-width': 768,
            'medium_large-height': 515,
            large: '/website-assets/media/2025/11/about_us_spice.png',
            'large-width': 1024,
            'large-height': 687,
            '1536x1536': '/website-assets/media/2025/11/about_us_spice.png',
            '1536x1536-width': 1536,
            '1536x1536-height': 1030,
            '2048x2048': '/website-assets/media/2025/11/about_us_spice.png',
            '2048x2048-width': 2048,
            '2048x2048-height': 1373,
          },
        },
        media_video: '',
      },
      {
        tab_title: 'Vision',
        title: 'Our vision',
        paragraph:
          'We believe AI-driven applications will have a profoundly positive impact on the way businesses operate and how we all live. Our vision is to enable and accelerate the creation of these applications to improve outcomes for businesses and individuals alike. ',
        media_type: 'image',
        media_image: {
          ID: 965,
          id: 965,
          title: 'about_us_spice',
          filename: 'about_us_spice.png',
          filesize: 4349638,
          url: '/website-assets/media/2025/11/about_us_spice.png',
          link: '/about-us/attachment/about_us_spice/',
          alt: '',
          author: '5',
          description: '',
          caption: '',
          name: 'about_us_spice',
          status: 'inherit',
          uploaded_to: 963,
          date: '2025-11-19 20:50:36',
          modified: '2025-11-19 20:50:36',
          menu_order: 0,
          mime_type: 'image/png',
          type: 'image',
          subtype: 'png',
          icon: '/website-assets/media/default.png',
          width: 2720,
          height: 1824,
          sizes: {
            thumbnail: '/website-assets/media/2025/11/about_us_spice.png',
            'thumbnail-width': 150,
            'thumbnail-height': 150,
            medium: '/website-assets/media/2025/11/about_us_spice.png',
            'medium-width': 300,
            'medium-height': 201,
            medium_large: '/website-assets/media/2025/11/about_us_spice.png',
            'medium_large-width': 768,
            'medium_large-height': 515,
            large: '/website-assets/media/2025/11/about_us_spice.png',
            'large-width': 1024,
            'large-height': 687,
            '1536x1536': '/website-assets/media/2025/11/about_us_spice.png',
            '1536x1536-width': 1536,
            '1536x1536-height': 1030,
            '2048x2048': '/website-assets/media/2025/11/about_us_spice.png',
            '2048x2048-width': 2048,
            '2048x2048-height': 1373,
          },
        },
        media_video: '',
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<ContentTeamGrid
  fields={{
    heading: 'Meet the founders',
    heading_tag: 'h2',
    paragraph:
      "Spice AI's founders have spent years building developer platforms, distributed systems, and cloud-native services at a global scale. They bring firsthand experience of the challenges developers face and a shared commitment to solving them.",
    items: [
      {
        photo: {
          ID: 969,
          id: 969,
          title: '44ec337367eb9b89c814e4bd68d7208164926a49',
          filename: '44ec337367eb9b89c814e4bd68d7208164926a49.png',
          filesize: 864202,
          url: '/website-assets/media/2025/11/44ec337367eb9b89c814e4bd68d7208164926a49.png',
          link: '/about-us/attachment/44ec337367eb9b89c814e4bd68d7208164926a49/',
          alt: '',
          author: '5',
          description: '',
          caption: '',
          name: '44ec337367eb9b89c814e4bd68d7208164926a49',
          status: 'inherit',
          uploaded_to: 963,
          date: '2025-11-19 20:52:25',
          modified: '2025-11-29 19:53:31',
          menu_order: 0,
          mime_type: 'image/jpeg',
          type: 'image',
          subtype: 'jpeg',
          icon: '/website-assets/media/default.png',
          width: 1811,
          height: 1811,
          sizes: {
            thumbnail:
              '/website-assets/media/2025/11/44ec337367eb9b89c814e4bd68d7208164926a49-150x150.png',
            'thumbnail-width': 150,
            'thumbnail-height': 150,
            medium:
              '/website-assets/media/2025/11/44ec337367eb9b89c814e4bd68d7208164926a49-300x300.png',
            'medium-width': 300,
            'medium-height': 300,
            medium_large:
              '/website-assets/media/2025/11/44ec337367eb9b89c814e4bd68d7208164926a49-768x768.png',
            'medium_large-width': 768,
            'medium_large-height': 768,
            large:
              '/website-assets/media/2025/11/44ec337367eb9b89c814e4bd68d7208164926a49-1024x1024.png',
            'large-width': 1024,
            'large-height': 1024,
            '1536x1536':
              '/website-assets/media/2025/11/44ec337367eb9b89c814e4bd68d7208164926a49-1536x1536.png',
            '1536x1536-width': 1536,
            '1536x1536-height': 1536,
            '2048x2048':
              '/website-assets/media/2025/11/44ec337367eb9b89c814e4bd68d7208164926a49.png',
            '2048x2048-width': 1811,
            '2048x2048-height': 1811,
          },
        },
        name: 'Luke Kim',
        position__title: 'Founder and CEO',
        linkedin: 'https://www.linkedin.com/in/lukekim/',
        x__twitter_profile_url: 'https://x.com/lukekim',
        paragraph:
          '<p><span style="font-weight: 400;">Over the last 15 years, Luke has brought together the best builders and engineers across the globe to create developer-focused experiences through tools and technologies used by millions worldwide. Before founding Spice AI, Luke was the founding manager and co-creator of Azure Incubations at Microsoft, where he led cross-functional engineering teams to create and develop technologies like </span><a href="https://dapr.io/"><span style="font-weight: 400;">Dapr</span></a><span style="font-weight: 400;">.</span></p>\n',
      },
      {
        photo: {
          ID: 968,
          id: 968,
          title: 'eb22faba936070632d444bd11f59977cd866e1f8',
          filename: 'eb22faba936070632d444bd11f59977cd866e1f8.png',
          filesize: 36027,
          url: '/website-assets/media/2025/11/eb22faba936070632d444bd11f59977cd866e1f8.png',
          link: '/about-us/attachment/eb22faba936070632d444bd11f59977cd866e1f8/',
          alt: '',
          author: '5',
          description: '',
          caption: '',
          name: 'eb22faba936070632d444bd11f59977cd866e1f8',
          status: 'inherit',
          uploaded_to: 963,
          date: '2025-11-19 20:52:23',
          modified: '2025-11-30 23:10:57',
          menu_order: 0,
          mime_type: 'image/jpeg',
          type: 'image',
          subtype: 'jpeg',
          icon: '/website-assets/media/default.png',
          width: 606,
          height: 672,
          sizes: {
            thumbnail:
              '/website-assets/media/2025/11/eb22faba936070632d444bd11f59977cd866e1f8-150x150.png',
            'thumbnail-width': 150,
            'thumbnail-height': 150,
            medium:
              '/website-assets/media/2025/11/eb22faba936070632d444bd11f59977cd866e1f8-271x300.png',
            'medium-width': 271,
            'medium-height': 300,
            medium_large:
              '/website-assets/media/2025/11/eb22faba936070632d444bd11f59977cd866e1f8.png',
            'medium_large-width': 606,
            'medium_large-height': 672,
            large:
              '/website-assets/media/2025/11/eb22faba936070632d444bd11f59977cd866e1f8.png',
            'large-width': 606,
            'large-height': 672,
            '1536x1536':
              '/website-assets/media/2025/11/eb22faba936070632d444bd11f59977cd866e1f8.png',
            '1536x1536-width': 606,
            '1536x1536-height': 672,
            '2048x2048':
              '/website-assets/media/2025/11/eb22faba936070632d444bd11f59977cd866e1f8.png',
            '2048x2048-width': 606,
            '2048x2048-height': 672,
          },
        },
        name: 'Phillip LeBlanc',
        position__title: 'Founder and CTO',
        linkedin: 'https://www.linkedin.com/in/leblancphillip/',
        x__twitter_profile_url: 'https://x.com/leblancphill',
        paragraph:
          '<p><span style="font-weight: 400;">Phillip has spent a decade building some of the largest distributed systems and big data platforms used by millions worldwide. Before co-founding Spice AI, Phillip was both an engineering manager and IC working on distributed systems at </span><a href="https://github.com/features/actions"><span style="font-weight: 400;">GitHub</span></a><span style="font-weight: 400;"> and Microsoft. Phillip has contributed to services developers use every day, including </span><a href="https://github.com/features/actions"><span style="font-weight: 400;">GitHub Actions</span></a><span style="font-weight: 400;">, Azure Active Directory, and </span><a href="https://appcenter.ms/"><span style="font-weight: 400;">Visual Studio App Center.</span></a></p>\n',
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<ContentThreeAcrossIconText
  fields={{
    heading: 'Our values',
    heading_tag: 'h2',
    paragraph:
      'Our values guide how we build, collaborate, and serve the developers who rely on us. They reflect who we are as a team and how we show up every day to advance the future of data and AI.',
    items: [
      {
        icon: {
          ID: 1152,
          id: 1152,
          title: 'About-Us-Leadtheway',
          filename: 'About-Us-Leadtheway.png',
          filesize: 18253,
          url: '/website-assets/media/2025/11/About-Us-Leadtheway.png',
          link: '/about-us/attachment/about-us-leadtheway/',
          alt: '',
          author: '6',
          description: '',
          caption: '',
          name: 'about-us-leadtheway',
          status: 'inherit',
          uploaded_to: 963,
          date: '2025-11-21 22:36:08',
          modified: '2025-11-21 22:36:08',
          menu_order: 0,
          mime_type: 'image/png',
          type: 'image',
          subtype: 'png',
          icon: '/website-assets/media/default.png',
          width: 300,
          height: 300,
          sizes: {
            thumbnail: '/website-assets/media/2025/11/About-Us-Leadtheway-150x150.png',
            'thumbnail-width': 150,
            'thumbnail-height': 150,
            medium: '/website-assets/media/2025/11/About-Us-Leadtheway.png',
            'medium-width': 300,
            'medium-height': 300,
            medium_large: '/website-assets/media/2025/11/About-Us-Leadtheway.png',
            'medium_large-width': 300,
            'medium_large-height': 300,
            large: '/website-assets/media/2025/11/About-Us-Leadtheway.png',
            'large-width': 300,
            'large-height': 300,
            '1536x1536': '/website-assets/media/2025/11/About-Us-Leadtheway.png',
            '1536x1536-width': 300,
            '1536x1536-height': 300,
            '2048x2048': '/website-assets/media/2025/11/About-Us-Leadtheway.png',
            '2048x2048-width': 300,
            '2048x2048-height': 300,
          },
        },
        title: 'Lead the way',
        description:
          'Leading the way requires each of us to be a leader - to take ownership,  provide clarity, and progress towards realizing our vision.',
      },
      {
        icon: {
          ID: 1151,
          id: 1151,
          title: 'AboutUs_Work as one',
          filename: 'AboutUs_Work-as-one.svg',
          filesize: 4412,
          url: '/website-assets/media/2025/11/AboutUs_Work-as-one.svg',
          link: '/about-us/attachment/aboutus_work-as-one/',
          alt: '',
          author: '6',
          description: '',
          caption: '',
          name: 'aboutus_work-as-one',
          status: 'inherit',
          uploaded_to: 963,
          date: '2025-11-21 22:31:14',
          modified: '2025-11-21 22:31:14',
          menu_order: 0,
          mime_type: 'image/svg+xml',
          type: 'image',
          subtype: 'svg+xml',
          icon: '/website-assets/media/default.png',
          width: 0,
          height: 0,
          sizes: {
            thumbnail: '/website-assets/media/2025/11/AboutUs_Work-as-one.svg',
            'thumbnail-width': 1,
            'thumbnail-height': 1,
            medium: '/website-assets/media/2025/11/AboutUs_Work-as-one.svg',
            'medium-width': 1,
            'medium-height': 1,
            medium_large: '/website-assets/media/2025/11/AboutUs_Work-as-one.svg',
            'medium_large-width': 1,
            'medium_large-height': 1,
            large: '/website-assets/media/2025/11/AboutUs_Work-as-one.svg',
            'large-width': 1,
            'large-height': 1,
            '1536x1536': '/website-assets/media/2025/11/AboutUs_Work-as-one.svg',
            '1536x1536-width': 1,
            '1536x1536-height': 1,
            '2048x2048': '/website-assets/media/2025/11/AboutUs_Work-as-one.svg',
            '2048x2048-width': 1,
            '2048x2048-height': 1,
          },
        },
        title: 'Work as one',
        description:
          'We trust, respect, and encourage each other through every challenge, and celebrate every success together. ',
      },
      {
        icon: {
          ID: 1145,
          id: 1145,
          title: 'AboutUs_Empower developers',
          filename: 'AboutUs_Empower-developers.svg',
          filesize: 5933,
          url: '/website-assets/media/2025/11/AboutUs_Empower-developers.svg',
          link: '/about-us/attachment/aboutus_empower-developers/',
          alt: '',
          author: '6',
          description: '',
          caption: '',
          name: 'aboutus_empower-developers',
          status: 'inherit',
          uploaded_to: 963,
          date: '2025-11-21 22:31:10',
          modified: '2025-11-21 22:31:10',
          menu_order: 0,
          mime_type: 'image/svg+xml',
          type: 'image',
          subtype: 'svg+xml',
          icon: '/website-assets/media/default.png',
          width: 0,
          height: 0,
          sizes: {
            thumbnail: '/website-assets/media/2025/11/AboutUs_Empower-developers.svg',
            'thumbnail-width': 1,
            'thumbnail-height': 1,
            medium: '/website-assets/media/2025/11/AboutUs_Empower-developers.svg',
            'medium-width': 1,
            'medium-height': 1,
            medium_large: '/website-assets/media/2025/11/AboutUs_Empower-developers.svg',
            'medium_large-width': 1,
            'medium_large-height': 1,
            large: '/website-assets/media/2025/11/AboutUs_Empower-developers.svg',
            'large-width': 1,
            'large-height': 1,
            '1536x1536': '/website-assets/media/2025/11/AboutUs_Empower-developers.svg',
            '1536x1536-width': 1,
            '1536x1536-height': 1,
            '2048x2048': '/website-assets/media/2025/11/AboutUs_Empower-developers.svg',
            '2048x2048-width': 1,
            '2048x2048-height': 1,
          },
        },
        title: 'Empower developers',
        description:
          "We're dedicated to delivering the greatest developer experiences imaginable.",
      },
      {
        icon: {
          ID: 1146,
          id: 1146,
          title: 'AboutUs_Integrity, accountability, and congruency',
          filename: 'AboutUs_Integrity-accountability-and-congruency.svg',
          filesize: 6049,
          url: '/website-assets/media/2025/11/AboutUs_Integrity-accountability-and-congruency.svg',
          link: '/about-us/attachment/aboutus_integrity-accountability-and-congruency/',
          alt: '',
          author: '6',
          description: '',
          caption: '',
          name: 'aboutus_integrity-accountability-and-congruency',
          status: 'inherit',
          uploaded_to: 963,
          date: '2025-11-21 22:31:10',
          modified: '2025-11-21 22:31:10',
          menu_order: 0,
          mime_type: 'image/svg+xml',
          type: 'image',
          subtype: 'svg+xml',
          icon: '/website-assets/media/default.png',
          width: 0,
          height: 0,
          sizes: {
            thumbnail:
              '/website-assets/media/2025/11/AboutUs_Integrity-accountability-and-congruency.svg',
            'thumbnail-width': 1,
            'thumbnail-height': 1,
            medium:
              '/website-assets/media/2025/11/AboutUs_Integrity-accountability-and-congruency.svg',
            'medium-width': 1,
            'medium-height': 1,
            medium_large:
              '/website-assets/media/2025/11/AboutUs_Integrity-accountability-and-congruency.svg',
            'medium_large-width': 1,
            'medium_large-height': 1,
            large:
              '/website-assets/media/2025/11/AboutUs_Integrity-accountability-and-congruency.svg',
            'large-width': 1,
            'large-height': 1,
            '1536x1536':
              '/website-assets/media/2025/11/AboutUs_Integrity-accountability-and-congruency.svg',
            '1536x1536-width': 1,
            '1536x1536-height': 1,
            '2048x2048':
              '/website-assets/media/2025/11/AboutUs_Integrity-accountability-and-congruency.svg',
            '2048x2048-width': 1,
            '2048x2048-height': 1,
          },
        },
        title: 'Integrity, accountability, and congruency',
        description: 'Judged by actions. Walk your talk.',
      },
      {
        icon: {
          ID: 1149,
          id: 1149,
          title: 'AboutUs_Simplicity is perfection',
          filename: 'AboutUs_Simplicity-is-perfection.svg',
          filesize: 4092,
          url: '/website-assets/media/2025/11/AboutUs_Simplicity-is-perfection.svg',
          link: '/about-us/attachment/aboutus_simplicity-is-perfection/',
          alt: '',
          author: '6',
          description: '',
          caption: '',
          name: 'aboutus_simplicity-is-perfection',
          status: 'inherit',
          uploaded_to: 963,
          date: '2025-11-21 22:31:13',
          modified: '2025-11-21 22:31:13',
          menu_order: 0,
          mime_type: 'image/svg+xml',
          type: 'image',
          subtype: 'svg+xml',
          icon: '/website-assets/media/default.png',
          width: 0,
          height: 0,
          sizes: {
            thumbnail: '/website-assets/media/2025/11/AboutUs_Simplicity-is-perfection.svg',
            'thumbnail-width': 1,
            'thumbnail-height': 1,
            medium: '/website-assets/media/2025/11/AboutUs_Simplicity-is-perfection.svg',
            'medium-width': 1,
            'medium-height': 1,
            medium_large: '/website-assets/media/2025/11/AboutUs_Simplicity-is-perfection.svg',
            'medium_large-width': 1,
            'medium_large-height': 1,
            large: '/website-assets/media/2025/11/AboutUs_Simplicity-is-perfection.svg',
            'large-width': 1,
            'large-height': 1,
            '1536x1536': '/website-assets/media/2025/11/AboutUs_Simplicity-is-perfection.svg',
            '1536x1536-width': 1,
            '1536x1536-height': 1,
            '2048x2048': '/website-assets/media/2025/11/AboutUs_Simplicity-is-perfection.svg',
            '2048x2048-width': 1,
            '2048x2048-height': 1,
          },
        },
        title: 'Simplicity is perfection',
        description:
          'We deliver the simplest solutions possible. Simple means less pain for developers, lower costs, and less labor. ',
      },
      {
        icon: {
          ID: 1150,
          id: 1150,
          title: 'AboutUs_Vectors over scalars',
          filename: 'AboutUs_Vectors-over-scalars.svg',
          filesize: 4311,
          url: '/website-assets/media/2025/11/AboutUs_Vectors-over-scalars.svg',
          link: '/about-us/attachment/aboutus_vectors-over-scalars/',
          alt: '',
          author: '6',
          description: '',
          caption: '',
          name: 'aboutus_vectors-over-scalars',
          status: 'inherit',
          uploaded_to: 963,
          date: '2025-11-21 22:31:13',
          modified: '2025-11-21 22:31:13',
          menu_order: 0,
          mime_type: 'image/svg+xml',
          type: 'image',
          subtype: 'svg+xml',
          icon: '/website-assets/media/default.png',
          width: 0,
          height: 0,
          sizes: {
            thumbnail: '/website-assets/media/2025/11/AboutUs_Vectors-over-scalars.svg',
            'thumbnail-width': 1,
            'thumbnail-height': 1,
            medium: '/website-assets/media/2025/11/AboutUs_Vectors-over-scalars.svg',
            'medium-width': 1,
            'medium-height': 1,
            medium_large: '/website-assets/media/2025/11/AboutUs_Vectors-over-scalars.svg',
            'medium_large-width': 1,
            'medium_large-height': 1,
            large: '/website-assets/media/2025/11/AboutUs_Vectors-over-scalars.svg',
            'large-width': 1,
            'large-height': 1,
            '1536x1536': '/website-assets/media/2025/11/AboutUs_Vectors-over-scalars.svg',
            '1536x1536-width': 1,
            '1536x1536-height': 1,
            '2048x2048': '/website-assets/media/2025/11/AboutUs_Vectors-over-scalars.svg',
            '2048x2048-width': 1,
            '2048x2048-height': 1,
          },
        },
        title: 'Vectors over scalars',
        description:
          'Velocity, direction, and momentum matter more than point values. Continuous improvement.',
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<ContentLogosPeopleGrid
  fields={{
    heading: 'Backed by Incredible Investors and Advisors',
    heading_tag: 'h2',
    paragraph:
      "Innovators who've built and scaled the foundational technologies behind modern applications.",
    logos: [
      {
        logo: {
          ID: 1883,
          id: 1883,
          title: 'Madrona Venture Group',
          filename: 'Madrona-Venture-Group.png',
          filesize: 16990,
          url: '/website-assets/media/2026/01/Madrona-Venture-Group.png',
          link: '/about-us/attachment/madrona-venture-group-2/',
          alt: 'Madrona Venture Group',
          author: '9',
          description: '',
          caption: '',
          name: 'madrona-venture-group-2',
          status: 'inherit',
          uploaded_to: 963,
          date: '2026-01-19 23:20:38',
          modified: '2026-01-19 23:20:38',
          menu_order: 0,
          mime_type: 'image/png',
          type: 'image',
          subtype: 'png',
          icon: '/website-assets/media/default.png',
          width: 240,
          height: 114,
          sizes: {
            thumbnail: '/website-assets/media/2026/01/Madrona-Venture-Group-150x114.png',
            'thumbnail-width': 150,
            'thumbnail-height': 114,
            medium: '/website-assets/media/2026/01/Madrona-Venture-Group.png',
            'medium-width': 240,
            'medium-height': 114,
            medium_large: '/website-assets/media/2026/01/Madrona-Venture-Group.png',
            'medium_large-width': 240,
            'medium_large-height': 114,
            large: '/website-assets/media/2026/01/Madrona-Venture-Group.png',
            'large-width': 240,
            'large-height': 114,
            '1536x1536': '/website-assets/media/2026/01/Madrona-Venture-Group.png',
            '1536x1536-width': 240,
            '1536x1536-height': 114,
            '2048x2048': '/website-assets/media/2026/01/Madrona-Venture-Group.png',
            '2048x2048-width': 240,
            '2048x2048-height': 114,
          },
        },
      },
      {
        logo: {
          ID: 984,
          id: 984,
          title: '7c650ee2c90d3f693421baec8a55913d92a53d55',
          filename: '7c650ee2c90d3f693421baec8a55913d92a53d55.png',
          filesize: 55568,
          url: '/website-assets/media/2025/11/7c650ee2c90d3f693421baec8a55913d92a53d55.png',
          link: '/about-us/attachment/7c650ee2c90d3f693421baec8a55913d92a53d55/',
          alt: 'Blackbird Ventures',
          author: '5',
          description: '',
          caption: '',
          name: '7c650ee2c90d3f693421baec8a55913d92a53d55',
          status: 'inherit',
          uploaded_to: 963,
          date: '2025-11-19 20:55:48',
          modified: '2025-11-19 20:55:48',
          menu_order: 0,
          mime_type: 'image/png',
          type: 'image',
          subtype: 'png',
          icon: '/website-assets/media/default.png',
          width: 960,
          height: 540,
          sizes: {
            thumbnail:
              '/website-assets/media/2025/11/7c650ee2c90d3f693421baec8a55913d92a53d55-150x150.png',
            'thumbnail-width': 150,
            'thumbnail-height': 150,
            medium:
              '/website-assets/media/2025/11/7c650ee2c90d3f693421baec8a55913d92a53d55-300x169.png',
            'medium-width': 300,
            'medium-height': 169,
            medium_large:
              '/website-assets/media/2025/11/7c650ee2c90d3f693421baec8a55913d92a53d55-768x432.png',
            'medium_large-width': 768,
            'medium_large-height': 432,
            large:
              '/website-assets/media/2025/11/7c650ee2c90d3f693421baec8a55913d92a53d55.png',
            'large-width': 960,
            'large-height': 540,
            '1536x1536':
              '/website-assets/media/2025/11/7c650ee2c90d3f693421baec8a55913d92a53d55.png',
            '1536x1536-width': 960,
            '1536x1536-height': 540,
            '2048x2048':
              '/website-assets/media/2025/11/7c650ee2c90d3f693421baec8a55913d92a53d55.png',
            '2048x2048-width': 960,
            '2048x2048-height': 540,
          },
        },
      },
      {
        logo: {
          ID: 982,
          id: 982,
          title: 'Clip path group',
          filename: 'Clip-path-group.png',
          filesize: 1126,
          url: '/website-assets/media/2025/11/Clip-path-group.png',
          link: '/about-us/attachment/clip-path-group-3/',
          alt: 'Basis Set Ventures',
          author: '5',
          description: '',
          caption: '',
          name: 'clip-path-group-3',
          status: 'inherit',
          uploaded_to: 963,
          date: '2025-11-19 20:55:46',
          modified: '2025-11-19 20:55:46',
          menu_order: 0,
          mime_type: 'image/png',
          type: 'image',
          subtype: 'png',
          icon: '/website-assets/media/default.png',
          width: 119,
          height: 18,
          sizes: {
            thumbnail: '/website-assets/media/2025/11/Clip-path-group.png',
            'thumbnail-width': 119,
            'thumbnail-height': 18,
            medium: '/website-assets/media/2025/11/Clip-path-group.png',
            'medium-width': 119,
            'medium-height': 18,
            medium_large: '/website-assets/media/2025/11/Clip-path-group.png',
            'medium_large-width': 119,
            'medium_large-height': 18,
            large: '/website-assets/media/2025/11/Clip-path-group.png',
            'large-width': 119,
            'large-height': 18,
            '1536x1536': '/website-assets/media/2025/11/Clip-path-group.png',
            '1536x1536-width': 119,
            '1536x1536-height': 18,
            '2048x2048': '/website-assets/media/2025/11/Clip-path-group.png',
            '2048x2048-width': 119,
            '2048x2048-height': 18,
          },
        },
      },
      {
        logo: {
          ID: 981,
          id: 981,
          title: 'Vector (2)',
          filename: 'Vector-2.png',
          filesize: 1108,
          url: '/website-assets/media/2025/11/Vector-2.png',
          link: '/about-us/attachment/vector-2-2/',
          alt: 'Asymmetric',
          author: '5',
          description: '',
          caption: '',
          name: 'vector-2-2',
          status: 'inherit',
          uploaded_to: 963,
          date: '2025-11-19 20:55:45',
          modified: '2025-11-19 20:55:45',
          menu_order: 0,
          mime_type: 'image/png',
          type: 'image',
          subtype: 'png',
          icon: '/website-assets/media/default.png',
          width: 114,
          height: 20,
          sizes: {
            thumbnail: '/website-assets/media/2025/11/Vector-2.png',
            'thumbnail-width': 114,
            'thumbnail-height': 20,
            medium: '/website-assets/media/2025/11/Vector-2.png',
            'medium-width': 114,
            'medium-height': 20,
            medium_large: '/website-assets/media/2025/11/Vector-2.png',
            'medium_large-width': 114,
            'medium_large-height': 20,
            large: '/website-assets/media/2025/11/Vector-2.png',
            'large-width': 114,
            'large-height': 20,
            '1536x1536': '/website-assets/media/2025/11/Vector-2.png',
            '1536x1536-width': 114,
            '1536x1536-height': 20,
            '2048x2048': '/website-assets/media/2025/11/Vector-2.png',
            '2048x2048-width': 114,
            '2048x2048-height': 20,
          },
        },
      },
      {
        logo: {
          ID: 979,
          id: 979,
          title: 'Group 1000002489',
          filename: 'Group-1000002489.png',
          filesize: 1152,
          url: '/website-assets/media/2025/11/Group-1000002489.png',
          link: '/about-us/attachment/group-1000002489/',
          alt: 'Cardinia Ventures',
          author: '5',
          description: '',
          caption: '',
          name: 'group-1000002489',
          status: 'inherit',
          uploaded_to: 963,
          date: '2025-11-19 20:55:41',
          modified: '2025-11-19 20:55:41',
          menu_order: 0,
          mime_type: 'image/png',
          type: 'image',
          subtype: 'png',
          icon: '/website-assets/media/default.png',
          width: 123,
          height: 28,
          sizes: {
            thumbnail: '/website-assets/media/2025/11/Group-1000002489.png',
            'thumbnail-width': 123,
            'thumbnail-height': 28,
            medium: '/website-assets/media/2025/11/Group-1000002489.png',
            'medium-width': 123,
            'medium-height': 28,
            medium_large: '/website-assets/media/2025/11/Group-1000002489.png',
            'medium_large-width': 123,
            'medium_large-height': 28,
            large: '/website-assets/media/2025/11/Group-1000002489.png',
            'large-width': 123,
            'large-height': 28,
            '1536x1536': '/website-assets/media/2025/11/Group-1000002489.png',
            '1536x1536-width': 123,
            '1536x1536-height': 28,
            '2048x2048': '/website-assets/media/2025/11/Group-1000002489.png',
            '2048x2048-width': 123,
            '2048x2048-height': 28,
          },
        },
      },
      {
        logo: {
          ID: 978,
          id: 978,
          title: 'Vector (3)',
          filename: 'Vector-3.png',
          filesize: 1109,
          url: '/website-assets/media/2025/11/Vector-3.png',
          link: '/about-us/attachment/vector-3/',
          alt: 'Alumni Ventures',
          author: '5',
          description: '',
          caption: '',
          name: 'vector-3',
          status: 'inherit',
          uploaded_to: 963,
          date: '2025-11-19 20:55:39',
          modified: '2025-11-19 20:55:39',
          menu_order: 0,
          mime_type: 'image/png',
          type: 'image',
          subtype: 'png',
          icon: '/website-assets/media/default.png',
          width: 135,
          height: 16,
          sizes: {
            thumbnail: '/website-assets/media/2025/11/Vector-3.png',
            'thumbnail-width': 135,
            'thumbnail-height': 16,
            medium: '/website-assets/media/2025/11/Vector-3.png',
            'medium-width': 135,
            'medium-height': 16,
            medium_large: '/website-assets/media/2025/11/Vector-3.png',
            'medium_large-width': 135,
            'medium_large-height': 16,
            large: '/website-assets/media/2025/11/Vector-3.png',
            'large-width': 135,
            'large-height': 16,
            '1536x1536': '/website-assets/media/2025/11/Vector-3.png',
            '1536x1536-width': 135,
            '1536x1536-height': 16,
            '2048x2048': '/website-assets/media/2025/11/Vector-3.png',
            '2048x2048-width': 135,
            '2048x2048-height': 16,
          },
        },
      },
      {
        logo: {
          ID: 977,
          id: 977,
          title: 'Group 1000002490',
          filename: 'Group-1000002490.svg',
          filesize: 13712,
          url: '/website-assets/media/2025/11/Group-1000002490.svg',
          link: '/about-us/attachment/group-1000002490/',
          alt: 'Picus Capital',
          author: '5',
          description: '',
          caption: '',
          name: 'group-1000002490',
          status: 'inherit',
          uploaded_to: 963,
          date: '2025-11-19 20:55:38',
          modified: '2025-11-19 20:55:38',
          menu_order: 0,
          mime_type: 'image/svg+xml',
          type: 'image',
          subtype: 'svg+xml',
          icon: '/website-assets/media/default.png',
          width: 0,
          height: 0,
          sizes: {
            thumbnail: '/website-assets/media/2025/11/Group-1000002490.svg',
            'thumbnail-width': 1,
            'thumbnail-height': 1,
            medium: '/website-assets/media/2025/11/Group-1000002490.svg',
            'medium-width': 1,
            'medium-height': 1,
            medium_large: '/website-assets/media/2025/11/Group-1000002490.svg',
            'medium_large-width': 1,
            'medium_large-height': 1,
            large: '/website-assets/media/2025/11/Group-1000002490.svg',
            'large-width': 1,
            'large-height': 1,
            '1536x1536': '/website-assets/media/2025/11/Group-1000002490.svg',
            '1536x1536-width': 1,
            '1536x1536-height': 1,
            '2048x2048': '/website-assets/media/2025/11/Group-1000002490.svg',
            '2048x2048-width': 1,
            '2048x2048-height': 1,
          },
        },
      },
      {
        logo: {
          ID: 976,
          id: 976,
          title: 'Group 1000002491',
          filename: 'Group-1000002491.svg',
          filesize: 8554,
          url: '/website-assets/media/2025/11/Group-1000002491.svg',
          link: '/about-us/attachment/group-1000002491/',
          alt: 'Founders\' Co-op',
          author: '5',
          description: '',
          caption: '',
          name: 'group-1000002491',
          status: 'inherit',
          uploaded_to: 963,
          date: '2025-11-19 20:55:38',
          modified: '2025-11-19 20:55:38',
          menu_order: 0,
          mime_type: 'image/svg+xml',
          type: 'image',
          subtype: 'svg+xml',
          icon: '/website-assets/media/default.png',
          width: 0,
          height: 0,
          sizes: {
            thumbnail: '/website-assets/media/2025/11/Group-1000002491.svg',
            'thumbnail-width': 1,
            'thumbnail-height': 1,
            medium: '/website-assets/media/2025/11/Group-1000002491.svg',
            'medium-width': 1,
            'medium-height': 1,
            medium_large: '/website-assets/media/2025/11/Group-1000002491.svg',
            'medium_large-width': 1,
            'medium_large-height': 1,
            large: '/website-assets/media/2025/11/Group-1000002491.svg',
            'large-width': 1,
            'large-height': 1,
            '1536x1536': '/website-assets/media/2025/11/Group-1000002491.svg',
            '1536x1536-width': 1,
            '1536x1536-height': 1,
            '2048x2048': '/website-assets/media/2025/11/Group-1000002491.svg',
            '2048x2048-width': 1,
            '2048x2048-height': 1,
          },
        },
      },
      {
        logo: {
          ID: 980,
          id: 980,
          title: 'Clip path group (2)',
          filename: 'Clip-path-group-2.png',
          filesize: 1935,
          url: '/website-assets/media/2025/11/Clip-path-group-2.png',
          link: '/about-us/attachment/clip-path-group-2-2/',
          alt: 'Madrona Venture Labs',
          author: '5',
          description: '',
          caption: '',
          name: 'clip-path-group-2-2',
          status: 'inherit',
          uploaded_to: 963,
          date: '2025-11-19 20:55:44',
          modified: '2025-11-19 20:55:44',
          menu_order: 0,
          mime_type: 'image/png',
          type: 'image',
          subtype: 'png',
          icon: '/website-assets/media/default.png',
          width: 119,
          height: 34,
          sizes: {
            thumbnail: '/website-assets/media/2025/11/Clip-path-group-2.png',
            'thumbnail-width': 119,
            'thumbnail-height': 34,
            medium: '/website-assets/media/2025/11/Clip-path-group-2.png',
            'medium-width': 119,
            'medium-height': 34,
            medium_large: '/website-assets/media/2025/11/Clip-path-group-2.png',
            'medium_large-width': 119,
            'medium_large-height': 34,
            large: '/website-assets/media/2025/11/Clip-path-group-2.png',
            'large-width': 119,
            'large-height': 34,
            '1536x1536': '/website-assets/media/2025/11/Clip-path-group-2.png',
            '1536x1536-width': 119,
            '1536x1536-height': 34,
            '2048x2048': '/website-assets/media/2025/11/Clip-path-group-2.png',
            '2048x2048-width': 119,
            '2048x2048-height': 34,
          },
        },
      },
      {
        logo: {
          ID: 975,
          id: 975,
          title: 'Vector',
          filename: 'Vector.svg',
          filesize: 4267,
          url: '/website-assets/media/2025/11/Vector.svg',
          link: '/about-us/attachment/vector/',
          alt: 'Logos',
          author: '5',
          description: '',
          caption: '',
          name: 'vector',
          status: 'inherit',
          uploaded_to: 963,
          date: '2025-11-19 20:55:36',
          modified: '2025-11-19 20:55:36',
          menu_order: 0,
          mime_type: 'image/svg+xml',
          type: 'image',
          subtype: 'svg+xml',
          icon: '/website-assets/media/default.png',
          width: 0,
          height: 0,
          sizes: {
            thumbnail: '/website-assets/media/2025/11/Vector.svg',
            'thumbnail-width': 1,
            'thumbnail-height': 1,
            medium: '/website-assets/media/2025/11/Vector.svg',
            'medium-width': 1,
            'medium-height': 1,
            medium_large: '/website-assets/media/2025/11/Vector.svg',
            'medium_large-width': 1,
            'medium_large-height': 1,
            large: '/website-assets/media/2025/11/Vector.svg',
            'large-width': 1,
            'large-height': 1,
            '1536x1536': '/website-assets/media/2025/11/Vector.svg',
            '1536x1536-width': 1,
            '1536x1536-height': 1,
            '2048x2048': '/website-assets/media/2025/11/Vector.svg',
            '2048x2048-width': 1,
            '2048x2048-height': 1,
          },
        },
      },
      {
        logo: {
          ID: 974,
          id: 974,
          title: 'Clip path group',
          filename: 'Clip-path-group.svg',
          filesize: 826,
          url: '/website-assets/media/2025/11/Clip-path-group.svg',
          link: '/about-us/attachment/clip-path-group/',
          alt: 'TA Ventures',
          author: '5',
          description: '',
          caption: '',
          name: 'clip-path-group',
          status: 'inherit',
          uploaded_to: 963,
          date: '2025-11-19 20:55:34',
          modified: '2025-11-19 20:55:34',
          menu_order: 0,
          mime_type: 'image/svg+xml',
          type: 'image',
          subtype: 'svg+xml',
          icon: '/website-assets/media/default.png',
          width: 0,
          height: 0,
          sizes: {
            thumbnail: '/website-assets/media/2025/11/Clip-path-group.svg',
            'thumbnail-width': 1,
            'thumbnail-height': 1,
            medium: '/website-assets/media/2025/11/Clip-path-group.svg',
            'medium-width': 1,
            'medium-height': 1,
            medium_large: '/website-assets/media/2025/11/Clip-path-group.svg',
            'medium_large-width': 1,
            'medium_large-height': 1,
            large: '/website-assets/media/2025/11/Clip-path-group.svg',
            'large-width': 1,
            'large-height': 1,
            '1536x1536': '/website-assets/media/2025/11/Clip-path-group.svg',
            '1536x1536-width': 1,
            '1536x1536-height': 1,
            '2048x2048': '/website-assets/media/2025/11/Clip-path-group.svg',
            '2048x2048-width': 1,
            '2048x2048-height': 1,
          },
        },
      },
      {
        logo: {
          ID: 973,
          id: 973,
          title: 'Vector (2)',
          filename: 'Vector-2.svg',
          filesize: 7964,
          url: '/website-assets/media/2025/11/Vector-2.svg',
          link: '/about-us/attachment/vector-2/',
          alt: 'Protocol Labs',
          author: '5',
          description: '',
          caption: '',
          name: 'vector-2',
          status: 'inherit',
          uploaded_to: 963,
          date: '2025-11-19 20:55:33',
          modified: '2025-11-19 20:55:33',
          menu_order: 0,
          mime_type: 'image/svg+xml',
          type: 'image',
          subtype: 'svg+xml',
          icon: '/website-assets/media/default.png',
          width: 0,
          height: 0,
          sizes: {
            thumbnail: '/website-assets/media/2025/11/Vector-2.svg',
            'thumbnail-width': 1,
            'thumbnail-height': 1,
            medium: '/website-assets/media/2025/11/Vector-2.svg',
            'medium-width': 1,
            'medium-height': 1,
            medium_large: '/website-assets/media/2025/11/Vector-2.svg',
            'medium_large-width': 1,
            'medium_large-height': 1,
            large: '/website-assets/media/2025/11/Vector-2.svg',
            'large-width': 1,
            'large-height': 1,
            '1536x1536': '/website-assets/media/2025/11/Vector-2.svg',
            '1536x1536-width': 1,
            '1536x1536-height': 1,
            '2048x2048': '/website-assets/media/2025/11/Vector-2.svg',
            '2048x2048-width': 1,
            '2048x2048-height': 1,
          },
        },
      },
      {
        logo: {
          ID: 972,
          id: 972,
          title: 'Group 1000002492',
          filename: 'Group-1000002492.svg',
          filesize: 6813,
          url: '/website-assets/media/2025/11/Group-1000002492.svg',
          link: '/about-us/attachment/group-1000002492/',
          alt: 'Geek Ventures',
          author: '5',
          description: '',
          caption: '',
          name: 'group-1000002492',
          status: 'inherit',
          uploaded_to: 963,
          date: '2025-11-19 20:55:32',
          modified: '2025-11-19 20:55:32',
          menu_order: 0,
          mime_type: 'image/svg+xml',
          type: 'image',
          subtype: 'svg+xml',
          icon: '/website-assets/media/default.png',
          width: 0,
          height: 0,
          sizes: {
            thumbnail: '/website-assets/media/2025/11/Group-1000002492.svg',
            'thumbnail-width': 1,
            'thumbnail-height': 1,
            medium: '/website-assets/media/2025/11/Group-1000002492.svg',
            'medium-width': 1,
            'medium-height': 1,
            medium_large: '/website-assets/media/2025/11/Group-1000002492.svg',
            'medium_large-width': 1,
            'medium_large-height': 1,
            large: '/website-assets/media/2025/11/Group-1000002492.svg',
            'large-width': 1,
            'large-height': 1,
            '1536x1536': '/website-assets/media/2025/11/Group-1000002492.svg',
            '1536x1536-width': 1,
            '1536x1536-height': 1,
            '2048x2048': '/website-assets/media/2025/11/Group-1000002492.svg',
            '2048x2048-width': 1,
            '2048x2048-height': 1,
          },
        },
      },
      {
        logo: {
          ID: 971,
          id: 971,
          title: 'Clip path group (2)',
          filename: 'Clip-path-group-2.svg',
          filesize: 1551,
          url: '/website-assets/media/2025/11/Clip-path-group-2.svg',
          link: '/about-us/attachment/clip-path-group-2/',
          alt: 'IEX',
          author: '5',
          description: '',
          caption: '',
          name: 'clip-path-group-2',
          status: 'inherit',
          uploaded_to: 963,
          date: '2025-11-19 20:55:32',
          modified: '2025-11-19 20:55:32',
          menu_order: 0,
          mime_type: 'image/svg+xml',
          type: 'image',
          subtype: 'svg+xml',
          icon: '/website-assets/media/default.png',
          width: 0,
          height: 0,
          sizes: {
            thumbnail: '/website-assets/media/2025/11/Clip-path-group-2.svg',
            'thumbnail-width': 1,
            'thumbnail-height': 1,
            medium: '/website-assets/media/2025/11/Clip-path-group-2.svg',
            'medium-width': 1,
            'medium-height': 1,
            medium_large: '/website-assets/media/2025/11/Clip-path-group-2.svg',
            'medium_large-width': 1,
            'medium_large-height': 1,
            large: '/website-assets/media/2025/11/Clip-path-group-2.svg',
            'large-width': 1,
            'large-height': 1,
            '1536x1536': '/website-assets/media/2025/11/Clip-path-group-2.svg',
            '1536x1536-width': 1,
            '1536x1536-height': 1,
            '2048x2048': '/website-assets/media/2025/11/Clip-path-group-2.svg',
            '2048x2048-width': 1,
            '2048x2048-height': 1,
          },
        },
      },
      {
        logo: {
          ID: 970,
          id: 970,
          title: 'Group 1000002493',
          filename: 'Group-1000002493.svg',
          filesize: 9531,
          url: '/website-assets/media/2025/11/Group-1000002493.svg',
          link: '/about-us/attachment/group-1000002493/',
          alt: 'Elysium Venture Capital',
          author: '5',
          description: '',
          caption: '',
          name: 'group-1000002493',
          status: 'inherit',
          uploaded_to: 963,
          date: '2025-11-19 20:55:31',
          modified: '2025-11-19 20:55:31',
          menu_order: 0,
          mime_type: 'image/svg+xml',
          type: 'image',
          subtype: 'svg+xml',
          icon: '/website-assets/media/default.png',
          width: 0,
          height: 0,
          sizes: {
            thumbnail: '/website-assets/media/2025/11/Group-1000002493.svg',
            'thumbnail-width': 1,
            'thumbnail-height': 1,
            medium: '/website-assets/media/2025/11/Group-1000002493.svg',
            'medium-width': 1,
            'medium-height': 1,
            medium_large: '/website-assets/media/2025/11/Group-1000002493.svg',
            'medium_large-width': 1,
            'medium_large-height': 1,
            large: '/website-assets/media/2025/11/Group-1000002493.svg',
            'large-width': 1,
            'large-height': 1,
            '1536x1536': '/website-assets/media/2025/11/Group-1000002493.svg',
            '1536x1536-width': 1,
            '1536x1536-height': 1,
            '2048x2048': '/website-assets/media/2025/11/Group-1000002493.svg',
            '2048x2048-width': 1,
            '2048x2048-height': 1,
          },
        },
      },
    ],
    people: [
      {
        image: {
          ID: 990,
          id: 990,
          title: 'de83887dfab022a3403b9e66737df01edd1f59fa',
          filename: 'de83887dfab022a3403b9e66737df01edd1f59fa.png',
          filesize: 45273,
          url: '/website-assets/media/2025/11/de83887dfab022a3403b9e66737df01edd1f59fa.png',
          link: '/about-us/attachment/de83887dfab022a3403b9e66737df01edd1f59fa/',
          alt: '',
          author: '5',
          description: '',
          caption: '',
          name: 'de83887dfab022a3403b9e66737df01edd1f59fa',
          status: 'inherit',
          uploaded_to: 963,
          date: '2025-11-19 20:58:59',
          modified: '2025-11-19 20:58:59',
          menu_order: 0,
          mime_type: 'image/png',
          type: 'image',
          subtype: 'png',
          icon: '/website-assets/media/default.png',
          width: 144,
          height: 144,
          sizes: {
            thumbnail:
              '/website-assets/media/2025/11/de83887dfab022a3403b9e66737df01edd1f59fa.png',
            'thumbnail-width': 144,
            'thumbnail-height': 144,
            medium:
              '/website-assets/media/2025/11/de83887dfab022a3403b9e66737df01edd1f59fa.png',
            'medium-width': 144,
            'medium-height': 144,
            medium_large:
              '/website-assets/media/2025/11/de83887dfab022a3403b9e66737df01edd1f59fa.png',
            'medium_large-width': 144,
            'medium_large-height': 144,
            large:
              '/website-assets/media/2025/11/de83887dfab022a3403b9e66737df01edd1f59fa.png',
            'large-width': 144,
            'large-height': 144,
            '1536x1536':
              '/website-assets/media/2025/11/de83887dfab022a3403b9e66737df01edd1f59fa.png',
            '1536x1536-width': 144,
            '1536x1536-height': 144,
            '2048x2048':
              '/website-assets/media/2025/11/de83887dfab022a3403b9e66737df01edd1f59fa.png',
            '2048x2048-width': 144,
            '2048x2048-height': 144,
          },
        },
        name: 'Nat Friedman',
        position__title: 'Investor',
      },
      {
        image: {
          ID: 989,
          id: 989,
          title: 'dcdb454b2de5b4837490e2c2b18334edb956f05e',
          filename: 'dcdb454b2de5b4837490e2c2b18334edb956f05e.png',
          filesize: 31876,
          url: '/website-assets/media/2025/11/dcdb454b2de5b4837490e2c2b18334edb956f05e.png',
          link: '/about-us/attachment/dcdb454b2de5b4837490e2c2b18334edb956f05e/',
          alt: '',
          author: '5',
          description: '',
          caption: '',
          name: 'dcdb454b2de5b4837490e2c2b18334edb956f05e',
          status: 'inherit',
          uploaded_to: 963,
          date: '2025-11-19 20:58:58',
          modified: '2025-11-19 20:58:58',
          menu_order: 0,
          mime_type: 'image/png',
          type: 'image',
          subtype: 'png',
          icon: '/website-assets/media/default.png',
          width: 144,
          height: 144,
          sizes: {
            thumbnail:
              '/website-assets/media/2025/11/dcdb454b2de5b4837490e2c2b18334edb956f05e.png',
            'thumbnail-width': 144,
            'thumbnail-height': 144,
            medium:
              '/website-assets/media/2025/11/dcdb454b2de5b4837490e2c2b18334edb956f05e.png',
            'medium-width': 144,
            'medium-height': 144,
            medium_large:
              '/website-assets/media/2025/11/dcdb454b2de5b4837490e2c2b18334edb956f05e.png',
            'medium_large-width': 144,
            'medium_large-height': 144,
            large:
              '/website-assets/media/2025/11/dcdb454b2de5b4837490e2c2b18334edb956f05e.png',
            'large-width': 144,
            'large-height': 144,
            '1536x1536':
              '/website-assets/media/2025/11/dcdb454b2de5b4837490e2c2b18334edb956f05e.png',
            '1536x1536-width': 144,
            '1536x1536-height': 144,
            '2048x2048':
              '/website-assets/media/2025/11/dcdb454b2de5b4837490e2c2b18334edb956f05e.png',
            '2048x2048-width': 144,
            '2048x2048-height': 144,
          },
        },
        name: 'Mark Russinovich',
        position__title:
          'CTO, Deputy CISO and Technical Fellow, Microsoft Azure',
      },
      {
        image: {
          ID: 988,
          id: 988,
          title: '18e9f4eebc4cbfe81c31820fbad9309e95869deb',
          filename: '18e9f4eebc4cbfe81c31820fbad9309e95869deb.png',
          filesize: 36131,
          url: '/website-assets/media/2025/11/18e9f4eebc4cbfe81c31820fbad9309e95869deb.png',
          link: '/about-us/attachment/18e9f4eebc4cbfe81c31820fbad9309e95869deb/',
          alt: '',
          author: '5',
          description: '',
          caption: '',
          name: '18e9f4eebc4cbfe81c31820fbad9309e95869deb',
          status: 'inherit',
          uploaded_to: 963,
          date: '2025-11-19 20:58:58',
          modified: '2025-11-19 20:58:58',
          menu_order: 0,
          mime_type: 'image/png',
          type: 'image',
          subtype: 'png',
          icon: '/website-assets/media/default.png',
          width: 144,
          height: 144,
          sizes: {
            thumbnail:
              '/website-assets/media/2025/11/18e9f4eebc4cbfe81c31820fbad9309e95869deb.png',
            'thumbnail-width': 144,
            'thumbnail-height': 144,
            medium:
              '/website-assets/media/2025/11/18e9f4eebc4cbfe81c31820fbad9309e95869deb.png',
            'medium-width': 144,
            'medium-height': 144,
            medium_large:
              '/website-assets/media/2025/11/18e9f4eebc4cbfe81c31820fbad9309e95869deb.png',
            'medium_large-width': 144,
            'medium_large-height': 144,
            large:
              '/website-assets/media/2025/11/18e9f4eebc4cbfe81c31820fbad9309e95869deb.png',
            'large-width': 144,
            'large-height': 144,
            '1536x1536':
              '/website-assets/media/2025/11/18e9f4eebc4cbfe81c31820fbad9309e95869deb.png',
            '1536x1536-width': 144,
            '1536x1536-height': 144,
            '2048x2048':
              '/website-assets/media/2025/11/18e9f4eebc4cbfe81c31820fbad9309e95869deb.png',
            '2048x2048-width': 144,
            '2048x2048-height': 144,
          },
        },
        name: 'Thomas Dohmke',
        position__title: 'CEO of Entire, ex-CEO of GitHub',
      },
      {
        image: {
          ID: 987,
          id: 987,
          title: '5c1ceeee491a465d7e3cb88578abd67388343911',
          filename: '5c1ceeee491a465d7e3cb88578abd67388343911.png',
          filesize: 18692,
          url: '/website-assets/media/2025/11/5c1ceeee491a465d7e3cb88578abd67388343911.png',
          link: '/about-us/attachment/5c1ceeee491a465d7e3cb88578abd67388343911/',
          alt: '',
          author: '5',
          description: '',
          caption: '',
          name: '5c1ceeee491a465d7e3cb88578abd67388343911',
          status: 'inherit',
          uploaded_to: 963,
          date: '2025-11-19 20:58:56',
          modified: '2025-11-19 20:58:56',
          menu_order: 0,
          mime_type: 'image/png',
          type: 'image',
          subtype: 'png',
          icon: '/website-assets/media/default.png',
          width: 96,
          height: 96,
          sizes: {
            thumbnail:
              '/website-assets/media/2025/11/5c1ceeee491a465d7e3cb88578abd67388343911.png',
            'thumbnail-width': 96,
            'thumbnail-height': 96,
            medium:
              '/website-assets/media/2025/11/5c1ceeee491a465d7e3cb88578abd67388343911.png',
            'medium-width': 96,
            'medium-height': 96,
            medium_large:
              '/website-assets/media/2025/11/5c1ceeee491a465d7e3cb88578abd67388343911.png',
            'medium_large-width': 96,
            'medium_large-height': 96,
            large:
              '/website-assets/media/2025/11/5c1ceeee491a465d7e3cb88578abd67388343911.png',
            'large-width': 96,
            'large-height': 96,
            '1536x1536':
              '/website-assets/media/2025/11/5c1ceeee491a465d7e3cb88578abd67388343911.png',
            '1536x1536-width': 96,
            '1536x1536-height': 96,
            '2048x2048':
              '/website-assets/media/2025/11/5c1ceeee491a465d7e3cb88578abd67388343911.png',
            '2048x2048-width': 96,
            '2048x2048-height': 96,
          },
        },
        name: 'Sarah Novotny',
        position__title: 'Advisor',
      },
      {
        image: {
          ID: 986,
          id: 986,
          title: '6df481d4b5325026a28bd0a31c43bf6eb8a1bf0f',
          filename: '6df481d4b5325026a28bd0a31c43bf6eb8a1bf0f.png',
          filesize: 21564,
          url: '/website-assets/media/2025/11/6df481d4b5325026a28bd0a31c43bf6eb8a1bf0f.png',
          link: '/about-us/attachment/6df481d4b5325026a28bd0a31c43bf6eb8a1bf0f/',
          alt: '',
          author: '5',
          description: '',
          caption: '',
          name: '6df481d4b5325026a28bd0a31c43bf6eb8a1bf0f',
          status: 'inherit',
          uploaded_to: 963,
          date: '2025-11-19 20:58:55',
          modified: '2025-11-19 20:58:55',
          menu_order: 0,
          mime_type: 'image/png',
          type: 'image',
          subtype: 'png',
          icon: '/website-assets/media/default.png',
          width: 96,
          height: 96,
          sizes: {
            thumbnail:
              '/website-assets/media/2025/11/6df481d4b5325026a28bd0a31c43bf6eb8a1bf0f.png',
            'thumbnail-width': 96,
            'thumbnail-height': 96,
            medium:
              '/website-assets/media/2025/11/6df481d4b5325026a28bd0a31c43bf6eb8a1bf0f.png',
            'medium-width': 96,
            'medium-height': 96,
            medium_large:
              '/website-assets/media/2025/11/6df481d4b5325026a28bd0a31c43bf6eb8a1bf0f.png',
            'medium_large-width': 96,
            'medium_large-height': 96,
            large:
              '/website-assets/media/2025/11/6df481d4b5325026a28bd0a31c43bf6eb8a1bf0f.png',
            'large-width': 96,
            'large-height': 96,
            '1536x1536':
              '/website-assets/media/2025/11/6df481d4b5325026a28bd0a31c43bf6eb8a1bf0f.png',
            '1536x1536-width': 96,
            '1536x1536-height': 96,
            '2048x2048':
              '/website-assets/media/2025/11/6df481d4b5325026a28bd0a31c43bf6eb8a1bf0f.png',
            '2048x2048-width': 96,
            '2048x2048-height': 96,
          },
        },
        name: 'David Siegel',
        position__title: 'Founder and CEO of Glide',
      },
      {
        image: {
          ID: 985,
          id: 985,
          title: '64fcda36bafb81db59421f3e6cb0d7e01bbf6171',
          filename: '64fcda36bafb81db59421f3e6cb0d7e01bbf6171.png',
          filesize: 19655,
          url: '/website-assets/media/2025/11/64fcda36bafb81db59421f3e6cb0d7e01bbf6171.png',
          link: '/about-us/attachment/64fcda36bafb81db59421f3e6cb0d7e01bbf6171/',
          alt: '',
          author: '5',
          description: '',
          caption: '',
          name: '64fcda36bafb81db59421f3e6cb0d7e01bbf6171',
          status: 'inherit',
          uploaded_to: 963,
          date: '2025-11-19 20:58:54',
          modified: '2025-11-19 20:58:54',
          menu_order: 0,
          mime_type: 'image/png',
          type: 'image',
          subtype: 'png',
          icon: '/website-assets/media/default.png',
          width: 96,
          height: 96,
          sizes: {
            thumbnail:
              '/website-assets/media/2025/11/64fcda36bafb81db59421f3e6cb0d7e01bbf6171.png',
            'thumbnail-width': 96,
            'thumbnail-height': 96,
            medium:
              '/website-assets/media/2025/11/64fcda36bafb81db59421f3e6cb0d7e01bbf6171.png',
            'medium-width': 96,
            'medium-height': 96,
            medium_large:
              '/website-assets/media/2025/11/64fcda36bafb81db59421f3e6cb0d7e01bbf6171.png',
            'medium_large-width': 96,
            'medium_large-height': 96,
            large:
              '/website-assets/media/2025/11/64fcda36bafb81db59421f3e6cb0d7e01bbf6171.png',
            'large-width': 96,
            'large-height': 96,
            '1536x1536':
              '/website-assets/media/2025/11/64fcda36bafb81db59421f3e6cb0d7e01bbf6171.png',
            '1536x1536-width': 96,
            '1536x1536-height': 96,
            '2048x2048':
              '/website-assets/media/2025/11/64fcda36bafb81db59421f3e6cb0d7e01bbf6171.png',
            '2048x2048-width': 96,
            '2048x2048-height': 96,
          },
        },
        name: 'David Aronchick',
        position__title: 'Founder and CEO of Expanso',
      },
      {
        image: {
          ID: 991,
          id: 991,
          title: '2af0a198cefd30df4eb33153a4c093eb313c1c20 (1)',
          filename: '2af0a198cefd30df4eb33153a4c093eb313c1c20-1.png',
          filesize: 11694,
          url: '/website-assets/media/2025/11/2af0a198cefd30df4eb33153a4c093eb313c1c20-1.png',
          link: '/about-us/attachment/2af0a198cefd30df4eb33153a4c093eb313c1c20-1/',
          alt: '',
          author: '5',
          description: '',
          caption: '',
          name: '2af0a198cefd30df4eb33153a4c093eb313c1c20-1',
          status: 'inherit',
          uploaded_to: 963,
          date: '2025-11-19 21:00:43',
          modified: '2025-11-19 21:00:43',
          menu_order: 0,
          mime_type: 'image/png',
          type: 'image',
          subtype: 'png',
          icon: '/website-assets/media/default.png',
          width: 96,
          height: 96,
          sizes: {
            thumbnail:
              '/website-assets/media/2025/11/2af0a198cefd30df4eb33153a4c093eb313c1c20-1.png',
            'thumbnail-width': 96,
            'thumbnail-height': 96,
            medium:
              '/website-assets/media/2025/11/2af0a198cefd30df4eb33153a4c093eb313c1c20-1.png',
            'medium-width': 96,
            'medium-height': 96,
            medium_large:
              '/website-assets/media/2025/11/2af0a198cefd30df4eb33153a4c093eb313c1c20-1.png',
            'medium_large-width': 96,
            'medium_large-height': 96,
            large:
              '/website-assets/media/2025/11/2af0a198cefd30df4eb33153a4c093eb313c1c20-1.png',
            'large-width': 96,
            'large-height': 96,
            '1536x1536':
              '/website-assets/media/2025/11/2af0a198cefd30df4eb33153a4c093eb313c1c20-1.png',
            '1536x1536-width': 96,
            '1536x1536-height': 96,
            '2048x2048':
              '/website-assets/media/2025/11/2af0a198cefd30df4eb33153a4c093eb313c1c20-1.png',
            '2048x2048-width': 96,
            '2048x2048-height': 96,
          },
        },
        name: 'Joe McCann',
        position__title: 'Founder, CEO & CIO of Asymmetric',
      },
      {
        image: {
          ID: 992,
          id: 992,
          title: '22d175b5781fac7624b8e7b93fa226d44c925cd3 (1)',
          filename: '22d175b5781fac7624b8e7b93fa226d44c925cd3-1.png',
          filesize: 19783,
          url: '/website-assets/media/2025/11/22d175b5781fac7624b8e7b93fa226d44c925cd3-1.png',
          link: '/about-us/attachment/22d175b5781fac7624b8e7b93fa226d44c925cd3-1/',
          alt: '',
          author: '5',
          description: '',
          caption: '',
          name: '22d175b5781fac7624b8e7b93fa226d44c925cd3-1',
          status: 'inherit',
          uploaded_to: 963,
          date: '2025-11-19 21:00:53',
          modified: '2025-11-19 21:00:53',
          menu_order: 0,
          mime_type: 'image/png',
          type: 'image',
          subtype: 'png',
          icon: '/website-assets/media/default.png',
          width: 96,
          height: 96,
          sizes: {
            thumbnail:
              '/website-assets/media/2025/11/22d175b5781fac7624b8e7b93fa226d44c925cd3-1.png',
            'thumbnail-width': 96,
            'thumbnail-height': 96,
            medium:
              '/website-assets/media/2025/11/22d175b5781fac7624b8e7b93fa226d44c925cd3-1.png',
            'medium-width': 96,
            'medium-height': 96,
            medium_large:
              '/website-assets/media/2025/11/22d175b5781fac7624b8e7b93fa226d44c925cd3-1.png',
            'medium_large-width': 96,
            'medium_large-height': 96,
            large:
              '/website-assets/media/2025/11/22d175b5781fac7624b8e7b93fa226d44c925cd3-1.png',
            'large-width': 96,
            'large-height': 96,
            '1536x1536':
              '/website-assets/media/2025/11/22d175b5781fac7624b8e7b93fa226d44c925cd3-1.png',
            '1536x1536-width': 96,
            '1536x1536-height': 96,
            '2048x2048':
              '/website-assets/media/2025/11/22d175b5781fac7624b8e7b93fa226d44c925cd3-1.png',
            '2048x2048-width': 96,
            '2048x2048-height': 96,
          },
        },
        name: 'Rob Skillington',
        position__title: 'Co-Founder & CTO of Chronosphere',
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<ContentImageVideo
  fields={{
    variant: 'variant-2',
    heading: 'Help shape the next generation of intelligent software',
    heading_tag: 'h2',
    paragraph:
      "Spice AI is building the world's most powerful open-source data and AI engine. We're a small, high-impact team working across distributed systems, query engines, AI, open-source tooling, and modern developer experience. If you love solving complex problems in fast-paced environments and care deeply for your craft, you'll fit right in.",
    cta: [
      {
        type: 'filled',
        cta: {
          title: 'Open roles',
          url: 'https://jobs.lever.co/spiceai',
          target: '_blank',
        },
      },
      {
        type: 'bordered',
        cta: {
          title: 'Contact us',
          url: '/contact/',
          target: '',
        },
      },
    ],
    media_type: 'image',
    media_image: {
      ID: 1327,
      id: 1327,
      title: 'spice_team_photo',
      filename: 'spice_team_photo.jpg',
      filesize: 769307,
      url: '/website-assets/media/2025/11/spice_team_photo.jpg',
      link: '/about-us/attachment/spice_team_photo/',
      alt: '',
      author: '6',
      description: '',
      caption: '',
      name: 'spice_team_photo',
      status: 'inherit',
      uploaded_to: 961,
      date: '2025-11-24 23:45:57',
      modified: '2025-11-24 23:45:57',
      menu_order: 0,
      mime_type: 'image/jpeg',
      type: 'image',
      subtype: 'jpeg',
      icon: '/website-assets/media/default.png',
      width: 2048,
      height: 1536,
      sizes: {
        thumbnail: '/website-assets/media/2025/11/spice_team_photo.jpg',
        'thumbnail-width': 150,
        'thumbnail-height': 150,
        medium: '/website-assets/media/2025/11/spice_team_photo.jpg',
        'medium-width': 300,
        'medium-height': 225,
        medium_large: '/website-assets/media/2025/11/spice_team_photo.jpg',
        'medium_large-width': 768,
        'medium_large-height': 576,
        large: '/website-assets/media/2025/11/spice_team_photo.jpg',
        'large-width': 1024,
        'large-height': 768,
        '1536x1536': '/website-assets/media/2025/11/spice_team_photo.jpg',
        '1536x1536-width': 1536,
        '1536x1536-height': 1152,
        '2048x2048': '/website-assets/media/2025/11/spice_team_photo.jpg',
        '2048x2048-width': 2048,
        '2048x2048-height': 1536,
      },
    },
    graphic_overlay: false,
    media_video: '',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<TalkToAnEngineerCta />

---

## 2025 Spice AI Year in Review
URL: https://spice.ai/blog/2025-spice-ai-year-in-review
Date: 2026-01-02T20:15:30
Description: From day one, Spice was designed to simplify building modern, intelligent applications. In 2025 that vision turned into reality.

<ContentRichText
  fields={{
    coverage: 'rc-start',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>In January 2025, Spice announced <a href="/blog/announcing-spice-ai-open-source-1-0-stable"><strong>1.0 stable</strong></a>, marking the transition from an open-source project to an enterprise-grade, production-ready platform. Spice has shipped <strong>35 stable releases</strong> and <strong>11 major releases</strong> since then.</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>From day one, Spice was designed to simplify building modern, intelligent applications. In 2025 that vision turned into reality. Spice now serves as the data and AI substrate for global, production workloads at enterprises like Twilio and Barracuda - where mission-critical applications query, search, and reason over big data in real time.</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>These data and AI workloads impose fundamentally different demands on the data layer than previous generations of applications. Instead of the complexity of multiple query engines, search platforms, caches, and inference layers, Spice brings this functionality into a single, high-performance data and AI stack. Development teams can query operational databases, data lakes, analytical warehouses, and more with a single SQL interface, while taking advantage of built-in acceleration, hybrid search, and AI.</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>All of this is delivered by a fully open-source engine built in Rust that can be <a href="/feature/edge-to-cloud-deployments">deployed anywhere</a> - as a sidecar, at the edge, in the cloud, or in enterprise clusters. Developers have complete optionality based on their access patterns and business requirements.&nbsp;</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Below are some of the major features that defined 2025 across the core pillars of the Spice platform: federation and acceleration, search, and embedded LLM inference.</p>'
  }
/>

<CoreBlock
  name="core-heading"
  content={
    '<h2 class="wp-block-heading h4">Major 2025 Federation &amp; Acceleration Features</h2>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p><a href="/platform/sql-federation-acceleration">SQL federation and acceleration</a> is at the core of Spice and the applications it enables; enterprise AI applications depend on contextual data drawn from many different systems, and that data must be fast and available to search and reason over in real time.</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>In 2025, Spice simplified querying across disparate data sources while improving performance, scale, and reliability. The connector ecosystem also significantly expanded, enabling teams to ingest and combine data across any source.</p>'
  }
/>

<CoreBlock
  name="core-list"
  content={
    '<ul class="wp-block-list"><li><a href="https://spiceai.org/docs/components/data-accelerators/cayenne#:~:text=Cayenne%20Data%20Accelerator"><strong>Spice Cayenne data accelerator</strong></a>: Introduced in v1.9, Spice Cayenne is the new premier <a href="https://spiceai.org/docs/components/data-accelerators">data accelerators</a> built on the <a href="https://github.com/vortex-data/vortex">Vortex columnar format</a> that enables low-latency, highly concurrent queries over large datasets, overcoming the scalability and memory limits of single-file accelerators like DuckDB.</li><li><a href="/blog/spice-cloud-v1-8-0-iceberg-writes"><strong>Iceberg and Amazon S3 writes</strong></a>: Spice added <a href="https://spiceai.org/docs/components/data-connectors/iceberg">write support for Iceberg tables</a> (v1.8) and <a href="https://spiceai.org/docs/components/data-connectors/s3">Amazon S3 Tables</a> (1.10), delivering direct ingestion, transformation, and materialization of data into object storage. This simplifies writing operational data to object-stores, eliminating the need for complex and costly batch or streaming pipelines.</li><li><a href="https://spiceai.org/docs/features/distributed-query"><strong>Multi-node distributed query (preview)</strong></a>: v1.9 brought multi-node distributed query execution based on Apache Ballista, designed for querying partitioned data lake formats across multiple execution nodes for significantly improved query performance on large datasets.</li><li><a href="/blog/spice-cloud-v1-8-0-iceberg-writes"><strong>Managed acceleration snapshots</strong></a><strong>: </strong>Acceleration Snapshots enable faster restarts, shared accelerations across multiple Spice instances, reduced load on federated systems, and continued query serving even when source systems are temporarily unavailable for enterprise-grade resiliency.</li><li><a href="https://spiceai.org/docs/features/data-acceleration"><strong>Caching acceleration mode</strong></a><strong>: </strong>A new caching mode introduced in v1.10 provides stale-while-revalidate (SWR) behavior for accelerations with background refreshes, and file-persistence with Spice Cayenne, SQLite, or DuckDB.</li><li><a href="https://spiceai.org/docs/components/data-connectors"><strong>Expanded connector ecosystem</strong></a><strong>: </strong>Delta Lake, S3, Databricks, Unity Catalog, AWS Glue, PostgreSQL, MySQL, Kafka, DynamoDB, Kafka, MongoDB, Iceberg and more were introduced or reached stable.</li></ul>'
  }
/>

<CoreBlock
  name="core-heading"
  content={
    '<h3 class="wp-block-heading h5">Federation &amp; Acceleration Feature Highlight: Spice Cayenne</h3>'
  }
/>

<CoreBlock
  name="core-image"
  content={
    '<figure class="wp-block-image size-large"><img src="/website-assets/media/2025/12/Spice-Cayenne-Architecture-1-1024x692.png" alt="Spice Cayenne architecture" class="wp-image-1724"/><figcaption class="wp-element-caption">Figure 1: The Spice Cayenne architecture, built on Vortex and SQLite</figcaption></figure>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Spice leans into the <a href="/blog/making-object-storage-operational">industry shift to object storage</a> as the source of truth for applications. These workloads are often multi-terabyte datasets using open data lake formats like Parquet, Iceberg, or Delta that must serve data and search queries to applications with sub-second performance.</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Existing <a href="https://spiceai.org/docs/components/data-accelerators">data accelerators</a> like DuckDB, are fast and simple for datasets up to 1TB, however for multi-terabyte workloads, a new class of accelerator is required.</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>So we built <a href="https://spiceai.org/docs/components/data-accelerators/cayenne">Spice Cayenne</a>, the next-generation data accelerator for high volume and latency-sensitive applications.&nbsp;<br>Spice Cayenne combines <a href="https://github.com/vortex-data">Vortex</a>, the next-generation columnar file format from the Linux Foundation, with a simple, embedded metadata layer. This separation of concerns ensures that both the storage and metadata layers are fully optimized for what each does best. Cayenne delivers better performance and lower memory consumption than the existing DuckDB, Arrow, SQLite, and PostgreSQL data accelerators.</p>'
  }
/>

<CoreBlock
  name="core-image"
  content={
    '<figure class="wp-block-image size-large"><img src="/website-assets/media/2025/12/TPCH-Benchmark-1024x1024.png" alt="Cayenne accelerated TPC-H queries 1.4x faster than DuckDB (file mode) and used nearly 3x less memory" class="wp-image-1722"/><figcaption class="wp-element-caption">Figure 2: Cayenne accelerated TPC-H queries 1.4x faster than DuckDB (file mode) and used nearly 3x less memory.</figcaption></figure>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Spice Founder Luke Kim demonstrated and walked through the details of the Cayenne architecture in a December, 2025 Community Call:</p>'
  }
/>

<PostVideo
  fields={{
    thumbnail: false,
    type: 'youtube',
    video_id: 'HTdv6-cxKV4',
    video_title:
      'Introducing the Spice Cayenne Data Accelerator | Spice.ai Demo',
    video_upload_date: '2025-12-11T12:00:04-08:00',
    video_channel: 'Spice AI',
    video_description:
      'Spice founder Luke Kim walks through the Spice Cayenne data accelerator architecture in a December 2025 community call.',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<CoreBlock
  name="core-heading"
  content={'<h2 class="wp-block-heading h4">Major 2025 Search Features</h2>'}
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>AI applications are only as effective as the data they can retrieve and reason over. Beyond extracting data, they need to search across both structured and unstructured sources to surface the most relevant context at query time. In 2025, search evolved into a core primitive of the Spice platform, designed to operate natively across federated datasets.</p>'
  }
/>

<CoreBlock
  name="core-list"
  content={
    '<ul class="wp-block-list"><li><a href="/blog/amazon-s3-vectors"><strong>Native Amazon S3 vectors integration</strong></a>: v1.5 added native support for Amazon S3 Vectors, making cost‑effective vector search on object storage a first‑class feature. Subsequent releases introduced multi-index scatter-gather, multi-column primary keys, and partitioned indexes to support scalable production workloads.</li><li><a href="https://spiceai.org/docs/reference/sql/search#reciprocal-rank-fusion-rrf"><strong>Reciprocal Rank Fusion (RRF)</strong></a><strong>: </strong>Introduced in v1.7, RRF combines vector and full-text search results with configurable weighting and recency bias by a simple SQL table-function, producing higher-quality hybrid search rankings than either approach alone.</li><li><a href="/blog/spice-cloud-v1-9-0-cayenne-data-accelerator"><strong>Search on views (full-text and vector)</strong></a><strong>:</strong> Search on views enables advanced search scenarios across different search modalities over pre-aggregated or transformed data, extending the power of Spice\'s search functionality beyond base datasets.</li><li><a href="https://spiceai.org/docs/features/caching#caching-parameters"><strong>Search results caching</strong></a>: Runtime caching for search results improves performance for subsequent searches and chat completion requests that use the document_similarity LLM tool.&nbsp;</li><li><strong>Table‑level search enhancements</strong>: v1.8.2 added <code>additional_columns</code> and <code>where</code> support for table relations in search, enabling multi‑table search workflows.</li></ul>'
  }
/>

<CoreBlock
  name="core-heading"
  content={
    '<h3 class="wp-block-heading h5">Search Feature Highlight: Amazon S3 Vectors</h3>'
  }
/>

<CoreBlock
  name="core-image"
  content={
    '<figure class="wp-block-image size-large"><img src="/website-assets/media/2026/01/Spice-and-S3-Vectors-Architecture-1024x638.png" alt="Spice and S3 Vectors Architecture" class="wp-image-1752"/><figcaption class="wp-element-caption">Figure 3: Spice and S3 Vectors Architecture </figcaption></figure>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>In July, Spice introduced native support for <a href="https://aws.amazon.com/s3/features/vectors/">Amazon S3 Vectors</a> as a <a href="/partners/aws">day 1 launch partner</a> at the <a href="/blog/amazon-s3-vectors">AWS Summit in NYC</a>. Vector similarity search, structured filters, joins, and aggregations can now be executed in SQL within Spice without duplicating data.&nbsp;</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Developers can make vector searches using SQL or HTTP and combine similarity search with relational predicates and joins. Spice pushes filters down to S3 Vectors to minimize data scanned, delivering scalable sub-second query performance with the flexibility of SQL.</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>The Spice team presented a live demo of Spice and Amazon S3 Vectors at <a href="/partners/aws">2025 AWS re:Invent</a>:</p>'
  }
/>

<PostVideo
  fields={{
    thumbnail: false,
    type: 'youtube',
    video_id: 'KuWI0yDOnIU',
    video_title:
      'AWS re:Invent 2025 - How Spice AI operationalizes data lakes for AI using Amazon S3 (STG364)',
    video_upload_date: '2025-12-04T20:46:01-08:00',
    video_channel: 'AWS Events',
    video_description:
      'AWS re:Invent 2025 session on how Spice AI operationalizes Amazon S3 data lakes for AI, with a live Amazon S3 Vectors demo.',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<CoreBlock
  name="core-heading"
  content={
    '<h2 class="wp-block-heading h4">Major AI Features Released in 2025</h2>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Spice deepened its AI capabilities by making LLM inference via SQL native within the query engine. LLMs can be invoked directly in SQL alongside federated queries, joins, and transformations, helping teams move from raw data to insights all within SQL.</p>'
  }
/>

<CoreBlock
  name="core-list"
  content={
    '<ul class="wp-block-list"><li><a href="https://spiceai.org/docs/reference/sql/ai"><strong>AI SQL function</strong></a>: The AI SQL function was introduced in <a href="/blog/spice-cloud-v1-8-0-iceberg-writes">v1.8,</a> supporting LLM calls directly from SQL for generation, translation and classification. Model inference can now run in the same execution path as joins, filters, search, and aggregations.</li><li><a href="https://spiceai.org/docs/components/tools/mcp"><strong>MCP server support</strong></a>: Introduced in v1.1, Spice works as both an MCP server and client. Spice can run stdio-based MCP tools internally or connect to external MCP servers over HTTP SSE and streaming.</li><li><a href="https://spiceai.org/docs/features/embeddings"><strong>Amazon Nova &amp; Nova 2 embeddings</strong></a>: Support for models like <strong>Nova</strong> (v1.5.2) and <strong>Nova 2 multimodal embeddings</strong> (v1.9.1), which support high-dimensional vector representations with configurable truncation modes.&nbsp;</li><li><a href="https://spiceai.org/docs/features/large-language-models"><strong>Expanded model provider ecosystem</strong></a>: Spice added support for new providers including Anthropic, xAI, HuggingFace, Amazon Bedrock, Model2Vec static models, and more.&nbsp;</li><li><a href="https://spiceai.org/docs/components/tools"><strong>Expanded tools ecosystem</strong></a>: Added native tool integrations including the <a href="https://spiceai.org/docs/components/models/openai">OpenAI Responses API</a> (for streaming tool calls and responses) and a <a href="https://spiceai.org/docs/components/tools/websearch">Web Search tool </a>powered by Perplexity. These tools can be invoked within the same execution context as SQL queries and model inference, enabling retrieval-augmented and agent-style workflows without external orchestration.</li></ul>'
  }
/>

<CoreBlock
  name="core-heading"
  content={
    '<h3 class="wp-block-heading h5">AI Feature Highlight: AI SQL Function</h3>'
  }
/>

<CoreBlock
  name="core-image"
  content={
    '<figure class="wp-block-image size-full"><img src="/website-assets/media/2026/01/image.png" alt="AI SQL function example in Spice Cloud" class="wp-image-1758"/><figcaption class="wp-element-caption">Figure 4: AI SQL function example in Spice Cloud</figcaption></figure>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>The <code>ai() </code>SQL function enables developers to invoke LLMs directly within SQL for bulk generation, classification, translation, or analysis. Inference runs alongside joins, filters, aggregations, and search results without additional application-layer plumbing. Developers can transform federated data into structured insights extracting data, call external completion APIs, or orchestrate separate pipelines.</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={'<p>Check out a live demo of the AI SQL function here:</p>'}
/>

<PostVideo
  fields={{
    thumbnail: false,
    type: 'youtube',
    video_id: '5OwbMZCowfo',
    video_title:
      'Invoke LLMs from SQL with the AI SQL Function | Spice.ai Demo',
    video_upload_date: '2025-10-16T14:45:15-07:00',
    video_channel: 'Spice AI',
    video_description:
      'Live demo of the AI SQL function invoking large language models from a SQL query in Spice.',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<CoreBlock
  name="core-heading"
  content={'<h2 class="wp-block-heading h4">Looking ahead</h2>'}
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>2025 was a major year for Spice as it grew from single-node data acceleration to a multi-node data, search, and AI platform. In 2026, <strong>Spice 2.0</strong> will focus on bringing multi-node distributed query execution to GA, alongside continued improvements to search, acceleration, and AI primitives. These investments will help deliver even more predictable performance and operational simplicity.</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>The mission remains the same: to provide a durable, open data substrate that helps teams build and scale the next generation of intelligent, data and AI-driven applications.</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Interested in seeing it for yourself? Get started with the <a href="https://spiceai.org/docs/getting-started">open source runtime</a>, explore <a href="/pricing">pricing</a>, or try the <a href="/login">cloud platform</a> today.</p>'
  }
/>

## Frequently Asked Questions

### What is Spice.ai?

Spice.ai is a portable, open-source data and AI compute engine built in Rust. It provides [SQL federation and acceleration](/platform/sql-federation-acceleration), [hybrid search](/platform/hybrid-sql-search), and [LLM inference](/platform/llm-inference) in a single runtime that can be [deployed anywhere](/feature/edge-to-cloud-deployments) from edge to cloud.

### What were the biggest Spice releases in 2025?

Spice shipped 35 stable releases and 11 major releases in 2025. Key milestones included the 1.0-stable production release, the Spice Cayenne [data accelerator](/use-case/datalake-accelerator) built on the Vortex columnar format, native Amazon S3 Vectors integration, multi-node distributed query execution, and the AI SQL function for invoking LLMs directly from SQL.

### How does Spice compare to a traditional data warehouse?

Unlike centralized data warehouses that require data movement, Spice federates queries across databases, data lakes, and warehouses in place. It materializes working sets locally for sub-millisecond performance and is designed for application serving rather than batch analytics. See [pricing](/pricing) for deployment options.

<ContentResourceFeatured
  fields={{
    heading: 'Explore more Spice resources',
    paragraph:
      'Tutorials, docs, and blog posts to help you go deeper with Spice.',
    mode: 'related',
    resources: false,
    padding_top: 'unset',
    padding_bottom: 'unset',
    related_posts: [],
  }}
/>

<TalkToAnEngineerCta />

<ContentRichText
  fields={{
    coverage: 'rc-end',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<CoreBlock name="core-paragraph" content={'<p></p>'} />

---

## A Developer's Guide to Understanding Spice.ai
URL: https://spice.ai/blog/a-developers-guide-to-understanding-spice-ai
Date: 2026-02-05T22:12:21
Description: Learn what Spice.ai is, when to use it, and how it solves enterprise data challenges. A developer-focused guide to federation, acceleration, search, and AI.

<ContentRichText
  fields={{
    coverage: 'rc-start',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<CoreBlock
  name="core-heading"
  content={'<h2 class="wp-block-heading h4">TL;DR&nbsp;</h2>'}
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>This hands-on guide is designed to help developers&nbsp;quickly&nbsp;build&nbsp;an&nbsp;understanding&nbsp;of Spice: what it is (an&nbsp;AI-native query engine&nbsp;that federates queries, accelerates data, and integrates search and AI), when to use it (data-intensive applications&nbsp;and&nbsp;AI agents), and how it can be leveraged&nbsp;to solve&nbsp;enterprise-scale data challenges.&nbsp;&nbsp;</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p><em><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-black-color">*Note: This guide was last updated on February 5, 2026. Please see <a href="https://spiceai.org/docs">the docs</a> for the latest updates. </mark></em>&nbsp;</p>'
  }
/>

<CoreBlock
  name="core-heading"
  content={
    '<h2 class="wp-block-heading h4"><strong>Who&nbsp;this&nbsp;guide&nbsp;is&nbsp;for&nbsp;</strong></h2>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>This guide is for developers who&nbsp;want&nbsp;to understand&nbsp;<strong>why, how, and when</strong>&nbsp;to use Spice.ai.&nbsp;&nbsp;</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>If you are new to Spice, you might also be wondering how Spice is different than other query engines or data and AI platforms. Most developers exploring Spice are generally doing one of the following: </p>'
  }
/>

<CoreBlock
  name="core-list"
  content={
    '<ul class="wp-block-list"><li>Operationalizing data lakes for real-time&nbsp;queries&nbsp;and search&nbsp;</li></ul>'
  }
/>

<CoreBlock
  name="core-list"
  content={
    '<ul class="wp-block-list"><li>Building applications that need fast&nbsp;access to&nbsp;disparate data&nbsp;</li></ul>'
  }
/>

<CoreBlock
  name="core-list"
  content={
    '<ul class="wp-block-list"><li>Building AI&nbsp;applications and&nbsp;agents that&nbsp;need fast, secure context&nbsp;</li></ul>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    "<p>Let's&nbsp;start with the problem Spice is solving to anchor the discussion.&nbsp;&nbsp;</p>"
  }
/>

<CoreBlock
  name="core-heading"
  content={
    '<h2 class="wp-block-heading h4"><strong>The&nbsp;problem Spice&nbsp;solves</strong>&nbsp;</h2>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Modern applications face a distributed data challenge.&nbsp;</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Enterprise&nbsp;data&nbsp;is spread&nbsp;across<strong>&nbsp;</strong>operational<strong>&nbsp;</strong>databases,&nbsp;data lakes, warehouses, third-party APIs, and more. Each source has its own&nbsp;interface, latency characteristics, and access patterns.&nbsp;</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>AI workloads amplify the problem.&nbsp;RAG applications&nbsp;generally&nbsp;require:&nbsp;</p>'
  }
/>

<CoreBlock
  name="core-list"
  content={
    '<ul class="wp-block-list"><li>A vector database (e.g.&nbsp;Pinecone,&nbsp;Weaviate) for embeddings&nbsp;</li></ul>'
  }
/>

<CoreBlock
  name="core-list"
  content={
    '<ul class="wp-block-list"><li>A&nbsp;text&nbsp;search engine (e.g.&nbsp;Elasticsearch) for keyword matching&nbsp;</li></ul>'
  }
/>

<CoreBlock
  name="core-list"
  content={
    '<ul class="wp-block-list"><li>A cache layer (e.g.&nbsp;Redis) for performance&nbsp;&amp; latency&nbsp;</li></ul>'
  }
/>

<CoreBlock
  name="core-list"
  content={
    '<ul class="wp-block-list"><li>Model hosting and serving&nbsp;(OpenAI, Anthropic) for&nbsp;LLM&nbsp;inference&nbsp;</li></ul>'
  }
/>

<CoreBlock
  name="core-list"
  content={
    '<ul class="wp-block-list"><li>Orchestration code&nbsp;and services&nbsp;to coordinate everything&nbsp;</li></ul>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>This can be a lot of complexity, even for a simple application.&nbsp;</p>'
  }
/>

<CoreBlock
  name="core-heading"
  content={
    '<h2 class="wp-block-heading h4"><strong>What is Spice?&nbsp;</strong></h2>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Spice is an&nbsp;open-source&nbsp;SQL&nbsp;<a href="/platform/sql-federation-acceleration" target="_blank" rel="noreferrer noopener">query</a>,&nbsp;<a href="/platform/hybrid-sql-search" target="_blank" rel="noreferrer noopener">search</a>, and&nbsp;<a href="/platform/llm-inference" target="_blank" rel="noreferrer noopener">LLM-inference engine</a>&nbsp;written in Rust, purpose-built for data-driven applications and AI agents. At its core, Spice is a&nbsp;<strong>high-performance compute engine</strong>&nbsp;that&nbsp;federates,&nbsp;searches, and processes data&nbsp;across your existing infrastructure - querying&nbsp;&amp; accelerating&nbsp;data where it lives and integrating&nbsp;search and&nbsp;AI capabilities through SQL.&nbsp;</p>'
  }
/>

<CoreBlock
  name="core-image"
  content={
    '<figure class="wp-block-image size-large"><img src="/website-assets/media/2026/02/Spice.ai-Compute-Engine-7-1024x692.png" alt="Spice.ai architecture" class="wp-image-1979"/><figcaption class="wp-element-caption">Figure 1. Spice.ai architecture </figcaption></figure>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Unlike databases&nbsp;that require migrations &amp; maintenance, Spice takes a declarative&nbsp;configuration&nbsp;approach:&nbsp;<strong>datasets, views, models, tools are defined in declarative YAML</strong>, and<strong>&nbsp;Spice handles&nbsp;the&nbsp;operations&nbsp;of&nbsp;fetching, caching, and serving that data</strong>.&nbsp;&nbsp;</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={'<p><strong>This makes Spice ideal when:</strong>&nbsp;</p>'}
/>

<CoreBlock
  name="core-list"
  content={
    '<ul class="wp-block-list"><li>Your application needs fast, unified access to disparate&nbsp;data&nbsp;sources&nbsp;</li></ul>'
  }
/>

<CoreBlock
  name="core-list"
  content={
    '<ul class="wp-block-list"><li>You want&nbsp;simplicity and&nbsp;to avoid building and maintaining ETL pipelines&nbsp;</li></ul>'
  }
/>

<CoreBlock
  name="core-list"
  content={
    '<ul class="wp-block-list"><li>You want an operational data lake house for applications and agents&nbsp;</li></ul>'
  }
/>

<CoreBlock
  name="core-list"
  content={
    '<ul class="wp-block-list"><li>You need sub-second query performance without&nbsp;ETL&nbsp;</li></ul>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={'<p><strong>What Spice is&nbsp;not:</strong>&nbsp;</p>'}
/>

<CoreBlock
  name="core-list"
  content={
    '<ul class="wp-block-list"><li>Not a replacement for PostgreSQL or MySQL (use those for transactional workloads)&nbsp;</li></ul>'
  }
/>

<CoreBlock
  name="core-list"
  content={
    '<ul class="wp-block-list"><li>Not a data warehouse (use Snowflake/Databricks for centralized analytics)&nbsp;</li></ul>'
  }
/>

<CoreBlock
  name="core-heading"
  content={
    '<h2 class="wp-block-heading h4"><strong>Mental&nbsp;model: Spice as a&nbsp;data and AI&nbsp;substrate&nbsp;</strong></h2>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Think of Spice as&nbsp;the operational&nbsp;data &amp; AI&nbsp;layer between your applications and your data infrastructure.&nbsp;</p>'
  }
/>

<CoreBlock
  name="core-image"
  content={
    '<figure class="wp-block-image size-large"><img src="/website-assets/media/2026/02/Spice-Data-Substrate-1024x617.png" alt="Spice Data Substrate" class="wp-image-1981"/><figcaption class="wp-element-caption">Figure 2. Spice as the data substrate for data-intensive AI apps </figcaption></figure>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={'<p><strong>How&nbsp;this&nbsp;guide&nbsp;works</strong>&nbsp;</p>'}
/>

<CoreBlock
  name="core-paragraph"
  content={
    "<p>We'll&nbsp;start with a&nbsp;<strong>hands-on&nbsp;quickstart</strong>&nbsp;to get Spice running, then progressively build your mental model through the core concepts:&nbsp;</p>"
  }
/>

<CoreBlock
  name="core-list"
  content={'<ol start="1" class="wp-block-list"><li>Federation&nbsp;</li></ol>'}
/>

<CoreBlock
  name="core-list"
  content={
    '<ol start="2" class="wp-block-list"><li>Acceleration&nbsp;</li></ol>'
  }
/>

<CoreBlock
  name="core-list"
  content={'<ol start="3" class="wp-block-list"><li>Views&nbsp;</li></ol>'}
/>

<CoreBlock
  name="core-list"
  content={'<ol start="4" class="wp-block-list"><li>Caching&nbsp;</li></ol>'}
/>

<CoreBlock
  name="core-list"
  content={'<ol start="5" class="wp-block-list"><li>Snapshots&nbsp;</li></ol>'}
/>

<CoreBlock
  name="core-list"
  content={'<ol start="6" class="wp-block-list"><li>Models&nbsp;</li></ol>'}
/>

<CoreBlock
  name="core-list"
  content={'<ol start="7" class="wp-block-list"><li>Search&nbsp;</li></ol>'}
/>

<CoreBlock
  name="core-list"
  content={'<ol start="8" class="wp-block-list"><li>Writes&nbsp;</li></ol>'}
/>

<CoreBlock
  name="core-paragraph"
  content={
    "<p>By the end,&nbsp;you'll&nbsp;understand how these primitives&nbsp;are used together&nbsp;to solve&nbsp;enterprise-scale data&nbsp;challenges.</p>"
  }
/>

<CoreBlock
  name="core-heading"
  content={
    '<h2 class="wp-block-heading h4"><strong>Quickstart</strong>&nbsp;</h2>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={'<p>To install and get Spice started, run:&nbsp;</p>'}
/>

```bash
curl https://install.spiceai.org | /bin/bash
```

<CoreBlock name="core-paragraph" content={'<p>Or using Homebrew:&nbsp;</p>'} />

```bash
brew install spiceai/spiceai/spice
```

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Next, in any folder, create a&nbsp;<code>spicepod.yaml</code>&nbsp;file with the following content:&nbsp;</p>'
  }
/>

```yaml
version: v1
kind: Spicepod
name: my_spicepod

datasets:
  - from: s3://spiceai-demo-datasets/taxi_trips/2024/
    name: taxi_trips
```

<CoreBlock name="core-paragraph" content={'<p>In the same folder, run:</p>'} />

```bash
spice run
```

<CoreBlock
  name="core-paragraph"
  content={'<p>And, finally, in another terminal, run:</p>'}
/>

```bash
> spice sql
Welcome to the Spice.ai SQL REPL! Type 'help' for help.

show tables; -- list available tables
sql> show tables;
+--------------+---------------+--------------+-------------+
| table_catalog | table_schema | table_name  | table_type   |
+--------------+---------------+--------------+-------------+
| spice              | runtime          | task_history  | BASE TABLE |
| spice              | public             | taxi_trips      | BASE TABLE |
+--------------+---------------+--------------+-------------+

Time: 0.010767 seconds. 2 rows.
sql> select count(*) from taxi_trips ;
+----------+
| count(*) |
+----------+
| 2964624  |
+----------+
```

<CoreBlock
  name="core-heading"
  content={
    '<h3 class="wp-block-heading h5"><strong>Understanding what just happened&nbsp;</strong>&nbsp;</h3>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={'<p>In that&nbsp;quickstart, you:&nbsp;</p>'}
/>

<CoreBlock
  name="core-list"
  content={
    '<ol start="1" class="wp-block-list"><li><strong>Configured a dataset</strong>&nbsp;(taxi_trips) pointing to a remote S3 bucket&nbsp;</li></ol>'
  }
/>

<CoreBlock
  name="core-list"
  content={
    '<ol start="2" class="wp-block-list"><li><strong>Started the Spice runtime</strong>, which connected to that source&nbsp;</li></ol>'
  }
/>

<CoreBlock
  name="core-list"
  content={
    '<ol start="3" class="wp-block-list"><li><strong>Queried&nbsp;the data</strong>&nbsp;using standard SQL - without moving or copying it.&nbsp;</li></ol>'
  }
/>

<CoreBlock
  name="core-heading"
  content={
    '<h2 class="wp-block-heading h4"><strong>Spice.ai Cloud Platform</strong>&nbsp;</h2>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>You can run the same&nbsp;Spicepod&nbsp;configuration in&nbsp;<a href="/" target="_blank" rel="noreferrer noopener">Spice.ai Cloud,</a>&nbsp;the&nbsp;fully managed version of Spice that extends the open-source runtime with enterprise capabilities: built-in observability, elastic scaling, and team collaboration.&nbsp;</p>'
  }
/>

<CoreBlock
  name="core-heading"
  content={
    '<h2 class="wp-block-heading h3"><strong>Core Concepts</strong>&nbsp;</h2>'
  }
/>

<CoreBlock
  name="core-heading"
  content={
    '<h3 class="wp-block-heading h4"><strong>1. Federation</strong>&nbsp;</h3>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    "<p>In the&nbsp;quickstart, you&nbsp;queried<code>&nbsp;taxi_trips</code> stored in a remote S3 bucket using standard SQL&nbsp;without copying or moving&nbsp;that&nbsp;data.&nbsp;That's&nbsp;federation in action - querying data where it lives, not where&nbsp;you've&nbsp;moved it to.&nbsp;</p>"
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>This is foundational&nbsp;to&nbsp;Spice\'s architecture.&nbsp;<a href="https://spiceai.org/docs/features/query-federation" target="_blank" rel="noreferrer noopener"><strong>Federation</strong></a>&nbsp;in Spice&nbsp;enables you to query data across multiple heterogeneous sources using a single SQL interface, without moving data or building ETL pipelines.&nbsp;</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Traditional approaches force you to build ETL pipelines that extract data from&nbsp;these&nbsp;sources,&nbsp;transform it, and load it into a centralized database or warehouse. Every new data source means building and&nbsp;maintaining&nbsp;another pipeline.&nbsp;</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Spice connects directly to your existing data sources and provides a unified SQL interface across all of them. You configure datasets declaratively in YAML, and Spice handles the connection, query&nbsp;translation, and&nbsp;result&nbsp;aggregation.&nbsp;&nbsp;</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={'<p>Spice supports query federation across:&nbsp;</p>'}
/>

<CoreBlock
  name="core-list"
  content={
    '<ul class="wp-block-list"><li><strong>Databases</strong>: PostgreSQL, MySQL, Microsoft SQL Server, Oracle, MongoDB,&nbsp;ClickHouse, DynamoDB,&nbsp;ScyllaDB&nbsp;</li></ul>'
  }
/>

<CoreBlock
  name="core-list"
  content={
    '<ul class="wp-block-list"><li><strong>Data Warehouses</strong>: Snowflake, Databricks,&nbsp;BigQuery&nbsp;</li></ul>'
  }
/>

<CoreBlock
  name="core-list"
  content={
    '<ul class="wp-block-list"><li><strong>Data Lakes</strong>: S3, Azure Blob Storage,&nbsp;Delta Lake, Apache Iceberg&nbsp;</li></ul>'
  }
/>

<CoreBlock
  name="core-list"
  content={
    '<ul class="wp-block-list"><li><strong>Other Sources</strong>: GitHub,&nbsp;GraphQL, FTP/SFTP, IMAP, Kafka, HTTP/API, and 30+ more connectors&nbsp;</li></ul>'
  }
/>

<CoreBlock
  name="core-image"
  content={
    '<figure class="wp-block-image size-large"><img src="/website-assets/media/2026/02/Spice-Supabase-Acceleration-1-1024x692.png" alt="Spice Federation (and acceleration) architecture" class="wp-image-1982"/><figcaption class="wp-element-caption">Figure 3. Spice Federation (and acceleration) architecture </figcaption></figure>'
  }
/>

<CoreBlock
  name="core-heading"
  content={
    '<h4 class="wp-block-heading h5"><strong><em>How it works</em></strong>&nbsp;</h4>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>When you configure multiple datasets from&nbsp;different sources, Spice\'s query planner (<a href="/blog/how-we-use-apache-datafusion-at-spice-ai" target="_blank" rel="noreferrer noopener">built on Apache&nbsp;DataFusion</a>)&nbsp;optimizes&nbsp;and routes queries appropriately:&nbsp;</p>'
  }
/>

```yaml
datasets:
  # From PostgreSQL
  - from: postgres:customers
    name: customers
    params:
      pg_host: db.example.com
      pg_user: ${secrets:PG_USER}

  # From S3 Parquet files
  - from: s3://bucket/orders/
    name: orders
    params:
      file_format: parquet

  # From Snowflake
  - from: snowflake:analytics.sales
    name: sales
```

```sql
-- Query across all three sources in one statement
SELECT c.name, o.order_total, s.region
FROM customers c
  JOIN orders o ON c.id = o.customer_id
  JOIN sales s ON o.id = s.order_id
WHERE s.region = 'EMEA';
```

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Without&nbsp;additional&nbsp;configuration, each query fetches data directly from the underlying sources. Spice&nbsp;optimizes&nbsp;this as much as possible using filter pushdown and column projection.&nbsp;&nbsp;</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>📚&nbsp;<strong>Docs</strong>:&nbsp;<a href="https://spiceai.org/docs/features/query-federation" target="_blank" rel="noreferrer noopener">Spice Federation</a>&nbsp;and&nbsp;<a href="https://spiceai.org/docs/components/data-connectors" target="_blank" rel="noreferrer noopener">Data Connectors</a>&nbsp;</p>'
  }
/>

<CoreBlock
  name="core-heading"
  content={
    '<h4 class="wp-block-heading h5"><strong>2. Acceleration</strong>&nbsp;</h4>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    "<p>Federation&nbsp;solves the data movement problem, but&nbsp;alone&nbsp;often&nbsp;isn't&nbsp;enough for production applications.&nbsp;Querying remote&nbsp;S3 buckets for every request&nbsp;introduces&nbsp;latency&nbsp;- even with query&nbsp;pushdown&nbsp;and optimization,&nbsp;round-trips&nbsp;to distributed&nbsp;data sources&nbsp;can take seconds (or&nbsp;tens of seconds)&nbsp;for large datasets.&nbsp;</p>"
  }
/>

<CoreBlock
  name="core-image"
  content={
    '<figure class="wp-block-image size-large"><img src="/website-assets/media/2026/02/Use-Case_-CDN-for-Databases-1024x576.png" alt="Acceleration example in a Spice sidecar architecture" class="wp-image-1983"/><figcaption class="wp-element-caption">Figure 4. Acceleration example in a Spice sidecar architecture </figcaption></figure>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Spice&nbsp;<a href="https://spiceai.org/docs/features/data-acceleration" target="_blank" rel="noreferrer noopener">data&nbsp;acceleration</a>&nbsp;materializes&nbsp;working sets of&nbsp;data locally, reducing query latency from seconds to milliseconds. When&nbsp;enabled, Spice&nbsp;syncs data from connected sources and stores it in&nbsp;local stores, like&nbsp;DuckDB&nbsp;or Vortex&nbsp;-&nbsp;giving you the speed of&nbsp;local data with the flexibility of federated access.&nbsp;</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>You can think of acceleration as&nbsp;an intelligent caching layer that understands your data access patterns. Hot data gets materialized&nbsp;locally for instant&nbsp;access&nbsp;and cold data&nbsp;remains&nbsp;federated.&nbsp;Unlike&nbsp;traditional caches that just store query results&nbsp;or static database materializations,&nbsp;Spice accelerates&nbsp;entire datasets with configurable refresh&nbsp;strategies,&nbsp;with the flexible compute of an embedded database.&nbsp;&nbsp;</p>'
  }
/>

<CoreBlock
  name="core-heading"
  content={
    '<h4 class="wp-block-heading h5"><strong><em>Acceleration Engines</em></strong>&nbsp;</h4>'
  }
/>

<CoreBlock
  name="core-table"
  content={
    '<figure class="wp-block-table"><table class="has-fixed-layout"><tbody><tr><td><strong><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-black-color">Engine&nbsp;</mark></strong></td><td><strong><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-black-color">Mode&nbsp;</mark></strong></td><td><strong><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-black-color">Best For&nbsp;</mark></strong></td></tr><tr><td><strong><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-black-color">Arrow&nbsp;</mark></strong></td><td>In-memory only&nbsp;</td><td>Ultra-fast analytical queries, ephemeral workloads&nbsp;</td></tr><tr><td><strong><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-black-color">DuckDB&nbsp;</mark></strong></td><td>Memory or file&nbsp;</td><td>General-purpose OLAP, medium datasets, persistent storage&nbsp;</td></tr><tr><td><strong><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-black-color">SQLite&nbsp;</mark></strong></td><td>Memory or file&nbsp;</td><td>Row-oriented lookups, OLTP patterns, lightweight deployments&nbsp;</td></tr><tr><td><strong><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-black-color">Cayenne&nbsp;</mark></strong></td><td>File only&nbsp;</td><td>High-volume multi-file workloads, terabyte-scale data&nbsp;</td></tr></tbody></table></figure>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>To enable acceleration, add the&nbsp;<code>acceleration</code>&nbsp;block to your dataset configuration:&nbsp;</p>'
  }
/>

```yaml
datasets:
  - from: s3://data-lake/events/
    name: events
    acceleration:
      enabled: true
      engine: cayenne # Choose your engine
      mode: file # 'memory' or 'file'
```

<CoreBlock
  name="core-paragraph"
  content={
    '<p>With this configuration, Spice fetches the&nbsp;events&nbsp;dataset from S3 and stores it in a local&nbsp;<a href="https://spiceai.org/docs/components/data-accelerators/cayenne" target="_blank" rel="noreferrer noopener">Spice Cayenne</a>&nbsp;Vortex&nbsp;files. Queries&nbsp;to&nbsp;events&nbsp;are then served from&nbsp;the local&nbsp;disk instead of making remote calls to S3.&nbsp;&nbsp;</p>'
  }
/>

<CoreBlock
  name="core-image"
  content={
    '<figure class="wp-block-image size-large"><img src="/website-assets/media/2025/12/Spice-Cayenne-Architecture-1-1024x692.png" alt="Spice Cayenne architecture" class="wp-image-1724"/><figcaption class="wp-element-caption">Figure 5. Spice Cayenne architecture</figcaption></figure>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>While&nbsp;DuckDB&nbsp;and SQLite are&nbsp;general purpose&nbsp;engines,&nbsp;Spice&nbsp;Cayenne is purpose-built for modern data lake workloads.&nbsp;It\'s&nbsp;built on&nbsp;<a href="https://github.com/vortex-data/vortex" target="_blank" rel="noreferrer noopener">Vortex</a>&nbsp;- a next-generation columnar format under the Linux Foundation - designed for the scale and access patterns of object storage.&nbsp;</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Learn more:&nbsp;<a href="/blog/introducing-spice-cayenne-data-accelerator" target="_blank" rel="noreferrer noopener">Introducing the Spice Cayenne Data Accelerator</a>&nbsp;&nbsp;</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>📚&nbsp;<strong>Docs</strong>:&nbsp;<a href="https://spiceai.org/docs/components/data-accelerators" target="_blank" rel="noreferrer noopener">Data Accelerators</a>&nbsp;</p>'
  }
/>

<CoreBlock
  name="core-heading"
  content={
    '<h4 class="wp-block-heading h5"><em><strong>Refresh Modes</strong>&nbsp;</em></h4>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Spice offers multiple strategies for keeping accelerated data synchronized with sources:&nbsp;</p>'
  }
/>

<CoreBlock
  name="core-table"
  content={
    '<figure class="wp-block-table"><table class="has-fixed-layout"><tbody><tr><td><strong><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-black-color">Mode&nbsp;</mark></strong></td><td><strong><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-black-color">Description&nbsp;</mark></strong></td><td><strong><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-black-color">Use Case&nbsp;</mark></strong></td></tr><tr><td><em><strong>full</strong>&nbsp;</em></td><td>Complete dataset replacement on each refresh&nbsp;</td><td>Small,&nbsp;slowly-changing&nbsp;datasets&nbsp;</td></tr><tr><td><em><strong>append</strong>&nbsp;(batch)&nbsp;</em></td><td>Adds new records based on a time column&nbsp;</td><td>Append-only logs, time-series data&nbsp;</td></tr><tr><td><em><strong>append</strong>&nbsp;(stream)&nbsp;</em></td><td>Continuous streaming without time column&nbsp;</td><td>Real-time event streams&nbsp;</td></tr><tr><td><em><strong>changes</strong>&nbsp;</em></td><td>CDC-based incremental updates via&nbsp;<a href="https://spiceai.org/docs/components/data-connectors/debezium" target="_blank" rel="noreferrer noopener">Debezium</a>&nbsp;or DynamoDB&nbsp;</td><td>Frequently updated transactional data&nbsp;</td></tr><tr><td><em><strong>caching</strong>&nbsp;</em></td><td>Request-based row-level caching&nbsp;</td><td>API responses, HTTP endpoints&nbsp;</td></tr></tbody></table></figure>'
  }
/>

```yaml
# Full refresh every 8 hours
acceleration:
  refresh_mode: full
  refresh_check_interval: 8h

# Append mode: check for new records from the last day every 10 minutes
acceleration:
  refresh_mode: append
  time_column: created_at
  refresh_check_interval: 10m
  refresh_data_window: 1d

# Continuous ingestion using Kafka
acceleration:
  refresh_mode: append

# CDC with Debezium or DynamoDB Streams
acceleration:
  refresh_mode: changes
```

<CoreBlock
  name="core-paragraph"
  content={
    '<p>📚&nbsp;<strong>Docs</strong>:&nbsp;<a href="https://spiceai.org/docs/features/data-acceleration/data-refresh" target="_blank" rel="noreferrer noopener">Refresh Modes</a>&nbsp;</p>'
  }
/>

<CoreBlock
  name="core-heading"
  content={
    '<h4 class="wp-block-heading h5"><strong><em>Retention Policies </em></strong></h4>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>While refresh modes control how acceleration is populated, retention policies prevent unbounded growth.&nbsp;As data continuously flows into an accelerated dataset-especially in append or streaming modes-storage can grow indefinitely. Retention policies automatically evict stale data using time-based or custom SQL strategies.&nbsp;<br>&nbsp;<br>Retention is particularly useful for time-series workloads like logs, metrics, and event streams where only recent data is relevant for queries. For example, an application monitoring dashboard might only need the last 7 days of logs for troubleshooting, while a real-time analytics pipeline processing IoT sensor data might&nbsp;retain&nbsp;just 24 hours of readings. By defining retention policies, you ensure accelerated datasets stay bounded and performant without manual intervention.&nbsp;<br>&nbsp;<br>Spice supports two retention strategies:&nbsp;<strong>time-based</strong>, which removes records older than a specified period,&nbsp;and&nbsp;<strong>custom SQL-based</strong>, which executes arbitrary DELETE statements for more complex eviction logic. Once defined, Spice runs retention checks automatically at the configured interval:&nbsp;</p>'
  }
/>

```yaml
acceleration:
  # Common retention parameters
  retention_check_enabled: true
  retention_check_interval: 1h
 # Time-based retention policy
 retention_period: 7d
  # Custom SQL-based Retention
  retention_sql: "DELETE FROM logs WHERE status = 'archived'"
```

<CoreBlock
  name="core-paragraph"
  content={
    '<p>📚&nbsp;<strong>Docs</strong>:&nbsp;<a href="https://spiceai.org/docs/features/data-acceleration/data-refresh#retention-policy" target="_blank" rel="noreferrer noopener">Retention</a>&nbsp;</p>'
  }
/>

<CoreBlock
  name="core-heading"
  content={
    '<h4 class="wp-block-heading h5"><strong><em>Constraints and Indexes</em></strong>&nbsp;</h4>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Accelerated datasets support primary key constraints and indexes for optimized query performance and data integrity:&nbsp;</p>'
  }
/>

```yaml
datasets:
  - from: postgres:orders
    name: orders
    acceleration:
      enabled: true
      engine: duckdb
      primary_key: order_id # Creates non-null unique index
      indexes:
        customer_id: enabled # Single column index
        '(created_at, status)': unique # Multi-column unique index
```

<CoreBlock
  name="core-paragraph"
  content={
    '<p>📚&nbsp;<strong>Docs</strong>:&nbsp;<a href="https://spiceai.org/docs/features/data-acceleration/constraints" target="_blank" rel="noreferrer noopener">Constraints</a>&nbsp;&amp;&nbsp;<a href="https://spiceai.org/docs/features/data-acceleration/indexes" target="_blank" rel="noreferrer noopener">Indexes</a>&nbsp;</p>'
  }
/>

<CoreBlock
  name="core-heading"
  content={
    '<h3 class="wp-block-heading h4"><strong>3. Views</strong>&nbsp;</h3>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p><strong>Views</strong>&nbsp;are virtual tables defined by SQL queries&nbsp;-&nbsp;useful for pre-aggregations, transformations, and simplified access patterns:&nbsp;</p>'
  }
/>

```yaml
views:
  - name: daily_revenue
    sql: |
      SELECT  
        DATE_TRUNC('day', created_at) as day, 
        SUM(amount) as revenue, 
        COUNT(*) as transactions 
      FROM orders 
      GROUP BY 1

  - name: top_customers
    sql: |
      SELECT customer_id, SUM(total) as lifetime_value 
      FROM orders 
      GROUP BY customer_id 
      ORDER BY lifetime_value DESC 
      LIMIT 100
```

<CoreBlock
  name="core-paragraph"
  content={
    '<p>📚&nbsp;<strong>Docs</strong>:&nbsp;<a href="https://spiceai.org/docs/reference/spicepod/views" target="_blank" rel="noreferrer noopener">Views</a>&nbsp;</p>'
  }
/>

<CoreBlock
  name="core-heading"
  content={
    '<h3 class="wp-block-heading h4"><strong>4. Caching</strong>&nbsp;</h3>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Spice provides&nbsp;<strong>in-memory caching</strong>&nbsp;for SQL query results, search results, and embeddings&nbsp;-&nbsp;all enabled by default. Caching&nbsp;eliminates&nbsp;redundant computation for repeated queries and improves performance for non-accelerated datasets.&nbsp;</p>'
  }
/>

```yaml
runtime:
  caching:
    sql_results:
      enabled: true
      cache_max_size: 128MiB
      eviction_policy: lru
      item_ttl: 1s
      encoding: none

  search_results:
    enabled: true
    cache_max_size: 128MiB
    eviction_policy: lru
    item_ttl: 1s
    encoding: none

  embeddings_results:
    enabled: true
    cache_max_size: 128MiB
    eviction_policy: lru
    item_ttl: 1s
    encoding: none
```

<CoreBlock
  name="core-table"
  content={
    '<figure class="wp-block-table"><table class="has-fixed-layout"><tbody><tr><td><strong><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-black-color">Option&nbsp;&nbsp;</mark></strong></td><td><strong><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-black-color">Description&nbsp;&nbsp;</mark></strong></td><td><strong><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-black-color">Default&nbsp;&nbsp;</mark></strong></td></tr><tr><td><code>cache_max_size&nbsp;&nbsp;</code></td><td>Entry&nbsp;expiration&nbsp;duration&nbsp;&nbsp;</td><td>128 MiB&nbsp;&nbsp;</td></tr><tr><td><code>item_ttl&nbsp;&nbsp;</code></td><td>Maximum cache storage&nbsp;&nbsp;</td><td>1 second&nbsp;&nbsp;</td></tr><tr><td><code>eviction_policy&nbsp;</code>&nbsp;</td><td>`lru`&nbsp;(least-recently-used) or&nbsp;`tiny_lfu`&nbsp;&nbsp;</td><td>lru&nbsp;&nbsp;</td></tr><tr><td><code>encoding&nbsp;</code>&nbsp;</td><td>Compression:&nbsp;`zstd`&nbsp;or&nbsp;`none`&nbsp;&nbsp;</td><td>none&nbsp;&nbsp;</td></tr></tbody></table></figure>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Spice also supports HTTP cache-control headers (no-cache, max-stale, only-if-cached) for fine-grained control over caching behavior per request.&nbsp;</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>📚&nbsp;<strong>Docs</strong>:&nbsp;<a href="https://spiceai.org/docs/features/caching" target="_blank" rel="noreferrer noopener">Results Caching</a>&nbsp;</p>'
  }
/>

<CoreBlock
  name="core-heading"
  content={
    '<h3 class="wp-block-heading h4"><strong>5. Snapshots</strong>&nbsp;</h3>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p><strong>Snapshots</strong>&nbsp;allow file-based acceleration engines (DuckDB, SQLite, or Cayenne) to bootstrap from pre-stored snapshots in object storage. This dramatically reduces cold-start latency in distributed deployments.&nbsp;</p>'
  }
/>

```yaml
snapshots:
  enabled: true
  location: s3://large_table_snapshots

datasets:
  - from: postgres:large_table
    name: large_table
    acceleration:
      engine: duckdb
      mode: file
      snapshots: enabled
```

<CoreBlock
  name="core-paragraph"
  content={'<p>Snapshot triggers vary by refresh mode:&nbsp;</p>'}
/>

<CoreBlock
  name="core-list"
  content={
    '<ul class="wp-block-list"><li><strong><code>refresh_complete</code></strong>: Creates snapshots after each refresh (full&nbsp;and batch-append&nbsp;modes)&nbsp;</li></ul>'
  }
/>

<CoreBlock
  name="core-list"
  content={
    '<ul class="wp-block-list"><li><strong><code>time_interval</code></strong>: Creates snapshots on a fixed schedule (all refresh modes)&nbsp;</li></ul>'
  }
/>

<CoreBlock
  name="core-list"
  content={
    '<ul class="wp-block-list"><li><strong><code>stream_batches</code></strong>: Creates snapshots after every N&nbsp;batches&nbsp;(streaming modes: Kafka,&nbsp;Debezium, DynamoDB Streams)&nbsp;</li></ul>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>📚&nbsp;<strong>Docs</strong>:&nbsp;<a href="https://spiceai.org/docs/components/data-accelerators/snapshots" target="_blank" rel="noreferrer noopener">Snapshots</a>&nbsp;</p>'
  }
/>

<CoreBlock
  name="core-heading"
  content={
    '<h3 class="wp-block-heading h4"><strong>6. Models</strong>&nbsp;</h3>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    "<p>AI is a first-class capability in the Spice runtime - not a bolt-on&nbsp;integration. Instead of wiring external APIs, you call LLMs directly from SQL queries using the `ai()` function.&nbsp;Embeddings&nbsp;generate&nbsp;automatically&nbsp;during&nbsp;data ingestion,&nbsp;eliminating&nbsp;separate pipeline infrastructure.&nbsp;Text-to-SQL is schema-aware with direct data access, preventing the hallucinations common in external tools that&nbsp;don't&nbsp;understand your table structure.&nbsp;&nbsp;</p>"
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>This SQL-first approach means you can query your federated and accelerated data, pipe results to an LLM for analysis,&nbsp;and get synthesized answers&nbsp;in a single SQL statement.&nbsp;&nbsp;</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>You can connect to hosted providers (OpenAI, Anthropic, Bedrock) or serve models locally with GPU acceleration.&nbsp;Spice&nbsp;provides an OpenAI-compatible AI Gateway, so existing applications using OpenAI SDKs can swap endpoints without code&nbsp;changes.&nbsp;</p>'
  }
/>

<CoreBlock
  name="core-heading"
  content={
    '<h4 class="wp-block-heading h5"><strong><em>Chat Models</em></strong>&nbsp;</h4>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={'<p>Connect to hosted models or serve locally:&nbsp;</p>'}
/>

```yaml
models:
  - name: gpt4
    from: openai:gpt-4o
    params:
      openai_api_key: ${secrets:OPENAI_API_KEY}
      tools: auto # Enable tool use

  - name: claude
    from: anthropic:claude-3-5-sonnet
    params:
      anthropic_api_key: ${secrets:ANTHROPIC_KEY}

  - name: local_llama
    from: huggingface:huggingface.co/meta-llama/Llama-3.1-8B
```

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Use via the OpenAI-compatible API or the&nbsp;<code>spice&nbsp;chat</code>&nbsp;CLI:&nbsp;</p>'
  }
/>

```bash
$ spice chat
Using model: gpt4
chat> How many orders were placed last month?
Based on the orders table, there were 15,234 orders placed last month.
```

<CoreBlock
  name="core-heading"
  content={
    '<h4 class="wp-block-heading h5"><strong><em>NSQL (Text-to-SQL)</em></strong>&nbsp;</h4>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>The&nbsp;<code>/v1/nsq</code>l&nbsp;endpoint converts natural language to SQL and executes it:&nbsp;</p>'
  }
/>

```bash
curl -XPOST "http://localhost:8090/v1/nsql" \
  -H "Content-Type: application/json" \
  -d '{"query": "What was the highest tip any passenger gave?"}'
```

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Spice uses tools like&nbsp;table_schema,&nbsp;random_sample, and&nbsp;sample_distinct_columns&nbsp;to help models write&nbsp;accurate, contextual SQL.&nbsp;</p>'
  }
/>

<CoreBlock
  name="core-heading"
  content={
    '<h4 class="wp-block-heading h5"><strong><em>Embeddings</em></strong>&nbsp;</h4>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Transform text into vectors for similarity search. These embeddings power the&nbsp;<a href="https://usc-word-edit.officeapps.live.com/we/wordeditorframe.aspx?new=1&amp;ui=en-US&amp;rs=en-US&amp;wopisrc=https%3A%2F%2Fspiceai.sharepoint.com%2Fsites%2Fmarketing%2F_vti_bin%2Fwopi.ashx%2Ffiles%2F76afcc482d1744dc9fc5ff9d3b384e4b&amp;wdenableroaming=1&amp;mscc=1&amp;hid=3A24F3A1-100A-6000-9300-1CB4C25C1F6B.0&amp;uih=sharepointcom&amp;wdlcid=en-US&amp;jsapi=1&amp;jsapiver=v2&amp;corrid=ecb166b3-74e5-734c-f51a-a1b23585a6a7&amp;usid=ecb166b3-74e5-734c-f51a-a1b23585a6a7&amp;newsession=1&amp;sftc=1&amp;uihit=docaspx&amp;muv=1&amp;ats=PairwiseBroker&amp;cac=1&amp;sams=1&amp;mtf=1&amp;sfp=1&amp;sdp=1&amp;hch=1&amp;hwfh=1&amp;dchat=1&amp;sc=%7B%22pmo%22%3A%22https%3A%2F%2Fspiceai.sharepoint.com%22%2C%22pmshare%22%3Atrue%7D&amp;ctp=LeastProtected&amp;rct=Normal&amp;wdorigin=Other&amp;afdflight=38&amp;csiro=1&amp;wdredirectionreason=Unified_SingleFlush#vector-search" target="_blank" rel="noreferrer noopener">vector search</a>&nbsp;capabilities covered in the \'search\' section coming up next:&nbsp;</p>'
  }
/>

```yaml
embeddings:
  - name: openai_embed
    from: openai:text-embedding-3-small
    params:
      openai_api_key: ${secrets:OPENAI_API_KEY}

  - name: bedrock_titan
    from: bedrock:amazon.titan-embed-text-v2:0
    params:
      aws_region: us-east-1

  - name: local_minilm
    from: huggingface:sentence-transformers/all-MiniLM-L6-v2
```

<CoreBlock
  name="core-paragraph"
  content={'<p>Configure columns for automatic embedding generation:&nbsp;</p>'}
/>

```yaml
datasets:
  - from: postgres:documents
    name: documents
    acceleration:
      enabled: true
      columns:
        - name: content
          embeddings:
            - from: openai_embed
              chunking:
                enabled: true
                target_chunk_size: 512
```

<CoreBlock
  name="core-paragraph"
  content={
    '<p>📚&nbsp;<strong>Docs</strong>:&nbsp;<a href="https://spiceai.org/docs/components/models" target="_blank" rel="noreferrer noopener">Models</a>&nbsp;&amp;&nbsp;<a href="https://spiceai.org/docs/components/embeddings" target="_blank" rel="noreferrer noopener">Embeddings</a>&nbsp;</p>'
  }
/>

<CoreBlock
  name="core-heading"
  content={
    '<h3 class="wp-block-heading h4"><strong>7.&nbsp;Search</strong>&nbsp;</h3>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>In the&nbsp;previous&nbsp;section, we configured embeddings to generate automatically during data ingestion.&nbsp;Those embeddings enable vector search - one of three search methods Spice&nbsp;provides&nbsp;as native SQL&nbsp;functions.&nbsp;</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    "<p>Spice takes the same integrated approach with search as it does with AI. Search indexes are built on top of accelerated datasets&nbsp;-&nbsp;the same data&nbsp;you're&nbsp;querying and piping to LLMs. Full-text search uses Tantivy with BM25 scoring for keyword matching. Vector search uses the embeddings&nbsp;you've&nbsp;already configured to generate during ingestion. Hybrid search combines both methods with Reciprocal Rank Fusion (RRF) to merge rankings&nbsp;-&nbsp;all via SQL functions&nbsp;like`text_search()`, `vector_search()`, and `rrf()`.&nbsp;Search in Spice powers&nbsp;retrieval-augmented generation (RAG), recommendation systems, and content discovery:&nbsp;</p>"
  }
/>

<CoreBlock
  name="core-table"
  content={
    '<figure class="wp-block-table"><table class="has-fixed-layout"><tbody><tr><td><strong><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-black-color">Method&nbsp;</mark></strong></td><td><strong><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-black-color">Best For&nbsp;</mark></strong></td><td><strong><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-black-color">How It Works&nbsp;</mark></strong></td></tr><tr><td><em>Full-Text Search&nbsp;&nbsp;</em></td><td>Keyword matching, exact phrases&nbsp;&nbsp;</td><td>BM25 scoring via Tantivy&nbsp;&nbsp;</td></tr><tr><td><em>Vector Search&nbsp;&nbsp;</em></td><td>Semantic similarity, meaning-based retrieval&nbsp;&nbsp;</td><td>Embedding distance calculation&nbsp;&nbsp;</td></tr><tr><td><em>Hybrid Search&nbsp;&nbsp;</em></td><td>Queries with both keywords and semantic similarity</td><td>Hybrid execution and ranking through Reciprocal Rank Fusion (RRF)&nbsp;&nbsp;</td></tr></tbody></table></figure>'
  }
/>

<CoreBlock
  name="core-heading"
  content={
    '<h4 class="wp-block-heading h5"><strong><em>Full-Text Search</em>&nbsp;</strong></h4>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Full-text search performs keyword-driven retrieval&nbsp;optimized&nbsp;for text data. Powered by Tantivy with BM25 scoring, it excels at finding exact phrases, specific terms, and keyword combinations. Enable it by indexing the columns you want to search:&nbsp;</p>'
  }
/>

```yaml
datasets:
  - from: postgres:articles
    name: articles
    acceleration:
      enabled: true
      columns:
        - name: title
          full_text_search: enabled
        - name: body
          full_text_search: enabled
```

```sql
SELECT * FROM text_search(articles, 'machine learning', 10);
```

<CoreBlock
  name="core-heading"
  content={
    '<h4 class="wp-block-heading h5"><strong><em>Vector Search</em></strong>&nbsp;</h4>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Vector search uses embeddings to find documents based on semantic similarity rather than exact keyword matches. This is particularly useful when users search with different wording than the source content-a query for "how to fix login issues" can match documents about "authentication troubleshooting."&nbsp;<br>&nbsp;<br>Spice supports both local embedding models (like sentence-transformers from Hugging Face) and remote providers (OpenAI, Anthropic, etc.). Embeddings are configured as top-level components and referenced in dataset columns:</p>'
  }
/>

```yaml
datasets:
  - from: s3://docs/
    name: documents
    vectors:
      enabled: true
      columns:
        - name: body
        embeddings:
         - from: openai_embed
```

```sql
 SELECT * FROM vector_search (documents, 'How do I reset my password?', 10)
WHERE category = 'support'
ORDER BY score;
```

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Vector search is also available via the&nbsp;`/v1/search`&nbsp;HTTP API for direct integration with applications.&nbsp;</p>'
  }
/>

<CoreBlock
  name="core-heading"
  content={
    '<h4 class="wp-block-heading h5"><strong><em>Hybrid Search with RRF</em></strong>&nbsp;</h4>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Neither vector nor full-text search alone produces&nbsp;optimal&nbsp;results for every query. A search for "Python error 403" benefits from both semantic understanding ("error" relates to "exception," "failure") and exact keyword matching ("403," "Python"). Hybrid search combines results from multiple search methods using&nbsp;<a href="https://spiceai.org/docs/reference/sql/search#reciprocal-rank-fusion-rrf" target="_blank" rel="noreferrer noopener">Reciprocal Rank Fusion</a>&nbsp;(RRF), merging rankings to improve relevance across diverse content types:&nbsp;</p>'
  }
/>

```sql
SELECT * FROM rrf(
  vector_search(docs, 'query', 10),
  text_search(docs, 'query', 10)
) LIMIT 10;
```

<CoreBlock
  name="core-paragraph"
  content={
    '<p>📚&nbsp;<strong>Docs</strong>:&nbsp;<a href="https://spiceai.org/docs/features/search" target="_blank" rel="noreferrer noopener">Search</a>&nbsp;&amp;&nbsp;<a href="https://spiceai.org/docs/features/search/vector-search" target="_blank" rel="noreferrer noopener">Vector Search</a>&nbsp;</p>'
  }
/>

<CoreBlock
  name="core-heading"
  content={
    '<h3 class="wp-block-heading h4"><strong>8. Writing Data</strong>&nbsp;</h3>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Spice&nbsp;supports&nbsp;<strong>writing to&nbsp;Apache Iceberg tables and Amazon&nbsp;S3 Tables&nbsp;</strong>via standard&nbsp;<code>INSERT INTO</code>&nbsp;statements.&nbsp;</p>'
  }
/>

<CoreBlock
  name="core-heading"
  content={
    '<h4 class="wp-block-heading h5"><strong><em>Apache Iceberg Writes</em></strong><em>&nbsp;</em></h4>'
  }
/>

```yaml
catalogs:
  - from: iceberg:https://glue.us-east 1.amazonaws.com/iceberg/v1/catalogs/123456/namespaces
    name: ice
    access: read_write

datasets:
  - from: iceberg:https://catalog.example.com/v1/namespaces/sales/tables/transactions
    name: transactions
    access: read_write
```

```sql
-- Insert from another table
INSERT INTO transactions
SELECT * FROM staging_transactions;

-- Insert with values
INSERT INTO transactions (id, amount, timestamp)
VALUES (1001, 299.99, '2025-01-15');

-- Insert into catalog table
INSERT INTO ice.sales.orders
SELECT * FROM federated_orders;
```

<CoreBlock
  name="core-heading"
  content={
    '<h4 class="wp-block-heading h5"><strong><em>Amazon&nbsp;S3 Tables</em></strong>&nbsp;</h4>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Spice offers full read/write capability for&nbsp;<a href="https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-tables-buckets.html" target="_blank" rel="noreferrer noopener">Amazon&nbsp;S3 Tables,</a>&nbsp;enabling direct integration with AWS\' managed table format for S3:&nbsp;</p>'
  }
/>

```yaml
datasets:
  - from: glue:my_namespace.my_table
    name: my_table
    params:
      glue_region: us-east-1
      glue_catalog_id: 123456789012:s3tablescatalog/my-bucket
    access: read_write
```

<CoreBlock
  name="core-paragraph"
  content={
    '<p><strong>Note</strong>: Write support requires&nbsp;access:&nbsp;<code>read_write</code>&nbsp;configuration.</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>📚&nbsp;<strong>Docs</strong>:&nbsp;<a href="https://spiceai.org/docs/features/data-ingestion#write-capable-connectors" target="_blank" rel="noreferrer noopener">Write-Capable Connectors</a>&nbsp;</p>'
  }
/>

<CoreBlock
  name="core-heading"
  content={
    '<h3 class="wp-block-heading h4"><strong>Deployment</strong>&nbsp;</h3>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Spice&nbsp;is designed for&nbsp;deployment&nbsp;flexibility and optionality - from edge devices to multi-node distributed clusters. It ships as a single file ~140MB binary with no external dependencies beyond your configured data sources.&nbsp;&nbsp;</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>This portability means you can deploy the same&nbsp;Spicepod&nbsp;configuration on a Raspberry Pi at the edge, as a sidecar in your Kubernetes cluster, or as a&nbsp;fully-managed&nbsp;cloud service - without code changes:&nbsp;</p>'
  }
/>

<CoreBlock
  name="core-table"
  content={
    '<figure class="wp-block-table"><table class="has-fixed-layout"><tbody><tr><td><strong><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-black-color">Deployment Model&nbsp;</mark></strong></td><td><strong><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-black-color">Description&nbsp;</mark></strong></td><td><strong><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-black-color">Best For&nbsp;</mark></strong></td></tr><tr><td><strong>Standalone</strong>&nbsp;</td><td>Single instance via Docker or binary&nbsp;</td><td>Development, edge devices, simple workloads&nbsp;</td></tr><tr><td><strong>Sidecar</strong>&nbsp;</td><td>Co-located with your application pod&nbsp;</td><td>Low-latency access, microservices architectures&nbsp;</td></tr><tr><td><strong>Microservice</strong>&nbsp;</td><td>Multiple replicas deployed behind a load balancer&nbsp;</td><td>Loosely couple architectures, heavy or varying traffic&nbsp;</td></tr><tr><td><strong>Cluster</strong>&nbsp;</td><td>Distributed multi-node deployment&nbsp;</td><td>Large-scale data, horizontal scaling, fault tolerance&nbsp;</td></tr><tr><td><strong>Sharded</strong>&nbsp;</td><td>Horizontal data partitioning across multiple instances&nbsp;</td><td>Large scale data, distributed query execution&nbsp;</td></tr><tr><td><strong>Tiered</strong>&nbsp;</td><td>Hybrid approach combining sidecar for performance and shared&nbsp;microservice&nbsp;for batch processing&nbsp;</td><td>Varying requirements across different application components&nbsp;</td></tr><tr><td><strong>Cloud</strong>&nbsp;</td><td>Fully-managed&nbsp;cloud platform&nbsp;&nbsp;</td><td>Auto-scaling, built-in observability,&nbsp;zero&nbsp;operational&nbsp;overhead.&nbsp;&nbsp;</td></tr></tbody></table></figure>'
  }
/>

<CoreBlock
  name="core-heading"
  content={
    '<h3 class="wp-block-heading h4"><strong>Putting it all together</strong>&nbsp;</h3>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Spice makes data fast, federated, and AI-ready - through configuration, not&nbsp;code.&nbsp;The flexibility of this architecture means you can start simple and evolve incrementally.&nbsp;&nbsp;</p>'
  }
/>

<CoreBlock
  name="core-table"
  content={
    '<figure class="wp-block-table"><table class="has-fixed-layout"><tbody><tr><td><strong><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-black-color">Concept&nbsp;</mark></strong></td><td><strong><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-black-color">Purpose&nbsp;</mark></strong></td></tr><tr><td><strong>Federation</strong>&nbsp;</td><td>Query 30+ sources with unified SQL&nbsp;</td></tr><tr><td><strong>Acceleration</strong>&nbsp;</td><td>Materialize data locally for sub-second queries&nbsp;</td></tr><tr><td><strong>Views</strong>&nbsp;</td><td>Virtual tables from SQL transformations&nbsp;</td></tr><tr><td><strong>Snapshots</strong>&nbsp;</td><td>Fast cold-start from object storage&nbsp;</td></tr><tr><td><strong>Models</strong>&nbsp;</td><td>Chat, NSQL, and embeddings via OpenAI-compatible API&nbsp;</td></tr><tr><td><strong>Search</strong>&nbsp;</td><td>Full-text and vector search integrated in SQL&nbsp;</td></tr><tr><td><strong>Writes</strong>&nbsp;</td><td>INSERT INTO for Iceberg and&nbsp;Amazon S3&nbsp;tables&nbsp;</td></tr></tbody></table></figure>'
  }
/>

<CoreBlock
  name="core-heading"
  content={
    '<h3 class="wp-block-heading h4"><strong>What can you build with Spice?</strong>&nbsp;</h3>'
  }
/>

<CoreBlock
  name="core-table"
  content={
    '<figure class="wp-block-table"><table class="has-fixed-layout"><tbody><tr><td><strong><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-black-color">Use Case&nbsp;</mark></strong></td><td><strong><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-black-color">How Spice Helps&nbsp;</mark></strong></td></tr><tr><td><strong>Operational Data Lakehouse&nbsp;</strong>&nbsp;</td><td>Serve real-time operational workloads and AI agents directly from Apache Iceberg, Delta Lake, or Parquet with sub-second query latency. Spice federates across object storage and databases, accelerates datasets locally, and integrates hybrid search and LLM inference -&nbsp;eliminating&nbsp;separate systems for operational access.&nbsp;</td></tr><tr><td><strong>Data lake&nbsp;Accelerator</strong>&nbsp;</td><td>Accelerate data lake queries from seconds to milliseconds by materializing&nbsp;frequently-accessed&nbsp;datasets in local engines. Maintain the scale and cost efficiency of object storage while delivering operational-grade query performance with configurable refresh policies.&nbsp;</td></tr><tr><td><strong>Data Mesh</strong>&nbsp;</td><td>Unified SQL access across distributed data sources with automatic performance optimization&nbsp;</td></tr><tr><td><strong>Enterprise Search</strong>&nbsp;</td><td>Combine semantic and full-text search across structured and unstructured data&nbsp;</td></tr><tr><td><strong>RAG Pipelines</strong>&nbsp;</td><td>Merge federated data with vector search and LLMs for context-aware AI applications&nbsp;</td></tr><tr><td><strong>Real-Time Analytics</strong>&nbsp;</td><td>Stream data from Kafka or DynamoDB with sub-second latency into accelerated tables&nbsp;</td></tr><tr><td><strong>Agentic AI</strong>&nbsp;</td><td>Build autonomous agents with tool-augmented LLMs and fast access to operational data&nbsp;</td></tr></tbody></table></figure>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    "<p>Whether&nbsp;you're&nbsp;replacing complex ETL pipelines, building AI-powered applications, or deploying intelligent agents at the edge-Spice provides the primitives to deliver fast, context-aware access to data wherever it lives.&nbsp;</p>"
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>📚&nbsp;<strong>Docs</strong>:&nbsp;<a href="https://spiceai.org/docs/use-cases" target="_blank" rel="noreferrer noopener">Use Cases</a>&nbsp;</p>'
  }
/>

<CoreBlock
  name="core-heading"
  content={
    '<h3 class="wp-block-heading h4"><strong>Next steps&nbsp;</strong>&nbsp;</h3>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Now that you have a mental model for Spice,&nbsp;check out the <a href="/cookbook">cookbook recipes</a> for 80+ examples, the <a href="https://github.com/spiceai/spiceai">GitHub repo</a>, the <a href="https://spiceai.org/docs">full docs</a>, and <a href="/slack">join us on Slack</a> to connect directly with the team and other Spice users.</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p><strong><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-black-color">And, remember these principles:</mark></strong>&nbsp;</p>'
  }
/>

<CoreBlock
  name="core-list"
  content={
    '<ol start="1" class="wp-block-list"><li><strong>Spice is a runtime, not a database:</strong>&nbsp;It federates across your existing data infrastructure&nbsp;</li></ol>'
  }
/>

<CoreBlock
  name="core-list"
  content={
    '<ol start="2" class="wp-block-list"><li><strong>Configuration over code:&nbsp;</strong>Declarative YAML replaces custom integration code&nbsp;</li></ol>'
  }
/>

<CoreBlock
  name="core-list"
  content={
    '<ol start="3" class="wp-block-list"><li><strong>Acceleration is optional but powerful:&nbsp;</strong>Start with federation, add acceleration&nbsp;for latency-sensitive use cases&nbsp;&nbsp;</li></ol>'
  }
/>

<CoreBlock
  name="core-list"
  content={
    '<ol start="4" class="wp-block-list"><li><strong>Composable primitives:</strong>&nbsp;Federation + Acceleration + Search +&nbsp;LLM&nbsp;Models work together&nbsp;</li></ol>'
  }
/>

<CoreBlock
  name="core-list"
  content={
    '<ol start="5" class="wp-block-list"><li><strong>SQL-first:</strong>&nbsp;Everything accessible through standard SQL queries&nbsp;</li></ol>'
  }
/>

## Frequently Asked Questions

### What is Spice.ai used for?

Spice.ai is a data infrastructure platform that provides SQL query federation, data acceleration, hybrid search, and LLM inference in a single runtime. Development teams use it to build data-intensive applications and AI agents that need sub-second access to data across distributed sources, without building custom ETL pipelines or managing multiple systems.

### How is Spice different from a data warehouse like Snowflake or Databricks?

Data warehouses require loading data before querying it and are optimized for batch analytics. Spice [federates queries](/platform/sql-federation-acceleration) across data sources in place, accelerates hot datasets locally, and serves results at application-grade latency (sub-millisecond). It's designed for production application serving rather than analyst-facing dashboards.

### What programming languages work with Spice?

Spice exposes standard HTTP, Arrow Flight, Arrow Flight SQL, ODBC, and JDBC APIs. Any language with an HTTP client or Arrow Flight library can query Spice, including Python, Go, Rust, TypeScript, Java, and .NET. OpenAI-compatible APIs are also available for [LLM inference](/platform/llm-inference) workloads.

### Can Spice be deployed at the edge or on-premises?

Yes. Spice is a ~140 MB single binary that can be deployed as a standalone process, Kubernetes sidecar, microservice, or multi-node cluster. It runs on cloud, on-premises, and edge environments. A [Kubernetes Operator](https://spiceai.org/docs/deployment/kubernetes) is available for high-availability cluster deployments.

### Is Spice AI open source?

Spice AI has an open-source core licensed under Apache 2.0, available at [github.com/spiceai/spiceai](https://github.com/spiceai/spiceai). [Spice Cloud](/pricing) adds enterprise features including SSO, RBAC, audit logs, SLAs, and managed infrastructure.

For deployment patterns beyond a single node, see [distributed query](/feature/distributed-query) and [edge-to-cloud deployments](/feature/edge-to-cloud-deployments).

<ContentResourceFeatured
  fields={{
    heading: 'Explore more Spice resources',
    paragraph:
      'Tutorials, docs, and blog posts to help you go deeper with Spice.',
    mode: 'related',
    resources: false,
    padding_top: 'unset',
    padding_bottom: 'unset',
    related_posts: [
      {
        title:
          'Spice Cloud v1.11: Spice Cayenne Reaches Beta, Apache DataFusion v51, DynamoDB Streams Improvements, &amp; More',
        slug: '/blog/spice-cloud-v1-11',
        excerpt:
          'Spice Cloud v1.11 focuses on what matters most in production: faster queries, lower memory usage, and predictable performance across acceleration and caching.',
        image: '/website-assets/media/2026/01/Spice-Cloud-v1.11-Update.png',
        type: 'Blog',
        taxonomy: ['Releases', 'Spice Cloud Platform'],
      },
      {
        title: 'Real-Time Control Plane Acceleration with DynamoDB Streams ',
        slug: '/blog/real-time-acceleration-with-dynamodb-streams',
        excerpt:
          'How to sync DynamoDB data to thousands of nodes with sub-second latency using a two-tier architecture with DynamoDB Streams and Spice acceleration.',
        image: '/website-assets/media/2026/01/image-33.png',
        type: 'Blog',
        taxonomy: [
          'Data Acceleration',
          'Engineering',
          'Spice Cloud Platform',
          'Spice OSS',
        ],
      },
      {
        title: 'How we use Apache DataFusion at Spice AI',
        slug: '/blog/how-we-use-apache-datafusion-at-spice-ai',
        excerpt:
          'Why we chose to build on DataFusion and how we extended it with custom TableProviders, optimizer rules, and UDFs for federated SQL',
        image:
          '/website-assets/media/2026/01/Engineering-at-Spice-AI-Apache-DataFusion.png',
        type: 'Blog',
        taxonomy: [
          'Spice AI',
          'Spice Cloud Platform',
          'Spice OSS',
          'SQL Federation',
        ],
      },
    ],
  }}
/>

<TalkToAnEngineerCta />

<ContentRichText
  fields={{
    coverage: 'rc-end',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<CoreBlock name="core-paragraph" content={'<p></p>'} />

---

## A New Class of Applications That Learn and Adapt
URL: https://spice.ai/blog/a-new-class-of-applications-that-learn-and-adapt
Date: 2021-12-30T18:08:39
Description: Explore the history of decision engines and how modern machine learning enables applications that learn, adapt, and make better decisions over time with Spice.ai.

<ContentRichText
  fields={{
    coverage: 'rc-start',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>A new class of applications that learn and adapt is becoming possible through machine learning (ML). These applications learn from data and make decisions to achieve the application\'s goals. In the post&nbsp;<a href="/blog/making-apps-that-learn-and-adapt" target="_blank" rel="noreferrer noopener">Making apps that learn and adapt</a>, Luke described how developers integrate this ability to learn and adapt as a core part of the application\'s logic. You can think of the component that does this as a "decision engine." This post will explore a brief history of decision engines and use-cases for this application class.</p>'
  }
/>

<CoreBlock
  name="core-heading"
  content={
    '<h2 class="wp-block-heading h3" id="history-of-decision-engines">History of decision engines</h2>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>The idea to make intelligent decision-making applications is not new. Developers first created these applications around the 1970s<sup><a href="https://web.archive.org/web/20251115002838/https://www.spiceai.org/blog/2021/a-new-class-of-applications-that-learn-and-adapt#user-content-fn-1-af765f">1</a></sup>, and they are some of the earliest examples of using artificial intelligence to solve real-world problems.</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>The first applications used a class of decision engines called "expert systems". A distinguishing trait of expert systems is that they encode human expertise in rules for decision-making. Domain experts created combinations of rules that powered decision-making capabilities.</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={'<p>Some uses of expert systems include:</p>'}
/>

<CoreBlock
  name="core-list"
  content={
    '<ul class="wp-block-list"><li><a href="https://web.archive.org/web/20251115002838/https://ieeexplore.ieee.org/document/9549566" target="_blank" rel="noreferrer noopener">Fault diagnosis</a> </li><li><a href="https://web.archive.org/web/20251115002838/https://www.gregstanleyandassociates.com/whitepapers/IFAC91objectPaper.pdf" target="_blank" rel="noreferrer noopener">"Smart" operator and troubleshooting manual</a></li><li><a href="https://web.archive.org/web/20251115002838/https://www.gregstanleyandassociates.com/whitepapers/IFAC91objectPaper.pdf" target="_blank" rel="noreferrer noopener">Recovery from extreme conditions</a></li><li><a href="https://web.archive.org/web/20251115002838/https://www.gregstanleyandassociates.com/whitepapers/IFAC91objectPaper.pdf" target="_blank" rel="noreferrer noopener">Emergency shutdown</a></li></ul>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>However, the resources required to build expert systems make employing them infeasible for many applications<sup><a href="https://web.archive.org/web/20251115002838/https://www.spiceai.org/blog/2021/a-new-class-of-applications-that-learn-and-adapt#user-content-fn-2-af765f">2</a></sup>. They often need a significant time and resource investment to capture and encode expertise into complex rule sets. These systems also do not automatically learn from experience, relying on experts to write more rules to improve decision-making.</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>With the advent of modern deep-learning techniques and the ability to access significantly more data, it is now possible for the computer, not only the developer, to learn and encode the rules to power a decision engine and improve them over time. The vision for Spice.ai is to make it easy for developers to build this new class of applications. So what are some use-cases for these applications?</p>'
  }
/>

<CoreBlock
  name="core-heading"
  content={
    '<h2 class="wp-block-heading h3" id="use-cases-of-decision-making-applications">Use cases of decision-making applications</h2>'
  }
/>

<CoreBlock
  name="core-heading"
  content={
    '<h3 class="wp-block-heading h5" id="reduce-energy-costs-by-optimizing-air-conditioning">Reduce energy costs by optimizing air conditioning</h3>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p><strong>Today</strong>: The air conditioning system for an office building runs on a fixed schedule and is set to a fixed temperature in business hours, only adjusting using in-room sensor data, if at all. This behavior potentially over cools at business close as the outside temperature lowers and the building starts vacating.</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p><strong>With Spice.ai</strong>: Using Spice.ai, the application combines time-series data from multiple data sources, including the time of day and day of the week, building/room occupancy, and outside temperature, energy consumption, and pricing. The A/C controller application learns how to adjust the air conditioning system as the room naturally cools towards the end of the day. As the occupancy decreases, the decision engine is rewarded for maintaining the desired temperature and minimizing energy consumption/cost.</p>'
  }
/>

<CoreBlock
  name="core-heading"
  content={
    '<h3 class="wp-block-heading h5" id="food-delivery-order-dispatching">Food delivery order dispatching</h3>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p><strong>Today:</strong>&nbsp;Customers order food delivery with a mobile app. When the order is ready to be picked up from the restaurant, the order is dispatched to a delivery driver by a simple heuristic that chooses the nearest available driver. As the app gets more popular with customers and the number of restaurants, drivers, and customers increases, the heuristic needs to be constantly tuned or supplemented with human operators to handle the demand.</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    "<p><strong>With Spice.ai</strong>: The application learns which driver to dispatch to minimize delivery time and maximize customer star ratings. It considers several factors from data, including patterns in both the restaurant and driver's order histories. As the number of users, drivers, and customers increases over time, the app adapts to keep up with the changing patterns and demands of the business.</p>"
  }
/>

<CoreBlock
  name="core-heading"
  content={
    '<h3 class="wp-block-heading h5" id="routing-stock-or-crypto-trades-to-the-best-exchange">Routing stock or crypto trades to the best exchange</h3>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p><strong>Today:</strong> When trading stocks through a broker like Fidelity or TD Ameritrade, your broker will likely route your order to an exchange like the NYSE. And in the emerging world of crypto, you can place your trade or swap directly on a decentralized exchange (DEX) like Uniswap or Pancake Swap. In both cases, the routing of orders is likely to be either a form of traditional expert system based upon rules or even manually routed.</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p><strong>With Spice.ai:</strong>&nbsp;A smart order routing application learns from data such as pending transactions, time of day, day of the week, transaction size, and the recent history of transactions. It finds patterns to determine the most optimal route or exchange to execute the transaction and get you the best trade.</p>'
  }
/>

<CoreBlock
  name="core-heading"
  content={'<h2 class="wp-block-heading h3" id="summary">Summary</h2>'}
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>A new class of applications that can learn and adapt are made possible by integrating AI-powered decision engines. Spice.ai is a decision engine that makes it easy for developers to build these applications.</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>If you\'d like to partner with us in creating this new generation of intelligent decision-making applications, we invite you to join us on <a href="/slack">Slack</a>, or reach out on <a href="https://x.com/spice_ai" target="_blank" rel="noreferrer noopener">Twitter</a>.</p>'
  }
/>

<CoreBlock name="core-paragraph" content={'<p>Phillip</p>'} />

<CoreBlock
  name="core-heading"
  content={'<h3 class="wp-block-heading h4" id="footnote-label">Footnotes</h3>'}
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Kendal, S. L., &amp; Creen, M. (2007).&nbsp;<a href="https://web.archive.org/web/20251115002838/https://www.worldcat.org/title/introduction-to-knowledge-engineering/oclc/70987401" target="_blank" rel="noreferrer noopener">An introduction to knowledge engineering</a>. London: Springer. ISBN 978-1-84628-475-5&nbsp;<a href="https://web.archive.org/web/20251115002838/https://www.spiceai.org/blog/2021/a-new-class-of-applications-that-learn-and-adapt#user-content-fnref-2-af765f">↩</a></p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Russell, Stuart; Norvig, Peter (1995).&nbsp;<a href="https://web.archive.org/web/20251115002838/http://aima.cs.berkeley.edu/" target="_blank" rel="noreferrer noopener">Artificial Intelligence: A Modern Approach</a>. Simon &amp; Schuster. pp. 22-23. ISBN 978-0-13-103805-9.&nbsp;<a href="https://web.archive.org/web/20251115002838/https://www.spiceai.org/blog/2021/a-new-class-of-applications-that-learn-and-adapt#user-content-fnref-1-af765f">↩</a></p>'
  }
/>

Spice AI has evolved since this post was written: the platform today is an operational data lakehouse for data-grounded applications and AI. Explore [SQL query federation and acceleration](/platform/sql-federation-acceleration), see how teams run [secure AI agents on governed data](/use-case/secure-ai-agents), or [get a demo](/get-a-demo).

<ContentResourceFeatured
  fields={{
    heading: 'Explore more Spice resources',
    paragraph:
      'Tutorials, docs, and blog posts to help you go deeper with Spice.',
    mode: 'related',
    resources: false,
    padding_top: 'unset',
    padding_bottom: 'unset',
    related_posts: [
      {
        title: 'A Developer&#8217;s Guide to Understanding Spice.ai',
        slug: '/blog/a-developers-guide-to-understanding-spice-ai',
        excerpt:
          'This guide helps developers build a mental model of why, how, and where to use Spice.',
        image:
          '/website-assets/media/2026/02/A-developers-guide-to-understanding-Spice.ai_.png',
        type: 'Blog',
        taxonomy: [
          'Engineering',
          'Spice AI',
          'Spice Cloud Platform',
          'Spice OSS',
        ],
      },
      {
        title: 'How we use Apache DataFusion at Spice AI',
        slug: '/blog/how-we-use-apache-datafusion-at-spice-ai',
        excerpt:
          'Why we chose to build on DataFusion and how we extended it with custom TableProviders, optimizer rules, and UDFs for federated SQL',
        image:
          '/website-assets/media/2026/01/Engineering-at-Spice-AI-Apache-DataFusion.png',
        type: 'Blog',
        taxonomy: [
          'Spice AI',
          'Spice Cloud Platform',
          'Spice OSS',
          'SQL Federation',
        ],
      },
      {
        title: 'Real-Time Hybrid Search Using RRF: A Hands-On Guide with Spice',
        slug: '/blog/real-time-hybrid-search-using-rrf',
        excerpt:
          'Surfacing relevant answers to searches across datasets has historically meant navigating significant tradeoffs.&nbsp;Keyword (or lexical) search&nbsp;is fast, cheap, and commoditized, but limited by the constraints of exact matching.&nbsp;Vector (or semantic) search&nbsp;captures nuance and intent, but can be slower, harder to debug, and expensive to run at scale. Combining both usually entails standing up multiple engines [&hellip;]',
        image:
          '/website-assets/media/2025/11/68fa4fdfded26b3b6472a172_image-8.png',
        type: 'Blog',
        taxonomy: ['Search', 'Spice AI'],
      },
    ],
  }}
/>

<TalkToAnEngineerCta />

<ContentRichText
  fields={{
    coverage: 'rc-end',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

---

## Adding Spice - The Next Generation of Spice.ai OSS
URL: https://spice.ai/blog/adding-spice-the-next-generation-of-spice-ai-oss
Date: 2024-03-28T18:57:06
Description: Learn how Spice.ai OSS was rebuilt in Rust to deliver fast, local SQL queries across databases, warehouses, and data lakes.

<ContentRichText
  fields={{
    coverage: 'rc-start',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p><strong>TL;DR:</strong>&nbsp;We\'ve rebuilt&nbsp;<a href="https://github.com/spiceai/spiceai" target="_blank" rel="noreferrer noopener" class="">Spice.ai OSS</a>&nbsp;from the ground up in Rust, as a unified SQL query interface and portable runtime to locally materialize, accelerate, and query datasets sourced from any database, data warehouse or data lake. Learn more at&nbsp;<a href="https://github.com/spiceai/spiceai" target="_blank" rel="noreferrer noopener" class="">github.com/spiceai/spiceai</a>.</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>In September, 2021, we&nbsp;<a href="https://blog.spiceai.org/posts/2021/09/07/introducing-spice.ai-open-source-time-series-ai-for-developers/" target="_blank" rel="noreferrer noopener" class="">introduced</a>&nbsp;Spice.ai OSS as a runtime for building AI-driven applications using time-series data.</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>We quickly ran into a big problems in making these applications work... data, the fuel for intelligent software, was painfully difficult to access, operationalize, and use, not only in machine learning, but also in web frontends, backend applications, dashboards, data pipelines, and notebooks. And we had to make hard tradeoffs between cost and query performance.</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>We felt this pain every day building 100TB+ scale data and AI systems for the&nbsp;<a href="/" target="_blank" rel="noreferrer noopener" class="">Spice.ai Cloud Platform</a>. So we took our learnings and infused them back into Spice.ai OSS with the capabilities we wished we had.</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>We rebuilt Spice.ai OSS from the ground up in Rust, as a unified SQL query interface and portable runtime to locally materialize, accelerate, and query data tables sourced from any database, data warehouse or data lake.</p>'
  }
/>

<CoreBlock
  name="core-image"
  content={
    '<figure class="wp-block-image size-large"><img src="/website-assets/media/2024/03/Spice-oss-2024-1024x538.png" alt="Spice OSS Stack" class="wp-image-1783"/><figcaption class="wp-element-caption">Figure 1: Spice OSS Architecture </figcaption></figure>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Spice is a fast, lightweight (&lt; 150 MB), single binary, designed to be deployed alongside your application, dashboard, and within your data or machine learning pipelines. Spice <a href="/platform/sql-federation-acceleration">federates SQL queries</a> across databases (MySQL, PostgreSQL, etc.), data warehouses (Snowflake, BigQuery, etc.) and data lakes (S3, MinIO, Databricks, etc.) so you can easily use and combine data wherever it lives. Datasets, declaratively defined, can be materialized and accelerated using your engine of choice, including DuckDB, SQLite, PostgreSQL, and in-memory Apache Arrow records, for ultra-fast, low-latency query. Accelerated engines run in your infrastructure giving you flexibility and control over price and performance.</p>'
  }
/>

<CoreBlock
  name="core-heading"
  content={'<h2 class="wp-block-heading h5">Before Spice</h2>'}
/>

<CoreBlock
  name="core-image"
  content={
    '<figure class="wp-block-image size-large"><img src="/website-assets/media/2024/03/Before-and-After-with-Spice-1024x538.png" alt="Before Spice, applications submit many queries to external data sources" class="wp-image-1784"/><figcaption class="wp-element-caption">Figure 2:Before Spice, applications submit many queries to external data sources.</figcaption></figure>'
  }
/>

<CoreBlock
  name="core-heading"
  content={'<h2 class="wp-block-heading h5">With Spice </h2>'}
/>

<CoreBlock
  name="core-image"
  content={
    '<figure class="wp-block-image size-large"><img src="/website-assets/media/2024/03/With-Spice-Architecture-1024x413.png" alt="With Spice, applications can submit a single request to external data sources" class="wp-image-1785"/><figcaption class="wp-element-caption">Figure 3: With Spice, applications can submit a single request to external data sources. </figcaption></figure>'
  }
/>

<CoreBlock
  name="core-heading"
  content={'<h2 class="wp-block-heading h4" id="use-cases">Use-Cases</h2>'}
/>

<CoreBlock
  name="core-paragraph"
  content={'<p>The next-generation of Spice.ai OSS enables:</p>'}
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p><strong>Better applications.</strong>&nbsp;Accelerate and co-locate data with frontend and backend applications, for high concurrent queries, serving more users with faster page loads and data updates.&nbsp;<a href="https://github.com/spiceai/samples/tree/trunk/acceleration#local-materialization-and-acceleration-cqrs-sample" target="_blank" rel="noreferrer noopener" class="">Try the CQRS sample app</a>.</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p><strong>Snappy dashboards, analytics, and BI.</strong>&nbsp;Faster, more responsive dashboards without massive compute costs. Spice supports Arrow Flight SQL (JDBC/ODBC/ADBC) for connectivity with Tableau, Looker, PowerBI, and more.&nbsp;<a href="https://github.com/spiceai/samples/blob/trunk/sales-bi/README.md" target="_blank" rel="noreferrer noopener" class="">Watch the Apache Superset with Spice demo.</a></p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p><strong>Faster data pipelines, machine learning training and inference.</strong>&nbsp;Co-locate datasets with pipelines where the data is needed to minimize data-movement and improve query performance.&nbsp;<a href="https://github.com/spiceai/demos/tree/trunk/smart-demo#spiceai-smart-demo" target="_blank" rel="noreferrer noopener" class="">Predict hard drive failure with the SMART data demo.</a></p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p><strong><a href="/use-case/datalake-accelerator">Data lake acceleration</a>.</strong>&nbsp;Materialize and accelerate data from S3, Delta Lake, or Apache Iceberg for sub-second queries without moving data into a centralized warehouse.</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p><strong>Easily query many data sources.</strong>&nbsp;Federated SQL query across databases, data warehouses, and data lakes using&nbsp;<a href="https://docs.spiceai.org/data-connectors" target="_blank" rel="noreferrer noopener" class="">Data Connectors</a>.</p>'
  }
/>

<CoreBlock
  name="core-heading"
  content={
    '<h2 class="wp-block-heading h4" id="community-built">Community Built</h2>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Spice is open-source, Apache 2.0 licensed, and is built using industry-leading technologies including Apache DataFusion, Arrow, and Arrow Flight SQL. We\'re launching with several built-in&nbsp;<a href="https://docs.spiceai.org/data-connectors" target="_blank" rel="noreferrer noopener" class="">Data Connectors</a>&nbsp;and&nbsp;<a href="https://docs.spiceai.org/data-accelerators" target="_blank" rel="noreferrer noopener" class="">Accelerators</a>&nbsp;and Spice is extensible so more will be added in each release. If you\'re interested in contributing, we\'d love to welcome you to the community!</p>'
  }
/>

<CoreBlock
  name="core-heading"
  content={
    '<h2 class="wp-block-heading h3" id="getting-started">Getting Started</h2>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>You can download and run Spice in less than 30 seconds by following the quickstart at<a href="https://spiceai.org/docs/getting-started"> spiceai.org/docs/getting-started</a>.</p>'
  }
/>

<PostVideo
  fields={{
    thumbnail: false,
    type: 'youtube',
    video_id: 't3B2AyshVY0',
    video_title: 'Apache Superset with Spice.ai',
    video_upload_date: '2024-03-29T17:25:44-07:00',
    video_channel: 'Spice AI',
    video_description: 'Demo of using Apache Superset with Spice.ai.',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<CoreBlock
  name="core-heading"
  content={'<h3 class="wp-block-heading h4">Conclusion</h3>'}
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Spice, rebuilt in Rust, introduces a unified SQL query interface, making it simpler and faster to build data-driven applications. The lightweight Spice runtime is easy to deploy and makes it possible to materialize and query data from any source quickly and cost-effectively. Applications can serve more users, dashboards and analytics can be snappier, and data and ML pipelines finish faster, without the heavy lifting of managing data.</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>For developers this translates to less time wrangling data and more time creating innovative applications and business value.</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Check out and&nbsp;<a href="https://github.com/spiceai/spiceai" target="_blank" rel="noreferrer noopener" class="">star the project on GitHub</a>!</p>'
  }
/>

<CoreBlock name="core-paragraph" content={'<p>Thank you,</p>'} />

<CoreBlock name="core-paragraph" content={'<p>Phillip</p>'} />

<CoreBlock name="core-paragraph" content={'<p>‍</p>'} />

## Frequently Asked Questions

### What is Spice.ai OSS?

Spice.ai OSS is an open-source, portable runtime written in Rust that provides developers with a unified SQL query interface to locally materialize, accelerate, and query datasets sourced from any database, data warehouse, or data lake. It is designed for [data-intensive applications](/use-case/datalake-accelerator) that require fast, reliable data access.

### How is Spice.ai OSS different from a traditional database or data warehouse?

Rather than replacing your existing databases, Spice sits alongside your application and [federates queries](/platform/sql-federation-acceleration) across multiple data sources. It materializes working datasets locally for sub-second performance while keeping your source of truth intact.

### What programming languages and protocols does Spice support?

Spice exposes data over industry-standard protocols including HTTP, Apache Arrow Flight, and Arrow Flight SQL. This means any language or tool that speaks SQL, Arrow Flight, or ODBC/JDBC can query Spice without custom integration.

To evaluate Spice for your own workloads, review [Spice Cloud pricing](/pricing) or [get a demo](/get-a-demo) to walk through your architecture with the team.

<ContentResourceFeatured
  fields={{
    heading: 'Explore more Spice resources',
    paragraph:
      'Tutorials, docs, and blog posts to help you go deeper with Spice.',
    mode: 'related',
    resources: false,
    padding_top: 'unset',
    padding_bottom: 'unset',
    related_posts: [
      {
        title: 'A Developer&#8217;s Guide to Understanding Spice.ai',
        slug: '/blog/a-developers-guide-to-understanding-spice-ai',
        excerpt:
          'This guide helps developers build a mental model of why, how, and where to use Spice.',
        image:
          '/website-assets/media/2026/02/A-developers-guide-to-understanding-Spice.ai_.png',
        type: 'Blog',
        taxonomy: [
          'Engineering',
          'Spice AI',
          'Spice Cloud Platform',
          'Spice OSS',
        ],
      },
      {
        title: 'Real-Time Control Plane Acceleration with DynamoDB Streams ',
        slug: '/blog/real-time-acceleration-with-dynamodb-streams',
        excerpt:
          'How to sync DynamoDB data to thousands of nodes with sub-second latency using a two-tier architecture with DynamoDB Streams and Spice acceleration.',
        image: '/website-assets/media/2026/01/image-33.png',
        type: 'Blog',
        taxonomy: [
          'Data Acceleration',
          'Engineering',
          'Spice Cloud Platform',
          'Spice OSS',
        ],
      },
      {
        title: 'How we use Apache DataFusion at Spice AI',
        slug: '/blog/how-we-use-apache-datafusion-at-spice-ai',
        excerpt:
          'Why we chose to build on DataFusion and how we extended it with custom TableProviders, optimizer rules, and UDFs for federated SQL',
        image:
          '/website-assets/media/2026/01/Engineering-at-Spice-AI-Apache-DataFusion.png',
        type: 'Blog',
        taxonomy: [
          'Spice AI',
          'Spice Cloud Platform',
          'Spice OSS',
          'SQL Federation',
        ],
      },
    ],
  }}
/>

<TalkToAnEngineerCta />

<ContentRichText
  fields={{
    coverage: 'rc-end',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<CoreBlock name="core-paragraph" content={'<p></p>'} />

---

## AI needs AI-ready data
URL: https://spice.ai/blog/ai-needs-ai-ready-data
Date: 2021-12-05T04:30:17
Description: An introduction to AI-ready data and how Spice.ai handles normalization, encoding, and real-time data preparation for ML applications.

<ContentRichText
  fields={{
    coverage: 'rc-start',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>A significant challenge when developing an app powered by AI is providing the machine learning (ML) engine with data in a format that it can use to learn. To do that, you need to normalize the numerical data, one-hot encode categorical data, and decide what to do with incomplete data - among other things.</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>This data handling is often challenging! For example, to learn from Bitcoin price data, the prices are better if normalized to a range between -1 and 1. Being close to 0 is also a problem because of the lack of precision in floating-point representations (usually under 1e-5).</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>As a developer, if you are new to AI and machine learning, a great talk that explains the basics is <a href="https://www.youtube.com/playlist?list=PLQY2H8rRoyvwWuPiWnuTDBHe7I0fMSsfO" target="_blank" rel="noreferrer noopener">Machine Learning Zero to Hero</a>. Spice.ai makes the process of getting the data into an AI-ready format easy by doing it for you!</p>'
  }
/>

<CoreBlock
  name="core-heading"
  content={
    '<h2 class="wp-block-heading h4" id="what-is-ai-ready-data">What is AI-ready data?</h2>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>You write code with if statements and functions, but your machine only understands 1s and 0s. When you write code, you leverage tools, like a compiler, to translate that human-readable code into a machine-readable format.</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Similarly, data for AI needs to be translated or "compiled" to be understood by the ML engine. You may have heard of <a href="https://en.wikipedia.org/wiki/Tensor" target="_blank" rel="noreferrer noopener">tensors</a> before; they are simply another word for a multi-dimensional array and they are the language of ML engines. All inputs to and all outputs from the engine are in tensors. You could use the following techniques when converting (or "compiling") source data to a tensor.</p>'
  }
/>

<CoreBlock
  name="core-list"
  content={
    '<ol class="wp-block-list"><li><strong>Normalization/standardization of the numerical input data.</strong>&nbsp;Many of the inputs and outputs in machine learning are interpreted as probability distributions. Much of the math that powers machine learning, such as softmax, tanh, sigmoid, etc., is meant to work in the [-1, 1] range.</li></ol>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p><img src="https://web.archive.org/web/20251115003848im_/https://user-images.githubusercontent.com/879445/144733722-46baa2f7-5e94-4113-9770-735987d6a390.png" alt="Normalizing raw data">&nbsp;Figure 1. Normalizing Bitcoin price data.</p>'
  }
/>

<CoreBlock
  name="core-list"
  content={
    '<ol class="wp-block-list"><li><strong>Conversion of categorical data into numerical data.</strong>&nbsp;For categorical data (i.e., colors such as "red," "blue," or "green"), you can achieve this through a technique called&nbsp;<a href="https://web.archive.org/web/20251115003848/https://www.educative.io/blog/one-hot-encoding" target="_blank" rel="noreferrer noopener">"One Hot Encoding."</a>&nbsp;In one hot encoding, each possible value in the category appears as a column. The values in the column are assigned a binary value of 1 or 0 depending on whether the value exists or not.</li></ol>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p><img src="https://web.archive.org/web/20251115003848im_/https://user-images.githubusercontent.com/879445/144733213-bd162dc0-7ac9-4bbb-9115-1dc46d2084cf.png" alt="Figure 2. A visualization of one-hot encoding">&nbsp;</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={'<p>Figure 2. A visualization of one-hot encoding.</p>'}
/>

<CoreBlock
  name="core-list"
  content={
    '<ol class="wp-block-list"><li>Several advanced techniques exist for "compiling" this source data - this process is known in the AI world as "feature engineering."&nbsp;<a href="https://web.archive.org/web/20251115003848/https://developers.google.com/machine-learning/crash-course/representation/feature-engineering" target="_blank" rel="noreferrer noopener">This article</a>&nbsp;goes into more detail on feature engineering techniques if you are interested in learning more.</li></ol>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>There are excellent tools like&nbsp;<a href="https://web.archive.org/web/20251115003848/https://pandas.pydata.org/" target="_blank" rel="noreferrer noopener">Pandas</a>,&nbsp;<a href="https://web.archive.org/web/20251115003848/https://numpy.org/" target="_blank" rel="noreferrer noopener">Numpy</a>,&nbsp;<a href="https://web.archive.org/web/20251115003848/https://scipy.org/" target="_blank" rel="noreferrer noopener">scipy</a>, and others that make the process of data transformation easier. However, most of these tools are Python libraries and frameworks - which means having to learn Python if you don\'t know it already. Plus, when building intelligent apps (instead of just doing pure data analysis), this all needs to work on real-time data in production.</p>'
  }
/>

<CoreBlock
  name="core-heading"
  content={
    '<h2 class="wp-block-heading h4" id="building-intelligent-apps">Building intelligent apps</h2>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>The tools mentioned above are not designed for building real-time apps. They are often designed for analytics/data science.</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    "<p>In your app, you will need to do this data compilation in real-time - and you can't rely on a local script to help process your data. It becomes trickier if the team responsible for the initial training of the machine learning model is not the team responsible for deploying it out into production.</p>"
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>How data is loaded and processed in a static dataset is likely very different from how the data is loaded and processed in real-time as your app is live. The result often is two separate codebases that are maintained by different teams that are both responsible for doing the same thing! Ensuring that those codebases stay consistent and evolve together is another challenge to tackle.</p>'
  }
/>

<CoreBlock
  name="core-heading"
  content={
    '<h2 class="wp-block-heading h4" id="spiceai-helps-developers-build-apps-with-real-time-ml">Spice.ai helps developers build apps with real-time ML</h2>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={'<p>Spice.ai handles the "compilation" of data for you.</p>'}
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>You specify the data that your ML should learn from in a <a href="https://spiceai.org/docs/getting-started/spicepods" target="_blank" rel="noreferrer noopener">Spicepod</a>. The Spice.ai runtime handles the logistics of gathering the data and compiling it into an AI-ready format.</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    "<p>It does this by using many techniques described earlier, such as normalization and one-hot encoding. And because we're continuing to evolve Spice.ai, our data compilation will only get better over time.</p>"
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>In addition, the design of the Spice.ai runtime naturally ensures that the data used for both the training and real-time cases are consistent. Spice.ai uses the same data-components and runtime logic to produce the data. And not only that, you can take this a step further and share your Spicepod with someone else, and they would be able to use the same AI-ready data for their applications.</p>'
  }
/>

<CoreBlock
  name="core-heading"
  content={'<h2 class="wp-block-heading h4" id="summary">Summary</h2>'}
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Spice.ai handles the process of compiling your data into an AI-ready format in a way that is consistent both during the training and real-time stages of the ML engine. A Spicepod defines which data to get and where to get it. Sharing this Spicepod allows someone else to use the same AI-ready data format in their application.</p>'
  }
/>

<CoreBlock
  name="core-heading"
  content={
    '<h3 class="wp-block-heading h5" id="learn-more-and-contribute">Learn more and contribute</h3>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Building intelligent apps that leverage AI is still way too hard, even for advanced developers. Our mission is to make this as easy as creating a modern web page. If the vision resonates with you, join us!</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Our <a href="https://github.com/spiceai/spiceai/blob/trunk/docs/ROADMAP.md" target="_blank" rel="noreferrer noopener">Spice.ai Roadmap</a> is public, and now that we have launched, the project and work are open for collaboration.</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>If you are interested in partnering, we\'d love to talk. Try out <a href="https://spiceai.org/docs/getting-started" target="_blank" rel="noreferrer noopener">Spice.ai</a>, <a href="mailto:hey@spice.ai" target="_blank" rel="noreferrer noopener">email us</a> "hey," join our community <a href="/slack">Slack</a>, or reach out on <a href="https://x.com/spice_ai" target="_blank" rel="noreferrer noopener">Twitter</a>.</p>'
  }
/>

Making data AI-ready starts with unifying access to it: [SQL query federation and acceleration](/platform/sql-federation-acceleration) connects sources without pipelines, and [retrieval-augmented generation](/use-case/retrieval-augmented-generation) grounds models in that data. To see it applied to your stack, [get a demo](/get-a-demo).

<CoreBlock
  name="core-paragraph"
  content={'<p>We are just getting started! 🚀</p>'}
/>

<CoreBlock name="core-paragraph" content={'<p>Phillip</p>'} />

<ContentResourceFeatured
  fields={{
    heading: 'Explore more Spice resources',
    paragraph:
      'Tutorials, docs, and blog posts to help you go deeper with Spice.',
    mode: 'related',
    resources: false,
    padding_top: 'unset',
    padding_bottom: 'unset',
    related_posts: [
      {
        title: 'A Developer&#8217;s Guide to Understanding Spice.ai',
        slug: '/blog/a-developers-guide-to-understanding-spice-ai',
        excerpt:
          'This guide helps developers build a mental model of why, how, and where to use Spice.',
        image:
          '/website-assets/media/2026/02/A-developers-guide-to-understanding-Spice.ai_.png',
        type: 'Blog',
        taxonomy: [
          'Engineering',
          'Spice AI',
          'Spice Cloud Platform',
          'Spice OSS',
        ],
      },
      {
        title: 'Real-Time Control Plane Acceleration with DynamoDB Streams ',
        slug: '/blog/real-time-acceleration-with-dynamodb-streams',
        excerpt:
          'How to sync DynamoDB data to thousands of nodes with sub-second latency using a two-tier architecture with DynamoDB Streams and Spice acceleration.',
        image: '/website-assets/media/2026/01/image-33.png',
        type: 'Blog',
        taxonomy: [
          'Data Acceleration',
          'Engineering',
          'Spice Cloud Platform',
          'Spice OSS',
        ],
      },
      {
        title: 'How we use Apache DataFusion at Spice AI',
        slug: '/blog/how-we-use-apache-datafusion-at-spice-ai',
        excerpt:
          'Why we chose to build on DataFusion and how we extended it with custom TableProviders, optimizer rules, and UDFs for federated SQL',
        image:
          '/website-assets/media/2026/01/Engineering-at-Spice-AI-Apache-DataFusion.png',
        type: 'Blog',
        taxonomy: [
          'Spice AI',
          'Spice Cloud Platform',
          'Spice OSS',
          'SQL Federation',
        ],
      },
    ],
  }}
/>

<TalkToAnEngineerCta />

<ContentRichText
  fields={{
    coverage: 'rc-end',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

---

## Spice.ai Now Supports Amazon S3 Vectors For Vector Search at Petabyte Scale!
URL: https://spice.ai/blog/amazon-s3-vectors
Date: 2025-07-16T18:59:00
Description: Spice AI has partnered with AWS to integrate Amazon S3 Vectors into the Spice.ai Open Source data and AI compute engine.

<ContentRichText
  fields={{
    coverage: 'rc-start',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Today, we\'re announcing&nbsp;<strong>native support for&nbsp;</strong><a href="https://aws.amazon.com/s3/features/vectors/"><strong>Amazon S3 Vectors</strong></a>&nbsp;in the Spice.ai Open Source data and AI compute engine.</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>As an AWS Startup Partner and&nbsp;<a href="https://aws.amazon.com/marketplace/seller-profile?id=seller-zrdzyyqfdudxc">AWS Marketplace Seller</a>, Spice AI partners with AWS across technology integration, joint go-to-market, and co-selling to deliver solutions for enterprise customers that address real-world data challenges, accelerating the delivery of AI-native applications on AWS.</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>The Spice.ai S3 Vectors integration arrives alongside AWS\'s&nbsp;<a href="https://aws.amazon.com/blogs/aws/introducing-amazon-s3-vectors-first-cloud-storage-with-native-vector-support-at-scale/">announcement of the public preview of Amazon S3 Vectors</a>, a new S3 bucket type designed for vector embeddings, complete with a query endpoint and metadata service. Developers can now configure Spice.ai to use S3 Vectors as a vector database backend, for simple, efficient storage, indexing, and querying of embeddings directly from S3.</p>'
  }
/>

<CoreBlock
  name="core-image"
  content={
    '<figure class="wp-block-image"><img src="https://cdn.prod.website-files.com/6362f59f9fd4ac355fc06eaf/68779b1d6562b0596239bcdf_s3-vectors-arch.png" alt="S3 Vectors Arch"/><figcaption class="wp-element-caption">Figure 1. Spice.ai S3 Vectors integration.</figcaption></figure>'
  }
/>

<CoreBlock
  name="core-heading"
  content={
    '<h2 class="wp-block-heading h4"><strong>What is Vector Similarity Search?</strong></h2>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Vector similarity search retrieves data by comparing similarities in multi-dimensional representations, instead of relying on exact keyword or value matches. This method powers semantic search, recommendation systems, and <a href="/use-case/retrieval-augmented-generation">retrieval-augmented generation (RAG)</a> in AI applications.</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={'<p>The process works as follows:</p>'}
/>

<CoreBlock
  name="core-list"
  content={
    '<ol class="wp-block-list"><li><strong>Convert data to vectors</strong>: Turn items like text, images, or audio into vectors - arrays of numbers that capture the data\'s core meaning or features. Machine learning models handle this conversion, known as embedding. Examples include Amazon Titan Embeddings or Cohere Embeddings via AWS Bedrock, or MiniLM L6 available on HuggingFace.</li><li><strong>Store the vectors</strong>: Store the embeddings in a specialized vector database or index designed for fast similarity queries.</li><li><strong>Query with a vector</strong>: Convert the user\'s query (e.g., a phrase or image) into a vector. The system then identifies the closest matches using distance measures such as cosine similarity, Euclidean distance, or dot product.</li></ol>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>This approach provides precise, context-aware data retrieval from vast unstructured datasets. It supports AI applications that prioritize understanding over simple matching.</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>With the S3 Vectors integration, this process and the lifecycle of vectors is completely managed by the Spice.ai runtime, which also provides an intuitive SQL interface for querying.</p>'
  }
/>

<CoreBlock
  name="core-heading"
  content={
    '<h2 class="wp-block-heading h4"><strong>Amazon S3 Vectors</strong></h2>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Amazon S3 Vectors, launched in public preview on July 15, 2025, provides the first cloud object store with native vector storage and querying, extending AWS object storage for semantic search and retrieval. It features vector indexes within buckets for embedding organization, PUT APIs for uploads, and query APIs for similarity searches using metrics like cosine distance.</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    "<p>Reducing costs for uploading, storing, and querying vectors by up to 90% versus alternatives, it supports AI agents, inference, and semantic search on S3 content with sub-second query performance at petabyte scale. It upholds S3's elasticity, durability, and compute-storage separation - vectors stay in durable storage, queries run on transient resources, bypassing monolithic databases and idle-period costs. Suited for tasks like matching scenes in video archives, clustering business documents, or pattern detection in medical images, it uses a new bucket type with dedicated APIs, no provisioning required, and scales to 10,000 indexes per bucket.</p>"
  }
/>

<CoreBlock
  name="core-heading"
  content={
    '<h2 class="wp-block-heading h4"><strong>Spice.ai\'s Integration with Amazon S3 Vectors</strong></h2>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    "<p>Spice.ai's integration with Amazon S3 Vectors simplifies and accelerates application development for developers.</p>"
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>With native support for S3 Vectors, Spice developers can configure datasets via YAML to use S3 Vectors as the vector storage engine, annotating columns with hosted embedding models including Amazon Titan Embeddings or Cohere Embeddings via AWS Bedrock, or self-hosted models like MiniLM L6 from Hugging Face.</p>'
  }
/>

<CoreBlock
  name="core-image"
  content={
    '<figure class="wp-block-image"><img src="https://cdn.prod.website-files.com/6362f59f9fd4ac355fc06eaf/6876c2a25bb10c86836527cd_AD_4nXcIc4u2_tlkq6r9FjDXN7khDS4F5XgnOiJX7CqIE48s1Grhjx9iG8gmF48xQJWMcKnO5ZAoTeB1XVR1rvJRxBifzHBfB_DpwXk0cnYV8-_0Tb2q_7xEarh1hkDRBEV_BPE3V2ZY.png" alt="YAML configuration for Amazon S3 Vectors in Spice.ai"/><figcaption class="wp-element-caption">Figure 2. Simple YAML configuration of S3 Vectors in Spice.ai.</figcaption></figure>'
  }
/>

<CoreBlock name="core-paragraph" content={'<p>‍</p>'} />

<CoreBlock
  name="core-paragraph"
  content={
    "<p>The Spice.ai runtime manages the full vector lifecycle: it ingests source data from disparate enterprise sources like files, databases, and data lakes, embeds it using specified models, and pushes it into S3 Vector buckets. Applications query via SQL (e.g.,&nbsp;<code>SELECT * FROM vector_search(table, 'search query') WHERE condition ORDER BY score</code>) with push-down optimization for efficiency, or HTTP APIs, while the runtime handles indexing and provides an intuitive SQL interface.</p>"
  }
/>

<CoreBlock
  name="core-image"
  content={
    '<figure class="wp-block-image"><img src="https://cdn.prod.website-files.com/6362f59f9fd4ac355fc06eaf/687786dfeb0ca8741d3f79a0_Screenshot%202025-07-16%20at%2007.02.35.png" alt="Spice Cloud SQL example using vector_search for semantic search"/><figcaption class="wp-element-caption">Figure 3. Using the vector_search SQL&nbsp;function in Spice Cloud for semantic search.</figcaption></figure>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    "<p>The Spice S3 Vectors integration simplifies and accelerates AI application development by leveraging S3's vector capabilities with minimal application code, without operational overhead, and it can be used together with existing Spice.ai <a href='/platform/hybrid-sql-search'>Keyword and Full-Text (BM25) search</a> capabilities.</p>"
  }
/>

<CoreBlock
  name="core-heading"
  content={
    '<h2 class="wp-block-heading h4">Demo of Amazon S3 Vectors in Spice.ai Open Source</h2>'
  }
/>

<PostVideo
  fields={{
    thumbnail: false,
    type: 'youtube',
    video_id: 'v8z35jI8JKY',
    video_title: 'Amazon S3 Vectors with Spice.ai Open Source',
    video_upload_date: '2025-07-16T05:52:56-07:00',
    video_channel: 'Spice AI',
    video_description:
      'Walkthrough of vector search with Amazon S3 Vectors and Spice.ai Open Source.',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<CoreBlock
  name="core-heading"
  content={'<h2 class="wp-block-heading h4">Availability</h2>'}
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>S3 Vectors support is available today in the&nbsp;<strong>v1.5.0 release</strong>&nbsp;of Spice.ai Open Source and Spice Cloud<strong>!</strong></p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>To learn more about S3 Vectors in Spice, visit&nbsp;<a href="https://spiceai.org/docs/components/vectors/s3_vectors">spiceai.org/docs/components/vectors/s3_vectors</a>.</p>'
  }
/>

<CoreBlock
  name="core-heading"
  content={
    '<h2 class="wp-block-heading h4"><strong>About Spice AI</strong></h2>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Spice AI helps enterprises build fast, accurate, and scalable AI applications and agents with its portable, open-source data and AI compute engine. It connects data from disparate sources, simplifies application development, and supports workloads across cloud, edge, and on-premises systems. Based in Seattle, Spice AI focuses on making AI application development simple and easy. Learn more about <a href="/partners/aws">the Spice AI and AWS partnership</a>.</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Get started with Spice.ai Open Source in just 30 seconds at:&nbsp;<a href="https://spiceai.org/docs/getting-started">https://spiceai.org/docs/getting-started</a></p>'
  }
/>

## Frequently Asked Questions

### What is Amazon S3 Vectors?

Amazon S3 Vectors is a new S3 bucket type that provides native vector storage and querying at petabyte scale. It reduces costs for storing and querying vectors by up to 90 percent versus alternatives, and supports similarity searches using metrics like cosine distance without provisioning infrastructure.

### How does Spice.ai integrate with S3 Vectors?

Spice manages the full vector lifecycle: ingesting source data from databases, files, and data lakes, embedding it using specified models (such as Amazon Titan or Cohere via Bedrock), and pushing it into S3 Vector buckets. Applications query with standard SQL using the `vector_search` function, and the runtime handles indexing automatically.

### Can I combine vector search with keyword search in Spice?

Yes. Spice supports [hybrid search](/platform/hybrid-sql-search) that combines vector similarity search with keyword and full-text BM25 search. This lets you blend semantic meaning with exact-match precision for more relevant [RAG](/use-case/retrieval-augmented-generation) results.

To run vector search against your own S3 data at scale, review [Spice Cloud pricing](/pricing) or [get a demo](/get-a-demo).

<ContentResourceFeatured
  fields={{
    heading: 'Explore more Spice resources',
    paragraph:
      'Tutorials, docs, and blog posts to help you go deeper with Spice.',
    mode: 'related',
    resources: false,
    padding_top: 'unset',
    padding_bottom: 'unset',
    related_posts: [],
  }}
/>

<TalkToAnEngineerCta />

<ContentRichText
  fields={{
    coverage: 'rc-end',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

---

## Announcing Spice.ai Open Source 1.0-stable: A Portable Compute Engine for Data-Grounded AI - Now Ready for Production
URL: https://spice.ai/blog/announcing-spice-ai-open-source-1-0-stable
Date: 2025-01-22T19:24:40
Description: Learn how Spice.ai OSS grounds AI in real data with federated query, fast retrieval, and portable deployment anywhere.

<ContentRichText
  fields={{
    coverage: 'rc-start',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Today marks the&nbsp;1.0-stable release&nbsp;of Spice.ai Open Source-purpose-built to help enterprises ground AI in data. By unifying federated data query, retrieval, and AI inference into a single engine, Spice mitigates AI hallucinations, accelerates data access for mission-critical workloads, and makes it simple and easy for developers to build fast and accurate data-intensive applications across cloud, edge, or on-prem.</p>'
  }
/>

<CoreBlock
  name="core-image"
  content={
    '<figure class="wp-block-image size-large"><img src="/website-assets/media/2025/01/Spice-1.0-Stable-1024x617.png" alt="Spice 1.0 Stable" class="wp-image-1789"/><figcaption class="wp-element-caption">Figure 1: Spice.ai OSS Stable</figcaption></figure>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Enterprise AI systems are only as good as the context they\'re provided. When data is inaccessible, incomplete, or outdated, even the most advanced models can generate outputs that are inaccurate, misleading, or worse, potentially harmful. In one example,&nbsp;<a href="https://hothardware.com/news/car-dealerships-chatgpt-goes-awry-when-internet-gets-to-it" target="_blank" rel="noreferrer noopener" class="">a chatbot was tricked into selling a 2024 Chevy Tahoe for $1</a>&nbsp;due to a lack of contextual safeguards. For enterprises, errors like these are unacceptable-it\'s the difference between success and failure.</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Retrieval-Augmented Generation (RAG) is part of the answer - but traditional RAG is only as good as the data it has access to. If data is locked away in disparate, often legacy data systems, or cannot be stitched together for accurate retrieval, you get, as Benioff puts it, "Clippy 2.0".</p>'
  }
/>

<CoreBlock
  name="core-image"
  content={
    '<figure class="wp-block-image size-large"><img src="/website-assets/media/2025/01/Benioff-Quote-1024x306.png" alt="Marc Benioff on the limitations of Copilot" class="wp-image-1791"/><figcaption class="wp-element-caption">Figure 2: Marc Benioff on the limitations of Copilot</figcaption></figure>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    "<p>And often, after initial Python-scripted pilots, you're left with a new set of problems: How do you deploy AI that meets enterprise requirements for performance, security, and compliance while being cost efficient? Directly querying large datasets for retrieval is slow and expensive. Building and maintaining complex ETL pipelines requires expensive data teams that most organizations don't have. And because enterprise data is highly sensitive, you need secure access and auditable observability-something many RAG setups don't even consider.</p>"
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Developers need a platform at the intersection of data and AI-one specifically designed to ground AI in data. A solution that unifies data query, search, retrieval, and model inference-ensuring performance, security, and accuracy so you can build AI that you and your customers can trust.</p>'
  }
/>

<CoreBlock
  name="core-heading"
  content={
    '<h2 class="wp-block-heading h3" id="spiceai-oss-a-portable-data-ai-and-retrieval-engine">Spice.ai OSS: A portable data, AI, and retrieval engine</h2>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>In March of 2024,&nbsp;<a href="/blog/adding-spice-the-next-generation-of-spice-ai-oss" target="_blank" rel="noreferrer noopener" class="">we introduced Spice.ai Open Source</a>, a SQL query engine to materialize and accelerate data from any database, data warehouse, or data lake so that data can be accessed wherever it lives across the enterprise - consistently fast. But that was only the start.</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Building on this foundation, Spice.ai OSS unifies data, retrieval, and AI, to provide current, relevant context to mitigate AI "hallucinations" and significantly reduce incorrect outputs-just one of the many mission-critical use cases Spice.ai addresses.</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Spice is a portable, single-node, compute engine built in Rust. It&nbsp;<a href="https://datafusion.apache.org/blog/2024/11/18/datafusion-fastest-single-node-parquet-clickbench/" target="_blank" rel="noreferrer noopener" class="">embeds the fastest single-node SQL query engine</a>, DataFusion, to serve secure, virtualized data views to data-intensive apps, AI, and agents. Sub-second data query is accelerated locally using Apache Arrow, DuckDB, or SQLite.</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    "<p>Now at version 1.0-stable, Spice is ready for production. It's already deployed in enterprise use at Twilio, Barracuda Networks, and NRC Health, and can be deployed anywhere-cloud-hosted, BYOC, edge, on-prem.</p>"
  }
/>

<CoreBlock
  name="core-image"
  content={
    '<figure class="wp-block-image size-large"><img src="/website-assets/media/2025/01/Spice-AI-compute-engine-original-1024x764.png" alt="The Spice.ai OSS architecture" class="wp-image-1792"/><figcaption class="wp-element-caption">Figure 3: The Spice.ai OSS architecture </figcaption></figure>'
  }
/>

<CoreBlock
  name="core-heading"
  content={'<h3 class="wp-block-heading h4">‍Data-grounded AI</h3>'}
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Data-grounded AI anchors models in accurate, current, and domain-specific data, rather than relying solely on pre-trained knowledge. By unifying enterprise data-across databases, data lakes, and APIs-and applying advanced ingestion and retrieval techniques, these systems dynamically incorporate real-world context at inference time without leaking sensitive information. This approach helps developers minimize hallucinations, reduce operational risk, and build trust in AI by delivering reliable, relevant outputs.</p>'
  }
/>

<CoreBlock
  name="core-image"
  content={
    '<figure class="wp-block-image size-large"><img src="/website-assets/media/2025/01/Data-grounded-AI-1024x628.png" alt="AI responses with and without contextual data" class="wp-image-1793"/><figcaption class="wp-element-caption">Figure 4: AI responses with and without contextual data</figcaption></figure>'
  }
/>

<CoreBlock
  name="core-heading"
  content={
    '<h3 class="wp-block-heading h4"><strong>How does Spice.ai OSS solve data-grounding?</strong></h3>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>With Spice, models always have access to materializations of low-latency, real-time data for near-instant retrieval, minimizing data movement while enabling AI feedback so apps and agents can learn and adapt over time. For example, you can join customer records from PostgreSQL with sales data in Snowflake and logs stored in S3-all with a single SQL query or LLM function call.</p>'
  }
/>

<CoreBlock
  name="core-image"
  content={
    '<figure class="wp-block-image size-large"><img src="/website-assets/media/2025/01/Secure-compute-engine-Spice-1.0-1024x616.png" alt="Secure Compute Engine Spice 1.0" class="wp-image-1794"/><figcaption class="wp-element-caption">Figure 5: A secure compute engine for AI inference </figcaption></figure>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Spice includes an advanced suite of LLM tools including vector and hybrid search, text-to-SQL, SQL query and retrieval, data sampling, and context formatting-all purpose-built for accurate outputs.</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>The latest research is continually incorporated so that teams can focus on business objectives rather than trying to keep up with the incredibly fast-moving and often overwhelming space of AI.</p>'
  }
/>

<CoreBlock
  name="core-heading"
  content={
    '<h2 class="wp-block-heading" id="spiceai-oss-the-engine-that-makes-ai-work">Spice.ai OSS: The engine that makes AI work</h2>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Spice.ai OSS is a lightweight, portable runtime (single ~140 MB binary) with the capabilities of a high-speed cloud data warehouse built into a self-hostable AI inference engine, all in a single, run-anywhere package.</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    "<p>It's designed to be distributed and integrated at the application level, rather than being a bulky, centralized system to manage, and is often deployed as a sidecar. Whether running one Spice instance per service or one for each customer, Spice is flexible enough to fit your application architecture.</p>"
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Apps and agents integrate with Spice.ai OSS via three industry-standard APIs, so that it can be adopted incrementally with minimal changes to applications.</p>'
  }
/>

<CoreBlock
  name="core-list"
  content={
    '<ol class="wp-block-list"><li><strong>SQL Query APIs</strong>: HTTP, Arrow Flight, Arrow Flight SQL, ODBC, JDBC, and ADBC.</li><li><strong>OpenAI-Compatible APIs</strong>: HTTP APIs compatible with the OpenAI SDK, AI SDK with local model serving (CUDA/Metal accelerated), and gateway to hosted models.</li><li><strong>Iceberg Catalog REST APIs</strong>: A unified Iceberg Catalog REST API.</li></ol>'
  }
/>

<CoreBlock
  name="core-image"
  content={
    '<figure class="wp-block-image size-large"><img src="/website-assets/media/2025/01/Spice-AI-1.0-Architecture-1024x724.png" alt="The building blocks of the Spice.ai stack" class="wp-image-1795"/><figcaption class="wp-element-caption">Figure 6: The building blocks of the Spice.ai stack   </figcaption></figure>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={'<p>Key features of Spice.ai OSS include:</p>'}
/>

<CoreBlock
  name="core-list"
  content={
    '<ul class="wp-block-list"><li><strong><a href="/platform/sql-federation-acceleration">Federated SQL Query Across Data Sources</a></strong>: Perform SQL queries across disparate data sources with over 25 open-source data connectors, including catalogs (Unity Catalog, Iceberg Catalog, etc), databases (PostgreSQL, MySQL, etc.), data warehouses (Snowflake, Databricks, etc.), and data lakes (e.g., S3, ABFS, MinIO, etc.).</li></ul>'
  }
/>

<CoreBlock
  name="core-list"
  content={
    '<ul class="wp-block-list"><li><strong>Data Materialization and Acceleration</strong>: Locally materialize and accelerate data using Arrow, DuckDB, SQLite, and PostgreSQL, enabling low-latency and high-speed transactional and analytical queries. Data can be ingested via <a href="/feature/real-time-change-data-capture">Change-Data-Capture (CDC)</a> using Debezium, Catalog integrations, on an interval, or by trigger.</li></ul>'
  }
/>

<CoreBlock
  name="core-list"
  content={
    '<ul class="wp-block-list"><li><strong>AI Inference, Gateway, and LLM toolset</strong>: Load and serve models like Llama3 locally, or use Spice as a gateway to hosted AI platforms including OpenAI, Anthropic, xAI, and NVidia NIM. Automatically use a purpose-built LLM toolset for data-grounded AI.</li></ul>'
  }
/>

<CoreBlock
  name="core-list"
  content={
    '<ul class="wp-block-list"><li><strong><a href="/platform/hybrid-sql-search">Enterprise Search and Retrieval</a></strong>: Advanced search capabilities for LLM applications, including vector-based similarity search and hybrid search across structured and unstructured data. Real-time retrieval grounds AI applications in dynamic, contextually relevant information, enabling state-of-the-art <a href="/use-case/retrieval-augmented-generation">RAG</a>.</li></ul>'
  }
/>

<CoreBlock
  name="core-list"
  content={
    '<ul class="wp-block-list"><li><strong>LLM Memory</strong>: Enable long-term memory for LLMs by efficiently storing, retrieving, and updating context across interactions. Support real-time contextual continuity and grounding for applications that require persistent and evolving understanding.</li></ul>'
  }
/>

<CoreBlock
  name="core-list"
  content={
    '<ul class="wp-block-list"><li><strong>LLM Evaluations</strong>: Test and boost model reliability and accuracy with integrated LLM-powered evaluation tools to assess and refine AI outputs against business objectives and user expectations.</li></ul>'
  }
/>

<CoreBlock
  name="core-list"
  content={
    '<ul class="wp-block-list"><li><strong>Monitoring and Observability</strong>: Ensure operational excellence with telemetry, distributed tracing, query/task history, and metrics, that provide end-to-end visibility into data flows and model performance in production.</li></ul>'
  }
/>

<CoreBlock
  name="core-list"
  content={
    '<ul class="wp-block-list"><li><strong>Deploy Anywhere; Edge-to-Cloud Flexibility</strong>: Deploy Spice as a standalone instance, Kubernetes sidecar, microservice, or scalable cluster, with the flexibility to run distributed across edge, on-premises, or any cloud environment. Spice AI offers managed, cloud-hosted deployments of Spice.ai OSS through the Spice Cloud Platform (SCP).</li></ul>'
  }
/>

<CoreBlock
  name="core-heading"
  content={
    '<h3 class="wp-block-heading" id="real-world-use-cases">Real-world use-cases</h3>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Spice delivers data readiness for teams like Twilio and Barracuda, and accelerates time-to-market of data-grounded AI, such as with developers on GitHub and at NRC Health.</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Here are some examples of how Spice.ai OSS solves real problems for these teams.</p>'
  }
/>

<CoreBlock
  name="core-heading"
  content={'<h4 class="wp-block-heading">CDN for Databases - Twilio</h4>'}
/>

<CoreBlock
  name="core-image"
  content={
    '<figure class="wp-block-image size-large"><img src="/website-assets/media/2025/01/Twilio-Use-Case-1024x598.png" alt="Twilio use case diagram" class="wp-image-1797"/><figcaption class="wp-element-caption">Figure 7: Twilio use case diagram</figcaption></figure>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>A core requirement for many applications is consistently fast data access, with or without AI. Twilio uses Spice.ai OSS as a data acceleration framework or&nbsp;<a class="" href="https://materializedview.io/p/building-a-cdn-for-databases-spice-ai" target="_blank" rel="noreferrer noopener">Database CDN</a>, staging data in object-storage that\'s accelerated with Spice for sub-second query to improve the reliability of critical services in its messaging pipelines. Before Spice, a database outage could result in a service outage.</p>'
  }
/>

<PostQuote
  fields={{
    message:
      'Spice opened the door to take these critical control-plane datasets and move them next to our services in the runtime path.',
    name: 'Peter Jaovsky ',
    subtext: 'Software Architect at Twilio',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<CoreBlock
  name="core-paragraph"
  content={'<p>With Spice, Twilio has achieved:</p>'}
/>

<CoreBlock
  name="core-list"
  content={
    '<ul class="wp-block-list"><li><strong>Significantly Improved Query Performance</strong>: Used Spice to co-locate control-plane data in the messaging runtime, accelerated with DuckDB, to send messages with a P99 query time of &lt; 5ms.</li><li><strong>Low-Latency Multi-Tenancy Controls</strong>: Spice is integrated into the message-sending runtime to manage multi-tenancy data controls. Before, data changes required manual triggers and took hours to propagate. Now, they update automatically and reach the messaging front door within five minutes via a resilient data-availability framework.</li><li><strong>Mission-Critical Reliability</strong>: Reduced reliance on queries to databases by using Spice to accelerate data in-memory locally, with automatic failover to query data directly from S3, ensuring uninterrupted service even during database downtime.</li></ul>'
  }
/>

<PostQuote
  fields={{
    message:
      'With a simple drop in container, we are able to double our data redundancy by using Spice.',
    name: 'David Blum',
    subtext: 'Principal Software Engineer at Twilio',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<CoreBlock
  name="core-heading"
  content={'<h4 class="wp-block-heading">Datalake Accelerator - Barracuda</h4>'}
/>

<CoreBlock
  name="core-image"
  content={
    '<figure class="wp-block-image size-large"><img src="/website-assets/media/2025/01/Barracuda-Use-Case-Diagram-1024x643.png" alt="Diagram illustrating Barracuda\'s use of Spice" class="wp-image-1800"/><figcaption class="wp-element-caption">Figure 8: Barracuda use case diagram</figcaption></figure>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Barracuda uses Spice.ai OSS to modernize data access for their email archiving and audit log systems, solving two big problems: slow query performance and costly queries. Before Spice, customers experienced frustrating delays of up to two minutes when searching email archives, due to the data volume being queried.</p>'
  }
/>

<PostQuote
  fields={{
    message: "It's just a huge gain in responsiveness for the customer.",
    name: 'David Stancu',
    subtext: 'Senior Principal Software Engineer at Barracuda ',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<CoreBlock
  name="core-paragraph"
  content={'<p>With Spice, Barracuda has achieved:</p>'}
/>

<CoreBlock
  name="core-list"
  content={
    '<ul class="wp-block-list"><li><strong>Significant Cost Reduction</strong>: Replaced expensive Databricks Spark queries, significantly cutting expenses while improving performance.</li><li><strong>100x Query Performance Improvement</strong>: Accelerated email archive queries from a P99 time of 2 minutes to 100-200 milliseconds.</li><li><strong>Efficient Audit Logs</strong>: Offloaded audit logs to Parquet files in S3, queried directly by Spice.</li><li><strong>Mission-Critical Reliability</strong>: Reduced load on Cassandra, improving overall infrastructure stability.</li></ul>'
  }
/>

<PostQuote
  fields={{
    message: 'It just spins up and it just works, which is really nice.',
    name: 'Darin Douglass',
    subtext: 'Principal Software Engineer at Barracuda ',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<CoreBlock
  name="core-heading"
  content={
    '<h4 class="wp-block-heading">Data-Grounded AI apps and agents - NRC Health</h4>'
  }
/>

<CoreBlock
  name="core-image"
  content={
    '<figure class="wp-block-image size-large"><img src="/website-assets/media/2025/01/Data-Grounded-AI-apps-and-agents-NRC-Health-1024x642.png" alt="Data Grounded AI Apps and Agents NRC Health" class="wp-image-1969"/><figcaption class="wp-element-caption">Figure 9: NRC Health use case diagram</figcaption></figure>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>NRC Health uses Spice.ai OSS to simplify and accelerate the development of data-grounded AI features, unifying data from multiple platforms including MySQL, SharePoint, and Salesforce, into secure, AI-ready data. Before Spice, scaling AI expertise across the organization to build complex RAG-based scenarios was a challenge.</p>'
  }
/>

<PostQuote
  fields={{
    message:
      "What I like the most about Spice, it's very easy to collect data from different data sources and I am able to chat with this data and do everything in one place.",
    name: 'Dustin Warner',
    subtext: 'Director of Software Engineering at NRC Health',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<CoreBlock
  name="core-paragraph"
  content={'<p>With Spice OSS, NRC Health has achieved:</p>'}
/>

<CoreBlock
  name="core-list"
  content={
    '<ul class="wp-block-list"><li><strong>Developer Productivity</strong>: Partnered with Spice in three company-wide AI hackathons to build complete end-to-end data-grounded AI features in hours instead of weeks or months.</li><li><strong>Accelerated Time-to-Market</strong>: Centralized data integration and AI model serving an enterprise-ready service, accelerating time to market.</li></ul>'
  }
/>

<CoreBlock
  name="core-quote"
  content={'<blockquote class="wp-block-quote"></blockquote>'}
/>

<CoreBlock
  name="core-heading"
  content={
    '<h4 class="wp-block-heading">Data-Grounded AI Software Development - Spice.ai GitHub Copilot Extension</h4>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>When using tools like GitHub Copilot, developers often face the hassle of switching between multiple environments to get the data they need.</p>'
  }
/>

<PostVideo
  fields={{
    thumbnail: false,
    type: 'youtube',
    video_id: 'A0QdHVUKfAk',
    video_title: 'Spice.ai for GitHub Copilot',
    video_upload_date: '2024-11-04T08:50:17-08:00',
    video_channel: 'Spice AI',
    video_description: 'Overview of the Spice.ai extension for GitHub Copilot.',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>The&nbsp;<a class="" href="https://github.com/marketplace/spice-ai-for-github-copilot" target="_blank" rel="noreferrer noopener">Spice.ai for GitHub Copilot Extension</a>&nbsp;built on Spice.ai OSS, gives developers the ability to connect data from external sources to Copilot, grounding Copilot in relevant data not generally available in GitHub, like test data stored in a development database.</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Developers can simply type&nbsp;<strong><code>@spiceai</code></strong>&nbsp;to interact with connected data, with relevant answers now surfaced directly in Copilot Chat, significantly improving productivity.</p>'
  }
/>

<CoreBlock
  name="core-heading"
  content={
    '<h3 class="wp-block-heading" id="why-choose-spiceai-oss">Why choose Spice.ai OSS?</h3>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Adopting Spice.ai OSS addresses real challenges in modern AI development: it grounds models in accurate, domain-specific, real-time data. With Spice, engineering teams can focus on what matters-delivering innovative, accurate, AI-powered applications and agents that work. Additionally, Spice.ai OSS is open-source under Apache 2.0, ensuring transparency and extensibility so your organization remains free to innovate without vendor lock-in.</p>'
  }
/>

<CoreBlock
  name="core-heading"
  content={
    '<h3 class="wp-block-heading" id="get-started-in-30-seconds">Get started in 30 seconds</h3>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>You can install Spice.ai OSS in less than a minute, on macOS, Linux, and Windows.</p>'
  }
/>

<CoreBlock
  name="core-heading"
  content={'<h4 class="wp-block-heading h5">macOS, Linux, and WSL:</h4>'}
/>

```yaml
curl https://install.spiceai.org | /bin/bash
```

<CoreBlock
  name="core-paragraph"
  content={'<p>Or using <code>brew</code>: </p>'}
/>

```bash
brew install spiceai/spiceai/spice
```

<CoreBlock
  name="core-heading"
  content={'<h4 class="wp-block-heading h5">Windows:</h4>'}
/>

```shell
curl -L "https://install.spiceai.org/Install.ps1" -o Install.ps1 && PowerShell -ExecutionPolicy Bypass -File ./Install.ps1
```

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Once installed, follow the&nbsp;<a class="" href="https://spiceai.org/docs/getting-started">Getting Started with Spice.ai guide</a>&nbsp;to ground OpenAI chat with data from S3 in less than 2 minutes.</p>'
  }
/>

<CoreBlock
  name="core-heading"
  content={'<h2 class="wp-block-heading" id="looking-ahead">Looking ahead</h2>'}
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>The 1.0-stable release of Spice.ai OSS marks a major step toward accurate AI for developers. By combining data, AI, and retrieval into a unified runtime, Spice anchors AI in relevant, real-time data-helping you build apps and agents that work.</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    "<p>A cloud-hosted, fully managed Spice.ai OSS service is available in the Spice Cloud Platform. It's SOC 2 Type II compliant and makes it easy to operate Spice deployments.</p>"
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Beyond apps and agents, the vision for Spice is to be the best digital labor platform for building autonomous AI employees and teams. These are exciting times! Stay tuned for some upcoming announcements later in 2025!</p>'
  }
/>

<CoreBlock name="core-paragraph" content={'<p>The Spice AI Team</p>'} />

<CoreBlock
  name="core-heading"
  content={'<h2 class="wp-block-heading" id="learn-more">Learn more</h2>'}
/>

<CoreBlock
  name="core-list"
  content={
    '<ul class="wp-block-list"><li><strong><a class="" href="/cookbook">Cookbook</a></strong>: 47+ samples and examples using Spice.ai OSS</li><li><strong><a class="" href="https://spiceai.org/docs">Documentation</a></strong>: Learn about features, use cases, and advanced configurations</li><li><strong><a class="" href="https://x.com/spice_ai" target="_blank" rel="noreferrer noopener">X</a></strong>: Follow @spice_ai on X for news and updates</li><li><strong><a class="" href="/slack" target="_blank" rel="noreferrer noopener">Slack</a></strong>: Connect with the team and the community</li><li><strong><a class="" href="https://github.com/spiceai/spiceai" target="_blank" rel="noreferrer noopener">GitHub</a></strong>: Star the repo, contribute, and raise issues</li></ul>'
  }
/>

## Frequently Asked Questions

### What is Spice.ai OSS 1.0-stable?

Spice.ai OSS 1.0-stable is the production-ready release of Spice, an open-source, portable compute engine built in Rust. It unifies [SQL federation](/platform/sql-federation-acceleration), [hybrid search](/platform/hybrid-sql-search), and [AI inference](/platform/llm-inference) into a single lightweight runtime (~140 MB binary) that can be deployed anywhere from edge to cloud.

### How does Spice ground AI in data?

Spice mitigates AI hallucinations by providing models with access to materializations of low-latency, real-time data from across the enterprise. Rather than relying solely on pre-trained knowledge, Spice enables [retrieval-augmented generation](/use-case/retrieval-augmented-generation) by federating queries across databases, data warehouses, and data lakes so models receive accurate, current context at inference time.

### Does Spice 1.0 replace a data warehouse like Snowflake or Databricks?

No. Spice complements a warehouse rather than replacing it: it queries data in place, including data already in Snowflake or Databricks, and serves results with sub-second performance. It is designed for application serving rather than batch analytics, often deployed as a sidecar alongside production services. See [pricing](/pricing) for deployment options.

### What real-world results have enterprises achieved with Spice?

Twilio achieved P99 query times under 5 ms using Spice as a Database CDN. Barracuda improved email archive queries by 100x (from 15 seconds to 100-200 ms) while cutting costs by 50 percent with the [data lake accelerator](/use-case/datalake-accelerator) pattern. NRC Health accelerated development of data-grounded AI features by centralizing data from MySQL, SharePoint, and Salesforce into a single query layer.

<ContentResourceFeatured
  fields={{
    heading: 'Explore more Spice resources',
    paragraph:
      'Tutorials, docs, and blog posts to help you go deeper with Spice.',
    mode: 'related',
    resources: false,
    padding_top: 'unset',
    padding_bottom: 'unset',
    related_posts: [
      {
        title: 'A Developer&#8217;s Guide to Understanding Spice.ai',
        slug: '/blog/a-developers-guide-to-understanding-spice-ai',
        excerpt:
          'This guide helps developers build a mental model of why, how, and where to use Spice.',
        image:
          '/website-assets/media/2026/02/A-developers-guide-to-understanding-Spice.ai_.png',
        type: 'Blog',
        taxonomy: [
          'Engineering',
          'Spice AI',
          'Spice Cloud Platform',
          'Spice OSS',
        ],
      },
      {
        title: 'Real-Time Control Plane Acceleration with DynamoDB Streams ',
        slug: '/blog/real-time-acceleration-with-dynamodb-streams',
        excerpt:
          'How to sync DynamoDB data to thousands of nodes with sub-second latency using a two-tier architecture with DynamoDB Streams and Spice acceleration.',
        image: '/website-assets/media/2026/01/image-33.png',
        type: 'Blog',
        taxonomy: [
          'Data Acceleration',
          'Engineering',
          'Spice Cloud Platform',
          'Spice OSS',
        ],
      },
      {
        title: 'How we use Apache DataFusion at Spice AI',
        slug: '/blog/how-we-use-apache-datafusion-at-spice-ai',
        excerpt:
          'Why we chose to build on DataFusion and how we extended it with custom TableProviders, optimizer rules, and UDFs for federated SQL',
        image:
          '/website-assets/media/2026/01/Engineering-at-Spice-AI-Apache-DataFusion.png',
        type: 'Blog',
        taxonomy: [
          'Spice AI',
          'Spice Cloud Platform',
          'Spice OSS',
          'SQL Federation',
        ],
      },
    ],
  }}
/>

<TalkToAnEngineerCta />

<ContentRichText
  fields={{
    coverage: 'rc-end',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

---

## Spice Cloud v1.7.0: DataFusion v49, Full-Text Search Updates & More
URL: https://spice.ai/blog/announcing-spice-cloud-v1-7-0
Date: 2025-09-24T17:41:00
Description: Spice Cloud v1.7.0 includes DataFusion v49, EmbeddingGemma support, and real-time indexing for full-text search

<ContentRichText
  fields={{
    coverage: 'rc-start',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Spice Cloud &amp;&nbsp;Spice.ai Enterprise 1.7.0 are now live, bringing performance upgrades with DataFusion v49, real-time full-text search indexing, EmbeddingGemma support, and improvements across search, embeddings, and API integrations. Spice Cloud customers will automatically upgrade to v1.7.0 on&nbsp;<a href="/login?from=landing">deployment</a>, while Spice.ai Enterprise customers can consume the Enterprise v1.7.0 image from the&nbsp;<a href="https://aws.amazon.com/marketplace/pp/prodview-jmf6jskjvnq7i">Spice AWS&nbsp;Marketplace listing</a>.</p>'
  }
/>

<CoreBlock
  name="core-heading"
  content={
    '<h2 class="wp-block-heading h4">What\'s New in Spice Cloud v1.7.0</h2>'
  }
/>

<CoreBlock
  name="core-heading"
  content={'<h3 class="wp-block-heading h5">DataFusion v49 Upgrade</h3>'}
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Spice now runs on&nbsp;<strong>DataFusion v49</strong>, delivering lower latency and improved <a href="/platform/sql-federation-acceleration">query optimization</a>.</p>'
  }
/>

<CoreBlock
  name="core-image"
  content={
    '<figure class="wp-block-image"><img src="https://cdn.prod.website-files.com/6362f59f9fd4ac355fc06eaf/68d4707528fca9e16636f3ef_DataFusion%20v49%20blog.png" alt="DataFusion Blog"/><figcaption class="wp-element-caption">Source: DataFusion v49&nbsp;<a href="https://datafusion.apache.org/blog/2025/07/28/datafusion-49.0.0/">Release Blog</a></figcaption></figure>'
  }
/>

<CoreBlock name="core-paragraph" content={'<p>‍</p>'} />

<CoreBlock
  name="core-paragraph"
  content={'<p>DataFusion v49 highlights include:</p>'}
/>

<CoreBlock
  name="core-list"
  content={
    '<ul class="wp-block-list"><li>Dynamic filters and pushdown to skip unnecessary reads in&nbsp;<code>ORDER BY &amp; LIMIT</code>&nbsp;queries</li><li>Compressed spill files to reduce disk usage during large sorts and aggregations</li><li>Support for ordered-set aggregates with&nbsp;<code>WITHIN GROUP</code></li><li>New&nbsp;<code>REGEXP_INSTR</code>&nbsp;function to identify regex match positions</li></ul>'
  }
/>

<CoreBlock
  name="core-heading"
  content={'<h3 class="wp-block-heading h5">EmbeddingGemma Support</h3>'}
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Spice now supports<a href="https://deepmind.google/models/gemma/embeddinggemma/">&nbsp;<strong>EmbeddingGemma</strong>,</a>&nbsp;Google\'s latest embedding model for text and documents. It delivers high-quality embeddings for semantic search, retrieval, and recommendation tasks. Configure it directly in your Spicepod via HuggingFace.</p>'
  }
/>

<CoreBlock
  name="core-heading"
  content={'<h3 class="wp-block-heading h5">Embedding Request Caching</h3>'}
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Repeated embedding requests can now be cached in the Spice runtime. This reduces both&nbsp;<strong>latency</strong>&nbsp;and&nbsp;<strong>costs</strong>, with configurable cache size and TTL options. Check out the&nbsp;<a href="https://spiceai.org/docs/features/caching">caching documentation</a>&nbsp;for more details.</p>'
  }
/>

<CoreBlock
  name="core-heading"
  content={
    '<h3 class="wp-block-heading h5"><a href="/platform/hybrid-sql-search">Real-Time Indexing for Full Text Search</a></h3>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Full-text indexing now supports real-time changes from <a href="/feature/real-time-change-data-capture">CDC streams</a> such as Debezium. New events are searchable as they arrive, ensuring continuously fresh results.</p>'
  }
/>

<CoreBlock
  name="core-heading"
  content={
    '<h3 class="wp-block-heading h5">OpenAI Responses API Tool Calls with Streaming</h3>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>The&nbsp;<a href="https://spiceai.org/docs/components/models/openai">OpenAI Responses API</a>&nbsp;in Spice now supports&nbsp;<strong>tool calls with streaming</strong>. Results from tools like&nbsp;<code>web_search</code>&nbsp;and&nbsp;<code>code_interpreter</code>&nbsp;are streamed as they\'re generated, enabling more responsive agent and application experiences.</p>'
  }
/>

<CoreBlock
  name="core-heading"
  content={'<h3 class="wp-block-heading h5">Bug &amp; Stability Fixes</h3>'}
/>

<CoreBlock
  name="core-paragraph"
  content={'<p>v1.7.0 includes numerous fixes and improvements:</p>'}
/>

<CoreBlock
  name="core-list"
  content={
    '<ul class="wp-block-list"><li>CDC streams readiness and full-text indexing reliability</li><li>Vector search pipeline and&nbsp;<code>vector_search</code>&nbsp;UDTF fixes</li><li>Kafka schema inference, consumer group persistence, and cooperative mode</li><li>Error reporting improvements (e.g., ThrottlingException handling)</li><li>Iceberg connector support for&nbsp;<code>LIMIT</code>&nbsp;pushdown</li><li>S3 Vector ingestion reliability and tracing fixes</li></ul>'
  }
/>

<CoreBlock
  name="core-heading"
  content={'<h2 class="wp-block-heading h4">v1.7 Release Community Call</h2>'}
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>We\'ll walk through highlights of v1.7 live on our&nbsp;<strong>Release Community Call.&nbsp;</strong>Join us to see the new functionality in action and bring your questions!&nbsp;<a href="https://us06web.zoom.us/meeting/register/C5exRZqjS1mmZngTFpdD-A#/">Register here</a>.<br>‍</p>'
  }
/>

<CoreBlock
  name="core-image"
  content={
    '<figure class="wp-block-image"><img src="https://cdn.prod.website-files.com/6362f59f9fd4ac355fc06eaf/68d47201790362a94daf27c8_Group%201171274509%20(1).png" alt="Spice Oct 2nd Community Call"/><figcaption class="wp-element-caption">Thursday, October 2nd Release community Call</figcaption></figure>'
  }
/>

<CoreBlock name="core-paragraph" content={'<p>‍</p>'} />

To get started with Spice Cloud v1.7.0, review [vCPU-based pricing plans](/pricing) or [get a demo](/get-a-demo) to see the new capabilities live.

<ContentResourceFeatured
  fields={{
    heading: 'Explore more Spice resources',
    paragraph:
      'Tutorials, docs, and blog posts to help you go deeper with Spice.',
    mode: 'related',
    resources: false,
    padding_top: 'unset',
    padding_bottom: 'unset',
    related_posts: [],
  }}
/>

<TalkToAnEngineerCta />

<ContentRichText
  fields={{
    coverage: 'rc-end',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

---

## Apache Ballista at Spice AI: Distributed Query Execution Without the Operational Tax
URL: https://spice.ai/blog/apache-ballista-at-spice-ai
Date: 2026-04-09T00:00:00
Description: A technical deep-dive into how Spice AI integrates Apache Ballista for distributed query execution with multi-active schedulers, fault-tolerant shuffle, and distributed acceleration.

<ContentRichText
  fields={{
    coverage: 'rc-start',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

**TL;DR:** Spice.ai has evolved from a single-node query engine into a distributed data platform built for enterprise workloads. By integrating **Apache Ballista** for distributed query execution and the **Vortex** columnar format for high-performance data transport, we've built a system that scales horizontally across compute clusters while maintaining the simplicity of a single-node deployment. The most significant extension we made to stock Ballista was replacing its single-scheduler architecture with multi-active HA coordinated through object store state, so high availability has no external infrastructure dependency beyond the object store itself.

This post is the fourth installment in our series on the open-source technologies powering Spice.ai, following [Apache DataFusion](/blog/how-we-use-apache-datafusion-at-spice-ai), [Apache Iceberg](/blog/apache-iceberg-at-spice-ai), and [Vortex at Spice AI](/blog/vortex-at-spice-ai-the-columnar-format-for-data-intensive-workloads). We'll focus on the distributed query layer: what Ballista gives us, what we built on top, and what we learned going to production.

---

## The Problem: Single-Node Ceilings

Spice.ai is a portable data, search, and AI-inference engine built in Rust on Apache DataFusion. It connects to [30+ data sources](https://spiceai.org/docs/components/data-connectors) (S3, Snowflake, Databricks, PostgreSQL, Kafka, and more) and [accelerates queries locally](/platform/sql-federation-acceleration) for sub-second response times, serving SQL query, search, AI inference, and catalog APIs over HTTP, Arrow Flight, FlightSQL, ODBC, JDBC, and ADBC.

Queries against 100GB+ data lakes were exceeding the memory and compute capacity of a single process, and we didn't have a good fault tolerance solution for long-running analytical workloads. It became clear we needed to enable enterprises to scale query compute independently of storage without taking on the operational complexity of a system like Spark, and without sacrificing the developer experience that makes Spice.ai straightforward to deploy.

[Distributed query execution](https://spiceai.org/docs/features/distributed-query) on top of object storage was the answer.

An important design constraint: distributed mode targets throughput and scale for batch/analytical workloads (seconds to minutes). Sub-second real-time queries continue to use single-node Spice with [acceleration](https://spiceai.org/docs/features/data-acceleration). This distinction shaped every architecture decision that followed.

## Why Apache Ballista

When we evaluated distributed query frameworks in late 2025, three candidates emerged:

| Criteria                   | Apache Ballista                                                           | datafusion-distributed                         | Custom Build              |
| -------------------------- | ------------------------------------------------------------------------- | ---------------------------------------------- | ------------------------- |
| **Production maturity**    | 4+ years, ASF governance, 440+ dependents                                 | ~10 months, 20 contributors                    | N/A                       |
| **Fault tolerance**        | Disk-based shuffle; failed stages retried from intermediate data          | Fully in-memory; failures restart from scratch | 6-12+ months to build     |
| **Ecosystem**              | Core contributors from Apple; Coralogix (65+ releases of production fork) | Primarily Datadog internal tooling             | N/A                       |
| **DataFusion integration** | Native; same query planning, same Arrow types                             | Native but minimal scaffolding                 | Requires Substrait bridge |

**We chose Ballista** because it is batteries-included. It ships with a mature scheduler-executor model, a shuffle service with disk-based fault tolerance, Arrow Flight RPC, and metrics collection. Building equivalent capabilities from scratch would have taken 6-12+ months, time better spent on Spice's differentiating features: acceleration, [search](/platform/hybrid-sql-search), and [AI inference](/platform/llm-inference).

Published TPC-H SF100 benchmarks show **2.9x overall speedup** vs. single-node DataFusion, with 5-10x lower memory usage than Apache Spark.

### Early Distributed Results: Spice vs. Spark

Even in early preview (Oct 2025), our distributed cluster showed striking results against Apache Spark on Databricks:

| Query                          | Spice Cluster (48 cores, 24GB RAM) | Spark on Databricks (48 cores, 192GB RAM) | Speedup         |
| ------------------------------ | ---------------------------------- | ----------------------------------------- | --------------- |
| Wildcard filter (no hits)      | **6.1s**                           | 47s                                       | **7.7x faster** |
| Wildcard filter (with hits)    | **6.6s**                           | 25s                                       | **3.8x faster** |
| Distributed embed (~100k rows) | **9.8s**                           | 17s                                       | **1.7x faster** |

The Spice cluster used **8x less RAM** than Spark while delivering 2-8x better query performance, a direct consequence of building on Rust and Arrow, where zero-copy data transport via Arrow Flight eliminates the JVM overhead and garbage collection pauses that constrain Java-based systems.

## The Architecture

A distributed Spice cluster has two roles:

![A distributed Spice cluster has two roles](/website-assets/media/2026/02/spice-distributed-cluster.png)

- **Schedulers** accept SQL queries, plan distributed execution, and coordinate task dispatch across the executor fleet. Multiple schedulers run multi-active for high availability, coordinating through object store state instead of requiring etcd, ZooKeeper, or other external coordination services.

- **Executors** run physical query plans and exchange intermediate data via shuffle. They establish bidirectional control streams to all schedulers, enabling transparent failover, on-demand metrics, task cancellation, and partition management.

**Standalone mode** remains fully functional. A single `spiced` binary with no cluster configuration behaves exactly as before, with zero operational overhead for single-node deployments.

### Distributed Query Flow

```mermaid
sequenceDiagram
  Client->>Scheduler: Submit SQL
  Scheduler->>Object Store: Read scheduler state
  Scheduler->>Executors: Dispatch tasks
  Executors->>Object Store: Write shuffle data
  Object Store->>Executors: Read shuffle data
  Executors->>Scheduler: Return results
  Scheduler->>Client: Stream Arrow batches
```

1. Client submits SQL to any scheduler via HTTP, Arrow Flight, or FlightSQL
2. Scheduler creates a logical plan using DataFusion, then a distributed physical plan via Ballista
3. Plan stages are dispatched as tasks to executors via push-based scheduling for minimal latency
4. Executors run tasks, writing intermediate shuffle data to disk, memory, or object store
5. Results stream back to the client through the scheduler as Arrow record batches

Failed tasks are automatically retried from intermediate shuffle data, avoiding full re-execution.

A key architectural consequence: synchronous queries cannot survive scheduler death mid-execution. For long-running distributed workloads, Spice provides an async query submission API where clients submit jobs and poll for results. This ensures jobs are resilient to scheduler failure after acceptance.

## Multi-Active Schedulers with Object Store State

Stock Ballista has a single-scheduler architecture, making it a single point of failure. We built multi-active HA using object store (S3, Azure Blob, or local filesystem) as the shared state layer, with no external coordination services.

Each scheduler registers itself by writing a JSON record to a well-known path in the object store (e.g. `s3://bucket/schedulers/{scheduler_id}.json`). The `ObjectState` layer provides optimistic concurrency control via ETag-based conditional writes (`PutMode::Create` for initial registration, conditional updates for heartbeats) with Fibonacci backoff on conflicts (`MAX_CONDITIONAL_ATTEMPTS = 5`).

The protocol works as follows:

- **Registration**: On startup, a scheduler inserts its record. If the key already exists and the existing record is stale (heartbeat expired past TTL + clock skew tolerance), it overwrites via conditional update. If the record is still active, startup fails to prevent duplicate IDs.
- **Heartbeat**: Every `TTL / 3` (default: 10 seconds), each scheduler conditionally updates its record with a fresh `last_heartbeat_ms`. The conditional write ensures that if two schedulers race, only one succeeds per ETag version.
- **Discovery**: Every 5 seconds, each scheduler lists all scheduler records, filters out stale entries, and updates its in-memory peer map. New and removed peers are logged.
- **Shutdown**: On graceful shutdown, the scheduler deletes its record.

This design means the only infrastructure requirement for HA is an object store that supports conditional writes (S3, Azure Blob Storage, or even a shared local filesystem). The only external dependency is the object store itself; there is no etcd, ZooKeeper, or Redis cluster to operate. The tradeoff is that shared state is eventually consistent and the object store is in the hot path for coordination, which is acceptable for batch/analytical workloads where scheduling overhead is small relative to query runtime.

Clients can submit queries to any scheduler. Each scheduler independently plans and coordinates query execution across the shared executor fleet.

## What We Built on Top of Ballista

Stock Ballista provides the distributed execution foundation. But integrating it with Spice's feature set (acceleration, [search](/platform/hybrid-sql-search), UDFs, telemetry, multi-tenancy) required significant extension work maintained in our [fork](https://github.com/spiceai/datafusion-ballista).

### 1. Bidirectional Control Streams

Executors establish long-lived bidirectional gRPC streams (`ControlStream`) to every known scheduler. These streams carry:

- **Heartbeats**: Executors send periodic heartbeats with task slot availability.
- **PollNow commands**: Schedulers send `PollNow` to trigger immediate work polling on executors when new tasks are available, reducing scheduling latency from the poll interval (100ms) to near-zero.
- **Task cancellation**: Schedulers route cancellation requests through the control stream rather than requiring a separate RPC.
- **Metrics requests**: Schedulers request on-demand metrics from executors for observability.
- **Partition updates**: Schedulers push partition assignment changes (for distributed acceleration) to executors, with a callback handler that loads/unloads data partitions.

When a scheduler becomes unreachable, the executor reconnects with Fibonacci backoff (max 10 seconds). When new schedulers are discovered, the executor opens additional control streams automatically.

### 2. Remote Catalog and UDF Synchronization

The scheduler is the source of truth for table schemas and custom functions. When executors join the cluster, they automatically receive the full catalog and UDF registry via our `ClusterService` gRPC protocol (`GetCatalog` and `GetFunctions` RPCs). No manual registration, no configuration drift.

This means a single [`spicepod.yaml`](https://spiceai.org/docs/getting-started/spicepods) on the scheduler defines all datasets, models, and views for the entire cluster.

The current implementation is SQL-only: clients submit SQL and the scheduler handles all query planning. The catalog sync architecture is designed for a second phase where clients perform local query planning via DataFrame API or submit pre-planned Substrait queries. The `RemoteTableProvider` and `RemoteScalarUDF` stubs participate in planning but defer execution to the scheduler.

### 3. mTLS Cluster Security

Distributed communication includes highly privileged RPCs: `GetAppDefinition` (full cluster config), `ExpandSecret` (secret values from the scheduler's store), and Ballista's task dispatch protocol. These must be protected because a rogue process impersonating an executor could exfiltrate secrets and query data.

We implemented mandatory mutual TLS with strict port separation:

| Port  | Visibility | Services                                   | mTLS         |
| ----- | ---------- | ------------------------------------------ | ------------ |
| 50051 | Public     | Arrow Flight (user queries), OpenTelemetry | Optional     |
| 8090  | Public     | HTTP API (REST queries, health, status)    | Optional     |
| 9090  | Public     | Prometheus metrics                         | No           |
| 50052 | Internal   | `SchedulerGrpcServer`, `ClusterService`    | **Required** |

CLI tooling simplifies certificate management:

```bash
spice cluster tls init
spice cluster tls add scheduler1
spice cluster tls add executor1 --host executor1.cluster.local
```

For development and testing, `--allow-insecure-connections` disables the mTLS requirement. In production, all three certificate files (CA, node cert with SAN matching `--node-advertise-address`, and private key) are required.

### 4. Shuffle Backends

Spice supports three shuffle storage backends, configured via `shuffle_location`:

- **Local disk** (default): Writes shuffle data to the executor's local filesystem. Stock Ballista behavior, suitable for single-node or colocated deployments.
- **In-memory**: Keeps intermediate data in executor memory for lower latency. Falls back to remote Flight fetch when data isn't available locally.
- **Object store (S3, Azure, GCS)**: Writes shuffle data to S3, Azure Blob Storage, or Google Cloud Storage, decoupling shuffle storage from executor local disks. Essential for cloud-native deployments where executors may be ephemeral.

### 5. Vortex Shuffle Format

As covered in [Vortex at Spice AI](/blog/vortex-at-spice-ai-the-columnar-format-for-data-intensive-workloads), Vortex's encoding-aware compression extends into the shuffle layer. When enabled, the shuffle writer serializes intermediate data using Vortex IPC instead of Arrow IPC (which uses LZ4 frame compression). Vortex's adaptive per-column encoding produces smaller shuffle files, reducing network transfer and disk I/O between executors.

```yaml
runtime:
  params:
    shuffle_format: vortex # or arrow_ipc (default)
```

The shuffle format is transparent to query semantics. The Vortex shuffle path converts Arrow RecordBatches to Vortex arrays on write and back to Arrow on read. For in-memory shuffles, data stays in Vortex encoding between stages, eliminating the decompress-recompress cycle.

### 6. Custom Codec for Spice Extensions

Distributed execution requires serializing execution plans across the network. We built custom physical and logical codecs that handle Spice-specific plan nodes: `UdtfExec` (for vector_search, text_search, RRF), `CayenneAccelerationExec`, `SchemaCastScanExec`, and `BytesProcessedExec`.

Vortex scan plans survive this serialization boundary via protobuf support added in our DataFusion fork (see [Vortex at Spice AI](/blog/vortex-at-spice-ai-the-columnar-format-for-data-intensive-workloads)), so distributed queries against [Cayenne](/blog/introducing-spice-cayenne-data-accelerator) tables work transparently.

### 7. Observability

All cluster metrics flow through OpenTelemetry with a pre-built Grafana dashboard. Metrics include node status, active tasks, task duration, shuffle sizes, scheduler count, and active executor count. The distributed `task_history` table provides a federated view of all query execution across the cluster.

## Distributed Acceleration

Ballista distributes query execution, but the data still has to live somewhere. In a single-node Spice deployment, accelerated tables are local: one process owns all the data. Scaling to a cluster requires distributing the data itself across executors so that queries can be planned and executed against the partitions where data actually resides.

We built a full partition management system that coordinates which executor owns which partitions of an [accelerated table](https://spiceai.org/docs/features/data-acceleration), using the same object store state layer that powers scheduler HA.

### How It Works

**Partition discovery.** When an accelerated table is configured with `partition_by`, the scheduler discovers the full set of partition values. If the partition expression has a statically known value set (e.g. `bucket(N, col)` produces `0..N-1`), values are generated without querying the source. Otherwise, a `SELECT DISTINCT` is executed against the federated source to discover partition values dynamically.

**Partition metadata in object store.** Each table's partition state is stored as a JSON file at `accelerations/partitions/{table}.json` in the shared object store. This file contains the full list of `PartitionMetadata` entries, each recording the partition value (a map of column names to values, supporting composite keys like `{"date": "2024-01-01", "region": "us-east"}`), assigned executor IDs, and assignment timestamps.

**Allocation with optimistic concurrency control (OCC).** The scheduler's `PartitionManager` allocates unassigned partitions to executors using optimistic concurrency control, the same ETag-based conditional write pattern used for scheduler registration. A greedy allocation loop iterates unassigned partitions and assigns them to the requesting executor, up to a configurable `max_partitions_per_executor` soft limit. On ETag conflict (another scheduler allocated concurrently), it retries with Fibonacci backoff up to 5 attempts.

**Executor selection for queries.** When a distributed query hits a partitioned accelerated table, the planner needs to know which executors to send tasks to. The `select_executors` algorithm finds the minimal set of executors that cover all required partitions using a greedy set cover: it repeatedly picks the executor with the most coverage of remaining needed partitions, breaking ties by executor ID for determinism. If any required partition is unassigned, the query fails with a clear error rather than returning partial results.

**Push-based partition updates.** When the scheduler assigns or reassigns partitions, it pushes `UpdatePartitions` messages to the affected executors via the bidirectional control stream. The executor's `PartitionUpdateHandler` callback receives the new and removed partition maps and loads or unloads data accordingly without polling or stale state.

**Write-through forwarding.** DML operations (INSERT, UPDATE, DELETE, MERGE INTO) on partitioned tables are forwarded to the correct executor based on partition assignment. The write-through layer inspects the incoming `FlightData` stream, evaluates partition expressions against the data's schema, and routes each batch to the executor that owns that partition via Arrow Flight `do_put`. This ensures writes are always co-located with the data.

### Partition Management Cycle

The scheduler runs a periodic management task (configurable interval and `discovery_timeout`) that:

```mermaid
graph LR
  A["Refresh metadata"] --> B["Discover partitions"]
  B --> C["Allocate to executors"]
  C --> D["Push updates"]
  D -->|"next cycle"| A
```

1. Refreshes partition metadata from the object store
2. Discovers new partition values from source tables
3. Writes updated partition lists back to the object store
4. Allocates unassigned partitions to available executors (up to `max_assignments_per_cycle`)
5. Pushes partition updates to affected executors via control streams

This cycle means the system self-heals: if an executor goes down, its partitions become unassigned and are reallocated on the next cycle. New executors joining the cluster automatically receive partition assignments.

### What This Enables

Ballista distributes query execution. The partition management layer extends that to the data itself, so queries are planned and dispatched against the executors where data actually lives. Each executor materializes and serves only its assigned partitions, and writes are routed to the correct executor. The result is a horizontally scaled acceleration layer where adding executors increases both query capacity and data capacity proportionally.

## Use Case: Distributed Embeddings

A concrete application of distributed query is scaling embedding generation with the built-in `embed()` UDF. In single-node mode, embedding large datasets is bottlenecked by one process. In distributed mode, the query planner captures embedding model requirements during planning and pushes `EnsureRuntimeDependencyExec` nodes to executors, which instantiate the model on demand:

```sql
SELECT review_id, embed(review_headline, 'potion_2m') FROM amazon_reviews;
```

Each executor processes its assigned partitions in parallel, generates embeddings locally, and shuffles the results back. The embedding model (`potion_2m` in this example) is defined once in the `spicepod.yaml` and distributed to executors automatically via the catalog sync protocol.

On a ~100k-row Amazon Reviews dataset, the Spice cluster completed distributed embedding in **9.8 seconds** (48 cores, 24GB RAM). The equivalent Spark job, which requires a custom PySpark UDF wrapping `model2vec` and manual model distribution, took **17 seconds** on 48 cores with 192GB RAM.

This pattern generalizes to any compute-heavy UDF: the distributed planner handles parallelization and data movement, while the UDF itself remains a single-node implementation.

## Configuration: Simple by Default, Powerful When Needed

See the [distributed query documentation](https://spiceai.org/docs/features/distributed-query) for the full configuration reference.

### Single-Node (unchanged)

```bash
spiced
```

### Distributed Cluster

```bash
# Scheduler
spiced --role scheduler \
  --node-mtls-ca-certificate-file ca.crt \
  --node-mtls-certificate-file scheduler.crt \
  --node-mtls-key-file scheduler.key

# Executor (role inferred from --scheduler-address)
spiced --scheduler-address spiced://scheduler:50052 \
  --node-mtls-ca-certificate-file ca.crt \
  --node-mtls-certificate-file executor.crt \
  --node-mtls-key-file executor.key
```

### HA Cluster with Object Store

```yaml
runtime:
  scheduler:
    state_location: s3://my-bucket/spice-cluster
  params:
    shuffle_format: vortex
    shuffle_location: s3://my-bucket/shuffle-data

datasets:
  - from: s3://warehouse/events
    name: events
    acceleration:
      enabled: true
      engine: cayenne
      mode: file
      refresh_mode: append
      retention_sql: |
        DELETE FROM events WHERE created_at < NOW() - INTERVAL '30 days'
```

## Business Value

### For Data Engineers

The transition to distributed mode requires no query rewrites. The same SQL and `spicepod.yaml` configurations are shared across single-node and cluster deployments. Adding `--role scheduler` and `--scheduler-address` is the only change. Failed stages retry from intermediate shuffle data rather than restarting from scratch, which matters for multi-hour analytical jobs.

### For Platform Teams

Scheduler HA runs entirely through object store conditional writes, without needing to operate etcd, ZooKeeper, or Redis. All cluster communication is secured with mTLS by default, with CLI-generated certificates. Full OpenTelemetry integration and a pre-built Grafana dashboard cover cluster health and task metrics.

### For Teams Evaluating Spark or Trino

Early benchmarks show the Spice cluster running 7.7x faster than Spark while using 8x less RAM, a consequence of Rust and Arrow eliminating JVM overhead and garbage collection pauses. The platform is built on Apache DataFusion (top-5 Apache project), Apache Ballista (ASF governance), and Vortex (Linux Foundation), all under open source governance. Adoption is incremental: start single-node with the same binary and configuration format, then scale to a cluster when needed.

## What's Next

We're continuing to push forward on distributed query capabilities:

- **Distributed acceleration with Arrow and Cayenne**: Extending partition management to Arrow and [Cayenne](/blog/introducing-spice-cayenne-data-accelerator), Spice's premier acceleration engines
- **Substrait plan submission**: Enabling client-side query planning with cross-language plan portability
- **Adaptive query execution**: Dynamic partition coalescing and stage retries based on runtime statistics
- **Upstream contributions**: Working to contribute our Ballista extensions (mTLS, object store shuffle, in-memory shuffle) back to the Apache project

---

_The Ballista integration is available in [Spice.ai v2.0+](https://spiceai.org/releases/v2.0-rc.1). Try the [distributed query quickstart](https://spiceai.org/docs/features/distributed-query) or explore the [Cayenne accelerator documentation](https://spiceai.org/docs/components/data-accelerators/cayenne)._

_Spice.ai is open source at [github.com/spiceai/spiceai](https://github.com/spiceai/spiceai). Our Ballista fork is at [github.com/spiceai/datafusion-ballista](https://github.com/spiceai/datafusion-ballista). The architecture decisions behind these choices are recorded in our [ADRs](https://github.com/spiceai/spiceai/tree/trunk/docs/decisions)._

Distributed query execution with Ballista is available in Spice today as the [distributed query](/feature/distributed-query) capability. To evaluate it on your own workloads, [get a demo](/get-a-demo).

<ContentRichText
fields={{
    coverage: 'rc-end',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<AccordionFaq
  fields={{
    heading: 'Apache Ballista at Spice AI FAQ',
    paragraph: '',
    items: [
      {
        title: 'What is Apache Ballista and why does Spice AI use it?',
        paragraph:
          '<p>Apache Ballista is a distributed query execution framework built on Apache DataFusion and Apache Arrow. Spice AI uses Ballista because it provides a mature scheduler-executor model, disk-based fault-tolerant shuffle, and native DataFusion integration. These capabilities would have taken 6-12+ months to build from scratch.</p>',
      },
      {
        title: 'How does distributed mode differ from single-node Spice?',
        paragraph:
          '<p>Single-node Spice handles sub-second real-time queries with local data acceleration. Distributed mode targets throughput and scale for batch and analytical workloads (seconds to minutes) by splitting query execution across a fleet of executors. The same SQL, <code>spicepod.yaml</code>, and APIs work in both modes. Adding <code>--role scheduler</code> and <code>--scheduler-address</code> flags is the only change.</p>',
      },
      {
        title:
          'How does Spice achieve high availability without etcd or ZooKeeper?',
        paragraph:
          '<p>Spice schedulers coordinate through object store conditional writes (S3, Azure Blob, or local filesystem) using optimistic concurrency control with ETag-based versioning. Each scheduler registers, heartbeats, and discovers peers via a shared state directory in the object store, removing the need for external coordination infrastructure.</p>',
      },
      {
        title:
          'What is distributed acceleration and how does partition management work?',
        paragraph:
          '<p>Distributed acceleration assigns partitions of accelerated tables to specific executors so queries run against data where it lives. The scheduler discovers partitions, allocates them to executors via optimistic concurrency control, and pushes updates through bidirectional control streams. If an executor goes down, its partitions are automatically reassigned on the next management cycle.</p>',
      },
      {
        title: 'How does distributed embedding work with the embed() UDF?',
        paragraph:
          '<p>The query planner captures embedding model requirements during planning and pushes them to executors, which instantiate the model on demand. Each executor processes its assigned partitions in parallel, generates embeddings locally, and shuffles results back, all within a single SQL statement. This pattern generalizes to any compute-heavy UDF.</p>',
      },
      {
        title:
          'How does Spice compare to Apache Spark for distributed queries?',
        paragraph:
          "<p>Early benchmarks show a Spice cluster running 7.7x faster than Spark on Databricks while using 8x less RAM, a consequence of Rust and Arrow eliminating JVM overhead and garbage collection pauses. Spice also provides a simpler operational model: a single binary, declarative YAML configuration, and built-in mTLS, compared to Spark's JVM-based ecosystem and external cluster managers.</p>",
      },
      {
        title:
          'What is the difference between Apache Ballista and Apache DataFusion?',
        paragraph:
          '<p>Apache DataFusion is a single-process query engine, and Apache Ballista distributes DataFusion query execution across a cluster of machines. Ballista reuses DataFusion\'s query planning and Arrow types, adding a scheduler-executor model and a shuffle service for exchanging intermediate data between plan stages. Spice.ai builds on both, as covered in <a href="/blog/how-we-use-apache-datafusion-at-spice-ai">how Spice uses Apache DataFusion</a>.</p>\n',
      },
      {
        title:
          'What is the difference between Apache Ballista and Apache Spark?',
        paragraph:
          '<p>Apache Ballista is a distributed query framework built in Rust on Apache DataFusion and Apache Arrow, while Apache Spark is a JVM-based distributed compute engine. Published TPC-H SF100 benchmarks show Ballista running with 5-10x lower memory usage than Spark, because Rust and Arrow avoid the JVM overhead and garbage collection pauses that constrain Java-based systems. Both use a scheduler-executor model with disk-based shuffle for fault tolerance.</p>\n',
      },
      {
        title: 'What is a shuffle in distributed query execution?',
        paragraph:
          "<p>A shuffle is the exchange of intermediate data between the stages of a distributed query plan. Executors write each stage's output to a shuffle store (local disk, memory, or object storage), and downstream stages read that data as input. Because shuffle data persists between stages, failed tasks can be retried from intermediate results instead of re-running the entire query.</p>\n",
      },
      {
        title: 'What happens if a scheduler fails while a query is running?',
        paragraph:
          '<p>A synchronous query does not survive scheduler failure mid-execution, so Spice provides an async submission API where clients submit a job and poll for results. Async jobs are resilient to scheduler failure once accepted. Because Spice schedulers run multi-active, clients can continue submitting new queries to any remaining scheduler without waiting for recovery.</p>\n',
      },
      {
        title: "Which object stores work with Spice's distributed mode?",
        paragraph:
          "<p>Spice's distributed mode uses S3, Azure Blob Storage, or a shared local filesystem for scheduler state, and S3, Azure Blob Storage, or Google Cloud Storage for shuffle data. The store holding scheduler state must support conditional writes, which is how schedulers coordinate without external services. The same state layer also stores partition metadata for distributed acceleration.</p>\n",
      },
      {
        title:
          'Can distributed Spice queries read data directly from a data lake?',
        paragraph:
          '<p>Yes, distributed Spice queries read directly from data lakes and the other sources supported by single-node mode, including S3, Snowflake, Databricks, and PostgreSQL. Distributed execution scales query compute independently of storage, and <a href="/use-case/datalake-accelerator">data lake acceleration</a> materializes tables closer to compute, with partitioned tables spread across executors so each node serves only its assigned partitions.</p>\n',
      },
      {
        title: 'Do you need Kubernetes to run a distributed Spice cluster?',
        paragraph:
          '<p>No, a distributed Spice cluster requires only the <code>spiced</code> binary: one process started with <code>--role scheduler</code> and executors started with <code>--scheduler-address</code>. High availability adds a single requirement, an object store that supports conditional writes, with no etcd, ZooKeeper, or Redis to operate. The <a href="/feature/distributed-query">distributed query</a> capability is available in Spice.ai v2.0 and later.</p>\n',
      },
      {
        title: 'Is Apache Ballista production ready?',
        paragraph:
          '<p>Apache Ballista has 4+ years of development under Apache Software Foundation governance and 440+ dependent projects, with core contributors from Apple. Coralogix maintains a production fork with 65+ releases. Spice.ai maintains its own fork at <a href="https://github.com/spiceai/datafusion-ballista">github.com/spiceai/datafusion-ballista</a> and is working to contribute extensions such as mTLS and object store shuffle back to the Apache project.</p>\n',
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

---

## Apache Iceberg at Spice AI: How we Query, Accelerate, and Write to Open Table Formats
URL: https://spice.ai/blog/apache-iceberg-at-spice-ai
Date: 2026-02-25T00:00:00
Description: A technical deep-dive into how Spice AI integrates Apache Iceberg for federated queries, sub-second acceleration, and ACID-compliant writes to open table formats.

<ContentRichText
  fields={{
    coverage: 'rc-start',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

**TL;DR:** Spice integrates Apache Iceberg as a first-class data source: connect to any Iceberg catalog, query tables with full SQL semantics, selectively accelerate hot datasets for sub-millisecond reads, and write back with ACID guarantees. This post covers catalog integration, [query acceleration](/platform/sql-federation-acceleration), write support, DataFusion internals, and production lessons from running Iceberg at scale.

---

[Apache Iceberg](https://iceberg.apache.org/) has become the default open table format for production data lakes, bringing ACID transactions, schema evolution, and time travel to data stored in object storage. But Iceberg alone doesn't solve the performance problem: querying data in object storage like S3 carries inherent latency that's too high for many application workloads.

At [Spice AI](/platform/sql-federation-acceleration), we integrate Iceberg as a first-class data source - customers can connect to Iceberg catalogs and query tables with full SQL semantics, then selectively accelerate hot datasets for sub-millisecond reads. This post explains how that integration works, from connecting your first catalog to the query engine internals.

**What this post covers:**

- What Apache Iceberg is and why it matters for data lakes
- The latency gap that Iceberg leaves open for application workloads
- How Spice connects to Iceberg catalogs, accelerates tables, and writes data back
- How the query engine works under the hood (Apache DataFusion, catalog providers, query optimization)
- Production lessons from running Iceberg at scale

This article is the second part of our Engineering at Spice AI series, where we share technical deep-dives into the [open-source technologies](https://spiceai.org/) and practices that power the Spice.ai compute engine.

1. [Apache DataFusion at Spice AI](/blog/how-we-use-apache-datafusion-at-spice-ai): The query engine
2. **Apache Iceberg at Spice AI: Open table format and SQL-based ingestion**
3. Rust at Spice AI: The systems programming foundation
4. Apache Arrow at Spice AI: The core data format
5. DuckDB at Spice AI: Embedded analytics acceleration
6. Vortex at Spice AI: Columnar compression for [Cayenne](/blog/introducing-spice-cayenne-data-accelerator), Spice's premier data accelerator

Want to skip ahead? The [Iceberg catalog connector docs](https://spiceai.org/docs/components/catalogs/iceberg) walk through connecting a local REST catalog in under 5 minutes. The rest of this post explains how the integration works under the hood.

## What is Apache Iceberg?

[Apache Iceberg](https://iceberg.apache.org/) is an open table format - a specification for how to organize metadata and data files so that data stored in object storage (S3, GCS, HDFS) can support database-level properties like ACID transactions, schema evolution, and time travel. It's not a storage system or a query engine, but a layer that sits between the two.

Unlike the older Hive approach, which treats directories as tables and relies on naming conventions for partitioning, Iceberg maintains explicit metadata files that track:

- **Current and historical table schemas** - so readers can handle schema changes without rewriting data
- **Which data files belong to the table** - including which rows have been deleted
- **Partition specifications and their evolution** - old and new partitioning schemes coexist
- **Immutable snapshots** - for time travel queries and concurrent-write safety
- **File-level and column-level statistics** - for pruning data files before reading them

These capabilities are organized into three layers:

- **The metadata layer:** JSON and Avro files tracking table schema, partitions, and data files
- **The data layer:** Parquet files containing the actual data in object storage
- **A catalog API:** The standard interface for table discovery and atomic updates

```mermaid
graph TD
  A["Iceberg Catalog\n(REST, Glue, Hive, Hadoop)"] --> B["Table Metadata\n(Schema, Partitions, Snapshots)"]
  B --> C["Data Files\n(Parquet in object storage, e.g. S3)"]
```

This metadata-driven design is what gives Iceberg its core strengths. We'll return to specific features - ACID transactions, hidden partitioning, schema evolution, time travel, and file-level pruning - later in this post, in the context of how Spice uses them.

## The latency gap: Why Iceberg alone isn't enough for applications

Iceberg solves the thorny data lake consistency and reliability challenges, but there's still an inherent performance gap for latency-sensitive workloads. Object storage like S3 carries 50-200ms per-request latency by design, and resolving an Iceberg query requires multiple metadata round-trips (manifest list, manifests, then data files) before touching a single row. Parquet itself is optimized for bulk analytical scans, not the high-concurrency, low-cardinality reads that application and increasingly AI agent workloads demand.

Consider a concrete example: a 10TB Iceberg table of user events, partitioned by date, stored in S3. Your data team runs ad-hoc queries over years of data - Iceberg's partition pruning makes this efficient. But your application serves a dashboard that queries the last 7 days of data, thousands of times per second.

The common workaround is to copy hot data into a faster system (ClickHouse, Redis, etc.) and introduce an ETL pipeline to keep it in sync with the lake. This works, but it introduces drift between systems, duplicates storage costs, and adds another operational surface to maintain.

This is the gap Spice is designed to fill.

## How Spice.ai bridges the gap

[Spice.ai](/platform/sql-federation-acceleration) is a data compute engine that lets you query data across sources using standard SQL. It connects to databases, data lakes, and warehouses - including Iceberg catalogs - and presents them through a single query interface. The key capability for Iceberg workloads is **acceleration**: Spice can materialize a hot working set into a faster local engine (DuckDB, SQLite, or [Spice Cayenne](/blog/introducing-spice-cayenne-data-accelerator)), then keep it automatically synchronized with the source. Iceberg stays the authoritative source of truth; Spice handles the caching and refresh logic so you don't have to build a separate pipeline.

Spice is built on [Apache DataFusion](https://datafusion.apache.org/) for query planning and execution, and on [Apache Arrow](https://arrow.apache.org/) as the in-memory columnar format. We'll cover the DataFusion internals later in this post; for now, the important thing is that Spice treats Iceberg as a first-class catalog - connect once, query across data sources, then choose which datasets to accelerate.

```mermaid
graph LR
  A["Read Manifests"] --> B["Check Statistics"]
  B --> C{"File matches predicate?"}
  C -->|"event_date max < 2024-01-01"| D["Skip file"]
  C -->|"user_id out of range"| D
  C -->|"Predicate matches"| E["Scan file"]
```

Spice supports several [deployment topologies](/feature/edge-to-cloud-deployments). The [sidecar pattern](https://spiceai.org/docs/deployment/architectures/sidecar) works well for workloads that need low-latency and high-concurrency. In Kubernetes, Spice runs as a second container in the same pod as your application. Communication goes over localhost instead of the network, which removes round-trip overhead. Each pod has its own copy of the accelerated data, so reads never leave the machine and each instance fails independently. The trade-off is resource duplication: every pod stores its own copy, which costs extra memory and compute. This works best when scale is moderate and sub-millisecond reads justify the extra resources - for example, a dashboard serving thousands of concurrent users.

```mermaid
graph TD
  A["Application Layer\nSQL queries via Spice"] --> B["Spice Query Engine\n(Apache DataFusion + acceleration layer)"]
  B -->|"Cold queries\n(full history, ad-hoc)"| C["Iceberg on S3\n(full dataset)\n10TB historical\nPartition pruning\nQuery in 500ms-5s"]
  B -->|"Hot queries\n(recent data, dashboards)"| D["DuckDB Acceleration\n(last 7 days, cached)\n50GB on local NVMe\nSub-10ms queries\nAuto-refresh"]
```

## Connecting Iceberg to Spice

Configuration in Spice uses the [spicepod](https://spiceai.org/docs/getting-started/spicepods) - a YAML file that declares which data sources to connect and how to access them. To connect an Iceberg catalog, add a `catalogs` entry pointing to the catalog's REST endpoint (or Glue, or Hadoop):


```yaml
catalogs:
  - from: iceberg:http://localhost:8181/v1/namespaces
    name: ice
    params:
      iceberg_s3_endpoint: http://localhost:9000
      iceberg_s3_access_key_id: admin
      iceberg_s3_secret_access_key: password
```


On startup, Spice connects to the catalog, discovers all namespaces (databases) and tables, and registers them for SQL access:


```bash
spice run
# 2025-01-27T19:08:37Z  INFO Registered catalog 'ice' with 1 schema and 8 tables
```


Every table is now queryable - no additional configuration needed:


```sql
sql> SHOW TABLES;

+--------+-------+------+
| table_catalog | table_schema | table_name |
+--------+-------+------+
| ice           | tpch_sf1     | lineitem   |
| ice           | tpch_sf1     | nation     |
| ice           | tpch_sf1     | orders     |
| ice           | tpch_sf1     | customer   |
+--------+-------+------+

sql> SELECT COUNT(*) FROM ice.tpch_sf1.lineitem;

+------+
| count(*)  |
+------+
| 6001215   |
+------+
Time: 0.186233833 seconds
```


Tables registered this way go directly to the Iceberg source. This is the simplest setup, but it means query latency depends on the source (S3, network, file format, etc.). For low-latency use cases, the next step is acceleration.

## Accelerating Iceberg tables

Tables registered through a catalog are queryable but not accelerated. To accelerate a table, register it as a **dataset** in the spicepod. This gives you control over the acceleration engine, refresh schedule, and which subset of data to cache:


```yaml
datasets:
  - from: ice.analytics.events
    name: events
    acceleration:
      enabled: true
      engine: cayenne
      refresh_sql: |
        SELECT * FROM events
        WHERE event_date > NOW() - INTERVAL '7 days'
      refresh_check_interval: 10m
```


The `from:` field references the catalog table (`ice.analytics.events`), so the Iceberg catalog still serves as the source of truth. The dataset definition adds the acceleration layer on top.

What happens behind the scenes:

1. On startup, Spice executes the `refresh_sql` against the Iceberg table
2. Results are loaded into a local [acceleration engine](https://spiceai.org/docs/features/data-acceleration) (Spice supports DuckDB, SQLite, Arrow, and Spice Cayenne for queries with low memory and DuckDB-like scale)
3. Queries against `events` hit the acceleration engine (local NVMe storage)
4. Every 10 minutes, Spice re-executes the refresh SQL to pull new data

You don't have to choose between Iceberg and fast queries. Iceberg stays your source of truth. Acceleration adds a transparent cache for predictable, low-latency reads.

## Writing back to Iceberg

Spice supports [INSERT operations](/blog/write-to-apache-iceberg-tables-with-sql) with full ACID guarantees via Iceberg's transaction protocol (check out the [Iceberg cookbook](https://github.com/spiceai/cookbook/blob/trunk/catalogs/iceberg/README.md) for a full example). To enable writes, set `access: read_write` on the catalog:


```yaml
catalogs:
  - from: iceberg:http://localhost:8181/v1/namespaces
    access: read_write  #required to enable INSERT operations
    name: ice
    params:
      iceberg_s3_endpoint: http://localhost:9000
      iceberg_s3_access_key_id: admin
      iceberg_s3_secret_access_key: password
      iceberg_s3_region: us-east-1
```



```sql
- Insert new rows
INSERT INTO ice.tpch_sf1.region (r_regionkey, r_name, r_comment)
VALUES (5, 'ANTARCTICA', 'A cold and remote region');

- Verify
SELECT * FROM ice.tpch_sf1.region WHERE r_regionkey = 5;
SELECT * FROM ice.tpch_sf1.nation WHERE n_nationkey = 25;
```


How this works under the hood:

1. Spice writes new Parquet files to S3
2. Creates a new manifest file listing the new files
3. Creates a new snapshot referencing the updated manifest
4. Atomically updates the metadata pointer in the catalog

If another writer commits between steps 1-3, Spice's commit fails and retries. This is Iceberg's optimistic concurrency in action - every write creates a new snapshot, and the catalog uses atomic compare-and-swap operations to ensure only one writer wins. The loser retries from the latest snapshot.

## Under the hood: How Spice queries Iceberg

Now that we've covered the user-facing configuration, let's look at how the query engine processes an Iceberg query. This section introduces the internal components - if you're primarily interested in using Spice with Iceberg, the sections above have you covered.

### Apache DataFusion: Spice's query engine

Spice is built on [Apache DataFusion](https://datafusion.apache.org/), an extensible SQL query engine written in Rust. DataFusion handles SQL parsing, query planning, and execution. (We covered DataFusion in depth in the [first post in this series](/blog/how-we-use-apache-datafusion-at-spice-ai).)

DataFusion organizes data sources into a three-level hierarchy: **Catalog** -> **Schema** -> **Table**. This maps directly to Iceberg's own structure:

- **Catalog** = Iceberg catalog (REST endpoint, Glue database, or Hadoop warehouse)
- **Schema** = Iceberg namespace
- **Table** = Iceberg table

Iceberg namespaces can technically be nested (`catalog.a.b.c.table`), but most catalog implementations use a single level.

When you add an Iceberg catalog to the spicepod, Spice creates three types of DataFusion components to handle it:

- **Catalog connectors** to connect to REST, Glue, or Hadoop catalogs
- **CatalogProvider / SchemaProvider** to discover namespaces and list tables
- **TableProvider** to read and write individual Iceberg tables

### How a query flows through the system

When you run `SELECT * FROM ice.db.events`, here's how Spice resolves it:

```mermaid
graph TD
  A["User Query\nSELECT * FROM iceberg.db.table"] --> B["Name Resolution / Table Lookup\niceberg.db.table → IcebergTableProvider"]
  B --> C["IcebergTableProvider\n(iceberg-datafusion crate)\nReads metadata, plans which Parquet\nfiles to read for the scan"]
  C --> D["Parquet Files\n(S3, GCS, HDFS, Local FS)"]
```

DataFusion parses the three-part table name (`ice.db.table`), resolves `ice` to the Iceberg CatalogProvider, `db` to the SchemaProvider for that namespace, and `table` to an `IcebergTableProvider`. The TableProvider then uses Iceberg's metadata to plan the most efficient read from S3.

### Schema discovery: Loading tables from a namespace

Each Iceberg namespace becomes a DataFusion SchemaProvider. On initialization, the provider:

1. Lists all tables in the namespace from the catalog
2. Filters them against glob patterns if an inclusion list is configured
3. Loads each table concurrently

**Performance note:** Loading table metadata is the slow path - each table requires fetching metadata from S3 (metadata.json, manifest lists). For catalogs with hundreds of tables, this can take 10-30 seconds on startup. Use glob filtering to scope the inclusion list to only the tables a given deployment needs. This keeps startup time predictable regardless of catalog size.

### Query optimization through Iceberg metadata

Spice uses the community `iceberg-datafusion` crate to connect Iceberg tables to DataFusion. When a query hits an Iceberg table, the TableProvider uses Iceberg's metadata to minimize the data read from S3:

- **Manifest pruning** - filter expressions skip manifest files that can't contain matching rows
- **Predicate pushdown** - query predicates push down to the Parquet reader, so only matching row groups are scanned
- **Column projection** - only requested columns are read from Parquet files

This means a query like `SELECT customer_id FROM events WHERE event_date = '2025-01-15'` might read 50MB instead of 10TB - partition pruning eliminates irrelevant files, and column projection skips every column except `customer_id`.

## Key Iceberg features Spice leverages

The query optimization described above depends on several foundational Iceberg features. Here's a closer look at each.

### ACID transactions via optimistic concurrency

Every write creates a new metadata file pointing to a new snapshot. The catalog uses atomic compare-and-swap operations to commit changes. If two writers conflict, one fails and retries:

```mermaid
sequenceDiagram
  participant A as Writer A
  participant Cat as Catalog
  participant B as Writer B
  A->>Cat: Read snapshot S1
  B->>Cat: Read snapshot S1
  A->>Cat: Add files, commit snapshot S2
  Cat-->>A: Commit successful
  B->>Cat: Add files, try to commit snapshot S3
  Cat-->>B: Rejected (S2 already committed)
  B->>Cat: Retry from S2
```

This comes with a tradeoff - too many concurrent changes by multiple writers will result in a lot of wasted work as rejected writes retry. But the benefit is that writers can work independently, with the catalog serving as the coordination point.

### Hidden partitioning

Iceberg maintains a separate partition spec that maps logical columns to physical partition values via transforms. Unlike Hive-style partitioning, users never query partition columns directly - partitioning is always defined as a transform on existing columns.

For example, consider a table:


```sql
events (
    event_id   BIGINT,
    user_id    BIGINT,
    event_time DATE
)
```


With the partition spec:


```sql
PARTITION SPEC
    day(event_time)
```


Iceberg physically stores a derived partition value such as `event_time_day = 2024-01-15`, but this field is not part of the table schema. When a user writes `WHERE event_time = '2024-01-15'`, Iceberg rewrites the predicate automatically using the partition transform and prunes data files accordingly.

Changing the partitioning strategy only requires updating the spec. Old data remains partitioned under the old spec; new data uses the new one. Iceberg's metadata tracks which data files belong to which spec, and during scan planning it evaluates predicates across all active specs.

### Schema evolution without rewrites

Iceberg tracks schema evolution in metadata; each data file records which schema version it was written with. Readers handle differences automatically:

- New columns in old files -> return NULL
- Renamed columns -> metadata tracks the mapping
- Type promotions (int -> long) -> handled transparently

### Time travel

Every commit creates an immutable snapshot. You can query as of any snapshot ID or timestamp. The tradeoff is that many small changes create many snapshots, increasing query planning time.

### File-level pruning via metadata statistics

Each manifest file stores min/max values for every column in every data file. Before scanning any Parquet, Iceberg can eliminate files that cannot contain matching data:


```sql
WHERE event_date > '2024-01-01' AND user_id = 12345
```


```mermaid
graph LR
  A["Read Manifests"] --> B["Check Statistics"]
  B --> C{"File matches predicate?"}
  C -->|"event_date max < 2024-01-01"| D["Skip file"]
  C -->|"user_id out of range"| D
  C -->|"Predicate matches"| E["Scan file"]
```

Parquet files from modern writers also include these statistics in the Parquet footer - but Iceberg's metadata-level statistics enable pruning without opening the files at all.

Write predicates that Iceberg can optimize:


```sql
- Good: Iceberg can prune partitions
SELECT * FROM events WHERE event_date > '2024-01-01'

- Less optimal: Function prevents pushdown
SELECT * FROM events WHERE YEAR(event_date) = 2024
```


## Error handling: Making failures actionable

Iceberg operations can fail in many ways - network issues, permission errors, corrupted metadata, or missing files. Generic error messages make these hard to debug. Spice maps Iceberg errors to specific messages that tell you what went wrong and what to do about it.

For example, if you have a typo in a namespace name:

Generic Iceberg error:


```bash
Unexpected => Failed to execute http request, NoSuchNamespaceException
```


Spice error:


```bash
The namespace 'analytics_prod' does not exist in the Iceberg catalog, verify the namespace name and try again.
```


Or if the catalog URL is wrong:

Generic Iceberg error:


```bash
Unexpected => Failed to execute http request, source: error sending request for url (http://localhoster:8181/v1/config)
```


Spice error:


```bash
Failed to connect to the Iceberg catalog or object store at (http://localhoster:8181/v1/config). Verify the Iceberg catalog is accessible and try again.
```


The same approach applies across TLS certificate errors, unsupported features, and invalid table metadata - each error includes context about the cause and a suggested next step.

## Production lessons

After running Iceberg in production, here are some lessons learned:

### 1. Catalog discovery is a startup bottleneck

Listing all namespaces and tables requires many metadata requests. Each table load fetches metadata from S3, and for catalogs with hundreds of tables, startup can take 10-30 seconds. We address this with:

- **Concurrency control** - a semaphore caps concurrent table loads at 10 to avoid overwhelming the catalog or object store
- **Include patterns** - glob filters scope discovery to only the tables a deployment needs
- **Lazy loading (planned)** - fetch table metadata on first query instead of at startup, trading startup time for first-query latency

### 2. S3 request signing can expire on large tables

AWS SigV4 signatures have a fixed validity window. When loading a large Iceberg table, Spice may queue hundreds of S3 requests for metadata files, manifests, and Parquet files. If requests wait too long in the queue, AWS rejects them with `RequestTimeTooSkewed`. This looks like a permissions error, but it's actually a timing issue - the signature expired before the request was sent. Concurrency limiting (point 1) helps here by keeping the request queue from growing too large.

### 3. Environment credentials can leak into explicit configs

The `iceberg-rust` library uses OpenDAL for S3 access. By default, OpenDAL loads credentials from multiple sources - explicit properties, environment variables, and `~/.aws/config`. Even when you provide credentials explicitly in the spicepod, OpenDAL can pick up `AWS_SESSION_TOKEN` from the environment and mix it with your explicit access key. This causes authentication failures that are hard to trace because the credentials you configured are correct - it's the extra session token that's wrong. Spice now sets `s3.disable-config-load=true` to prevent this. If you hit unexpected auth errors with Iceberg, check whether AWS credentials are set in your environment.

### 4. Not every table in a catalog is an Iceberg table

When connecting to AWS Glue, the catalog may contain Hive, Parquet, or CSV tables alongside Iceberg tables. Loading a non-Iceberg table as Iceberg fails. Spice handles this by skipping non-Iceberg tables with a warning instead of failing the entire catalog. If you see "Failed to load table" warnings on startup, this is likely why - it's not an error, it's Spice filtering out tables it can't read as Iceberg.

## Our contributions to iceberg-rust

Spice depends on `iceberg-rust` for catalog access, metadata handling, and Parquet scanning. We maintain a fork for changes that haven't been upstreamed yet, and contribute fixes back to the upstream project as they stabilize. Merged upstream to `apache/iceberg-rust`:

- [Handle converting Utf8View & BinaryView to Iceberg schema (#831)](https://github.com/apache/iceberg-rust/pull/831) - Added support for Arrow's newer string/binary view types
- [Make schema and partition_spec optional for TableMetadataV1 (#1087)](https://github.com/apache/iceberg-rust/pull/1087) - Compatibility fix for older Iceberg V1 tables
- [Handle pagination via next-page-token in REST Catalog (#1097)](https://github.com/apache/iceberg-rust/pull/1097) - Fixed REST catalog listing for catalogs with many namespaces/tables
- [Fix predicates not matching the Arrow type of columns read from parquet files (#1308)](https://github.com/apache/iceberg-rust/pull/1308) - Fixed predicate pushdown producing incorrect results when Arrow types didn't match
- [Add support for custom credential loader for S3 FileIO (#1528)](https://github.com/apache/iceberg-rust/pull/1528) - Enabled pluggable AWS credential providers for S3 access
- [Improve IcebergCommitExec to correctly populate properties/schema (#1721)](https://github.com/apache/iceberg-rust/pull/1721) - Fixed write path metadata
- [Fix: ensure CoalescePartitionsExec is enabled for IcebergCommitExec (#1723)](https://github.com/apache/iceberg-rust/pull/1723) - Fixed partitioned writes

## Current limitations and future work

**What works today:**

- Read all Iceberg tables (v1 and v2 format)
- INSERT new data with snapshot isolation
- Partition evolution - old and new partitioning schemes coexist transparently

**Current limitations:**

- No UPDATE or DELETE. Row-level mutations are not yet supported.
- No incremental refresh. Acceleration re-fetches the entire dataset on each refresh. Incremental refresh (only fetch new data) is in development.
- No automatic catalog refresh. Schema changes in the Iceberg catalog require restarting Spice. Periodic auto-refresh is planned.

**What's next:**

- DELETE FROM via equality delete files (merge-on-read)
- Incremental acceleration refresh - only pull new partitions since the last refresh
- Metadata-only queries - answer COUNT, MIN, MAX from Iceberg statistics without reading data files
- Lazy table loading - defer metadata fetches until first query to reduce startup time
- Better predicate pushdown to S3 Select for highly selective queries

## Apache Iceberg + Spice AI: Summary

Apache Iceberg provides ACID transactions, schema evolution, and open file formats for data lakes. Spice adds federated SQL access with local acceleration on top. Together, they give you:

- **Iceberg's reliability** - ACID guarantees and schema evolution over open Parquet files
- **Spice's flexibility** - query Iceberg alongside Postgres, Snowflake, and other sources in one SQL interface
- **Sub-millisecond reads** - accelerate frequently queried datasets locally while Iceberg remains the source of truth

Run Iceberg locally in under 5 minutes using the [Spice .ai Iceberg Catalog Connector](https://github.com/spiceai/cookbook/blob/trunk/catalogs/iceberg/README.md).

## Frequently Asked Questions

### What is Apache Iceberg?

Apache Iceberg is an open table format that brings ACID transactions, schema evolution, hidden partitioning, and time travel to data stored in object storage like S3, GCS, or HDFS. It organizes metadata and Parquet data files so that data lakes can support database-level reliability without requiring a specific storage system or query engine.

### How does Spice AI integrate with Apache Iceberg?

Spice connects to Iceberg catalogs (REST, AWS Glue, or Hadoop) and registers every table for SQL access automatically. Once connected, you can query Iceberg tables alongside other data sources like PostgreSQL or Snowflake through a single SQL interface.

### Can Spice AI accelerate Iceberg tables for low-latency queries?

Yes. Spice can materialize frequently queried subsets of Iceberg tables into a local acceleration engine (DuckDB, SQLite, or [Spice Cayenne](/blog/introducing-spice-cayenne-data-accelerator)) with configurable refresh intervals. This delivers sub-millisecond read performance while Iceberg remains the authoritative source of truth.

### Does Spice AI support writes to Iceberg tables?

Yes. Spice supports INSERT operations with full ACID guarantees via Iceberg's optimistic concurrency protocol. New Parquet files are written to object storage, and the catalog metadata pointer is updated atomically. See [Writing to Apache Iceberg Tables with SQL](/blog/write-to-apache-iceberg-tables-with-sql) for a detailed walkthrough.

### What Iceberg catalog types does Spice support?

Spice supports REST catalogs, AWS Glue, and Hadoop catalogs. Connect by adding a `catalogs` entry to your [spicepod](https://spiceai.org/docs/getting-started/spicepods) configuration file with the catalog endpoint and credentials.

<ContentCta
  fields={{
    override_global_setting: true,
    custom_content: {
      heading: 'Get Started with Apache Iceberg + Spice AI',
      paragraph:
        'Experience federated SQL, acceleration, and ACID-compliant writes with Apache Iceberg and Spice AI. Follow the Iceberg Catalog Connector guide to run locally in minutes.',
      cta: {
        title: 'View Iceberg Connector Guide',
        url: 'https://github.com/spiceai/cookbook/blob/trunk/catalogs/iceberg/README.md',
        target: '_blank',
      },
    },
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

To put Iceberg to work in production with Spice, review [Spice Cloud pricing](/pricing) or [get a demo](/get-a-demo).

<ContentRichText
  fields={{
    coverage: 'rc-end',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

---

## AWS Workshop: Federated Queries and Hybrid Search with Spice.ai
URL: https://spice.ai/blog/aws-workshop-federated-queries-and-hybrid-search-with-spice
Date: 2026-05-12T00:00:00
Description: A new AWS catalog workshop that walks through deploying Spice as a data and AI substrate across AWS infrastructure for federated queries, hybrid search, and LLM inference.

<ContentRichText
  fields={{
    coverage: 'rc-start',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

Amazon published a new [workshop on AWS Workshop Studio](https://catalog.us-east-1.prod.workshops.aws/workshops/30627b8b-941a-4d66-b83d-300d17018d26/en-US) that walks through deploying Spice as a data and AI substrate across AWS infrastructure. The workshop is designed for solutions architects, data engineers, and AI/ML engineers building applications and agents that need to query, search, and run LLM functions across multiple data sources.

## What the workshop covers

<img
  src="/website-assets/media/2026/04/spiceai-workshop-architecture.png"
  alt="Spice AI workshop reference architecture on AWS"
  className="w-full h-auto my-8"
/>

AI applications and agents rely on a consistent set of primitives: federated query across sources, low-latency data access, hybrid search, and LLM inference. Most enterprise data systems were not built to provide all of these together, which results in development teams standing up pipelines across systems or compromising on one requirement to meet another.

This reference architecture illustrates how Spice and AWS close that gap. The workshop connects Spice to [Aurora PostgreSQL](https://aws.amazon.com/rds/aurora/), [S3 Tables](https://aws.amazon.com/s3/features/tables/), [S3 Vectors](https://aws.amazon.com/s3/features/vectors/), and [Amazon Bedrock](https://aws.amazon.com/bedrock/) through a single spicepod configuration deployed on EC2. From there, it guides you through:

- [Federated SQL queries](/platform/sql-federation-acceleration) across sources using standard SQL
- [Data acceleration](/use-case/datalake-accelerator) through materialization and caching
- [Hybrid vector and full-text search](/platform/hybrid-sql-search) combining vector and full-text
- [LLM inference](/platform/llm-inference) invoked directly within the query engine using Bedrock foundation models

The exercises are modular, so you can work through the full workshop in two to three hours or focus on the sections most relevant to your use case.

The full workshop is available on [AWS Workshop Studio](https://catalog.us-east-1.prod.workshops.aws/workshops/30627b8b-941a-4d66-b83d-300d17018d26/en-US).

For more details on how to build with Spice and AWS, check out the [Spice.ai AWS integration page](https://spiceai.org/docs/deployment/aws/integrations).
If you have any questions or feedback, join the [Spice Slack community](/slack) and let us know!

To go beyond the workshop and evaluate Spice against your own AWS data, [get a demo](/get-a-demo) with the Spice team.

<ContentRichText
  fields={{
    coverage: 'rc-end',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

---

## Barracuda Networks Gains 100x Faster Query Responses and 50% Reduction in Operational Costs with Spice.ai OSS
URL: https://spice.ai/blog/barracuda-networks-100x-faster-query-responses-with-spice
Date: 2026-06-12T09:00:00
Description: Barracuda Networks used Spice.ai OSS to accelerate archival and audit data access, improving query performance by up to 100x while reducing operational costs by 50%.

<ContentRichText
  fields={{
    coverage: 'rc-start',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

[Barracuda Networks](https://www.barracuda.com) is a leading cybersecurity company providing complete protection across email, data, applications, and networks. Its portfolio (including a fully managed XDR service) helps organizations and channel partners strengthen cyber resilience with solutions that are innovative, easy-to-use and built for real-world operational demands.

With the intelligent BarracudaONE cybersecurity platform, 24/7 SOC, and a comprehensive suite of security offerings, Barracuda enables businesses to adopt Cybersecurity-as-a-Service efficiently, addressing escalating threats while alleviating pressure from the ongoing shortage of cybersecurity talent.

Hundreds of thousands of organizations rely on Barracuda for its industry-leading protection, operational efficiency, and proven ability to simplify complex security challenges.

As demand for its email security and data backup offerings continues to grow, Barracuda needed an efficient way to provide increasingly fast, reliable, and cost-effective data access. These are data-intensive workloads with strict latency requirements, making performance and scalability essential for customer experience.

## Solution

![Barracuda data lake accelerator architecture](/website-assets/media/2026/02/barracuda_datalake_accelerator_v2.png)

To support these workloads, Barracuda turned to Spice AI using [Spice.ai Enterprise](https://spiceai.org/docs/deployment/architectures/cluster). By unifying federated SQL query, search, and AI inference into a single engine, Spice.ai accelerates data access for mission-critical workloads, and makes it simple and easy for developers to build fast and accurate data-intensive applications and AI agents across cloud, edge, and on-premises environments.

Through a design partnership that included regular engineering team collaboration, Barracuda and the Spice AI team worked to solve the core problem of getting data to their archival and auditing applications in real-time, and cost-effectively. Their work resulted in:

- Using [Spice.ai OSS](https://github.com/spiceai/spiceai), the open-source compute engine purpose-built for accelerating queries and simplifying data workflows
- Switching from ODBC connectors to direct Delta queries through Spice, slashing query times
- Delta Lake support for cost-effective query performance
- Databricks integration for minimal application changes and developer productivity
- Numerous bug fixes and performance improvements, directly benefiting Barracuda's infrastructure

The partnership wasn't one-sided. Barracuda also contributed back to Spice.ai OSS, making pull requests to improve Helm Charts and deployment automation, reinforcing the value of open-source collaboration.

## Benefits

The impact at Barracuda has been significant:

- 100x faster data lake query responses
- 30x faster audit log queries
- Consolidation of multiple data operations into a single runtime
- 50% reduction in operational costs

### Up to 100x Faster Data Lake Query Responses

One of Barracuda's offerings is its email archiving system, a tool businesses rely on for legal and compliance purposes. Customers also use it to search through massive volumes of archived emails and retrieve what they need.

By leveraging Spice.ai's real-time data and AI compute engine, Barracuda significantly improved its already fast data lake query performance, reducing query response times for archival emails by up to 100x.

<blockquote className="my-[1rem] border-l-[0.1875rem] border-blue pl-[1rem]">
  <p className="mb-[0.375rem] text-black">
    <span className="mr-[0.25rem] text-[1.5rem] leading-none text-blue">
      &ldquo;
    </span>
    It's not just about downloading emails. Sometimes, you just want to open a
    message and check what's inside. If that doesn't happen in near real-time,
    the customer is already gone.
  </p>
  <cite className="sm not-italic text-neutrals-dark-grey">
    Kevin Haggard, Vice President of Engineering, Barracuda
  </cite>
</blockquote>

### 30x Faster Audit Log Queries

Barracuda's audit log was originally built on a high-throughput architecture. As usage grew, the system required a more scalable approach to managing append-only data efficiently while still accommodating reliable querying.

The team needed a better way to handle their "append-only" audit logs: data that's written once and referenced later.

With Spice.ai's [data lake acceleration](https://spice.ai/use-case/datalake-accelerator), Barracuda is moving from Cassandra to a Firehose pipeline that writes logs directly to Parquet files in AWS S3, decoupling ingestion and analysis while improving reliability and query performance.

<blockquote className="my-[1rem] border-l-[0.1875rem] border-blue pl-[1rem]">
  <p className="mb-[0.375rem] text-black">
    <span className="mr-[0.25rem] text-[1.5rem] leading-none text-blue">
      &ldquo;
    </span>
    Spice lets us write logs as append-only data and deal with it later.
  </p>
  <cite className="sm not-italic text-neutrals-dark-grey">
    Darin Douglass, Principal Engineer, Barracuda
  </cite>
</blockquote>

### Consolidation of Multiple Data Operations into a Single Runtime

Barracuda has increased mission-critical stability and developer productivity with Spice.ai OSS.

Prior to Spice.ai, Barracuda's team managed a broad toolset, including Databricks for data processing, Elasticsearch for acceleration, and Cassandra for logs. While powerful, this approach introduced operational complexity and required additional effort to stitch systems together.

The team experimented with Arrow and DuckDB, but they required significant customization.

Spice.ai, on the other hand, simplified the stack. Its pod-based architecture combined data querying, model inference, and retrieval in one lightweight runtime. The team could now federate SQL queries, run fast queries on Parquet files, and integrate with existing data sources, all without having to manage multiple tools.

<blockquote className="my-[1rem] border-l-[0.1875rem] border-blue pl-[1rem]">
  <p className="mb-[0.375rem] text-black">
    <span className="mr-[0.25rem] text-[1.5rem] leading-none text-blue">
      &ldquo;
    </span>
    The developer productivity boost was immediate. Spice removed the friction
    of juggling multiple tools.
  </p>
  <cite className="sm not-italic text-neutrals-dark-grey">
    Kevin Haggard, Vice President of Engineering, Barracuda
  </cite>
</blockquote>

The move from Cassandra to S3-based Parquet files improved system reliability and eliminated a major point of operational risk, all while delivering faster performance.

<blockquote className="my-[1rem] border-l-[0.1875rem] border-blue pl-[1rem]">
  <p className="mb-[0.375rem] text-black">
    <span className="mr-[0.25rem] text-[1.5rem] leading-none text-blue">
      &ldquo;
    </span>
    It just spins up and works, which is really nice. The responsiveness is
    amazing, which is a huge gain for the customer.
  </p>
  <cite className="sm not-italic text-neutrals-dark-grey">
    Darin Douglass, Principal Engineer, Barracuda
  </cite>
</blockquote>

### 50% Reduction in Operational Costs

Replacing multiple systems with a single Spice.ai runtime eliminated more than operational complexity; it also reduced licensing and infrastructure overhead by 50%.

<blockquote className="my-[1rem] border-l-[0.1875rem] border-blue pl-[1rem]">
  <p className="mb-[0.375rem] text-black">
    <span className="mr-[0.25rem] text-[1.5rem] leading-none text-blue">
      &ldquo;
    </span>
    Spice's fixed-cost model and flexibility exceeded our expectations. It's a
    win-win. We're saving money and getting better results.
  </p>
  <cite className="sm not-italic text-neutrals-dark-grey">
    Kevin Haggard, Vice President of Engineering, Barracuda
  </cite>
</blockquote>
## Getting Started with Spice

Explore the docs, try it yourself, or book a call with an engineer:

- [Open source docs](https://spiceai.org/docs)
- [Cloud docs](https://docs.spice.ai)
- [Cloud sign up](/login)
- [Talk to an engineer](https://meetings.hubspot.com/vladi-semenov)

To see how Spice can deliver the same [SQL federation and acceleration](/platform/sql-federation-acceleration) for [cybersecurity applications](/industry/cybersecurity) and other data-intensive workloads, explore the [data lake accelerator](/use-case/datalake-accelerator) or [get a demo](/get-a-demo).

## About Spice AI

Spice.ai is an [open-source](https://github.com/spiceai/spiceai), Rust-based data and AI platform that gives agents their own self-contained data stack, and development teams a single SQL endpoint to federate and accelerate queries across data lakes, warehouses, and databases. It's lightweight enough that you can [deploy it anywhere](https://spiceai.org/docs/deployment) - at the edge, as a sidecar next to an application, on-premise, or in the fully managed [Spice Cloud Platform](https://docs.spice.ai).

## About Barracuda

Barracuda is a leading global cybersecurity company delivering complete resilience made easy to buy, deploy and use through a partner-first model. Our intelligent BarracudaONE platform provides cyber resilience across email, data, applications, networks, and managed XDR within an open ecosystem. Trusted by hundreds of thousands of organizations and partners worldwide, Barracuda delivers industry-leading solutions and support, powered by people and enhanced by AI, for all size business.

## Frequently Asked Questions

### What results did Barracuda Networks achieve with Spice.ai?

Barracuda Networks reduced data lake query response times by up to 100x and audit log query times by 30x. The company also cut operational costs by 50% and consolidated multiple data operations into a single Spice.ai runtime.

### How did Barracuda make its Delta Lake queries faster?

Barracuda switched from ODBC connectors to direct Delta Lake queries through Spice. This change reduced query times for its Delta Lake data. The Databricks integration required minimal application changes.

### Why is Barracuda moving its audit logs from Cassandra to Amazon S3?

Barracuda needed a more scalable way to manage append-only audit log data. With Spice's [data lake acceleration](/use-case/datalake-accelerator), the team writes logs through a Firehose pipeline to Parquet files in AWS S3. This design decouples ingestion from analysis and improves reliability and query performance.

### Which tools did Barracuda consolidate with Spice.ai?

Before Spice.ai, Barracuda managed Databricks for data processing, Elasticsearch for acceleration, and Cassandra for logs. Spice.ai combined data querying, model inference, and retrieval in one lightweight runtime. The team now runs [federated SQL queries](/platform/sql-federation-acceleration) and fast queries on Parquet files without managing multiple tools.

### Did Barracuda evaluate other engines before choosing Spice.ai?

Yes, the team experimented with Arrow and DuckDB before adopting Spice.ai. Both options required significant customization. Spice.ai simplified the stack with its pod-based architecture instead.

### Did Barracuda contribute to Spice.ai OSS?

Yes, Barracuda submitted pull requests that improved Helm Charts and deployment automation in Spice.ai OSS. The design partnership also produced bug fixes and performance improvements that benefited Barracuda's infrastructure.

### Which Barracuda workloads did Spice.ai accelerate?

Spice.ai accelerated Barracuda's email archiving system and its audit log queries. Customers search large volumes of archived emails for legal and compliance purposes. The audit logs store append-only data that teams write one time and read later.

<ContentResourceFeatured
  fields={{
    heading: 'Explore more Spice resources',
    paragraph:
      'Tutorials, docs, and blog posts to help you go deeper with Spice.',
    mode: 'related',
    resources: false,
    padding_top: 'unset',
    padding_bottom: 'unset',
    related_posts: [],
  }}
/>

<TalkToAnEngineerCta />

<ContentRichText
  fields={{
    coverage: 'rc-end',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

---

## Basis Set Ventures Deploys Spice.ai to Power Natural Language Queries and Mitigate Hallucinations
URL: https://spice.ai/blog/basis-set-ventures-deploys-spice-ai
Date: 2025-09-17T17:51:00
Description: Basis Set Ventures uses Spice.ai Enterprise to power natural language searches directly against real-time datasets.

<ContentRichText
  fields={{
    coverage: 'rc-start',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<CoreBlock
  name="core-heading"
  content={'<h2 class="wp-block-heading h4">TL;DR</h2>'}
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p><a href="https://www.basisset.com/">Basis Set Ventures</a>&nbsp;needed to search continuously refreshed data on 10,000+ people and companies without the burden of managing embeddings or pipelines. Using Spice\'s data and AI platform, Basis Set investors can now run natural language searches directly against fresh datasets - ultimately delivering accurate, data-grounded insights that help them spot opportunities earlier and act faster.</p>'
  }
/>

<CoreBlock
  name="core-image"
  content={
    '<figure class="wp-block-image"><img src="https://cdn.prod.website-files.com/6362f59f9fd4ac355fc06eaf/68cdf7588866db331e5e3f51_Pascal%20AI%20Search.png" alt="Pascal AI Search: &quot;Show me people in our network that used to be at Duolingo.&quot;"/><figcaption class="wp-element-caption">Figure 1. Pascal AI&nbsp;Search: "Show me people in our network that used to be at Duolingo."</figcaption></figure>'
  }
/>

<CoreBlock
  name="core-heading"
  content={'<h2 class="wp-block-heading h4">Situation</h2>'}
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Founded in 2017 by Dr. Lan Xuezhao,&nbsp;<a href="https://www.basisset.com/">Basis Set Ventures</a>&nbsp;is a San Francisco-based venture capital firm that targets investments in early-stage technology companies across the United States. Basis Set describes itself as an "AI-native venture fund" because of its strong internal use of AI to identify promising entrepreneurs and enterprises.</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>AI-driven technology has made it easier than ever for someone with an innovative idea to start a new company; this is great for entrepreneurs, but it makes it harder for venture capitalists to identify early prospects in which to invest.</p>'
  }
/>

<PostQuote
  fields={{
    message:
      "You don't have to be in Silicon Valley anymore. You can start a company anywhere. You don't need to know anybody, it's just a very different game.  The type of founder is different, the technical capabilities are different, and all of this makes it more difficult to find the people to invest in, who are the best at what they do.",
    name: 'Lan Xuezhao, Ph.D.',
    subtext: 'Basis Set Ventures Founding & Managing Partner. ',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Basis Set saw this challenge as a data problem and created&nbsp;<a href="https://www.basisset.com/team-members/pascal">Pascal</a>, their AI investment application for internal use. Pascal scours the internet looking for innovation, monitoring what\'s happening on GitHub, Reddit, LinkedIn, X, and a number of other sources. It then uses its proprietary algorithms to track more opaque variables like community sentiment about code contributions or areas of traction.</p>'
  }
/>

<PostQuote
  fields={{
    message:
      'Pascal helps us identify early inflection points. Early identification of opportunities is essential. For example, we identified and invested in one promising company sourced by Pascal, when their valuation was $5 million and it is now worth $200 million.',
    name: 'Lan Xuezhao, Ph.D.',
    subtext: 'Basis Set Ventures Founding & Managing Partner. ',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<CoreBlock
  name="core-heading"
  content={
    '<h2 class="wp-block-heading h4">Challenge: Custom Searches Across Continuously Refreshed Data</h2>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Monitoring more than 10,000 individuals and companies, and with harvested updates pouring in from social media and other areas of the internet throughout the day, Basis Set needed to keep its data set continuously updated so its team of investors could monitor areas of interests in real time.</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p><strong>"</strong>One key challenge we had is that, due to the nature of our business, we need to keep our database extremely fresh<strong>,"</strong>&nbsp;says Rachel Wong, CTO &amp; Partner at Basis Set. "That means pulling in updates to data every single day, both on people and company metrics."</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>The company first tried building and managing their own vector-based search system, converting words and images into numerical vectors, that could then be matched for similarity. &nbsp;</p>'
  }
/>

<PostQuote
  fields={{
    message:
      '"But we found for our use case, managing embeddings ourselves was impractical because we\'re updating our data daily, which means we\'d have to update our embeddings daily too," Wong says. "That obviously comes with some technical challenges and scalability challenges, so we were looking for an easier way to help our users search our database, which is when we found Spice AI."',
    name: '',
    subtext: '',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<CoreBlock
  name="core-paragraph"
  content={
    "<p>Basis Set also sought to make it as easy as possible for the company's investment partners to query its evolving data set, which meant converting natural language to SQL queries.</p>"
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p><strong>"</strong>With our first version of Pascal, our users were giving us multiple inputs on the kinds of people they were looking for,<strong>"</strong>&nbsp;says Muhammad Ammad, Staff Engineer at Basis Set Ventures. "We would manually go in and search for those people and form a pipeline and give those people to the investors. To do this we had to continuously change our code because they were giving us new information every day, and we had to sync with them with a lot of back and forth, with different dimensions and criteria. We wanted to reduce our communication and make things self-serve to give them the independence to search the database however they needed to."</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>The specificity of the searches - which can involve individual work histories, social media contributions, GitHub postings, momentum, community sentiment and a variety of other factors - would be a significant operational lift using traditional search tooling.</p>'
  }
/>

<CoreBlock
  name="core-heading"
  content={
    '<h2 class="wp-block-heading h4">Solution: Basis Set Adopts Spice.ai Enterprise, Purpose-Built to Help Enterprises Ground AI in Data</h2>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>To solve these challenges, Basis Set adopted&nbsp;<a href="https://spiceai.org/docs/deployment/architectures/cluster">Spice.ai Enterprise</a>, an open source and cloud-deployable runtime that unifies&nbsp;<a href="https://spiceai.org/docs/features/query-federation">query federation</a>,&nbsp;<a href="https://spiceai.org/docs/features/data-acceleration">acceleration</a>,&nbsp;<a href="https://spiceai.org/docs/features/search">hybrid search</a>, and&nbsp;<a href="https://spiceai.org/docs/features/large-language-models">LLM inference</a>&nbsp;in one system.</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Spice automatically runs multiple forms of queries against the Basis Set data - including schema and semantic interrogation, data sampling, and evaluation - and then converts the natural language searches to precise SQL queries, delivering the most accurate answer to return to the user.</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    "<p>The Basis Set data remains on the company's dedicated cloud-based infrastructure and communicates with the Spice Compute Engine managed in Spice Cloud. With the Spice Platform, Basis Set can continually add to its data stores without managing embeddings manually or requiring other pre-search preparations.</p>"
  }
/>

<CoreBlock
  name="core-image"
  content={
    '<figure class="wp-block-image"><img src="https://cdn.prod.website-files.com/6362f59f9fd4ac355fc06eaf/68d32b6cc7aba027e0a99fd6_3.png" alt="Basis Set Pascal AI app and Spice Cloud Architecture"/><figcaption class="wp-element-caption">Figure 2: Basis Set Pascal AI app and Spice Cloud Architecture.</figcaption></figure>'
  }
/>

<PostQuote
  fields={{
    message:
      '"With Spice we can say things like: \'Show me founders in the Bay Area who worked at Uber in 2018,\' click search, and have Spice on the backend do the search, which is really awesome," shared Wong.',
    name: '',
    subtext: '',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<CoreBlock
  name="core-heading"
  content={'<h2 class="wp-block-heading h4">Benefits</h2>'}
/>

<CoreBlock
  name="core-heading"
  content={
    '<h3 class="wp-block-heading h5">Enabling Natural Language Queries Without Managing Embeddings</h3>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Basis Set needed to use natural language queries to make it easier for its investors to search precisely for the characteristics they sought. But, as noted earlier, they found managing the embedding process of converting human language to numerical representations too time consuming and expensive to keep up with perpetually changing data stores. "Our data is continuously being updated, which means it is always changing," Ammad says. "With embedding, if even one character is changed, that whole embedding is out of date, and we have to make a new embedding, which is also pretty expensive because we have more than 100,000 people in our database."</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p><strong>With just a few lines of configuration code,</strong>&nbsp;Basis Set was able to do away with managing embeddings and instead use the Spice Cloud Platform to convert natural language queries to SQL, enabling always-fresh searches across Basis Set\'s data. Ammad shared, "With Spice AI, we no longer have to keep updating embeddings to enable natural language queries. Spice takes care of all of that, which is awesome."</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Eliminating embedding management has saved significant time for the company.</p>'
  }
/>

<PostQuote
  fields={{
    message:
      '"We were wrangling with the embeddings for some weeks, and found it quite frustrating," Wong says. "As soon as we deployed Spice, those problems were gone."',
    name: '',
    subtext: '',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Behind the scenes, Spice goes beyond transforming natural language into SQL queries; it also tests multiple queries to find the one that generates the most precise results.</p>'
  }
/>

<PostQuote
  fields={{
    message:
      '"Spice knows all our data structure and all the data that is within, so it\'s able to form queries on the fly that will work on our database, so we don\'t have to manually code queries," Ammad says. "With this foundation it knows what queries it should generate to get the response required by our investors. Previously, writing detailed queries could be very complicated and would take a lot of time and lot of trial and error. With Spice, it is now very simple to query our data, which is ever expanding."',
    name: '',
    subtext: '',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<CoreBlock
  name="core-heading"
  content={'<h3 class="wp-block-heading h5">Eliminated Hallucinations</h3>'}
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>AI is famously prone to hallucinations, in which it authoritatively delivers false information.&nbsp;<strong>Spice mitigates hallucinations by grounding its AI with the actual data of Basis Set, and using SQL queries, search, and LLM tools as inputs to AI prompts.</strong>"We saw a lot of hallucinations when we were using the manual embedding approach," says Wong. "One problem with our embedded data was that it didn\'t understand the true sentiment. If we asked it to find people who worked at Dropbox in 2017, it could hallucinate and return people who actually worked at Box. False returns like that are counter-productive and lessen confidence in our tool.</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p><strong>Hallucinations were eliminated after deploying Spice.ai.&nbsp;</strong>"We like the way Spice AI has approached this problem set," Wong says. "Spice AI grounds AI in our actual data, using SQL queries across all our data, which brings accuracy to probabilistic AI systems, which are very prone to hallucinations."</p>'
  }
/>

<CoreBlock
  name="core-heading"
  content={
    '<h3 class="wp-block-heading h5">Ease of Use &amp;&nbsp;Deployment</h3>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>"One of the great things about Spice is that it was truly plug and play," Wong says. "We jumped on a call with the Spice team, set up the configuration files with a couple lines of setup code, and were able to integrate it into our system pretty much immediately. Our whole business team was impressed. We told them we were bringing in a new search engine for our Pascal application, and two days later everyone was using it."</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>The ability of Spice AI to support natural language searches has proven to be popular throughout the company, including with its investment team. "Spice takes a huge lift off our investment team," Wong continues. "Previously, our investors had to configure very granular filters and settings for the algorithms on our platform. Now they can do search using regular English sentiment, which is a lot more natural for our users. They\'re investors, they\'re more business minded, so it makes sense for them to be able to just type in some heuristics of groups of people or companies that they want to be tracking, for example pre-seed companies working on MCP, who were founded in 2017-just whatever combinations they want to search for. It\'s a lot more natural for their workflow than having to go in and think about every tiny setting."</p>'
  }
/>

<CoreBlock
  name="core-heading"
  content={'<h3 class="wp-block-heading h5">Observability</h3>'}
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Basis Set values the observability Spice provides into how its AI-powered SQL queries are processing<strong>.&nbsp;</strong>"Spice AI gives us observability, with which we can actually see what is happening under the hood, and if something is not as we expect it to be, we can see where we need to change the prompt and so on," says Ammad.</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Spice\'s&nbsp;<a href="https://spiceai.org/docs/features/observability">observability capabilities</a><strong>&nbsp;stand in contrast to the opaqueness of other AI platform solutions.</strong></p>'
  }
/>

<PostQuote
  fields={{
    message:
      '"We can actually track and see the different SQL queries that it\'s trying, which is really cool," Wong says. "There\'s a lot of observability here, which we love as a technical team. We don\'t want to be constrained by AI operating in a black box. We really need to know what it\'s doing. This allows us to test it. Yes, it found these people who worked at a certain company at a certain time, or it identifies an unknown company on the verge of going big. We can validate its precision, adjust if needed, and benefit from the insights we need to guide our investments."',
    name: '',
    subtext: '',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<CoreBlock
  name="core-heading"
  content={'<h2 class="wp-block-heading h4">Conclusion</h2>'}
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>With Spice, Basis Set transformed the way its investors interact with data. The platform removes the burden of managing embeddings, reduces hallucinations, and makes <a href="/use-case/retrieval-augmented-generation">natural language search over structured data</a> both accurate and real-time. This leads to faster insights, greater confidence, and a competitive edge in spotting the next generation of high-growth startups.</p>'
  }
/>

<CoreBlock
  name="core-heading"
  content={'<h3 class="wp-block-heading h5">Getting Started with Spice</h3>'}
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Interested in giving Spice a try? Check out the following resources:</p>'
  }
/>

<CoreBlock
  name="core-list"
  content={
    '<ul class="wp-block-list"><li><a href="/login?from=landing">Sign up</a>&nbsp;for Spice Cloud for free, or&nbsp;<a href="https://spiceai.org/docs/getting-started">get started</a>&nbsp;with Spice Open Source</li><li>Review&nbsp;<a href="/pricing">Spice Cloud pricing</a>&nbsp;for vCPU-based plans</li><li><a href="https://meetings.hubspot.com/vladi-semenov">Book a demo</a></li><li>Explore the Spice&nbsp;<a href="/cookbook">cookbooks</a>&nbsp;and&nbsp;<a href="https://spiceai.org/docs">docs</a></li></ul>'
  }
/>

<CoreBlock name="core-paragraph" content={'<p>‍</p>'} />

<CoreBlock name="core-paragraph" content={'<p>‍</p>'} />

Read more about the [SQL query federation and acceleration](/platform/sql-federation-acceleration) capabilities powering deployments like this one.

<ContentResourceFeatured
  fields={{
    heading: 'Explore more Spice resources',
    paragraph:
      'Tutorials, docs, and blog posts to help you go deeper with Spice.',
    mode: 'related',
    resources: false,
    padding_top: 'unset',
    padding_bottom: 'unset',
    related_posts: [],
  }}
/>

<TalkToAnEngineerCta />

<ContentRichText
  fields={{
    coverage: 'rc-end',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<CoreBlock name="core-paragraph" content={'<p></p>'} />

---

## Localhost Latency at Scale: The Spice Cluster-Sidecar Architecture
URL: https://spice.ai/blog/cluster-sidecar-architecture
Date: 2026-04-21T09:00:00
Description: How the Spice cluster-sidecar architecture gives applications, services, and AI agents a sandboxed, localhost-latency data and inference plane backed by a distributed Spice cluster, without exposing underlying data systems.

<ContentRichText
  fields={{
    coverage: 'rc-start',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

**TL;DR:** Any application, service, or AI agent that needs high-performance, low-latency access to large-scale operational data faces the same three challenges: low-latency retrieval (SQL, full-text, vector), a safe blast radius so a misbehaving workload can't take down a database or access data it shouldn't see, and enough compute behind it to answer the hard questions. No single deployment model delivers all three. The Spice **cluster-sidecar (hybrid) architecture** does: a lightweight Spice sidecar runs inside each application pod and serves query, search, and LLM inference on `localhost` from a scoped working set (acting as a sandbox between the application and the underlying data systems), while a central Spice cluster (self-managed or [Spice Cloud](https://spiceai.org/docs/deployment/architectures/hosted)) handles ingestion, [Cayenne](/blog/introducing-spice-cayenne-data-accelerator) acceleration, [Ballista-powered](/blog/apache-ballista-at-spice-ai) distributed execution, hybrid search indexing, and refresh. The application sees one endpoint on `localhost`. Spice transparently decides whether to serve locally, delegate to the cluster, or return a cached result. Databases, data lakes, and CDC streams never see the application directly. This is especially powerful for AI agents, where autonomous query generation makes sandboxing critical, but the architecture benefits any workload that needs fast, safe access to data at scale.

## The problem: applications need fast, safe, distributed access to data

Any application, service, or AI agent that queries operational data at scale puts pressure on three things at once. AI agents make these challenges acute because they write their own queries, but the problems exist for any workload that needs low-latency access to large datasets.

1. **Latency on the retrieval path**. Every query that feeds a user-facing response (RAG lookups, tool calls that read state, text-to-SQL, vector search, dashboard panels, API responses) adds its retrieval latency directly to the user's wait time. A few hundred milliseconds of round-trips across a retrieval chain turns a one-second response into four. Applications want answers in single-digit milliseconds from whatever they're asking, whether that's SQL, full-text, vector, or hybrid search.
2. **Blast radius**. Giving any workload direct credentials to production Postgres, a data lake, or a warehouse means a bad plan, a runaway loop, or a misconfigured service can exhaust connection pools, scan petabytes, or touch rows it shouldn't. For AI agents, which write their own queries, the risk is amplified: a prompt injection or a bad planning step can generate arbitrary SQL. The retrieval layer needs to be a **sandbox**, not a passthrough.
3. **Occasional heavy queries**. Most reads are narrow: a tenant's recent orders, the docs for one entity, the last 24 hours of events. But "summarize our churn trend over the last year across all regions" is one API call (or one prompt) away, and when it happens the system has to answer it without collapsing.

Traditional architectures force a choice.

A centralized query cluster handles the heavy analytical side, but every retrieval pays a network round trip, each additional replica adds load to the cluster, and all applications hold credentials to the cluster (and often to the origin systems behind it). A sidecar-per-pod model gives applications `localhost` reads, but every sidecar independently ingests from source systems, which doesn't scale once you have dozens or hundreds of replicas, the source database starts buckling under connection count, and per-pod CDC multiplies cloud costs linearly with fleet size.

Teams typically end up stitching together a Redis or Memcached tier for retrieval, a vector database, a CDC pipeline, a materialization layer, a separate analytical warehouse, and an auth proxy in front of everything. Cache invalidation, schema drift, TTL tuning, and credential management become a permanent tax on the team. None of it solves the fundamental problem that the application is still talking to production systems, just through more layers.

## The solution: an application-local data, search, and inference plane

![Cluster-sidecar architecture diagram](/website-assets/media/2026/04/cluster-sidecar-architecture-diagram.svg)

The Spice cluster-sidecar architecture gives each application a complete data plane on `localhost` and keeps the data systems behind a single, centrally managed tier:

- Application-local sidecars serve the hot path. Every application pod gets its own Spice sidecar on loopback. That sidecar answers SQL, full-text, vector, and [hybrid search](/platform/hybrid-sql-search) queries from a scoped working set, handles [LLM inference and tool calls](/platform/llm-inference) locally, and is the only data-plane endpoint the application knows about. The application never holds credentials to Postgres, S3, Snowflake, or Iceberg. It holds a token for its sidecar.
- A centralized Spice cluster (self-managed, or the managed [Spice Cloud Platform](https://spiceai.org/docs/deployment/architectures/hosted)) is the only tier that talks to your data systems. It handles ingestion, [Cayenne](/blog/introducing-spice-cayenne-data-accelerator) acceleration, refresh scheduling, hybrid search indexing, and distributed query execution powered by [Apache Ballista](/blog/apache-ballista-at-spice-ai).
- Transparent delegation. When an application asks something the sidecar can't answer from its working set (a historical lookup, a cross-dataset join, a broad vector search), the sidecar forwards the query to the cluster over Arrow Flight (gRPC), streams the result back as Arrow record batches, and caches it for future reads. The application never knows delegation happened.

Think of it as a [CDN for your data](https://spiceai.org/docs/use-cases/data/database-cdn), with the sidecar as a **sandbox in front of the application**. The cluster is the origin server and the sidecars serve as edge nodes, with Spice handling routing, caching, and invalidation. Your origin data systems see traffic from the cluster only and never from the application fleet.

From the application's perspective, the entire data plane (SQL, search, vector, inference) is `localhost`, served through one endpoint with one wire format. From an infrastructure perspective, you get [distributed query](/feature/distributed-query) throughput and embedded-database latency, and a hard isolation boundary between the application and your data systems, without writing or operating ETL or an auth proxy.

### Architecture at a glance

![Cluster-sidecar architecture at a glance](/website-assets/media/2026/04/cluster-sidecar-architecture-diagram-2.svg)

Applications only ever talk to their sidecar. Sidecars only ever talk to the cluster. The cluster is the only tier with credentials to your data systems.

### The sidecar as a sandbox

The most important property of the sidecar isn't just latency: it's isolation. The sidecar is the only data-plane surface the application touches, and it's deliberately scoped so that a misbehaving workload can't escape. This is especially valuable for AI agents, where autonomous query generation makes the blast radius unpredictable, but the same isolation properties benefit any application that shouldn't have direct database credentials.

- Scoped working set, not the whole warehouse. A sidecar's `spicepod.yaml` declares exactly which datasets, views, and search indices the application is allowed to query. Anything not declared simply doesn't exist from the application's perspective: not filtered by a policy, not hidden by a row-level rule, but physically absent from the catalog. Compare this with approaches like row-level security (RLS), where the underlying data is present and a single policy misconfiguration can silently expose it. A sidecar's isolation is structural: there is no rule to misconfigure because the data was never there. For AI agents, even a perfectly crafted prompt injection can't query a table that isn't in the catalog.
- No origin credentials in the application. The application connects to its sidecar with a local token. The sidecar connects to the cluster over Arrow Flight (gRPC). The cluster holds the credentials for Postgres, Snowflake, Databricks, S3, Kafka, and the rest. Compromising an application pod cannot leak origin credentials, because the pod never had them.
- Narrow network surface. The application's only outbound data dependency is the loopback interface. Network policy can (and should) pin the sidecar's egress to the Spice cluster endpoint only. No direct connectivity to databases, warehouses, or the public internet is required for the data plane.
- Per-tenant / per-application data views. Sidecars can be specialised per application class or per tenant. A customer-service agent, a fraud-review agent, and an internal dashboard can each run pods with different spicepods pointing at different slices of the same cluster, without any code change to the application itself. This is physical tenant isolation, not policy-based filtering on a shared database. Each sidecar's catalog is a separate, bounded surface that can be reviewed, diffed, and tested independently.
- Bounded resource use. A rogue query plan or a runaway loop exhausts the sidecar's local memory and CPU budget, not the cluster's. Delegated queries hit the cluster's multi-tenant fair-scheduling; they can't saturate Postgres. Policy-based isolation can't bound resource consumption this way: a poorly scoped query against a shared database can still exhaust connection pools or scan entire tables, even if the result set is filtered.
- LLM inference stays local too. Sidecars can serve [model inference and tool calls](/platform/llm-inference) on loopback, so sensitive prompts, tool arguments, and retrieved context don't leave the pod for low-latency paths. Heavier models can still be routed to the cluster.
- Auditability. Because every query flows through the sidecar, you get one well-known place to log, rate-limit, and enforce policy on what the application is actually doing, regardless of how it decided to ask.

The data flow is unambiguous: application -> sidecar -> (optionally) cluster -> origin. Data only moves back along that path; it never skips a tier. That's the security boundary that production systems need and don't typically get from a direct-to-database setup. For more on how Spice isolates agent workloads, see the [secure AI agents](/use-case/secure-ai-agents) use case.

## Why split the tiers

Splitting ingestion, acceleration, and distributed compute from local caching is the other key design decision. It's what makes this architecture scale where naive alternatives don't. The cluster side is object-storage-native by design: coordination state, acceleration files, and failover metadata all persist to S3-compatible object storage rather than local disk or an external database. That means cluster nodes are stateless and recoverable, and the sidecar tier scales independently without coupling to the cluster's storage.

### Sidecars stay lightweight

A sidecar's job is to hold a working set, answer queries from it, and forward everything else to the cluster. It leaves refresh, Cayenne acceleration builds, and long-lived connections to Postgres, S3, DynamoDB, and Kafka entirely to the cluster tier.

That means a sidecar:

- Starts in seconds, important when application pods autoscale aggressively with traffic.
- Runs on a few hundred megabytes of memory.
- Scales 1:1 with application pods: go from 5 replicas to 50 and 50 sidecars come up automatically, each with the right scoped working set.
- Doesn't add 50 new connections to your source database when the fleet scales out.

### The cluster ingests once

Refreshing from upstream data sources, running Cayenne acceleration on large Iceberg tables, and keeping CDC streams (like [DynamoDB Streams](/blog/real-time-acceleration-with-dynamodb-streams), [Postgres logical replication](https://spiceai.org/docs/faq#17-does-spice-support-change-data-capture-cdc), Debezium, or Kafka consumers) connected are all resource-intensive operations. Doing any of that N times for N sidecars is wasteful and often infeasible. Many source systems have hard connection limits, and per-pod CDC multiplies cloud costs linearly with fleet size.

The cluster ingests each dataset once, producing one authoritative materialization that every sidecar gets a consistent view of. Source load is bounded by your cluster size, not your fleet size. Refreshes, backfills, and large initial loads all happen once on the cluster rather than N times across the fleet, and CDC-backed datasets stay in sync with bounded lag. The cluster is also the single place to reason about data freshness: if you need to know when a dataset was last refreshed from Postgres, the answer is the same for every sidecar.

This makes bootstrap efficient too. A new pod's sidecar pulls its working set from the cluster (which already has the data hot) rather than re-scanning the source. An alternative bootstrap mechanism is [acceleration snapshots](#acceleration-snapshots-single-writer-many-readers), where the cluster writes pre-built acceleration files to object storage and sidecars download them on startup (see also the [DynamoDB Streams deep dive](/blog/real-time-acceleration-with-dynamodb-streams) for an end-to-end example). Either way, new nodes are operational in seconds, not minutes.

### Query delegation uses Arrow Flight end-to-end

Sidecar-to-cluster communication is Arrow Flight over gRPC. Results flow as Arrow record batches directly into the sidecar's query engine with no serialization detour through JSON or row-based wire formats. Zero-copy materialization into Arrow is a core performance principle of Spice; Arrow Flight preserves that boundary across the network.

The sidecar decides locally whether a query can be served from its working set. If not, it forwards and streams results back. The application sees one endpoint and one query. It never knows or cares where execution happened, or whether Ballista fanned the query out across ten cluster nodes to answer it.

## The cluster tier: Ballista + Spice Cayenne

The value of a sidecar is only as good as the cluster behind it. Two pieces of the Spice stack do most of the heavy lifting there: Apache Ballista for distributed query execution, and Spice Cayenne for scale-out acceleration.

### Apache Ballista: distributed SQL execution

Spice's cluster mode uses [Apache Ballista](https://datafusion.apache.org/ballista/) to execute DataFusion query plans across multiple nodes. When a sidecar delegates a query (say, a join across a 500-million-row orders table and a 10-billion-row events table), the cluster's scheduler splits the plan into stages, distributes them across executor nodes, shuffles intermediate results, and streams the final result back over Arrow Flight.

Upstream Ballista uses a single-scheduler architecture; Spice extends it for production with multi-active HA and object-storage-native persistence (detailed below). From the sidecar's perspective, delegation looks identical to talking to a single node. From the operator's perspective, the cluster scales horizontally (add executor nodes when analytical workload grows), and because everything is Arrow-native, shuffles move columnar data without row-by-row serialization. Delegated queries don't have a soft ceiling: a sidecar can safely hand off an expensive query because the cluster has the parallelism to answer it.

Production characteristics:

- Multi-active schedulers, no single point of failure. Multiple scheduler instances run concurrently; any can handle any query. Failover is automatic and doesn't require a separate consensus service.
- mTLS for inter-node communication. Scheduler-to-executor communication within the cluster is mutually authenticated and encrypted on the wire.
- Object-storage-native persistence. Cluster state, acceleration snapshots, and Cayenne files persist to S3-compatible object storage. Nodes are stateless and recoverable; a restarted node comes back online in seconds without re-ingesting from source.
- Spice Kubernetes Operator. Automated deployment, zero-downtime rolling upgrades, health checks, and Prometheus metrics out of the box.

This is the engine that lets Spice replace Spark-class workloads: the same distributed compute surface, but with full SQL, local acceleration, hybrid search, and LLM inference in one system instead of a stack of integrations.

### Cayenne: acceleration that scales past 1 TB

For the cluster's accelerated datasets, Spice uses [Cayenne](https://spiceai.org/docs/components/data-accelerators/cayenne), an acceleration engine built on [Vortex](https://github.com/vortex-data/vortex), a next-generation open-source columnar format from the Linux Foundation.

Vortex runs compute kernels directly on encoded data, so many predicates and projections execute without ever decompressing. When decompression is required, data lands directly in Arrow arrays with no intermediate copy. Compared to Parquet, Vortex delivers roughly 100x faster random access reads and 10-20x faster scans, which is exactly the access pattern an operational data lakehouse produces: lots of selective lookups, lots of segment pruning, hot repeated queries.

Cayenne pairs Vortex files with per-segment min/max/null-count statistics (zone-map equivalents) and fast random-access encodings like FSST for strings, FastLanes for integers, and ALP for floats. The net effect is that the cluster can accelerate datasets well past 1 TB (comfortably beyond where DuckDB file mode tops out) while still answering point lookups and small range queries fast enough to be useful as a hot backend for sidecars. The entire acceleration tier is object-storage-native: Cayenne persists Vortex files to S3-compatible object storage (including S3 Express One Zone for single-digit-millisecond first-byte latency), so accelerated data is durable across cluster restarts and nodes are stateless and recoverable.

Sidecars don't need to run Cayenne themselves. They materialize a smaller working set into a lightweight engine (Arrow in-memory, DuckDB, or SQLite) and let the cluster handle the heavyweight acceleration tier. That's the right division of labor: Vortex and Cayenne where the data volume demands it, embedded engines where latency demands it.

### Acceleration snapshots: single writer, many readers

The cluster-sidecar split maps directly onto Spice's [acceleration snapshots](https://spiceai.org/docs/features/data-acceleration/snapshots) feature. Snapshots let you persist a pre-built acceleration file to object storage (S3, GCS, or local filesystem) and reuse it on startup instead of refreshing from source, turning a minutes-long cold start into a seconds-long file download.

In the hybrid model, snapshots have a natural single-writer / multiple-reader topology:

- The **cluster** is the single writer. It uses `snapshots: create_only` on each accelerated dataset. After every refresh (or on a configured interval), the cluster uploads a new snapshot of the acceleration file to object storage. The cluster never downloads snapshots on startup; it always refreshes from the authoritative source.
- Each **sidecar** is a reader. It uses `snapshots: bootstrap_only` on its local DuckDB or SQLite acceleration. On startup (or when the sidecar's ephemeral NVMe is recycled), the sidecar downloads the most recent snapshot from object storage and is immediately ready to serve queries. The sidecar never writes snapshots back; the cluster is the single source of truth.

This avoids snapshot conflicts (multiple writers racing to upload), keeps the cluster as the authoritative refresh point, and gives every sidecar in the fleet fast, consistent bootstraps from the same materialization.

```mermaid
flowchart LR
  Sources["Data Sources<br/>PostgreSQL, S3, Kafka, ..."]
  Cluster["Spice Cluster<br/>(single writer)"]
  S3["Object Storage<br/>S3 / GCS"]
  Sidecar1["Sidecar A<br/>(bootstrap_only)"]
  Sidecar2["Sidecar B<br/>(bootstrap_only)"]
  SidecarN["Sidecar N<br/>(bootstrap_only)"]

  Sources -->|"refresh (CDC / scheduled)"| Cluster
  Cluster -->|"create_only: upload snapshot"| S3
  S3 -->|"download on startup"| Sidecar1
  S3 -->|"download on startup"| Sidecar2
  S3 -->|"download on startup"| SidecarN
```

The cluster-side spicepod for a snapshot-enabled dataset looks like:

```yaml
snapshots:
  enabled: true
  location: s3://my-bucket/spice-snapshots/
  params:
    s3_auth: iam_role

datasets:
  - from: postgres:public.orders
    name: orders
    acceleration:
      enabled: true
      engine: duckdb
      mode: file
      snapshots: create_only # Write snapshots, never download
      snapshots_trigger: refresh_complete
      snapshots_compaction: enabled # Compact before upload
      params:
        duckdb_file: /nvme/orders.db
```

The sidecar-side spicepod for the same dataset:

```yaml
snapshots:
  enabled: true
  location: s3://my-bucket/spice-snapshots/
  bootstrap_on_failure_behavior: warn # Fall back to empty if no snapshot
  params:
    s3_auth: iam_role

datasets:
  - from: spice.ai/<your-org>/<your-app>/datasets/orders
    name: orders
    acceleration:
      enabled: true
      engine: duckdb
      mode: file
      snapshots: bootstrap_only # Download on startup, never write
      params:
        duckdb_file: /nvme/orders.db
```

On a fresh pod, the sidecar downloads the cluster's latest snapshot, opens the DuckDB file, and starts serving queries, all before the first refresh from the cluster completes. Subsequent refreshes pull incremental updates from the cluster as usual. If the snapshot is unavailable (first deploy, S3 blip), the sidecar falls back to an empty acceleration and catches up on the next refresh cycle.

This pattern is especially valuable on Kubernetes with ephemeral NVMe instance storage: pods lose their local disk on every restart, but the snapshot gives them a warm start without re-pulling the full dataset from the cluster. For CDC-backed datasets with large initial state, the difference between a snapshot bootstrap and a full re-sync can be the difference between a pod being ready in 5 seconds and 5 minutes.

## Results caching: the third latency tier

Spice has one more lever that fits naturally into the hybrid model: the [results cache](https://spiceai.org/docs/features/caching).

Both the cluster and the sidecar have an in-memory LRU (or TinyLFU) results cache for SQL queries, search results, and embeddings. It's enabled by default on HTTP (`/v1/sql`, `/v1/search`) and Arrow Flight endpoints. On a cache hit, the response header reports `Results-Cache-Status: HIT` and the query doesn't re-execute for the lifetime of that cache entry.

That gives you three latency tiers on a single deployment:

1. Sidecar results cache. Repeat queries against the sidecar return from cache in microseconds. No query execution, no local scan.
2. Sidecar working set. Novel queries that can be answered from the locally materialized dataset execute on-node in single-digit milliseconds.
3. Cluster delegation. Queries that exceed the working set are forwarded to the cluster, where Ballista runs them distributed and Cayenne accelerates the scans. The sidecar can then cache the result for subsequent reads, pulling them back into tier 1.

A few of the knobs matter in production and are worth calling out:

- `cache_key_type: plan` vs `sql`. The default `plan` cache key uses the query's logical plan, so semantically equivalent queries share a cache entry even if the SQL text differs, which matters for ORM-generated queries where whitespace and column order drift. `sql` is a faster lookup but string-exact.
- `Spice-Cache-Key` header. When your application knows two queries should share a result (for example, a templated query rendered two ways), it can supply an explicit cache key and bypass the plan hash altogether.
- Stale-while-revalidate. Setting `stale_while_revalidate_ttl` lets the sidecar serve a stale cached result immediately (with `Results-Cache-Status: STALE`) while a background task refreshes the entry. For user-facing latency this is usually the right default once you're willing to accept a bounded freshness window.
- `Cache-Control` directives. Clients can opt in per-request: `no-cache` to skip the cache, `only-if-cached` to fail on miss (useful for read-your-writes gating), `stale-if-error=600` to serve cached results for up to 10 minutes if the fresh fetch fails. Works over HTTP and Arrow FlightSQL.
- `encoding: zstd`. Compressing cache entries with zstd typically cuts memory use by 50-90%, letting the cluster's results cache hold substantially more distinct queries at the same footprint.

Results caching is where the tiers collapse for the application. A sidecar miss becomes a cluster call, and that cluster result becomes a sidecar cache entry, so subsequent reads from any pod in the Deployment return in microseconds. The cluster's own cache amplifies this further: with many sidecars delegating overlapping queries, one sidecar's miss becomes a cluster cache hit for every subsequent sidecar. The application-visible p50 settles at tier 1, p95 at tier 2, and only tail latency touches tier 3.

## Engineering decisions

Three decisions shape how this architecture behaves in production.

### 1. Declarative sidecar configuration

Every sidecar is configured through a `spicepod.yaml` that declares the datasets, views, acceleration engines, search indices, and models it manages. That's the same declarative model the cluster uses. There's no imperative "register this table at startup" API, and no coordination service that sidecars check in with at boot.

This matters because sidecars are cattle, not pets. A new pod gets its sidecar from the same manifest as every other pod. If you need to change what a sidecar materializes, you change the spicepod and roll the deployment. Every pod converges on the same manifest, eliminating drift and special cases.

It also means the sidecar is safe to treat as part of the application deployment artifact: versioned, reviewed, rolled out with the same process as the service it sits next to.

### 2. Cache coherency is a refresh policy, not a protocol

Sidecars pull from the cluster on a configurable interval using append or full refresh strategies. They do not participate in a distributed invalidation protocol. This is deliberate.

Distributed cache invalidation is hard, and the failure modes are worse than stale data for most workloads. A pull-based model with explicit refresh intervals makes staleness bounded, predictable, and debuggable. Teams pick the interval that matches their freshness requirements (seconds for configuration-like data, minutes for analytical rollups), and the system stays simple.

For workloads that need sub-second freshness, the cluster consumes CDC streams (DynamoDB Streams, Debezium, Kafka) and the sidecars pull the resulting accelerated dataset on a short interval. That gives you near-real-time propagation without a fleet-wide invalidation bus.

### 3. Resilience through local state

If the cluster is temporarily unavailable (a rolling upgrade, a network blip, a zone event), sidecars keep serving cached data and their accelerated working sets. Refreshes pause and resume when connectivity returns. Applications don't fail because the central tier is briefly unreachable; they just see slightly staler data.

This is a significant operational property. It means the blast radius of a cluster incident is "retrieved context gets slightly stale" rather than "every application goes down." And because the sidecar is the only endpoint the application ever talked to, there's no fallback logic to write in the application itself.

## Putting it together: a request path

Let's walk through a request from the sidecar's perspective, using an AI agent as the example (the flow is the same for any application):

1. The agent needs context to answer a user message. It calls its sidecar on `localhost:8090` with a tool call: `SELECT ... FROM orders WHERE tenant_id = $1 ORDER BY created_at DESC LIMIT 20`.
2. The sidecar checks its results cache. Hit → return in microseconds, header `Results-Cache-Status: HIT`. The agent uses the result as grounding context and proceeds to the LLM call.
3. On a miss, the sidecar plans the query against its local catalog. `orders` is materialized locally (refreshed from the cluster every 10 seconds). The sidecar executes against DuckDB, returns in single-digit milliseconds, and populates its results cache. The origin Postgres sees no traffic.
4. The agent follows up with a hybrid search for "find similar past tickets", a combined full-text + vector query over a multi-gigabyte `tickets` index.
5. The sidecar's catalog shows `tickets` as a cluster-resident dataset with no local materialization. It opens an Arrow Flight stream to the cluster. Ballista distributes the search across executor nodes; Cayenne's segment statistics prune most Vortex files.
6. Results stream back as Arrow record batches. The sidecar materializes them, returns to the agent, and caches the result with the configured TTL. The agent passes the retrieved context into the LLM call.
7. The agent then asks the sidecar for an LLM inference with tool use. The sidecar serves a small local model on loopback for the routing step and delegates the large-model call to the cluster's inference pool.
8. The cluster independently caches its own query and inference results. The next replica that asks the same question gets it from the cluster cache. No re-execution, no re-inference.

Every step is Arrow-native end to end. The application sees one endpoint, one wire format, and one latency distribution. What's actually happening underneath is a coordinated dance between a sandboxed local engine, three caching tiers, a distributed executor, an inference pool, and a columnar accelerator.

## When to use it

The cluster-sidecar architecture is the right fit when:

- You're running AI agents, LLM-backed features, or data-intensive services and want fast, unified retrieval (SQL, full-text, vector, hybrid) plus inference on `localhost`, without giving the application direct database credentials.
- You need a clear isolation boundary between application code and your data systems, including scoped catalogs, policy enforcement, and one audit point per pod. This is especially critical for AI agents, which generate their own queries autonomously.
- Multiple application or agent replicas need fast access to the same datasets and you want one ingestion path, not N.
- You want to shield upstream data sources from application query volume: the cluster ingests once, sidecars sandbox the application, and results caching deduplicates repeat work.
- Workloads span real-time operational retrieval and large-scale analytics on the same underlying data, the [operational data lakehouse](/use-case/operational-data-lakehouse) on S3 / Iceberg pattern.
- You're running on Kubernetes and already use the sidecar pattern for other concerns (service mesh, logging, config).

It's not the right fit when:

- You have a single application instance and no multi-tenant or isolation requirement: a standalone [Sidecar](https://spiceai.org/docs/deployment/architectures/sidecar) deployment is simpler.
- All queries are batch or analytical with relaxed latency: a [Microservice](https://spiceai.org/docs/deployment/architectures/microservice) deployment is enough.
- Network connectivity between sidecars and cluster is unreliable: delegation needs a working path back to the origin.

## A concrete example: a multi-tenant agent platform

The architecture applies to any multi-replica deployment, but AI agents are where the sandboxing properties shine brightest. Here's a concrete example. For a deeper look at multi-tenant agent isolation, see [Multi-Tenancy for AI Agents Without Pipelines](/blog/multi-tenancy-for-ai-agents-without-pipelines).

A multi-tenant SaaS platform runs an AI support agent. Each tenant gets a dedicated set of agent pods. Every agent pod has a Spice sidecar that:

- Materializes the tenant's working set (recent tickets, active customer records, the last 7 days of events, the tenant's private knowledge-base embeddings) into a local DuckDB + vector index.
- Exposes exactly those datasets, and no others, to the agent through a scoped spicepod.
- Serves the routing-model LLM call locally on loopback; delegates the large-model call to the cluster.
- Holds no credentials for Postgres, S3, Snowflake, or the tenant-shared embedding store.

Agent turns hit the sidecar on `localhost` and return in single-digit milliseconds; repeat retrieval calls return from the sidecar's results cache in microseconds. The user feels a single-pass response instead of a retrieval-stall-then-answer.

Behind the sidecars, a Spice cluster (in this case, Spice Cloud) ingests from PostgreSQL (via CDC), S3 (Iceberg tables), and Databricks. Cayenne acceleration builds run on the cluster on a schedule, with the larger tables (a multi-billion-row events table and a 2-TB Iceberg knowledge corpus) materialized into Vortex files on NVMe-backed nodes (with S3 Express One Zone as the persistent tier). The cluster also runs the shared large-model inference pool.

When an agent asks a broader question ("summarize this tenant's churn signal across the last 12 months"), the sidecar recognises the query exceeds its working set and delegates over Arrow Flight. Ballista plans and distributes it across cluster executors. Cayenne's segment statistics prune most of the 2 TB away. The result streams back as Arrow batches. The sidecar caches it with a 1-minute TTL and a 30-second stale-while-revalidate window. The next ten agent turns for that tenant return in microseconds; the eleventh triggers a background refresh without blocking the user. The same query from a _different_ tenant's agent benefits from the cluster's own results cache, so a 2-TB scan happens at most once per freshness window across the whole fleet.

Meanwhile, the origin Postgres sees exactly one consumer (the cluster) and the agent pods have exactly one outbound data dependency (their own sidecar). If a replica is compromised, the attacker gets a loopback endpoint scoped to that tenant's working set, not database credentials and not a query interface to the whole warehouse.

The same pattern (single ingestion path, per-pod sandboxing, tiered latency, one isolation boundary) works for any application fleet, not just agents: microservices serving real-time dashboards, services powering search, or internal tools querying operational data.

## A minimal spicepod illustrating the pattern

The cluster side materializes and accelerates a large dataset with Cayenne, consumes CDC from Postgres, and exposes a results cache:

```yaml
version: v1
kind: Spicepod
name: platform-cluster

runtime:
  caching:
    sql_results:
      enabled: true
      cache_max_size: 4GiB
      item_ttl: 1m
      stale_while_revalidate_ttl: 30s
      encoding: zstd

datasets:
  - from: postgres:public.orders
    name: orders
    acceleration:
      enabled: true
      engine: cayenne
      mode: file
      refresh_mode: changes
      primary_key: id
      on_conflict:
        id: upsert
      params:
        cayenne_compression_strategy: btrblocks
        cayenne_footer_cache_mb: 512
        cayenne_segment_cache_mb: 1024

  - from: s3://lakehouse/events/
    name: events
    params:
      file_format: parquet
    acceleration:
      enabled: true
      engine: cayenne
      mode: file
      refresh_mode: append
      refresh_check_interval: 15m
      params:
        sort_columns: event_time,user_id
```

The sidecar side is much smaller. It pulls from the cluster, keeps a working-set engine local, and caches results:

```yaml
version: v1
kind: Spicepod
name: app-sidecar

runtime:
  caching:
    sql_results:
      enabled: true
      cache_max_size: 256MiB
      item_ttl: 30s
      stale_while_revalidate_ttl: 30s

datasets:
  - from: spice.ai/<your-org>/<your-app>/datasets/orders
    name: orders
    acceleration:
      enabled: true
      engine: duckdb
      mode: file
      refresh_mode: append
      refresh_check_interval: 10s

  - from: spice.ai/<your-org>/<your-app>/datasets/events
    name: events
    # No local acceleration - delegate to cluster on demand.
    # Queries that match recent hot events still hit the results cache.
```

Two manifests. Everything else (shuffle plumbing, Cayenne file layout, CDC checkpointing, results cache keying, Arrow Flight transport) is handled by Spice.

## The Spice Cloud hybrid model

The cluster-sidecar architecture gives you optionality in where each tier runs: not just how it's deployed, but who operates it. The tier that benefits most from being managed is the cluster. Scheduler tuning, capacity planning, failover drills, upgrade choreography, and observability for a distributed SQL engine are real operational commitments. The tier that benefits most from staying close to your application is the sidecar. That's the whole point of loopback latency.

[Spice Cloud](https://spiceai.org/docs/deployment/architectures/hosted) splits those responsibilities:

- Spice Cloud operates the cluster: a fully managed, multi-node Spice cluster with high-availability distributed query, Cayenne acceleration, hybrid search, and LLM inference. SOC 2 Type II, automatic scaling, built-in monitoring, and enterprise SLAs, without running a scheduler or executor node yourself.
- Your sidecars run where your applications live in your Kubernetes clusters, VPCs, on-premises data centers, or edge locations. Each sidecar connects to the Spice Cloud cluster encrypted in transit and at rest, and transparently delegates queries it can't serve from its local working set. The heavy compute (terabyte-scale scans, distributed joins, cross-dataset search, large aggregations) runs on managed infrastructure. The latency-sensitive reads stay on `localhost` inside your security perimeter. Your data stays in your object storage; Spice Cloud makes it fast and queryable.

For teams that want the operational properties of a managed distributed engine without giving up data locality or the ability to keep sidecars inside a regulated environment, this is usually the right topology. It's also incremental: start with sidecars pointed at Spice Cloud, and scale the cluster tier up or down as analytical load changes, without touching the application side.

## Self-hosted at enterprise scale: Spice.ai Enterprise

For organizations that need to run the whole cluster-sidecar stack inside their own environment (regulated industries, air-gapped networks, on-prem data centers, sovereign cloud), [Spice.ai Enterprise](https://docs.spice.ai/docs/enterprise) is the self-hosted, production-grade distribution of Spice designed to manage and scale an application-serving fleet.

Enterprise extends the open-source runtime with the pieces a platform team needs to run Spice as a shared service across an organization:

- Kubernetes Operator for management and scale. Automated deployment, autoscaling, zero-downtime rolling upgrades, and lifecycle management of sidecars and clusters through pod annotations and CRDs. Declarative scale-up and scale-down of the application fleet, the cluster tier, or both, without hand-operating scheduler or executor nodes.
- Multi-active HA clustering. Multi-node distributed query on Apache Ballista with automatic failover, mTLS between cluster nodes, and auto-provisioned cluster certificates.
- Authentication: OIDC, API keys, identity SQL functions. Applications and agents authenticate with OIDC bearer tokens or scoped API keys. Identity-aware SQL functions make the authenticated principal queryable inside policies and views, which is the foundation for per-tenant and per-application row-level scoping.
- Policy and authorization. Enforce per-dataset, per-view, and row-/column-level access rules centrally. The sidecar is the one place each application's requests flow through, which makes policy both simple to express and impossible to bypass.
- Audit logging. Every query, search, and inference call is logged with identity, dataset, and policy decision. You get one canonical audit trail of what every application or agent asked, what it was allowed to see, and what was returned, which is what compliance actually wants to see.
- Enterprise distributions. NAS (SMB/NFS), CUDA GPU-accelerated inference, data-only, and ODBC-connector builds, so the same cluster-sidecar architecture runs on the hardware and networks you already have.
- Operational assurance. SOC 2 Type II, tiered security updates with up to 3 years of guaranteed patches, 99.9%+ uptime SLA, and 24/7 premium support via Slack Connect, email, and pager.

Enterprise adds the identity, policy, audit, and operator tooling a platform team needs to run the cluster-sidecar model at fleet scale on their own infrastructure.

## Getting started

The hybrid architecture is documented at [spiceai.org/docs/deployment/architectures/hybrid](https://spiceai.org/docs/deployment/architectures/hybrid). It works with [Spice.ai open source](https://github.com/spiceai/spiceai), [Spice.ai Enterprise](https://docs.spice.ai/docs/enterprise) (self-hosted, with the K8s Operator, OIDC, policy, and audit logging described above), and the managed [Spice Cloud](https://spiceai.org/docs/deployment/architectures/hosted) Platform.

If you're running Spice on Kubernetes today and want to evolve from standalone sidecars or a centralized cluster into the hybrid model, the migration path is incremental: the same spicepod manifests work in both tiers, and you can move ingestion, Cayenne acceleration, and distributed query to the cluster one dataset at a time.

Ready to evaluate it on your own workload? See the [Spice.ai platform overview](/platform/sql-federation-acceleration), compare editions on [pricing](/pricing), or [get a demo](/get-a-demo) to talk through your architecture with the Spice team.

Related reading:

- [Spice Cayenne data accelerator](https://spiceai.org/docs/components/data-accelerators/cayenne)
- [Vortex at Spice AI: the columnar format for data-intensive workloads](/blog/vortex-at-spice-ai-the-columnar-format-for-data-intensive-workloads)
- [Real-time control plane acceleration with DynamoDB Streams](/blog/real-time-acceleration-with-dynamodb-streams)
- [Caching](https://spiceai.org/docs/features/caching)
- [Acceleration snapshots](https://spiceai.org/docs/features/data-acceleration/snapshots)
- [Data acceleration](https://spiceai.org/docs/features/data-acceleration)

If you want to dig deeper, ask questions, or share what you're building, [join the Spice community on Slack](https://spice.ai/slack).

<ContentRichText
  fields={{
    coverage: 'rc-end',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<AccordionFaq
  fields={{
    heading: 'Cluster-Sidecar Architecture FAQ',
    paragraph: '',
    items: [
      {
        title: 'What is the Spice cluster-sidecar architecture?',
        paragraph:
          '<p>It is a hybrid deployment model where a lightweight Spice sidecar runs inside each application pod, serving SQL, search, and inference on <code>localhost</code> from a scoped working set, while a central Spice cluster handles ingestion, acceleration, distributed query execution, and refresh. The application sees one endpoint; Spice transparently decides whether to serve locally, delegate to the cluster, or return a cached result.</p>',
      },
      {
        title:
          'How is sidecar isolation different from row-level security (RLS)?',
        paragraph:
          "<p>RLS filters data at query time. The underlying tables are still present, and a single policy misconfiguration can silently expose them. A sidecar's isolation is structural: its <code>spicepod.yaml</code> declares exactly which datasets exist in the catalog. Anything not declared is physically absent, so there is no rule to misconfigure. The sidecar also bounds resource consumption per pod, which policy-based approaches on a shared database cannot do.</p>",
      },
      {
        title: "What happens when a sidecar can't answer a query locally?",
        paragraph:
          '<p>The sidecar transparently forwards the query to the cluster over Arrow Flight (gRPC). The cluster executes it (potentially distributing it across multiple nodes with Apache Ballista) and streams the result back as Arrow record batches. The sidecar caches the result for subsequent reads. The application never knows delegation happened.</p>',
      },
      {
        title:
          'Does the application need credentials to the underlying data sources?',
        paragraph:
          '<p>No. The application connects to its sidecar with a local token. The sidecar connects to the cluster. Only the cluster holds credentials for Postgres, Snowflake, S3, Kafka, and other data systems. Compromising an application pod cannot leak origin credentials because the pod never had them.</p>',
      },
      {
        title: 'How does a sidecar refresh its working set from the cluster?',
        paragraph:
          '<p>Sidecars pull from the cluster on a configurable interval using append or full refresh strategies. For CDC-backed datasets, the cluster consumes the change stream once and sidecars pull the resulting accelerated dataset on a short interval. Acceleration snapshots provide an alternative bootstrap path: the cluster writes pre-built files to object storage, and sidecars download them on startup for a warm start in seconds.</p>',
      },
      {
        title: 'What happens if the cluster goes down?',
        paragraph:
          '<p>Sidecars continue serving queries from their local working set and results cache. Refreshes pause and resume when connectivity returns. The blast radius of a cluster outage is slightly staler data, not application downtime. A <code>stale-if-error</code> cache directive can extend this further by serving last-known-good results for delegated queries.</p>',
      },
      {
        title: 'Can I run the cluster as a managed service?',
        paragraph:
          '<p>Yes. <a href="https://spiceai.org/docs/deployment/architectures/hosted">Spice Cloud</a> is a fully managed cluster with high-availability distributed query, Cayenne acceleration, hybrid search, and LLM inference. Your sidecars run in your own infrastructure and connect to Spice Cloud for delegation. For organizations that need the full stack on-premises, <a href="https://docs.spice.ai/docs/enterprise">Spice.ai Enterprise</a> provides the same architecture with a Kubernetes Operator, OIDC authentication, policy enforcement, and audit logging.</p>',
      },
      {
        title:
          'How is a Spice sidecar different from a Redis or Memcached cache?',
        paragraph:
          '<p>A Spice sidecar is a queryable data engine with a materialized working set, not a key-value store. It answers SQL, full-text, and vector queries it has never seen before, while a cache can only return results an application previously stored under a key. It also replaces hand-written invalidation logic with pull-based refresh from the cluster, so freshness is a configured interval rather than application code. The broader trade-off is covered in <a href="/learn/caching-vs-data-acceleration">caching vs data acceleration</a>.</p>\n',
      },
      {
        title: 'How does Spice apply the sidecar pattern?',
        paragraph:
          '<p>Spice applies the sidecar pattern to the data plane: a Spice instance deploys alongside the application in the same host or Kubernetes pod and serves query, search, and inference over local loopback from a scoped working set. See <a href="/learn/sidecar-pattern">the sidecar pattern</a> for the general concept and when it fits.</p>\n',
      },
      {
        title: 'Do I need Kubernetes to run the cluster-sidecar architecture?',
        paragraph:
          '<p>No, the architecture requires only a network path from each sidecar to the cluster. Sidecars run wherever the application runs: Kubernetes clusters, VPCs, on-premises data centers, or edge locations. Kubernetes is the most common fit because the Spice Kubernetes Operator automates deployment, health checks, and zero-downtime rolling upgrades, but nothing in the topology depends on it.</p>\n',
      },
      {
        title: 'Does every sidecar store a full copy of the dataset?',
        paragraph:
          "<p>No, each sidecar materializes only the working set its spicepod declares, such as recent rows or a single tenant's slice, and typically runs on a few hundred megabytes of memory. Full accelerated datasets stay on the cluster, and queries that exceed the working set are delegated rather than stored locally. Sidecar count therefore scales with the application fleet without multiplying storage.</p>\n",
      },
      {
        title: 'Which local engine should a sidecar use for its working set?',
        paragraph:
          '<p>Sidecars materialize their working set into a lightweight engine: Arrow in-memory, DuckDB, or SQLite. If the deployment uses acceleration snapshots for warm starts, choose DuckDB or SQLite in file mode, since snapshots persist and restore the acceleration file itself. Heavyweight Cayenne acceleration stays on the cluster, where data volume justifies it.</p>\n',
      },
      {
        title: 'Can sidecars communicate with each other?',
        paragraph:
          "<p>No, sidecars only ever talk to the cluster, never to each other. Data flows along a single path, from application to sidecar to cluster to origin, with no peer-to-peer replication and no fleet-wide invalidation bus. This keeps failure modes predictable: each sidecar's behavior depends only on its own working set and its connection to the cluster.</p>\n",
      },
      {
        title: 'What data sources can the cluster connect to?',
        paragraph:
          '<p>The cluster connects to operational databases, data lakes, warehouses, and streams, including PostgreSQL, S3, Iceberg, Snowflake, Databricks, DynamoDB, and Kafka. It ingests each dataset once and serves every sidecar from that single materialization, so source connection counts are bounded by cluster size rather than fleet size. For lake-resident data, this is the same mechanism as <a href="/use-case/datalake-accelerator">data lake acceleration</a>, applied behind a sidecar fleet.</p>\n',
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

---

## Spice AI Announces Contribution of TableProviders for PostgreSQL, MySQL, DuckDB, and SQLite to the Apache DataFusion Project
URL: https://spice.ai/blog/contribution-of-tableproviders-to-datafusion
Date: 2024-07-04T19:11:00
Description: Spice AI has contributed new TableProviders for PostgreSQL, MySQL, DuckDB, and SQLite to the Apache DataFusion project.

<ContentRichText
  fields={{
    coverage: 'rc-start',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Spice AI has&nbsp;<a href="https://github.com/datafusion-contrib/datafusion-table-providers/pull/2">contributed new TableProviders</a>&nbsp;for PostgreSQL, MySQL, DuckDB, and SQLite to the Apache DataFusion project. This addition reflects our commitment to building together in the data and AI ecosystem and supporting the open-source community.</p>'
  }
/>

<CoreBlock
  name="core-heading"
  content={'<h2 class="wp-block-heading h4">What is Apache DataFusion?</h2>'}
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p><a href="https://datafusion.apache.org/">Apache DataFusion</a>&nbsp;is a high-performance query engine built on Apache Arrow. It allows you to execute SQL queries quickly and efficiently on data stored in various formats. By using the in-memory columnar format of Apache Arrow, DataFusion speeds up data processing and works natively with other Arrow-based tools.</p>'
  }
/>

<CoreBlock
  name="core-heading"
  content={'<h2 class="wp-block-heading h4">About the Spice OSS Project</h2>'}
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Spice OSS is an open-source project from Spice AI that provides developers with a unified SQL query interface to locally materialize, accelerate, and query datasets from any database, data warehouse, or data lake. Spice OSS incorporates Apache DataFusion as its&nbsp;SQL query engine. Learn more about <a href="/platform/sql-federation-acceleration">Spice SQL federation and acceleration</a>.</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Our goal with Spice OSS is to make data and AI-driven development more accessible. By contributing to projects like DataFusion and Arrow, we can help making accessing and using data better for everyone building in the space.</p>'
  }
/>

<CoreBlock
  name="core-heading"
  content={
    '<h2 class="wp-block-heading h4">New TableProviders for DataFusion</h2>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    "<p>We've initially added TableProviders for PostgreSQL, MySQL, DuckDB, and SQLite to DataFusion. This expands the range of data sources you can query using DataFusion. And we plan to add more in the future.</p>"
  }
/>

<CoreBlock
  name="core-list"
  content={
    '<ul class="wp-block-list"><li><strong>PostgreSQL</strong>: A robust and extensible open-source relational database.</li><li><strong>MySQL</strong>: A reliable and user-friendly open-source relational database.</li><li><strong>DuckDB</strong>: An in-process SQL OLAP database for analytical queries.</li><li><strong>SQLite</strong>: A lightweight, disk-based database commonly used in embedded systems.</li></ul>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>These new TableProviders make DataFusion even more versatile, allowing you to work with your existing databases and data lakes more easily.</p>'
  }
/>

<CoreBlock
  name="core-heading"
  content={'<h2 class="wp-block-heading h4">Our Commitment to Data and AI</h2>'}
/>

<CoreBlock
  name="core-paragraph"
  content={
    "<p>At Spice AI, we believe in the power of open-source and the potential of data and AI. By contributing to Apache DataFusion, we're helping to advance data processing technology and make powerful tools available to developers everywhere.</p>"
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>To learn more about Spice AI and our open-source projects, check out our&nbsp;<a href="https://github.com/spiceai/spiceai/blob/trunk/README.md">GitHub repository</a>. You can also explore Apache DataFusion at&nbsp;<a href="https://datafusion.apache.org/">datafusion.apache.org</a>.</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Stay tuned for more updates from Spice AI as we continue to contribute to the data and AI ecosystem.</p>'
  }
/>

<CoreBlock name="core-paragraph" content={'<p></p>'} />

<CoreBlock name="core-paragraph" content={'<p></p>'} />

These TableProviders power federated queries in Spice's [operational data lakehouse](/use-case/operational-data-lakehouse). To use them in production, [get a demo](/get-a-demo).

<ContentResourceFeatured
  fields={{
    heading: 'Explore more Spice resources',
    paragraph:
      'Tutorials, docs, and blog posts to help you go deeper with Spice.',
    mode: 'related',
    resources: false,
    padding_top: 'unset',
    padding_bottom: 'unset',
    related_posts: [],
  }}
/>

<TalkToAnEngineerCta />

<ContentRichText
  fields={{
    coverage: 'rc-end',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

---

## Announcing Our Partnership with Databricks!
URL: https://spice.ai/blog/databricks-partnership
Date: 2025-06-10T19:04:00
Description: Spice partners with Databricks to accelerate operational AI apps with fast SQL queries, Mosaic AI embeddings, and Unity Catalog governance.

<ContentRichText
  fields={{
    coverage: 'rc-start',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Today we&nbsp;<a href="https://www.businesswire.com/news/home/20250610750364/en/Spice-AI-Partners-With-Databricks-to-Extend-Operational-Data-AI-Capabilities-to-Real-Time-Applications-and-Agents">announced our partnership</a>&nbsp;with Databricks, the leading data and AI platform! We\'re also excited to roll out new integrations that support the Databricks platform, enabling customers to build faster and more reliable apps and agents that extend across cloud, on-premises, and edge.</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>New capabilities now available to Databricks customers include:</p>'
  }
/>

<CoreBlock
  name="core-list"
  content={
    '<ul class="wp-block-list"><li><strong>Databricks SQL Warehouse and Spark Connect</strong>&nbsp;integrations for high-performance SQL queries accelerated with DuckDB and SQLite.</li><li><strong>Databricks Mosaic AI model serving and embeddings</strong>&nbsp;integrations to bring MosaicAI alongside applications.</li><li><strong>Unity Catalog</strong>&nbsp;support for governance and security.</li><li><strong>Apache Iceberg &amp; Delta Lake</strong>&nbsp;support for query and management of open format tables via Unity Catalog.<strong>‍</strong></li><li><strong>Enterprise-grade security&nbsp;</strong>Service Principal M2M &amp; U2M OAuth authentication for enterprise-grade role-based security.</li></ul>'
  }
/>

<CoreBlock name="core-paragraph" content={'<p>‍</p>'} />

<CoreBlock
  name="core-paragraph"
  content={"<p>With Spice AI's integrations with Databricks, you can now:</p>"}
/>

<CoreBlock
  name="core-list"
  content={
    '<ul class="wp-block-list"><li><strong>Query Data For Operational Use-Cases</strong>: Execute fast, low-latency SQL queries across Databricks, on-premises, and edge sources with Spice.ai\'s unified engine, enabling real-time applications like inventory tracking or fraud detection.</li><li><strong>Embed AI With Applications</strong>: Integrate Databricks Mosaic AI model serving and embeddings with the Spice engine to deploy AI features, such as low-latency recommendation systems, search, or predictive maintenance.</li><li><strong>Streamline Data Governance</strong>: Manage Apache Iceberg and Delta Lake tables using Unity Catalog, enforcing secure access ensuring compliance and restricted data access.</li><li><strong>Optimize Workload Performance</strong>: Use Spice.ai to cache hot data, replicate high-demand datasets, and load-balance hosted AI endpoints, maintaining speed and resilience for applications like real-time dashboards.<br>‍</li></ul>'
  }
/>

<CoreBlock
  name="core-image"
  content={
    '<figure class="wp-block-image"><img src="https://cdn.prod.website-files.com/6362f59f9fd4ac355fc06eaf/685ac0c3eb1e4ea3ece8cfc9_Spice.ai%E2%80%A8Compute%E2%80%A8Engine.png" alt="Spice.ai Compute Engine"/><figcaption class="wp-element-caption">The Spice.ai Compute Engine</figcaption></figure>'
  }
/>

<CoreBlock
  name="core-heading"
  content={
    '<h2 class="wp-block-heading h5"><strong>Get Started Today</strong></h2>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p><a href="/partners/databricks">Spice AI\'s partnership with Databricks</a> is available now. Explore the following options to suit your needs:</p>'
  }
/>

<CoreBlock
  name="core-list"
  content={
    '<ul class="wp-block-list"><li><strong>Spice.ai Open Source</strong>: A single-node, open-source SQL query and AI-inference engine for developers.</li><li><strong>Spice.ai Enterprise</strong>: A scalable, multi-node solution for cloud or self-hosted Kubernetes, built for enterprise performance and scale.</li><li><strong>Spice Cloud Platform</strong>: A fully managed, cloud-hosted platform for building and scaling operational AI applications.</li></ul>'
  }
/>

<CoreBlock name="core-paragraph" content={'<p>‍</p>'} />

<CoreBlock
  name="core-paragraph"
  content={
    '<p>To try Spice.ai for yourself, visit:&nbsp;<a href="/login?from=landing">/login</a></p>'
  }
/>

<CoreBlock name="core-paragraph" content={'<p></p>'} />

Spice queries Databricks alongside other sources through [SQL query federation and acceleration](/platform/sql-federation-acceleration), including [data lake acceleration](/use-case/datalake-accelerator) for lakehouse tables. To discuss a Databricks deployment, [get a demo](/get-a-demo).

<ContentResourceFeatured
  fields={{
    heading: 'Explore more Spice resources',
    paragraph:
      'Tutorials, docs, and blog posts to help you go deeper with Spice.',
    mode: 'related',
    resources: false,
    padding_top: 'unset',
    padding_bottom: 'unset',
    related_posts: [],
  }}
/>

<TalkToAnEngineerCta />

<ContentRichText
  fields={{
    coverage: 'rc-end',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

---

## Getting started with Amazon S3 Vectors and Spice
URL: https://spice.ai/blog/getting-started-with-amazon-s3-vectors-and-spice
Date: 2025-07-31T21:35:21
Description: Learn how Spice AI integrates Amazon S3 Vectors for scalable, cost-effective vector search - combining semantic, full-text, and SQL queries in one runtime.

<ContentRichText
  fields={{
    coverage: 'rc-start',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<CoreBlock
  name="core-heading"
  content={'<h2 class="wp-block-heading h4">TLDR</h2>'}
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>The latest Spice.ai release (v1.5.0) brings major improvements to search, including native support for&nbsp;<strong>Amazon S3 Vectors</strong>. Announced in public preview at&nbsp;<a class="" href="https://www.aboutamazon.com/news/aws/aws-summit-agentic-ai-innovations-2025" target="_blank" rel="noreferrer noopener">AWS Summit New York 2025</a>, Amazon S3 Vectors is a new S3 bucket type purpose-built for vector embeddings, with dedicated APIs for similarity search.</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    "<p>Spice AI was a day 1 launch partner for S3 Vectors, integrating it as a scalable vector index backend. In this post, we explore how S3 Vectors integrates into Spice.ai's data, search, and AI-inference engine, how Spice manages indexing and lifecycle of embeddings for production vector search, and how this unlocks a powerful hybrid search experience. We'll also put this in context with industry trends and compare Spice's approach to other vector database solutions like Qdrant, Weaviate, Pinecone, and Turbopuffer.</p>"
  }
/>

<CoreBlock
  name="core-heading"
  content={
    '<h2 class="wp-block-heading h3"><strong>Amazon S3 Vectors Overview</strong></h2>'
  }
/>

<CoreBlock
  name="core-image"
  content={
    '<figure class="wp-block-image size-large"><img src="/website-assets/media/2025/07/S3-Vectors-Illustration-1024x243.png" alt="Amazon S3 Vectors workflow" class="wp-image-1810"/><figcaption class="wp-element-caption">Figure 1: Amazon S3 Vectors workflow</figcaption></figure>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Amazon S3 Vectors extends S3 object storage with native support for storing and querying vectors at scale. As AWS describes, it is&nbsp;<em>"designed to provide the same elasticity, scale, and durability as Amazon S3,"</em>&nbsp;providing storage of&nbsp;<strong>billions of vectors</strong>&nbsp;and sub-second similarity queries. Crucially, S3 Vectors dramatically lowers the cost of vector search infrastructure - reducing upload, storage, and query costs by&nbsp;<strong>up to 90%</strong>&nbsp;compared to traditional solutions. It achieves this by&nbsp;<strong>separating storage from compute</strong>: vectors reside durably in S3, and queries execute on transient, on-demand resources, avoiding the need for always-on, memory-intensive vector database servers. In practice, S3 Vectors exposes two core operations:</p>'
  }
/>

<CoreBlock
  name="core-list"
  content={
    '<ol class="wp-block-list"><li><strong>Upsert vectors</strong>&nbsp;- assign a vector (an array of floats) to a given key (identifier) and optionally store metadata alongside it.</li><li><strong>Vector similarity query</strong>&nbsp;- given a new query vector, efficiently find the stored vectors that are closest (e.g. minimal distance) to it, returning their keys (and scores).</li></ol>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    "<p>This transforms S3 into a&nbsp;<strong>massively scalable vector index</strong>&nbsp;service. You can store embeddings at petabyte scale and perform similarity search with metrics like cosine or Euclidean distance via a simple API. It's ideal for AI use cases like semantic search, recommendations, or Retrieval-Augmented Generation (RAG) where large volumes of embeddings need to be queried semantically. By leveraging S3's pay-for-use storage and ephemeral compute, S3 Vectors can handle infrequent or large-scale queries much more cost-effectively than memory-bound databases, yet still deliver sub-second results.</p>"
  }
/>

<CoreBlock
  name="core-heading"
  content={
    '<h3 class="wp-block-heading h4" id="vector-search-with-embeddings"><strong>Vector Search with Embeddings</strong></h3>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Vector similarity search retrieves data by comparing items in a high-dimensional embedding space rather than by exact keywords. In a typical pipeline:</p>'
  }
/>

<CoreBlock
  name="core-list"
  content={
    '<ul class="wp-block-list"><li><strong>Data to vectors:</strong>&nbsp;We first convert each data item (text, image, etc.) into a numeric vector representation (embedding) using an ML model. For example, a customer review text might be turned into a 768-dimensional embedding that encodes its semantic content. Models like Amazon Titan Embeddings, OpenAI, or Hugging Face sentence transformers handle this step.</li></ul>'
  }
/>

<CoreBlock
  name="core-list"
  content={
    '<ul class="wp-block-list"><li><strong>Index storage:</strong>&nbsp;These vectors are stored in a specialized index or database optimized for similarity search. This could be a dedicated vector database or, in our case, Amazon S3 Vectors acting as the index. Each vector is stored with an identifier (e.g. the primary key of the source record) and possibly metadata.</li></ul>'
  }
/>

<CoreBlock
  name="core-list"
  content={
    '<ul class="wp-block-list"><li><strong>Query by vector:</strong>&nbsp;A search query (e.g. a phrase or image) is also converted into an embedding vector. The vector index is then queried to find the closest stored vectors by distance metric (cosine, Euclidean, dot product, etc.). The result is a set of IDs of the most similar items, often with a similarity score.</li></ul>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>This process enables&nbsp;<strong>semantic search</strong>&nbsp;- results are returned based on meaning and similarity rather than exact text matches. It powers features like finding relevant documents by topic even if exact terms differ, recommendation systems (finding similar user behavior or content), and providing knowledge context to LLMs in RAG. With the Spice.ai Open Source integration, this whole lifecycle (embedding data, indexing vectors, querying) is managed by the Spice runtime and exposed via a familiar SQL or HTTP interface.</p>'
  }
/>

<CoreBlock
  name="core-heading"
  content={
    '<h2 class="wp-block-heading h3"><strong>Amazon S3 Vectors in Spice.ai</strong></h2>'
  }
/>

<CoreBlock
  name="core-image"
  content={
    '<figure class="wp-block-image size-large"><img src="/website-assets/media/2025/07/S3-Vectors-in-Spice-1024x720.png" alt="S3 Vectors in Spice" class="wp-image-1812"/><figcaption class="wp-element-caption">Figure 2: S3 Vectors and Spice architecture </figcaption></figure>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    "<p>Spice.ai is an open-source data, search and AI compute engine that supports vector search end-to-end. By integrating S3 Vectors as an index, Spice can embed data, store embeddings in S3, and perform similarity queries - all orchestrated through simple configuration and SQL queries. Let's walk through how you enable and use this in Spice.</p>"
  }
/>

<CoreBlock
  name="core-heading"
  content={
    '<h3 class="wp-block-heading h4" id="configuring-a-dataset-with-embeddings"><strong>Configuring a Dataset with Embeddings</strong></h3>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>To use vector search, annotate your dataset schema to specify which column(s) to embed and with which model. Spice supports various embedding models (both local or hosted) via the embeddings section in the configuration. For example, suppose we have a <strong>customer reviews</strong> table and we want to enable semantic search over the review text (<code>body</code> column):</p>'
  }
/>

```yaml
datasets:
  - from: oracle:"CUSTOMER_REVIEWS"
    name: reviews
    columns:
      - name: body
        embeddings:
          from: bedrock_titan # use an embedding model defined below

embeddings:
  - from: bedrock:amazon.titan-embed-text-v2:0
    name: bedrock_titan
    params:
      aws_region: us-east-2
      dimensions: '256'
```

<CoreBlock
  name="core-paragraph"
  content={
    '<p>In this&nbsp;<code>spicepod.yaml</code>, we defined an embedding model&nbsp;<code>bedrock_titan</code>&nbsp;(in this case AWS\'s&nbsp;<a href="https://docs.aws.amazon.com/bedrock/latest/userguide/titan-embedding-models.html" target="_blank" rel="noreferrer noopener" class="">Titan text embedding model</a>) and attached it to the&nbsp;<code>body</code>&nbsp;column. When the Spice runtime ingests the dataset, it will automatically generate a vector embedding for each row\'s&nbsp;<code>body</code>&nbsp;text using that model. By default, Spice can either store these vectors in its acceleration layer or compute them on the fly. However, with S3 Vectors, we can offload them to an S3 Vectors index for scalable storage.</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>To use S3 Vectors, we simply enable the vector engine in the dataset config:</p>'
  }
/>

```yaml
datasets:
  - from: oracle:"CUSTOMER_REVIEWS"
    name: reviews
    vectors:
      enabled: true
      engine: s3_vectors
      params:
        s3_vectors_bucket: my-s3-vector-bucket
        #... (rest of dataset definition as above)
```

<CoreBlock
  name="core-paragraph"
  content={
    "<p>This tells Spice to create or use an S3 Vectors index (in the specified S3 bucket) for storing the&nbsp;<code>body</code>&nbsp;embeddings. Spice manages the entire index lifecycle: it creates the vector index, handles inserting each vector with its primary key into S3, and knows how to query it. The embedding model and data source are as before - the only change is where the vectors are stored and queried. The benefit is that now our vectors reside in S3's highly scalable storage, and we can leverage S3 Vectors' efficient similarity search API.</p>"
  }
/>

<CoreBlock
  name="core-heading"
  content={
    '<h3 class="wp-block-heading h4" id="performing-a-vector-search-query"><strong>Performing a Vector Search Query</strong></h3>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Once configured, performing a semantic search is straightforward. Spice exposes both an HTTP endpoint and a SQL table-valued function for vector search. For example, using the HTTP API:</p>'
  }
/>

```bash
curl -X POST http://localhost:8090/v1/search \
 -H "Content-Type: application/json" \
 -d '{
 "datasets": ["reviews"],
 "text": "issues with same day shipping",
 "additional_columns": ["rating", "customer_id"],
 "where": "created_at >= now() - INTERVAL '7 days'",
 "limit": 2
 }'
```

<CoreBlock
  name="core-paragraph"
  content={
    '<p>This JSON query says: search the&nbsp;<strong>reviews</strong>&nbsp;dataset for items similar to the text "issues with same day shipping", and return the top 2 results, including their rating and customer id, filtered to reviews from the last 7 days. The Spice engine will embed the query text (using the same model as the index), perform a similarity lookup in the S3 Vectors index, filter by the WHERE clause, and return the results. A sample response might look like:</p>'
  }
/>

```json
{
  "results": [
    {
      "matches": {
        "body": "Everything on the site made it seem like I'd get it the same day. Still waiting the next morning was a letdown."
      },
      "data": { "rating": 3, "customer_id": 6482 },
      "primary_key": { "review_id": 123 },
      "score": 0.82,
      "dataset": "reviews"
    },
    {
      "matches": {
        "body": "It was marked as arriving 'today' when I paid, but the delivery was pushed back without any explanation. Timing was kind of important for me."
      },
      "data": { "rating": 2, "customer_id": 3310 },
      "primary_key": { "review_id": 24 },
      "score": 0.76,
      "dataset": "reviews"
    }
  ],
  "duration_ms": 86
}
```

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Each result includes the matching column snippet (body), the additional requested fields, the primary key, and a relevance score. In this case, the two reviews shown are indeed complaints about "same day" delivery issues, which the vector search found based on semantic similarity to the query (see how the second result made no mention of "same day" delivery, but rather described a similar issue as the first ).</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Developers can also use&nbsp;<strong>SQL</strong>&nbsp;for the same operation. Spice provides a table function&nbsp;<code>vector_search(dataset, query)</code>&nbsp;that can be used in the FROM clause of a SQL query. For example, the above search could be expressed as:</p>'
  }
/>

```sql
SELECT review_id, rating, customer_id, body, score
FROM vector_search(reviews, 'issues with same day shipping')
WHERE created_at >= to_unixtime(now() - INTERVAL '7 days')
ORDER BY score DESC
LIMIT 2;
```

<CoreBlock
  name="core-paragraph"
  content={
    "<p>This would yield a result set (with columns like&nbsp;<code>review_id</code>,&nbsp;<code>score</code>, etc.) similar to the JSON above, which you can join or filter just like any other SQL table. This ability to treat vector search results as a subquery/table and combine them with standard SQL filtering is a powerful feature of Spice.ai's integration - few other solutions let you&nbsp;<strong>natively mix vector similarity and relational queries</strong>&nbsp;so seamlessly.</p>"
  }
/>

<CoreBlock
  name="core-paragraph"
  content={'<p>See a 2-min demo of it in action:</p>'}
/>

<PostVideo
  fields={{
    thumbnail: false,
    type: 'youtube',
    video_id: 'v8z35jI8JKY',
    video_title: 'Amazon S3 Vectors with Spice.ai Open Source',
    video_upload_date: '2025-07-16T05:52:56-07:00',
    video_channel: 'Spice AI',
    video_description:
      'Walkthrough of vector search with Amazon S3 Vectors and Spice.ai Open Source.',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<CoreBlock
  name="core-heading"
  content={
    '<h3 class="wp-block-heading h4"><strong>Managing Embeddings Storage in Spice.ai</strong></h3>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>An important design question for any vector search system is&nbsp;<strong>where and how to store the embedding vectors</strong>. Before introducing S3 Vectors, Spice offered two approaches for managing vectors:</p>'
  }
/>

<CoreBlock
  name="core-list"
  content={
    '<ol class="wp-block-list"><li><strong>Accelerator storage:</strong> Embed the data in advance and store the vectors alongside other cached data in a <strong>Data Accelerator</strong> (Spice\'s high-performance materialization layer). This keeps vectors readily accessible in memory or fast storage.</li><li><strong>Just-in-time computation:</strong> Compute the necessary vectors on the fly during a query, rather than storing them persistently. For example, at query time, embed only the subset of rows that satisfy recent filters (e.g. all reviews in the last 7 days) and compare those to the query vector.</li></ol>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    "<p>Both approaches have trade-offs. <strong>Pre-storing in an accelerator</strong> provides fast query responses but may not be feasible for very large datasets (which might not fit entirely, or fit affordably in fast storage) and accelerators, like DuckDB or SQLite aren't optimized for similarity search algorithms on billion-scale vectors. <strong>Just-in-time embedding</strong> avoids extra storage but becomes prohibitively slow when computing embeddings over large data scans (and for each query), and provides no efficient algorithm for efficiently finding similar neighbours.</p>"
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    "<p>Amazon S3 Vectors offers a compelling third option: the&nbsp;<strong>scalability of S3</strong>&nbsp;with the efficient retrieval of vector index data structures. By configuring the dataset with engine:&nbsp;<code>s3_vectors</code>&nbsp;as shown earlier, Spice will offload the vector storage and similarity computations to S3 Vectors. This means you can handle very large embedding sets (millions or billions of items) without worrying about Spice's memory or local disk limits, and still get fast similarity operations via S3's API. In practice, when Spice ingests data, it will embed each row's body and&nbsp;<strong>PUT</strong>&nbsp;it into the S3 Vector index (with the&nbsp;<code>review_id</code>&nbsp;as the key, and possibly some metadata). At query time, Spice calls S3 Vectors'&nbsp;<strong>query API</strong>&nbsp;to retrieve the nearest neighbors for the embedded query. All of this is abstracted away; you simply query Spice and it orchestrates these steps.</p>"
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    "<p>The Spice runtime manages index creation, updates, and deletion. For instance, if new data comes in or old data is removed, Spice will synchronize those changes to the S3 vector index. Developers don't need to directly interact with S3 - it's configured once in YAML. This tight integration accelerates application development: your app can treat Spice like any other database, while behind the scenes Spice leverages S3's elasticity for the heavy lifting.</p>"
  }
/>

<CoreBlock
  name="core-heading"
  content={
    '<h3 class="wp-block-heading h4" id="vector-index-usage-in-query-execution"><strong>Vector Index Usage in Query Execution</strong></h3>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    "<p>How does a vector index actually get used in Spice's SQL query planner? To illustrate, consider the simplified SQL we used:</p>"
  }
/>

```sql
SELECT *
FROM vector_search(reviews, 'issues with same day shipping')
ORDER BY score DESC
LIMIT 5;
```

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Logically, without a vector index, Spice would have to do the following at query time:</p>'
  }
/>

<CoreBlock
  name="core-list"
  content={
    '<ol class="wp-block-list"><li><strong>Embed the query text</strong>&nbsp;\'issues with same day shipping\' into a vector&nbsp;<code>v</code>.</li><li><strong>Retrieve or compute all candidate vectors</strong>&nbsp;for the searchable column (here every&nbsp;<code>body</code>&nbsp;embedding in the dataset). This could mean scanning every row or at least every row matching other filter predicate.</li><li><strong>Calculate distances</strong>&nbsp;between the query vector&nbsp;<code>v</code>&nbsp;and each candidate vector, compute a similarity score (e.g.&nbsp;<code>score = 1 - distance</code>).</li><li><strong>Sort all candidates</strong>&nbsp;by the score and take the top 5.</li></ol>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>For large datasets, steps 2-4 would be extremely expensive (a brute-force scan through potentially millions of vectors for each search, then a full sort operation). A vector index avoiding unnecessary recomputation of embeddings, reduces the number of distance calculations required, and provides in-order candidate neighbors.</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>With S3 Vectors, step 2 and 3 are pushed down to the S3 service. The vector index can directly return the&nbsp;<em>top K closest matches</em>&nbsp;to&nbsp;<code>v</code>. Conceptually, S3 Vectors gives back an ordered list of primary keys with their similarity scores. For example, it might return something like:&nbsp;<code>{(review_id=123, score=0.82), (review_id=24, score=0.76), ...}</code>&nbsp;up to K results.</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    "<p>Spice then uses these results, logically as a&nbsp;<em>temporary table</em>&nbsp;(let's call it vector_query_results), joined with the main reviews table to get the full records. In SQL pseudocode, Spice does something akin to:</p>"
  }
/>

```sql
-- The vector index returns the closest matches for a given query.
CREATE TEMP TABLE vector_query_results (
 review_id BIGINT,
 score FLOAT
);
```

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Imagine this temp table is populated by an efficient vector retrieval operatin in S3 Vectors for the query.</p>'
  }
/>

```sql
-- Now we join to retrieve full details
SELECT r.review_id, r.rating, r.customer_id, r.body, v.score
FROM vector_query_results v
JOIN reviews r ON r.review_id = v.review_id
ORDER BY v.score DESC
LIMIT 5;
```

<CoreBlock
  name="core-paragraph"
  content={
    '<p>This way, only the top few results (say 50 or 100 candidates) are processed in the database, rather than the entire dataset. The heavy work of narrowing down candidates occurs inside the vector index.&nbsp;<strong>Spice essentially treats vector_search(dataset, query) as a table-valued function that produces (id, score) pairs which are then joinable</strong>.</p>'
  }
/>

<CoreBlock
  name="core-heading"
  content={
    '<h3 class="wp-block-heading h4" id="handling-filters-efficiently"><strong>Handling Filters Efficiently</strong></h3>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>One consideration when using an external vector index is how to handle additional filter conditions (the&nbsp;<code>WHERE</code>&nbsp;clause). In our example, we had a filter&nbsp;<code>created_at &gt;= now() - 7 days</code>. If we simply retrieve the top K results from the vector search and then apply the time filter, we might run into an issue: those top K might not include any recent items, even if there are relevant recent items slightly further down the similarity ranking. This is because S3 Vectors (like most ANN indexes) will return the top K most similar vectors globally, unaware of our date constraint.</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    "<p>If only a small fraction of the data meets the filter, a naive approach could drop most of the top results, leaving fewer than the desired number of final results. For example, imagine the vector index returns 100 nearest reviews overall, but only 5% of all reviews are from the last week - we'd expect only ~5 of those 100 to be recent, possibly fewer than the LIMIT. The query could end up with too few results not because they don't exist, but because the index wasn't filter-aware and we truncated the candidate list.</p>"
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>To solve this,&nbsp;<strong>S3 Vectors supports metadata filtering at query time</strong>. We can store certain fields as metadata with each vector and have the similarity search constrained to vectors where the metadata meets criteria. Spice.ai leverages this by allowing you to mark some dataset columns as "vector filterable". In our YAML, we could do:</p>'
  }
/>

```yaml
columns:
  - name: created_at
    metadata:
      vectors: filterable
```

<CoreBlock
  name="core-paragraph"
  content={
    "<p>By doing this, Spice's query planner will include the&nbsp;<code>created_at</code>&nbsp;value with each vector it upserts to S3, and it will push down the time filter into the S3 Vectors query. Under the hood, the S3 vector query will then return only nearest neighbors that also satisfy&nbsp;<code>created_at &gt;= now()-7d</code>. This greatly improves both efficiency and result relevance. The query execution would conceptually become:</p>"
  }
/>

```sql
-- Vector query with filter returns a temp table including the metadata
CREATE TEMP TABLE vector_query_results (
 review_id BIGINT,
 score FLOAT,
 created_at TIMESTAMP
);
-- vector_query_results is already filtered to last 7 days

SELECT r.review_id, r.rating, r.customer_id, r.body, v.score
FROM vector_query_results v
JOIN reviews r ON r.review_id = v.review_id
-- (no need for additional created_at filter here, it's pre-filtered)
ORDER BY v.score DESC
LIMIT 5;
```

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Now the index itself is ensuring all similar reviews&nbsp;<em>are from the last week</em>, and so if there are at least five results from the last week, it will return a full result (i.e. respecting&nbsp;<code>LIMIT 5</code>).</p>'
  }
/>

<CoreBlock
  name="core-heading"
  content={
    '<h3 class="wp-block-heading h4" id="including-data-to-avoid-joins"><strong>Including Data to Avoid Joins</strong></h3>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Another optimization Spice supports is storing additional, non-filterable columns in the vector index to entirely avoid the expensive table join back to the main table for certain queries. For example, we might mark <code>rating</code>, <code>customer_id</code>, or even the text <code>body</code> as <strong>non-filterable vector metadata</strong>. This means these fields are stored with the vector in S3, but not used for filtering (just for retrieval). In the Spice config, it would look like:</p>'
  }
/>

```yaml
columns:
  - name: rating
    metadata:
      vectors: non-filterable
  - name: customer_id
    metadata:
      vectors: non-filterable
  - name: body
    metadata:
      vectors: non-filterable
```

<CoreBlock
  name="core-paragraph"
  content={
    "<p>With this setup, when Spice queries S3 Vectors, the vector index will return not only each match's&nbsp;<code>review_id</code>&nbsp;and&nbsp;<code>score</code>, but also the stored&nbsp;<code>rating</code>,&nbsp;<code>customer_id</code>, and&nbsp;<code>body</code>&nbsp;values. Thus, the temporary&nbsp;<code>vector_query_results</code>&nbsp;table already has all the information needed to satisfy the query. We don't even need to join against the reviews table unless we want some column that wasn't stored. The query can be answered entirely from the index data:</p>"
  }
/>

```sql
SELECT review_id, rating, customer_id, body, score
FROM vector_query_results
ORDER BY score DESC
LIMIT 5;
```

<CoreBlock
  name="core-paragraph"
  content={
    "<p>This is particularly useful for read-heavy query workloads where hitting the main database adds latency. By storing the most commonly needed fields along with the vector, Spice's vector search behaves like an&nbsp;<strong>index-only query</strong>&nbsp;(similar to covering indexes in relational databases). You trade a bit of extra storage in S3 (duplicating some fields, but still managed by Spice) for faster queries that bypass the heavier join.</p>"
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    "<p>This extends to&nbsp;<code>WHERE</code>&nbsp;conditions on non-filterable columns, or filter predicate unsupported by S3 vectors. Spice's execution engine can apply these filters, still avoiding any expensive JOIN on the underlying table.</p>"
  }
/>

```sql
SELECT review_id, rating, customer_id, body, score
FROM vector_query_results
where rating > 3  -- Filter performed in Spice on, with non-filterable data from vector index
ORDER BY score DESC
LIMIT 5;
```

<CoreBlock
  name="core-paragraph"
  content={
    "<p>t's worth noting that you should choose carefully which fields to mark as metadata - too many or very large fields could increase index storage and query payload sizes. Spice gives you the flexibility to include just what you need for filtering and projection to optimize each use case.</p>"
  }
/>

<CoreBlock
  name="core-heading"
  content={
    '<h2 class="wp-block-heading h3" id="beyond-basic-vector-search-in-spice"><strong>Beyond Basic Vector Search in Spice</strong></h2>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Many real-world search applications go beyond a single-vector similarity lookup. Spice.ai\'s strength is that it\'s a full database engine. You can compose more complex search workflows, including&nbsp;<strong><a href="/platform/hybrid-sql-search">hybrid vector and full-text search</a></strong>&nbsp;(combining keyword/text search with vector search), multi-vector queries, re-ranking strategies, and more. Spice provides both an out-of-the-box hybrid search API and the ability to write custom SQL to implement advanced retrieval logic.</p>'
  }
/>

<CoreBlock
  name="core-list"
  content={
    '<ul class="wp-block-list"><li><strong>Multiple vector fields or multi-modal search:</strong> You might have vectors for different aspects of data (e.g. an e-commerce product could have embeddings for both its description and the product\'s image. Or a document has both a title and body that should be searchable individually and together) that you may want to search across and combine results. Spice lets you do vector search on multiple columns easily, and you can weight the importance of each. For instance, you might boost matches in the title higher than matches in the body.</li></ul>'
  }
/>

<CoreBlock
  name="core-list"
  content={
    '<ul class="wp-block-list"><li><strong>Vector and full-text search:</strong> Similar to vector search, columns can have text indexes <a class="" href="https://spiceai.org/docs/features/search/full-text" target="_blank" rel="noreferrer noopener">defined</a> that enable full-text BM25 search. Text search can then be performed in SQL with a similar <code>text_search</code> <a class="" href="https://spiceai.org/docs/features/search/full-text#searching-with-sql" target="_blank" rel="noreferrer noopener">UDTF</a>. The <code>/v1/search</code> HTTP API will perform a <strong>hybrid search</strong> across both full-text and vector indexes, merging results using Reciprocal Rank Fusion (RRF). This means you get a balanced result set that accounts for direct keyword matches as well as semantic similarity. The example below demonstrates how RRF can be implemented in SQL by combining ranks.</li></ul>'
  }
/>

<CoreBlock
  name="core-list"
  content={
    '<ul class="wp-block-list"><li><strong>Hybrid vector + keyword search: </strong>Sometimes you want to ensure certain keywords are present while also using semantic similarity. Spice supports <strong>hybrid search</strong> natively - its default <code>/v1/search</code> HTTP API actually performs both full-text BM25 search and vector search, then merges results using Reciprocal Rank Fusion (RRF). This means you get a balanced result set that accounts for direct keyword matches as well as semantic similarity. In Spice\'s SQL, you can also call text_search(dataset, query) for traditional full-text search, and combine it with vector_search results. The example below demonstrates how RRF can be implemented in SQL by combining ranks.</li></ul>'
  }
/>

<CoreBlock
  name="core-list"
  content={
    '<ul class="wp-block-list"><li><strong>Two-phase retrieval (re-ranking):</strong> A common pattern is to use a fast first-pass retrieval (e.g. a keyword search) to get a larger candidate set, then apply a more expensive or precise ranking (e.g. vector search) on this subset to improve the score of the required final candidate set. With Spice, you can orchestrate this in SQL or in application code. For example, you could query a BM25 index for 100 candidates, then perform a vector search amongst this candidate set(i.e. restricted to those IDs) for a second phase. Since Spice supports standard SQL constructs, you can express these multi-step plans with common table expressions (CTEs) and joins.</li></ul>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    "<p>To illustrate hybrid search, here's a SQL snippet that uses the&nbsp;<strong>Reciprocal Rank Fusion (RRF)</strong>&nbsp;technique to merge vector and text search results for the same query (RRF is used, when needed, in the&nbsp;<code>v1/search</code>&nbsp;HTTP API):</p>"
  }
/>

```sql
WITH
vector_results AS (
 SELECT review_id, RANK() OVER (ORDER BY score DESC) AS vector_rank
 FROM vector_search(reviews, 'issues with same day shipping')
),
text_results AS (
 SELECT review_id, RANK() OVER (ORDER BY score DESC) AS text_rank
 FROM text_search(reviews, 'issues with same day shipping')
)
SELECT
 COALESCE(v.review_id, t.review_id) AS review_id,
 -- RRF scoring: 1/(60+rank) from each source
 (1.0 / (60 + COALESCE(v.vector_rank, 1000)) +
 1.0 / (60 + COALESCE(t.text_rank, 1000))) AS fused_score
FROM vector_results v
FULL OUTER JOIN text_results t ON v.review_id = t.review_id
ORDER BY fused_score DESC
LIMIT 50;
```

<CoreBlock
  name="core-paragraph"
  content={
    "<p>This takes the vector similarity results and text (BM25) results, assigns each a rank based not on the score, but rather the relative order of candidates, and combines these ranks for an overall order. Spice's primary key SQL semantics easily enables this document ID join.</p>"
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>For a multi-column vector search example, suppose our reviews dataset has both a title and body with embeddings, and we want to prioritize title matches higher. We could create a&nbsp;<code>combined_score</code>&nbsp;where the title is weighted twice as high as the body:</p>'
  }
/>

```sql
WITH
body_results AS (
 SELECT review_id, score AS body_score
 FROM vector_search(reviews, 'issues with same day shipping', col => 'body')
),
title_results AS (
 SELECT review_id, score AS title_score
 FROM vector_search(reviews, 'issues with same day shipping', col => 'title')
)
SELECT
 COALESCE(body.review_id, title.review_id) AS review_id,
 COALESCE(body_score, 0) + 2.0 * COALESCE(title_score, 0) AS combined_score
FROM body_results
FULL OUTER JOIN title_results ON body_results.review_id = title_results.review_id
ORDER BY combined_score DESC
LIMIT 5;
```

<CoreBlock
  name="core-paragraph"
  content={
    "<p>These examples scratch the surface of what you can do by leveraging Spice's&nbsp;<strong>SQL-based composition</strong>. The key point is that Spice isn't just a vector database - it's a hybrid engine that lets you combine vector search with other query logic (text search, filters, joins, aggregations, etc.) all in one place. This can significantly simplify building complex search and AI-driven applications.</p>"
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p><em>(Note: Like most vector search systems, S3 Vectors uses an approximate nearest neighbor (ANN) algorithm under the hood for performance. This yields fast results that are probabilistically the closest, which is usually an acceptable trade-off in practice. Additionally, in our examples we focused on one embedding per row; production systems may use techniques like chunking text into multiple embeddings or adding external context, but the principles above remain the same.)</em></p>'
  }
/>

<CoreBlock
  name="core-heading"
  content={
    '<h2 class="wp-block-heading h3" id="industry-context-and-comparisons"><strong>Industry Context and Comparisons</strong></h2>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    "<p>The rise of vector databases over the past few years (Pinecone, Qdrant, Weaviate, etc.) has been driven by the need to serve AI applications with semantic search at scale. Each solution takes a slightly different approach in architecture and trade-offs. Spice.ai's integration with Amazon S3 Vectors represents a newer trend in this space:&nbsp;<strong>decoupling storage from compute for vector search</strong>, analogous to how data warehouses separated compute and storage in the past. Let's compare this approach with some existing solutions:</p>"
  }
/>

<CoreBlock
  name="core-list"
  content={
    '<ul class="wp-block-list"><li><strong>Traditional Vector Databases (Qdrant, Weaviate, Pinecone):</strong> These systems typically run as dedicated services or clusters that handle both the storage of vectors (on disk or in-memory) and the computation of similarity search. For example, Qdrant (an open-source engine in Rust) allows either in-memory storage or on-disk storage (using RocksDB) for vectors and payloads. It\'s optimized for high performance and offers features like filtering, quantization, and distributed clustering, but you generally need to provision servers/instances that will host all your data and indexes. Weaviate, another popular open-source vector DB, uses a <strong>Log-Structured Merge (LSM) tree</strong> based storage engine that persists data to disk and keeps indexes in memory. Weaviate supports hybrid search (it can combine keyword and vector queries) and offers a GraphQL API, with a managed cloud option priced mainly by data volume. Pinecone, a fully managed SaaS, also requires you to select a service tier or pod which has certain memory/CPU allocated for your index - essentially your data lives in Pinecone\'s infrastructure, not in your AWS account. These solutions excel at low-latency search for <strong>high query throughput</strong> scenarios (since data is readily available in RAM or local SSD), but the cost can be high for large datasets. You pay for a lot of infrastructure to be running, even during idle times. In fact, prior to S3 Vectors, vector search engines often stored data in memory at ~$2/GB and needed multiple replicas on SSD, which is <em>"the most expensive way to store data"</em>, as Simon Eskildsen (Turbopuffer\'s founder) noted. Some databases mitigate cost by compressing or offloading to disk, but still, maintaining say 100 million embeddings might require a sizable cluster of VMs or a costly cloud plan.</li></ul>'
  }
/>

<CoreBlock
  name="core-list"
  content={
    '<ul class="wp-block-list"><li><strong>Spice.ai with Amazon S3 Vectors:</strong> This approach flips the script by storing vectors in <strong>cheap, durable object storage (S3)</strong> and loading/indexing them on demand. As discussed, S3 Vectors keeps the entire vector dataset in S3 at ~$0.02/GB storage , and only spins up transient compute (managed by AWS) to serve queries, meaning you aren\'t paying for idle GPU or RAM time. AWS states this design can cut total costs by up to 90% while still giving sub-second performance on billions of vectors. It\'s essentially a <strong>serverless vector search</strong> model - you don\'t manage servers or even dedicated indices; you just use the API. Spice.ai\'s integration means developers get this cost-efficiency without having to rebuild their application: they can use standard SQL and Spice will push down operations to S3 Vectors as appropriate. This decoupled storage/compute model is ideal for use cases where the data is huge but query volumes are moderate or bursty (e.g., an enterprise semantic search that is used a few times an hour, or a nightly ML batch job). It avoids the "monolithic database" scenario of having a large cluster running 24/7. However, one should note that if you need extremely high QPS (thousands of queries per second at ultra-low latency), a purely object-storage-based solution might not outperform a tuned in-memory vector DB - AWS positions S3 Vectors as complementary to higher-QPS solutions like OpenSearch for real-time needs.</li></ul>'
  }
/>

<CoreBlock
  name="core-list"
  content={
    '<ul class="wp-block-list"><li><strong>Turbopuffer:</strong> Turbopuffer is a startup that, much like Spice with S3 Vectors, is <strong>built from first principles on object storage</strong>. It provides <em>"serverless vector and full-text search... fast, 10× cheaper, and extremely scalable,"</em> by leveraging S3 or similar object stores with smart caching. The philosophy is the same: use the durability and low cost of object storage for the bulk of data, and layer a cache (memory/SSD) in front for performance-critical portions. According to Turbopuffer\'s founder, moving from memory/SSD-centric architectures to an object storage core can yield <strong>100× cost savings for cold data and 6-20× for warm data</strong>, without sacrificing too much performance. Turbopuffer\'s engine indexes data incrementally on S3 and uses caching to achieve similar latency to conventional search engines on hot data. The key difference is that Turbopuffer is a standalone search service (with its own API), whereas Spice uses AWS\'s S3 Vectors service as the backend. Both approaches validate the industry trend toward <strong>disaggregated storage</strong> for search. Essentially, they are bringing the cloud data warehouse economics to vector search: store everything cheaply, compute on demand.</li></ul>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    "<p>In summary, Spice.ai's integration with S3 Vectors and similar efforts indicate a shift in vector search towards&nbsp;<strong>cost-efficient, scalable architectures</strong>&nbsp;that separate the concerns of storing massive vector sets and serving queries. Developers now have options: if you need blazing fast, real time vector search with constant high traffic, dedicated compute infrastructure might be justified. But for many applications - enterprise search, AI assistants with a lot of knowledge but lower QPS, periodic analytics over embeddings - offloading to something like S3 Vectors can save enormously on cost while still delivering sub-second performance at huge scale. And with Spice.ai, you get the best of both worlds: the ease of a unified SQL engine that can do&nbsp;<strong>keyword + vector hybrid search on structured data</strong>, combined with the power of a cloud-native vector store. It simplifies your stack (no separate vector DB service to manage) and accelerates development since you can join and filter vector search results with your data immediately in one query.</p>"
  }
/>

<CoreBlock
  name="core-paragraph"
  content={'<p><strong>References:</strong></p>'}
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p><a class="" href="https://docs.weaviate.io/weaviate/concepts/storage" target="_blank" rel="noreferrer noopener">Weaviate</a>&nbsp;storage architecture discussion</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p><a class="" href="/blog/amazon-s3-vectors" target="_blank" rel="noreferrer noopener">Spice.ai announcement</a>:&nbsp;<em>"Spice.ai Now Supports Amazon S3 Vectors For Vector Search at Petabyte Scale!"</em></p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p><a class="" href="https://spiceai.org/docs/components/vectors/s3_vectors" target="_blank" rel="noreferrer noopener">Spice.ai Amazon S3 Vectors documentation</a></p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p><a class="" href="https://github.com/spiceai/cookbook/blob/trunk/vectors/s3/README.md" target="_blank" rel="noreferrer noopener">Spice.ai Amazon S3 Vectors Cookbook Recipe Sample</a></p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p><a class="" href="https://aws.amazon.com/s3/features/vectors" target="_blank" rel="noreferrer noopener">Amazon S3 Vectors official page</a></p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p><a class="" href="https://docs.pinecone.io/guides/get-started/database-architecture" target="_blank" rel="noreferrer noopener">Pinecone Database Architecture</a>&nbsp;(managed vector database)</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p><a class="" href="https://qdrant.tech/documentation/concepts/indexing" target="_blank" rel="noreferrer noopener">Qdrant documentation</a>&nbsp;(storage modes and features)</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p><a class="" href="https://turbopuffer.com/blog/turbopuffer" target="_blank" rel="noreferrer noopener">Turbopuffer blog</a>&nbsp;by Simon Eskildsen (cost of search on object storage)</p>'
  }
/>

<CoreBlock name="core-paragraph" content={'<p>‍</p>'} />

This walkthrough used [hybrid vector and full-text search](/platform/hybrid-sql-search) over S3 Vectors, a common foundation for [retrieval-augmented generation](/use-case/retrieval-augmented-generation). To evaluate it on your own datasets, [get a demo](/get-a-demo).

## Frequently Asked Questions

### Is Amazon S3 Vectors generally available?

Yes. Amazon S3 Vectors became generally available on December 2, 2025, after a public preview launch at AWS Summit New York 2025. Spice AI was a day 1 launch partner and integrated the preview in Spice v1.5.0 as a vector index backend. See the [Amazon S3 Vectors page](https://aws.amazon.com/s3/features/vectors) for current regions and limits.

### How do you configure a Spice dataset to use S3 Vectors?

Set `vectors: enabled: true` with `engine: s3_vectors` and an S3 bucket name on the dataset in `spicepod.yaml`. Spice then creates the vector index, writes each row's embedding with its primary key, and synchronizes later updates and deletes. You do not interact with S3 directly after this one-time configuration.

### Which embedding models can Spice use with S3 Vectors?

Spice runs local or hosted embedding models, defined in the embeddings section of `spicepod.yaml`. This post's example uses the Amazon Titan text embedding model through Amazon Bedrock. At search time, Spice embeds the query text with the same model as the index.

### Can SQL queries join and filter S3 Vectors search results?

Yes, Spice exposes `vector_search` as a SQL table function that returns primary keys with similarity scores. You can join, filter, order, and aggregate those results like any other table. The `/v1/search` HTTP API also merges vector and BM25 full-text results with Reciprocal Rank Fusion, part of [hybrid vector and full-text search](/platform/hybrid-sql-search) in Spice.

### How do WHERE clause filters work with an S3 Vectors index?

Spice pushes WHERE conditions into the S3 Vectors query for columns marked as filterable vector metadata. Spice stores each marked column's value with the vector it writes to the index. The index then returns only the nearest neighbors that match the condition. This keeps result counts complete when only a small share of rows qualifies.

### Can Spice answer a vector search without joining the source table?

Yes, Spice can answer a vector search from the index alone when you store the queried columns as non-filterable metadata. S3 Vectors returns the stored values with each match, so the query completes without a join to the source table. This is similar to a covering index in a relational database, and it removes join latency for read-heavy workloads.

### Does Amazon S3 Vectors return exact nearest neighbors?

No, S3 Vectors uses an approximate nearest neighbor (ANN) algorithm, like most vector search systems. Results are the probabilistically closest matches rather than a guaranteed exact set. This trade-off is usually acceptable in practice because it keeps similarity queries fast at large scale.

### When does a dedicated vector database outperform S3 Vectors?

A tuned in-memory vector database can outperform S3 Vectors when you need thousands of queries per second at ultra-low latency. AWS positions S3 Vectors as complementary to higher-throughput engines like OpenSearch for real-time needs. S3 Vectors fits large embedding sets with moderate or bursty query volumes, a common pattern for [retrieval-augmented generation](/use-case/retrieval-augmented-generation).

<ContentResourceFeatured
  fields={{
    heading: 'Explore more Spice resources',
    paragraph: 'Hands-on tutorials, product docs, and real-world examples.',
    mode: 'related',
    resources: false,
    padding_top: 'unset',
    padding_bottom: 'unset',
    related_posts: [
      {
        title: 'A Developer&#8217;s Guide to Understanding Spice.ai',
        slug: '/blog/a-developers-guide-to-understanding-spice-ai',
        excerpt:
          'This guide helps developers build a mental model of why, how, and where to use Spice.',
        image:
          '/website-assets/media/2026/02/A-developers-guide-to-understanding-Spice.ai_.png',
        type: 'Blog',
        taxonomy: [
          'Engineering',
          'Spice AI',
          'Spice Cloud Platform',
          'Spice OSS',
        ],
      },
      {
        title:
          'Operationalizing Amazon S3 for AI: From Data Lake to AI-Ready Platform in Minutes',
        slug: '/blog/operationalizing-amazon-s3-for-ai',
        excerpt:
          'Amazon S3 has evolved with S3 Tables and S3 Vectors, but leveraging them for real-time AI workloads requires significant distributed systems work. This post shows how Spice handles ingestion, federation, acceleration, and hybrid search - transforming S3 into a low-latency, AI-ready platform with minimal configuration.',
        image: '/website-assets/media/2026/02/Operationalizing-S3.png',
        type: 'Blog',
        taxonomy: ['Search'],
      },
      {
        title:
          'Spice Cloud v1.11: Spice Cayenne Reaches Beta, Apache DataFusion v51, DynamoDB Streams Improvements, &amp; More',
        slug: '/blog/spice-cloud-v1-11',
        excerpt:
          'Spice Cloud v1.11 focuses on what matters most in production: faster queries, lower memory usage, and predictable performance across acceleration and caching.',
        image: '/website-assets/media/2026/01/Spice-Cloud-v1.11-Update.png',
        type: 'Blog',
        taxonomy: ['Releases', 'Spice Cloud Platform'],
      },
    ],
  }}
/>

<TalkToAnEngineerCta />

<ContentRichText
  fields={{
    coverage: 'rc-end',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

---

## How we use Apache DataFusion at Spice AI
URL: https://spice.ai/blog/how-we-use-apache-datafusion-at-spice-ai
Date: 2026-01-15T19:31:56
Description: A technical overview of how Spice extends Apache DataFusion with custom table providers, optimizer rules, and UDFs to power federated SQL, search, and AI inference.

<ContentRichText
  fields={{
    coverage: 'rc-start',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

**TL;DR:** Spice is built on [Apache DataFusion](https://datafusion.apache.org/), a Rust-native query engine. This post covers how Spice extends DataFusion with custom table providers for [SQL federation](/platform/sql-federation-acceleration), optimizer rules for acceleration routing, UDFs for [hybrid search](/platform/hybrid-sql-search) and [LLM inference](/platform/llm-inference), and lessons learned building a production SQL platform on DataFusion.

---

<CoreBlock
  name="core-heading"
  content={
    '<h2 class="wp-block-heading h4"><strong>Introducing \'Engineering at Spice AI</strong>\'</h2>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    "<p>'<strong>Engineering at Spice AI</strong>' is a technical blog series that breaks down the systems and abstractions behind Spice's data and AI platform.</p>"
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>We\'ll explain why we chose specific open-source technologies, how we\'ve extended them, and what we\'ve learned building a SQL-first platform for <a href="/platform/sql-federation-acceleration">federated query and acceleration</a>, <a href="/platform/hybrid-sql-search">search</a>, and <a href="/platform/llm-inference">embedded LLM inference</a>.</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    "<p>The goal of this series is to share concrete engineering patterns that teams building data and AI infrastructure can apply in their own systems, while also unfolding how Spice is designed so users understand and can trust the foundations they're relying on. Familiarity with SQL engines, Arrow, or Rust will help.</p>"
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>This article kicks off the series by diving into <a href="https://datafusion.apache.org/">Apache DataFusion</a>, the query engine at the core of Spice. </p>'
  }
/>

<CoreBlock name="core-paragraph" content={'<p>Future posts will cover:</p>'} />

<CoreBlock
  name="core-list"
  content={
    '<ul class="wp-block-list"><li><a href="https://rust-lang.org/">Rust at Spice AI</a> - Our systems programming foundation</li><li><a href="https://spiceai.org/docs/components/data-accelerators/arrow">Apache Arrow at Spice AI</a>- Arrow as our core in-memory data format</li><li><a href="https://spiceai.org/docs/components/data-accelerators/duckdb">DuckDB at Spice AI </a>- Embedded analytics acceleration</li><li><a href="https://spiceai.org/docs/components/data-connectors/iceberg">Apache Iceberg at Spice AI</a> - Open table format and SQL-based ingestion</li><li><a href="https://spiceai.org/docs/components/data-accelerators/cayenne">Vortex at Spice AI</a> - Columnar compression for <a href="/blog/introducing-spice-cayenne-data-accelerator">Cayenne</a>, our premier data accelerator </li></ul>'
  }
/>

<CoreBlock
  name="core-image"
  content={
    '<figure class="wp-block-image size-large"><img src="/website-assets/media/2026/01/image-1-1024x723.png" alt="The Spice architecture, built on open-source" class="wp-image-1874"/><figcaption class="wp-element-caption">Figure 1: The Spice architecture, built on open-source</figcaption></figure>'
  }
/>

<CoreBlock
  name="core-heading"
  content={
    '<h2 class="wp-block-heading h4"><strong>What is Apache DataFusion?</strong></h2>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p><a href="https://datafusion.apache.org/">Apache DataFusion</a> is a fast, extensible query engine written in Rust. It provides SQL and DataFrame APIs, a query planner, a cost-based optimizer, and a multi-threaded execution engine, all built on <a href="https://arrow.apache.org/">Apache Arrow</a>.</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={'<p>DataFusion provides the complete query execution pipeline:</p>'}
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p><code>SQL → Parsed SQL (*AST) → Logical Plan → Optimizer → Physical Plan → Execution → Arrow Results</code></p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p><em>*<a href="https://en.wikipedia.org/wiki/Abstract_syntax_tree">Abstract Syntax Tree</a></em></p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>DataFusion provides extension points across planning and execution, which we use to add custom table providers (20+ sources), optimizer rules (federation and acceleration pushdowns), and UDFs (AI inference, vector search, and text search). </p>'
  }
/>

<CoreBlock name="core-paragraph" content={'<p>Each stage is extensible:</p>'} />

<CoreBlock
  name="core-table"
  content={
    '<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>Stage</th><th>Extension Point</th><th>Spice Extensions</th></tr></thead><tbody><tr><td>Parser</td><td>Custom SQL syntax</td><td>-</td></tr><tr><td>Logical Planning</td><td>TableProvider, ScalarUDF, TableFunction</td><td>20+ data connectors</td></tr><tr><td>Optimization</td><td>OptimizerRule,  AnalyzerRule</td><td>Federation analyzer</td></tr><tr><td>Physical Planning</td><td>ExtensionPlanner</td><td>DuckDB aggregate pushdowns </td></tr><tr><td>Execution</td><td>ExecutionPlan</td><td>Schema casting, managed streams, fallback execution</td></tr></tbody></table></figure>'
  }
/>

<CoreBlock
  name="core-heading"
  content={
    '<h2 class="wp-block-heading h4"><strong>Why DataFusion at Spice</strong></h2>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>The core technical challenge we were looking to solve was executing one logical query across many fundamentally different systems: operational databases, data warehouses, object stores, streams, APIs, and more - while still making that query fast, composable, and extensible enough to evolve with rapidly changing data and AI workloads. </p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>After evaluating several engines, DataFusion was the one that met those requirements without forcing architectural compromises:</p>'
  }
/>

<CoreBlock
  name="core-list"
  content={
    '<ul class="wp-block-list"><li><strong><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-black-color">Native Rust and Arrow:</mark> </strong>DataFusion is written in Rust and uses Arrow as its native memory format, matching our architecture without foreign function interface (FFI) overhead, runtime boundary crossings, or data format conversions.</li><li><strong><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-black-color">Extensibility:</mark> </strong>Every component can be replaced or extended. We can add custom data sources, optimizer rules, and execution plans without forking the core engine.</li><li><strong><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-black-color">Active community:</mark> </strong>DataFusion has an active community with regular releases. We contribute upstream when our extensions benefit the broader ecosystem.</li><li><strong><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-black-color">Performance: </mark></strong>DataFusion\'s execution engine uses:<ul class="wp-block-list"><li>Vectorized processing with Arrow arrays</li><li>Push-based execution for streaming</li><li>Partition-aware parallelism that scales with CPU cores</li><li>Predicate and projection pushdown to minimize data movement</li></ul></li></ul>'
  }
/>

<CoreBlock
  name="core-heading"
  content={
    '<h2 class="wp-block-heading h4"><strong>How we use DataFusion</strong></h2>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>We treat DataFusion as a programmable query compiler and runtime.</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={'<p>At a high level, DataFusion gives us:</p>'}
/>

<CoreBlock
  name="core-list"
  content={
    '<ul class="wp-block-list"><li>A full SQL -&gt; logical -&gt; physical execution pipeline</li><li>A cost-based optimizer we can extend and rewrite</li><li>Stable extension points at <em>every</em> stage of planning and execution</li><li>Arrow-native, vectorized execution that works equally well for analytics and streaming results</li></ul>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>The unique qualities around our DataFusion implementation includes:</p>'
  }
/>

<CoreBlock
  name="core-list"
  content={
    '<ul class="wp-block-list"><li>Deciding <em>where</em> a query should execute (source vs. local accelerator)</li><li>Deciding <em>when</em> cached data is valid, stale, or needs fallback</li><li>Injecting AI inference and search functions directly into SQL</li><li>Coordinating execution across local, remote, and hybrid plans</li></ul>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>DataFusion is one of the few engines where these decisions can be expressed inside the planner and execution engine itself, rather than bolted on externally.</p>'
  }
/>

<CoreBlock
  name="core-heading"
  content={
    '<h2 class="wp-block-heading h4"><strong>What DataFusion delivers for Spice</strong></h2>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>DataFusion enables several components that define Spice today:</p>'
  }
/>

<CoreBlock
  name="core-list"
  content={
    '<ul class="wp-block-list"><li><strong><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-black-color">SQL federation: </mark></strong>We can push computation down to source systems or pull it into local accelerators</li><li><strong><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-black-color">Pluggable acceleration:</mark> </strong>Spice accelerates datasets by materializing them in local compute engines, providing applications with high-performance, low-latency queries and dynamic compute flexibility beyond static materialization.&nbsp;&nbsp;<ul class="wp-block-list"><li>Spice supports multiple acceleration engines as first-class execution targets:&nbsp;ApacheDataFusion&nbsp;+ Apache Arrow, SQLite,&nbsp;<a href="/blog/introducing-spice-cayenne-data-accelerator" target="_blank" rel="noreferrer noopener">Spice Cayenne</a>,&nbsp;and&nbsp;DuckDB, with options for in-memory or on-disk storage. Accelerations are implemented as a standard&nbsp;DataFusion&nbsp;TableProvider&nbsp;that manages two underlying table providers: a federated&nbsp;table provider&nbsp;(pointing to the source system) and an acceleration engine&nbsp;table provider&nbsp;(the local materialized copy). This architecture&nbsp;enables&nbsp;accelerations to&nbsp;integrate with&nbsp;DataFusion\'s&nbsp;query planning and execution; Spice manages&nbsp;refresh&nbsp;by executing special&nbsp;DataFusion&nbsp;queries on the federated table and inserting results into the accelerated&nbsp;table. Most user queries are served directly from the accelerated table, with automatic fallbacks to the federated table under specific conditions (such as cache misses or data freshness requirements).&nbsp;</li></ul></li></ul>'
  }
/>

```rust
pub struct AcceleratedTable {
    dataset_name: TableReference,
    accelerator: Arc<dyn TableProvider>,     // Local cache (DuckDB, SQLite, Arrow)
    federated: Arc<FederatedTable>,          // Source data
    zero_results_action: ZeroResultsAction,  // Fallback behavior
    refresh_mode: RefreshMode,               // Full, Append, Changes
}
```

<CoreBlock
  name="core-list"
  content={
    '<ul class="wp-block-list"><li><strong><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-black-color">Search and AI as query operators:</mark> </strong>Vector search, text search, and LLM calls are modeled as UDFs and table functions.</li><li><strong><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-black-color">Resilient, production-grade execution:</mark> </strong>Deferred connections, fallback execution, schema casting, and cache invalidation all live inside the engine, not the application layer.</li><li><strong><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-black-color">Incremental improvements: </mark></strong>As DataFusion adds new optimizer capabilities, execution primitives, and APIs, we can adopt them incrementally while still shipping Spice-specific features on our own cadence</li></ul>'
  }
/>

<CoreBlock
  name="core-image"
  content={
    '<figure class="wp-block-image size-large"><img src="/website-assets/media/2025/12/Spice-Cayenne-Architecture-1024x692.png" alt="Spice Cayenne integration with DataFusion" class="wp-image-1721"/><figcaption class="wp-element-caption">Figure 2: Spice Cayenne integration with DataFusion </figcaption></figure>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    "<p>With that context, let's zoom in to some of the specifics of our implementation.</p>"
  }
/>

<CoreBlock
  name="core-heading"
  content={
    '<h2 class="wp-block-heading h3"><strong>SessionState Configuration</strong></h2>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>DataFusion\'s <code><a href="https://docs.rs/datafusion/latest/datafusion/execution/session_state/struct.SessionState.html">SessionState</a></code> holds all configuration for query execution. </p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-black-color"><strong>Key configuration choices</strong>:</mark></p>'
  }
/>

<CoreBlock
  name="core-list"
  content={
    '<ul class="wp-block-list"><li><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-black-color"><strong>PostgreSQL Dialect:</strong>&nbsp;</mark>We use&nbsp;PostgreSQL&nbsp;syntax to provide a widely supported SQL dialect with consistent, well-understood semantics.&nbsp;</li><li><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-black-color"><strong>Case-Sensitive Identifiers:</strong>&nbsp;</mark>Disabled normalization preserves column case from source systems.&nbsp;While we use the PostgreSQL dialect for syntax, we differ from PostgreSQL\'s behavior of normalizing identifiers to lower-case.&nbsp;</li><li><strong><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-black-color">Custom Analyzer Rules:</mark></strong>&nbsp;Our federation analyzer runs before&nbsp;DataFusion\'s&nbsp;default rules to ensure we produce valid federated plans. Some default optimizer rules assume a single execution engine and can generate invalid plans for federation, so we intercept early and then selectively apply&nbsp;DataFusion&nbsp;optimizations such as predicate and column pushdown.&nbsp;</li></ul>'
  }
/>

<CoreBlock
  name="core-heading"
  content={
    '<h2 class="wp-block-heading h3"><strong>Custom TableProvider Implementations</strong></h2>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p><code>TableProvider</code> is the interface between DataFusion and data sources. We implement it for every connector, but they fall into two distinct categories based on&nbsp;execution&nbsp;model:</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-black-color"><strong>SQL-Federated Sources</strong>:</mark> For these sources (e.g. PostgreSQL, MySQL, DuckDb, and Snowflake), the&nbsp;TableProvider&nbsp;acts primarily as a&nbsp;marker for the federation analyzer to discover. The actual execution&nbsp;doesn\'t&nbsp;follow&nbsp;DataFusion\'s&nbsp;normal path&nbsp;-&nbsp;instead, the federation analyzer&nbsp;identifies&nbsp;these tables and replaces them with a simple execution plan that defers computation to the remote source.&nbsp;</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={'<p>Take this query as an example: &nbsp; </p>'}
/>

```sql
SELECT
  count(*),
  course
FROM duckdb_table
GROUP BY
  course;
```

<CoreBlock
  name="core-paragraph"
  content={
    '<p>This query&nbsp;is sent almost unchanged to&nbsp;DuckDB, with&nbsp;DataFusion&nbsp;doing minimal work in the middle.&nbsp;</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>For single-source queries, Spice can often push the SQL down&nbsp;nearly unchanged. When a query spans multiple sources (e.g., JOIN/UNION across tables from different systems), Spice splits the work: it pushes per-source subqueries down, then lets&nbsp;DataFusion&nbsp;combine the results locally (see&nbsp;the <strong>SQL Federation</strong> section&nbsp;below for details).&nbsp;</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-black-color"><strong>Non-Federated Sources</strong>:</mark> For data lake tables and streaming sources where data is stored in formats like Parquet or <a href="https://github.com/vortex-data/vortex">Vortex</a> files, all execution happens within&nbsp;DataFusion. Here, the&nbsp;TableProvider&nbsp;implementation is critical; DataFusion&nbsp;directly uses the&nbsp;<code>scan()</code>&nbsp;method to create execution plans, and proper implementation of filter pushdown, projection, and other capabilities directly&nbsp;impacts&nbsp;query performance.&nbsp;</p>'
  }
/>

<CoreBlock
  name="core-heading"
  content={
    '<h3 class="wp-block-heading h4"><strong>Accelerated dataset architecture&nbsp;</strong>&nbsp;</h3>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>When acceleration is enabled for a dataset, we use a layered&nbsp;TableProvider&nbsp;architecture:&nbsp;</p>'
  }
/>

<CoreBlock
  name="core-code"
  content={
    '<pre class="wp-block-code"><code>┌─────────────────────────────────────────────────────────┐\n│                    AcceleratedTable                     │\n│  Wraps federated source with local cache                │\n│  Handles refresh, fallback, zero-results policies       │\n├─────────────────────────────────────────────────────────┤\n│                 Accelerator TableProvider               │\n│  DuckDB, SQLite, Arrow, Cayenne, PostgreSQL             │\n├─────────────────────────────────────────────────────────┤\n│                   FederatedTable                        │\n│  Supports immediate or deferred connection              │\n│  Enables SQL pushdown to source                         │\n├─────────────────────────────────────────────────────────┤\n│               Connector TableProvider                   │\n│  PostgreSQL, Snowflake, S3, DuckDB, etc.                │\n└─────────────────────────────────────────────────────────┘</code></pre>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>For non-accelerated datasets, the architecture is simpler;&nbsp;we register the&nbsp;federated&nbsp;TableProvider&nbsp;directly in&nbsp;DataFusion, without the&nbsp;AcceleratedTable&nbsp;layer or accelerator engine.&nbsp;</p>'
  }
/>

<CoreBlock
  name="core-heading"
  content={
    '<h3 class="wp-block-heading h4"><strong>AcceleratedTable</strong></h3>'
  }
/>

```rust
pub struct AcceleratedTable {
    dataset_name: TableReference,
    accelerator: Arc<dyn TableProvider>,     // Local cache (DuckDB, SQLite, Arrow)
    federated: Arc<FederatedTable>,          // Source data
    zero_results_action: ZeroResultsAction,  // Fallback behavior
    refresh_mode: RefreshMode,               // Full, Append, Changes
}
```

<CoreBlock
  name="core-paragraph"
  content={'<p><code>AcceleratedTable</code>&nbsp;provides:</p>'}
/>

<CoreBlock
  name="core-list"
  content={
    '<ul class="wp-block-list"><li><strong>Local query execution</strong>&nbsp;against the accelerator</li><li><strong>Background refresh</strong>&nbsp;from the federated source</li><li><strong>Fallback to source</strong>&nbsp;when local returns zero results (configurable)</li></ul>'
  }
/>

<CoreBlock
  name="core-heading"
  content={
    '<h3 class="wp-block-heading h4"><strong>FederatedTable</strong></h3>'
  }
/>

```rust
pub enum FederatedTable {
    // TableProvider available immediately
    Immediate(Arc<dyn TableProvider>),

    // Retries connection in background, serves stale data from checkpoint
    Deferred(DeferredTableProvider),
}
```

<CoreBlock
  name="core-paragraph"
  content={
    '<p><code>Deferred</code> mode enables resilient startup. If a source is temporarily unavailable, Spice starts with cached data and retries in the background.</p>'
  }
/>

<CoreBlock
  name="core-heading"
  content={
    '<h3 class="wp-block-heading h4"><strong>Data Source Coverage</strong></h3>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>We implement&nbsp;<code>TableProvider</code>&nbsp;for 20+ sources:</p>'
  }
/>

<CoreBlock
  name="core-table"
  content={
    '<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>Category</th><th>Sources</th></tr></thead><tbody><tr><td>Databases</td><td>PostgreSQL, MySQL, SQLite, DuckDB, MongoDB, Oracle, MSSQL, ClickHouse, Turso</td></tr><tr><td>Warehouses</td><td>Snowflake, Databricks, BigQuery, Redshift</td></tr><tr><td>Lakes</td><td>Delta Lake, Iceberg, S3, Azure Blob, GCS</td></tr><tr><td>Streaming</td><td>Kafka, Debezium, DynamoDB Streams</td></tr><tr><td>APIs</td><td>GraphQL, HTTP/REST, GitHub, SharePoint</td></tr><tr><td>Specialized</td><td>FTP/SFTP, SMB/NFS</td></tr></tbody></table></figure>'
  }
/>

<CoreBlock
  name="core-heading"
  content={
    '<h2 class="wp-block-heading h3"><strong>SQL Federation</strong></h2>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>For sources that support SQL (databases, warehouses), we&nbsp;push queries down&nbsp;rather than pulling all data; this means we minimize the work&nbsp;DataFusion&nbsp;does in the middle. The user query is parsed into a&nbsp;LogicalPlan, which the federation analyzer captures and converts (via the&nbsp;DataFusion&nbsp;unparser)&nbsp;into dialect-specific SQL executed directly by the source.&nbsp;&nbsp;</p>'
  }
/>

```sql
-- User query
SELECT name, SUM(amount) FROM sales
WHERE region = 'NA' AND date > '2024-01-01'
GROUP BY name

-- What we push to Snowflake (via Arrow Flight SQL)
SELECT name, SUM(amount) FROM sales
WHERE region = 'NA' AND date > '2024-01-01'
GROUP BY name

-- Only aggregated results flow over the network
```

<CoreBlock
  name="core-heading"
  content={
    '<h3 class="wp-block-heading h5"><strong>Multi-source query splitting </strong></h3>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>When a query references multiple federated tables - like a JOIN between Postgres and Snowflake - the federation analyzer rewrites the&nbsp;LogicalPlan&nbsp;into&nbsp;per-source subqueries. Each source executes its&nbsp;portion&nbsp;with filters/projections pushed down, and&nbsp;DataFusion&nbsp;performs the remaining work locally&nbsp;(e.g., join, union, final projection).&nbsp;</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={'<p>Consider this query:&nbsp;&nbsp;</p>'}
/>

```sql
SELECT
 o.order_id,
 o.order_date,
 c.name AS customer_name
FROM postgres.sales.orders o
JOIN snowflake.crm.customers c
 ON o.customer_id = c.customer_id
WHERE
 o.order_date >= DATE '2025-01-01'
AND c.country = 'KR';
```

<CoreBlock
  name="core-paragraph"
  content={
    '<p>The federation analyzer will split this into two queries, one each to Postgres and Snowflake: </p>'
  }
/>

<CoreBlock name="core-paragraph" content={'<p><em>Postgres:</em></p>'} />

```sql
SELECT
 order_id,
 order_date,
 customer_id
FROM sales.orders
WHERE order_date >= DATE '2025-01-01';
```

<CoreBlock name="core-paragraph" content={'<p><em>Snowflake:</em></p>'} />

```sql
SELECT
 customer_id,
 name
FROM crm.customers
WHERE country = 'KR';
```

<CoreBlock
  name="core-heading"
  content={
    '<h3 class="wp-block-heading h4"><strong>Federation Architecture</strong></h3>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>We use the&nbsp;<code>datafusion-federation</code>&nbsp;crate to handle query pushdown. At&nbsp;a high level, this enables&nbsp;DataFusion&nbsp;to&nbsp;identify&nbsp;sub-plans in a query that can be executed by an external system (for example, a database or warehouse), push those sub-plans down for remote execution, and then combine the results locally only when necessary.&nbsp;</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>This is how Spice can efficiently execute queries that span multiple systems,&nbsp;pushing&nbsp;filters, projections, joins, and aggregates to each source when supported, while handling any cross-source work inside&nbsp;DataFusion.&nbsp;</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Future articles will explore Spice\'s federation&nbsp;architecture&nbsp;in&nbsp;more detail<strong>.</strong>&nbsp;For readers interested in the underlying framework today, see the&nbsp;<a href="https://github.com/datafusion-contrib/datafusion-federation" target="_blank" rel="noreferrer noopener">datafusion-federation&nbsp;README</a>.&nbsp;</p>'
  }
/>

<CoreBlock
  name="core-heading"
  content={
    '<h3 class="wp-block-heading h4"><strong>Dialect Translation</strong></h3>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Different databases have different SQL dialects. As part of the query pipeline, we first parse the&nbsp;user&nbsp;query into a&nbsp;DataFusion&nbsp;LogicalPlan. The federation analyzer then captures that plan and uses the&nbsp;DataFusion&nbsp;unparser&nbsp;-&nbsp;extended with source-specific dialect rules&nbsp;-&nbsp;to convert it back into SQL that can be executed natively by the underlying system.&nbsp;</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>We&nbsp;rewrite&nbsp;DataFusion&nbsp;functions into their source-native equivalent:&nbsp;</p>'
  }
/>

```rust
pub fn new_duckdb_dialect() -> Arc<dyn Dialect> {
    DuckDBDialect::new().with_custom_scalar_overrides(vec![
        // cosine_distance → array_cosine_distance
        (COSINE_DISTANCE_UDF_NAME, Box::new(duckdb::cosine_distance_to_sql)),
        // rand() → random()
        ("rand", Box::new(duckdb::rand_to_random)),
        // regexp_like → regexp_matches
        (REGEXP_LIKE_NAME, Box::new(duckdb::regexp_like_to_sql)),
    ])
}
```

<CoreBlock
  name="core-heading"
  content={
    '<h2 class="wp-block-heading h3"><strong>Custom Optimizer Rules</strong></h2>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    "<p>DataFusion's&nbsp;optimizer is a pipeline of rules that can rewrite or wrap a logical plan. We extend this pipeline with our own rules for two purposes: (1) semantics-preserving rewrites that produce logically equivalent plans with better execution characteristics, and (2) engine-level behavior that we inject at planning time using the same rule extension point (for example, cache invalidation around DML). </p>"
  }
/>

<CoreBlock name="core-paragraph" content={'<p>Some examples:</p>'} />

<CoreBlock
  name="core-heading"
  content={
    '<h3 class="wp-block-heading h4"><strong>Cache Invalidation Rule</strong><a href="https://github.com/spiceai/spiceai/blob/lukim/blog/docs/blog/engineering/apache-datafusion-at-spiceai.md#cache-invalidation-rule"></a></h3>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    "<p>Cache invalidation is not a performance optimization; it's&nbsp;engine logic needed to keep cached results consistent after data changes. We implement it using&nbsp;DataFusion's&nbsp;optimizer rule interface as an extension point: when the planner&nbsp;encounters&nbsp;a DML statement (<code>INSERT</code>, <code>UPDATE</code>, <code>DELETE</code>), we wrap that DML plan in an extension node that triggers invalidation for the affected table(s) after the statement completes.&nbsp;</p>"
  }
/>

```rust
impl OptimizerRule for CacheInvalidationOptimizerRule {
    fn name(&self) -> &'static str {
        "cache_invalidation"
    }

    fn rewrite(
        &self,
        plan: LogicalPlan,
        _config: &dyn OptimizerConfig,
    ) -> Result<Transformed<LogicalPlan>> {
        plan.transform_down(|plan| match plan {
            LogicalPlan::Dml(dml) => {
                // Wrap DML with cache invalidation node
                let node = CacheInvalidationNode::new(
                    LogicalPlan::Dml(dml),
                    table_name,
                    Weak::clone(&self.caching),
                );
                Ok(Transformed::yes(LogicalPlan::Extension(
                    Extension { node: Arc::new(node) }
                )))
            }
            _ => Ok(Transformed::no(plan)),
        })
    }
}
```

<CoreBlock
  name="core-heading"
  content={
    '<h3 class="wp-block-heading h4"><strong>DuckDB Aggregate Pushdown</strong><a href="https://github.com/spiceai/spiceai/blob/lukim/blog/docs/blog/engineering/apache-datafusion-at-spiceai.md#duckdb-aggregate-pushdown"></a></h3>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>When federation is enabled, aggregate pushdown is normally handled by the federation analyzer. When federation is disabled, those analyzer-based pushdowns do not run, and aggregates would not be pushed down through the standard&nbsp;TableProvider&nbsp;interface. To preserve aggregate pushdown for&nbsp;DuckDB-accelerated tables in that configuration, we apply a&nbsp;DuckDB-specific optimizer rule that recognizes supported aggregate functions and rewrites the plan to execute the aggregation inside&nbsp;DuckDB:&nbsp;</p>'
  }
/>

```rust
static SUPPORTED_AGG_FUNCTIONS: LazyLock<HashSet<&str>> = LazyLock::new(|| {
    HashSet::from([
        // Basic aggregates
        "avg", "count", "max", "min", "sum",
        // Statistical
        "corr", "covar_pop", "stddev_pop", "var_pop",
        // Boolean
        "bool_and", "bool_or",
        // Approximate
        "approx_percentile_cont",
    ])
});
```

<CoreBlock
  name="core-paragraph"
  content={'<p>When enabled, the optimizer rewrites:</p>'}
/>

```sql
-- Original (DataFusion executes aggregate)
SELECT region, SUM(sales) FROM duckdb_table GROUP BY region

-- Rewritten (DuckDB executes aggregate via SQL federation)
SELECT region, SUM(sales) FROM duckdb_table GROUP BY region
-- Pushed as native DuckDB SQL
```

<CoreBlock
  name="core-heading"
  content={
    '<h3 class="wp-block-heading h4"><strong>Physical Optimizer: Empty Hash Join</strong><a href="https://github.com/spiceai/spiceai/blob/lukim/blog/docs/blog/engineering/apache-datafusion-at-spiceai.md#physical-optimizer-empty-hash-join"></a></h3>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>If we can prove one side of a join is empty at planning time, we skip execution:</p>'
  }
/>

```rust
impl PhysicalOptimizerRule for EmptyHashJoinExecPhysicalOptimization {
    fn optimize(
        &self,
        plan: Arc<dyn ExecutionPlan>,
        _config: &ConfigOptions,
    ) -> Result<Arc<dyn ExecutionPlan>> {
        plan.transform_down(|plan| {
            let Some(join) = plan.as_any().downcast_ref::<HashJoinExec>() else {
                return Ok(Transformed::no(plan));
            };

            let is_empty = match join.join_type() {
                JoinType::Inner =>
                    guaranteed_empty(join.left()) || guaranteed_empty(join.right()),
                JoinType::Left =>
                    guaranteed_empty(join.left()),
                // ... other join types
            };

            if is_empty {
                Ok(Transformed::yes(Arc::new(EmptyExec::new(join.schema()))))
            } else {
                Ok(Transformed::no(plan))
            }
        }).data()
    }
}
```

<CoreBlock
  name="core-heading"
  content={
    '<h2 class="wp-block-heading h3"><strong>User-Defined Functions</strong></h2>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>DataFusion supports scalar UDFs, aggregate UDFs, and table-valued functions. </p>'
  }
/>

<CoreBlock name="core-paragraph" content={'<p>We use all three:</p>'} />

<CoreBlock
  name="core-heading"
  content={'<h3 class="wp-block-heading h4"><strong>Scalar UDFs</strong></h3>'}
/>

<CoreBlock
  name="core-paragraph"
  content={'<p>Simple functions that operate on individual values:</p>'}
/>

```rust
use datafusion::common::hash_utils::create_hashes;
pub struct Bucket;
impl ScalarUDFImpl for Bucket {
    fn name(&self) -> &'static str {
        "bucket"
    }
    fn signature(&self) -> &Signature {
        &Signature::any(2, Volatility::Immutable)
    }
    fn return_type(&self, arg_types: &[DataType]) -> Result<DataType, DataFusionError> {
        Ok(DataType::Int32)
    }
    fn invoke_with_args(&self, args: ScalarFunctionArgs) -> Result<ColumnarValue, DataFusionError> {
        let args = args.args;
        let num_args = args.len();
        if num_args != 2 {
            return Err(BucketError::InvalidArgumentCount { count: args.len() }.into());
        }
        let num_buckets = match &args[0] {
            ColumnarValue::Scalar(ScalarValue::Int64(Some(n))) => {
                if *n <= 0 || *n > MAX_NUM_BUCKETS {
                    return Err(BucketError::InvalidNumBuckets { num_buckets: *n }.into());
                }
                *n
            }
            arg => {
                return Err(BucketError::InvalidFirstArgType {
                    description: describe_columnar_value(arg),
                }
                .into());
            }
        };
        match &args[1] {
            ColumnarValue::Scalar(scalar) => {
                let bucket = compute_bucket(scalar, num_buckets)?;
                Ok(ColumnarValue::Scalar(bucket))
            }
            ColumnarValue::Array(array) => {
                let buckets = compute_bucket_array(array, num_buckets)?;
                Ok(ColumnarValue::Array(Arc::new(buckets)))
            }
        }
    }
}
fn compute_bucket(scalar: &ScalarValue, num_buckets: i64) -> Result<ScalarValue, DataFusionError> {
    if scalar.is_null() {
        return Ok(ScalarValue::Int32(None));
    }
    let array = scalar.to_array()?;
    let mut hashes = vec![0; 1];
    create_hashes(&[array], &RANDOM_STATE, &mut hashes)?;
    Ok(ScalarValue::Int32(Some(
        u64::try_from(num_buckets)
            .and_then(|n| i32::try_from(hashes[0] % n))
            .context(BucketLargerThanTypeSnafu)?,
    )))
}
```

<CoreBlock
  name="core-heading"
  content={
    '<h3 class="wp-block-heading h4"><strong>Async Scalar UDFs for AI</strong></h3>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p><a href="https://github.com/spiceai/spiceai/blob/lukim/blog/docs/blog/engineering/apache-datafusion-at-spiceai.md#async-scalar-udfs-for-ai"></a>LLM calls are async. DataFusion\'s&nbsp;<code>AsyncScalarUDFImpl</code>&nbsp;trait enables this:</p>'
  }
/>

```rust
pub struct Ai {
    model_store: Arc<RwLock<ChatModelStore>>,
}

#[async_trait]
impl AsyncScalarUDFImpl for Ai {
    fn name(&self) -> &str { "ai" }

    async fn invoke_async(
        &self,
        args: ScalarFunctionArgs,
    ) -> DataFusionResult<ColumnarValue> {
        let prompt = extract_string(&args.args[0])?;
        let model_name = extract_string(&args.args[1])?;

        let model = self.model_store.read().get(&model_name)?;
        let response = model.complete(&prompt).await?;

        Ok(ColumnarValue::Scalar(ScalarValue::Utf8(Some(response))))
    }
}
```

<CoreBlock name="core-paragraph" content={'<p>Example usage:</p>'} />

```sql
SELECT ai('Summarize this text: ' || content, 'gpt-4') as summary
FROM documents
```

<CoreBlock
  name="core-heading"
  content={
    '<h3 class="wp-block-heading h4"><strong>‍‍Table-Valued Functions</strong></h3>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p><a href="https://github.com/spiceai/spiceai/blob/lukim/blog/docs/blog/engineering/apache-datafusion-at-spiceai.md#table-valued-functions"></a><code>vector_search()</code>&nbsp;and&nbsp;<code>text_search()</code>&nbsp;return tables:</p>'
  }
/>

```rust
impl TableFunctionImpl for VectorSearchTableFunc {
    fn call(&self, args: &[Expr]) -> DataFusionResult<Arc<dyn TableProvider>> {
        let parsed = Self::parse_args(args)?;
        let df = self.df.upgrade().context("Runtime dropped")?;

        let table = df.get_table_sync(&parsed.table)?;
        let embedding_table = find_embedding_table(&table)?;

        Ok(Arc::new(VectorSearchUDTFProvider {
            args: parsed,
            underlying: table,
            embedding_models: embedding_table.embedding_models,
        }))
    }
}
```

<CoreBlock name="core-paragraph" content={'<p>Example usage: </p>'} />

```sql
SELECT * FROM vector_search(
    'documents',
    'embedding_column',
    'search query text',
    10  -- top k
)
```

<CoreBlock
  name="core-heading"
  content={
    '<h3 class="wp-block-heading h4"><strong>UDF Registration</strong></h3>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p><a href="https://github.com/spiceai/spiceai/blob/lukim/blog/docs/blog/engineering/apache-datafusion-at-spiceai.md#udf-registration"></a>All UDFs are registered at runtime startup:</p>'
  }
/>

```rust
pub async fn register_udfs(runtime: &crate::Runtime) {
    let ctx = &runtime.df.ctx;

    // Scalar UDFs
    ctx.register_udf(CosineDistance::new().into());
    ctx.register_udf(Bucket::new().into());
    ctx.register_udf(Truncate::new().into());

    // Async UDFs for AI
    #[cfg(feature = "models")]
    {
        ctx.register_udf(Embed::new(runtime.embeds()).into());
        ctx.register_udf(
            Ai::new(runtime.completion_llms())
                .into_async_udf()
                .into_scalar_udf(),
        );
    }

    // Table-valued functions
    ctx.register_udtf("vector_search", Arc::new(VectorSearchTableFunc::new(...)));
    ctx.register_udtf("text_search", Arc::new(TextSearchTableFunc::new(...)));
}
```

<CoreBlock
  name="core-heading"
  content={
    '<h2 class="wp-block-heading h3"><strong>Physical Execution Extensions</strong></h2>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p><a href="https://github.com/spiceai/spiceai/blob/lukim/blog/docs/blog/engineering/apache-datafusion-at-spiceai.md#physical-execution-extensions"></a>Sometimes we need custom execution behavior beyond logical planning:</p>'
  }
/>

<CoreBlock
  name="core-heading"
  content={
    '<h3 class="wp-block-heading h4"><strong>FallbackOnZeroResultsScanExec</strong></h3>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>If an accelerated table returns zero rows, optionally fall back to the source:</p>'
  }
/>

```rust
pub struct FallbackOnZeroResultsScanExec {
    input: Arc<dyn ExecutionPlan>,
    fallback_table_provider: FallbackAsyncTableProvider,
    fallback_scan_params: TableScanParams,
}

impl ExecutionPlan for FallbackOnZeroResultsScanExec {
    fn execute(
        &self,
        partition: usize,
        context: Arc<TaskContext>,
    ) -> DataFusionResult<SendableRecordBatchStream> {
        let input_stream = self.input.execute(partition, context.clone())?;

        // Wrap stream to detect zero results and trigger fallback
        Ok(Box::pin(FallbackStream::new(
            input_stream,
            self.fallback_table_provider.clone(),
            self.fallback_scan_params.clone(),
            context,
        )))
    }
}
```

<CoreBlock
  name="core-heading"
  content={
    '<h3 class="wp-block-heading h4"><strong>SchemaCastScanExec</strong></h3>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p><code>SchemeCastScanExec</code>&nbsp;handles type representation differences across systems during streaming. Different systems&nbsp;represent&nbsp;the same logical types differently. For example, SQLite only supports 5 types while Arrow has 30+ types.&nbsp;<code>SchemaCastScanExec</code>&nbsp;maps between these type system differences as data streams through&nbsp;DataFusion, ensuring type compatibility across connectors:&nbsp;&nbsp;</p>'
  }
/>

```rust
pub struct SchemaCastScanExec {
    input: Arc<dyn ExecutionPlan>,
    target_schema: SchemaRef,
}

impl ExecutionPlan for SchemaCastScanExec {
    fn execute(...) -> DataFusionResult<SendableRecordBatchStream> {
        let input_stream = self.input.execute(partition, context)?;

        Ok(Box::pin(SchemaCastStream::new(
            input_stream,
            Arc::clone(&self.target_schema),
        )))
    }
}
```

<CoreBlock
  name="core-heading"
  content={
    '<h3 class="wp-block-heading h4"><a href="https://github.com/spiceai/spiceai/blob/lukim/blog/docs/blog/engineering/apache-datafusion-at-spiceai.md#fallbackonzeroresultsscanexec"></a><strong>Extension Planners</strong></h3>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={'<p>Custom logical plan nodes need physical planners:</p>'}
/>

```rust
pub fn default_extension_planners() -> Vec<Arc<dyn ExtensionPlanner>> {
    vec![
        Arc::new(IndexTableScanExtensionPlanner::new()),
        Arc::new(FederatedPlanner::new()),
        Arc::new(CacheInvalidationExtensionPlanner::new()),
        #[cfg(feature = "duckdb")]
        DuckDBLogicalExtensionPlanner::new(),
    ]
}
```

<CoreBlock
  name="core-heading"
  content={
    '<h2 class="wp-block-heading h3"><strong>Our DataFusion fork and contributions</strong></h2>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Building&nbsp;Spice on Apache&nbsp;DataFusion&nbsp;meant moving quickly at layers of the engine that are still actively evolving upstream.&nbsp;Very early&nbsp;on, we made a deliberate decision to&nbsp;maintain&nbsp;a fork of&nbsp;DataFusion&nbsp;rather than treat it as a fixed dependency. We maintain a fork of DataFusion at <code>spiceai/datafusion</code>:</p>'
  }
/>

```yaml
datafusion = { git = "https://github.com/spiceai/datafusion", rev = "10b5cc5" }
```

<CoreBlock
  name="core-paragraph"
  content={
    '<p>The benefits of&nbsp;maintaining&nbsp;our own fork include:&nbsp;</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p><strong><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-black-color">Faster iteration:</mark> </strong>We can ship features before&nbsp;they\'re&nbsp;merged upstream. Some patches are tightly coupled to Spice-specific concepts-federation semantics, acceleration policies, or execution behaviors that&nbsp;don\'t&nbsp;generalize cleanly to other&nbsp;DataFusion&nbsp;users. Keeping those changes in our fork lets us move fast without forcing premature abstractions into the core engine.&nbsp;</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p><strong><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-black-color">Predictable stability:</mark></strong> We control when we rebase, when we absorb breaking changes, and how we roll out upgrades. This is critical for a production system that spans dozens of connectors and execution paths.&nbsp;</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    "<p>That said, we work hard to avoid drifting away from the community. When improvements are broadly useful-bug fixes, performance optimizations, clearer APIs, or missing documentation-we contribute them back upstream. We stay close to&nbsp;DataFusion's&nbsp;main branch and regularly rebase our fork, treating upstream not as an external dependency but as a shared foundation we help&nbsp;maintain.&nbsp;</p>"
  }
/>

<CoreBlock
  name="core-heading"
  content={
    '<h2 class="wp-block-heading h3"><strong>Lessons learned from building on DataFusion</strong></h2>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>After building Spice on top of DataFusion in production for multiple years, a few patterns and lessons have consistently stood out: </p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-black-color"><strong>1. TableProvider is incredibly powerful</strong>:</mark> The TableProvider abstraction lets us add any data source without modifying DataFusion. We\'ve implemented 20+ connectors this way.<br><br><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-black-color"><strong>2. Optimizer rules compose well</strong>:</mark> Each rule does one thing. Cache invalidation, aggregate pushdown, and empty join elimination all coexist without conflicts.<br><br><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-black-color"><strong>3. Physical planning is the escape hatch</strong>: </mark>When logical transformations aren\'t enough, custom <code>ExecutionPlan</code> implementations let us do anything - fallback streams, schema casting, managed runtimes.<br><br><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-black-color"><strong>4. Schema metadata is your friend</strong>: </mark>Arrow schema metadata flows through the entire pipeline. We use it for:</p>'
  }
/>

<CoreBlock
  name="core-list"
  content={
    '<ul class="wp-block-list"><li>Source tracking (which connector)</li><li>Acceleration status (accelerated vs. federated)</li><li>Optimization hints (enable aggregate pushdown)</li></ul>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-black-color"><strong>5. Async UDFs open new possibilities</strong>: </mark>DataFusion\'s async UDF support enables SQL-embedded AI:</p>'
  }
/>

```sql
SELECT ai('Summarize: ' || text) FROM articles
```

<CoreBlock
  name="core-paragraph"
  content={"<p>This wouldn't be possible with synchronous-only UDFs.</p>"}
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-black-color"><strong>6. Federation requires dialect awareness</strong>:</mark> Different databases have different SQL. Plan for dialect translation from the start, not as an afterthought.</p>'
  }
/>

<CoreBlock
  name="core-heading"
  content={'<h2 class="wp-block-heading h3"><strong>Conclusion</strong></h2>'}
/>

<CoreBlock
  name="core-paragraph"
  content={
    "<p>Apache DataFusion is the foundation of Spice's query engine: parsing, planning, optimization, and execution all delivered entirely in Rust, with native Arrow memory and vectorized execution. Its design lets us extend the engine at every layer, adding custom table providers, optimizer rules, and execution operators without rewriting or wrapping the core.</p>"
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    "<p>DataFusion isn't just a fast SQL engine - it's a programmable query compiler. Stable extension points like <code>TableProvider</code>, <code>OptimizerRule</code>, <code>ExecutionPlan</code>, and <code>ScalarUDFImpl</code> allow us to express federation, acceleration, search, and AI inference <em>inside the planner and runtime</em>, not as external systems. By building on these abstractions and contributing improvements back upstream, we get a production-grade engine that evolves with our needs rather than constraining them.</p>"
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>If you have further questions about our implementation or are interested in learning more about the Spice platform, join us on <a href="/slack">Slack</a>. </p>'
  }
/>

<CoreBlock
  name="core-heading"
  content={'<h3 class="wp-block-heading h4"><strong>References</strong></h3>'}
/>

<CoreBlock
  name="core-list"
  content={
    '<ul class="wp-block-list"><li><a href="https://datafusion.apache.org/library-user-guide/adding-a-data-source.html">Writing a Custom TableProvider</a><a href="https://github.com/spiceai/spiceai/blob/lukim/blog/docs/blog/engineering/apache-datafusion-at-spiceai.md#table-valued-functions"></a></li><li><a href="https://datafusion.apache.org/">Apache DataFusion Documentation</a></li><li><a href="https://github.com/apache/datafusion">DataFusion GitHub</a></li><li><a href="https://github.com/apache/datafusion/tree/main/datafusion-examples">DataFusion Examples</a></li><li><a href="https://github.com/datafusion-contrib/datafusion-federation">datafusion-federation</a></li></ul>'
  }
/>

<CoreBlock name="core-paragraph" content={'<p></p>'} />

## Frequently Asked Questions

### What is Apache DataFusion?

Apache DataFusion is an extensible SQL query engine written in Rust that uses Apache Arrow as its in-memory columnar format. It provides SQL parsing, query planning, optimization, and execution, and is designed to be embedded into other systems via well-defined extension points like `TableProvider`, `OptimizerRule`, and `ExecutionPlan`.

### How does Spice AI use Apache DataFusion?

Spice uses DataFusion as its core query engine for parsing SQL, planning queries, optimizing execution, and running federated queries across 30+ data sources. Spice extends DataFusion with custom table providers for [SQL federation](/platform/sql-federation-acceleration), optimizer rules for acceleration routing, UDFs for [hybrid search](/platform/hybrid-sql-search) and [LLM inference](/platform/llm-inference), and physical operators for schema casting and fallback streams.

### What are DataFusion TableProviders?

TableProviders are DataFusion's abstraction for data sources. Each TableProvider implements methods to describe the table schema, report statistics, and produce execution plans. Spice uses custom TableProviders to connect to databases like PostgreSQL, DynamoDB, Snowflake, and Iceberg catalogs, enabling federated SQL queries across all of them.

### Can DataFusion handle federated queries across multiple databases?

Yes. Through DataFusion's `TableProvider` interface and custom optimizer rules, Spice routes queries to remote databases via predicate and projection pushdown, executes portions of queries at the source, and combines results locally. This enables joining data across PostgreSQL, S3, Snowflake, and other sources in a single SQL query.

### Does Spice contribute back to the Apache DataFusion project?

Yes. Spice maintains a fork of DataFusion for rapid iteration but regularly contributes improvements back upstream, including bug fixes, performance optimizations, and API enhancements. The team treats upstream DataFusion as a shared foundation rather than an external dependency.

DataFusion is also the foundation of Spice's [distributed query](/feature/distributed-query) engine. To evaluate Spice on your own federated workloads, review [Spice Cloud pricing](/pricing) or [get a demo](/get-a-demo).

<ContentResourceFeatured
  fields={{
    heading: 'Explore more Spice resources',
    paragraph: 'Hands-on tutorials, product docs, and real-world examples.',
    mode: 'related',
    resources: false,
    padding_top: 'unset',
    padding_bottom: 'unset',
    related_posts: [
      {
        title: 'A Developer&#8217;s Guide to Understanding Spice.ai',
        slug: '/blog/a-developers-guide-to-understanding-spice-ai',
        excerpt:
          'This guide helps developers build a mental model of why, how, and where to use Spice.',
        image:
          '/website-assets/media/2026/02/A-developers-guide-to-understanding-Spice.ai_.png',
        type: 'Blog',
        taxonomy: [
          'Engineering',
          'Spice AI',
          'Spice Cloud Platform',
          'Spice OSS',
        ],
      },
      {
        title:
          'Spice Cloud v1.11: Spice Cayenne Reaches Beta, Apache DataFusion v51, DynamoDB Streams Improvements, &amp; More',
        slug: '/blog/spice-cloud-v1-11',
        excerpt:
          'Spice Cloud v1.11 focuses on what matters most in production: faster queries, lower memory usage, and predictable performance across acceleration and caching.',
        image: '/website-assets/media/2026/01/Spice-Cloud-v1.11-Update.png',
        type: 'Blog',
        taxonomy: ['Releases', 'Spice Cloud Platform'],
      },
      {
        title: 'Real-Time Control Plane Acceleration with DynamoDB Streams ',
        slug: '/blog/real-time-acceleration-with-dynamodb-streams',
        excerpt:
          'How to sync DynamoDB data to thousands of nodes with sub-second latency using a two-tier architecture with DynamoDB Streams and Spice acceleration.',
        image: '/website-assets/media/2026/01/image-33.png',
        type: 'Blog',
        taxonomy: [
          'Data Acceleration',
          'Engineering',
          'Spice Cloud Platform',
          'Spice OSS',
        ],
      },
    ],
  }}
/>

<TalkToAnEngineerCta />

<ContentRichText
  fields={{
    coverage: 'rc-end',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

---

## Interviewing at Spice AI
URL: https://spice.ai/blog/interviewing-at-spice-ai
Date: 2024-03-14T19:22:00
Description: A guide to the Spice AI interview process, covering what to expect at each stage, how we evaluate candidates, and tips for preparation.

<ContentRichText
  fields={{
    coverage: 'rc-start',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<CoreBlock
  name="core-paragraph"
  content={
    "<p>It's been said that a leader's core job is two things. One, set direction and two, put the right people in the right roles. That's why at Spice AI, the mission, hiring, and interviewing is fundamental and the people we bring into the team is critical for success. This post walks through our interviewing process as a guide for candidates and to share our learnings with the broader community.</p>"
  }
/>

<CoreBlock
  name="core-heading"
  content={
    '<h2 class="wp-block-heading h4"><strong>Spice AI Hiring Principles</strong></h2>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Everything we do at Spice AI is built from first-principles. Here are our hiring principles:</p>'
  }
/>

<CoreBlock
  name="core-list"
  content={
    '<ol class="wp-block-list"><li><strong>High Standards</strong>&nbsp;- Every hire is exceptional and a bar raiser.</li><li><strong>Mission-Driven</strong>&nbsp;- Candidates are excited by and want to contribute to the Spice AI mission.</li><li><strong>Able</strong>&nbsp;- Hires are&nbsp;<strong>intelligent</strong>, are&nbsp;<strong>great communicators</strong>, and&nbsp;<strong>have done this before</strong>&nbsp;with a proven track record. As a startup, we need contributors who can hit the ground running and contribute from day 1. We\'re also distributed, so communication is critical.</li><li><strong>Willing</strong>&nbsp;- Hires know the value of overcoming challenge, doing hard things, and are willing to put in the work to build something great together.</li><li><strong>Clarity of thought</strong>&nbsp;- Hires demonstrate clear thinking and problem solving, with written pieces to back it up, because&nbsp;<a href="https://twitter.com/paulg/status/1528288106734141440?s=61&amp;t=6PjnKuz194dIQLPY7_tqiA" target="_blank" rel="noreferrer noopener"><em>"if you\'re not writing, you\'re not thinking."</em></a></li><li><strong>Great judgement</strong>&nbsp;- Hires have a history of making great judgement calls and decisions.</li><li><strong>Vectors over scalars</strong>&nbsp;- Beyond table stakes, direction and velocity more important than a single measure of skill or ability.</li><li><strong>Hire people not just resumes</strong>&nbsp;- We\'re on this mission and are building this company together.</li></ol>'
  }
/>

<CoreBlock
  name="core-heading"
  content={
    '<h2 class="wp-block-heading h4"><strong>A Unique Approach to Interviews</strong></h2>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>The Spice AI interview process includes a couple of unique elements. We generally minimize methods, like whiteboard interviews, which we believe to have limited value.</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>-&nbsp;<strong>Pair Programming:&nbsp;</strong>Pair programming sessions help assess collaboration, clarity of thought, and problem solving using real-world challenges. The first session is in your choice of Go or Rust, playing to your strengths, and the second in the other, demonstrating drive for results, adaptability, problem solving, and learning rate.</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>-&nbsp;<strong>Book and Paper Challenge:</strong>&nbsp;We introduce a novel way to get to know candidates and for them to get to know the team by discussing a research paper, white paper, or leadership book. Think of it like a mini book club. We ask the candidate to lead the discussion as if they were on the team already.</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Example papers:&nbsp;<a href="https://arxiv.org/abs/2312.02530" target="_blank" rel="noreferrer noopener">MEMTO</a>,&nbsp;<a href="https://www.sciencedirect.com/science/article/pii/S0169207021000637" target="_blank" rel="noreferrer noopener">Temporal Fusion Transformers</a>,&nbsp;<a href="https://arxiv.org/pdf/2307.16789.pdf" target="_blank" rel="noreferrer noopener">ToolLLM</a>,&nbsp;<a href="https://peerj.com/preprints/3190/" target="_blank" rel="noreferrer noopener">Forecasting at Scale</a>.</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Example books:&nbsp;<a href="https://www.goodreads.com/en/book/show/40745" target="_blank" rel="noreferrer noopener">Mindset</a>,&nbsp;<a href="https://www.goodreads.com/book/show/6391876-the-big-leap?from_search=true&amp;from_srp=true&amp;qid=HfJIBHwNSM&amp;rank=1" target="_blank" rel="noreferrer noopener">The Big Leap</a>,&nbsp;<a href="https://www.goodreads.com/book/show/23848190-extreme-ownership?from_search=true&amp;from_srp=true&amp;qid=YUqz6HNyph&amp;rank=1" target="_blank" rel="noreferrer noopener">Extreme Ownership</a>,&nbsp;<a href="https://www.goodreads.com/book/show/27213329-grit?from_search=true&amp;from_srp=true&amp;qid=afA4T4cERJ&amp;rank=1" target="_blank" rel="noreferrer noopener">Grit</a>,&nbsp;<a href="https://www.goodreads.com/book/show/324748.The_Dip?from_search=true&amp;from_srp=true&amp;qid=2Pom3pSZiH&amp;rank=1" target="_blank" rel="noreferrer noopener">The Dip</a>,&nbsp;<a href="https://www.goodreads.com/book/show/17255186-the-phoenix-project?from_search=true&amp;from_srp=true&amp;qid=0VSr9SfDHM&amp;rank=1" target="_blank" rel="noreferrer noopener">The Phoenix Project</a>.</p>'
  }
/>

<CoreBlock
  name="core-heading"
  content={
    '<h2 class="wp-block-heading h4"><strong>Standard Interview Process</strong></h2>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Once a candidate proceeds to the engineering team, the standard interview process has two stages, either on the same or different days, and is as follows.</p>'
  }
/>

<CoreBlock
  name="core-image"
  content={
    '<figure class="wp-block-image"><img src="https://cdn.prod.website-files.com/6362f59f9fd4ac355fc06eaf/6674a910c9fb7525939844ff_1*6x6W3LpuHIwkfjzwvK1DGQ.webp" alt="Spice AI interview process diagram"/><figcaption class="wp-element-caption">The Spice AI interview process</figcaption></figure>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    "<p>After the interview, the team will meet separately to discuss the candidate's performance. Candidate profiles put forward as hires will then be presented in the weekly team meeting. A member of the team must advocate for the candidate for them to be given an offer.</p>"
  }
/>

<CoreBlock
  name="core-heading"
  content={
    '<h2 class="wp-block-heading h4"><strong>Keys to Success at Spice AI</strong></h2>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>To succeed in becoming a part of the Spice AI team, candidates must demonstrate more than just technical proficiency. Being an A-player is table stakes. We look for individuals who are adaptable, thrive on challenge, and are deeply committed to the mission of making a better world through intelligent, AI-driven software.</p>'
  }
/>

<CoreBlock
  name="core-heading"
  content={'<h2 class="wp-block-heading h4"><strong>Conclusion</strong></h2>'}
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>At Spice AI, we believe A-players want to work with other A-players to create and contribute to something meaningful. We strive to build a team of exceptional individuals aligned to the Spice AI vision and mission. Hiring is principled and uniquely designed to ensure the right people are in the right roles. The interview process is thorough and challenging, but know that if you succeed, you will join and be working with others who have also overcome it and want to build side-by-side with you.</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>If that resonates with you, check out our open roles at&nbsp;<a href="/careers" target="_blank" rel="noreferrer noopener">spice.ai/careers</a>, and apply today!</p>'
  }
/>

<CoreBlock
  name="core-heading"
  content={
    '<h2 class="wp-block-heading h4"><strong>About Spice AI</strong></h2>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Founded in June 2021 by Microsoft and GitHub alumni Luke Kim and Phillip LeBlanc, Spice AI creates technology to help developers build intelligent apps that learn and adapt.</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Before co-founding Spice AI, Luke was the co-creator of Azure Incubations in the Office of the Azure CTO, where he led cross-functional engineering teams to create and develop technologies like&nbsp;<a href="https://dapr.io/" target="_blank" rel="noreferrer noopener">Dapr</a>,&nbsp;<a href="https://oam.dev/" target="_blank" rel="noreferrer noopener">OAM</a>, and&nbsp;<a href="https://techcommunity.microsoft.com/t5/educator-developer-blog/introducing-radius-a-new-open-source-project-for-teams-building/ba-p/3976183" target="_blank" rel="noreferrer noopener">Radius</a>.</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Spice AI is backed by some of the top industry angel investors and leaders, including&nbsp;<a href="https://twitter.com/natfriedman" target="_blank" rel="noreferrer noopener">Nat Friedman</a>, Chairman of GitHub,&nbsp;<a href="https://twitter.com/markrussinovich" target="_blank" rel="noreferrer noopener">Mark Russinovich</a>, CTO of Microsoft Azure, and&nbsp;<a href="https://twitter.com/ashtom" target="_blank" rel="noreferrer noopener">Thomas Dohmke</a>, CEO of GitHub who is also on Spice AI\'s board.</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Spice AI also has notable VC backing from&nbsp;<a href="https://www.madrona.com/ready-for-some-spice-in-your-apps-our-investment-in-spice-ai/" target="_blank" rel="noreferrer noopener">Madrona Venture Group</a>,&nbsp;<a href="https://www.basisset.com/" target="_blank" rel="noreferrer noopener">Basis Set Ventures</a>,&nbsp;<a href="https://www.founderscoop.com/" target="_blank" rel="noreferrer noopener">Founders\' Co-op</a>, and&nbsp;<a href="https://www.picuscap.com/" target="_blank" rel="noreferrer noopener">Picus Capital</a>.</p>'
  }
/>

<CoreBlock
  name="core-heading"
  content={'<h2 class="wp-block-heading h4"><strong>Learn More</strong></h2>'}
/>

<CoreBlock
  name="core-list"
  content={
    '<ul class="wp-block-list"><li><a href="/about-us" target="_blank" rel="noreferrer noopener">About Spice AI</a></li><li><a href="/careers" target="_blank" rel="noreferrer noopener">Spice AI Careers</a></li><li><a href="/blog" target="_blank" rel="noreferrer noopener">The Spice AI Blog</a></li><li><a href="https://github.com/spiceai/spiceai" target="_blank" rel="noreferrer noopener">Spice.ai OSS GitHub</a></li><li><a href="https://techcrunch.com/2021/10/14/spice-ai-wants-to-help-developers-build-smarter-applications/" target="_blank" rel="noreferrer noopener">TechCrunch</a>&nbsp;and&nbsp;<a href="https://www.geekwire.com/2022/seattle-startup-raises-13-5m-to-help-developers-build-ai-driven-applications-on-the-blockchain/" target="_blank" rel="noreferrer noopener">GeekWire</a></li></ul>'
  }
/>

<CoreBlock name="core-paragraph" content={'<p></p>'} />

<ContentResourceFeatured
  fields={{
    heading: 'Explore more Spice resources',
    paragraph:
      'Tutorials, docs, and blog posts to help you go deeper with Spice.',
    mode: 'related',
    resources: false,
    padding_top: 'unset',
    padding_bottom: 'unset',
    related_posts: [
      {
        title: 'A Developer&#8217;s Guide to Understanding Spice.ai',
        slug: '/blog/a-developers-guide-to-understanding-spice-ai',
        excerpt:
          'This guide helps developers build a mental model of why, how, and where to use Spice.',
        image:
          '/website-assets/media/2026/02/A-developers-guide-to-understanding-Spice.ai_.png',
        type: 'Blog',
        taxonomy: [
          'Engineering',
          'Spice AI',
          'Spice Cloud Platform',
          'Spice OSS',
        ],
      },
      {
        title: 'How we use Apache DataFusion at Spice AI',
        slug: '/blog/how-we-use-apache-datafusion-at-spice-ai',
        excerpt:
          'Why we chose to build on DataFusion and how we extended it with custom TableProviders, optimizer rules, and UDFs for federated SQL',
        image:
          '/website-assets/media/2026/01/Engineering-at-Spice-AI-Apache-DataFusion.png',
        type: 'Blog',
        taxonomy: [
          'Spice AI',
          'Spice Cloud Platform',
          'Spice OSS',
          'SQL Federation',
        ],
      },
      {
        title: 'Real-Time Hybrid Search Using RRF: A Hands-On Guide with Spice',
        slug: '/blog/real-time-hybrid-search-using-rrf',
        excerpt:
          'Surfacing relevant answers to searches across datasets has historically meant navigating significant tradeoffs.&nbsp;Keyword (or lexical) search&nbsp;is fast, cheap, and commoditized, but limited by the constraints of exact matching.&nbsp;Vector (or semantic) search&nbsp;captures nuance and intent, but can be slower, harder to debug, and expensive to run at scale. Combining both usually entails standing up multiple engines [&hellip;]',
        image:
          '/website-assets/media/2025/11/68fa4fdfded26b3b6472a172_image-8.png',
        type: 'Blog',
        taxonomy: ['Search', 'Spice AI'],
      },
    ],
  }}
/>

<TalkToAnEngineerCta />

<ContentRichText
  fields={{
    coverage: 'rc-end',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

---

## Introducing Spice Cayenne: The Next-Generation Data Accelerator Built on Vortex for Performance and Scale
URL: https://spice.ai/blog/introducing-spice-cayenne-data-accelerator
Date: 2025-12-17T23:58:50
Description: Spice Cayenne is the next-generation Spice.ai data accelerator built for high-scale and low latency data lake workloads.

<ContentRichText
  fields={{
    coverage: 'rc-start',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<CoreBlock
  name="core-heading"
  content={'<h2 class="wp-block-heading h4">TLDR</h2>'}
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Spice Cayenne is the next-generation Spice.ai data accelerator built for high-scale and low latency <a href="/use-case/datalake-accelerator">data lake acceleration</a> workloads. It combines the <a href="https://github.com/vortex-data">Vortex columnar format</a> with an embedded metadata engine to deliver faster queries and significantly lower memory usage than existing Spice data accelerators, including DuckDB and SQLite. <a href="https://www.youtube.com/watch?v=HTdv6-cxKV4">Watch the demo</a> for an overview of Spice Cayenne and Vortex.</p>'
  }
/>

<CoreBlock
  name="core-image"
  content={
    '<figure class="wp-block-image size-large"><img src="/website-assets/media/2025/12/Spice-Cayenne-Architecture-1-1024x692.png" alt="Spice Cayenne architecture" class="wp-image-1724"/></figure>'
  }
/>

<CoreBlock
  name="core-heading"
  content={'<h2 class="wp-block-heading h4">Introduction</h2>'}
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Spice.ai is a modern, <a href="/">open-source</a> SQL query engine that enables development teams to federate, accelerate, search, and integrate AI across distributed data sources. It\'s designed for enterprises building data-intensive applications and AI agents across disparate, tiered data infrastructure. Data acceleration of disparate and disaggregated data sources is foundational across <a href="https://spiceai.org/docs/use-cases">many vertical use cases</a> the Spice platform enables.</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Spice leans into the <a href="/blog/making-object-storage-operational">industry shift to object storage</a> as the primary source of truth for applications. These object store workloads are often multi-terabyte datasets using open data lake formats like Parquet, Iceberg, or Delta that must serve data and search queries for customer-facing applications with sub-second performance. <a href="https://spiceai.org/docs/features/data-acceleration">Spice data acceleration</a>, which transparently materializes working sets of data in embedded databases like DuckDB and SQLite, is the core technology that makes these applications built on object storage functional. <a href="https://spiceai.org/docs/components/data-accelerators">Embedded data accelerators</a> are fast and simple for datasets up to 1TB, however for multi-terabyte workloads, a new class of accelerator is required.</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>So we built <a href="https://spiceai.org/docs/components/data-accelerators/cayenne">Spice Cayenne</a>, the next-generation data accelerator for high volume and latency-sensitive applications.&nbsp;</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Spice Cayenne combines <a href="https://github.com/vortex-data">Vortex</a>, the next-generation columnar file format from the Linux Foundation, with a simple, embedded metadata layer. This separation of concerns ensures that both the storage and metadata layers are fully optimized for what each does best. Cayenne delivers better performance and lower memory consumption than the existing DuckDB, Arrow, SQLite, and PostgreSQL data accelerators.&nbsp;</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>This post explains why we built Spice Cayenne, how it works, when it makes sense to use instead of existing acceleration options, and how to get started.</p>'
  }
/>

<CoreBlock
  name="core-heading"
  content={
    '<h2 class="wp-block-heading h4">How data acceleration works in Spice</h2>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Spice accelerates datasets by materializing them in local compute engines; which can be ApacheDataFusion + Apache Arrow, SQLite, or DuckDB, in-memory or on-disk. This provides applications with high-performance, low-latency queries and dynamic compute flexibility beyond static materialization. It also reduces network I/O, avoids repeated round-trips to downstream data sources, and as a result, accommodates applications that need to access disparate data, join that data, and make it really fast. By bringing frequently accessed working sets of data closer to the application, Spice delivers sub-second, often single-digit millisecond queries without requiring additional clusters, ingestion pipelines, or ETL.</p>'
  }
/>

<CoreBlock
  name="core-image"
  content={
    '<figure class="wp-block-image size-large"><img src="/website-assets/media/2025/12/Spice-Acceleration-Image-1-1024x671.png" alt="Spice data acceleration" class="wp-image-1720"/></figure>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>To support the wide range of enterprise workloads run on Spice, the platform includes multiple acceleration engines suited to different data shapes, query patterns, and performance needs. The Spice ethos is to offer optionality: development teams can choose the engine that best fits their requirements. These are currently <a href="https://spiceai.org/docs/components/data-accelerators">the following acceleration engines</a>:</p>'
  }
/>

<CoreBlock
  name="core-list"
  content={
    "<ul class=\"wp-block-list\"><li><strong>PostgreSQL:</strong> PostgreSQL is great for row-oriented workloads, but is not optimized for high-volume columnar analytics.&nbsp;</li><li><strong>Arrow (in-memory):</strong> Arrow is ideal for workloads that need very fast in-memory access and low-latency scans. The tradeoff is that data isn't persisted to disk and more sophisticated operations like indexes aren't supported.&nbsp;</li><li><strong>DuckDB:</strong> DuckDB offers excellent all-around performance for medium-sized datasets and analytical queries. Single file limits and memory usage, however, can become a constraint as data volume grows beyond a terabyte.&nbsp;</li><li><strong>SQLite:</strong> SQLite is a lightweight option that excels for smaller tables and row-based lookups. SQLite's single-writer model, file single limits, and limited parallelism make it less ideal for larger or analytical workflows.</li></ul>"
  }
/>

<CoreBlock
  name="core-heading"
  content={'<h2 class="wp-block-heading h4">Why we built Spice Cayenne</h2>'}
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Enterprise workloads on multi-terabyte datasets stored in object storage share a common set of pressure points; the volume of data continues to increase, more applications and services are querying the same accelerated tables at once, and teams need consistently fast performance without having to manage extra infrastructure.</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Existing accelerators perform well at smaller scale but run into challenges at different inflection points:</p>'
  }
/>

<CoreBlock
  name="core-list"
  content={
    '<ul class="wp-block-list"><li>Single-file architectures create bottlenecks for concurrency and updates.</li><li>Memory usage of embedded databases like DuckDB can be prohibitive.</li><li>Database and search index creation and storage can be prohibitive.</li></ul>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>These constraints inspired us to develop the next-generation accelerator for petabyte-scale, that keeps metadata operations lightweight, and maintains low-latency, high-performance queries even as dataset sizes and concurrency increase. It also was critically important the underlying technologies aligned with the Spice philosophy of open-source with strong community support and governance.</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p><em><strong>Spice Cayenne addresses these requirements by separating metadata and data storage into two complementary layers: the Vortex columnar format and an embedded metadata engine.</strong></em></p>'
  }
/>

<CoreBlock
  name="core-heading"
  content={'<h2 class="wp-block-heading h4">Spice Cayenne architecture </h2>'}
/>

<CoreBlock
  name="core-image"
  content={
    '<figure class="wp-block-image size-large"><img src="/website-assets/media/2025/12/Spice-Cayenne-Architecture-1024x692.png" alt="Spice Cayenne Architecture" class="wp-image-1721"/></figure>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={'<p>Cayenne is built with two core concepts:</p>'}
/>

<CoreBlock
  name="core-heading"
  content={
    '<h3 class="wp-block-heading h5">  1. Data: Vortex Columnar Format</h3>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Data is stored in <a href="https://github.com/vortex-data/vortex">Vortex</a>, the next-generation open-source, Apache-licensed format under the Linux Foundation.&nbsp;</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={'<p>Compared with Apache Parquet, Vortex provides:</p>'}
/>

<CoreBlock
  name="core-list"
  content={
    '<ul class="wp-block-list"><li><strong>100x faster</strong> random access</li><li><strong>10-20x faster</strong> full scans</li><li><strong>5x faster</strong> writes</li><li>Zero-copy compatibility with Apache Arrow</li><li>Pluggable compression, encoding, and layout strategies</li></ul>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p><em>Source: </em><a href="https://github.com/vortex-data/vortex"><em>Vortex Github</em></a></p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Vortex has a clean separation of logical schema and physical layout, which Cayenne leverages to support efficient segment-level access, minimize memory pressure, and extend functionality without breaking compatibility. It draws on <a href="https://github.com/vortex-data/vortex/blob/develop/README.md">years of academic and systems research</a> including innovations from projects like YouTube\'s Procella, FSST, FastLanes, ALP/G-ALP, and MonetDB/X100 to push the boundaries of what\'s possible in open-source analytics.</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Extensible and community-driven, Vortex is already integrated with tools like Apache Arrow, DataFusion, and DuckDB, and is designed to support Apache Iceberg in future releases. It\'s also the foundation of commercial offerings from <a href="https://spiraldb.com/">SpiralDB</a> and <a href="https://www.polarsignals.com/blog/posts/2025/11/25/interface-parquet-vortex">PolarSignals</a>. Since version 0.36.0, Vortex guarantees backward compatibility of the file format.</p>'
  }
/>

<CoreBlock
  name="core-heading"
  content={'<h3 class="wp-block-heading h5">   2. Metadata Layer</h3>'}
/>

<CoreBlock
  name="core-paragraph"
  content={
    "<p>Cayenne stores metadata in an embedded database. SQLite is supported today, but aligned with the Spice philosophy of optionality, the design is extensible for pluggable metadata backends in the future. Cayenne's metadata layer was intentionally designed as simple as possible, optimizing for maximum ACID performance.</p>"
  }
/>

<CoreBlock
  name="core-paragraph"
  content={'<p>The metadata layer includes:</p>'}
/>

<CoreBlock
  name="core-list"
  content={
    '<ul class="wp-block-list"><li>Schemas</li><li>Snapshots</li><li>File tracking</li><li>Statistics</li><li>Refreshes&nbsp;</li></ul>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>All metadata access is done through standard SQL transactions. This provides:</p>'
  }
/>

<CoreBlock
  name="core-list"
  content={
    '<ul class="wp-block-list"><li>A single, local source of truth</li><li>Fast metadata reads</li><li>Consistent ACID semantics</li><li>No external catalog servers</li><li>No scattered metadata files</li></ul>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>A single SQL query retrieves all metadata needed for query planning. This eliminates round-trip calls to object storage, supports file-pruning, and reduces sensitivity to storage throttling.</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Together, the metadata engine and Vortex format enable Cayenne to scale beyond the limits of single-file engines while keeping acceleration operationally simple.</p>'
  }
/>

<CoreBlock
  name="core-heading"
  content={'<h2 class="wp-block-heading h4">Benchmarks</h2>'}
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>So, how does Spice Cayenne stack up to the other accelerators?</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>We benchmarked Cayenne against DuckDB v1.4.2 using industry standard benchmarks (TPC-H SF100 and ClickBench), comparing both query performance and memory efficiency. All tests ran on a 16 vCPU / 64 GiB RAM instance (AWS c6i.8xlarge equivalent) with local NVMe storage. Cayenne was tested with <a href="/blog/spice-cloud-v1-9-0-cayenne-data-accelerator">Spice v1.9.0</a>.</p>'
  }
/>

<CoreBlock
  name="core-image"
  content={
    '<figure class="wp-block-image size-large"><img src="/website-assets/media/2025/12/TPCH-Benchmark-1024x1024.png" alt="Cayenne accelerated TPC-H queries 1.4x faster than DuckDB (file mode) and used nearly 3x less memory" class="wp-image-1722"/><figcaption class="wp-element-caption"><strong><em>Cayenne accelerated TPC-H queries 1.4x faster than DuckDB (file mode)</em></strong><em> and used </em><strong><em>nearly 3x less memory</em></strong><em>.</em></figcaption></figure>'
  }
/>

<CoreBlock
  name="core-image"
  content={
    '<figure class="wp-block-image size-large"><img src="/website-assets/media/2025/12/Clickbench-Benchmark-1024x1024.png" alt="Cayenne was 14% faster than DuckDB file mode, and used 3.4x less memory" class="wp-image-1723"/><figcaption class="wp-element-caption"><strong><em>Cayenne was 14% faster than DuckDB file mode, and used 3.4x less memory.</em></strong></figcaption></figure>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Spice Cayenne achieves faster query times and drastically lower memory usage by pairing a purpose-built execution engine with the Vortex columnar format. Unlike DuckDB, Cayenne avoids monolithic file dependencies and high memory spikes, making it ideal for production-grade acceleration at scale.</p>'
  }
/>

<CoreBlock
  name="core-heading"
  content={
    '<h2 class="wp-block-heading h4">Getting started with Spice Cayenne</h2>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Use Cayenne by specifying <code>engine: cayenne</code> in the Spicepod.yml (dataset configuration).</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={'<p>Following are a few example configurations.</p>'}
/>

<CoreBlock name="core-paragraph" content={'<p>Basic:</p>'} />

```yaml
datasets:
  - from: spice.ai:path.to.my_dataset
    name: my_dataset
    acceleration:
      engine: cayenne
      mode: file
```

<CoreBlock name="core-paragraph" content={'<p>Full configuration: </p>'} />

```yaml
version: v1
kind: Spicepod
name: cayenne-example

datasets:
  - from: s3://my-bucket/data/
    name: analytics_data
    params:
      file_format: parquet
    acceleration:
      engine: cayenne
      enabled: true
      refresh_mode: full
      refresh_check_interval: 1h
```

<CoreBlock
  name="core-heading"
  content={'<h3 class="wp-block-heading h5">Memory</h3>'}
/>

<CoreBlock
  name="core-paragraph"
  content={
    "<p>Memory usage depends on dataset size, query patterns, and caching configuration. Vortex's design reduces memory overhead by using selective segment reads and zero-copy access.</p>"
  }
/>

<CoreBlock
  name="core-heading"
  content={'<h3 class="wp-block-heading h5">Storage</h3>'}
/>

<CoreBlock
  name="core-paragraph"
  content={'<p>Disk space is required for:</p>'}
/>

<CoreBlock
  name="core-list"
  content={
    '<ul class="wp-block-list"><li>Vortex columnar data</li><li>Temporary files during query execution</li><li>Metadata tables</li></ul>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Provision storage according to dataset size and refresh patterns.</p>'
  }
/>

<CoreBlock
  name="core-heading"
  content={'<h2 class="wp-block-heading h4">Roadmap</h2>'}
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Spice Cayenne is in beta and still evolving. We encourage users to test Cayenne in development environments before deploying to production.</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={'<p>Upcoming improvements include:</p>'}
/>

<CoreBlock
  name="core-list"
  content={
    '<ul class="wp-block-list"><li>Index support</li><li>Improved snapshot bootstrapping</li><li>Additional metadata backends</li><li>Advanced compression and encoding strategies</li><li>Expanded data type coverage</li></ul>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>The goal for Spice Cayenne stable is for Cayenne to be the fastest, most efficient accelerator across the full range of analytical and operational data and AI workloads at terabyte &amp; petabyte-scale.</p>'
  }
/>

<CoreBlock
  name="core-heading"
  content={'<h2 class="wp-block-heading h4">Conclusion</h2>'}
/>

<CoreBlock
  name="core-paragraph"
  content={
    "<p>Spice Cayenne represents a step function improvement in Spice data acceleration, designed to serve multi-terabyte, high concurrency, and low-latency workflows with predictable operations. By pairing an embedded metadata engine with Vortex's high-performance format, Cayenne offers a scalable alternative to single-file accelerators while keeping configuration simple.</p>"
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Spice Cayenne is available in beta in <a href="/pricing">Spice Cloud</a> and Spice Open Source. We welcome feedback on the road to its stable release.</p>'
  }
/>

<CoreBlock name="core-paragraph" content={'<p>‍</p>'} />

## Frequently Asked Questions

### What is Spice Cayenne?

Spice Cayenne is a data accelerator engine built for multi-terabyte, low-latency [data lake acceleration](/use-case/datalake-accelerator) workloads. It combines the [Vortex columnar format](https://github.com/vortex-data) with an embedded SQLite-backed metadata engine to deliver faster queries and lower memory usage than DuckDB or Arrow-based alternatives.

### How does Cayenne compare to DuckDB for data acceleration?

On TPC-H SF100 benchmarks, Cayenne delivers 1.4x faster query execution and uses 3x less memory than DuckDB file mode. On ClickBench, Cayenne is 14% faster with 3.4x less memory. These gains come from the Vortex format's zero-copy Arrow compatibility and fine-grained pruning capabilities, which avoid the monolithic file dependencies that drive DuckDB's memory spikes.

### What is the Vortex columnar format?

Vortex is an open-source columnar file format under the Linux Foundation, designed as a modern alternative to Apache Parquet. It provides 100x faster random access, 10-20x faster scans, and 5x faster writes compared to Parquet. Vortex is zero-copy compatible with Apache Arrow, meaning data can be queried directly without conversion overhead.

### When should I use Cayenne instead of DuckDB or Arrow acceleration in Spice?

Use Cayenne for large-scale data lake workloads (hundreds of gigabytes to multi-terabyte datasets) where memory efficiency and consistent query performance matter. DuckDB and Arrow remain good choices for smaller datasets or when DuckDB-specific SQL extensions are needed. Cayenne is the recommended default accelerator for production [SQL federation and acceleration](/platform/sql-federation-acceleration) deployments.

<ContentResourceFeatured
  fields={{
    heading: 'Explore more Spice resources',
    paragraph: 'Hands-on tutorials, product docs, and real-world examples.',
    mode: 'related',
    resources: false,
    padding_top: 'unset',
    padding_bottom: 'unset',
    related_posts: [],
  }}
/>

<TalkToAnEngineerCta />

<ContentRichText
  fields={{
    coverage: 'rc-end',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

---

## Introducing Spice Skills for AI Agents
URL: https://spice.ai/blog/introducing-spice-skills-for-ai-coding-agents
Date: 2026-03-26T09:00:00
Description: Spice Skills is a collection of packaged agent instructions for working with Spice.ai OSS, covering setup, data connections, acceleration, search, AI, and more.

<ContentRichText
  fields={{
    coverage: 'rc-start',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

We're excited to introduce [Spice Skills](https://github.com/spiceai/skills), an open-source collection of packaged instructions for AI coding agents working with [Spice.ai OSS](https://github.com/spiceai/spiceai). Each skill covers a specific capability ([federated SQL queries](/platform/sql-federation-acceleration), data acceleration, [vector and full-text search](/platform/hybrid-sql-search), [LLM inference](/platform/llm-inference), and [MCP tool use](/feature/mcp-server-gateway)) so agents can configure and operate Spice correctly without manual prompting.

Skills follow the open [Agent Skills](https://agentskills.io/) format and work with Claude Code via [Claude Skills](https://code.claude.com/docs/en/skills), Cursor, and any agent that supports the standard.

## What's Included

The initial release covers the core Spice workflows:

<CoreBlock
  name="core-table"
  content={
    '<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>Skill</th><th>What the agent can do</th></tr></thead><tbody><tr><td><code>spice-setup</code></td><td>Install Spice, initialize a project, and run the runtime</td></tr><tr><td><code>spice-connect-data</code></td><td>Connect to data sources and query across them with federated SQL</td></tr><tr><td><code>spice-acceleration</code></td><td>Accelerate data locally for sub-second query performance</td></tr><tr><td><code>spice-search</code></td><td>Search with vector similarity, full-text keywords, or hybrid RRF</td></tr><tr><td><code>spice-ai</code></td><td>Add AI capabilities: chat, text-to-SQL, tools, memory, model routing</td></tr><tr><td><code>spice-caching</code></td><td>Cache query and search results with TTL and stale-while-revalidate</td></tr><tr><td><code>spice-secrets</code></td><td>Manage credentials with secret stores</td></tr><tr><td><code>spice-text-to-sql</code></td><td>Convert natural language to SQL using the /v1/nsql endpoint</td></tr><tr><td><code>spice-terraform</code></td><td>Provision and manage Spice infrastructure with Terraform</td></tr></tbody></table></figure>'
  }
/>

Each skill ships as a `SKILL.md` (instructions the agent reads directly) along with optional helper scripts and example configurations.

<PostVideo
  fields={{
    thumbnail: false,
    type: 'youtube',
    video_id: '3qlg49nYvLY',
    video_title: 'Spice Skills: Give Your AI Agent Data Superpowers',
    video_upload_date: '2026-03-26T13:45:22-07:00',
    video_channel: 'Spice AI',
    video_description: 'Introduction to Spice Skills for AI coding agents.',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p class="wp-block-paragraph"><em>Demo of basic usage with Spice Skills</em></p>'
  }
/>

## Installation

**Claude Code ([Claude Skills](https://code.claude.com/docs/en/skills)):**

```bash
/plugin marketplace add spiceai/skills
/plugin install spice@spiceai-skills
```

Skills become available as `/spice:spice-setup`, `/spice:spice-ai`, `/spice:spicepod-config`, and so on.

**Other agents (npx):**

```bash
npx skills add spiceai/skills
```

Once installed, skills are invoked automatically when the agent detects a relevant task: no manual prompting required.

## Why Skills

Working with a new runtime in an AI coding agent typically means copy-pasting docs, correcting hallucinated API shapes, and re-explaining configuration patterns. Skills solve this by giving the agent accurate, structured knowledge up front.

For Spice specifically, this matters because the configuration surface is broad: 30+ data connectors, multiple acceleration engines, LLM providers, embedding models, and a growing set of tools. For teams building [retrieval-augmented generation (RAG) pipelines](/use-case/retrieval-augmented-generation) or [agentic AI applications](/use-case/secure-ai-agents), a well-scoped skill keeps the agent on the right path without requiring the developer to re-explain Spice's configuration model each session.

## Skill Structure

Each skill follows a consistent layout:

```
spice-setup/
  SKILL.md           # Agent instructions
  scripts/           # Helper automation (optional)
  examples/          # Example spicepod.yaml configurations (optional)
```

The format is intentionally minimal. `SKILL.md` is plain text the agent can parse; scripts handle anything that benefits from automation.

## Get Started

The skills repository is open source at [github.com/spiceai/skills](https://github.com/spiceai/skills). Contributions for additional connectors, deployment patterns, and Spice Cloud workflows are welcome.

<CoreBlock
  name="core-list"
  content={
    '<ul class="wp-block-list"><li><a href="https://docs.spiceai.org/">Spice.ai OSS Docs</a></li><li><a href="https://github.com/spiceai/cookbook">Spice Cookbook</a></li></ul>'
  }
/>

To use Spice Skills with your coding agent against production data, review [Spice Cloud pricing](/pricing) or [get a demo](/get-a-demo).

<ContentRichText
  fields={{
    coverage: 'rc-end',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<AccordionFaq
  fields={{
    heading: 'Spice AI Skills FAQ',
    paragraph: '',
    items: [
      {
        title: 'What is Spice Skills?',
        paragraph:
          '<p>Spice Skills is an open-source collection of packaged instructions for AI coding agents working with Spice.ai OSS. Each skill is a <code>SKILL.md</code> file that gives an agent structured knowledge about a specific capability, so it can configure datasets, connect data sources, run federated queries, and set up models without requiring manual prompting from the developer.</p>',
      },
      {
        title: 'Which AI coding agents support Spice Skills?',
        paragraph:
          '<p>Spice Skills work with any agent that supports the <a href="https://agentskills.io/">Agent Skills</a> format. Claude Code installs via the plugin marketplace (<code>/plugin marketplace add spiceai/skills</code>). Any other agent can add skills using <code>npx skills add spiceai/skills</code>.</p>',
      },
      {
        title: 'Is Spice Skills free to use?',
        paragraph:
          '<p>Yes. The repository is MIT-licensed and open source at <a href="https://github.com/spiceai/skills">github.com/spiceai/skills</a>. The AI coding agent tools you use are subject to their own licensing.</p>',
      },
      {
        title: 'How does Spice Skills differ from reading the Spice documentation?',
        paragraph:
          '<p>Documentation is written for humans to read. Skills are structured for agents to parse: scoped to specific tasks, paired with helper scripts and example configs, and automatically invoked when a relevant task is detected. An agent with an installed skill does not need the developer to re-explain Spice\'s configuration model each session.</p>',
      },
      {
        title: 'Can I build and contribute custom Spice Skills?',
        paragraph:
          '<p>Yes. Each skill follows a minimal structure: a <code>SKILL.md</code> with agent instructions, an optional <code>scripts/</code> directory, and optional <code>examples/</code>. Contributions for additional connectors, deployment patterns, and Spice Cloud workflows are welcome via pull request to <a href="https://github.com/spiceai/skills">github.com/spiceai/skills</a>.</p>',
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

---

## Making Apps That Learn And Adapt
URL: https://spice.ai/blog/making-apps-that-learn-and-adapt
Date: 2021-11-05T05:55:47
Description: Building intelligent applications is still too hard for most developers-not because ML is impossible, but because it's treated as something separate from the app.

<ContentRichText
  fields={{
    coverage: 'rc-start',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>In the Spice.ai announcement blog post, we shared some of the inspiration for the project stemming from challenges in applying and integrating AI/ML into a neurofeedback application. Building upon those ideas, in this post, we explore the shift in approach from a focus of data science and machine learning (ML) to apps that learn and adapt.</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    "<p>As a developer, I've followed the AI/ML space with keen interest and been impressed with the advances and announcements that only seem to be increasing.&nbsp;stateof.ai recently published its 2021 report, and once again, it's been another great year of progress. At the same time, it's still more challenging than ever for mainstream developers to integrate AI/ML into their applications. For most developers, where AI/ML is not their full-time job, and without the support of a dedicated ML team, creating and developing an intelligent application that learns and adapts is still too hard.</p>"
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Most solutions on the market, even those that claim they are for developers, focus on helping make ML easier instead of making it easier to build applications. These solutions have been great for advancing ML itself but have not helped developers leverage ML in their apps to make them intelligent. Even when a developer successfully integrates ML into an application, it might make that application smart, but often does not help the app continue to learn and adapt over time.</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Traditionally, the industry has viewed AI/ML as separate from the application. A pipeline, service, or team is provided with data, which trains on that data, and can then provide answers or insights. These solutions are often created with a waterfall-like approach, gathering and defining requirements, designing, implementing, testing, and deploying. Sometimes this process can take months or even years.</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    "<p>With Spice.ai, we propose a new approach to building applications. By bringing AI/ML alongside your compute and data and incorporating it as part of your application, the app can incrementally adopt recommendations from the AI engine and in addition the AI engine can learn from the application's data and actions. This approach shifts from waterfall-like to agile-like, where the AI engine ingests streams of application and external data, along with the results of the application's actions, to continuously learn. This virtuous feedback cycle from the app to the AI engine and back again enables the app to get smarter and adapt over time. In this approach, building your application&nbsp;<em>is</em>&nbsp;developing the ML.</p>"
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Being part of the application is not just conceptual. Development teams deploy the Spice.ai runtime and AI engine with the application as a sidecar or microservice, enabling the app services and runtime to work together and for data to be kept application local. A developer teaches the AI engine how to learn by defining application goals and rewards for actions the application takes. The AI Engine observes the application and the consequences of its actions, which feeds into its experience. As the AI engine learns, the application can adapt.</p>'
  }
/>

<CoreBlock
  name="core-image"
  content={
    '<figure class="wp-block-image size-full"><img src="/website-assets/media/2021/11/Intelligent-Apps-2021.png" alt="The intelligent app flywheel" class="wp-image-1823"/><figcaption class="wp-element-caption">Figure 1: The intelligent app flywheel</figcaption></figure>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>As developers shift from thinking about disparate applications and ML to building applications where AI that learns and adapts is integrated as a core part of the application logic, a new class of intelligent applications will emerge. And as technical talent becomes even more scarce, applications built this way will be necessary, not just to be competitive but to be even built at all.</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    "<p>In the next post, I'll discuss the concept of Spicepods, bundles of configuration that describes how the application should learn, and how the Spice.ai runtime hosts and uses them to help developers make applications that learn.</p>"
  }
/>

<CoreBlock
  name="core-heading"
  content={
    '<h2 class="wp-block-heading h3" id="learn-more-and-contribute">Learn more and contribute</h2>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Building intelligent apps that leverage AI is still way too hard, even for advanced developers. Our mission is to make this as easy as creating a modern web page. If the vision resonates with you, join us!</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Our <a href="https://github.com/spiceai/spiceai/blob/trunk/docs/ROADMAP.md" target="_blank" rel="noreferrer noopener">Spice.ai Roadmap</a> is public, and now that we have launched, the project and work are open for collaboration.</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>If you are interested in partnering, we\'d love to talk. Try out <a href="https://spiceai.org/docs/getting-started" target="_blank" rel="noreferrer noopener">Spice.ai</a>, <a href="mailto:hey@spice.ai" target="_blank" rel="noreferrer noopener">email us</a> "hey," join our community <a href="/slack">Slack</a>, or reach out on <a href="https://x.com/spice_ai" target="_blank" rel="noreferrer noopener">Twitter</a>.</p>'
  }
/>

Spice AI's platform has evolved since this post: today it delivers [SQL query federation and acceleration](/platform/sql-federation-acceleration) and grounds [AI agents in governed data](/use-case/secure-ai-agents). To see the current platform, [get a demo](/get-a-demo).

<CoreBlock
  name="core-paragraph"
  content={'<p>We are just getting started! 🚀</p>'}
/>

<CoreBlock name="core-paragraph" content={'<p>Luke</p>'} />

<ContentResourceFeatured
  fields={{
    heading: 'Explore more Spice resources',
    paragraph:
      'Tutorials, docs, and blog posts to help you go deeper with Spice.',
    mode: 'related',
    resources: false,
    padding_top: 'unset',
    padding_bottom: 'unset',
    related_posts: [
      {
        title: 'A Developer&#8217;s Guide to Understanding Spice.ai',
        slug: '/blog/a-developers-guide-to-understanding-spice-ai',
        excerpt:
          'This guide helps developers build a mental model of why, how, and where to use Spice.',
        image:
          '/website-assets/media/2026/02/A-developers-guide-to-understanding-Spice.ai_.png',
        type: 'Blog',
        taxonomy: [
          'Engineering',
          'Spice AI',
          'Spice Cloud Platform',
          'Spice OSS',
        ],
      },
      {
        title: 'How we use Apache DataFusion at Spice AI',
        slug: '/blog/how-we-use-apache-datafusion-at-spice-ai',
        excerpt:
          'Why we chose to build on DataFusion and how we extended it with custom TableProviders, optimizer rules, and UDFs for federated SQL',
        image:
          '/website-assets/media/2026/01/Engineering-at-Spice-AI-Apache-DataFusion.png',
        type: 'Blog',
        taxonomy: [
          'Spice AI',
          'Spice Cloud Platform',
          'Spice OSS',
          'SQL Federation',
        ],
      },
      {
        title: 'Real-Time Hybrid Search Using RRF: A Hands-On Guide with Spice',
        slug: '/blog/real-time-hybrid-search-using-rrf',
        excerpt:
          'Surfacing relevant answers to searches across datasets has historically meant navigating significant tradeoffs.&nbsp;Keyword (or lexical) search&nbsp;is fast, cheap, and commoditized, but limited by the constraints of exact matching.&nbsp;Vector (or semantic) search&nbsp;captures nuance and intent, but can be slower, harder to debug, and expensive to run at scale. Combining both usually entails standing up multiple engines [&hellip;]',
        image:
          '/website-assets/media/2025/11/68fa4fdfded26b3b6472a172_image-8.png',
        type: 'Blog',
        taxonomy: ['Search', 'Spice AI'],
      },
    ],
  }}
/>

<TalkToAnEngineerCta />

<ContentRichText
  fields={{
    coverage: 'rc-end',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

---

## Making Object Storage Operational for Real-Time and AI Workloads
URL: https://spice.ai/blog/making-object-storage-operational
Date: 2025-10-06T17:37:00
Description: Transform object stores into real-time AI platforms. Spice adds federation, acceleration, hybrid search, and inference capabilities.

<ContentRichText
  fields={{
    coverage: 'rc-start',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<CoreBlock
  name="core-heading"
  content={'<h2 class="wp-block-heading h4">TLDR</h2>'}
/>

<CoreBlock
  name="core-list"
  content={
    '<ul class="wp-block-list"><li><strong>Object storage and open table formats deliver nearly limitless scalability and cost efficiency</strong>, making them important pieces of modern data architectures.&nbsp;</li><li>Despite their advantages,&nbsp;<strong>object storage can\'t function as an independent solution</strong>&nbsp;for workloads that require millisecond latency, sophisticated queries, or AI-driven retrieval, where throughput-optimized designs and limited query expressiveness introduce bottlenecks.</li><li><strong>Spice expands the utility of these systems</strong>&nbsp;by pushing object storage closer to the application layer and layering on more advanced compute capabilities.&nbsp;</li><li>Spice\'s federation and acceleration eliminates ETL and&nbsp;<strong>transforms object storage into a functional data layer</strong>&nbsp;for operational applications and AI agents.</li></ul>'
  }
/>

<CoreBlock
  name="core-heading"
  content={'<h2 class="wp-block-heading h4">Introduction</h2>'}
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Although legacy systems and workflows remain common, many enterprises are re-evaluating their architectures to meet new demands&nbsp; - driven in part, but not exclusively, by AI - that require support for more data-intensive and real-time applications.</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>The underlying storage needs for these novel workloads are generally outside the bounds of a traditional operational database for a handful of reasons - namely scalability, flexibility (the need to support heterogeneous data types), or availability (or some combination thereof).&nbsp;</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Object storage systems have experienced a renaissance in this environment, often being re-purposed or augmented for more transactional use cases than they\'ve historically supported. Platforms such as<a href="https://aws.amazon.com/s3/">&nbsp;Amazon S3</a>&nbsp;and&nbsp;<a href="https://www.min.io/">MinIO</a>&nbsp;provide the scalability to handle petabytes of data, the cost efficiency of commodity hardware and open-source software, and the simplicity of a flat architecture that reduces management overhead. Although object storage systems don\'t offer some of the guardrails of operational databases like strong consistency, many operational use cases tolerate&nbsp;<em>eventual consistency</em>. Common scenarios like rate-limiting or feature lookups, for example, don\'t mandate strong consistency, and object storage systems help development teams avoid the performance tax strong consistency can impose.&nbsp;</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>These attributes have made object storage a source of truth for operational workloads; development teams get the dual benefit of reduced system complexity while maintaining high reliability.</p>'
  }
/>

<CoreBlock
  name="core-heading"
  content={
    '<h2 class="wp-block-heading h4">Challenges for Object Storage in Demanding Operational Workloads&nbsp;</h2>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    "<p><em>Unfortunately, there's no free lunch in technology.&nbsp;</em></p>"
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Object storage systems also come with significant tradeoffs for more performance-sensitive workloads.&nbsp;</p>'
  }
/>

<CoreBlock
  name="core-list"
  content={
    '<ul class="wp-block-list"><li>Object storage systems optimized for throughput rather than responsiveness introduce higher latency, limiting their use in real-time scenarios.&nbsp;</li><li>The object storage key-value model makes complex SQL queries difficult to express and slows down analytical flexibility.&nbsp;</li><li>Managing governance, consistency, and security at scale becomes a challenge in environments limited to eventual consistency.&nbsp;</li><li>AI and ML workloads, which rely on random access patterns and low-latency retrieval, are not natively optimized for object storage.</li><li>Finally, for enterprises migrating from legacy databases, re-engineering data formats and pipelines to fit object stores can introduce complexity, cost, and downtime.</li></ul>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    "<p>‍While object stores are now ubiquitous in enterprise environments, they can't serve as an independent solution for the operational and AI-driven workloads now shaping many application access patterns. </p>"
  }
/>

<CoreBlock
  name="core-heading"
  content={
    '<h3 class="wp-block-heading h5">Open Table Formats: Structuring Data for Performance and Governance</h3>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Open table formats like&nbsp;<a href="https://iceberg.apache.org/"><strong>Apache Iceberg</strong></a>,&nbsp;<a href="https://delta.io/"><strong>Delta Lake</strong></a>, and&nbsp;<a href="https://parquet.apache.org/"><strong>Apache Parquet</strong></a>&nbsp;represent a step function of improvement for these more demanding operational data workloads by introducing database-like capabilities to object storage. These formats address the shortcomings of raw object storage, such as lack of transactional support and poor query performance, making them ideal for managing structured operational data:</p>'
  }
/>

<CoreBlock
  name="core-list"
  content={
    '<ul class="wp-block-list"><li><strong>Consistency Optionality:</strong>&nbsp;ACID transactions ensure reliable updates, while eventual consistency aligns with use cases where brief sync delays are tolerable.</li><li><strong>Query Performance:</strong>&nbsp;Optimizations like data skipping and indexing make complex queries fast.</li><li><strong>Governance and Security:</strong>&nbsp;Features like schema enforcement and audit trails support compliance.</li><li><strong>Migration Support:</strong>&nbsp;Structured formats ease transitions from legacy systems by mimicking database functionality.</li></ul>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    "<p>‍However, open table formats are still not a panacea for all operational workloads. They improve governance and query planning, but they don't solve the performance challenges of running federated queries across multiple operational and analytical systems or powering AI applications that embed both structured and unstructured data. Different tools for different jobs, as they say. </p>"
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p><strong>What if you could maintain all of the great attributes of object storage and open table formats, but add the orchestration necessary to actually power your application without a bunch of ETL pipelines?</strong></p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={'<p>Well, you now can with&nbsp;<a href="/">Spice.ai</a>.&nbsp;</p>'}
/>

<CoreBlock
  name="core-heading"
  content={
    '<h2 class="wp-block-heading h4">Transforming Object Storage into a High-Performance Data Layer with Spice&nbsp;</h2>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p><a href="/">Spice</a> was purpose-built to solve this problem. By unifying SQL query <a href="/platform/sql-federation-acceleration">federation and acceleration</a>, <a href="/platform/hybrid-sql-search">search and retrieval</a>, and <a href="/platform/llm-inference">LLM inference</a> into a single, deploy-anywhere runtime, Spice makes it possible to serve data and AI-powered experiences directly from your existing object storage - securely, at low latency, and without sacrificing the simplicity and economics of object storage. Built in Rust on top of modern open-source technologies like <a href="https://datafusion.apache.org/">Apache DataFusion</a> (query optimization), <a href="https://arrow.apache.org/">Apache Arrow</a> (in-memory processing), <a href="https://duckdb.org/">DuckDB</a> (fast analytics), <a href="https://iceberg.apache.org/">Apache Iceberg</a> (open table format), and<a href="https://opentelemetry.io/"> OpenTelemetry</a> (observability), Spice transforms object storage into a high-performance data layer equipped to serve the most demanding operational workloads. </p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={"<p>It's a lightweight (~150MB) and portable runtime that:</p>"}
/>

<CoreBlock
  name="core-list"
  content={
    '<ul class="wp-block-list"><li><a href="https://spiceai.org/docs/features/query-federation"><strong>Federates, Materializes, and Accelerates Data</strong></a><strong>:</strong>&nbsp;Run SQL queries across databases, data lakes, and APIs without moving data. Store hot data in-memory or locally using Apache Arrow, DuckDB, or SQLite for sub-second queries.</li><li><a href="https://spiceai.org/docs/features/search"><strong>Delivers Hybrid Search Across Unstructured and Structured Data</strong></a><strong>:</strong>&nbsp;Execute keyword, vector, and full-text search from a single SQL query.&nbsp;</li><li><a href="https://spiceai.org/docs/components/models"><strong>Serves AI Models</strong></a><strong>:</strong>&nbsp;Support local or hosted AI models, tying real-time data to AI outputs.</li></ul>'
  }
/>

<CoreBlock
  name="core-image"
  content={
    '<figure class="wp-block-image"><img src="https://cdn.prod.website-files.com/6362f59f9fd4ac355fc06eaf/68e42809f3237eba3f2ec827_50c44d1b.png" alt="Spice.ai Compute Engine"/><figcaption class="wp-element-caption">Figure 1: Spice.ai Compute&nbsp;Engine</figcaption></figure>'
  }
/>

<CoreBlock
  name="core-heading"
  content={'<h3 class="wp-block-heading h5">One Runtime for All Your Data</h3>'}
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Where others solve one piece of the problem (search, query, or inference), Spice brings these capabilities together in one platform. The result is faster delivery of high-performance applications, with fewer moving parts to operate and maintain.</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    "<p>As you can imagine, Spice's value goes beyond operationalizing object stores. With Spice you can federate SQL across transactional and analytical systems, join it with Parquet in S3 or Iceberg tables, and avoid the latency and cost of moving data back and forth.</p>"
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>You can run Spice wherever your application lives: as a sidecar for edge workloads, a microservice in the cloud, or a managed deployment. The benefit of this deployment optionality is that it gives applications and AI a controlled execution layer rather than direct database access.</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>For more on the Spice architecture, visit the OSS overview&nbsp;<a href="https://spiceai.org/docs">here</a>.&nbsp;</p>'
  }
/>

<CoreBlock
  name="core-image"
  content={
    '<figure class="wp-block-image"><img src="https://cdn.prod.website-files.com/6362f59f9fd4ac355fc06eaf/68e42809f3237eba3f2ec82a_48a1e566.png" alt="AI-driven architecture with Spice.ai"/><figcaption class="wp-element-caption">Figure 2: AI-driven architecture with Spice.ai</figcaption></figure>'
  }
/>

<CoreBlock
  name="core-heading"
  content={
    '<h2 class="wp-block-heading h4">Real-World Impact: Twilio, Barracuda, and NRC Health</h2>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    "<p>Let's take this out of the abstract and into some real-world applications built on Spice.&nbsp;</p>"
  }
/>

<CoreBlock
  name="core-heading"
  content={
    '<h3 class="wp-block-heading h5"><a href="/blog/announcing-spice-ai-open-source-1-0-stable#cdn-for-databases--twilio"><em>Twilio: Database CDN for Messaging Pipelines</em></a></h3>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>For Twilio, consistently fast data access is mission-critical. In their messaging pipelines, even a brief database outage could cascade into service interruptions. With Spice, Twilio stages critical control-plane datasets in object storage, then accelerates them locally for sub-second queries. This not only improved P99 query times to under 5ms but also introduced automated multi-tenancy controls that propagate updates in minutes instead of hours. By reducing reliance on direct database queries and adding a resilient S3 failover path, Twilio doubled data redundancy and improved overall reliability - all with a lightweight container drop-in.</p>'
  }
/>

<CoreBlock
  name="core-heading"
  content={
    '<h3 class="wp-block-heading h5"><a href="/blog/announcing-spice-ai-open-source-1-0-stable#datalake-accelerator--barracuda"><em>Barracuda: Datalake Accelerator for Email Archives</em></a></h3>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>By deploying Spice as a <a href="/use-case/datalake-accelerator">datalake accelerator</a>, Barracuda reduced P99 query times to under 200 milliseconds and moved audit logs into cost-efficient Parquet files on S3, which Spice queries directly. The shift not only eliminated costly data lakehouse queries but also reduced load on Cassandra, improving stability across the infrastructure. The result was a faster, more reliable customer experience at a fraction of the cost.</p>'
  }
/>

<CoreBlock
  name="core-heading"
  content={
    '<h3 class="wp-block-heading h5"><a href="/blog/announcing-spice-ai-open-source-1-0-stable#data-grounded-ai-apps-and-agents--nrc-health"><em>NRC Health: Data-Grounded AI for Healthcare Insights</em></a></h3>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>NRC Health needed a way to build secure, data-grounded AI features that could integrate multiple internal platforms - from MySQL and SharePoint to Salesforce - without lengthy development cycles. Spice provided a unified, AI-ready data layer that developers could access through a single interface. Developers found it easier to experiment with embeddings, search, and inference directly in Spice, avoiding the complexity of stitching together bespoke pipelines. The result is faster innovation and AI features grounded in real, relevant healthcare data.</p>'
  }
/>

<CoreBlock
  name="core-heading"
  content={'<h2 class="wp-block-heading h4">Conclusion</h2>'}
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Object storage and open table formats have become critical parts of modern enterprise data infrastructure, but they were not designed to serve real-time operational or AI-driven workloads on their own. Spice fills that gap by pairing federation with acceleration, search, and inference, turning data lakes into low-latency, AI-ready data layers. For enterprises hoping to get the most leverage possible out of their operational data, Spice is the catalyst.</p>'
  }
/>

<CoreBlock
  name="core-heading"
  content={'<h3 class="wp-block-heading h5">Getting Started with Spice</h3>'}
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Spice is open source (Apache 2.0) and can be&nbsp;<a href="https://spiceai.org/docs/getting-started">installed in less than a minute</a>&nbsp;on macOS, Linux, or Windows, and also offers an&nbsp;<a href="/pricing">enterprise-grade Cloud deployment</a>.&nbsp;</p>'
  }
/>

<CoreBlock name="core-paragraph" content={'<p>‍</p>'} />

## Frequently Asked Questions

### Why is object storage alone not enough for real-time workloads?

Object storage (S3, ADLS, GCS) and open table formats like Apache Iceberg were designed for analytical batch processing, not low-latency queries. Read latencies of hundreds of milliseconds and the overhead of scanning metadata and Parquet files make them too slow for operational applications and AI agents that need sub-second responses.

### How does Spice make object storage operational?

Spice pairs [SQL federation](/platform/sql-federation-acceleration) with a [data acceleration](/use-case/datalake-accelerator) layer that materializes working sets from object storage into local engines such as Arrow, DuckDB, or SQLite. Applications query Spice with standard SQL and get sub-millisecond responses while the source data remains in the data lake.

### Can Spice handle both search and structured queries on object storage data?

Yes. Spice provides [hybrid search](/platform/hybrid-sql-search) that combines keyword (BM25), full-text, and vector similarity search alongside standard SQL queries in a single runtime. This lets you build applications that need both analytical queries and semantic retrieval over the same data lake.

<ContentResourceFeatured
  fields={{
    heading: 'Explore more Spice resources',
    paragraph:
      'Tutorials, docs, and blog posts to help you go deeper with Spice.',
    mode: 'related',
    resources: false,
    padding_top: 'unset',
    padding_bottom: 'unset',
    related_posts: [],
  }}
/>

<TalkToAnEngineerCta />

<ContentRichText
  fields={{
    coverage: 'rc-end',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

---

## Migrating Off Dremio: A Phased Guide for Data Teams
URL: https://spice.ai/blog/migrating-off-dremio-phased-guide
Date: 2026-08-10T00:00:00
Description: Learn how to migrate from Dremio to Spice in phases by running side by side, moving one dataset at a time, and validating each step before decommissioning.

<ContentRichText
  fields={{
    coverage: 'rc-start',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

## TL;DR

[Spice.ai](/) offers an open-source, deploy-anywhere alternative to Dremio that is purpose-built for data-intensive applications and AI agents.

Development teams can take a phased migration path off Dremio without a forced cutover:

- **Run side-by-side.** Deploy Spice alongside Dremio; Spice can federate queries through Dremio's Arrow Flight endpoint while you incrementally move workloads.
- **Migrate sources one at a time.** Move each dataset and its associated Reflections to Spice, validating results while Dremio stays available as a reference. Layer on additional Spice capabilities as your use cases require.
- **Decommission Dremio.** When the last dataset is off Dremio, shut it down.

Each phase changes one thing at a time, making it straightforward to validate correctness, compare performance, and isolate any issues before moving on.

The remainder of this guide introduces Spice, explains how Dremio concepts map to Spice and the areas that require planning, and then walks through each phase of the migration.

## What is Spice.ai

Spice.ai is an [open-source](https://github.com/spiceai/spiceai) (Apache 2.0) SQL query, hybrid search, and AI-inference engine written in Rust. Point Spice at your data sources, define what you want to accelerate, and Spice handles federation, materialization, caching, CDC, search, and LLM inference through a unified SQL interface.

At a high level, Spice offers:

- [Deploy-anywhere](https://spiceai.org/docs/deployment). A single binary or container that runs on a laptop, bare metal, any cloud, or Kubernetes. There's no mandatory coordinator-executor topology.
- [40+ data connectors](/integrations). Postgres, MySQL, MongoDB, Snowflake, Databricks, BigQuery, S3/Iceberg, Delta Lake, DuckDB, Dremio, and more.
- [High-throughput replication](https://spiceai.org/docs/features/cdc). Built-in CDC from PostgreSQL, MySQL, MongoDB, and DynamoDB. Deploy a [Spice analytics replica](/platform/analytics) alongside your operational database in minutes that absorbs large analytical queries while your database keeps serving transactions.
- [Sub-second acceleration](https://spiceai.org/docs/features/data-acceleration). [Cayenne](/blog/introducing-spice-cayenne-data-accelerator), Spice's columnar accelerator, materializes working sets in-memory or on disk for millisecond query performance on data that's seconds fresh.
- [AI](https://spiceai.org/docs/features/large-language-models) and [search](https://spiceai.org/docs/features/search). Embedded LLM inference, hybrid search, text-to-SQL, and OpenAI-compatible APIs in the same runtime.
- [Built on open standards](https://github.com/spiceai/spiceai). Apache DataFusion, Apache Arrow, Apache Arrow Flight, Vortex, Apache Iceberg, ADBC, and more.

For more details, see [docs.spiceai.org](https://spiceai.org/docs) or the [GitHub repo](https://github.com/spiceai/spiceai).

## Migration guide

### Phase 0: Plan the migration

Before moving workloads, review which Dremio concepts map directly to Spice and which require planning.

#### What maps cleanly

- **Standard SQL.** ANSI SQL, common aggregation functions, joins, window functions, CTEs, subqueries.
- **Arrow Flight / Flight SQL clients.** If your tools connect to Dremio via Arrow Flight, they will also connect to Spice.
- **Iceberg table reads.** Spice reads Iceberg natively through the same catalogs Dremio uses: REST catalog or AWS Glue.
- **S3 / ADLS / GCS Parquet files.** Direct object storage reads work.
- **JDBC / ODBC / ADBC connections.** Standard BI tool connectivity.

See [Appendix: Dremio -> Spice concept map](#appendix-dremio-spice-concept-map) for details on how specific Dremio concepts map to Spice.

#### What needs planning

- **Dremio-specific SQL functions.** Functions like `CONVERT_FROM`, `FLATTEN`, and Dremio-specific date/time handling don't exist in DataFusion (the [query engine Spice is built on](/blog/how-we-use-apache-datafusion-at-spice-ai)). Audit your query inventory and map them to DataFusion equivalents or define SQL UDFs. See [Appendix: Dremio -> Spice Function Mapping](#appendix-dremio-spice-function-mapping).
- **VDS hierarchies.** Dremio's nested Virtual Dataset layers don't have a one-to-one equivalent. Flatten them into Spice [views](https://spiceai.org/docs/features/views) or materialized datasets. This is usually an improvement: deep VDS chains are a common source of planning overhead in Dremio.
- **Reflection management.** Dremio's automated Reflection recommendations don't exist in Spice. You explicitly declare what to accelerate in a [Spicepod](https://spiceai.org/docs/reference/spicepod) (a configuration package that defines application-specific datasets, catalogs, models, and secrets). More transparent and predictable, but the acceleration decisions are yours. [Step 2b](#step-2b-replace-dremio-reflections-with-spice-accelerations-and-accelerated-views) discusses how to replace raw and aggregation Reflections with Spice equivalents.
- **Dremio wiki and dataset documentation.** If you use Dremio's built-in dataset descriptions and wiki, plan to move that metadata into your catalog or docs system.
- **Fine-grained security policies.** Re-implement Dremio row filters and column masks explicitly. Spice.ai Enterprise provides OIDC-authenticated Cedar policies for row filtering and column masking. For OSS deployments, preserve those controls at the source or isolate datasets in separate runtimes. mTLS secures transport; it does not replace authorization.
- **Arctic / Nessie catalog management.** If you use Dremio-managed Nessie catalogs, point Spice at your Iceberg REST catalog (or Polaris) directly. Catalog branching and tagging are catalog-side operations, not query-engine-side.
- **Autoscaling.** Dremio Cloud's elastic engine scaling has a different operational model. In Spice, use your infrastructure's scaling mechanisms (Kubernetes HPA, cloud autoscaling groups) around the [`spiced`](https://spiceai.org/docs/cli/reference/spiced) process (the Spice.ai runtime binary).

Once you have a full audit of the areas unique to your environment, you're ready to begin the migration.

### Phase 1: Run side-by-side

Deploy Spice alongside your existing Dremio cluster. Use Spice's [Dremio connector](https://spiceai.org/docs/components/data-connectors/dremio) to federate queries through Dremio's Arrow Flight endpoint. Your applications keep working exactly as they do today. Spice is just another query endpoint you can validate against.

```yaml
# Phase 1: federate through Dremio
datasets:
  - from: dremio:my_schema.orders
    name: orders
    params:
      dremio_endpoint: grpc://dremio-coordinator:32010
      dremio_username: ${secrets:DREMIO_USER}
      dremio_password: ${secrets:DREMIO_PASS}
```

At this point you can move queries to using the data available within Spice. Most queries using standard SQL should work as they are. For non-standard SQL functions you may be using, review the [Dremio -> Spice Function Mapping](#appendix-dremio-spice-function-mapping).

What to validate at this stage:

- **Result correctness.** Run your query suite against both endpoints. Compare result sets.
- **Client compatibility.** Connect your BI tools (Tableau, Grafana, Superset, etc.) to Spice's Flight SQL endpoint and confirm they work.
- **Latency baseline.** Measure query latency through Spice -> Dremio. Latency should be roughly equivalent to querying Dremio directly, since Spice is passing through.

### Phase 2: Migrate sources one at a time

For each dataset sourced from Dremio, repeat the following steps:

- Point Spice dataset at the underlying source (Postgres, Iceberg, S3, Snowflake, etc.).
- Replace Dremio Reflections with Spice Accelerations and Accelerated Views.
- Validate and layer on new capabilities.

As an example, we'll apply these steps to the `my_schema.orders` table from phase 1.

#### Step 2a: Point Spice at the underlying source

Swap `from: dremio:schema.table` to `from: postgres:public.table` (e.g. Iceberg or Snowflake). This removes the Dremio hop for that dataset. Queries still work, they just now federate to the underlying source instead of through Dremio.

```yaml
# Phase 2a: direct source
datasets:
  - from: postgres:public.orders
    name: orders
    params:
      pg_connection_string: ${secrets:PG_CONN}
```

**Validation:** When you swap a dataset from `from: dremio:schema.table` to a direct source connection, the only thing that changes is where the data comes from. Validate that the data is the same: compare results, the schema, and measure query latency against the direct source. Without acceleration, federated queries go straight to the source - expect latency comparable to querying the source directly. This is your baseline for the next step.

#### Step 2b: Replace Dremio Reflections with Spice accelerations and accelerated views

For each Dremio Reflection on that source's datasets, add the equivalent Spice acceleration.

**Raw Reflections** become Spice accelerations. Enable `acceleration` on the dataset and choose an engine and refresh strategy:

```yaml
# Phase 2b: replace a raw Reflection
datasets:
  - from: postgres:public.orders
    name: orders
    params:
      pg_connection_string: ${secrets:PG_CONN}

    acceleration:
      enabled: true
      engine: cayenne # or: arrow, duckdb, sqlite, postgres, turso
      mode: file
      refresh_mode: full
      refresh_check_interval: 10m
```

**Aggregation Reflections** become accelerated [views](https://spiceai.org/docs/reference/spicepod/views). Spice does not transparently rewrite existing queries to use an accelerated view, so update affected workloads to query the named view explicitly. Then define and accelerate the view:

```yaml
# Phase 2b: replace an aggregation Reflection
views:
  - name: orders_daily_summary
    sql: |
      SELECT
        DATE_TRUNC('day', order_date) AS day,
        region,
        COUNT(*) AS order_count,
        SUM(total) AS revenue
      FROM orders
      GROUP BY 1, 2
    acceleration:
      enabled: true
      engine: cayenne
```

**Validation**: When you add Spice accelerations to replace Dremio Reflections, you're swapping one materialization layer for another. Dremio is still running, so you can A/B them directly. Compare the latency, verify that accelerations pick up source changes within the configured interval, and verify that the rollup logic for accelerated views produces the same totals. Pay special attention to NULL handling, floating-point precision, and timezone-sensitive `DATE_TRUNC` boundaries.

#### Step 2c: Layer on new capabilities

Once the source is migrated and accelerations are validated, layer on capabilities Dremio didn't provide as your use cases demand.

**CDC for sub-second freshness.** Spice captures changes directly from the source database's replication stream - PostgreSQL WAL, MongoDB change streams, MySQL binlog, or DynamoDB streams - and applies them to the local acceleration without an external pipeline (Kafka, Flink, Debezium) required. Enable CDC by setting `refresh_mode: changes` on an accelerated dataset. Measure freshness by inserting a row into the source and observing how long until it's queryable in Spice. Under normal load, Cayenne CDC from PostgreSQL typically delivers sub-two-second freshness. This replaces the pattern where teams ran a separate ingestion pipeline alongside Dremio to keep a materialized view current.

**Hybrid search.** Spice supports vector search, full-text search, keyword search, and reciprocal rank fusion (RRF) ranking - all queryable via SQL UDTFs (`vector_search`, `text_search`, `rrf`, `rerank`). Enable hybrid search by adding an embedding model to the Spicepod and configuring a vector index on the target column ([search docs](https://spiceai.org/docs/features/search)). This means datasets that previously required a separate search index (Elasticsearch, OpenSearch, Pinecone) can be searched and queried in the same engine, against the same data, with results that are always consistent with the latest acceleration refresh.

**Embedded inference.** Spice includes an OpenAI-compatible AI gateway that routes to hosted models (OpenAI, Anthropic, xAI, Amazon Bedrock) or runs local models on CUDA/Metal. Configure a model in the Spicepod and call it via the `/v1/chat/completions` HTTP API or from SQL UDFs ([AI gateway docs](https://spiceai.org/docs/features/ai)). This replaces the pattern where applications queried Dremio for data and then made a separate call to an LLM API - Spice serves both from the same runtime, with the data already colocated.

### Phase 3: Decommission Dremio

Decommission Dremio only after every dataset, VDS/view, client, scheduled job, security policy, and catalog dependency has migrated and the Dremio endpoint shows no production traffic for an agreed observation period. Retain backups and a rollback plan until validation is complete.

## Getting started

A Dremio migration does not need to be a single cutover. Start by deploying Spice alongside Dremio, move one dataset at a time, and validate each change before continuing.

This migration plan stays incremental and limits the scope at every step. If a query result, schema, or performance characteristic diverges, you can isolate the cause to the dataset or migration step that just changed.

To begin, install Spice in minutes and configure one representative dataset:

```bash
# Install
curl https://install.spiceai.org | /bin/bash

# Initialize a project
spice init my-migration
cd my-migration

# Configure your first dataset
spice dataset configure

# Start the runtime
spice run

# Query
spice sql
sql> SELECT count(*) FROM orders WHERE order_date > '2026-01-01';
```

From there, use the migration phases in this guide to move the next dataset and validate the results.

We'd love to hear from you in the [Spice Community Slack channel](/slack) if you have any questions or need help getting started.

## Resources

- [Spice.ai OSS docs](https://spiceai.org/docs)
- [GitHub repo - Apache 2.0](https://github.com/spiceai/spiceai)
- [Data Connectors reference](https://spiceai.org/docs/components/data-connectors)
- [Spicepod reference](https://spiceai.org/docs/reference/spicepod)
- [Spice.ai Cloud Platform - managed option](/pricing/cloud)
- [Talk to an engineer - walk through your specific deployment](/get-a-demo)

<a id="appendix-dremio-spice-concept-map"></a>

## Appendix: Dremio -> Spice concept map

If you're coming from Dremio, here's how the core concepts translate.

### Sources and Federation

| Dremio | Spice | Notes |
| --- | --- | --- |
| Source (Postgres, S3, ADLS, ...) | [Data Connector](https://spiceai.org/docs/components/data-connectors) | 40+ connectors. Configure in the Spicepod with a `from:` URI. |
| Virtual Dataset (VDS) | [View](https://spiceai.org/docs/features/views) | Define the VDS SQL as a Spice view. Flatten nested VDS chains or materialize and accelerate the view as needed. |
| Iceberg table reads | [Iceberg Data Connector](https://spiceai.org/docs/components/data-connectors/iceberg) | Native Iceberg via REST catalog, AWS Glue, or Hive Metastore. |
| External ingestion (Kafka, Flink, etc.) | [Native CDC](https://spiceai.org/docs/features/cdc) | Spice captures changes directly from PostgreSQL, MongoDB, MySQL, DynamoDB and Debezium. No external pipeline. Available when you move sources in phase 2. |

### Reflections / Materialization

| Dremio | Spice | Notes |
| --- | --- | --- |
| Raw Reflection | [Acceleration](https://spiceai.org/docs/features/data-acceleration) | `acceleration: enabled: true` materializes a dataset locally. Choose engine (Arrow, Cayenne, DuckDB, SQLite, Postgres), storage mode (memory/file), and refresh strategy (full, append, CDC). |
| Aggregation Reflection | [Accelerated view](https://spiceai.org/docs/reference/spicepod/views#acceleration) | Define and accelerate a view with equivalent aggregation SQL. Unlike Dremio's transparent Reflection substitution, workloads must query the Spice view explicitly. |
| Reflection Recommendations | You decide | Dremio's automated reflection recommendations don't exist in Spice. You declare what to accelerate. More transparent and predictable. |
| Results cache | [Results cache](https://spiceai.org/docs/use-cases/caching/write-through-cache#query-results-cache) | LRU cache with configurable TTL and max size. Covers non-accelerated and federated queries. |

### Query Engine and Connectivity

| Dremio | Spice | Notes |
| --- | --- | --- |
| Query engine (Sonar) | [Apache DataFusion](/blog/how-we-use-apache-datafusion-at-spice-ai) | DataFusion v54 as of Spice v2.1. Vectorized, columnar, with dynamic filters and predicate pushdown. |
| Arrow Flight endpoint | [Flight / Flight SQL / ODBC / JDBC / ADBC / HTTP](https://spiceai.org/docs/api) | Drop-in for most BI tools. Same Arrow Flight protocol. |
| Semantic Layer | [Views](https://spiceai.org/docs/features/views) + [SQL UDFs](https://spiceai.org/docs/reference/spicepod/functions) + [NSQL](https://spiceai.org/docs/cli/reference/nsql) | Views and UDFs in the Spicepod. Text-to-SQL (NSQL) provides natural-language query grounded in your schema. |
| Query profiles / job history | [OpenTelemetry traces](https://spiceai.org/docs/features/observability#opentelemetry-metrics-exporter) + [Prometheus metrics](https://spiceai.org/docs/features/observability#prometheus-metrics-endpoint) | Distributed tracing across query execution, acceleration refresh, and CDC lag. Plug into your existing observability stack. |
| AI Functions (`AI_GENERATE`, `AI_COMPLETE`, `AI_CLASSIFY`) | [AI Gateway](https://spiceai.org/docs/features/large-language-models) + [SQL UDFs](https://spiceai.org/docs/reference/sql/ai) | Dremio's AI functions call external LLMs from SQL for classification, summarization, and structured extraction. Spice provides an OpenAI-compatible AI gateway with embedded inference support: call hosted models (OpenAI, Anthropic, xAI, Bedrock) or run local models (CUDA/Metal) via SQL UDFs and the HTTP API. Spice also supports structured output, tool use, and streaming. |
| AI Agent (Dremio 26+) | [NSQL](https://spiceai.org/docs/api/HTTP/post-nsql) + [data sandboxes](/feature/secure-ai-sandboxing) | Dremio's AI Agent provides a natural-language interface to the lakehouse for data exploration. Spice's NSQL provides text-to-SQL grounded in the federated schema, and data sandboxes provide isolated, policy-enforced namespaces for AI agent access. |

### Security and Operations

| Dremio | Spice | Notes |
| --- | --- | --- |
| Access control | [Enterprise authorization policies](https://docs.spice.ai/docs/enterprise/features/policy) + OIDC + mTLS | Re-implement row filters and column masks with Cedar policies. OSS deployments must retain these controls at the source or isolate datasets and runtimes. |
| Spaces / Folders | [Spicepod namespaces](https://spiceai.org/docs/getting-started/spicepods) | Organize datasets, views, and models in the Spicepod. Version-controlled by default (it's a YAML file in your repo). |
| Dremio Cloud | [Spice.ai Cloud Platform](https://docs.spice.ai) | Fully managed version of Spice.ai OSS  |
| Coordinator + Executors | [Multi-node distributed query](https://spiceai.org/docs/features/distributed-query) | Multi-active HA and distributed query [built on Apache Ballista](/blog/apache-ballista-at-spice-ai). |

<a id="appendix-dremio-spice-function-mapping"></a>

## Appendix: Dremio -> Spice Function Mapping

This table covers the most common Dremio-specific functions. Audit your full query inventory for anything not listed. See Spice AI documentation for available Scalar Functions, Aggregate Functions, etc.

| Dremio function | Spice / DataFusion equivalent | Notes |
| --- | --- | --- |
| `FLATTEN(array)` | `UNNEST(array)` | DataFusion's `UNNEST` expands arrays into rows, same semantics. Use `SELECT col, UNNEST(arr) FROM t` in place of `SELECT col, FLATTEN(arr) FROM t`. |
| `CONVERT_FROM(binary, 'JSON')` | `CAST(col AS VARCHAR)` then `json_*` functions, or `arrow_cast` | Dremio auto-parses JSON binary into STRUCT/LIST. In DataFusion, cast to string and use JSON extraction functions (`json_get`, `json_get_str`, etc.) or ingest as a structured type. |
| `CONVERT_TO(value, type)` | `CAST(value AS type)` or `arrow_cast(value, type)` | Standard SQL CAST covers most cases. `arrow_cast` for Arrow-specific type targets. |
| `ARRAY_CONTAINS(array, value)` | `array_has(array, value)` | DataFusion's `array_has` function. |
| `AI_GENERATE([model], prompt)` | `AI(prompt, [model])` | [Spice AI function](https://spiceai.org/docs/reference/sql/ai#ai) applying a model to a prompt. |
| `AI_COMPLETE([model], prompt)` | `AI(prompt, [model])` | [Spice AI function](https://spiceai.org/docs/reference/sql/ai#ai) applying a model to a prompt. |
| `AI_CLASSIFY(text, categories)` | `AI(prompt, [model])` | [Spice AI function](https://spiceai.org/docs/reference/sql/ai#ai) applying a model to a prompt. Output schema not supported at this time. |
| `LIST_FILES(path)` | Not applicable (different architecture) | Dremio's `LIST_FILES` recursively lists source directory files for AI function input. In Spice, data sources are declared as datasets in the Spicepod; file enumeration is not a query-time operation. |
| `TIMESTAMPDIFF(unit, start, end)` | `date_part(unit, end - start)` or `extract(unit FROM end - start)` | Rewrite with SQL; DataFusion uses standard SQL interval arithmetic. |
| `TIMESTAMPADD(unit, count, ts)` | `ts + INTERVAL 'count' unit` or `date_add(ts, days)` | Standard SQL interval addition. |
| Dot notation for nested fields (`a.b.c`) | `col['key']` bracket notation or struct field access | DataFusion supports struct field access. For JSON strings, use `json_get(col, 'path')`. |

<ContentRichText
  fields={{
    coverage: 'rc-end',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<AccordionFaq
  fields={{
    heading: 'Migrating Off Dremio FAQ',
    paragraph: '',
    items: [
      {
        title: 'Can Spice query Dremio directly during the migration?',
        paragraph:
          '<p>Yes. The Dremio data connector federates queries through Dremio\'s Arrow Flight endpoint. Run both systems in parallel for as long as you need.</p>',
      },
      {
        title: 'Does Spice support Apache Iceberg?',
        paragraph:
          '<p>Yes. Native Iceberg reads via REST catalog, AWS Glue, and Hive Metastore.</p>',
      },
      {
        title: 'What about Delta Lake?',
        paragraph: '<p>Also supported with a native connector.</p>',
      },
      {
        title: 'How does real-time data work?',
        paragraph:
          '<p>Built-in CDC from PostgreSQL (logical replication), MongoDB (change streams), MySQL (binlog), DynamoDB, and Debezium. Changes flow into the Cayenne accelerator and are queryable within seconds - no Kafka or Flink required.</p>',
      },
      {
        title: 'What BI tools work with Spice?',
        paragraph:
          '<p>Anything that speaks Arrow Flight SQL, JDBC, ODBC, or ADBC - Tableau, Power BI, Superset, Grafana, DBeaver, and others.</p>',
      },
      {
        title: 'Is there a managed cloud option?',
        paragraph:
          '<p>Yes. The Spice.ai Cloud Platform runs the same open-source runtime as a managed service. Start self-hosted, move to managed, or vice versa - the Spicepod configuration is the same.</p>',
      },
      {
        title: 'Where do I get help?',
        paragraph:
          '<p><a href="/get-a-demo">Reach out to the Spice team</a>. The engineering team does hands-on migration support.</p>',
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

---

## Multi-Tenancy for AI Agents without the Pipelines
URL: https://spice.ai/blog/multi-tenancy-for-ai-agents-without-pipelines
Date: 2026-04-15T00:00:00
Description: Learn how to serve multi-tenant AI agents from disparate enterprise data sources with tenant isolation, federated SQL, and no per-tenant pipelines.

<ContentRichText
  fields={{
    coverage: 'rc-start',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

**TL;DR:** Multi-tenant AI agents need access to customer data across disparate enterprise data sources, and building an ETL pipeline for every tenant doesn't scale. Spice.ai is a data and AI platform built on first principles for this category of use case, offering the optionality to deploy one sandboxed runtime per agent or tenant, all the way up to distributed multi-node query execution for larger workloads. This post walks through four patterns for deploying Spice as the data substrate for multi-tenant agents - each with different isolation guarantees, from logical filtering to fully sandboxed runtimes suited for regulated enterprise environments:

1. Query-time tenant isolation
2. Config-level tenant isolation
3. Runtime-level tenant isolation
4. Hybrid isolation

For more significant and variable SaaS workloads, we generally recommend the hybrid configuration, where large accounts get dedicated Spice instances, and the long tail shares a partitioned deployment.

---

## The AI Agent Challenge in Multi-Tenant SaaS

Multi-tenant SaaS infrastructure has always been operationally complex. The pipeline-per-integration model works at small scale, but hits a wall when you have hundreds or thousands of customers, each with their own data lakes, databases, and warehouses. ETL pipelines encode assumptions about schema, refresh schedules, and ownership that collapse when customer environments change. This naturally leads to significant overhead dedicated to managing ETL orchestration.

AI agents that need to query across all of these sources with strict tenant isolation add another layer entirely.

Spice is designed for exactly this problem - a data platform for AI context that queries disparate enterprise data sources with tenant isolation and without ETL pipelines. It's the same foundation [SaaS companies use with Spice](/industry/saas) for embedded analytics and per-tenant AI features on live operational data.

## What Spice Enables

Spice is a portable data, [search](/platform/hybrid-sql-search), and [AI-inference engine](/platform/llm-inference) [built in Rust on Apache DataFusion](/blog/how-we-use-apache-datafusion-at-spice-ai). It connects to [30+ data sources](/integrations) (S3, Snowflake, Databricks, PostgreSQL, Kafka, and more) and [accelerates queries locally](/platform/sql-federation-acceleration) for sub-second response times, serving SQL query, search, AI inference, and catalog APIs over HTTP, Arrow Flight, FlightSQL, ODBC, JDBC, and ADBC.

What makes Spice well-suited for multi-tenant agent deployments is its footprint and optionality. Unlike centralized clusters that require every tenant to share compute, memory, and query infrastructure, the Spice runtime is lightweight enough to deploy one instance per agent or per tenant, giving each agent its own [sandboxed data](/feature/secure-ai-sandboxing) and AI stack with its own sources, acceleration layers, and secrets. For workloads that demand it, Spice also supports [distributed, multi-node query execution](/blog/apache-ballista-at-spice-ai) at scale. Isolation is a deployment property rather than something you enforce in application code - and the foundation for the kind of enterprise data policy controls that regulated industries increasingly require.

<CoreBlock
  name="core-image"
  content={
    '<figure class="wp-block-image size-large"><img src="/website-assets/media/2026/02/multitenant-agent-example.png" alt="Multi-tenant agent deployment example"/></figure>'
  }
/>

The unit of configuration is a [`spicepod.yaml`](https://spiceai.org/docs/getting-started/spicepods), a declarative manifest for datasets, models, and secrets.

We call this out because tenant topology, source definitions, and acceleration behavior are all configured at this layer, making it the right abstraction for understanding the deployment patterns below.

## Pattern 1: Query-Time Tenant Isolation

This is the simplest operating model; one runtime serves many tenants. Datasets include tenant-partitioned tables, and the application always includes tenant filters in queries.

```yaml
version: v1
kind: Spicepod
name: saas-shared

datasets:
  - from: postgres:public.events
    name: events
    params:
      pg_host: db.shared.internal
      pg_port: '5432'
      pg_db: app
      pg_user: ${secrets:PG_USER}
      pg_pass: ${secrets:PG_PASS}
    acceleration:
      enabled: true
      engine: arrow
      refresh_check_interval: 1s
```

What this Spicepod is doing:

- `version`, `kind`, and `name` define a standard Spicepod manifest and runtime identity.
- `datasets` declares which source objects are queryable through Spice.
- `from: postgres:public.events` maps to one shared table that contains many tenants.
- `params` keeps connection settings explicit, while secrets stay externalized.
- `acceleration.refresh_check_interval: 1s` keeps local acceleration refreshes frequent.

Tradeoff summary:

- Pros: easiest to operate and cheapest to start.
- Cons: tenant isolation is logical. Correctness depends on consistent tenant filtering in every query path.

### Variant: View-Based Tenant Isolation

A lightweight extension of Pattern 1 moves tenant filtering from application code into the Spicepod itself using views. Each tenant gets a named view that wraps the shared dataset with a pre-applied filter. Agents query the view directly rather than constructing filters at runtime.

```yaml
datasets:
  - name: events
    from: postgres:public.events
    params: ...

views:
  - name: view_tenant_abc
    sql: "select * from events where tenant='tenant_abc'"
  - name: view_tenant_xyz
    sql: "select * from events where tenant='tenant_xyz'"
```

This makes tenant boundaries explicit in configuration without the overhead of separate dataset entries or multiple runtimes. The tradeoff is the same as Pattern 1 (isolation is still logical), but the filter is enforced at the Spice layer rather than relying on every query path in the application to get it right.

```mermaid
flowchart LR
  A[AI Agent or App] --> B[Shared Spice Runtime]
  B --> F[Tenant-Specific Spice Views]
  F --> C[(Shared Tenant-Partitioned Tables)]
```

## Pattern 2: Config-Level Tenant Isolation

This pattern keeps one runtime but makes tenant boundaries explicit in configuration by declaring separate dataset entries per tenant. In practice, these entries are generated from onboarding metadata.

```yaml
version: v1
kind: Spicepod
name: saas-many-datasets

datasets:
  - from: postgres:tenant_abc.events
    name: tenant_abc_events
    params:
      pg_host: db.pool.internal
      pg_port: '5432'
      pg_db: app
      pg_user: ${secrets:PG_USER}
      pg_pass: ${secrets:PG_PASS}

  - from: postgres:tenant_xyz.events
    name: tenant_xyz_events
    params:
      pg_host: db.pool.internal
      pg_port: '5432'
      pg_db: app
      pg_user: ${secrets:PG_USER}
      pg_pass: ${secrets:PG_PASS}

  # In production this list can be generated from tenant onboarding metadata.
```

What this Spicepod is doing:

- Each dataset name maps to a tenant-specific schema/table boundary.
- Isolation intent is encoded directly in configuration, not only at query time.
- The runtime still remains shared, so scheduling and memory are shared concerns.

Tradeoff summary:

- Pros: tenant boundaries are explicit in config and easier to audit.
- Cons: the manifest can become very large, and operational limits (reload time, config management, memory planning) become the bottleneck at very high tenant counts.

## Pattern 3: Runtime-Level Tenant Isolation

For strict isolation, run a separate Spicepod per tenant (or per enterprise tenant tier) and route requests using tenant context from auth/session claims.

`spicepod-tenant-abc.yaml`:

```yaml
version: v1
kind: Spicepod
name: tenant-abc

datasets:
  - from: postgres:public.events
    name: events
    params:
      pg_host: tenant-abc-db.internal
      pg_port: '5432'
      pg_db: app
      pg_user: ${secrets:PG_USER}
      pg_pass: ${secrets:PG_PASS}
    acceleration:
      enabled: true
      engine: duckdb
      mode: file
      refresh_check_interval: 1s
      params:
        duckdb_file: /var/lib/spice/tenant-abc.db
```

Router policy (conceptual):

```yaml
tenants:
  - id: enterprise-abc
    spicepod: spicepod-tenant-abc
  - id: enterprise-xyz
    spicepod: spicepod-tenant-xyz

default:
  spicepod: spicepod-shared
```

What this deployment is doing:

- Each tenant runtime has an independent manifest, compute envelope, and cache.
- Tenant routing is structural. Requests do not cross tenant runtime boundaries.
- You can apply stronger SLOs and controls to selected tenants.

Tradeoff summary:

- Pros: clearest isolation model and per-tenant operational control.
- Cons: higher operational overhead as tenant count grows.

```mermaid
flowchart LR
  U[AI Agent or App] --> R[Tenant Router]
  R -->|enterprise-abc| T1[Spice Runtime: tenant-abc]
  R -->|enterprise-xyz| T2[Spice Runtime: tenant-xyz]
  R -->|long tail| TS[Spice Runtime: shared]
```

## Pattern 4: Hybrid Isolation

Most SaaS businesses follow a power-law distribution. A small cohort of high-value accounts justifies dedicated infrastructure, while the long tail is better served by shared infrastructure.

Large tenants run on dedicated Spicepods. Smaller tenants run in a shared, partitioned deployment. The router decides placement, and clients query one logical interface.

```yaml
# router config (conceptual)
tenants:
  - id: enterprise-abc
    spicepod: spicepod-tenant-abc
  - id: enterprise-xyz
    spicepod: spicepod-tenant-xyz

default:
  spicepod: spicepod-shared
```

What this deployment is doing:

- Keeps the query interface stable while allowing tenant placement by policy.
- Isolates high-load or regulated tenants on dedicated runtimes.
- Uses shared capacity for the long tail to control cost and ops overhead.

Tradeoff summary:

- Pros: best long-term balance of isolation, cost, and operational scalability.
- Cons: requires a routing layer and clear promotion criteria for moving tenants between tiers.

```mermaid
flowchart LR
  U[AI Agent or App] --> R[Tenant-Aware Router]
  R --> E1[Dedicated Spicepod: Enterprise 1]
  R --> E2[Dedicated Spicepod: Enterprise 2]
  R --> S[Shared Partitioned Spicepod]
  E1 --> DS1[(Enterprise 1 Sources)]
  E2 --> DS2[(Enterprise 2 Sources)]
  S --> DSS[(Long-Tail Tenant Sources)]
```

## Getting Started

The right deployment shape depends on your workload: the scale of your tenant base, your isolation requirements, and how frequently each tenant's data is queried. Spice connects to 30+ sources through declarative configuration, so adding a new data source is a YAML entry rather than a pipeline build.

Explore the [Spice docs](https://spiceai.org/docs) to go deeper on the patterns covered here, or join the [Spice Slack community](/slack) to discuss your architecture with the team.

To design a multi-tenant deployment with the team, [get a demo](/get-a-demo) or review [Spice Cloud pricing](/pricing).

<ContentRichText
fields={{
    coverage: 'rc-end',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<AccordionFaq
  fields={{
    heading: 'Zero-ETL Multi-Tenant AI Agents FAQ',
    paragraph: '',
    items: [
      {
        title: 'What does zero-ETL mean in a multi-tenant AI application?',
        paragraph:
          '<p>Zero-ETL means querying tenant data in place through federation and only accelerating the datasets that need low-latency repeated reads. Instead of pipeline code per tenant, teams configure source access and refresh behavior in Spicepods.</p>',
      },
      {
        title:
          'How should teams choose between shared and dedicated Spicepods?',
        paragraph:
          '<p>Use shared runtimes for long-tail tenants with moderate traffic. Use dedicated Spicepods for high-load, high-sensitivity, or regulated tenants. Most production systems use a hybrid placement model and promote tenants based on observed thresholds.</p>',
      },
      {
        title: 'When is CDC acceleration better than pure federation?',
        paragraph:
          '<p>Use CDC acceleration for hot operational datasets that are queried frequently and require predictable low latency. Use federation for colder datasets where source-of-truth freshness matters more than sub-second response times.</p>',
      },
      {
        title:
          'Can one app query all tenant backends through one SQL interface?',
        paragraph:
          '<p>Yes. Spice federates across disparate enterprise data sources and exposes a unified SQL interface. Your app or agent can keep one query layer while the runtime routes each table scan to accelerated or federated paths as configured.</p>',
      },
      {
        title: 'How do AI agents connect to a Spice runtime?',
        paragraph:
          '<p>AI agents connect to Spice through the same interfaces applications use: SQL over HTTP, Arrow Flight, ODBC, JDBC, and ADBC. Spice also acts as an <a href="/feature/mcp-server-gateway">MCP server gateway</a>, so agents using the Model Context Protocol reach tenant data as governed tools rather than raw database connections. Because each runtime exposes only the datasets declared in its Spicepod, the connection path inherits whatever isolation pattern the deployment uses.</p>\n',
      },
      {
        title: "Does Spice replace each tenant's source database?",
        paragraph:
          '<p>No, Spice queries tenant sources in place and the source system remains the system of record. Acceleration materializes a local, query-optimized copy of hot datasets for low-latency reads, configured per dataset rather than per pipeline. For how a materialized working set differs from a conventional cache, see <a href="/learn/caching-vs-data-acceleration">caching versus data acceleration</a>.</p>\n',
      },
      {
        title: 'How do you onboard a new tenant without building a pipeline?',
        paragraph:
          '<p>Onboarding a tenant is a configuration change: add dataset entries to a shared Spicepod, generate a per-tenant manifest from onboarding metadata, or provision a dedicated runtime for the account. Connection details, secrets, and acceleration behavior are declared in YAML, so no extraction or transformation code is written per tenant. Offboarding is the reverse: remove the entries or retire the runtime.</p>\n',
      },
      {
        title: 'Can different tenants use different databases or data sources?',
        paragraph:
          '<p>Yes, each Spicepod declares its own sources, so one tenant can run on PostgreSQL while another runs on Snowflake or S3. Spice connects to more than 30 sources through declarative configuration, and agents query all of them through the same SQL interface. This matters in practice because customer environments rarely standardize on one stack.</p>\n',
      },
      {
        title: 'How does accelerated tenant data stay up to date?',
        paragraph:
          '<p>Accelerated datasets stay current through scheduled refreshes, controlled by <code>refresh_check_interval</code>, or through <a href="/feature/real-time-change-data-capture">real-time change data capture</a> that streams source changes into the acceleration layer without full-table refreshes. Freshness is configured per dataset, so a hot operational table can refresh every second while colder reference data refreshes less often.</p>\n',
      },
      {
        title:
          'Do multi-tenant AI agents need a separate vector database for search?',
        paragraph:
          "<p>No, Spice serves vector and full-text search from the same runtime that serves SQL, so each tenant's search indexes live inside the same isolation boundary as their datasets. Running a separate per-tenant vector database would reintroduce the per-tenant infrastructure sprawl that this architecture removes.</p>\n",
      },
      {
        title:
          'What is the most common mistake when isolating tenants for AI agents?',
        paragraph:
          "<p>The most common mistake is relying on application code to apply the tenant filter on every query path. A single missed filter can return one tenant's rows to another tenant's agent. Enforcing boundaries in configuration, through views, per-tenant datasets, or dedicated runtimes, makes isolation a property of the deployment instead of query discipline.</p>\n",
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

---

## On Writing
URL: https://spice.ai/blog/on-writing
Date: 2024-05-23T19:14:00
Description: Writing is fundamental to formalizing thoughts, communicating effectively, and is the ultimate creation tool.

<ContentRichText
  fields={{
    coverage: 'rc-start',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Words matter. A single word can throw you into the depths of despair or raise you to euphoria. Every significant civilization, culture, and religion has placed emphasis on them because words are how we&nbsp;<em>create.&nbsp;</em>Every idea starts with words which develop, grow, and materialize through the process of writing. Writing is fundamental to formalizing thoughts, communicating effectively, and is the ultimate creation tool.</p>'
  }
/>

<CoreBlock
  name="core-heading"
  content={'<h2 class="wp-block-heading h4">Thinking Formalized</h2>'}
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p><a href="https://www.youtube.com/watch?v=bfDOoADCfkg" target="_blank" rel="noreferrer noopener">Writing is thinking formalized</a>. We think and reason in words, so to think critically, you must write. Paul Graham, the founder of&nbsp;<a href="https://www.ycombinator.com/" target="_blank" rel="noreferrer noopener">Y Combinator</a>, has written at length on the power and necessity of&nbsp;<a href="https://paulgraham.com/words.html" target="_blank" rel="noreferrer noopener">putting ideas into words</a>&nbsp;as a "severe test" to know something well. Graham also quotes&nbsp;<a href="https://en.wikipedia.org/wiki/Turing_Award" target="_blank" rel="noreferrer noopener">Turing Award</a>&nbsp;winner Leslie Lamport:</p>'
  }
/>

<PostQuote
  fields={{
    message:
      "If you're thinking without writing, you only think you're thinking.",
    name: 'Leslie Lamport',
    subtext: 'Paul Graham (@paulg) May 22, 2022',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<CoreBlock name="core-paragraph" content={'<p></p>'} />

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Writing well shows clarity of thought, but confusing, illogical, and verbose writing betrays poor thinking. Richard Guindon wrote&nbsp;<a href="https://www.goodreads.com/work/quotes/3403680-guindon-michigan-so-far" target="_blank" rel="noreferrer noopener"><em>"Writing is nature\'s way of letting you know how sloppy your thinking is."</em></a></p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Part of Amazon\'s success is credited to its culture of writing and&nbsp;<a href="https://news.ycombinator.com/item?id=19116208" target="_blank" rel="noreferrer noopener">Jeff\'s requirement for 6-pagers</a>. Instead of Powerpoint presentations, detailed documents are required, which are read in silence at the beginning of meetings. Writing documents ensures deep thinking, thorough understanding, critical evaluation, and effective communication. Documents also level the playing field for meeting participants, so everyone starts with the same contextual foundation facilitating higher-quality discussions.</p>'
  }
/>

<CoreBlock
  name="core-heading"
  content={'<h2 class="wp-block-heading h4">Writing at Spice AI</h2>'}
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>At&nbsp;<a href="/" target="_blank" rel="noreferrer noopener">Spice</a>, we believe great writing is a reflection of clear thinking; and moreover the writing process helps create and crystallize that clear thinking. We infuse writing into everything we do, which started with the Spice AI vision, our first-principles, and includes the mission and strategy, customer discovery, problem-solution, product management, and engineering. Spice board meetings start with a&nbsp;<a href="https://x.com/immad/status/1750686810613911593" target="_blank" rel="noreferrer noopener">board memo</a>&nbsp;pre-read and discussion rather than a deck. And across the company we document major decisions using Spice Decision Records (SDRs), a version of&nbsp;<a href="https://adr.github.io/" target="_blank" rel="noreferrer noopener">ADRs</a>, that extend beyond engineering.</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Writing is leveraged throughout the customer-discovery and product creation process. This starts with written notes from&nbsp;<a href="https://www.momtestbook.com/" target="_blank" rel="noreferrer noopener">Mom Test</a>&nbsp;conversations, to using&nbsp;<a href="https://aws.amazon.com/blogs/startups/startup-advice-how-to-write-a-narrative/" target="_blank" rel="noreferrer noopener">Amazon\'s Docs</a>&nbsp;to define product vision and value proposition, which are iteratively tested with prospects and customers, providing distilled requirements for engineering, and creating clear messaging for customers and stakeholders.</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Precison, concision, and structure are important, so writing doesn\'t have to take a lot of time. We start with simple templates that define the&nbsp;<strong>What or Goal-State</strong>&nbsp;of what we want to achieve,&nbsp;<strong>Why</strong>&nbsp;it should be prioritized, and&nbsp;<strong>By When</strong>. Here\'s the&nbsp;<a href="https://github.com/spiceai/spiceai/issues/new?assignees=&amp;labels=kind%2Fenhancement&amp;projects=&amp;template=enhancement.md&amp;title=Enhancement%3A+%3C%3E" target="_blank" rel="noreferrer noopener">GitHub Issue template</a>&nbsp;we use.</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>At Spice, writing is crucial in creating clarity, communicating effectively, and working as one team. A culture of writing ensures everyone is on the same page regarding goals, expectations, and plans. Great engineers are great communicators, a trait also recognized by other leaders like&nbsp;<a href="https://x.com/pauldix" target="_blank" rel="noreferrer noopener">Paul Dix</a>, CTO of InfluxData.</p>'
  }
/>

<CoreBlock
  name="core-image"
  content={
    '<figure class="wp-block-image"><img src="https://cdn.prod.website-files.com/6362f59f9fd4ac355fc06eaf/66689dc73d05d8d9b8d1ebfe_1*xJR2bGdlwCyrYwqO_dB2_w.webp" alt="On Writing"/></figure>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>For those early in their careers, clear thinking is<em>&nbsp;table stakes.&nbsp;</em>As you rise in seniority, what you ultimately get paid for is making and communicating a small number of&nbsp;<em>high-quality decisions</em>. Writing well becomes even more important as you progress in your career, especially in teams like Spice, where communication and leadership (creating clarity) are core values. At Spice, everyone is expected to write well.</p>'
  }
/>

<CoreBlock
  name="core-heading"
  content={'<h2 class="wp-block-heading h4">Writing in the age of ChatGPT</h2>'}
/>

<CoreBlock
  name="core-paragraph"
  content={
    "<p>It's seductive to outsource your writing to AI, but if you do, your ability to think critically and create clarity for yourself and others will atrophy, along with your ability to create and forge your own destiny in the world. At Spice, while AI is encouraged for ideation and research, our guidance is to avoid using ChatGPT and other generative AI tools for&nbsp;<em>writing</em>&nbsp;as to maintain our critical thinking muscle. Some engineers take this even further and intentionally disable tools like GitHub Copilot when writing core or critical code.</p>"
  }
/>

<CoreBlock
  name="core-heading"
  content={'<h2 class="wp-block-heading h4">Principles for writing</h2>'}
/>

<CoreBlock
  name="core-list"
  content={
    '<ol start="1" class="wp-block-list"><li><strong>Audience.</strong>&nbsp;Be aware of, understand, and target a specific audience. Don\'t waste their time.</li><li><strong>Clarity.</strong>&nbsp;Strive for clear, articulate, and straightforward expression. Be as specific, precise, and concise as possible. Remove all unnecessary words.</li><li><strong>Narrative.</strong>&nbsp;Use narrative, story, or essay form, and avoid bullet-points except for specific lists.</li><li><strong>Structure.</strong>&nbsp;Use structure to organize ideas coherently. E.g. write emails using the&nbsp;<a href="https://en.wikipedia.org/wiki/Inverted_pyramid_(journalism)" target="_blank" rel="noreferrer noopener">Inverted Pyramid</a>&nbsp;structure.</li><li><strong>Revision.</strong>&nbsp;Read, edit, and revise until the piece is as clear, precise, concise, and well-structured for the audience as possible.</li></ol>'
  }
/>

<CoreBlock
  name="core-heading"
  content={'<h2 class="wp-block-heading h4">Conclusion</h2>'}
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Writing forces us to articulate ideas precisely which creates clarity. Through clarity we generate certainty - one of the&nbsp;<a href="https://www.tonyrobbins.com/mind-meaning/do-you-need-to-feel-significant/" target="_blank" rel="noreferrer noopener">6 human needs</a>. Through high certainty we can lead ourselves and others to do great things and ultimately create the world we desire.</p>'
  }
/>

<CoreBlock
  name="core-heading"
  content={'<h3 class="wp-block-heading h5">Learning Resources</h3>'}
/>

<CoreBlock
  name="core-list"
  content={
    '<ul class="wp-block-list"><li><a href="https://twitter.com/polak_jasper/status/1746163715919970783?s=61&amp;t=gjd54e99UFTiz1UFxYsvlw" target="_blank" rel="noreferrer noopener">Amazon on writing</a>.</li><li><a href="https://www.youtube.com/watch?v=bfDOoADCfkg" target="_blank" rel="noreferrer noopener">Jordan Peterson on Writing</a>&nbsp;and his&nbsp;<a href="https://docs.google.com/viewer?url=http%3A%2F%2Fjordanbpeterson.com%2Fwp-content%2Fuploads%2F2018%2F02%2FEssay_Writing_Guide.docx" target="_blank" rel="noreferrer noopener">Essay Writing Guide</a>.</li><li><a href="https://www.amazon.com/Writing-Well-Classic-Guide-Nonfiction/dp/0060891548/ref=sr_1_1?keywords=On+Writing+Well&amp;qid=1703661604&amp;sr=8-1" target="_blank" rel="noreferrer noopener">On Writing Well</a>&nbsp;by William Zinger</li><li><a href="https://www.amazon.com/Elements-Style-4th-William-Strunk/dp/B0BYRNBRZ3/ref=sr_1_1?crid=HXBSZO5VIG6U&amp;keywords=The+Elements+of+Style%22+by+Strunk+and+White&amp;qid=1703661658&amp;sprefix=on+writing+well%2Caps%2C251&amp;sr=8-1" target="_blank" rel="noreferrer noopener">The Elements of Style</a>&nbsp;by Strunk and White.</li><li><a href="https://paulgraham.com/articles.html" target="_blank" rel="noreferrer noopener">Paul Graham\'s Essays</a>.</li><li><a href="https://ideas.ted.com/peoples-words-and-actions-can-actually-shape-your-brain-a-neuroscientist-explains-how/" target="_blank" rel="noreferrer noopener">People\'s words and actions can actually shape your brain</a>&nbsp;- TED Ideas.</li></ul>'
  }
/>

<CoreBlock name="core-paragraph" content={'<p></p>'} />

<ContentResourceFeatured
  fields={{
    heading: 'Explore more Spice resources',
    paragraph:
      'Tutorials, docs, and blog posts to help you go deeper with Spice.',
    mode: 'related',
    resources: false,
    padding_top: 'unset',
    padding_bottom: 'unset',
    related_posts: [
      {
        title: 'A Developer&#8217;s Guide to Understanding Spice.ai',
        slug: '/blog/a-developers-guide-to-understanding-spice-ai',
        excerpt:
          'This guide helps developers build a mental model of why, how, and where to use Spice.',
        image:
          '/website-assets/media/2026/02/A-developers-guide-to-understanding-Spice.ai_.png',
        type: 'Blog',
        taxonomy: [
          'Engineering',
          'Spice AI',
          'Spice Cloud Platform',
          'Spice OSS',
        ],
      },
      {
        title: 'How we use Apache DataFusion at Spice AI',
        slug: '/blog/how-we-use-apache-datafusion-at-spice-ai',
        excerpt:
          'Why we chose to build on DataFusion and how we extended it with custom TableProviders, optimizer rules, and UDFs for federated SQL',
        image:
          '/website-assets/media/2026/01/Engineering-at-Spice-AI-Apache-DataFusion.png',
        type: 'Blog',
        taxonomy: [
          'Spice AI',
          'Spice Cloud Platform',
          'Spice OSS',
          'SQL Federation',
        ],
      },
      {
        title: 'Real-Time Hybrid Search Using RRF: A Hands-On Guide with Spice',
        slug: '/blog/real-time-hybrid-search-using-rrf',
        excerpt:
          'Surfacing relevant answers to searches across datasets has historically meant navigating significant tradeoffs.&nbsp;Keyword (or lexical) search&nbsp;is fast, cheap, and commoditized, but limited by the constraints of exact matching.&nbsp;Vector (or semantic) search&nbsp;captures nuance and intent, but can be slower, harder to debug, and expensive to run at scale. Combining both usually entails standing up multiple engines [&hellip;]',
        image:
          '/website-assets/media/2025/11/68fa4fdfded26b3b6472a172_image-8.png',
        type: 'Blog',
        taxonomy: ['Search', 'Spice AI'],
      },
    ],
  }}
/>

<TalkToAnEngineerCta />

<ContentRichText
  fields={{
    coverage: 'rc-end',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

---

## Building an Enterprise SRE Agent with OpenClaw and Spice
URL: https://spice.ai/blog/openclaw-and-spice-governed-access-to-production-data-for-enterprise-agents
Date: 2026-05-19T00:00:00
Description: How to build an OpenClaw SRE with Spice for safe, unified, and observable access to production data, demonstrated with real-world incident workflows.

<ContentRichText
  fields={{
    coverage: 'rc-start',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

OpenClaw, the open-source AI agent formerly known as ClawdBot, went viral for giving AI unrestricted access to users' computers, data, and services with text messages. It met users where they were - in Slack, Telegram, WhatsApp, and even iMessage. AI models could act freely and autonomously, which even led to them creating the infamous [moltbook](https://www.moltbook.com/), a social network just for OpenClaw agents. The power of AI became obvious to non-technical users overnight. But with stories like [Meta AI Director's OpenClaw deleting her emails](https://www.businessinsider.com/meta-ai-alignment-director-openclaw-email-deletion-2026-2), it quickly showed why enterprises need secure, governed access before deploying claws in production.

Imagine collaborating with an AI SRE in Slack to diagnose a production incident. In a situation where every second counts, an agent like that could be a lifesaver. To be useful however, it needs access to production data: logs, metrics, customer data, and internal documentation. But how do you give AI all that data without giving it direct credentials and access to every system? How do you make sure the queries it runs are safe and performant? How do you keep a human in the loop for critical decisions without slowing down the workflow?

**TL;DR:** To make an OpenClaw-style SRE agent enterprise-ready, deploy Spice.ai between the agent and production systems. Spice provides one governed SQL endpoint for data systems and backends like Postgres, HTTP, GitHub, metrics, and runbooks; accelerates and sandboxes live queries; supports hybrid search over unstructured documentation; and traces every query for auditability.

Across use cases, enterprise AI agents have strict requirements:

- Data access must be sandboxed; controlled, observable, and auditable
- Agents must never receive direct production credentials
- The agent should be able to reason across all data it needs to be effective - structured and unstructured
- Latency must be low so that the agent feels responsive and supports real-time incident response
- Mission-critical actions should require human approval before execution

Agentic workloads and patterns place new demands on legacy data systems, and Spice.ai was built for [secure AI agent](/use-case/secure-ai-agents) workloads since its inception, long before OpenClaw made it clear why they mattered. Check out the [Spice 1.0 announcement](/blog/announcing-spice-ai-open-source-1-0-stable) for background on the open-source runtime.

In that spirit, let's build an enterprise-grade OpenClaw SRE with Spice.

We demoed this live at [AI Dev 26](https://ai-dev.deeplearning.ai/), and this post walks through the full architecture: an OpenClaw SRE agent monitoring an order payment service running on EC2, Postgres, GitHub, and HTTP endpoints.

<PostVideo
  fields={{
    thumbnail: false,
    type: 'youtube',
    video_id: 'ycKLqk5tezw',
    video_title:
      'AI Dev 26 x SF | Luke Kim: The Agent Data Stack\u2014Why Every AI Agent Needs Its Own Data Stack',
    video_upload_date: '2026-05-22T09:55:15-07:00',
    video_channel: 'DeepLearningAI',
    video_description:
      'Talk from AI Dev 26 by Spice founder Luke Kim on why every AI agent needs its own data stack.',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

## How does Spice give OpenClaw governed access to production data?

Some background on the setup and Spice before putting the SRE agent to the test.

To be effective, agents need a lot of data, and that data lives in a lot of places. Handing an agent direct credentials to every backend is how you end up with exhausted connection pools, expensive queries at the wrong moment, and a real risk of taking production down.

Spice sits between the agent and backend systems as a secure, performant data sandbox. From the agent's perspective, it is a single SQL (or MCP) endpoint. Behind it, Spice provides [SQL federation and acceleration](/platform/sql-federation-acceleration) across relational databases, HTTP APIs, object storage, and unstructured documents. The agent does not need to know which system holds what; it queries Spice, and Spice routes, accelerates, governs, and traces every call.

## What does the OpenClaw SRE architecture look like?

In this walkthrough, we are on-call for an order payment service running on EC2, with state in Postgres, runbooks in GitHub, and metrics behind HTTP endpoints. Spice sits in front of all of it, and the agent only ever talks to Spice.

![OpenClaw and Spice architecture diagram](/website-assets/media/2026/04/spice-openclaw-architecture.png)

In true OpenClaw fashion, the agent lives where we already work, in Slack, and keeps us in the loop for any critical actions.

![OpenClaw SRE in Slack, connected to Spice](/website-assets/media/2026/04/slack-greeting.png?bg)

[Spice is open-source](https://spiceai.org/docs) and can be deployed anywhere: at the edge, on-premise, or in the cloud. For this demo, we'll use [Spice Cloud](/pricing). From Spice's side, the connected datasets the agent can query show up in the dashboard:

![Spice dashboard showing connected datasets](/website-assets/media/2026/04/spice-dashboard-v2.png)

In Headlamp, the services backing the payment workflow (load-generator, order-service, and friends) start in their default setup:

![Backend service setup with one replica, healthy state](/website-assets/media/2026/04/backend-setup-v3.png)

Baseline metrics for the order payment service: one replica, 100% success rate, ~250ms latency.

![Grafana dashboard showing default healthy state before errors, with all services visible](/website-assets/media/2026/04/grafana-setup-default-v3.png)

Scene set. Time to break things.

## Incident one: latency spike

We kick off a load generator that ramps six replicas of traffic against the single service instance. Latency climbs from 250 ms to over 400 ms, and an alert lands in the Slack channel the SRE agent monitors.

![Dashboard showing latency spike alongside the Slack alert](/website-assets/media/2026/04/latency-spike-v3.png)

![Slack alert triggered by latency spike, shown in Clawbot chat](/website-assets/media/2026/04/slack-latency-spike-alert-v2.png?bg)

The agent investigates through Spice; querying monitoring logs, service metrics, and order data via the same SQL endpoint. It correlates the alert with traffic against a single replica and recommends scaling out to three:

![Clawbot SRE advising the human operator to scale to three replicas](/website-assets/media/2026/04/scale-to-3-replicas-v2.png?bg)

We confirm and apply the change:

![Human operator increasing service replicas in backend configuration](/website-assets/media/2026/04/change-replica-configuration-v3.png)

Latency drops. Incident one closed.

## Incident two: PgBouncer and Postgres connection exhaustion

Scaling out fixed latency, but each new replica brought its own connection pool, and together they exhaust what Postgres is configured to handle. 500s start accumulating, and a new alert fires.

![Dashboard showing DB connection failures and 500 errors](/website-assets/media/2026/04/db-connection-errors-v3.png)

This one needs more than metrics. The fix lives in a PgBouncer runbook, not on a dashboard.

Spice indexes unstructured documents alongside structured data. Markdown runbooks and internal troubleshooting guides are searchable through [hybrid SQL search](/platform/hybrid-sql-search), which combines full-text and vector search. The agent searches both the live incident data and the runbooks, and surfaces the relevant procedure: switch PgBouncer from session mode to transaction mode so connections are shared across requests instead of held per session.

![OpenClaw SRE response to error inquiry with diagnosis and guidance](/website-assets/media/2026/04/openclaw-errors-response-v3.png?bg)

We apply the configuration change:

![Transaction mode configuration change](/website-assets/media/2026/04/transaction-mode.png)

Errors clear, the service recovers, and the success rate climbs back toward 100%.

![Dashboard showing the service recovering toward 100% success rate](/website-assets/media/2026/04/dashboard-recovery-v3.png)

## How does the agent assess customer impact?

With both incidents resolved, we still need to know who was affected. Instead of cross-referencing logs and order tables by hand, we ask the agent:

![Customer impact inquiry screenshot](/website-assets/media/2026/04/customer-impact-inquiry.png?bg)

The agent joins error logs with order data through Spice and returns the affected customers, what they experienced, and the timeframe, ready for follow-up:

![Customer impact dashboard](/website-assets/media/2026/04/customer-impact-v2.png?bg)

## How does Spice make agent activity observable?

Every query the agent ran across both incidents is traced in Spice. Configuration, query plans, and SQL-level activity are all visible, so we can audit exactly what the agent saw and why it reached its recommendations.

![Spice SQL observability dashboard showing query details and agent activity](/website-assets/media/2026/04/spice-sql-observability-v2.png?bg)

![Spice dashboard showing query tracing for Clawbot agent during latency spike incident](/website-assets/media/2026/04/spice-query-tracing-v2.png?bg)

## What changes when deploying AI agents in production?

The OpenClaw SRE use case generalizes the challenge any enterprise agent faces when a workflow requires access to multiple systems: customer data, order history, internal documentation, and metrics each live in different places with different access patterns.

Direct access to each system is risky and operationally complex. Spice provides the substrate that makes access unified, safe, and observable without requiring the agent framework to handle that complexity.

## Key takeaways

- An OpenClaw SRE agent needs governed production data access, not direct credentials to every backend system.
- Spice gives the agent one SQL interface across Postgres, HTTP endpoints, GitHub, metrics, and runbooks.
- Hybrid SQL search lets the agent retrieve operational guidance from unstructured documentation and combine it with structured incident data.
- Query tracing and SQL-level observability make agent actions auditable enough for enterprise production environments.

## Getting started with governed AI agents

This architecture works with any agent framework and any data sources Spice supports. [Spice is open-source](https://spiceai.org/docs) and can run at the edge, on-premise, or in the cloud. If you are building agent workflows that need secure, fast access to production context, start with [secure AI agents](/use-case/secure-ai-agents), [SQL federation and acceleration](/platform/sql-federation-acceleration), and [hybrid SQL search](/platform/hybrid-sql-search). For MCP-based agent deployments, review the [MCP server gateway](/feature/mcp-server-gateway).

For implementation details, the [Spice OSS docs](https://spiceai.org/docs) and [Spice Cloud docs](https://docs.spice.ai) are good starting points. To evaluate managed deployment options, see [Spice Cloud pricing](/pricing) or [get a demo](/get-a-demo).

[Join the Spice Slack community](/slack) and reach out with any feedback or questions!

## Frequently Asked Questions

### What is OpenClaw?

OpenClaw is an open-source AI agent, formerly named ClawdBot, that acts on a user's computer, data, and services through text messages. It runs in chat apps such as Slack, Telegram, WhatsApp, and iMessage. Public incidents, like an agent deleting a user's emails, showed why enterprises need governed access before production deployment.

### Why should an SRE agent not receive direct credentials to production systems?

An agent with direct credentials can exhaust connection pools, run expensive queries at the wrong moment, and take production down. A governed layer holds the credentials instead, and the agent queries one endpoint that the layer controls and traces. Spice was built for [secure AI agent](/use-case/secure-ai-agents) workloads and holds backend credentials so the agent never sees them.

### How does an OpenClaw agent connect to Spice?

The agent connects to Spice through a single SQL or MCP endpoint. Behind that endpoint, Spice federates queries across relational databases, HTTP APIs, object storage, and unstructured documents. The agent does not need to know which system holds the data; Spice routes, accelerates, governs, and traces every call. For MCP-based deployments, the [MCP server gateway](/feature/mcp-server-gateway) routes tools to models with fine-grained access controls.

### Can the SRE agent search runbooks and other unstructured documentation?

Yes. Spice indexes unstructured documents alongside structured data, so the agent searches runbooks and internal guides with the same SQL endpoint. Hybrid search combines full-text and vector search, so the agent retrieves the relevant procedure and combines it with live incident data. In the demo, this found the PgBouncer runbook that resolved the connection exhaustion incident.

### Can the OpenClaw SRE agent apply production changes on its own?

No. In this architecture, the agent diagnoses incidents and recommends changes, and a human operator approves and applies them. In the demo, the agent recommended scaling to three replicas, and the operator confirmed the change before applying it. Approval for mission-critical actions is one of the strict requirements for enterprise AI agents.

### What data sources does the OpenClaw SRE agent query in the demo?

The demo agent queries service metrics behind HTTP endpoints, order data in Postgres, runbooks in GitHub, and monitoring logs, all through Spice. The order payment service itself runs on EC2. Spice presents these sources to the agent as one governed SQL endpoint.

### Does this architecture work with agent frameworks other than OpenClaw?

Yes. The architecture works with any agent framework and any data sources Spice supports. Spice deploys at the edge, on-premise, or in the cloud, and Spice Cloud offers a managed option. Any agent that connects over SQL or MCP queries the same governed endpoint.

<ContentRichText
  fields={{
    coverage: 'rc-end',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

---

## Operationalizing Amazon S3 for AI: From Data Lake to AI-Ready Platform in Minutes
URL: https://spice.ai/blog/operationalizing-amazon-s3-for-ai
Date: 2026-02-03T18:03:10
Description: Transform Amazon S3 from passive storage to an AI-ready platform. Real-world example using Spice and S3 for hybrid search and LLM inference.

<ContentRichText
  fields={{
    coverage: 'rc-start',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<CoreBlock
  name="core-heading"
  content={'<h2 class="wp-block-heading h4"><strong>TL;DR</strong></h2>'}
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Amazon S3 has&nbsp;evolved into one of&nbsp;the&nbsp;most&nbsp;flexible&nbsp;and powerful systems of&nbsp;record, but&nbsp;leveraging&nbsp;it for&nbsp;real-time AI&nbsp;workloads&nbsp;requires&nbsp;significant distributed&nbsp;systems&nbsp;work&nbsp;to&nbsp;stitch together&nbsp;applications,&nbsp;databases, vector stores,&nbsp;and&nbsp;caches.&nbsp;</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Spice handles&nbsp;ingestion, federation, acceleration, caching, and query execution, so teams can build AI applications&nbsp;and agents&nbsp;directly on S3 without&nbsp;that distributed systems complexity.&nbsp;&nbsp;</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>This post walks through a real-world example of&nbsp;using&nbsp;Spice&nbsp;to transform&nbsp;Amazon S3&nbsp;from&nbsp;a&nbsp;passive&nbsp;object&nbsp;store&nbsp;into a low-latency, AI-ready execution layer.&nbsp;&nbsp;</p>'
  }
/>

<CoreBlock
  name="core-heading"
  content={
    '<h2 class="wp-block-heading h4"><strong>From storage to system of record</strong>&nbsp;</h2>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Amazon S3 is durable, predictable, and cost-effective at&nbsp;massive scale. Its API has become&nbsp;the storage&nbsp;standard, making it one of the most portable foundations in the modern data stack.&nbsp;</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    "<p>But S3&nbsp;wasn't&nbsp;designed for&nbsp;serving low-latency, operational workloads.&nbsp;To serve application queries, teams&nbsp;generally&nbsp;copy&nbsp;data into databases, search engines, and caches.&nbsp;</p>"
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>However, recently,&nbsp;<a href="/partners/aws">AWS</a>&nbsp;has&nbsp;extended S3 with primitives that&nbsp;can make it the&nbsp;backbone of AI workloads:&nbsp;</p>'
  }
/>

<CoreBlock
  name="core-list"
  content={
    '<ul class="wp-block-list"><li><a href="https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-tables.html" target="_blank" rel="noreferrer noopener"><strong>S3 Tables</strong></a>&nbsp;bring managed Apache Iceberg tables directly into&nbsp;S3. Structured, tabular data that traditionally lived in databases or data warehouses can&nbsp;be&nbsp;queried&nbsp;with the&nbsp;simplicity of the S3 storage layer.&nbsp;</li></ul>'
  }
/>

<CoreBlock
  name="core-list"
  content={
    '<ul class="wp-block-list"><li><a href="/blog/getting-started-with-amazon-s3-vectors-and-spice" target="_blank" rel="noreferrer noopener"><strong>S3 Vectors</strong></a>&nbsp;is&nbsp;purpose-built vector storage designed for embeddings at&nbsp;petabyte&nbsp;scale&nbsp;that can&nbsp;power&nbsp;search and&nbsp;<a href="/use-case/retrieval-augmented-generation" target="_blank" rel="noreferrer noopener">RAG,</a>&nbsp;grounding&nbsp;foundation&nbsp;models with proprietary data, enabling&nbsp;semantic search that understands meaning rather than just matching keywords.&nbsp;</li></ul>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    "<p>These&nbsp;foundational capabilities&nbsp;can&nbsp;change&nbsp;what's&nbsp;possible when&nbsp;you're&nbsp;building AI applications.&nbsp;They&nbsp;are, however, still only storage primitives that don't&nbsp;solve&nbsp;all of&nbsp;the distributed systems&nbsp;complexity&nbsp;you&nbsp;end up&nbsp;facing&nbsp;at scale: ingestion, federation, caching, sharding,&nbsp;partitioning,&nbsp;query optimization, re-ranking,&nbsp;observability, and more.&nbsp;Infrastructure complexity compounds&nbsp;quickly.&nbsp;&nbsp;</p>"
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    "<p>Even a nominally straight-forward Q&amp;A application needs to&nbsp;ingest&nbsp;structured data (questions, answers, metadata)&nbsp;and&nbsp;unstructured data (long-form text),&nbsp;vectorize the data to produce&nbsp;embeddings (for semantic search)&nbsp;and&nbsp;keyword indexes (for exact matches), and&nbsp;provide high-quality context for&nbsp;LLM inference (for analysis and generation). To&nbsp;serve these&nbsp;workloads,&nbsp;you're&nbsp;still required to build and&nbsp;operate&nbsp;application-layer&nbsp;distributed systems&nbsp;code to&nbsp;deliver the system at scale.&nbsp;</p>"
  }
/>

<CoreBlock
  name="core-image"
  content={
    '<figure class="wp-block-image size-full"><img src="/website-assets/media/2026/02/Distributed-complexity.png" alt="S3 and S3 Vectors are great storage primitives. Production AI systems need federation, ingestion, acceleration, hybrid search, and distributed query on top" class="wp-image-1927"/><figcaption class="wp-element-caption"><em>Figure 1. </em>S3 and S3 Vectors are great storage primitives. Production AI systems need federation, ingestion, acceleration, hybrid search, and distributed query on top.</figcaption></figure>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>The missing piece is a runtime that&nbsp;turns S3 into an operational, AI-ready system that handles query execution, <a href="/use-case/datalake-accelerator">data lake acceleration</a>, and coordination across structured data, vectors, and real-time sources.&nbsp;</p>'
  }
/>

<CoreBlock
  name="core-heading"
  content={
    '<h2 class="wp-block-heading h3"><strong>Spice AI: The&nbsp;operational&nbsp;layer&nbsp;for S3</strong>&nbsp;</h2>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Spice&nbsp;integrates your&nbsp;applications and your data infrastructure - S3, databases, data warehouses,&nbsp;unstructured stores&nbsp;- and&nbsp;handles&nbsp;the&nbsp;distributed systems complexity&nbsp;for you.&nbsp;By unifying SQL query&nbsp;<a href="/platform/sql-federation-acceleration" target="_blank" rel="noreferrer noopener">federation and acceleration</a>,&nbsp;<a href="/platform/hybrid-sql-search" target="_blank" rel="noreferrer noopener">search and retrieval</a>, and&nbsp;<a href="/platform/llm-inference" target="_blank" rel="noreferrer noopener">LLM inference</a>&nbsp;into a single, deploy-anywhere runtime, Spice makes it possible to serve data and AI-powered experiences directly from S3 - securely, at low latency, and without sacrificing the simplicity and economics of object storage.&nbsp;Spice is built in Rust&nbsp;with&nbsp;modern open-source technologies&nbsp;including&nbsp;<a href="https://datafusion.apache.org/" target="_blank" rel="noreferrer noopener">Apache DataFusion</a>,&nbsp;<a href="https://arrow.apache.org/" target="_blank" rel="noreferrer noopener">Apache Arrow</a>,&nbsp;<a href="https://iceberg.apache.org/" target="_blank" rel="noreferrer noopener">Apache Iceberg,</a>&nbsp;and&nbsp;<a href="https://github.com/vortex-data/vortex" target="_blank" rel="noreferrer noopener">Vortex</a>.&nbsp;&nbsp;</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Here are four&nbsp;specific challenges&nbsp;Spice&nbsp;addresses&nbsp;for these AI-driven workloads:&nbsp;</p>'
  }
/>

<CoreBlock
  name="core-heading"
  content={
    '<h3 class="wp-block-heading h5"><strong><a href="https://spiceai.org/docs/features/query-federation" target="_blank" rel="noreferrer noopener">Federate&nbsp;data&nbsp;where it lives</a>&nbsp;</strong></h3>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Spice executes&nbsp;SQL queries across databases, data lakes, and APIs with&nbsp;zero ETL.&nbsp;For example, you can write a single query that joins&nbsp;live data in&nbsp;S3 Tables&nbsp;and&nbsp;Aurora or combines historical logs in S3 with real-time&nbsp;operational data&nbsp;from DynamoDB.&nbsp;</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Spice&nbsp;has&nbsp;native&nbsp;<a href="https://spiceai.org/docs/components/data-connectors" target="_blank" rel="noreferrer noopener">data connectors</a>&nbsp;across 35+ data sources:&nbsp;Everything from&nbsp;S3, PostgreSQL, MySQL, Snowflake, Databricks, DynamoDB, and more.&nbsp;</p>'
  }
/>

<CoreBlock
  name="core-heading"
  content={
    '<h3 class="wp-block-heading h5"><strong><a href="https://spiceai.org/docs/features/data-acceleration" target="_blank" rel="noreferrer noopener">Accelerate data for latency-sensitive AI&nbsp;apps</a>&nbsp;</strong></h3>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Spice implements tiered caching and acceleration using embedded databases including&nbsp;DuckDB, SQLite,&nbsp;and&nbsp;Vortex-based&nbsp;Spice&nbsp;Cayenne. Frequently accessed data&nbsp;is materialized&nbsp;locally for&nbsp;millisecond queries.&nbsp;</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    "<p>This is critical for AI workloads:&nbsp;applications and&nbsp;agents making hundreds of queries per second&nbsp;can't&nbsp;wait for S3 round trips on every request.&nbsp;</p>"
  }
/>

<CoreBlock
  name="core-heading"
  content={
    '<h3 class="wp-block-heading h5"><strong><a href="https://spiceai.org/docs/features/search" target="_blank" rel="noreferrer noopener">Hybrid search&nbsp;across&nbsp;structured&nbsp;and unstructured&nbsp;data</a>&nbsp;</strong></h3>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Search&nbsp;is a foundational primitive for AI applications - RAG&nbsp;and agents&nbsp;rely on it&nbsp;to&nbsp;build high-quality, relevant&nbsp;context. But in&nbsp;traditional&nbsp;architectures, search lives in separate systems&nbsp;(Elasticsearch, Pinecone, etc.) with&nbsp;their&nbsp;own APIs,&nbsp;integrations, and copies of data.&nbsp;</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Spice takes an opinionated stance: search should&nbsp;use the same&nbsp;SQL&nbsp;interface as query, with indexes built off the&nbsp;same copy of data.&nbsp;</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Spice combines BM25 full-text search with vector similarity search and&nbsp;native&nbsp;re-ranking, enabling developers to&nbsp;execute&nbsp;hybrid&nbsp;search&nbsp;(vector and full-text search)&nbsp;from a single SQL query.&nbsp;Spice&nbsp;does the work to build&nbsp;partitioned&nbsp;data indexes, manage&nbsp;metadata for filtering, and&nbsp;parallelizes&nbsp;cross-index&nbsp;scatter-gather&nbsp;queries.&nbsp;</p>'
  }
/>

<CoreBlock
  name="core-heading"
  content={
    '<h3 class="wp-block-heading h5"><strong><a href="https://spiceai.org/docs/components/models" target="_blank" rel="noreferrer noopener">Serve AI&nbsp;models</a>&nbsp;</strong></h3>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    "<p>When you want to pipe query&nbsp;and search&nbsp;results into an LLM for analysis, classification, or generation, Spice provides built-in SQL functions for inference&nbsp;to&nbsp;models&nbsp;hosted on&nbsp;Bedrock, OpenAI, or&nbsp;self-hosted&nbsp;local models&nbsp;with full GPU-acceleration. Unlike alternative solutions, you&nbsp;don't&nbsp;need to wire&nbsp;external API calls,&nbsp;orchestration code, or copy data between systems.&nbsp;&nbsp;</p>"
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    "<p>You get S3's scale&nbsp;and cost efficiency&nbsp;without&nbsp;the&nbsp;distributed systems complexity in your application layer.&nbsp;</p>"
  }
/>

<CoreBlock
  name="core-image"
  content={
    '<figure class="wp-block-image size-large"><img src="/website-assets/media/2026/02/Architecting-High-Performance-AI-ready-Data-Pipelines-with-Spice-AI-on-AWS-1024x613.png" alt="The data and AI substrate for AWS applications: Spice provides federated SQL, acceleration, hybrid search, and LLM inference across DynamoDB, S3, S3 Vectors, S3 Tables, and more" class="wp-image-1928"/><figcaption class="wp-element-caption">Figure 2. The data and AI substrate for AWS applications: Spice provides federated SQL, acceleration, hybrid search, and LLM inference across DynamoDB, S3, S3 Vectors, S3 Tables, and more.</figcaption></figure>'
  }
/>

<CoreBlock
  name="core-heading"
  content={
    '<h2 class="wp-block-heading h3"><strong>Building&nbsp;an AI-driven&nbsp;search&nbsp;application&nbsp;with Spice and S3&nbsp;</strong></h2>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    "<p>Let's&nbsp;take this out of the abstract and into a real-world scenario.&nbsp;We're&nbsp;going to&nbsp;progressively&nbsp;improve&nbsp;the&nbsp;search&nbsp;experience&nbsp;for&nbsp;Apache Answer, the open-source&nbsp;Stack Overflow-style Q&amp;A application.&nbsp;&nbsp;</p>"
  }
/>

<CoreBlock
  name="core-image"
  content={
    '<figure class="wp-block-image size-full"><img src="/website-assets/media/2026/02/Apache-Answer-Screenshot-.png" alt="Apache Answer" class="wp-image-1929"/><figcaption class="wp-element-caption">Figure 3. Apache Answer interface </figcaption></figure>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    "<p>By the end of this&nbsp;walk-though,&nbsp;we'll&nbsp;have:&nbsp;</p>"
  }
/>

<CoreBlock
  name="core-list"
  content={
    '<ul class="wp-block-list"><li><strong><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-black-color">Real-time ingestion</mark></strong> from <a href="https://spiceai.org/docs/components/data-connectors/kafka">Kafka streaming</a> into S3 Tables (structured data) and S3 Vectors (embeddings) so that queries and searches are real-time and accurate  </li></ul>'
  }
/>

<CoreBlock
  name="core-list"
  content={
    '<ul class="wp-block-list"><li><strong><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-black-color">Federated queries</mark></strong>&nbsp;that join S3 data with live data in Aurora&nbsp;and&nbsp;DynamoDB with zero ETL&nbsp;</li></ul>'
  }
/>

<CoreBlock
  name="core-list"
  content={
    '<ul class="wp-block-list"><li><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-black-color"><strong>Hybrid search</strong> </mark>combining BM25 keyword matching with semantic vector search, re-ranked with Reciprocal Rank Fusion (RRF) </li></ul>'
  }
/>

<CoreBlock
  name="core-list"
  content={
    '<ul class="wp-block-list"><li><strong><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-black-color">Sub-50ms query latency</mark></strong>&nbsp;with built-in caching using&nbsp;DuckDB&nbsp;and&nbsp;the&nbsp;<a href="/blog/introducing-spice-cayenne-data-accelerator" target="_blank" rel="noreferrer noopener">Spice Cayenne</a>&nbsp;acceleration engine.&nbsp;</li></ul>'
  }
/>

<CoreBlock
  name="core-list"
  content={
    '<ul class="wp-block-list"><li><strong><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-black-color">AI analysis</mark></strong>&nbsp;where&nbsp;search results&nbsp;are piped&nbsp;directly into LLMs via SQL for classification, summarization, and generation&nbsp;</li></ul>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>The entire implementation is&nbsp;less than 100 lines of&nbsp;declarative&nbsp;YAML configuration -&nbsp;eliminating&nbsp;custom application code, orchestration, and the need&nbsp;to copy data.&nbsp;</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    "<p><em>This architecture is inspired by&nbsp;Spice&nbsp;AI's&nbsp;Founder and CEO,&nbsp;Luke Kim's&nbsp;Talk at&nbsp;re:Invent&nbsp;2025. You can watch the full end-to-end demo in under 10 minutes here:</em>&nbsp;</p>"
  }
/>

<PostVideo
  fields={{
    thumbnail: false,
    type: 'youtube',
    video_id: 'KuWI0yDOnIU',
    video_title:
      'AWS re:Invent 2025 - How Spice AI operationalizes data lakes for AI using Amazon S3 (STG364)',
    video_upload_date: '2025-12-04T20:46:01-08:00',
    video_channel: 'AWS Events',
    video_description:
      'AWS re:Invent 2025 session on how Spice AI operationalizes Amazon S3 data lakes for AI, with a live Amazon S3 Vectors demo.',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<CoreBlock
  name="core-heading"
  content={
    '<h3 class="wp-block-heading h4"><strong>The baseline&nbsp;&nbsp;</strong></h3>'
  }
/>

<CoreBlock
  name="core-image"
  content={
    '<figure class="wp-block-image size-large"><img src="/website-assets/media/2026/02/Apache-Answer-Keyword-Results-1024x467.png" alt="Native search alternates between 20,000 results and sometimes nothing at all" class="wp-image-1930"/><figcaption class="wp-element-caption">Figure 4. Native search alternates between 20,000 results and sometimes nothing at all!</figcaption></figure>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Let\'s&nbsp;start with the&nbsp;Apache Answer default and often the&nbsp;baseline&nbsp;for applications&nbsp;- good, old-fashioned&nbsp;string matching&nbsp;in PostgreSQL.&nbsp;When you search&nbsp;in Apache Answer&nbsp;for something like "MySQL connection error",&nbsp;you\'re&nbsp;waiting several seconds for&nbsp;20,000 results&nbsp;-&nbsp;most of&nbsp;which are&nbsp;completely irrelevant. Sometimes the query just times out and returns nothing at all.&nbsp;This is&nbsp;a common outcome&nbsp;when your search is just matching keywords in a database with no understanding of semantic meaning or ability to distinguish between a question about MySQL connection errors,&nbsp;and a random post that happens to mention those words in passing.&nbsp;</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={"<p>Let's&nbsp;see how we can improve this.&nbsp;</p>"}
/>

<CoreBlock
  name="core-heading"
  content={
    '<h3 class="wp-block-heading h4"><strong>The&nbsp;architecture</strong>&nbsp;</h3>'
  }
/>

<CoreBlock
  name="core-image"
  content={
    '<figure class="wp-block-image size-large"><img src="/website-assets/media/2026/02/Spice-Answer-Agent-Architecture-1024x664.png" alt="Spice Answer Agent Architecture" class="wp-image-1931"/><figcaption class="wp-element-caption">Figure 5. The Apache Answer Agent architecture with Spice and S3</figcaption></figure>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>First, to enable real-time indexing,&nbsp;questions and answers&nbsp;are streamed&nbsp;via&nbsp;Debezium&nbsp;CDC&nbsp;through&nbsp;Kafka. Spice ingests that stream and simultaneously&nbsp;indexes the content for&nbsp;<a href="https://spiceai.org/docs/features/search/full-text" target="_blank" rel="noreferrer noopener">BM25 full-text search</a>, generates vector embeddings using&nbsp;<a href="https://docs.aws.amazon.com/bedrock/latest/userguide/titan-models.html" target="_blank" rel="noreferrer noopener">Amazon Titan</a>, and&nbsp;materialized&nbsp;data locally in&nbsp;DuckDB.&nbsp;</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    "<p>Structured data&nbsp;(e.g.&nbsp;question IDs, timestamps, tags)&nbsp;is then written to&nbsp;S3 Tables where&nbsp;it's&nbsp;queryable&nbsp;as Iceberg tables.&nbsp;Embeddings&nbsp;are stored in&nbsp;S3 Vectors,&nbsp;automatically&nbsp;partitioned by date into separate indexes with filterable metadata. When&nbsp;a user&nbsp;searches,&nbsp;Apache Answer queries&nbsp;Spice with SQL, so no new API integration is&nbsp;required. Spice&nbsp;serves queries from the&nbsp;local&nbsp;acceleration,&nbsp;scatter-gather queries&nbsp;S3 Vectors&nbsp;across multiple&nbsp;partitioned&nbsp;indexes, combines full-text and vector results, and returns a re-ranked result set.&nbsp;</p>"
  }
/>

<CoreBlock
  name="core-heading"
  content={
    '<h4 class="wp-block-heading h5"><strong><em>Step 1: Configure Spice&nbsp;</em>&nbsp;</strong></h4>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Here\'s&nbsp;the configuration for everything just described&nbsp;in&nbsp;a single YAML file (what we call a <a href="https://spiceai.org/docs/getting-started/spicepods">Spicepod</a>).&nbsp;</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Historic questions are stored in an&nbsp;S3 bucket&nbsp;with&nbsp;<a href="https://spiceai.org/docs/components/data-accelerators/duckdb" target="_blank" rel="noreferrer noopener">DuckDB acceleration</a>,&nbsp;and&nbsp;new&nbsp;records are incrementally&nbsp;added as&nbsp;they arrive:&nbsp;</p>'
  }
/>

<CoreBlock
  name="core-image"
  content={
    '<figure class="wp-block-image size-full"><img src="/website-assets/media/2026/02/Acceleration-Spicepod.png" alt="Acceleration Spicepod" class="wp-image-1932"/><figcaption class="wp-element-caption">Figure 6: Acceleration configuration</figcaption></figure>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>&nbsp;Spice\'s&nbsp;<a href="https://spiceai.org/docs/components/catalogs/glue" target="_blank" rel="noreferrer noopener">AWS&nbsp;Glue catalog&nbsp;connector</a>&nbsp;sets up S3 Tables for the structured data:</p>'
  }
/>

<CoreBlock
  name="core-image"
  content={
    '<figure class="wp-block-image size-large"><img src="/website-assets/media/2026/02/S3-Glue-Screenshot-1024x900.png" alt="AWS Glue configuration in Spice" class="wp-image-1933"/><figcaption class="wp-element-caption">Figure 7. AWS Glue configuration in Spice</figcaption></figure>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p><a href="https://aws.amazon.com/s3/features/vectors/" target="_blank" rel="noreferrer noopener">S3 Vectors</a> is used as the vector search engine with the answer text vectorized with the Bedrock hosted Amazon Titan model. The <code>partition_by</code> setting ensures data is striped across multiple indexes, and ingestion and time-based queries are incredibly fast. Metadata fields get pushed down into S3 Vectors, so users can filter by tags or date ranges without scanning every vector:</p>'
  }
/>

<CoreBlock
  name="core-image"
  content={
    '<figure class="wp-block-image size-large"><img src="/website-assets/media/2026/02/S3-Vectors-Configuration-1024x900.png" alt="S3 Vectors Configuration" class="wp-image-1934"/><figcaption class="wp-element-caption">Figure 8. Amazon S3 Vectors configuration in Spice</figcaption></figure>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>The BM25&nbsp;search&nbsp;index configuration is even simpler; you&nbsp;just specify which columns to index for full-text search:</p>'
  }
/>

<CoreBlock
  name="core-image"
  content={
    '<figure class="wp-block-image size-large"><img src="/website-assets/media/2026/02/BM25-full-text-search-config-1024x900.png" alt="BM25 Full Text Search Config" class="wp-image-1935"/><figcaption class="wp-element-caption">Figure 9. Full-text search configuration in Spice</figcaption></figure>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    "<p>And finally,&nbsp;we're&nbsp;configuring&nbsp;Bedrock&nbsp;models&nbsp;so&nbsp;query and search results can be analyzed&nbsp;directly from SQL queries:</p>"
  }
/>

<CoreBlock
  name="core-image"
  content={
    '<figure class="wp-block-image size-full"><img src="/website-assets/media/2026/02/Bedrock-configuration.png" alt="Bedrock Configuration" class="wp-image-1936"/><figcaption class="wp-element-caption">Figure 10: Amazon Bedrock configuration in Spice</figcaption></figure>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Spice handles&nbsp;the complete end-to-end, from&nbsp;streaming ingestion from Kafka, partitioning data into the right indexes, generating embeddings, managing caches, and&nbsp;accessing&nbsp;everything through SQL.&nbsp;&nbsp;</p>'
  }
/>

<CoreBlock
  name="core-heading"
  content={
    '<h4 class="wp-block-heading h5"><strong>Step 2: Real-time data ingestion </strong></h4>'
  }
/>

<CoreBlock
  name="core-image"
  content={
    '<figure class="wp-block-image size-large"><img src="/website-assets/media/2026/02/Spice-Debezium-and-Kafka-1024x576.png" alt="Spice Debezium and Kafka" class="wp-image-1937"/><figcaption class="wp-element-caption">Figure 11. Streaming architecture with Kafka and Debezium</figcaption></figure>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    "<p>Now&nbsp;that&nbsp;the configuration&nbsp;is&nbsp;in place,&nbsp;we're&nbsp;ready to&nbsp;run Spice.&nbsp;Questions and answers&nbsp;begin&nbsp;streaming into the application through Kafka,&nbsp;which&nbsp;Spice&nbsp;processes&nbsp;in real-time. For each incoming record,&nbsp;it's&nbsp;generating embeddings using Titan, indexing the content for BM25 search, partitioning and sharding&nbsp;the records&nbsp;based on timestamp, and pushing filterable metadata like tags and creation date into S3 Vectors.&nbsp;</p>"
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>While data is streaming in, you can query it live in the&nbsp;Spice Cloud&nbsp;Playground, where the record count ticks up in real-time as data flows through the system.&nbsp;</p>'
  }
/>

<CoreBlock
  name="core-image"
  content={
    '<figure class="wp-block-image size-large"><img src="/website-assets/media/2026/02/Kafka-Screenshot-1024x320.png" alt="Ingesting real-time data with Kafka" class="wp-image-1961"/><figcaption class="wp-element-caption">Figure 12. Ingesting real-time data with Kafka </figcaption></figure>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>That&nbsp;<code>LIKE</code>&nbsp;query&nbsp;returned&nbsp;in under 100 milliseconds,&nbsp;searching across a&nbsp;quarter&nbsp;million records&nbsp;already ingested&nbsp;and&nbsp;arriving in real-time. This is the power of the&nbsp;<a href="https://spiceai.org/docs/features/caching" target="_blank" rel="noreferrer noopener">tiered caching</a>;&nbsp;frequently&nbsp;accessed queries hit&nbsp;the&nbsp;DuckDB&nbsp;acceleration&nbsp;locally instead of making round trips to S3.&nbsp;</p>'
  }
/>

<CoreBlock
  name="core-heading"
  content={
    '<h4 class="wp-block-heading h5"><strong>Step 3: Federate across multiple data sources&nbsp;</strong></h4>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    "<p>Spice&nbsp;doesn't&nbsp;just work with S3 but&nbsp;can&nbsp;federate queries across any data source in your stack. That means you can write a single SQL query that joins S3 data with data in Aurora&nbsp;and&nbsp;combines historical logs with real-time metrics from DynamoDB.&nbsp;</p>"
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Spice&nbsp;pushes down queries&nbsp;from both sources, executes&nbsp;the join, and&nbsp;returnes&nbsp;unified results.&nbsp;</p>'
  }
/>

<CoreBlock
  name="core-heading"
  content={
    '<h4 class="wp-block-heading h5"><strong>Step 4: Full-text search with BM25</strong> </h4>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    "<p>Now,&nbsp;let's&nbsp;improve search results with&nbsp;full-text search&nbsp;for keyword matching and&nbsp;identifying&nbsp;specific terms. Spice provides a&nbsp;<code>text_search</code>&nbsp;function that&nbsp;hits the BM25 index we configured earlier directly (avoiding a full table scan),&nbsp;so if&nbsp;someone is searching for a specific error code or technical term,&nbsp;it will also&nbsp;be included&nbsp;and ranked in the results based on relevance:</p>"
  }
/>

<CoreBlock
  name="core-image"
  content={
    '<figure class="wp-block-image size-large"><img src="/website-assets/media/2026/02/Text-search-screenshot-1024x404.png" alt="Text Search" class="wp-image-1962"/><figcaption class="wp-element-caption">Figure 13. Full-text search in Spice </figcaption></figure>'
  }
/>

<CoreBlock
  name="core-heading"
  content={
    '<h4 class="wp-block-heading h5"><strong>Step 4: Semantic search with S3 Vectors </strong></h4>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    "<p>We'll&nbsp;now&nbsp;add semantic understanding with vector search. The syntax looks almost identical:&nbsp;</p>"
  }
/>

<CoreBlock
  name="core-image"
  content={
    '<figure class="wp-block-image size-large"><img src="/website-assets/media/2026/02/Vector-search-screenshot-1024x399.png" alt="Vector Search" class="wp-image-1963"/><figcaption class="wp-element-caption">Figure 14. Vector search in Spice </figcaption></figure>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    "<p>Behind that simple&nbsp;<code>vector_search</code>&nbsp;SQL function&nbsp;is a lot of power. Spice&nbsp;automatically vectorizes the&nbsp;query text&nbsp;using the&nbsp;same&nbsp;Titan model we configured earlier. Then it searches across multiple daily indexes in S3 Vectors&nbsp;and combines the results.&nbsp;We're&nbsp;partitioning by date, so there might be dozens of indexes involved. It applies metadata filters to narrow down the search&nbsp;space,&nbsp;scatter-gather&nbsp;executes the similarity searches in parallel, merges the results, and returns the top-k most similar answers.&nbsp;</p>"
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    "<p>You can&nbsp;see exactly&nbsp;what's&nbsp;happening,&nbsp;by running&nbsp;an&nbsp;<code>EXPLAIN</code>&nbsp;query:&nbsp;</p>"
  }
/>

<CoreBlock
  name="core-image"
  content={
    '<figure class="wp-block-image size-large"><img src="/website-assets/media/2026/02/Explain-plan-screenshot-2-1024x595.png" alt="Query explain plan" class="wp-image-1966"/><figcaption class="wp-element-caption">Figure 15. Explain plan </figcaption></figure>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>The query plan shows multiple parallel queries to S3 Vectors. Each box in the visualization&nbsp;represents&nbsp;a separate index being searched.&nbsp;Spice automatically&nbsp;shards the query across all relevant daily indexes, executes them in parallel, merges and ranks the results, and returns a unified result set.&nbsp;</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    "<p>This is the kind of thing&nbsp;you'd&nbsp;normally need to build yourself&nbsp;-&nbsp;writing code to manage index metadata, parallel&nbsp;scatter-gather&nbsp;searches, handle failures and retries, merge results with proper ranking.&nbsp;With Spice,&nbsp;you get it out of the box.&nbsp;</p>"
  }
/>

<CoreBlock
  name="core-heading"
  content={
    '<h4 class="wp-block-heading h5"><strong>Step 5: Hybrid search (BM25 + vector) </strong></h4>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Full-text search and vector search&nbsp;combined provide higher relevance search results.&nbsp;Full-text-search&nbsp;excels at catching exact technical terms and keywords. If someone searches for "error code 1045" you want that exact match. Vector search understands semantic similarity;&nbsp;someone searching for "database connection problems" should find answers about "DB connectivity issues".&nbsp;</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p><a href="/platform/hybrid-sql-search" target="_blank" rel="noreferrer noopener">Hybrid search</a>&nbsp;combines both modalities.&nbsp;Here\'s&nbsp;how to do that with Spice:&nbsp;</p>'
  }
/>

<CoreBlock
  name="core-image"
  content={
    '<figure class="wp-block-image size-large"><img src="/website-assets/media/2026/02/Hybrid-Search-with-Caption-1024x296.png" alt="Hybrid Search with Caption" class="wp-image-1946"/><figcaption class="wp-element-caption">Figure 16. Spice hybrid search</figcaption></figure>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>This query runs both searches in parallel, ranks each result set, then uses&nbsp;Reciprocal Rank Fusion&nbsp;(RRF)&nbsp;to combine them into a single ranking&nbsp;(for a more in-depth explainer on RRF,&nbsp;<a href="https://spiceai.org/docs/reference/sql/search#reciprocal-rank-fusion-rrf" target="_blank" rel="noreferrer noopener">visit the docs</a>).&nbsp;</p>'
  }
/>

<CoreBlock
  name="core-heading"
  content={
    '<h4 class="wp-block-heading h5"><strong>Step 6: Feed&nbsp;results into AI for&nbsp;analysis</strong>&nbsp;</h4>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Now that&nbsp;we\'ve&nbsp;got high-quality search results, we can pipe them directly into an LLM for&nbsp;deeper&nbsp;analysis. Spice provides&nbsp;an&nbsp;<a href="https://spiceai.org/docs/reference/sql/ai" target="_blank" rel="noreferrer noopener">ai() function</a>&nbsp;that makes this trivial:</p>'
  }
/>

<CoreBlock
  name="core-image"
  content={
    '<figure class="wp-block-image size-large"><img src="/website-assets/media/2026/02/AI-SQL-Function-2-1024x296.png" alt="Spice ai() SQL function example" class="wp-image-1947"/><figcaption class="wp-element-caption">Figure 17. Spice ai() function.</figcaption></figure>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>This query&nbsp;pipes the&nbsp;top 10&nbsp;search&nbsp;results&nbsp;to&nbsp;Amazon Nova&nbsp;to&nbsp;extract&nbsp;the main technology keywords. The results come back right in the SQL result set:&nbsp;</p>'
  }
/>

<CoreBlock
  name="core-image"
  content={
    '<figure class="wp-block-image size-large"><img src="/website-assets/media/2026/02/S3-results-set-1024x139.png" alt="S3 query result set" class="wp-image-1945"/><figcaption class="wp-element-caption">Figure 18. AI query results </figcaption></figure>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>From this simple example, you can extrapolate some pretty interesting use cases that can be enabled&nbsp;with this pattern:&nbsp;</p>'
  }
/>

<CoreBlock
  name="core-list"
  content={
    '<ol start="1" class="wp-block-list"><li>Run sentiment analysis on customer feedback at&nbsp;scale. For example,&nbsp;search for&nbsp;complaints about a specific product feature and analyze the emotional tone.&nbsp;&nbsp;</li></ol>'
  }
/>

<CoreBlock
  name="core-list"
  content={
    '<ol start="2" class="wp-block-list"><li>Identify&nbsp;security threats in logs by searching for suspicious patterns and using an LLM to assess severity, a common pattern in <a href="/industry/cybersecurity">cybersecurity applications</a>.&nbsp;&nbsp;</li></ol>'
  }
/>

<CoreBlock
  name="core-list"
  content={
    '<ol start="3" class="wp-block-list"><li>Detect&nbsp;fraud by finding similar transaction patterns and asking an AI to explain why&nbsp;they\'re&nbsp;anomalous, automatically&nbsp;tagging&nbsp;and categorizing&nbsp;content by extracting themes and topics.&nbsp;</li></ol>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    "<p>This is powerful - we went&nbsp;from raw data&nbsp;to&nbsp;AI-generated insights in&nbsp;just&nbsp;three SQL queries.&nbsp;And&nbsp;without an&nbsp;API integration to&nbsp;maintain,&nbsp;ETL'ing&nbsp;data,&nbsp;or custom&nbsp;orchestration code.&nbsp;&nbsp;</p>"
  }
/>

<CoreBlock
  name="core-heading"
  content={
    '<h3 class="wp-block-heading h4"><strong>The&nbsp;results: Before and&nbsp;after&nbsp;</strong></h3>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    "<p>Let's step back and look at what we actually accomplished.&nbsp;We started with a Q&amp;A application that had fundamentally broken&nbsp;PostgreSQL&nbsp;search: slow&nbsp;2-3 second&nbsp;queries,&nbsp;20,000&nbsp;irrelevant results, no semantic understanding, and no ability to handle streaming data.&nbsp;&nbsp;</p>"
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>After implementing Spice with S3 Tables and S3 Vectors,&nbsp;we returned&nbsp;20 highly relevant results. The results are dramatically better. Instead of 20,000 irrelevant results, we get 20 highly relevant answers that combine the precision of keyword matching with the semantic understanding of vector search:</p>'
  }
/>

<CoreBlock
  name="core-image"
  content={
    '<figure class="wp-block-image size-large"><img src="/website-assets/media/2026/02/Enhanced-search-results-1024x466.png" alt="A short list of relevant, high quality results, trimmed down from the 20,000 baseline" class="wp-image-1943"/><figcaption class="wp-element-caption">Figure 18. A short list of relevant, high quality results, trimmed down from the 20,000 baseline. </figcaption></figure>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={'<p>This solution incorporated: </p>'}
/>

<CoreBlock
  name="core-list"
  content={
    '<ol start="1" class="wp-block-list"><li>250,000+ records streaming in real-time while&nbsp;maintaining&nbsp;query performance.&nbsp;&nbsp;</li></ol>'
  }
/>

<CoreBlock
  name="core-list"
  content={
    '<ol start="2" class="wp-block-list"><li>Queries federated&nbsp;across multiple data sources joining&nbsp;user data&nbsp;and&nbsp;other&nbsp;context.&nbsp;</li></ol>'
  }
/>

<CoreBlock
  name="core-list"
  content={
    '<ol start="3" class="wp-block-list"><li>Semantic&nbsp;vector&nbsp;search alongside keyword matching for better accuracy.&nbsp;</li></ol>'
  }
/>

<CoreBlock
  name="core-list"
  content={
    '<ol start="4" class="wp-block-list"><li>Search results&nbsp;piped&nbsp;directly into AI models for analysis.&nbsp;</li></ol>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    "<p>The difference in user experience is night and day, yet&nbsp;we built this entire system&nbsp;with minimal&nbsp;YAML configuration and SQL queries.&nbsp;Instead of&nbsp;spending weeks building&nbsp;distributed systems and&nbsp;infrastructure,&nbsp;you're&nbsp;defining your configuration&nbsp;and&nbsp;immediately&nbsp;querying data, running searches, and integrating AI into your application, turning your data lake into an AI-ready platform.&nbsp;</p>"
  }
/>

<CoreBlock
  name="core-heading"
  content={
    '<h3 class="wp-block-heading h4"><strong>Next&nbsp;steps</strong>&nbsp;</h3>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>If you want to try this yourself,&nbsp;star&nbsp;the&nbsp;<a href="https://github.com/spiceai/spiceai" target="_blank" rel="noreferrer noopener">GitHub repo</a>&nbsp;and explore the&nbsp;Spice.ai&nbsp;<a href="/cookbook" target="_blank" rel="noreferrer noopener">recipes</a>. There are recipes for common patterns like hybrid search, S3 Vectors integration, and RAG workflows.&nbsp;</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>The&nbsp;<a href="https://spiceai.org/docs" target="_blank" rel="noreferrer noopener">Spice&nbsp;documentation</a>&nbsp;has a&nbsp;<a href="https://spiceai.org/docs/getting-started" target="_blank" rel="noreferrer noopener">quickstart guide</a>&nbsp;that walks through setting up your first Spice deployment and running queries.&nbsp;Learn more about how to&nbsp;get started with&nbsp;Spice and S3 Vectors in&nbsp;the&nbsp;<a href="/blog/getting-started-with-amazon-s3-vectors-and-spice" target="_blank" rel="noreferrer noopener">launch blog</a>, or&nbsp;the&nbsp;\'<a href="https://aws.amazon.com/blogs/storage/architecting-high-performance-ai-driven-data-applications-with-spice-ai-and-aws/" target="_blank" rel="noreferrer noopener">Architecting high-performance AI-driven data applications with Spice and AWS\'</a>&nbsp;tutorial&nbsp;hosted on the AWS Storage Blog.&nbsp;&nbsp;</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>If&nbsp;you\'re&nbsp;building AI applications with S3 and want to talk through your specific use case,&nbsp;join us on the&nbsp;<a href="https://d5qr3f04.na1.hubspotlinks.com/Ctc/L2+113/d5qR3f04/VWpP8-5gcBnXN2V0yPldN_hyW99f7mw5JXWJkN2v9B1n5nXHCW5BWr2F6lZ3m-W1JyPcK5qWqrBW7Hy8F632CKwDW5mDGlB2bfPfkW8MK0sk6jgM_9VmvSg617BXSpN7Lfn_0CtRt8W7SMDrP1SCRjsW3qvGZz8_xv1mVrh96T2Zs6xKW3C3NnH4YPTTQN1vXvY99l4TtW7m_QZ71-MpgTW8_9pfR6h0q4WW5_2Pd94MGJWFN49P46vsK22jW857BPK5M3NdGW8x0Q05731GGFW8Hc4-35RZVmPW1Y0w6k4jX0twW4yYtgM5QZK7DW2BlR3J2f157lMBfl4kgTDTHVv03D919nP3kW22LJ_s6KWYDWN5N5DxN4X42tW2mc9jS2H_wzJW6n3qKb8RsRkgW3z5R3t6k7GWfW497q1T3HgftNW7vT4nB66JzXHW8By9253VDR9WW8BPkq-7mLqHKW4J9pjl1HD7dpW6_sdqc1yq9ndf25-NxH04" target="_blank" rel="noreferrer noopener">Spice Community Slack</a>.&nbsp;We\'d&nbsp;love to hear what&nbsp;you\'re&nbsp;working on.&nbsp;&nbsp;</p>'
  }
/>

## Frequently Asked Questions

### What does it mean to operationalize Amazon S3 for AI?

Operationalizing S3 for AI means adding a runtime layer that turns object storage into a queryable, low-latency data platform for AI applications. S3 stores data durably and cheaply, but it lacks the query execution, acceleration, and vector search capabilities that AI workloads require. Spice bridges this gap by federating queries across [S3 Tables](/blog/getting-started-with-amazon-s3-vectors-and-spice), S3 Vectors, and structured data sources in a single SQL interface.

### Can S3 be used as a vector database for AI applications?

Yes, with [Amazon S3 Vectors](https://aws.amazon.com/s3/features/vectors/), S3 can store and retrieve vector embeddings at scale. Spice integrates S3 Vectors as a native data source, enabling [hybrid search](/platform/hybrid-sql-search) that combines vector similarity with full-text and keyword search in a single SQL query, without a separate vector database.

### How does Spice accelerate queries on S3 data?

Spice materializes frequently accessed S3 datasets into local accelerator engines like Arrow, DuckDB, or [Cayenne](/blog/introducing-spice-cayenne-data-accelerator). This reduces query latency from seconds (raw S3 reads) to sub-millisecond responses, while the source data remains in S3. Refresh policies keep accelerated data current without manual ETL.

### What is the difference between S3 Tables and traditional S3 storage for analytics?

S3 Tables provides managed Apache Iceberg table support directly in S3, adding ACID transactions, schema evolution, and partition pruning to object storage. Traditional S3 stores flat files (Parquet, CSV) without table-level semantics. S3 Tables eliminates the need for a separate catalog service and simplifies [data lake acceleration](/use-case/datalake-accelerator) workflows.

To operationalize your own S3 data with Spice, review [Spice Cloud pricing](/pricing) or [get a demo](/get-a-demo).

<ContentResourceFeatured
  fields={{
    heading: 'Explore more Spice resources',
    paragraph:
      'Tutorials, docs, and blog posts to help you go deeper with Spice.',
    mode: 'related',
    resources: false,
    padding_top: 'unset',
    padding_bottom: 'unset',
    related_posts: [
      {
        title: 'Real-Time Hybrid Search Using RRF: A Hands-On Guide with Spice',
        slug: '/blog/real-time-hybrid-search-using-rrf',
        excerpt:
          'Surfacing relevant answers to searches across datasets has historically meant navigating significant tradeoffs.&nbsp;Keyword (or lexical) search&nbsp;is fast, cheap, and commoditized, but limited by the constraints of exact matching.&nbsp;Vector (or semantic) search&nbsp;captures nuance and intent, but can be slower, harder to debug, and expensive to run at scale. Combining both usually entails standing up multiple engines [&hellip;]',
        image:
          '/website-assets/media/2025/11/68fa4fdfded26b3b6472a172_image-8.png',
        type: 'Blog',
        taxonomy: ['Search', 'Spice AI'],
      },
      {
        title: 'Getting started with Amazon S3 Vectors and Spice',
        slug: '/blog/getting-started-with-amazon-s3-vectors-and-spice',
        excerpt:
          "This post explores how S3 Vectors integrates into Spice's unified data, search, and AI-inference engine-managing\nembedding generation, index lifecycle, metadata filtering, and hybrid search entirely through SQL. We'll cover how Spice combines vector similarity, full-text BM25, and SQL queries in a single runtime, eliminating the need for separate vector databases. ",
        image: '/website-assets/media/2025/07/AWS-Spice.png',
        type: 'Blog',
        taxonomy: ['Search', 'Spice AI', 'Spice Cloud Platform', 'Spice OSS'],
      },
    ],
  }}
/>

<TalkToAnEngineerCta />

<ContentRichText
  fields={{
    coverage: 'rc-end',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<CoreBlock name="core-paragraph" content={'<p></p>'} />

---

## Real-Time Control Plane Acceleration with DynamoDB Streams 
URL: https://spice.ai/blog/real-time-acceleration-with-dynamodb-streams
Date: 2026-01-22T19:42:03
Description: How to sync DynamoDB data to thousands of nodes with sub-second latency using a two-tier architecture with DynamoDB Streams and Spice acceleration.

<ContentRichText
  fields={{
    coverage: 'rc-start',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p><strong><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-black-color">TL;DR:</mark></strong> A global cloud communications company needed to sync their DynamoDB configuration to thousands of nodes with sub-second latency. Their multi-tier caching setup was creating cold start penalties, tight coupling, and TTL tuning overhead. The solution was a two-tier architecture using <strong><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-black-color">DynamoDB Streams</mark></strong> and <strong><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-black-color">Spice data acceleration</mark></strong> that eliminated cache complexity and delivered sub-second propagation. </p>'
  }
/>

<CoreBlock
  name="core-heading"
  content={
    '<h2 class="wp-block-heading h3"><strong>The challenge: Decoupling the data plane from an OLTP app</strong></h2>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>A global cloud communications company came to us with a deceptively hard problem. They were building a new data processing platform with a clear separation between control and data planes: </p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-black-color"><strong>Control plane</strong>:</mark> An OLTP application backed by DynamoDB where customers configure their data pipelines (a single-table design holding all configuration data).</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-black-color"><strong>Data plane</strong>: </mark>Thousands of processing nodes needing access to this configuration with single-digit millisecond latency. When customers update configurations, changes must reflect in the pipeline within seconds.&nbsp;</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Their initial approach used multi-tiered caching: each data plane node ran a daemon with an in-memory LRU cache backed by DAX and DynamoDB. This led to three problems:&nbsp;</p>'
  }
/>

<CoreBlock
  name="core-list"
  content={
    '<ul class="wp-block-list"><li><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-black-color"><strong>Cold start penalty</strong>:</mark> Cache misses required network traversal to DAX or DynamoDB, adding latency&nbsp;</li></ul>'
  }
/>

<CoreBlock
  name="core-list"
  content={
    '<ul class="wp-block-list"><li><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-black-color"><strong>Tight coupling</strong>:</mark> Data plane nodes directly coupled to the OLTP database-cache misses meant queries hitting DynamoDB&nbsp;</li></ul>'
  }
/>

<CoreBlock
  name="core-list"
  content={
    '<ul class="wp-block-list"><li><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-black-color"><strong>TTL tuning overhead</strong>:</mark> Constant balancing between keeping hot data local and propagating changes quickly&nbsp;</li></ul>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>What they really wanted&nbsp;was to&nbsp;<strong><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-black-color">decouple the data plane entirely from DynamoDB</mark></strong>&nbsp;by accelerating the complete dataset locally on each node instead of falling back to the source on cache miss.&nbsp;</p>'
  }
/>

<CoreBlock
  name="core-heading"
  content={
    '<h2 class="wp-block-heading h3"><strong>The solution: DynamoDB + local acceleration with Spice</strong>&nbsp;</h2>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>In this post,&nbsp;we\'ll&nbsp;walk through how&nbsp;<a href="https://spiceai.org/docs/components/data-connectors/dynamodb#streams" target="_blank" rel="noreferrer noopener">DynamoDB Streams&nbsp;and Spice</a>&nbsp;keep accelerated datasets&nbsp;in sync&nbsp;across thousands of nodes - illustrating a pattern applicable to many distributed systems where control plane data needs to be available at the edge with ultra-low latency.&nbsp;</p>'
  }
/>

<CoreBlock
  name="core-heading"
  content={
    '<h2 class="wp-block-heading h3"><strong>Introduction to Spice acceleration</strong></h2>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>First, let\'s cover how Spice makes this architecture possible. Spice is a unified query, search, and LLM inference platform that&nbsp;enables data-intensive applications and AI agents. Spice&nbsp;can be&nbsp;<a href="/feature/edge-to-cloud-deployments" target="_blank" rel="noreferrer noopener">deployed anywhere</a>&nbsp;-&nbsp;in the cloud,&nbsp;on-premises,&nbsp;at the edge, or next to your application as a sidecar&nbsp;- and&nbsp;accelerates&nbsp;data access for teams&nbsp;querying&nbsp;disparate data sources&nbsp;with ultra-low latency.&nbsp;&nbsp;</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Spice&nbsp;<a href="https://spiceai.org/docs/features/data-acceleration" target="_blank" rel="noreferrer noopener">data acceleration</a>&nbsp;materializes working sets from distributed data sources into local accelerator engines such as Arrow, SQLite,&nbsp;DuckDB,&nbsp;or&nbsp;<a href="/blog/introducing-spice-cayenne-data-accelerator" target="_blank" rel="noreferrer noopener">Spice&nbsp;Cayenne</a>&nbsp;for high-performance querying. By bringing&nbsp;frequently&nbsp;accessed data closer to compute, applications avoid repeated&nbsp;round-trips&nbsp;to source systems while achieving sub-second&nbsp;latency&nbsp;across operational and analytical workloads.&nbsp;</p>'
  }
/>

<CoreBlock
  name="core-image"
  content={
    '<figure class="wp-block-image size-large"><img src="/website-assets/media/2026/01/Spice-Acceleration-1024x692.png" alt="Spice Acceleration" class="wp-image-1890"/><figcaption class="wp-element-caption">Figure 1: Spice acceleration architecture</figcaption></figure>'
  }
/>

<CoreBlock
  name="core-heading"
  content={
    '<h2 class="wp-block-heading h3"><strong>The target architecture&nbsp;</strong></h2>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={"<p>The customer's key requirements included:</p>"}
/>

<CoreBlock
  name="core-list"
  content={
    '<ul class="wp-block-list"><li>Scale to&nbsp;<strong>thousands of data plane nodes</strong>&nbsp;&nbsp;</li></ul>'
  }
/>

<CoreBlock
  name="core-list"
  content={
    '<ul class="wp-block-list"><li><strong><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-black-color">Single-digit millisecond</mark></strong>&nbsp;read latency from local storage&nbsp;&nbsp;</li></ul>'
  }
/>

<CoreBlock
  name="core-list"
  content={
    '<ul class="wp-block-list"><li><strong><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-black-color">Sub-second replication</mark></strong>&nbsp;from DynamoDB to accelerated datasets&nbsp;</li></ul>'
  }
/>

<CoreBlock
  name="core-list"
  content={
    '<ul class="wp-block-list"><li>Support&nbsp;<strong><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-black-color">fast cold start</mark></strong>&nbsp;so new nodes receive data within seconds&nbsp;</li></ul>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    "<p>With Spice's acceleration capabilities in mind, we designed&nbsp;a two-tiered Spice architecture:&nbsp;</p>"
  }
/>

<CoreBlock
  name="core-image"
  content={
    '<figure class="wp-block-image size-large"><img src="/website-assets/media/2026/01/DynamoDB-Streams-2-1-1024x642.png" alt="Spice and DynamoDB Streams architecture" class="wp-image-1891"/><figcaption class="wp-element-caption">Figure 2: Spice + DynamoDB Streams architecture</figcaption></figure>'
  }
/>

<CoreBlock
  name="core-heading"
  content={
    '<h3 class="wp-block-heading h5"><strong>How it works:</strong>&nbsp;&nbsp;</h3>'
  }
/>

<CoreBlock
  name="core-list"
  content={
    '<ol start="1" class="wp-block-list"><li>The&nbsp;<mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-black-color"><strong>central Spice layer</strong>&nbsp;</mark>consumes DynamoDB Streams and&nbsp;maintains&nbsp;a near-real-time&nbsp;<a href="https://spiceai.org/docs/features/data-acceleration" target="_blank" rel="noreferrer noopener">accelerated dataset</a>&nbsp;</li></ol>'
  }
/>

<CoreBlock
  name="core-list"
  content={
    '<ol start="2" class="wp-block-list"><li>Each&nbsp;<strong><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-black-color">data plane node</mark></strong>&nbsp;runs a local Spice daemon with SQLite or&nbsp;DuckDB&nbsp;that&nbsp;syncs&nbsp;from the central layer<br></li><li>Data plane processes read from<strong>&nbsp;</strong>localhost - no&nbsp;network egress or coupling to DynamoDB&nbsp;</li></ol>'
  }
/>

<CoreBlock
  name="core-heading"
  content={
    '<h3 class="wp-block-heading h4"><strong>DynamoDB Streams vs Kinesis&nbsp;</strong></h3>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>DynamoDB offers two change capture options. We evaluated both:&nbsp;</p>'
  }
/>

<CoreBlock
  name="core-list"
  content={
    '<ol start="1" class="wp-block-list"><li><a href="https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Streams.html">DynamoDB Streams</a> provides&nbsp;exactly-once&nbsp;delivery with strict ordering within each shard. Records arrive in write order with no duplicates.&nbsp;</li></ol>'
  }
/>

<CoreBlock
  name="core-list"
  content={
    '<ol start="2" class="wp-block-list"><li><a href="https://docs.aws.amazon.com/streams/latest/dev/introduction.html" target="_blank" rel="noreferrer noopener">Kinesis Data Streams</a>&nbsp;orders records within each shard but delivers at-least-once, so duplicates are possible and require deduplication logic on every message.&nbsp;</li></ol>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    "<p>For keeping accelerated tables&nbsp;in sync,&nbsp;exactly-once&nbsp;delivery was decisive. We&nbsp;didn't&nbsp;want deduplication overhead, and the 24-hour retention is sufficient since we&nbsp;checkpoint continuously. The trade-offs-shorter retention and fewer consumers-were acceptable for this use case.&nbsp;</p>"
  }
/>

<CoreBlock
  name="core-heading"
  content={
    '<h3 class="wp-block-heading h4"><strong>Bootstrapping: The checkpoint-first approach&nbsp;</strong></h3>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>When connecting a DynamoDB table to Spice, we need to load current state before consuming changes. This is trickier than it sounds.&nbsp;</p>'
  }
/>

<CoreBlock
  name="core-heading"
  content={
    '<h4 class="wp-block-heading h5"><em><strong>The Problem with LATEST Iterators</strong></em>&nbsp;</h4>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>The naive approach is to get a LATEST iterator for each shard, scan the table, and start consuming. But DynamoDB Streams iterators expire after 15 minutes. If your table takes longer to scan, your iterators are gone.&nbsp;</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Buffering changes during scan has problems too. For high-throughput tables, you could exhaust memory. For idle streams, you might never receive a message to&nbsp;establish&nbsp;position.&nbsp;</p>'
  }
/>

<CoreBlock
  name="core-heading"
  content={
    '<h3 class="wp-block-heading h4"><strong>Our solution: Checkpoint first, scan second&nbsp;</strong></h3>'
  }
/>

<CoreBlock
  name="core-list"
  content={
    '<ol start="1" class="wp-block-list"><li>Create a checkpoint at the current stream position by walking all shards and recording their sequence numbers.&nbsp;</li></ol>'
  }
/>

<CoreBlock
  name="core-list"
  content={
    '<ol start="2" class="wp-block-list"><li>Scan the entire table and load all existing rows.&nbsp;</li></ol>'
  }
/>

<CoreBlock
  name="core-list"
  content={
    '<ol start="3" class="wp-block-list"><li>Subscribe using the checkpoint from step 1 and start consuming from the recorded position.&nbsp;</li></ol>'
  }
/>

```rust
let (should_bootstrap, checkpoint) =
    load_or_initialize_checkpoint(&dynamodb, &dataset_name).await?;

if should_bootstrap {
    let bootstrap_stream = Arc::clone(&dynamodb)
        .bootstrap_stream()
        .await
        .map(move |msg| {
            msg.map(|change_batch| {
                ChangeEnvelope::new(Box::new(NoOpCommitter), change_batch, false)
            })
        });
```

<CoreBlock
  name="core-paragraph"
  content={
    '<p>After bootstrap completes, we commit the checkpoint and start the changes stream:&nbsp;</p>'
  }
/>

```rust
bootstrap_stream
    .chain(
        stream::once(async move {
            let committer = DynamoDBStreamCommitter::new(checkpoint_cloned);
            if let Err(err) = committer.commit() {
                tracing::error!("Failed to commit bootstrap checkpoint: {:?}", err);
            }
            stream::empty()
        })
        .flatten()
    )
    .chain(changes_stream_from_checkpoint(&dynamodb, &checkpoint))
```

<CoreBlock
  name="core-heading"
  content={
    '<h3 class="wp-block-heading h4"><strong>The time travel trade-off&nbsp;</strong></h3>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>The checkpoint&nbsp;points to&nbsp;a moment before the scan completes. Some changes during the scan will&nbsp;replay&nbsp;afterward. The table can briefly go back in time-a row might&nbsp;update to&nbsp;an older value before catching up.&nbsp;</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    "<p>We mitigate this by not marking the dataset ready until stream lag drops below a threshold (default 2 seconds). Downstream consumers only see the dataset once&nbsp;it's&nbsp;caught up.&nbsp;</p>"
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    "<p>This approach works for any table regardless of size or throughput.&nbsp;There's&nbsp;no dependence on receiving messages within a window and no unbounded memory buffering.&nbsp;</p>"
  }
/>

<CoreBlock
  name="core-heading"
  content={
    '<h3 class="wp-block-heading h4"><strong>Cold start and snapshotting&nbsp;</strong></h3>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    "<p>For the customer's use case, cold start performance was critical. New data plane nodes need to spin up with data ready in seconds, not minutes.&nbsp;</p>"
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Our solution is to snapshot the accelerated dataset to object storage with the checkpoint embedded:&nbsp;</p>'
  }
/>

<CoreBlock
  name="core-image"
  content={
    '<figure class="wp-block-image size-full"><img src="/website-assets/media/2026/01/S3-and-DynamoDB-Streams.png" alt="Snapshot to S3" class="wp-image-1893"/><figcaption class="wp-element-caption">Figure 3: Snapshot to S3</figcaption></figure>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>When a new node starts, it downloads the latest snapshot from S3, reads the embedded watermark, and resumes the CDC stream from that position.&nbsp;</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>This gets nodes operational in seconds rather than re-scanning the entire source table. For a dataset of a few gigabytes, startup time drops from minutes to single-digit seconds.&nbsp;</p>'
  }
/>

<CoreBlock
  name="core-heading"
  content={
    '<h3 class="wp-block-heading h4"><strong>Shard management with a pure state machine&nbsp;</strong></h3>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>DynamoDB Streams organizes data into shards with parent-child relationships. You must fully process a parent before reading children to&nbsp;maintain&nbsp;ordering.&nbsp;</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={'<p>We modeled this as a state machine:&nbsp;</p>'}
/>

```rust
pub struct StreamState {
    active: HashMap<String, ActiveShard>,
    initializing: HashMap<String, InitializingShard>,
    blocked: HashMap<String, BlockedShard>,
    historical: HashMap<String, HistoricalShard>,
}
```

<CoreBlock
  name="core-paragraph"
  content={
    '<p>The key insight was to keep state transitions pure. All transitions happen through methods that take input and return results without external API calls:&nbsp;</p>'
  }
/>

```rust
pub fn handle_poll_result(
    &mut self,
    shard_id: &str,
    new_iterator: Option<String>,
    records: Vec<Record>,
) -> Result<ShardPollResult> {
    if let Some(iter) = new_iterator {
        self.active.get_mut(shard_id)?.update_iterator(iter);
    } else {
        self.active.remove(shard_id);
        self.promote_children(shard_id);
    }
}
```

<CoreBlock
  name="core-paragraph"
  content={
    "<p>When a shard exhausts, we promote its children from&nbsp;'blocked'&nbsp;to&nbsp;'initializing'. This separation means we can test every state transition without mocking AWS.&nbsp;</p>"
  }
/>

<CoreBlock
  name="core-heading"
  content={
    '<h3 class="wp-block-heading h4"><strong>Error handling: Transient vs fatal&nbsp;</strong></h3>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={'<p>Errors fall into two categories:&nbsp;</p>'}
/>

```rust
pub enum Error {
    // Permanent - require intervention
    TableNotFound,
    StreamNotFound,
    StreamBeyondRetention,

    // Retriable - resolve with retry
    Timeout,
    ConnectionFailure,
    Throttled,

    // Special handling
    IteratorExpired,
}
```

<CoreBlock
  name="core-paragraph"
  content={
    "<p>Iterator expiration needs special treatment. DynamoDB Streams iterators expire after 15 minutes of inactivity. You can't retry with the same iterator - you need a new one from your last checkpoint:</p>"
  }
/>

```rust
 if error.is_retriable() {
        tracing::warn!("Poll error for shard {}, will retry: {}", shard_id, error);
        Ok(())
    } else if matches!(error, Error::IteratorExpired) {
        tracing::warn!("Iterator expired for shard {}, reinitializing", shard_id);
        reinitialize_shard_with_checkpoint(shard_id);
        Ok(())
    } else {
        Err(error)
    }
}
```

<CoreBlock
  name="core-paragraph"
  content={
    '<p>For transient errors, exponential backoff with a 60-second cap prevents thundering herds while recovering quickly from brief network issues.</p>'
  }
/>

<CoreBlock
  name="core-heading"
  content={
    '<h3 class="wp-block-heading h4"><strong>Watermarks and dataset readiness&nbsp;</strong></h3>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    "<p>To track how far behind real-time we are, we use watermarks based on each record's approximate creation time. The&nbsp;minimum&nbsp;watermark across active shards&nbsp;indicates&nbsp;global progress.&nbsp;</p>"
  }
/>

```rust
fn combine_shard_batches(poll_results: &[ShardPollResult]) -> DynamoDBStreamBatch {
    let mut shard_watermarks = Vec::new();

    for shard_result in poll_results {
        let is_watermark_eligible = match &shard_result.outcome {
            PollOutcome::Records { .. } => true,
            PollOutcome::Failed => true,  // Failed shards represent unprocessed lag
            PollOutcome::Empty => false,  // Empty shards are caught up
        };

        if is_watermark_eligible {
            if let Some(watermark) = shard_result.current_watermark {
                shard_watermarks.push(watermark);
            }
        }
    }

    let watermark = shard_watermarks.into_iter().min()
        .unwrap_or_else(SystemTime::now);
 }
```

<CoreBlock
  name="core-paragraph"
  content={
    "<p>This watermark drives dataset readiness. A dataset is marked ready when lag drops below the&nbsp;threshold&nbsp;so downstream consumers&nbsp;don't&nbsp;see stale data during catch-up.&nbsp;</p>"
  }
/>

```rust
ChangeEnvelope::new(
    Box::new(committer),
    change_batch,
    lag.is_some_and(|l| l < acceptable_lag),  // Ready signal
)
```

<CoreBlock
  name="core-paragraph"
  content={
    "<p>For the customer's use case, this means data plane processes don't see the local dataset until it's within 2 seconds of real-time-no stale reads during catch-up.</p>"
  }
/>

<CoreBlock
  name="core-heading"
  content={
    '<h3 class="wp-block-heading h4"><strong>Checkpointing for reliability</strong></h3>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Checkpoints capture sequence number positions for each shard:</p>'
  }
/>

```rust
pub struct ShardCheckpoint {
    pub sequence_number: String,
    pub parent_id: Option<String>,
    pub updated_at: SystemTime,
    pub position: CheckpointPosition,
}

pub enum CheckpointPosition {
    At,    // Resume AT this sequence (inclusive) - not yet processed
    After, // Resume AFTER this sequence (exclusive) - already processed
}
```

<CoreBlock
  name="core-paragraph"
  content={
    '<p>On recovery, we&nbsp;resume from&nbsp;leaf shards only - those with no children in the checkpoint. Parents are already exhausted:&nbsp;</p>'
  }
/>

```rust
pub fn leaf_shards(&self) -> Vec<(&String, &ShardCheckpoint)> {
    let parent_ids: HashSet<&str> = self.shards.values()
        .filter_map(|sc| sc.parent_id.as_deref())
        .collect();

    self.shards.iter()
        .filter(|(shard_id, _)| !parent_ids.contains(shard_id.as_str()))
        .collect()
}
```

<CoreBlock
  name="core-paragraph"
  content={
    "<p>Checkpoints serialize as JSON to Spice's file-accelerated storage, enabling reliable resume after restarts.&nbsp;</p>"
  }
/>

<CoreBlock
  name="core-heading"
  content={
    '<h3 class="wp-block-heading h4"><strong>Scaling to thousands of nodes&nbsp;</strong></h3>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    "<p>With thousands of data plane nodes, having each node&nbsp;consume&nbsp;directly from DynamoDB Streams&nbsp;isn't&nbsp;realistic. The central Spice layer acts as a fan-out point.&nbsp;</p>"
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Edge nodes poll the central layer on a configurable interval using an append refresh strategy.&nbsp;This scales well - each edge node independently pulls updates without coordinating with others. Nodes can also filter to pull only relevant partitions, reducing data transfer for deployments where different node pools need different data&nbsp;subsets.&nbsp;&nbsp;</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    "<p>For the customer's use case, different teams had different requirements: one had fewer nodes but larger datasets, while the other had smaller datasets across more nodes. The pull-based architecture handles both patterns efficiently.&nbsp;</p>"
  }
/>

<CoreBlock
  name="core-heading"
  content={
    '<h3 class="wp-block-heading h4"><strong>Metrics and monitoring&nbsp;</strong></h3>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>DynamoDB Streams&nbsp;lacks&nbsp;built-in lag metrics, so we built our own and exposed them through&nbsp;OpenTelemetry:&nbsp;</p>'
  }
/>

```rust
pub struct MetricsCollector {
    pub active_shards_number: RwLock<usize>,
    pub records: AtomicUsize,
    pub transient_errors: AtomicUsize,
    pub watermark: RwLock<Option<SystemTime>>,
}
```

<CoreBlock
  name="core-paragraph"
  content={'<p>Exposed through OpenTelemetry: </p>'}
/>

<CoreBlock
  name="core-list"
  content={
    '<ul class="wp-block-list"><li><code>shards_active</code>: Current active shards being polled&nbsp;</li><li><code>records_consumed_total</code>: Total records since startup&nbsp;</li><li><code>lag_ms</code>: Current lag from watermark to wall clock&nbsp;</li><li><code>errors_transient_total</code>: Recoverable error count&nbsp;</li></ul>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    "<p>The lag metric is especially important for the customer's SLA; they need to verify configuration changes propagate within seconds.</p>"
  }
/>

<CoreBlock
  name="core-heading"
  content={
    '<h3 class="wp-block-heading h4"><strong>Configuration: A complete example&nbsp;</strong></h3>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    "<p>One of our design principles is making everything as easy as possible for developers.&nbsp;Here's&nbsp;a complete&nbsp;Spicepod&nbsp;configuration implementing the architecture described above:&nbsp;</p>"
  }
/>

```yaml
version: v1
kind: Spicepod
name: dynamodb-streams-demo

snapshots:
  enabled: true
  location: s3://<path>
  bootstrap_on_failure_behavior: fallback
  params:
    s3_auth: key
    s3_key: ${secrets:AWS_ACCESS_KEY_ID}
    s3_secret: ${secrets:AWS_SECRET_ACCESS_KEY}
    s3_region: us-east-2

datasets:
  - from: dynamodb:<table>
    name: <table>
    params:
      dynamodb_aws_region: ap-northeast-2
      dynamodb_aws_auth: iam_role
    acceleration:
      enabled: true
      refresh_mode: changes
      engine: duckdb
      mode: file
      snapshots: enabled
      snapshots_trigger: time_interval
      snapshots_trigger_threshold: 2m
    metrics:
      - name: shards_active
      - name: records_consumed_total
      - name: lag_ms
      - name: errors_transient_total
```

<CoreBlock
  name="core-paragraph"
  content={
    '<p>This configuration points Spice at a DynamoDB table, enables CDC, accelerates to&nbsp;DuckDB, snapshots to S3 for fast cold start, falls back to bootstrap if snapshot loading fails, and exposes key metrics.&nbsp;</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    "<p>That's&nbsp;it. No custom CDC consumers to build,&nbsp;checkpoint management code to write,&nbsp;or&nbsp;shard&nbsp;tracking&nbsp;logic to&nbsp;maintain. Point it at your table and start querying.&nbsp;</p>"
  }
/>

<CoreBlock
  name="core-heading"
  content={
    '<h4 class="wp-block-heading h5"><strong>The magic moment </strong></h4>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>When our customer first deployed this configuration, their feedback was immediate: "It was too easy."&nbsp;They had expected weeks of integration work. Instead, they had real-time DynamoDB synchronization running in&nbsp;an&nbsp;afternoon.&nbsp;</p>'
  }
/>

<CoreBlock
  name="core-heading"
  content={
    '<h3 class="wp-block-heading h4"><strong>Lessons learned</strong></h3>'
  }
/>

<CoreBlock
  name="core-list"
  content={
    '<ol class="wp-block-list"><li><em><strong><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-black-color">Choose abstractions that match your&nbsp;guarantees</mark></strong></em>: DynamoDB Streams\'&nbsp;exactly-once&nbsp;delivery saved us from deduplication complexity.&nbsp;The "simpler" option with fewer features was actually less work.&nbsp;<br></li><li><strong><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-black-color"><em>Bootstrap&nbsp;carefully</em>:</mark></strong> The checkpoint-first approach handles edge cases that naive strategies miss-large tables, idle streams, memory constraints. Temporary "time travel" during catch-up is an acceptable trade-off.&nbsp;<br></li><li><strong><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-black-color"><em>Pure state machines pay off&nbsp;immediately</em>:</mark></strong> Separating state transitions from I/O made shard management testable and easy to&nbsp;reason about.<br></li><li><strong><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-black-color"><em>Build observability from day&nbsp;one</em>:</mark></strong> Without AWS-provided lag metrics, we built our own. Having watermarks and lag tracking from the start made debugging and operations much easier.&nbsp;<br></li><li><strong><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-black-color"><em>Design for the scaling&nbsp;requirements</em>:</mark></strong> The two-tier architecture with push/pull flexibility handles both the "few nodes, large data" and "many nodes, small data" patterns the customer&nbsp;needed.&nbsp;</li></ol>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>The architecture is extensible. If we need Kinesis Data Streams support for longer retention, the core state machine and checkpointing logic can be reused with a deduplication layer on top.&nbsp;</p>'
  }
/>

<CoreBlock
  name="core-heading"
  content={
    '<h2 class="wp-block-heading h3"><strong>Conclusion&nbsp;</strong>&nbsp;</h2>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>This pattern of using <a href="/feature/real-time-change-data-capture">real-time change data capture</a> to decouple application data planes from OLTP systems is increasingly common in modern, distributed architectures.&nbsp;What made this&nbsp;particular customer challenge&nbsp;compelling was the combination of strict latency requirements, thousands of downstream consumers, and the need for operational simplicity.&nbsp;</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>By treating DynamoDB Streams as a reliable source of truth and pairing it with accelerated, local query engines, we were able to&nbsp;eliminate&nbsp;cache complexity, remove DynamoDB from the application critical path, and deliver configuration changes across the fleet in seconds.&nbsp;&nbsp;</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>The same approach generalizes well beyond this use case: any system that needs fast, consistent access to changing data without rebuilding custom CDC consumers or managing fragile caching layers can&nbsp;benefit&nbsp;from this architecture.</p>'
  }
/>

<CoreBlock
  name="core-heading"
  content={
    '<h3 class="wp-block-heading h4"><strong>Get started&nbsp;</strong></h3>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Check out the&nbsp;<a href="https://spiceai.org/docs/components/data-connectors/dynamodb" target="_blank" rel="noreferrer noopener">Spice DynamoDB connector</a> docs, Spice\'s broader&nbsp;<a href="https://spiceai.org/docs/features/cdc" target="_blank" rel="noreferrer noopener">CDC support</a>, and the below demo for overviews on using Spice and DynamoDB. </p>'
  }
/>

<PostVideo
  fields={{
    thumbnail: false,
    type: 'youtube',
    video_id: 'buetuWkDar8',
    video_title: 'DynamoDB Streams with Spice Acceleration Snapshots',
    video_upload_date: '2026-01-06T18:24:54-08:00',
    video_channel: 'Spice AI',
    video_description:
      'Demo of real-time acceleration from DynamoDB Streams with Spice acceleration snapshots.',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>And if you want to dig deeper into&nbsp;architectures&nbsp;like this, ask questions, or share what&nbsp;you\'re&nbsp;building,&nbsp;<a href="/slack" target="_blank" rel="noreferrer noopener">join the Spice community on Slack</a>.&nbsp;</p>'
  }
/>

The same [federated SQL and acceleration](/platform/sql-federation-acceleration) layer applies to other streaming sources beyond DynamoDB. To evaluate it against your workload, [get a demo](/get-a-demo).

## Frequently Asked Questions

### Can Spice use DynamoDB Streams to keep an accelerated dataset in sync?

Yes, Spice consumes DynamoDB Streams and applies each insert, update, and delete to a local accelerated dataset. You enable this by setting `refresh_mode: changes` on the dataset, part of Spice's built-in [real-time change data capture](/feature/real-time-change-data-capture). You write no custom CDC consumers, checkpoint management code, or shard tracking logic.

### Does DynamoDB Streams guarantee exactly-once delivery?

Yes, DynamoDB Streams delivers each change record exactly once, in write order within each shard. Kinesis Data Streams also orders records within each shard, but its at-least-once delivery can produce duplicates that consumers must remove. Exactly-once delivery removes that overhead when a stream keeps accelerated tables in sync.

### How long does DynamoDB Streams retain change records?

DynamoDB Streams retains change records for 24 hours. Continuous checkpointing keeps Spice's stream position current, so the 24-hour window is enough for this architecture. Shard iterators expire separately after 15 minutes, and Spice recovers by requesting a new iterator from its last checkpoint.

### How fast can a new node start serving data from DynamoDB?

A new node downloads the latest dataset snapshot from Amazon S3 and resumes the change stream from the embedded checkpoint. For a dataset of a few gigabytes, startup time drops from minutes to single-digit seconds. This removes the full table rescan from cold start.

### Do readers see stale data while an accelerated dataset catches up?

No, Spice marks a dataset ready only after replication lag drops below a threshold, which defaults to 2 seconds. Watermarks based on each record's approximate creation time measure that lag. Downstream processes query the dataset only after it catches up to near real time.

### How do you monitor replication lag from DynamoDB Streams?

DynamoDB Streams has no built-in lag metric, so Spice computes its own and exposes it through OpenTelemetry. The `lag_ms` metric reports the delay between the stream watermark and the wall clock. Counters also track active shards, consumed records, and transient errors.

### Can every data plane node consume DynamoDB Streams directly?

No, a single central Spice layer consumes the stream and acts as a fan-out point for all nodes. Each node runs a local Spice daemon with SQLite or DuckDB and polls the central layer on a configurable interval. Reads then stay on localhost, and nodes can filter to pull only the partitions they need. Spice [deploys in the cloud, on-premises, or at the edge](/feature/edge-to-cloud-deployments), so the same pattern works next to any application.

<ContentResourceFeatured
  fields={{
    heading: 'Explore more Spice resources',
    paragraph: 'Hands-on tutorials, product docs, and real-world examples.',
    mode: 'related',
    resources: false,
    padding_top: 'unset',
    padding_bottom: 'unset',
    related_posts: [
      {
        title: 'A Developer&#8217;s Guide to Understanding Spice.ai',
        slug: '/blog/a-developers-guide-to-understanding-spice-ai',
        excerpt:
          'This guide helps developers build a mental model of why, how, and where to use Spice.',
        image:
          '/website-assets/media/2026/02/A-developers-guide-to-understanding-Spice.ai_.png',
        type: 'Blog',
        taxonomy: [
          'Engineering',
          'Spice AI',
          'Spice Cloud Platform',
          'Spice OSS',
        ],
      },
      {
        title:
          'Spice Cloud v1.11: Spice Cayenne Reaches Beta, Apache DataFusion v51, DynamoDB Streams Improvements, &amp; More',
        slug: '/blog/spice-cloud-v1-11',
        excerpt:
          'Spice Cloud v1.11 focuses on what matters most in production: faster queries, lower memory usage, and predictable performance across acceleration and caching.',
        image: '/website-assets/media/2026/01/Spice-Cloud-v1.11-Update.png',
        type: 'Blog',
        taxonomy: ['Releases', 'Spice Cloud Platform'],
      },
      {
        title: 'How we use Apache DataFusion at Spice AI',
        slug: '/blog/how-we-use-apache-datafusion-at-spice-ai',
        excerpt:
          'Why we chose to build on DataFusion and how we extended it with custom TableProviders, optimizer rules, and UDFs for federated SQL',
        image:
          '/website-assets/media/2026/01/Engineering-at-Spice-AI-Apache-DataFusion.png',
        type: 'Blog',
        taxonomy: [
          'Spice AI',
          'Spice Cloud Platform',
          'Spice OSS',
          'SQL Federation',
        ],
      },
    ],
  }}
/>

<TalkToAnEngineerCta />

<ContentRichText
  fields={{
    coverage: 'rc-end',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

---

## Real-Time Hybrid Search Using RRF: A Hands-On Guide with Spice
URL: https://spice.ai/blog/real-time-hybrid-search-using-rrf
Date: 2025-10-23T16:10:00
Description: Learn how to build hybrid search with Reciprocal Rank Fusion (RRF) directly in SQL using Spice - combining text, vector, and time-based relevance in one query for faster, more accurate results.

<ContentRichText
  fields={{
    coverage: 'rc-start',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

**TL;DR:** [Reciprocal Rank Fusion (RRF)](/platform/hybrid-sql-search) combines keyword, vector, and metadata search results into a single ranked list without score normalization. This guide walks through building real-time hybrid search with RRF directly in SQL using Spice, from setup and embedding generation to multi-signal queries with time decay.

---

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Surfacing relevant answers to searches across datasets has historically meant navigating significant tradeoffs.&nbsp;<a href="https://spiceai.org/docs/reference/sql/search#-keywordexact-match">Keyword (or lexical) search</a>&nbsp;is fast, cheap, and commoditized, but limited by the constraints of exact matching.&nbsp;<a href="https://spiceai.org/docs/reference/sql/search#vector-search-vector_search">Vector (or semantic) search&nbsp;</a>captures nuance and intent, but can be slower, harder to debug, and expensive to run at scale. Combining both usually entails standing up multiple engines (e.g. Elasticsearch for text, Pinecone for vectors), writing custom ranker logic, and maintaining ETL and data sync pipelines.&nbsp;</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>As real-time, AI-powered applications and agents become ubiquitous, these compromises are less tenable. Users demand instant, context-rich results that balance precision with intent. This applies to both consumer and enterprise <a href="/use-case/application-search">application search</a> environments; for example, a business user searching across internal knowledge bases, or a customer searching for an item in their chat history on a consumer app. Waiting for data pipelines to sync, dealing with custom APIs, or troubleshooting a multi-system ranking stack introduces a variety of sub-optimal outcomes: inconsistent rankings, higher latency, or just simply inaccurate results.&nbsp;</p>'
  }
/>

<PostVideo
  fields={{
    thumbnail: false,
    type: 'youtube',
    video_id: 'w4D2RB43oy4',
    video_title:
      'How to Run Hybrid Search with Reciprocal Rank Fusion (RRF) | Spice.ai Demo',
    video_upload_date: '2025-10-22T16:13:04-07:00',
    video_channel: 'Spice AI',
    video_description:
      'How to run hybrid search with Reciprocal Rank Fusion in Spice.ai.',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<CoreBlock
  name="core-heading"
  content={
    '<h2 class="wp-block-heading h4">Hybrid Search with Reciprocal Rank Fusion (RRF)</h2>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p><a href="https://spiceai.org/docs/reference/sql/search#reciprocal-rank-fusion-rrf">Reciprocal Rank Fusion</a> (RRF) is an algorithm for <a href="/platform/hybrid-sql-search">hybrid search</a> that helps mitigate the search challenge unfolded above. Instead of favoring one search modality, RRF merges results from multiple independent searches and variables (text, vector, metadata, recency, etc.) by combining their ranks and giving each signal proportional influence. This avoids "winner take all" blending and delivers results that are both topically relevant and contextually meaningful. </p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>In practice, each search query is executed independently, and the ranks of the returned results are combined using the following formula:</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={'<p><code>RRF Score = Σ(rank_weight / (k + rank))</code></p>'}
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Documents that appear across multiple result sets receive higher scores, while the smoothing parameter&nbsp;<strong><code>k</code></strong>&nbsp;controls how much rank position affects the final score (lower values make higher-ranked items more influential).</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>RRF can also incorporate&nbsp;<em>custom weighting</em>&nbsp;and<em>&nbsp;temporal decay</em>, enabling developers to:</p>'
  }
/>

<CoreBlock
  name="core-list"
  content={
    '<ul class="wp-block-list"><li>Adjust the influence of each query type using the&nbsp;<code>rank_weight</code>&nbsp;parameter.</li><li>Apply&nbsp;<strong>recency boosting</strong>&nbsp;by specifying a&nbsp;<code>time_column</code>&nbsp;and<code>&nbsp;decay</code>&nbsp;function.<ul class="wp-block-list"><li><em>Exponential decay:</em>&nbsp;: e^(-decay_constant * age_in_units) where age is in decay_scale_secs</li><li><em>Linear decay:</em>&nbsp;&nbsp;max(0, 1 - (age_in_units / decay_window_secs))</li></ul></li></ul>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>‍This approach lets you incorporate exact keyword matches, semantic similarity, and time-based relevance in one consistent ranking.</p>'
  }
/>

<CoreBlock
  name="core-image"
  content={
    '<figure class="wp-block-image size-large is-resized"><img src="/website-assets/media/2025/10/68fa54ee4770acc863000513_RFF-1-1024x901.png" alt="Reciprocal Rank Fusion (RRF) flowchart" class="wp-image-468" width="794" height="699"/><figcaption class="wp-element-caption">Figure 1: RFF&nbsp;Flowchart</figcaption></figure>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>RRF is&nbsp;<a href="https://spiceai.org/docs/reference/sql/search#reciprocal-rank-fusion-rrf">fully integrated in Spice\'s hybrid search platform</a>:</p>'
  }
/>

<CoreBlock
  name="core-list"
  content={
    '<ul class="wp-block-list"><li>SQL operators combine text and vector search in a single query</li><li>Rank weights can be tuned per-query&nbsp;</li><li>Recency and metadata can be included with no extra code</li><li>No external ranking server, no additional infrastructure, and no manual pipeline management are required</li></ul>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    "<p>‍Let's take this out of the abstract and review a sequence of queries that illustrate the business value of RFF in Spice, from basic to more sophisticated ranking techniques.&nbsp;</p>"
  }
/>

<CoreBlock
  name="core-heading"
  content={'<h3 class="wp-block-heading h5">Hybrid Search</h3>'}
/>

```python
-- Combine vector and text search for enhanced relevance
SELECT id, title, content, fused_score
FROM rrf(
    vector_search(documents, 'machine learning algorithms'),
    text_search(documents, 'neural networks deep learning', content),
    join_key => 'id'  -- explicit join key for performance
)
WHERE fused_score > 0.01
ORDER BY fused_score DESC
LIMIT 5;
```

<CoreBlock
  name="core-paragraph"
  content={
    '<p>This first example illustrates the basic building blocks of RRF-powered hybrid search: merging semantic/vector and traditional keyword/text retrieval in one query. The result set balances conceptual relevance - capturing results related to "machine learning algorithms" - with precise keyword matches like "neural networks" or "deep learning.". Using the<code>&nbsp;join_key</code>&nbsp;ensures that performance scales commensurately with data volume.</p>'
  }
/>

<CoreBlock
  name="core-heading"
  content={'<h3 class="wp-block-heading h5">Weighted Ranking</h3>'}
/>

```python
-- Boost semantic search over exact text matching
SELECT fused_score, title, content
FROM rrf(
    text_search(posts, 'artificial intelligence', rank_weight => 50.0),
    vector_search(posts, 'AI machine learning', rank_weight => 200.0)
)
ORDER BY fused_score DESC
LIMIT 10;
```

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Weighting lets you fine-tune intent. Semantic results for "AI machine learning" are given four times more influence than exact text matches for "artificial intelligence." This allows development teams to favor context and meaning, surfacing more relevant content even when users don\'t type a precise phrase.</p>'
  }
/>

<CoreBlock
  name="core-heading"
  content={'<h3 class="wp-block-heading h5">Recency-Boosted</h3>'}
/>

```python
-- Exponential decay favoring recent content
SELECT fused_score, title, created_at
FROM rrf(
    text_search(news, 'breaking news'),
    vector_search(news, 'latest updates'),
    time_column => 'created_at',
    recency_decay => 'exponential',
    decay_constant => 0.05,
    decay_scale_secs => 3600  -- 1 hour scale
)
ORDER BY fused_score DESC
LIMIT 10;
```

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Finally, RRF can incorporate time as a ranking signal (important for use cases like trading exchanges, news, or social media).&nbsp;</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>By specifying a&nbsp;<code>time_column</code>&nbsp;and a&nbsp;<code>decay&nbsp;</code>function, you can automatically boost time-pertinent results. In this example, exponential decay prioritizes newer stories while keeping hybrid relevance intact.</p>'
  }
/>

<CoreBlock
  name="core-heading"
  content={'<h2 class="wp-block-heading h4">Use Case Walk-Through</h2>'}
/>

<CoreBlock
  name="core-paragraph"
  content={
    "<p>Now, let's walk through a hands-on example: capturing real-time Bluesky posts, embedding and full-text indexing them automatically, and running hybrid search queries with RRF via SQL.</p>"
  }
/>

<CoreBlock
  name="core-heading"
  content={'<h3 class="wp-block-heading h5">Step 1. Set up</h3>'}
/>

<CoreBlock name="core-paragraph" content={'<p>Clone this repository:</p>'} />

```python
git clone https://github.com/spiceai/cookbook.git
cd cookbook/search
```

<CoreBlock
  name="core-paragraph"
  content={'<p>Install&nbsp;<code>websocat</code>&nbsp;and set up Python:</p>'}
/>

```python
brew install websocat
python -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
```

<CoreBlock
  name="core-heading"
  content={
    '<h3 class="wp-block-heading h5">Step 2. Preview and capture data</h3>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>We can read real-time posts using&nbsp;<a href="https://docs.bsky.app/blog/jetstream">Bluesky\'s Jetstream relay service</a>. Use&nbsp;<code>websocat</code>&nbsp;to preview the stream and ensure that the relay is functional:</p>'
  }
/>

```python
websocat wss://jetstream2.us-east.bsky.network/subscribe\?wantedCollections=app.bsky.feed.post | jq

{
  "did": "did:plc:ei3py27iy2orpykshoudxnls",
  "time_us": 1758813540806266,
  "kind": "commit",
  "commit": {
    "rev": "3lzoas6yujs2z",
    "operation": "create",
    "collection": "app.bsky.feed.post",
    "rkey": "3lzoas6nbhs2e",
    "record": {
      "$type": "app.bsky.feed.post",
      "createdAt": "2025-09-25T15:19:00.163Z",
      "langs": [
        "ja"
      ],
      "text": "🧐🧐🧐🧐🧐"
    },
    "cid": "bafyreighkijp5zyclu6qdjtfskmr65ttvxvedvqmfvwgfyf6iaq4jfdje4"
  }
}
...

^C
```

<CoreBlock
  name="core-paragraph"
  content={
    "<p>Let's convert this stream into a Parquet file that Spice AI can read. Let this run for a little while, until satisfied with the total number collected. Run again at any time to resume appending:</p>"
  }
/>

```python
websocat wss://jetstream2.us-east.bsky.network/subscribe\?wantedCollections=app.bsky.feed.post | ./generate_parquet.py
[info] boot!
[info] INSERTED 250 ROWS; TOTAL 250
[info] INSERTED 250 ROWS; TOTAL 500
```

<CoreBlock
  name="core-heading"
  content={
    '<h3 class="wp-block-heading h5">Step 3. Start Spice and Search</h3>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p><em>In a new terminal</em>, start Spice. It will embed, full-text index, and ingest the latest data. Additionally, the&nbsp;<code>file</code>&nbsp;connector is using fsnotify to watch it for updates, to eagerly ingest data.</p>'
  }
/>

```python
spice run
```

<CoreBlock
  name="core-paragraph"
  content={'<p>You should see this output:</p>'}
/>

```python
2025-09-26T15:21:38.154354Z  INFO spiced: Starting runtime v1.8.0-unstable-build.71ac09ff2+models.metal
2025-09-26T15:21:38.225135Z  INFO runtime::init::caching: Initialized results cache; max size: 128.00 MiB, item ttl: 1s
2025-09-26T15:21:38.229824Z  INFO runtime::init::caching: Initialized search results cache; max size: 128.00 MiB, item ttl: 1s
2025-09-26T15:21:38.230575Z  INFO runtime::init::caching: Initialized embeddings cache; max size: 128.00 MiB, item ttl: 1s
2025-09-26T15:21:38.658824Z  INFO runtime::opentelemetry: Spice Runtime OpenTelemetry listening on 127.0.0.1:50052
2025-09-26T15:21:38.658888Z  INFO runtime::flight: Spice Runtime Flight listening on 127.0.0.1:50051
2025-09-26T15:21:38.678694Z  INFO runtime::http: Spice Runtime HTTP listening on 127.0.0.1:8090
2025-09-26T15:21:47.550688Z  INFO runtime::init::embedding: Embedding Model potion_128m ready
2025-09-26T15:21:47.659106Z  INFO runtime::init::dataset: Dataset bluesky_posts initializing...
2025-09-26T15:21:47.730735Z  INFO runtime::dataconnector::file: Watching changes to bluesky_posts.parquet
2025-09-26T15:21:47.730999Z  INFO runtime::init::dataset: Dataset bluesky_posts registered (file://bluesky_posts.parquet), acceleration (duckdb:file, append), results cache enabled.
2025-09-26T15:21:47.740354Z  INFO runtime::accelerated_table::refresh_task: Loading data for dataset bluesky_posts
2025-09-26T15:21:57.885819Z  INFO runtime::accelerated_table::refresh_task: Dataset bluesky_posts received 38,101 records
2025-09-26T15:21:58.507599Z  INFO runtime::accelerated_table::refresh_task: Loaded 38,101 rows (54.72 MiB) for dataset bluesky_posts in 10s 775ms.
2025-09-26T15:21:58.550191Z  INFO runtime: All components are loaded. Spice runtime is ready!
2025-09-26T15:22:20.335633Z  INFO runtime::accelerated_table::refresh_task: Loading data for dataset bluesky_posts
2025-09-26T15:22:21.960722Z  INFO runtime::accelerated_table::refresh_task: Loaded 251 rows (339.49 kiB) for dataset bluesky_posts in 1s 656ms.
```

<CoreBlock
  name="core-paragraph"
  content={'<p><em>In a new terminal</em>, start the Spice SQL REPL:</p>'}
/>

```python
spice sql
```

<CoreBlock
  name="core-heading"
  content={'<h3 class="wp-block-heading h5">Basic Hybrid Search</h3>'}
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Combine exact text matching with semantic similarity for comprehensive results:</p>'
  }
/>

```python
-- Find posts about space travel using both exact text and semantic search
select fused_score, text, created_at, langs
from rrf(
    text_search(bluesky_posts, 'space travel'),
    vector_search(bluesky_posts, 'space travel')
) order by fused_score desc limit 10;
```

<CoreBlock
  name="core-heading"
  content={'<h3 class="wp-block-heading h5">Weighted Ranking</h3>'}
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Boost specific search strategies using&nbsp;<code>rank_weight</code>&nbsp;to prioritize different result types:</p>'
  }
/>

```python
-- Heavily prioritize semantic similarity over exact text matches
select fused_score, text, rkey
from rrf(
    text_search(bluesky_posts, 'artificial intelligence', rank_weight => 50.0),
    vector_search(bluesky_posts, 'AI machine learning', rank_weight => 200.0)
) order by fused_score desc limit 15;

-- Prioritize exact mentions while including semantic results
select fused_score, text, created_at
from rrf(
    text_search(bluesky_posts, 'climate change', rank_weight => 300.0),
    vector_search(bluesky_posts, 'environmental sustainability', rank_weight => 100.0)
) order by fused_score desc limit 20;
```

<CoreBlock
  name="core-heading"
  content={'<h3 class="wp-block-heading h5">Recency-Boosted Search</h3>'}
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Use temporal information to surface recent content with exponential or linear decay:</p>'
  }
/>

```python
-- Recent posts get higher scores with exponential decay
select fused_score, text, created_at, rkey
from rrf(
    text_search(bluesky_posts, 'breaking news'),
    vector_search(bluesky_posts, 'latest updates'),
    time_column => 'created_at',
    recency_decay => 'exponential',
    decay_constant => 0.05,
    decay_scale_secs => 3600  -- 1 hour scale
) order by fused_score desc limit 10;

-- Linear decay for trending topics over the last day
select fused_score, text, created_at
from rrf(
    text_search(bluesky_posts, 'trending now'),
    vector_search(bluesky_posts, 'viral popular'),
    time_column => 'created_at',
    recency_decay => 'linear',
    decay_window_secs => 86400  -- 24 hours
) order by fused_score desc limit 15;
```

<CoreBlock
  name="core-heading"
  content={'<h3 class="wp-block-heading h5">Advanced Parameter Tuning</h3>'}
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Fine-tune the RRF algorithm using the smoothing parameter&nbsp;<code>k</code>:</p>'
  }
/>

```python
-- Lower k value for more aggressive ranking differences
select fused_score, text, langs
from rrf(
    text_search(bluesky_posts, 'technology innovation'),
    vector_search(bluesky_posts, 'tech startups'),
    k => 20.0  -- More aggressive than default 60.0
) order by fused_score desc limit 12;

-- Higher k for smoother score distribution
select fused_score, text, created_at
from rrf(
    text_search(bluesky_posts, 'social media'),
    vector_search(bluesky_posts, 'online platforms'),
    k => 120.0  -- Smoother than default 60.0
) order by fused_score desc limit 10;
```

<CoreBlock
  name="core-heading"
  content={
    '<h3 class="wp-block-heading h5">Multi-Language and Content Analysis</h3>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Combine vector search queries across languages for similar concepts:</p>'
  }
/>

```python
-- Find posts about "breaking news" with semantic query in Spanish, but keyword match in English
select fused_score, text, langs, created_at
from rrf(
    vector_search(bluesky_posts, 'ultimas noticias', rank_weight => 100),
    text_search(bluesky_posts, 'news'),
    time_column => 'created_at',
    recency_decay => 'exponential',
    decay_constant => 0.05,
    decay_scale_secs => 3600  -- 1 h
) where trim(text) != '' order by fused_score desc limit 15;

-- Find posts about breaking news using two semantic queries in Spanish, but filter results for English
select fused_score, text, langs, created_at
from rrf(
    vector_search(bluesky_posts, 'ultimas noticias'),
    vector_search(bluesky_posts, 'noticias de ultima hora'),
    time_column => 'created_at',
    recency_decay => 'exponential',
    decay_constant => 0.05,
    decay_scale_secs => 3600  -- 1 h
) where langs like '%en%' and trim(text) != '' order by fused_score desc limit 15;
```

<CoreBlock
  name="core-heading"
  content={
    '<h3 class="wp-block-heading h5">Step 4. Enable agentic support</h3>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Stop Spice, and go to&nbsp;<code>spicepod.yml</code>&nbsp;and uncomment the&nbsp;<code>models</code>&nbsp;block. Update the&nbsp;<code>.env</code>&nbsp;file with your OpenAI key. Then start Spice again.</p>'
  }
/>

```python
spice run
```

<CoreBlock
  name="core-paragraph"
  content={'<p>Afterwards, begin a chat session:</p>'}
/>

```python
spice chat
```

<CoreBlock
  name="core-paragraph"
  content={'<p>Try to query for insights using natural language:</p>'}
/>

```python
chat> Can you see how many posts there are in the last day about photography?
There were 676 posts about photography in the last day on the Bluesky platform. If you have any further questions or need additional insights, feel free to ask!

Time: 10.12s (first token 9.50s). Tokens: 1635. Prompt: 1588. Completion: 47 (75.62/s).

chat> Can you show me a breakdown by language?
Here's a breakdown of the posts about photography in the last day by language:

1. **English (en):** 596 posts
2. **German (de):** 41 posts
3. **Finnish (fi):** 20 posts
4. **Unspecified:** 17 posts
5. **English, Hebrew, Sanskrit (en, he, sa):** 1 post
6. **Dutch (nl):** 1 post
```

<CoreBlock
  name="core-paragraph"
  content={"<p>And that's it. We've just walked through a full</p>"}
/>

<CoreBlock name="core-paragraph" content={'<p></p>'} />

<CoreBlock
  name="core-heading"
  content={'<h2 class="wp-block-heading h4">Next steps</h2>'}
/>

<CoreBlock
  name="core-paragraph"
  content={
    "<p>Hybrid Search with RRF in Spice eliminates external ranking servers, sync pipelines, or duplicated datasets; you can query, rank, and reason across disparate data sources from a single SQL interface. Whether you're powering an internal knowledge assistant or surfacing live content from social feeds, you get near-real-time, context-rich results with minimal overhead.</p>"
  }
/>

<CoreBlock
  name="core-paragraph"
  content={'<p><strong>Get started:</strong></p>'}
/>

<CoreBlock
  name="core-list"
  content={
    '<ul class="wp-block-list"><li><a href="/pricing">Sign up</a>&nbsp;for Spice Cloud for free, or&nbsp;<a href="https://spiceai.org/docs/getting-started">get started</a>&nbsp;with Spice OSS&nbsp;</li><li>Explore the&nbsp;<a href="https://spiceai.org/docs/features/search">Hybrid Search Docs</a></li><li>Go through the&nbsp;<a href="https://github.com/spiceai/cookbook/blob/trunk/search/README.md">RFF cookbook example</a><a href="https://meetings.hubspot.com/vladi-semenov">‍</a></li><li><a href="https://meetings.hubspot.com/vladi-semenov">Schedule a demo</a>&nbsp;if you\'d like full a walk-through</li></ul>'
  }
/>

## Frequently Asked Questions

### What is Reciprocal Rank Fusion (RRF) and how does it work?

Reciprocal Rank Fusion is a ranking algorithm that merges results from multiple search methods (such as keyword search and vector search) into a single, unified ranking. RRF scores each result based on its position in each individual ranking using the formula `1 / (k + rank)`, then sums scores across all rankings. This approach is lightweight, requires no model training, and consistently produces high-quality hybrid results.

### When should I use hybrid search instead of vector search alone?

Hybrid search outperforms vector-only search when queries contain specific identifiers, product names, error codes, or exact terms that semantic embeddings may miss. It also helps when your dataset includes both structured metadata and unstructured text. Combining keyword precision with semantic understanding via RRF produces more consistent results across diverse query types.

### How does Spice implement hybrid search in a single query?

Spice provides built-in `vector_search` and `text_search` [SQL functions](/platform/hybrid-sql-search) that can be combined with standard SQL joins and a `rrf()` ranking function. This means keyword search, vector similarity, and RRF fusion all execute within the same query engine: no external services, no multi-system orchestration. Results are ranked and returned in a single round-trip.

### What is the advantage of RRF over other fusion methods like weighted scoring?

RRF is rank-based rather than score-based, which makes it robust across search methods that use different scoring scales. Weighted scoring requires tuning weights for each method and can be sensitive to score distribution changes. RRF delivers strong results out of the box without hyperparameter tuning, making it a practical default for most [application search](/use-case/application-search) use cases.

<ContentResourceFeatured
  fields={{
    heading: 'Explore more Spice resources',
    paragraph:
      'Tutorials, docs, and blog posts to help you go deeper with Spice.',
    mode: 'related',
    resources: false,
    padding_top: 'unset',
    padding_bottom: 'unset',
    related_posts: [
      {
        title: 'A Developer&#8217;s Guide to Understanding Spice.ai',
        slug: '/blog/a-developers-guide-to-understanding-spice-ai',
        excerpt:
          'This guide helps developers build a mental model of why, how, and where to use Spice.',
        image:
          '/website-assets/media/2026/02/A-developers-guide-to-understanding-Spice.ai_.png',
        type: 'Blog',
        taxonomy: [
          'Engineering',
          'Spice AI',
          'Spice Cloud Platform',
          'Spice OSS',
        ],
      },
      {
        title:
          'Operationalizing Amazon S3 for AI: From Data Lake to AI-Ready Platform in Minutes',
        slug: '/blog/operationalizing-amazon-s3-for-ai',
        excerpt:
          'Amazon S3 has evolved with S3 Tables and S3 Vectors, but leveraging them for real-time AI workloads requires significant distributed systems work. This post shows how Spice handles ingestion, federation, acceleration, and hybrid search - transforming S3 into a low-latency, AI-ready platform with minimal configuration.',
        image: '/website-assets/media/2026/02/Operationalizing-S3.png',
        type: 'Blog',
        taxonomy: ['Search'],
      },
      {
        title: 'How we use Apache DataFusion at Spice AI',
        slug: '/blog/how-we-use-apache-datafusion-at-spice-ai',
        excerpt:
          'Why we chose to build on DataFusion and how we extended it with custom TableProviders, optimizer rules, and UDFs for federated SQL',
        image:
          '/website-assets/media/2026/01/Engineering-at-Spice-AI-Apache-DataFusion.png',
        type: 'Blog',
        taxonomy: [
          'Spice AI',
          'Spice Cloud Platform',
          'Spice OSS',
          'SQL Federation',
        ],
      },
    ],
  }}
/>

<TalkToAnEngineerCta />

<ContentRichText
  fields={{
    coverage: 'rc-end',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

---

## Spice 2.0: Real-Time Analytical Query on Operational Data, Without ETL
URL: https://spice.ai/blog/spice-2-0-is-now-available
Date: 2026-07-09T16:00:00
Description: Spice 2.0 is now available: add real-time analytical query and search to operational data without ETL via high-throughput CDC replication, petabyte-scale distributed compute built on Apache Ballista, and enterprise-grade controls.

<ContentRichText
  fields={{
    coverage: 'rc-start',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

AI agents that need real-time data are driving new, demanding, analytical workloads on operational databases.

However, analytical queries on stores like MySQL, PostgreSQL, and MongoDB risk disrupting mission-critical operations with heavy execution, complex RLS-policies, and data-leakage. ETL pipelines that copy data from operational to analytical systems are expensive, costly to operate, and are not real-time, typically with stale data in the hours or even days.

With Spice 2.0, organizations can add [sandboxed analytics replicas](/platform/analytics) alongside their operational databases in minutes with sub-second query and real-time freshness, using high-throughput replication.

And when the data outgrows one node, deploy petabyte-scale compute with confidence. Multi-node, multi-active, highly available distributed query built on Apache Ballista is now generally available.

<div id="major-features-in-20" />

## What's New in Spice 2.x

[High-Throughput Change-Data-Capture (CDC) Replication](https://spiceai.org/docs/features/cdc). Bolt high-performance analytics-ready replicas onto live operational databases. Spice replicates directly from the PostgreSQL WAL, MySQL binlog, and MongoDB oplog without pipelines or query load on production. It's incrementally adoptable: start with a single table and be running analytical queries on operational data in minutes with 2-second end-to-end freshness under continuous ingest. v2.1 adds an in-memory CDC tier and a dedicated compaction runtime that cut replication lag on high-volume workloads, plus shared PostgreSQL replication slots across changes-mode datasets.

[Multi-Node Distributed Compute](https://spiceai.org/docs/features/distributed-query). Petabyte-scale compute built on [Apache Ballista](/blog/apache-ballista-at-spice-ai) is now generally available. Object-store native and highly available, with multi-active schedulers and no single point of failure. Three executors run TPC-H SF100 2.9x faster than one node. v2.1 distributes Iceberg catalog table scans and broadcast-joins small dimension tables, with shared scheduler job state and failover.

[Spice Cayenne](https://spiceai.org/docs/components/data-accelerators/cayenne). The premier Spice acceleration engine built on [Vortex](/blog/vortex-at-spice-ai-the-columnar-format-for-data-intensive-workloads) is now generally available: 1.5x faster than DuckDB with 3x less steady-state memory, and 26x faster than Spice 1.x on TPC-DS SF100 - now with atomic WAL-staged writes, high-throughput ingestion, MERGE INTO, and SQL-defined partitioning. v2.1 adds experimental adaptive self-tuning that adapts Cayenne to hardware, schema, and live workload.

[Spice Kubernetes Operator](https://docs.spice.ai/docs/enterprise/kubernetes-operator/kubernetes). Full lifecycle management and control for running Spice at scale on Kubernetes with blue/green deployments, instant-rollback, and data-aware routing.

[Enterprise Security & Policy](https://docs.spice.ai/docs/enterprise/production/security). OIDC authentication, a [Cedar](https://cedarpolicy.com/) policy engine, PII masking, and mTLS, all enforced before data reaches the agent.

[And More](https://spiceai.org/releases/v2.0-stable)! Searchable Tool Registry, SQL & WASM user-defined functions (UDFs), DataFusion v54, and new data connectors including Elasticsearch and Azure Cosmos DB.

**Benchmarks:** 1.5 - 1.8x faster than Spice 1.x on TPC-H SF100 with up to 42% less memory · 26x faster on TPC-DS SF100 with Cayenne · ~170x faster CDC ingest than 1.x · 2.9x faster distributed query from one node to three · 2-second CDC freshness · 1,046 QPH of CH-BenCHmark analytics at SF1000 under a 266,000+ tpmC live transactional load - full results below.

Launch a [managed cluster on Spice Cloud](/login) or try [Spice 2.0 OSS](https://spiceai.org/docs/installation).

---

[Spice 1.0-Stable](/blog/announcing-spice-ai-open-source-1-0-stable) shipped in January 2025 purpose-built for agentic workloads, so that AI agents could be grounded in enterprise data. Spice 1.0 packaged the core building blocks for AI apps into a single runtime; query [federation and acceleration](/platform/sql-federation-acceleration), [hybrid search](/platform/hybrid-sql-search), and integrated [LLM inference](/platform/llm-inference), all delivered by a single SQL endpoint. This lightweight, 140MB single-node engine, built on [Apache DataFusion](/blog/how-we-use-apache-datafusion-at-spice-ai), in Rust, excelled at fast, low-latency reads on real-time operational data, and Barracuda runs it in production at global scale.

![Spice platform and features](/website-assets/svg/spice-architecture.svg)

_Figure 1: The Spice platform and features._

However, as enterprise agents were deployed, they demanded even more:

- Freshness. An agent acting on stale data and generating incorrect answers or inputs to a decision can be disastrous for a business.

- Scale. An agent without all relevant context has gaps in its knowledge. Agents need to query and search across both real-time data and multi-terabyte to petabyte-scale historical datasets.

- Enterprise Controls. Enterprise agents demand highly-available deployments, secure mTLS and OIDC authentication, RBAC and ABAC authorization, and policy-defined row and column level filtering and PII masking.

The Spice 2.0 platform delivers real-time, single-digit second data freshness, query and search at petabyte-scale, all with enterprise-grade operations and control.

You can now add analytical query and search to your operational data, without ETL, via high-throughput CDC replication. Query petabytes with Apache Ballista-based multi-node distributed compute, and deploy at enterprise-scale with the new Spice Kubernetes Operator and enterprise controls.

All this continued to be built on the open-source Spice engine, written in Rust on open-standards, including full support for Arrow, Iceberg, Delta, Parquet, and Vortex.

Add Spice to your operational data today!

---

## Performance

Spice 2.0 numbers are measured on release-candidate builds; Spice 1.x numbers on the final 1.x release (v1.11.6) - identical harness, hardware, and benchmark specs throughout. Cluster benchmarks ran on i3.4xlarge nodes (16 vCPU, 122 GB RAM) in AWS; single-node benchmarks ran under a 256 GB memory limit.

### Analytics on live operational data: CH-BenCHmark

CH-BenCHmark is the classic HTAP (hybrid transactional/analytical processing) benchmark: it runs the TPC-C transactional workload and TPC-H-style analytical queries concurrently, against the same data. Benchmarks like TPC-H measure analytics on data at rest; CH-BenCHmark measures the scenario Spice 2.0 is built for - [real-time analytics on live operational data](/use-case/analytics), where analytical queries stay fast and correct while transactions continuously change the data underneath them.

The benchmark configuration mirrors the 2.0 architecture end-to-end: PostgreSQL serves the TPC-C transactional workload, a single Spice node replicates committed changes via CDC into Cayenne acceleration, and analytical queries run against the Spice replica - production never sees the analytical load. Scale factor 1000: 1,000 warehouses and 300M+ rows, with a 600-second measurement window on a single 64-core node.

| Metric                                        | Result                                                                  |
| --------------------------------------------- | ----------------------------------------------------------------------- |
| Source bootstrap (300M-row order_line)        | **~9 minutes** via native PostgreSQL logical replication - ~566K rows/s |
| Bootstrap ingest rate vs. Spice 1.x           | **~170x faster** than the 1.x Debezium-based path                       |
| Transactional throughput (PostgreSQL)         | **266,861 tpmC** - 6.09M transactions in ~10 minutes per node           |
| Analytical throughput, concurrent with ingest | **1,046 QPH** per node                                                  |

PostgreSQL sustained roughly 10,000 transactions per second for the full window while Spice served the entire analytical workload from the replica.

### Operational freshness under load

Spicebench measures the full operational loop on TPC-H SF10: continuous ingest, concurrent query load, and checkpoint validation until queries return exactly-correct results. End-to-end freshness - from ingest to exactly-correct results - is single-digit seconds in both modes: 2.0 s for CDC (inserts + updates + deletes) and 7 s for append streams.

### Spice 2.0 vs. Spice 1.x: same hardware, same data

| Benchmark · accelerator            | Spice 1.x | Spice 2.0 | Spice 2.0 is    |
| ---------------------------------- | --------- | --------- | --------------- |
| TPC-H SF100 · DuckDB               | 253.0 s   | 138.3 s   | **1.8x faster** |
| TPC-H SF100 · Cayenne              | 133.6 s   | 88.3 s    | **1.5x faster** |
| TPC-DS SF100 · DuckDB              | 108.6 s   | 93.9 s    | **16% faster**  |
| TPC-DS SF100 · Cayenne             | 4,196 s   | 157.6 s   | **26x faster**  |
| Peak memory · TPC-H SF100 · DuckDB | 70.7 GB   | 40.7 GB   | **42% less**    |

<BenchmarkDurationTabs />

Durations are wall-clock for the full query suite. The 26x TPC-DS result is real, not rounding: a pathological join query that took 65 minutes on 1.x completes in 5.3 seconds on 2.0. And Spice 2.0 with Cayenne - 88.3 s on TPC-H SF100 - is the fastest configuration in the entire launch benchmark matrix.

### Distributed query: near-linear scaling

TPC-H SF100 executed directly against federated S3 Parquet - no local acceleration - comparing one node to a three-executor Ballista cluster over the same source.

| Configuration                           | Query-suite duration               | Best fit                                       |
| --------------------------------------- | ---------------------------------- | ---------------------------------------------- |
| Single node, federated S3 Parquet       | 2,741 s (45.7 min)                 | Baseline without local acceleration            |
| Three-executor Ballista cluster         | 935 s (15.6 min) - **2.9x faster** | Distribution for data that doesn't fit locally |
| Single node, local Cayenne acceleration | 88 s - **31.1x faster**            | Acceleration for working sets that fit locally |

<DistributedQueryScalingPanel />

_Workloads are derived from the TPC-H, TPC-DS, CH-BenCHmark, and ClickBench specifications; results are not audited TPC results._

<div id="early-feedback-on-2-0" />

## Early feedback on 2.0

Here's what teams at Barracuda, Summation, and Lenovo had to say about migrating workloads to 2.0:

### Barracuda Networks - Spice Cayenne acceleration for email archive search

<p className="mb-2 text-[0.98em]">
  Barracuda uses Spice to modernize data access for its email archiving and
  audit log systems, where queries were slow and costly. Before Spice, customers
  searching email archives faced delays of up to two minutes because of the
  volume of data being scanned. With 2.0, Barracuda migrated from DuckDB to
  Spice Cayenne acceleration, unlocking faster queries at higher scale and lower
  memory usage.
</p>
<PostQuote
  fields={{
    message:
      "By migrating from DuckDB to Spice Cayenne, we solved our last mile query optimization problem where data layout and pruning alone weren't sufficient and achieved real-time query performance over a petabyte-scale, frequently-updated Delta Lake table.",
    name: 'Kevin Haggard',
    subtext: 'Vice President of Engineering, Barracuda Networks',
    logo: {
      url: '/website-assets/media/2025/11/Homepage_Logos_Barracuda-1.svg',
      alt: 'Barracuda Networks logo',
      width: 211,
      height: 40,
    },
    headshot: {
      url: '/website-assets/media/2025/11/kevin-haggard.jpeg',
      alt: 'Kevin Haggard',
      width: 150,
      height: 150,
    },
  }}
/>

### Summation - Unified AI-driven decision platform

<p className="mb-2 text-[0.98em]">
  Summation is an AI-driven decision platform that integrates financial and
  operational data into a single governed model. Since every customer runs a
  different stack, the Summation platform has to easily onboard and query
  disparate enterprise data sources.
</p>
<PostQuote
  fields={{
    message:
      "Spice is the data plane behind Summation. Every connector we ship, from Snowflake to a generic REST-as-a-table, collapses into one SQL surface, which is what makes our AI agents portable across a customer's stack. 2.0's distributed query takes the scaling concern off the table.",
    name: 'Ramachandra Ramarathinam',
    subtext: 'CTO, Summation',
    logo: {
      url: '/website-assets/media/2025/11/summation-logo.svg',
      alt: 'Summation logo',
      width: 160,
      height: 25,
    },
    headshot: {
      url: '/website-assets/media/2025/11/ramachandran-ramarathinam.jpeg',
      alt: 'Ramachandra Ramarathinam',
      width: 150,
      height: 150,
    },
  }}
/>

### Lenovo - Real-time, governed data for enterprise agents

<p className="mb-2 text-[0.98em]">
  Lenovo helps enterprises operationalize AI across hybrid cloud environments,
  where agent deployments need a scalable and governed data foundation that can
  stay up to date in real time.
</p>
<PostQuote
  fields={{
    message:
      'The missing piece for enterprise agent deployments is often the data layer. Agents need a framework that enables real-time access to fresh data while supporting scalability and governance. Spice 2.0 is designed to address these data challenges to help AI agents remain relevant and responsible over time.',
    name: 'Linda Yao',
    subtext: 'VP & GM, Hybrid Cloud & AI Solutions',
    company: 'Lenovo',
    logo: {
      url: '/website-assets/media/2025/11/Lenovo-Logo-Website.svg',
      alt: 'Lenovo logo',
      width: 152,
      height: 24,
    },
    headshot: {
      url: '/website-assets/media/2025/11/Linda-Yao.jpeg',
      alt: 'Linda Yao',
      width: 150,
      height: 150,
    },
  }}
/>

## Spice 2.0 in Depth

### High-Throughput Change-Data-Capture (CDC) Replication

![Agent-native CDC replication](/website-assets/svg/spice_CDC.svg)

_Figure 2: Agent-native CDC replication._

Spice 2.0 introduces first-class CDC replication, so you can add Spice as an analytical node to query live operational data without building pipelines. Point Spice at an operational database, and it replicates changes, without query load on production. It's incrementally adoptable and composable; start with one store or table, replicate changes to Spice datasets, and even execute joins across them.

Spice supports two modes of replication:

- Change Data Capture (CDC). Writes and deletes land in the operational store; committed changes are replicated from the native change log.
- Event stream. Append-only data is consumed from streaming systems like Kafka with upsert semantics.

Spice ships native replication, without requiring Debezium or an external streaming layer. Native support includes [PostgreSQL WAL logical replication](https://spiceai.org/docs/features/cdc/postgres-replication), with automatic slot management and bootstrapped snapshot, MySQL binlog replication, [MongoDB Streams oplog](https://spiceai.org/docs/features/cdc/mongodb-streams), and DynamoDB Streams. Debezium support is improved and additional native sources are on the roadmap.

Native replication is also what makes bootstrap fast: on CH-BenCHmark SF1000, Spice snapshotted a 300M-row PostgreSQL table in ~9 minutes at ~566K rows/s - roughly 170x the ingest rate of the 1.x Debezium-based path.

### Multi-Node Distributed Compute built on Apache Ballista

![Multi-node distributed cluster roles in Spice 2.0](/website-assets/svg/distributed-query-architecture.svg)

_Figure 3: Multi-node distributed cluster roles in Spice 2.0._

2.0 brings the general availability of petabyte-scale, [high-availability, multi-node compute](https://spiceai.org/docs/features/distributed-query). Powered by Apache Ballista, it distributes scans, joins, aggregations, and LLM inference across fleets of executor nodes.

Multi-node, distributed query supports two modes. Synchronous query for interactive workflows requiring fast, low-latency query and asynchronous query for long-running analytical and batch jobs. The scheduler distributes work dynamically as executors join or leave the cluster, routes partition-aware queries to the appropriate executors, and uses NDV-aware table statistics so large semi-joins size correctly instead of running out of memory.

Spice Distributed Query supports:

- Highly-available, object-store native schedulers with no single point of failure; any scheduler can schedule or resume any query
- mTLS encryption across all inter-node communication by default
- Spice Kubernetes Operator for highly-available, data-aware blue-green deployments, zero-downtime rolling upgrades, health checks, and Prometheus metrics
- Synchronous and asynchronous execution modes; async results materialize to object storage
- Dynamic cluster sizing as executors join or leave

With Spice, you get distributed compute with local acceleration, hybrid search, and AI inference in a single object-store native platform. No JVM, no Zookeeper, just a high-performance Rust runtime and object-store.

Check out the live demo, where Phillip queries a 100M-row dataset, reducing a 22 second single node query to 2.4 seconds scaling across a multi-node Spice cluster with Cayenne acceleration:

<PostVideo
  fields={{
    type: 'youtube',
    video_id: 'iASGEx5QtIg',
    video_title: 'Spice 2.0 Demo: Distributed Query at Scale',
    video_upload_date: '2026-07-08T13:23:55-07:00',
    video_channel: 'Spice AI',
    video_description: 'Demo of distributed query at scale in Spice 2.0.',
    title: 'Spice distributed query live demo',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

### Cluster-Sidecar Architecture

![Cluster-sidecar architecture for scale and locality](/website-assets/svg/Spice-Cluster-Sidecar.svg)

_Figure 4: Cluster-sidecar architecture for scale and locality._

The new multi-cluster support enables new workload-optimized architectures. The cluster-sidecar architecture combines a Spice multi-node cluster for scale and lightweight sidecars for locality, so agentic workloads get both fast, low-latency query of hot data and fast, distributed query across petabyte scale data lakes.

In this pattern, Single-node Spice instances run co-located with applications, materializing only the working set that application or AI agent requires. When a sidecar needs to reach beyond its local working set or run heavy long-running queries, it delegates to the cluster.

The tiers collaborate rather than just stack. The multi-node cluster handles ingestion, replication, shared accelerations, while each sidecar stays light and specific to its agent or dashboard, serving and caching the working set it needs.

The sidecar acts as a physically isolated sandbox of working data, while Spice manages refreshing data and delegating queries to the cluster replicas instead of the production database, so analytical queries and agents never contend with the operational workload.

### Spice Cayenne (GA)

![Spice Cayenne architecture](/website-assets/svg/spice-cayenne-architecture.svg)

_Figure 5: Spice Cayenne architecture._

[Spice Cayenne](/blog/introducing-spice-cayenne-data-accelerator) was introduced in preview in v1.9 as Spice's next-generation data accelerator and reaches general availability in 2.0.

It's built on [Vortex](https://github.com/vortex-data/vortex), an open-source columnar format (Linux Foundation, Apache-licensed) designed for the access patterns of agents: random access, point lookups, concurrent readers, and streaming updates (unlike Parquet's batch analytics focus). Cayenne pairs a Vortex data layer with an embedded metadata engine, which supports terabyte-scale workloads with significantly lower memory requirements than DuckDB.

With 2.0, Cayenne now supports high-throughput ingestion of writes, changes, and deletes beyond its append-optimized initial release. Writes are staged through a write-ahead log and commit atomically with full ACID semantics. Small writes are absorbed by a low-latency inline/mem-tier and are immediately queryable.

For CDC, primary-key DELETEs that identify keys directly skip the table scan, updates use merge-on-read position deletes instead of rewriting the table, and a dedicated compaction runtime keeps that background work off the query and ingest. MERGE INTO plus SQL-defined (PARTITION BY) and composite partitioning round out the SQL surface.

Production characteristics:

- 1.57x faster than DuckDB on TPC-H SF100 (88.3 s vs. 138.3 s) - the fastest configuration in the 2.0 launch benchmark matrix
- 26x faster than Spice 1.x on TPC-DS SF100
- 1,025 QPH of CH-BenCHmark analytics at SF1000 while continuously ingesting CDC changes from a PostgreSQL source running at 265,968 tpmC
- 3.6x lower steady-state (median) memory than DuckDB on TPC-H and ClickBench, 2.9x lower on TPC-DS
- Matches DuckDB query performance on ClickBench with 21% lower peak memory and a 34% smaller on-disk footprint
- 100x faster random access compared to Parquet
- 10-20x faster full scans compared to Parquet

### Spice Kubernetes Operator

The [Spice Kubernetes Operator](https://docs.spice.ai/docs/enterprise/kubernetes-operator/kubernetes) v1.0 is now generally available to enterprise customers. It manages the full data-aware deployment lifecycle, on cloud or on-premises, for running Spice at scale on Kubernetes.

Two Custom Resource Definitions (CRDs) are included supporting multi-node clusters and single-node deployments. The SpicepodCluster CRD manages scheduler and executor nodes, mTLS certificate provisioning, rolling upgrades, and automatic failover. The SpicepodSet CRD manages single-node deployments and sidecars: injecting Spice instances into application pods via annotations, scaling them horizontally, and handling persistent storage when required.

Production characteristics:

- Automatic mTLS certificate provisioning across all cluster nodes
- Crashloop protection, instant rollback, and sidecar-injection via annotations
- Persistent volume management with automatic resizing
- Prometheus metrics via ServiceMonitor for existing observability stacks
- Network policy management and IRSA-compatible service account configuration

### Enterprise Security & Control

Spice 2.0 includes the security and controls demanded by enterprises and new agentic workloads.

The Spice platform is secure-by-default with mTLS, OIDC authentication, and RBAC and ABAC authorization. Agent working sets of data are declaratively defined so each sandboxed Spice instance is only provisioned with data that any specific agent should access. Fine-grained policy to the row and column level can be defined and enforced by the Cedar policy engine, especially useful for defining specific data LLM tools or UDFs can access. Cedar policy is integrated and enforced in the core DataFusion query engine, with no ability to circumvent via SQL.

- **Cedar-based Policy Engine (Beta).** Defined-policy access control at query time, written in Cedar, the open authorization language developed by AWS. Per-principal row-level filtering and column masking are evaluated against the caller's identity through functions like current_principal(), so an agent or tool sees only the rows and columns its identity is authorized for, regardless of how the query is written.
- **mTLS.** Enforced across all inter-node and client communication, including HTTP and Arrow Flight, with hot-reloading certificates for zero-downtime rotation.
- **Authentication (OIDC).** Validates OIDC bearer tokens (JWTs) issued by enterprise identity providers including Microsoft Entra ID, Okta, Cognito, and Google, on runtime endpoints. Standalone or combined with API keys and native Secret Store integration.
- **Secret Stores.** New Native HashiCorp Vault and Azure Key Vault integrations in addition to AWS SecretStore and Kubernetes secrets. Read-only API key enforcement prevents write operations under restricted keys.
- **Per-Principal Cache Namespacing.** Each principal gets an isolated cache namespace, so accelerated working sets and results never cross identity boundaries.

### The Spice Cloud Hybrid Model

[Spice Cloud](https://docs.spice.ai/) is a managed Spice service that operates cloud-hosted multi-node Spice clusters, including high-availability distributed query, Cayenne acceleration, search, and AI inference for you.

In a hybrid cluster-sidecar deployment, Spice Cloud manages the multi-node cluster while application sidecars can run in your own environment alongside your applications and agents. Heavy compute is delegated to the fully managed infrastructure. Latency-sensitive sidecar instances run wherever your applications and agents live, in your Kubernetes clusters, VPCs, on-premises data centers, or edge, and serve hot data locally at sub-second latency over mTLS.

## What's next

We're already working on the next chapter of Spice: BYOC (bring-your-own-cloud), distributed search across multi-node clusters, write-back acceleration with full DML, an Iceberg-REST compatible Cayenne Catalog, webhooks and event-driven actions, and much more. [The roadmap is public](https://github.com/spiceai/spiceai/blob/trunk/docs/ROADMAP.md) and community-driven.

The demands on data infrastructure keep growing as apps and agents demand real-time operational, analytical, streaming, and service data. From our founding in 2021 to the future, we're building Spice as the best data platform to power the next-generation of intelligent, AI-driven apps and agents.

Add Spice to your operational data. Analytical query with no ETL. It's open source, portable, scalable, and fast. Welcome to Spice 2.0.

If you're an architect or technical leader evaluating data infrastructure for AI agents in production, we'd love to talk. Mention this post when you reach out to hey@spice.ai, and the first 15 teams will receive a dedicated architecture workshop with our engineering team.

## Start building

The fastest path to production is Spice Cloud. And there are also several options for getting started on your own terms:

- [Launch a managed cluster on Spice Cloud](/login)
- [Try Spice 2.0 open source](https://spiceai.org/docs/installation)
- Say hi in the [Spice Community Slack](https://spiceaicommunity.slack.com/join)
- [Explore Spice.ai Enterprise](/pricing)
- [Get a demo](https://meetings.hubspot.com/vladi-semenov) from a Spice engineer

## Additional 2.0 Highlights

- [Tool Registry](https://spiceai.org/docs/features/tool-registry). Replaces per-tool schemas with searchable tool_search and tool_invoke meta-tools, roughly 10x fewer tool-definition tokens per turn for large tool sets.
- [User-Defined Functions](https://spiceai.org/docs/reference/spicepod/functions). Declarative SQL and remote HTTP UDFs, auto-registered as LLM tools and propagated across executors.
- [DataFusion v54](https://spiceai.org/releases/v2.0-stable#performance--query-engine). Sort pushdown makes top-K queries on pre-sorted data roughly 30x faster, a rewritten sort-merge join drops TPC-H Q21 from minutes to milliseconds, and dynamic filters prune files and rows mid-execution.
- [Data connectors (40+)](https://spiceai.org/docs/components/data-connectors). Elasticsearch, Azure Cosmos DB, GCS, ADBC, DuckLake, Git, and catalog connectors for PostgreSQL, MySQL, MSSQL, and Snowflake. The HTTP connector turns REST APIs into federated tables, with OAuth2, pagination, and predicate-driven parameters.
- [DML/DDL](https://spiceai.org/releases/v2.0-stable#dml-ddl-and-write-back): INSERT/UPDATE/DELETE write-back for PostgreSQL, Snowflake, DynamoDB, and Arrow
- [Data operations](https://spiceai.org/releases/v2.0-stable#spice-cayenne-reaches-general-availability). MERGE INTO and PARTITION BY on Cayenne, DML write-back for PostgreSQL and Snowflake, and read/write Iceberg.
- [Search and AI](https://spiceai.org/releases/v2.0-stable#search--vectors). Hybrid search (vector, BM25, and relational) extended to Elasticsearch, multi-vector embeddings, DuckDB HNSW indexes, MCP streamable HTTP transport, provider-aware prompt caching, and the Responses API across all providers.

See the [release notes](https://spiceai.org/releases/v2.0-stable) for the full list.

---

Together these capabilities advance the [operational data lakehouse](/use-case/operational-data-lakehouse): sub-second analytics, search, and AI on a single runtime.

<ContentRichText
  fields={{
    coverage: 'rc-end',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<AccordionFaq
  fields={{
    heading: 'Spice 2.0 Launch FAQ',
    paragraph: '',
    items: [
      {
        title: 'Do I need to run a multi-node cluster to use Spice 2.0?',
        paragraph:
          '<p>No. Spice 2.0 works just as well as a single-node sidecar or standalone runtime. The distributed cluster and sidecar modes are complementary deployment options you adopt when your workloads demand them.</p>',
      },
      {
        title:
          'Can I run sidecars in my own environment while using Spice Cloud for the cluster?',
        paragraph:
          "<p>Yes - this is the hybrid deployment model and it's a common production topology. Your sidecars run wherever your apps run (your VPC, your Kubernetes cluster, on-prem, edge). They connect securely to the Spice Cloud managed cluster for heavy queries. Your data stays in your object storage.</p>",
      },
      {
        title: 'How does Spice Cloud pricing work?',
        paragraph:
          '<p>Spice Cloud offers a free tier for getting started. Production pricing is based on cluster size and query volume. Enterprise pricing includes dedicated support, SLAs, and custom deployment options. See <a href="/pricing">spice.ai/pricing</a> for details.</p>',
      },
      {
        title:
          "What's the difference between Spice OSS, Spice Cloud, and Spice.ai Enterprise?",
        paragraph:
          '<p>Spice OSS is the full open-source runtime under the Apache 2.0 license - federation, acceleration (including Cayenne), hybrid search, AI integration. Spice Cloud is a fully managed service where we operate the distributed cluster for you - the easiest path to production. Spice.ai Enterprise is a self-hosted deployment with SSO, RBAC, audit logs, and enterprise SLAs. All three run the same Spice 2.0 engine.</p>',
      },
      {
        title: 'Can I use Spice without any AI features?',
        paragraph:
          "<p>Many customers use Spice purely for federation and acceleration - fast SQL across disparate sources with no AI involved. The AI primitives are there when you need them, but they're not required for any core functionality.</p>",
      },
      {
        title:
          'How does the cluster-sidecar model differ from running a traditional centralized query engine like Trino?',
        paragraph:
          "<p>Trino gives you distributed query but not local acceleration - every query still makes a network round-trip to the cluster. Spice's sidecar model materializes hot data directly in the application pod, so the most common queries never leave localhost. The cluster handles the long-tail queries that need full dataset access. You get both patterns in one system, and with Spice Cloud, the cluster is fully managed.</p>",
      },
      {
        title: 'How does Spice compare to running DuckDB or Trino directly?',
        paragraph:
          '<p>DuckDB is excellent for single-node analytical workloads. Trino is excellent for distributed federation. Spice gives you both - local acceleration with Cayenne and distributed query across a multi-node cluster - plus hybrid search and AI inference, in a single system.</p>',
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

---

---

## Spice AI achieves SOC 2 Type II compliance
URL: https://spice.ai/blog/spice-ai-achieves-soc-2-type-ii-compliance
Date: 2024-03-05T19:25:00
Description: Spice AI completes SOC 2 Type II audit, demonstrating enterprise-grade security and compliance for its data and AI infrastructure platform.

<ContentRichText
  fields={{
    coverage: 'rc-start',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<CoreBlock
  name="core-image"
  content={
    '<figure class="wp-block-image"><img src="https://cdn.prod.website-files.com/6362f59f9fd4ac355fc06eaf/6674a854e1a70aae48be0a9d_1*-6loSitGMTdmPNheq_2DjA.webp" alt="Spice AI has achieved SOC-2 Type II compliance"/><figcaption class="wp-element-caption">Spice AI has achieved SOC-2 Type II compliance.</figcaption></figure>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>In June last year, Spice AI&nbsp;<a target="_blank" href="https://blog.spice.ai/enterprise-grade-performance-for-web3-data-d1604b72b3d5" rel="noreferrer noopener">announced enterprise-grade performance</a>&nbsp;with our second-generation platform for sub-second SQL queries across 100TBs of time-series data.</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    "<p>Today, we're announcing Spice AI has&nbsp;<strong>achieved SOC 2 Type II compliance&nbsp;</strong>as of Feb 16, 2024, in accordance with American Institute of Certified Public Accountants (AICPA) standards for SOC for Service Organizations also known as SSAE 18. Achieving this standard with an unqualified opinion serves as third-party industry validation that Spice AI provides enterprise-level security for customer's data secured in the Spice AI platform.</p>"
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Spice AI provides a data and AI infrastructure platform that brings together the infra building blocks needed to build intelligent applications. <a href="/security">Security and compliance</a> are top priority for Spice AI. Principles including Compliance, Secure-Access-Control, and Data Protection, are core to how we build and operate the Spice.ai platform, team, and company.</p>'
  }
/>

<CoreBlock
  name="core-image"
  content={
    '<figure class="wp-block-image"><a href="/security"><img src="https://cdn.prod.website-files.com/6362f59f9fd4ac355fc06eaf/6674a855873a911d20f6ce78_1*nCUcebV1cUbx0QxsIA99oA.webp" alt="The Spice.ai platform is built from security and compliance first-principles"/></a><figcaption class="wp-element-caption">The Spice.ai platform is built from security and compliance first-principles.</figcaption></figure>'
  }
/>

<CoreBlock
  name="core-heading"
  content={
    '<h2 class="wp-block-heading h4">SOC 2 Type II Audit and Certification</h2>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Spice AI was audited by&nbsp;<a href="http://www.prescientassurance.com/" target="_blank" rel="noreferrer noopener">Prescient Assurance</a>, a leader in security and compliance attestation for B2B, SAAS companies worldwide. Prescient Assurance is a registered public accounting in the US and Canada and provides risk management and assurance services which includes but is not limited to SOC 2, PCI, ISO, NIST, GDPR, CCPA, HIPAA, and CSA STAR. For more information about Prescient Assurance, you may reach out them at&nbsp;<a href="mailto:info@prescientassurance.com" target="_blank" rel="noreferrer noopener">info@prescientassurance.com</a>.</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p><a href="https://www.isaca.org/resources/news-and-trends/isaca-now-blog/2019/how-to-properly-review-an-soc-report" target="_blank" rel="noreferrer noopener">An unqualified opinion</a>&nbsp;on a SOC 2 Type II audit report demonstrates to Spice AI\'s current and future customers that we manage data and our platform with the highest standard of security and compliance. More information on Spice AI security can be found at&nbsp;<a href="/security">the Spice AI security page</a>.</p>'
  }
/>

<CoreBlock
  name="core-image"
  content={
    '<figure class="wp-block-image"><img src="https://cdn.prod.website-files.com/6362f59f9fd4ac355fc06eaf/6674a8546f6456c53c0776a4_1*gH0mFxruyWWjlbENlLjTpA.webp" alt="Spice AI achieves SOC 2 Type II compliance"/></figure>'
  }
/>

<CoreBlock name="core-paragraph" content={'<p>‍</p>'} />

Learn more about platform security practices on the [security page](/security). To discuss compliance requirements for [federated SQL and acceleration](/platform/sql-federation-acceleration) or [secure AI agent](/use-case/secure-ai-agents) deployments, [get a demo](/get-a-demo).

<ContentResourceFeatured
  fields={{
    heading: 'Explore more Spice resources',
    paragraph:
      'Tutorials, docs, and blog posts to help you go deeper with Spice.',
    mode: 'related',
    resources: false,
    padding_top: 'unset',
    padding_bottom: 'unset',
    related_posts: [
      {
        title: 'A Developer&#8217;s Guide to Understanding Spice.ai',
        slug: '/blog/a-developers-guide-to-understanding-spice-ai',
        excerpt:
          'This guide helps developers build a mental model of why, how, and where to use Spice.',
        image:
          '/website-assets/media/2026/02/A-developers-guide-to-understanding-Spice.ai_.png',
        type: 'Blog',
        taxonomy: [
          'Engineering',
          'Spice AI',
          'Spice Cloud Platform',
          'Spice OSS',
        ],
      },
      {
        title: 'Real-Time Control Plane Acceleration with DynamoDB Streams ',
        slug: '/blog/real-time-acceleration-with-dynamodb-streams',
        excerpt:
          'How to sync DynamoDB data to thousands of nodes with sub-second latency using a two-tier architecture with DynamoDB Streams and Spice acceleration.',
        image: '/website-assets/media/2026/01/image-33.png',
        type: 'Blog',
        taxonomy: [
          'Data Acceleration',
          'Engineering',
          'Spice Cloud Platform',
          'Spice OSS',
        ],
      },
      {
        title: 'How we use Apache DataFusion at Spice AI',
        slug: '/blog/how-we-use-apache-datafusion-at-spice-ai',
        excerpt:
          'Why we chose to build on DataFusion and how we extended it with custom TableProviders, optimizer rules, and UDFs for federated SQL',
        image:
          '/website-assets/media/2026/01/Engineering-at-Spice-AI-Apache-DataFusion.png',
        type: 'Blog',
        taxonomy: [
          'Spice AI',
          'Spice Cloud Platform',
          'Spice OSS',
          'SQL Federation',
        ],
      },
    ],
  }}
/>

<TalkToAnEngineerCta />

<ContentRichText
  fields={{
    coverage: 'rc-end',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

---

## The Spice.ai for GitHub Copilot Extension is now available!
URL: https://spice.ai/blog/spice-ai-for-github-copilot-extension-now-available
Date: 2024-10-27T19:07:00
Description: With the Spice.ai Extension, developers can interact with data, like product requirements documents (PRDs), tickets, and tabular data, from any external data source directly within GitHub Copilot. Save hours copying and pasting across various platforms, relevant data and answers are now surfaced in Copilot Chat, right when you need it.

<ContentRichText
  fields={{
    coverage: 'rc-start',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>The new&nbsp;<a href="https://github.com/marketplace/spice-ai-for-github-copilot">Spice.ai for GitHub Copilot Extension</a>, now available in preview, gives developers access to data from external sources directly within the GitHub Copilot experience.</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    "<p>Developers often face the hassle of switching between multiple environments to get the data they need. Whether it's referencing internal documentation or copying details from another ticketing system, the constant context-switching disrupts focus and consumes valuable development time.</p>"
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>With the Spice.ai Extension, developers can interact with data, like product requirements documents (PRDs), tickets, and tabular data, from any external data source directly within GitHub Copilot. Save hours copying and pasting across various platforms, relevant data and answers are now surfaced in Copilot Chat, right when you need it.</p>'
  }
/>

<CoreBlock
  name="core-image"
  content={
    '<figure class="wp-block-image"><img src="https://cdn.prod.website-files.com/6362f59f9fd4ac355fc06eaf/671e8db753744b89372826e3_671e8caf39fb26688eaf6192_logs_with.webp" alt="Copilot Chat using Spice.ai Extension to query S3 logs"/><figcaption class="wp-element-caption">Chatting with logs stored on S3 in Copilot Chat with the Spice.ai Extension.</figcaption></figure>'
  }
/>

<CoreBlock
  name="core-heading"
  content={
    '<h2 class="wp-block-heading h4">Spice.ai Extension installation and activation</h2>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Getting started with the Spice.ai Extension is easy. Get the extension directly from GitHub Copilot in just three steps!&nbsp;</p>'
  }
/>

<CoreBlock
  name="core-list"
  content={
    '<ol class="wp-block-list"><li>Type&nbsp;<strong>@spiceai</strong>&nbsp;in Copilot Chat to activate the extension<ul class="wp-block-list"><li>Alternatively:&nbsp;<a href="https://github.com/marketplace/spice-ai-for-github-copilot/order/MLP_kgDNKMM?quantity=1">Install the extension from the marketplace directly</a>.<br>‍</li></ul></li><li>Click&nbsp;<strong>Connect</strong>&nbsp;to authorize the Spice.ai Cloud Platform - our enterprise-grade data and AI platform. Spice.ai integrates with GitHub for authentication, automatically creating an account and Copilot app, so you can easily configure data sources.</li><li>Next, you\'ll be able to choose from a set of ready-to-use datasets, like React.js and TailwindCSS, to get started. Spice.ai can also connect to a wide range of data sources, including GitHub repositories, SQL databases, data warehouses, data lakes, and GraphQL endpoints, which can be configured later.</li></ol>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Now, with the Spice.ai Extension configured, you can mention&nbsp;<strong>@spiceai</strong>&nbsp;in Copilot Chat to access configured datasets, documentation, issue trackers, and more.</p>'
  }
/>

<CoreBlock
  name="core-image"
  content={
    '<figure class="wp-block-image"><img src="https://cdn.prod.website-files.com/6362f59f9fd4ac355fc06eaf/671e9091997520a67a65d6a7_671e907d9446befa2ee752c3_Screenshot%25202024-10-27%2520at%252012.10.33.webp" alt="Spice.ai extension configuration in GitHub Copilot Chat"/><figcaption class="wp-element-caption">Configuring the extension.</figcaption></figure>'
  }
/>

<CoreBlock
  name="core-heading"
  content={
    '<h2 class="wp-block-heading h4">Use cases and prompts for the Spice.ai Extension</h2>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>The Spice.ai GitHub Copilot Extension, gives you access to external datasets, right within Copilot Chat. Here are just a few ways you can use it.</p>'
  }
/>

<CoreBlock
  name="core-list"
  content={
    '<ul class="wp-block-list"><li><strong>Query available datasets.</strong>&nbsp;Quickly list all available datasets<ul class="wp-block-list"><li>Try:&nbsp;<strong>@spiceai</strong>&nbsp;What datasets do you have access to?<br>‍</li></ul></li><li>‍<strong>Access relevant documentation.&nbsp;</strong>Need documentation related to the file or component you\'re working on?<ul class="wp-block-list"><li>Try:&nbsp;<strong>@spiceai</strong>&nbsp;What documentation is relevant to this file?</li><li>Try:&nbsp;<strong>@spiceai</strong>&nbsp;Write documentation about the user authentication issue.</li></ul></li><li><strong>Review tickets and issues.&nbsp;</strong>Sometimes issues, tickets, advisories might be stored in external systems<ul class="wp-block-list"><li>Try:&nbsp;<strong>@spiceai</strong>&nbsp;What OPEN issues are relevant to Next.js ISR?</li><li>Try:&nbsp;<strong>@spiceai</strong>&nbsp;Find the 5 most recent CLOSED issues in Next.js related to routing. Include a brief summary of each issue or fix and a link to the issue.</li></ul></li></ul>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Check out the video below to see how fast and simple it is to get started with the Spice.ai GitHub Copilot Extension.</p>'
  }
/>

<PostVideo
  fields={{
    thumbnail: false,
    type: 'youtube',
    video_id: 'ky7RD3d3CNQ',
    video_title: 'Spice.ai for GitHub Copilot (Quick Introduction)',
    video_upload_date: '2024-10-27T12:02:01-07:00',
    video_channel: 'Spice AI',
    video_description:
      'Quick introduction to the Spice.ai extension for GitHub Copilot.',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<CoreBlock
  name="core-heading"
  content={
    '<h2 class="wp-block-heading h4">Ready to Try the Spice.ai for Copilot Extension?</h2>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>You can start using the&nbsp;<a href="https://github.com/marketplace/spice-ai-for-github-copilot">Spice.ai for GitHub Copilot Extension</a>&nbsp;today. It\'s available in preview for free by the Community Edition, with usage limits. Stay tuned for the upcoming general availability launch, where we\'ll introduce paid commercial plans for professionals and organizations.<br>‍</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p><strong>→&nbsp;</strong><a href="/"><strong>Get the Spice.ai for GitHub Copilot Extension now</strong></a><strong>.</strong><br>‍</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Got questions or feedback? Let us know on the&nbsp;<a href="https://discord.com/channels/803820740868571196/874937463397818449">Spice AI Discord</a>. Your feedback helps shape the future of the extension as we work to improve it and add more data sources.</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>We\'re excited to see how you\'ll use the Spice.ai for GitHub Copilot Extension to accelerate your development process. Follow the&nbsp;<a href="/blog">Spice.ai Blog</a>&nbsp;for updates.</p>'
  }
/>

<CoreBlock
  name="core-heading"
  content={
    '<h2 class="wp-block-heading h4">Learn more about Spice.ai and GitHub Copilot</h2>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Spice AI is making data-driven AI app development simple and easy for developers. By providing tools that make data more accessible and actionable to AI, Spice AI helps developers to build useful and accurate AI applications faster.</p>'
  }
/>

<CoreBlock name="core-paragraph" content={'<p>‍</p>'} />

<CoreBlock
  name="core-paragraph"
  content={
    '<p>The Spice.ai GitHub for Copilot Extension was developed through the&nbsp;<a href="https://github.com/features/preview/copilot-partner-program">GitHub Copilot Partner Program</a>, which supports partners building personalized workflows for Copilot. GitHub Copilot empowers developers by automating repetitive tasks and with proven results of&nbsp;<a href="https://github.blog/news-insights/research/research-quantifying-github-copilots-impact-on-developer-productivity-and-happiness/">boosting developer productivity by up to 55%</a>, and Spice.ai.</p>'
  }
/>

<CoreBlock name="core-paragraph" content={'<p></p>'} />

<CoreBlock name="core-paragraph" content={'<p></p>'} />

Connecting AI tools to live data is core to Spice: see [LLM inference](/platform/llm-inference) and the [MCP server gateway](/feature/mcp-server-gateway) for agent data access, or [get a demo](/get-a-demo).

<ContentResourceFeatured
  fields={{
    heading: 'Explore more Spice resources',
    paragraph:
      'Tutorials, docs, and blog posts to help you go deeper with Spice.',
    mode: 'related',
    resources: false,
    padding_top: 'unset',
    padding_bottom: 'unset',
    related_posts: [
      {
        title: 'A Developer&#8217;s Guide to Understanding Spice.ai',
        slug: '/blog/a-developers-guide-to-understanding-spice-ai',
        excerpt:
          'This guide helps developers build a mental model of why, how, and where to use Spice.',
        image:
          '/website-assets/media/2026/02/A-developers-guide-to-understanding-Spice.ai_.png',
        type: 'Blog',
        taxonomy: [
          'Engineering',
          'Spice AI',
          'Spice Cloud Platform',
          'Spice OSS',
        ],
      },
      {
        title: 'Real-Time Control Plane Acceleration with DynamoDB Streams ',
        slug: '/blog/real-time-acceleration-with-dynamodb-streams',
        excerpt:
          'How to sync DynamoDB data to thousands of nodes with sub-second latency using a two-tier architecture with DynamoDB Streams and Spice acceleration.',
        image: '/website-assets/media/2026/01/image-33.png',
        type: 'Blog',
        taxonomy: [
          'Data Acceleration',
          'Engineering',
          'Spice Cloud Platform',
          'Spice OSS',
        ],
      },
      {
        title: 'How we use Apache DataFusion at Spice AI',
        slug: '/blog/how-we-use-apache-datafusion-at-spice-ai',
        excerpt:
          'Why we chose to build on DataFusion and how we extended it with custom TableProviders, optimizer rules, and UDFs for federated SQL',
        image:
          '/website-assets/media/2026/01/Engineering-at-Spice-AI-Apache-DataFusion.png',
        type: 'Blog',
        taxonomy: [
          'Spice AI',
          'Spice Cloud Platform',
          'Spice OSS',
          'SQL Federation',
        ],
      },
    ],
  }}
/>

<TalkToAnEngineerCta />

<ContentRichText
  fields={{
    coverage: 'rc-end',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

---

## Spice.ai is now generally available!
URL: https://spice.ai/blog/spice-ai-is-now-generally-available
Date: 2023-10-25T19:34:00
Description: Spice.ai is now available for everyone, including a new community-centric developer hub and Community Edition complimentary for developers.

<ContentRichText
  fields={{
    coverage: 'rc-start',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Powering intelligent applications with composable data and time-series AI building blocks</p>'
  }
/>

<CoreBlock
  name="core-heading"
  content={'<h2 class="wp-block-heading h4">TL;DR</h2>'}
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p><a href="/" target="_blank" rel="noreferrer noopener">Spice.ai</a>, now publicly available, is your hub for building intelligent data and time-series AI applications.</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Get composable, data and AI building blocks, including pre-trained machine learning models for AI predictions, and a petabyte-scale cloud data platform preloaded with 100TB+ of ready-to-use Web3, Asset Prices, and time-series data. Create, fork, and share hosted Datasets, Views, and ML Models with the new GitHub integrated Spice.ai Community Edition - complimentary for developers.</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p><a href="/login?from=landing" target="_blank" rel="noreferrer noopener">Login with GitHub to get started in seconds →</a></p>'
  }
/>

<CoreBlock
  name="core-image"
  content={
    '<figure class="wp-block-image"><img src="https://cdn.prod.website-files.com/6362f59f9fd4ac355fc06eaf/66689ec2964cb726c223304f_1*8LqH4LheapFh2bS47SgoCg.webp" alt="Spice.ai is now generally available!"/></figure>'
  }
/>

<CoreBlock
  name="core-heading"
  content={
    '<h2 class="wp-block-heading h4">Spice.ai is now generally available!</h2>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Since the Waitlisted Preview launch&nbsp;<a target="_blank" href="https://blog.spice.ai/announcing-spice-xyz-94323159cd2b" rel="noreferrer noopener">last year</a>, projects like&nbsp;<a href="https://medium.com/@yakoa/revolutionizing-blockchain-security-yakoa-partners-with-spice-ai-5ff3073c2d7c">Yakoa</a>,&nbsp;<a href="https://twitter.com/eigenlayer/status/1672381350731714560?s=20" target="_blank" rel="noreferrer noopener">EigenLayer</a>, and&nbsp;<a href="https://entendre.finance/" target="_blank" rel="noreferrer noopener">Entendre Finance</a>&nbsp;have leveraged building blocks from Spice AI\'s enterprise-grade platform to create high-performance, highly available, data and AI-driven applications.</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    "<p><strong>Today, we're announcing Spice.ai is publicly available for everyone, including a brand-new community-centric hub and a new Community Edition plan complimentary for developers.</strong></p>"
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Developers now have access to petabyte-scale cloud data and AI infrastructure, preloaded with 100TB+ of Web3, Asset Prices, and time-series data, delivered with SQL,&nbsp;<a href="https://arrow.apache.org/" target="_blank" rel="noreferrer noopener">Apache Arrow</a>, and&nbsp;<a href="https://duckdb.org/" target="_blank" rel="noreferrer noopener">DuckDB</a>. Community members can create, fork, and share datasets, and access data in real-time to power data-driven applications, monitoring, and analytics. Datasets can be fed directly into Spice.ai hosted ML training and inferencing for real-time decision-making applications.</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Spice.ai is an application platform that brings together everything needed to build an intelligent application in one application-centric AI-backend-as-a-service.</p>'
  }
/>

<CoreBlock
  name="core-image"
  content={
    '<figure class="wp-block-image"><img src="https://cdn.prod.website-files.com/6362f59f9fd4ac355fc06eaf/66689ec33949dd5df0f08ec2_1*mRL0-6xyjq2KSC3twWMWZQ.webp" alt="Spice.ai is now generally available!"/></figure>'
  }
/>

<CoreBlock
  name="core-image"
  content={
    '<figure class="wp-block-image"><img src="https://cdn.prod.website-files.com/6362f59f9fd4ac355fc06eaf/66689ec3feb95017b5ed4114_1*Z_mJl5d8Os_js2TW6CzCWg.webp" alt="Spice.ai is now generally available!"/></figure>'
  }
/>

<CoreBlock
  name="core-image"
  content={
    '<figure class="wp-block-image"><img src="https://cdn.prod.website-files.com/6362f59f9fd4ac355fc06eaf/66689ec3938a41ef3049f42f_1*1QJXFhyE0NAS-PbeQZ98EQ.webp" alt="Spice.ai is now generally available!"/></figure>'
  }
/>

<CoreBlock
  name="core-image"
  content={
    '<figure class="wp-block-image"><img src="https://cdn.prod.website-files.com/6362f59f9fd4ac355fc06eaf/66689ec3af8074aa302c8d81_1*ZyGNBuIsSVyF78klkisesw.webp" alt="Spice.ai is now generally available!"/></figure>'
  }
/>

<CoreBlock
  name="core-heading"
  content={
    '<h2 class="wp-block-heading h4">Announcing new building blocks</h2>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    "<p>We're rolling out exciting new tools and features that can take your intelligent application development to the next level.</p>"
  }
/>

<CoreBlock
  name="core-heading"
  content={
    '<h3 class="wp-block-heading h5">Spice Firecache: Turbocharge Your SQL Queries</h3>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p><a href="https://docs.spice.xyz/portal/apps/spice-firecache" target="_blank" rel="noreferrer noopener">Spice Firecache</a>&nbsp;is a real-time, in-memory SQL service based on cloud-scale&nbsp;<a href="https://duckdb.org/" target="_blank" rel="noreferrer noopener">DuckDB</a>&nbsp;instances that enables blazing fast SQL query up to 10x the performance of general SQL query.&nbsp;<a href="https://www.eigenlayer.xyz/" target="_blank" rel="noreferrer noopener">EigenLayer</a>&nbsp;uses Spice Firecache to enable scenarios not possible before, including serving dynamic data to their high traffic dashboards, real-time monitoring, and analytics. ML models hosted on the Spice.ai platform can be paired with Firecache to power fast, low-latency inferencing, as demonstrated by the&nbsp;<a href="/?explore-ai=true#demo" target="_blank" rel="noreferrer noopener">AI predictions demo</a>&nbsp;on the Spice.ai website.</p>'
  }
/>

<CoreBlock
  name="core-list"
  content={
    '<ul class="wp-block-list"><li>If you like DuckDB, you\'ll love it at cloud-scale, automatically provisioned and updated with real-time data.</li></ul>'
  }
/>

<CoreBlock
  name="core-heading"
  content={'<h3 class="wp-block-heading h5">Spice Functions: Beyond SQL</h3>'}
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p><a href="https://docs.spice.xyz/portal/apps/spice-functions" target="_blank" rel="noreferrer noopener">Spice Functions</a>&nbsp;is a&nbsp;<a href="https://www.bacalhau.org/" target="_blank" rel="noreferrer noopener">hosted Bacalhau service</a>&nbsp;for serverless function compute that enables data transformation and processing co-located with your data and machine learning pipelines. Developers can write code in Go or Python. And every Spice Function deployment gets access to a dedicated hosted DuckDB instance for working data.</p>'
  }
/>

<CoreBlock
  name="core-list"
  content={
    '<ul class="wp-block-list"><li>Spice Functions unlocks scenarios that are difficult, expensive, or even impossible in pure SQL, such as adding to a basic accumulator or applying a custom algorithm on each new block of data.</li></ul>'
  }
/>

<CoreBlock
  name="core-image"
  content={
    '<figure class="wp-block-image"><img src="https://cdn.prod.website-files.com/6362f59f9fd4ac355fc06eaf/66689ec324469648befa7d93_1*R7GpsQgbi15cuPAEondxUA.webp" alt="Adding PostgreSQL as an external data source"/><figcaption class="wp-element-caption">Adding PostgreSQL as an external data source.</figcaption></figure>'
  }
/>

<CoreBlock
  name="core-heading"
  content={
    '<h3 class="wp-block-heading h5">Custom Datasets and Views: Your Data, Your Rules</h3>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Developers can tailor Spice data to their application with&nbsp;<a href="https://docs.spice.xyz/portal/apps/datasets-and-views" target="_blank" rel="noreferrer noopener">Custom Datasets and Views</a>, defined in GitHub, alongside their application code. Datasets can be populated with Spice Functions and by connecting to external data sources starting with PostgreSQL. We\'re excited to announce that&nbsp;<a href="https://www.yakoa.io/" target="_blank" rel="noreferrer noopener">Yakoa</a>&nbsp;- IP protection for the blockchain - is one of the first projects to make their NFT data available in the Spice.ai platform with the release of their Copymint datasets.</p>'
  }
/>

<CoreBlock
  name="core-quote"
  content={
    '<blockquote class="wp-block-quote"><p>"Other solutions were prohibitively expensive - what we could do in Spice with a single query would have taken millions of API calls in other platforms." - Andrew Dworschak, CEO &amp; Co-founder of Yakoa</p></blockquote>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>We\'re also making over&nbsp;<a href="https://docs.spice.xyz/reference/sql-query-tables/ethereum/eigenlayer-tables" target="_blank" rel="noreferrer noopener">15 EigenLayer datasets</a>&nbsp;public that ecosystem participants can use to build data-driven experiences, like&nbsp;<a href="https://www.nethermind.io/" target="_blank" rel="noreferrer noopener">Nethermind</a>&nbsp;has done with their&nbsp;<a href="https://restaking.nethermind.io/" target="_blank" rel="noreferrer noopener">Restaking Dashboard</a>. Combined with Spice.ai\'s rich&nbsp;<a href="https://docs.spice.xyz/reference/sql-query-tables/ethereum/beacon-chain-tables" target="_blank" rel="noreferrer noopener">Ethereum Beacon</a>&nbsp;chain data and&nbsp;<a href="https://docs.spice.xyz/api/ethereum/beacon-http-api" target="_blank" rel="noreferrer noopener">HTTP API</a>, observability into the EigenLayer universe has never been easier.</p>'
  }
/>

<CoreBlock
  name="core-image"
  content={
    '<figure class="wp-block-image"><a href="/?explore-ai=true#demo"><img src="https://cdn.prod.website-files.com/6362f59f9fd4ac355fc06eaf/66689ec2c2b08e368db295db_1*46jcge-apAF2-Y3hw2SIEQ.webp" alt="Demo of Spice Firecache accelerated inferencing on Spice.ai hosted ML Models on the Spice.ai website"/></a><figcaption class="wp-element-caption">Demo of Spice Firecache accelerated inferencing on Spice.ai hosted ML Models on the Spice.ai website.</figcaption></figure>'
  }
/>

<CoreBlock
  name="core-heading"
  content={
    '<h3 class="wp-block-heading h5">Spice ML Models: Automated Machine Learning</h3>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Like Datasets and Views, ML Model definitions are synced from GitHub to the Spice.ai platform and connected to Spice.ai hosted data, hosted machine learning pipelines, and Spice Firecache. The entire machine learning data lifecycle from origin to processing to training and inferencing is automatically and seamlessly managed by the Spice.ai platform so that developers can create decision-making applications, such as predicting and responding to resource requirements or mitigating potential security concerns with ease.</p>'
  }
/>

<CoreBlock
  name="core-heading"
  content={'<h3 class="wp-block-heading h5">Summary</h3>'}
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>With the release of Spice Firecache, Spice Functions, Custom Datasets and Views, ML Models, and a community-centric developer hub to build and share datasets like from innovators&nbsp;<a href="https://www.yakoa.io/" target="_blank" rel="noreferrer noopener">Yakoa</a>&nbsp;and&nbsp;<a href="https://www.eigenlayer.xyz/" target="_blank" rel="noreferrer noopener">EigenLayer</a>, developers have the next set of building blocks to ship intelligent software for application and ecosystem observability, real-time monitoring and security, AI-powered IP protection, and more!</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p><a href="/login?from=landing" target="_blank" rel="noreferrer noopener">Try the Spice.ai platform today →</a></p>'
  }
/>

<CoreBlock name="core-paragraph" content={'<p></p>'} />

<CoreBlock name="core-paragraph" content={'<p></p>'} />

To get started with Spice today, explore [SQL query federation and acceleration](/platform/sql-federation-acceleration) and [AI model serving](/feature/ai-model-serving), or [get a demo](/get-a-demo).

<ContentResourceFeatured
  fields={{
    heading: 'Explore more Spice resources',
    paragraph:
      'Tutorials, docs, and blog posts to help you go deeper with Spice.',
    mode: 'related',
    resources: false,
    padding_top: 'unset',
    padding_bottom: 'unset',
    related_posts: [],
  }}
/>

<TalkToAnEngineerCta />

<ContentRichText
  fields={{
    coverage: 'rc-end',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

---

## Faster, Simpler Dashboards with Spice and Power BI
URL: https://spice.ai/blog/spice-and-power-bi
Date: 2025-09-15T18:51:00
Description: Spice AI built a Microsoft Power BI Connector on top of the Flight SQL ADBC driver that makes it easy for Power BI users to query across operational databases, analytical warehouses, and object stores.

<ContentRichText
  fields={{
    coverage: 'rc-start',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<CoreBlock
  name="core-heading"
  content={'<h2 class="wp-block-heading h4">TL;DR</h2>'}
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Spice AI built a&nbsp;<a href="https://spiceai.org/docs/clients/powerbi">Microsoft Power BI Connector</a>&nbsp;on top of the&nbsp;<a href="https://arrow.apache.org/adbc/current/driver/flight_sql.html">Flight SQL ADBC driver</a>&nbsp;that makes it easy for Power BI users to query across operational databases, analytical warehouses, and object stores. Spice federates large OLTP and OLAP datasets and accelerates them at the application layer in DuckDB and Arrow to support sub-second dashboards, driving significant performance and ease-of-use improvements for enterprise BI use cases. Under the hood, Spice leverages Arrow Database Connectivity (ADBC) and Flight SQL for Arrow-native performance that eliminates row-to-column conversion overhead.</p>'
  }
/>

<CoreBlock
  name="core-heading"
  content={'<h2 class="wp-block-heading h4">The Enterprise BI Challenge</h2>'}
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Enterprises rely on Power BI to analyze and visualize data, but the data itself often lives across many systems: operational databases like Postgres or MongoDB, historical datasets in S3 or Delta/Iceberg tables, and real-time streams from systems like Kafka. Traditionally, making this data available in Power BI requires complex ETL pipelines, duplicated storage in various warehouses, and ongoing engineering effort to keep everything in sync. This results in dashboards with slow refresh times and fragile, operationally-intensive pipelines.&nbsp;&nbsp;</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Spice changes this dynamic by combining query federation and local acceleration into a&nbsp;<a href="https://spiceai.org/docs/deployment/architectures">single, lightweight runtime</a>. Instead of copying data into a warehouse, Spice connects directly to distributed systems, federates queries across them, and&nbsp;<a href="https://spiceai.org/docs/features/data-acceleration">accelerates datasets with DuckDB and Apache Arrow</a>&nbsp;at the application layer.&nbsp;</p>'
  }
/>

<CoreBlock
  name="core-heading"
  content={
    '<h2 class="wp-block-heading h4">Introducing the Spice.ai Power BI Connector, Built on ADBC</h2>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>The&nbsp;<a href="https://spiceai.org/docs/clients/powerbi">Spice.ai Power BI Connector</a>&nbsp;sits between Power BI and the systems it needs to query. Data federation removes the need to consolidate sources up front, and Power BI can treat them as if they were a single dataset; analysts can configure Spice once and immediately query across their data estate. For Power BI users, this means dashboards can run on live data from OLTP and OLAP sources without the burden of additional infrastructure management.</p>'
  }
/>

<CoreBlock name="core-paragraph" content={'<p>‍</p>'} />

<CoreBlock
  name="core-image"
  content={
    '<figure class="wp-block-image"><img src="https://cdn.prod.website-files.com/6362f59f9fd4ac355fc06eaf/68c49f890dddea85a95bf069_Federation.png" alt="Federation"/><figcaption class="wp-element-caption">Figure 1: Data Federation in Spice</figcaption></figure>'
  }
/>

<CoreBlock name="core-paragraph" content={'<p>‍</p>'} />

<CoreBlock
  name="core-heading"
  content={
    '<h2 class="wp-block-heading h4">Acceleration with DuckDB &amp; Arrow</h2>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Federation simplifies connectivity, but acceleration delivers performance; the Spice runtime prefetches working sets of data from these upstream systems and locally accelerates them using DuckDB and Apache Arrow. This eliminates repeated network round-trips, stores data closer to applications, and enables sub-second queries - even for billion-row datasets. Data can be refreshed on a schedule or in real time with&nbsp;<a href="https://spiceai.org/docs/features/cdc">CDC</a>, ensuring dashboards always present the latest information.</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Further, unlike traditional lakehouses that focus on analytical workloads, Spice accelerates both operational and analytical data. Teams can query transactional sources like Postgres alongside large analytical datasets in S3, all with the same sub-second performance and without overwhelming production databases. For example, Spice can ingest row-based Postgres tables, accelerate them in DuckDB, and serve the results to Power BI in columnar Arrow format for interactive dashboards.</p>'
  }
/>

<CoreBlock name="core-paragraph" content={'<p>‍</p>'} />

<CoreBlock
  name="core-image"
  content={
    '<figure class="wp-block-image"><img src="https://cdn.prod.website-files.com/6362f59f9fd4ac355fc06eaf/68c49fe091a6255b2ab23433_Acceleration.png" alt="Acceleration"/><figcaption class="wp-element-caption">Figure 2: Acceleration in Spice</figcaption></figure>'
  }
/>

<CoreBlock
  name="core-heading"
  content={'<h3 class="wp-block-heading h5">Decreasing Latency with ADBC</h3>'}
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Under the hood, the Spice.ai Power BI Connector is built on the&nbsp;<a href="https://github.com/apache/arrow-adbc">Arrow Database Connectivity (ADBC)&nbsp;</a>and Flight SQL. ADBC provides a vendor-agnostic, Arrow-native standard for delivering columnar data directly to applications and dashboards. In contrast to JDBC and ODBC, ADBC avoids row/column conversions and provides a faster, more efficient path for analytical queries.</p>'
  }
/>

<CoreBlock
  name="core-heading"
  content={
    '<h2 class="wp-block-heading h4">Use Case Example: Faster Power BI Queries in Spice Compared to RDS</h2>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    "<p>Let's take this out of the abstract and introduce a practical use case to illustrate the value of Spice.</p>"
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Consider an order management platform that previously relied on an AWS RDS database for recent transactions and S3 for longer-term history. Without Spice, a dashboard showing historical orders would require querying RDS directly, moving potentially millions of rows across the network, and joining that data with S3 data in a warehouse. With Spice, those tables can be federated, accelerated locally, and queried directly by Power BI.&nbsp;</p>'
  }
/>

<PostVideo
  fields={{
    thumbnail: false,
    type: 'youtube',
    video_id: 'GtLDHFY0jLA',
    video_title: 'Spice - Microsoft Power BI Demo',
    video_upload_date: '2025-09-15T11:24:56-07:00',
    video_channel: 'Spice AI',
    video_description: 'Demo of connecting Microsoft Power BI to Spice.',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<CoreBlock
  name="core-paragraph"
  content={
    "<p>The video illustrates the performance delta between Spice's acceleration model (the dashboard on the right side of the screen) and a more traditional approach of querying RDS directly (the dashboard on the left side of the screen): query time is decreased from 1324 ms to 223 ms with Spice compared to RDS.&nbsp;<strong>That's the difference between a clunky analyst experience and an interactive, real-time workflow.</strong></p>"
  }
/>

<CoreBlock name="core-paragraph" content={'<p>‍</p>'} />

<CoreBlock
  name="core-image"
  content={
    '<figure class="wp-block-image"><img src="https://cdn.prod.website-files.com/6362f59f9fd4ac355fc06eaf/68c87bbb3c167a28e6c32934_5595f980.png" alt="Power BI Performance analyzer comparing query duration for Postgres on AWS RDS versus Spice.ai OSS Direct Query"/></figure>'
  }
/>

<CoreBlock name="core-paragraph" content={'<p>‍</p>'} />

<CoreBlock
  name="core-heading"
  content={'<h3 class="wp-block-heading h5">Before (without Spice)</h3>'}
/>

<CoreBlock
  name="core-list"
  content={
    '<ul class="wp-block-list"><li>Data must be moved into a warehouse via ETL jobs.</li><li>Dashboards refresh slowly because data flows through JDBC/ODBC, converting columnar to row back to column again.</li><li>Engineering teams maintain multiple pipelines and troubleshoot schema mismatches.</li></ul>'
  }
/>

<CoreBlock
  name="core-heading"
  content={'<h3 class="wp-block-heading h5">After (with Spice + ADBC)</h3>'}
/>

<CoreBlock
  name="core-list"
  content={
    '<ul class="wp-block-list"><li>Both Postgres and S3 datasets are defined in a&nbsp;<a href="https://spiceai.org/docs/getting-started/spicepods">Spicepod</a>&nbsp;(the core configuration unit in Spice, a YAML-based package that defines the datasets, models, and acceleration an application requires).&nbsp;</li><li>Power BI connects to Spice through the ADBC-based connector.</li><li>Federated queries run directly across both sources; results return in Arrow format with no row/column conversions.</li><li>Data stored in Postgres is accelerated in DuckDB.</li><li>Dashboards refresh in sub-seconds. Pipelines are eliminated, and analysts can build new reports faster.</li></ul>'
  }
/>

<CoreBlock
  name="core-heading"
  content={
    '<h2 class="wp-block-heading h4">Walkthrough: Installing and Using the Connector</h2>'
  }
/>

<CoreBlock
  name="core-heading"
  content={'<h3 class="wp-block-heading h5">Power BI Desktop</h3>'}
/>

<CoreBlock
  name="core-list"
  content={
    '<ol class="wp-block-list"><li>Download the latest<code>&nbsp;spice_adbc.mez</code>&nbsp;file from the&nbsp;<a href="https://github.com/spiceai/powerbi-connector/releases">releases page</a>&nbsp;</li><li>Copy to the Power BI&nbsp;<code>Custom Connectors</code>&nbsp;directory:<code>&nbsp;C:\\Users\\[USERNAME]\\Documents\\Microsoft Power BI Desktop\\Custom Connectors</code></li></ol>'
  }
/>

```python
Invoke-WebRequest -Uri "https://github.com/spiceai/powerbi-connector/releases/latest/download/spice_adbc.mez" -OutFile "C:\Users\[USERNAME]\Documents\Microsoft Power BI Desktop\Custom Connectors\spice_adbc.mez"
```

<CoreBlock
  name="core-list"
  content={
    '<ol start="3" class="wp-block-list"><li>‍<a href="https://learn.microsoft.com/en-us/power-bi/connect-data/desktop-connector-extensibility#custom-connectors">&nbsp;Enable Uncertified Connectors</a>&nbsp;in Power BI Desktop settings and restart Power BI Desktop.</li></ol>'
  }
/>

<CoreBlock
  name="core-heading"
  content={'<h3 class="wp-block-heading h5">Adding Spice as a Data Source</h3>'}
/>

<CoreBlock
  name="core-list"
  content={
    '<ol class="wp-block-list"><li>Open Power BI Desktop.</li><li>Click on&nbsp;<code>Get Data</code>&nbsp;→&nbsp;<code>More....</code></li><li>In the dialog, select&nbsp;<code>Spice.ai</code>&nbsp;connector.</li></ol>'
  }
/>

<CoreBlock
  name="core-image"
  content={
    '<figure class="wp-block-image"><img src="https://cdn.prod.website-files.com/6362f59f9fd4ac355fc06eaf/68c87bd74c1a8f47331eb9b9_87f7b42f.png" alt="Power BI Get Data dialog with the Spice.ai connector selected"/></figure>'
  }
/>

<CoreBlock name="core-paragraph" content={'<p>‍</p>'} />

<CoreBlock
  name="core-list"
  content={
    '<ol start="4" class="wp-block-list"><li>Click&nbsp;<code>Connect</code>.</li><li>Enter the&nbsp;<strong>ADBC (Arrow Flight SQL) Endpoint</strong>:<ul class="wp-block-list"><li>For Spice Cloud Platform:<br><code>grpc+tls://flight.spiceai.io:443</code><br><em>(Use the region-specific address if applicable.)</em>‍</li><li>For on-premises/self-hosted Spice.ai:<ul class="wp-block-list"><li>Without TLS (default):&nbsp;<code>grpc://&lt;server-ip&gt;:50051</code>‍</li><li>With TLS:&nbsp;<code>grpc+tls://&lt;server-ip&gt;:50051</code></li></ul></li></ul></li></ol>'
  }
/>

<CoreBlock
  name="core-image"
  content={
    '<figure class="wp-block-image"><img src="https://cdn.prod.website-files.com/6362f59f9fd4ac355fc06eaf/68c87c0d3687b06aec7d9327_3fba0d4e.png" alt="Spice.ai connection dialog in Power BI with the ADBC endpoint and DirectQuery mode"/></figure>'
  }
/>

<CoreBlock
  name="core-list"
  content={
    '<ol start="6" class="wp-block-list"><li>Select the&nbsp;<code>Data Connectivity</code>&nbsp;mode:<ul class="wp-block-list"><li><strong>Import</strong>: Data is loaded into Power BI, enabling extensive functionality but requiring periodic refreshes and sufficient local memory to accommodate the dataset.</li><li><strong>DirectQuery</strong>: Queries are executed directly against Spice in real-time, providing fast performance even on large datasets by leveraging Spice\'s optimized query engine.</li></ul></li><li>Click&nbsp;<code>OK</code>.</li><li>Select&nbsp;<code>Authentication</code>&nbsp;option:<ul class="wp-block-list"><li><strong>Anonymous</strong>: Select for unauthenticated on-premises deployments.</li></ul></li></ol>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p><strong>API Key</strong>: Your Spice.ai API key for authentication (required for Spice Cloud). Follow the&nbsp;<a href="https://spiceai.org/docs/portal/apps/api-keys">guide</a>&nbsp;to obtain it from the Spice Cloud portal.</p>'
  }
/>

<CoreBlock
  name="core-image"
  content={
    '<figure class="wp-block-image"><img src="https://cdn.prod.website-files.com/6362f59f9fd4ac355fc06eaf/68c87c1bde144a394c637f82_2aef786b.png" alt="Power BI authentication dialog for the Spice.ai connection with the API Key option selected"/></figure>'
  }
/>

<CoreBlock
  name="core-list"
  content={
    '<ol start="9" class="wp-block-list"><li>Click&nbsp;<code>Connect</code>&nbsp;to establish the connection.</li></ol>'
  }
/>

<CoreBlock
  name="core-heading"
  content={'<h3 class="wp-block-heading h5">Working with Spice datasets</h3>'}
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>After establishing a connection, Spice datasets appear under their respective schemas, with the default schema being&nbsp;<code>spice.public</code>. When writing native queries, use the&nbsp;<code>PostgreSQL</code>&nbsp;dialect, as Spice is built on this standard.</p>'
  }
/>

<CoreBlock
  name="core-image"
  content={
    '<figure class="wp-block-image"><img src="https://cdn.prod.website-files.com/6362f59f9fd4ac355fc06eaf/68c87c2a072d36d1a971fca4_00757f2b.png" alt="Power BI Navigator browsing Spice datasets with the nyc_taxi_tripdata table preview"/></figure>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>For a list of supported data types, visit the docs&nbsp;<a href="https://spiceai.org/docs/clients/powerbi#supported-data-types">here</a>.</p>'
  }
/>

<CoreBlock
  name="core-heading"
  content={
    '<h3 class="wp-block-heading h5">Getting started with Spice and Power BI</h3>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Spice extends Power BI beyond the traditional limits imposed on it by sub-optimal ETL pipelines.</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={'<p>Spice enables Power BI users to:</p>'}
/>

<CoreBlock
  name="core-list"
  content={
    '<ul class="wp-block-list"><li>Run federated SQL queries across disparate data sources in one place with zero ETL required.&nbsp;</li><li>Accelerate and materialize large datasets for sub-second dashboards in Power BI.</li><li>Use either Import Mode for full feature access or DirectQuery Mode for real-time results.</li><li>Build on open standards like ADBC and Apache Arrow, not on proprietary SDKs.</li></ul>'
  }
/>

<CoreBlock name="core-paragraph" content={'<p>‍</p>'} />

<CoreBlock
  name="core-paragraph"
  content={
    '<p>To try it out, download the<a href="https://github.com/spiceai/powerbi-connector">&nbsp;Spice Power BI Connector</a>&nbsp;and follow the<a href="https://spiceai.org/docs/clients/powerbi">&nbsp;documentation</a>. Configure your first dataset, connect Power BI, and experience how federation and acceleration can make your dashboards faster and more reliable.</p>'
  }
/>

<CoreBlock
  name="core-heading"
  content={'<h3 class="wp-block-heading h5">Resources</h3>'}
/>

<CoreBlock
  name="core-list"
  content={
    '<ul class="wp-block-list"><li><a href="/login?from=landing">Sign up</a>&nbsp;for Spice Cloud for free, or&nbsp;<a href="https://spiceai.org/docs/getting-started">get started</a>&nbsp;with Spice Open Source</li><li><a href="https://github.com/spiceai/powerbi-connector">Install the connector</a></li><li>Explore the Spice&nbsp;<a href="/cookbook">cookbooks</a>&nbsp;and&nbsp;<a href="https://spiceai.org/docs">docs</a>&nbsp;</li></ul>'
  }
/>

<CoreBlock name="core-paragraph" content={'<p></p>'} />

Behind the connector, [SQL query federation and acceleration](/platform/sql-federation-acceleration) keeps dashboards fast without ETL; see the [analytics use case](/use-case/analytics) for more. To evaluate Spice with Power BI, [get a demo](/get-a-demo).

## Frequently Asked Questions

### Do I need to install anything to connect Power BI to Spice?

Yes, you install the Spice connector file once in Power BI Desktop. Download `spice_adbc.mez` from the GitHub releases page and copy it to the Power BI `Custom Connectors` folder. Then turn on uncertified connectors in the Power BI Desktop settings and restart Power BI Desktop. After this one-time setup, Power BI queries Spice without ETL pipelines.

### Should I use Import mode or DirectQuery mode with the Spice connector?

Use DirectQuery mode when dashboards need real-time results on large datasets. DirectQuery sends each query to Spice, which accelerates data in DuckDB and Apache Arrow. Use Import mode when a report needs Power BI features that require local data. Import mode loads the dataset into Power BI memory and needs periodic refreshes.

### What is ADBC and why does it matter for Power BI dashboards?

ADBC (Arrow Database Connectivity) is a vendor-neutral, Arrow-native standard for moving columnar data into applications. JDBC and ODBC convert columnar data to rows and back, which slows analytical queries. ADBC removes those conversions, so query results reach Power BI dashboards faster.

### How much faster are Power BI queries with Spice?

In Spice AI's 2025 order-management demo, Power BI query time dropped from 1324 ms querying AWS RDS directly to 223 ms with Spice. Spice prefetches working sets from source systems and accelerates them locally in DuckDB and Apache Arrow. This cuts repeated network round-trips, so queries return in under a second even on billion-row datasets.

### Can Power BI query PostgreSQL and S3 in the same dashboard through Spice?

Yes, Spice federates queries across operational databases, warehouses, and object stores like S3. Power BI queries them as one dataset through the connector, without copying data into a warehouse first. [Query federation and acceleration](/platform/sql-federation-acceleration) removes the need to consolidate sources before analysis.

### How does Power BI data stay fresh when Spice accelerates it?

Spice refreshes accelerated datasets on a schedule or in real time through change data capture (CDC). Dashboards then present current data without a manual refresh pipeline. This keeps [operational analytics](/platform/analytics) current without adding load to production databases.

### What SQL dialect do native queries use with the Spice connector?

Native queries use the PostgreSQL dialect because Spice builds on the PostgreSQL standard. After you connect, Spice datasets appear under their schemas, and the default schema is `spice.public`.

### How does authentication work with the Spice Power BI connector?

Spice Cloud connections require an API key, which you create in the Spice Cloud portal. Unauthenticated on-premises deployments can select the Anonymous option instead.

<ContentResourceFeatured
  fields={{
    heading: 'Explore more Spice resources',
    paragraph:
      'Tutorials, docs, and blog posts to help you go deeper with Spice.',
    mode: 'related',
    resources: false,
    padding_top: 'unset',
    padding_bottom: 'unset',
    related_posts: [],
  }}
/>

<TalkToAnEngineerCta />

<ContentRichText
  fields={{
    coverage: 'rc-end',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

---

## Spice Cloud v1.10: Caching Acceleration Mode, DynamoDB Streams Support, & More!
URL: https://spice.ai/blog/spice-cloud-v1-10
Date: 2025-12-10T18:30:11
Description: Spice v1.10 includes a new caching acceleration mode, a new DynamoDB Streams data connector in preview, Amazon S3 location-based pruning, S3 Tables write support, and several performance and security improvements.

<ContentRichText
  fields={{
    coverage: 'rc-start',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<CoreBlock
  name="core-paragraph"
  content={'<p>Spice Cloud &amp; Spice.ai Enterprise 1.10 are live!</p>'}
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Spice v1.10 includes a&nbsp;new <strong>caching acceleration&nbsp;mode</strong>, a new <strong>DynamoDB Streams</strong> data connector in preview, <strong>Amazon S3 location-based pruning,</strong>&nbsp;<strong>S3&nbsp;Tables write support</strong>, and several performance and security improvements.</p>'
  }
/>

<CoreBlock
  name="core-heading"
  content={
    '<h2 class="wp-block-heading h4">New in Spice Cloud: Persisted Metrics!</h2>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>View complete monitoring history&nbsp;after restarts, ensuring&nbsp;no gaps in visibility.</p>'
  }
/>

<CoreBlock
  name="core-image"
  content={
    '<figure class="wp-block-image size-large"><img src="/website-assets/media/2025/12/Spice-Cloud-Persisted-Metrics-1024x668.png" alt="Spice Cloud Persisted Metrics" class="wp-image-1671"/></figure>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Spice Cloud customers will automatically upgrade to v1.10 on&nbsp;<a href="/login?from=landing">deployment</a>, while Spice.ai Enterprise customers can consume the Enterprise v1.9.0 image from the&nbsp;<a href="https://aws.amazon.com/marketplace/pp/prodview-jmf6jskjvnq7i">Spice AWS Marketplace listing</a>.</p>'
  }
/>

<CoreBlock
  name="core-heading"
  content={'<h2 class="wp-block-heading h4">What\'s New in v1.10</h2>'}
/>

<CoreBlock
  name="core-heading"
  content={'<h3 class="wp-block-heading h5">Caching Acceleration Mode</h3>'}
/>

<CoreBlock
  name="core-paragraph"
  content={
    "<p>Spice's new <strong>caching</strong> acceleration mode provides stale-while-revalidate (SWR) behavior for accelerations with background refreshes, enabling file-persisted caching using Cayenne, DuckDB, or SQLite.</p>"
  }
/>

<CoreBlock
  name="core-image"
  content={
    '<figure class="wp-block-image aligncenter size-large text-center"><img src="/website-assets/media/2025/12/Cache-Accelerator-Image-1024x652.png" alt="Spicepod.yaml caching acceleration configuration example" class="wp-image-1672"/><figcaption class="wp-element-caption">Figure 1: Spicepod.yaml caching acceleration configuration example</figcaption></figure>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Learn more about getting started with caching accelerator in&nbsp;<a href="https://spiceai.org/docs/features/data-acceleration">in the acceleration docs</a>.</p>'
  }
/>

<CoreBlock
  name="core-heading"
  content={
    '<h2 class="wp-block-heading h4">DynamoDB Streams Support (Preview)</h2>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>The DynamoDB connector now integrates with DynamoDB Streams, enabling <a href="/feature/real-time-change-data-capture">real-time change-data-capture (CDC)</a> for DynamoDB with automatic table bootstrapping and acceleration snapshots support. </p>'
  }
/>

<CoreBlock
  name="core-image"
  content={
    '<figure class="wp-block-image size-large text-center"><img src="/website-assets/media/2025/12/Dynamo-Streams-Image-1024x652.png" alt="DynamoDB Streams Spicepod.yaml configuration example" class="wp-image-1673"/><figcaption class="wp-element-caption">Figure 2: DynamoDB Streams Spicepod.yaml configuration example</figcaption></figure>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Learn more about using DynamoDB Streams<a href="https://spiceai.org/docs/components/data-connectors/dynamodb#streams"> in the docs</a>. </p>'
  }
/>

<CoreBlock
  name="core-heading"
  content={
    '<h2 class="wp-block-heading h4">S3 Data Connector Improvements </h2>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>The S3 data connector&nbsp;now supports&nbsp;location-based predicate pruning - dramatically&nbsp;reducing data scanned by pushing down location filter predicates to S3 listing operations. And, AWS S3 Tables now have full read/write capability&nbsp;in Spice!</p>'
  }
/>

<CoreBlock
  name="core-image"
  content={
    '<figure class="wp-block-image size-large text-center"><img src="/website-assets/media/2025/12/Location-based-predicate-pruning-1024x779.png" alt="Location Based Predicate Pruning" class="wp-image-1674"/><figcaption class="wp-element-caption">Figure 3: Location-based predicate pruning example</figcaption></figure>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p><a href="https://spiceai.org/docs/components/data-connectors/s3">Learn more</a> in the S3 data connector docs.</p>'
  }
/>

<CoreBlock
  name="core-heading"
  content={
    '<h2 class="wp-block-heading h4">TinyLFU Cache Eviction Policy </h2>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>TinyLFU is now available for the SQL results cache!&nbsp;TinyLFU is a probabilistic cache admission policy that maintains higher hit rates than LRU (Least Recently Used) while keeping memory usage predictable, making it ideal for workloads with uneven query patterns</p>'
  }
/>

<CoreBlock
  name="core-image"
  content={
    '<figure class="wp-block-image size-large text-center"><img src="/website-assets/media/2025/12/TinyLFU-Example-1024x652.png" alt="TinyLFU Example" class="wp-image-1676"/><figcaption class="wp-element-caption">Figure 4: TinyLFU configuration example</figcaption></figure>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Learn more in the <a href="https://spiceai.org/docs/features/caching">caching docs</a>.</p>'
  }
/>

<CoreBlock
  name="core-heading"
  content={'<h2 class="wp-block-heading h4">Additional Updates</h2>'}
/>

<CoreBlock
  name="core-list"
  content={
    '<ul class="wp-block-list"><li><a href="/platform/hybrid-sql-search">Search</a> optimizations for faster full-text-search (FTS) queries, reduced vector index overhead, and better limit pushdown.</li><li>Security hardening including stronger identifier handling, expanded token redaction, and safe archive extraction.</li><li>Developer experience updates including new health probe latency metrics and REPL history improvements.&nbsp;</li></ul>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>For more details on v1.10, visit the&nbsp;<a href="https://spiceai.org/releases/v1.10.0">release notes</a>.</p>'
  }
/>

<CoreBlock
  name="core-heading"
  content={'<h2 class="wp-block-heading h3">New to the Spice Cookbook</h2>'}
/>

<CoreBlock
  name="core-heading"
  content={'<h3 class="wp-block-heading h5">DynamoDB Streams</h3>'}
/>

<CoreBlock
  name="core-image"
  content={
    '<figure class="wp-block-image size-large"><img src="/website-assets/media/2025/12/DynamoDB-Streams-Cookbook-1-1024x579.png" alt="DynamoDB Streams cookbook recipe" class="wp-image-1679"/></figure>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Learn how to configure a Spice dataset to stream real-time changes from an AWS-hosted DynamoDB table using DynamoDB Streams. Watch as&nbsp;inserts, updates, and deletes automatically flow into Spice!</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Try the DynamoDB Streams cookbook <a href="https://github.com/spiceai/cookbook/tree/trunk/dynamodb/streams">here</a>. </p>'
  }
/>

<CoreBlock
  name="core-heading"
  content={'<h3 class="wp-block-heading h5">Caching Accelerator </h3>'}
/>

<CoreBlock
  name="core-image"
  content={
    '<figure class="wp-block-image size-large"><img src="/website-assets/media/2025/12/Caching-Accelerator-Cookbook-1024x579.png" alt="Caching Accelerator Cookbook" class="wp-image-1680"/></figure>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>This recipe walks you through the setup and core functionality for the new&nbsp;<a href="/use-case/datalake-accelerator">caching accelerator</a>, which provides intelligent caching for HTTP-based datasets with Stale-While-Revalidate (SWR) support.</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Try the caching accelerator cookbook <a href="https://github.com/spiceai/cookbook/tree/trunk/caching/accelerator">here</a>. </p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p><a href="https://meetings.hubspot.com/vladi-semenov">Schedule a demo</a>&nbsp;if you\'d like to see the product live or have any questions, <a href="/login?from=landing">sign up</a>&nbsp;for Spice Cloud for free, or&nbsp;<a href="https://spiceai.org/docs/getting-started">get started</a>&nbsp;with Spice Open Source.</p>'
  }
/>

You can also [get a demo](/get-a-demo) or compare [Spice Cloud pricing plans](/pricing).

<ContentResourceFeatured
  fields={{
    heading: 'Explore more Spice resources',
    paragraph:
      'Tutorials, docs, and blog posts to help you go deeper with Spice.',
    mode: 'related',
    resources: false,
    padding_top: 'unset',
    padding_bottom: 'unset',
    related_posts: [],
  }}
/>

<TalkToAnEngineerCta />

<ContentRichText
  fields={{
    coverage: 'rc-end',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

---

## Spice Cloud v1.11: Spice Cayenne Reaches Beta, Apache DataFusion v51, DynamoDB Streams Improvements, & More
URL: https://spice.ai/blog/spice-cloud-v1-11
Date: 2026-01-30T17:56:27
Description: v1.11 brings Spice Cayenne to Beta, DataFusion v51 and Apache Arrow v57.2, improved DynamoDB Streams, and more.

<ContentRichText
  fields={{
    coverage: 'rc-start',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<CoreBlock
  name="core-paragraph"
  content={
    "<p>We're excited to announce Spice v1.11 is now available in Spice Cloud - a major release with over 43 new features, improvements, and fixes. <br> <br>Spice v1.11 brings Spice Cayenne to Beta with 3x lower memory usage than DuckDB, significant performance upgrades across the entire compute stack: DataFusion v51, Apache Arrow v57.2, improved DynamoDB Streams, and an optimized caching acceleration mode. <br> <br>And, Spice Cloud monitoring has new real-time metrics and dashboards! </p>"
  }
/>

<CoreBlock
  name="core-heading"
  content={
    '<h2 class="wp-block-heading h4"><strong>Monitor&nbsp;your&nbsp;Spice Cloud&nbsp;apps&nbsp;in production&nbsp;</strong></h2>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>New real-time dashboards give you complete visibility into API performance, data egress, and cache&nbsp;efficiency&nbsp;- so you can&nbsp;optimize&nbsp;costs and catch issues before they&nbsp;impact&nbsp;users.&nbsp;</p>'
  }
/>

<CoreBlock
  name="core-image"
  content={
    '<figure class="wp-block-image size-large"><img src="/website-assets/media/2026/01/HTTP-and-Flight-API-Dashboards-1-1024x661.png" alt="Spice Cloud HTTP Metrics dashboard charting request rate by route, request rate by status code, and p95 and p99 request latency" class="wp-image-1905"/><figcaption class="wp-element-caption"><em>Figure 1. HTTP and Flight API request dashboards for insights into volume, latency, and query performance.</em></figcaption></figure>'
  }
/>

<CoreBlock name="core-paragraph" content={'<p></p>'} />

<CoreBlock
  name="core-image"
  content={
    '<figure class="wp-block-image size-large"><img src="/website-assets/media/2026/01/Egress-and-Cache-Dashboards-1024x796.png" alt="Track data egress costs and cache hit rates in real-time" class="wp-image-1906"/><figcaption class="wp-element-caption"><em>Figure 2.&nbsp;Track data egress costs and cache hit rates in real-time.</em>&nbsp;</figcaption></figure>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p><em>New&nbsp;to Spice&nbsp;Cloud?&nbsp;</em><a href="/login" target="_blank" rel="noreferrer noopener"><em>Sign up</em></a>&nbsp;and get $25 in free AI credits. Query&nbsp;databases, data lakes, and data warehouses,&nbsp;add instant&nbsp;RAG and&nbsp;AI analysis with zero-ETL.&nbsp;(<em>US customers only</em>).&nbsp;</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Spice Cloud customers will automatically upgrade to v1.10 on&nbsp;<a href="/login?from=landing">deployment</a>, while Spice.ai Enterprise customers can consume the Enterprise v1.9.0 image from the&nbsp;<a href="https://aws.amazon.com/marketplace/pp/prodview-jmf6jskjvnq7i">Spice AWS Marketplace listing</a>.</p>'
  }
/>

<CoreBlock
  name="core-heading"
  content={
    '<h2 class="wp-block-heading h4"><strong>Join the v1.11 Release Community Call&nbsp;</strong></h2>'
  }
/>

<CoreBlock
  name="core-image"
  content={
    '<figure class="wp-block-image size-full"><img src="/website-assets/media/2026/01/Spice-v1.11-Release-Community-Call.png" alt="Spice v1.11 release community call" class="wp-image-1911"/></figure>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    "<p>Connect with&nbsp;the Spice team and community for live demos of&nbsp;what's&nbsp;new&nbsp;in v1.11. Ask questions, share feedback, and get a preview&nbsp;of&nbsp;what's&nbsp;next.&nbsp;</p>"
  }
/>

<CoreBlock
  name="core-buttons"
  content={
    '<div class="wp-block-buttons"><div class="wp-block-button"><a class="wp-block-button__link wp-element-button" href="https://us06web.zoom.us/meeting/register/mfggVg6wSaiXPT41wWyOxA">Register for the call</a></div></div>'
  }
/>

<CoreBlock
  name="core-heading"
  content={
    '<h2 class="wp-block-heading h3"><strong>Major v1.11 Features</strong></h2>'
  }
/>

<CoreBlock
  name="core-heading"
  content={
    '<h3 class="wp-block-heading h4"><strong>Spice Cayenne Beta&nbsp;</strong></h3>'
  }
/>

<CoreBlock
  name="core-image"
  content={
    '<figure class="wp-block-image size-large"><img src="/website-assets/media/2025/12/TPCH-Benchmark-1024x1024.png" alt="Spice Cayenne TPCH Benchmark" class="wp-image-1722"/><figcaption class="wp-element-caption">Figure 3. Spice Cayenne TPC-H SF-100 benchmark </figcaption></figure>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p><a href="/blog/introducing-spice-cayenne-data-accelerator" target="_blank" rel="noreferrer noopener">Spice Cayenne</a>,&nbsp;the&nbsp;premier&nbsp;Spice&nbsp;data&nbsp;accelerator&nbsp;built on&nbsp;the&nbsp;<a href="https://github.com/vortex-data/vortex" target="_blank" rel="noreferrer noopener">Vortex columnar format,</a>&nbsp;has been promoted to Beta.&nbsp;Cayenne delivers&nbsp;<strong><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-black-color">1.4x faster queries than&nbsp;DuckDB&nbsp;with 3x lower memory usage</mark></strong>&nbsp;on TPC-H SF100 benchmarks.&nbsp;</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p><strong>New Cayenne&nbsp;features&nbsp;in v1.11&nbsp;include:</strong>&nbsp;</p>'
  }
/>

<CoreBlock
  name="core-list"
  content={
    '<ul class="wp-block-list"><li><strong><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-black-color">Acceleration Snapshots:</mark></strong><em><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-black-color">&nbsp;</mark></em>Point-in-time recovery&nbsp;for fast bootstrap and rollback capabilities&nbsp;</li><li><strong><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-black-color">Key-based&nbsp;Deletion Vectors:&nbsp;</mark></strong>More&nbsp;efficient&nbsp;data management and faster&nbsp;delete&nbsp;operations&nbsp;</li><li><strong><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-black-color">S3 Express One Zone:</mark></strong><em>&nbsp;</em>Store Cayenne files in S3 Express One Zone for single-digit millisecond latency&nbsp;</li><li><strong><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-black-color">Primary Key On-Conflict&nbsp;Handling:</mark>&nbsp;</strong>New `<code>on_conflict</code>`&nbsp;config for Cayenne tables with primary keys supports&nbsp;upsert&nbsp;or duplicate-ignore behavior&nbsp;</li></ul>'
  }
/>

<CoreBlock
  name="core-buttons"
  content={
    '<div class="wp-block-buttons alignwide"><div class="wp-block-button"><a class="wp-block-button__link has-text-align-center wp-element-button" href="https://spiceai.org/docs/components/data-accelerators/cayenne">Spice Cayenne Documentation</a></div></div>'
  }
/>

<CoreBlock
  name="core-heading"
  content={
    '<h3 class="wp-block-heading h4"><strong>Apache&nbsp;DataFusion&nbsp;v51&nbsp;Upgrade&nbsp;</strong></h3>'
  }
/>

<CoreBlock
  name="core-image"
  content={
    '<figure class="wp-block-image size-large"><a href="https://datafusion.apache.org/blog/2025/11/25/datafusion-51.0.0/"><img src="/website-assets/media/2026/01/DataFusion-v51-1024x404.png" alt="Apache DataFusion performance improvements. Source: DataFusion docs" class="wp-image-1907"/></a><figcaption class="wp-element-caption">Figure 4: Apache DataFusion performance improvements. Source: DataFusion docs. </figcaption></figure>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>DataFusion&nbsp;v51 brings significant performance improvements and new SQL&nbsp;functionality:&nbsp;</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p><strong><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-black-color">Performance:&nbsp;</mark></strong></p>'
  }
/>

<CoreBlock
  name="core-list"
  content={
    '<ul class="wp-block-list"><li>Faster CASE expression evaluation with short-circuit optimization&nbsp;</li><li>Better defaults for remote Parquet reads (avoids 2 I/O requests per file)&nbsp;</li><li>4x faster Parquet metadata parsing&nbsp;&nbsp;</li></ul>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p><strong><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-black-color">New SQL features:&nbsp;</mark></strong></p>'
  }
/>

<CoreBlock
  name="core-list"
  content={
    '<ul class="wp-block-list"><li>Support for&nbsp;<code>|&gt;</code>&nbsp;syntax&nbsp;for inline transforms&nbsp;</li><li><code>`DESCRIBE &lt;query&gt;`</code>&nbsp;returns&nbsp;schema&nbsp;of any query without executing it&nbsp;&nbsp;</li><li>Named function arguments&nbsp;<code>`param =&gt; value`</code> syntax for scalar, aggregate, and window functions&nbsp;</li><li>Decimal32/Decimal64 type support&nbsp;</li></ul>'
  }
/>

<CoreBlock
  name="core-buttons"
  content={
    '<div class="wp-block-buttons"><div class="wp-block-button"><a class="wp-block-button__link wp-element-button" href="https://datafusion.apache.org/blog/2025/11/25/datafusion-51.0.0/">DataFusion v51 Docs</a></div></div>'
  }
/>

<CoreBlock
  name="core-heading"
  content={
    '<h3 class="wp-block-heading h4"><strong>Apache Arrow 57.2&nbsp;Upgrade&nbsp;</strong></h3>'
  }
/>

<CoreBlock
  name="core-image"
  content={
    '<figure class="wp-block-image size-large"><img src="/website-assets/media/2026/01/Apache-Arrow-1024x648.png" alt="Apache Parquet performance with Thrift Parser" class="wp-image-1908"/><figcaption class="wp-element-caption">Figure 5. Apache Parquet performance with Thrift Parser.</figcaption></figure>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={'<p>Arrow 57.2 delivers major performance improvements:&nbsp;</p>'}
/>

<CoreBlock
  name="core-list"
  content={
    '<ul class="wp-block-list"><li>4x faster Parquet metadata parsing with rewritten thrift&nbsp;metadata&nbsp;parser&nbsp;</li><li>Parquet Variant Support (Experimental): Read/write support for semi-structured data&nbsp;</li><li>Parquet Geometry Support: Read/write for&nbsp;<code>`GEOMETRY`</code> and <code>`GEOGRAPHY`</code>&nbsp;types&nbsp;</li><li>New&nbsp;`arrow-avro`&nbsp;Crate: Efficient&nbsp;conversion&nbsp;between Apache Avro and&nbsp;Arrow with projection pushdown&nbsp;</li></ul>'
  }
/>

<CoreBlock
  name="core-buttons"
  content={
    '<div class="wp-block-buttons"><div class="wp-block-button"><a class="wp-block-button__link wp-element-button" href="https://arrow.apache.org/blog/2025/10/30/arrow-rs-57.0.0/">Apache Arrow Docs</a></div></div>'
  }
/>

<CoreBlock
  name="core-heading"
  content={
    '<h3 class="wp-block-heading h4"><strong>DynamoDB&nbsp;Connector&nbsp;&amp; DynamoDB Streams&nbsp;Improvements&nbsp;</strong></h3>'
  }
/>

<CoreBlock
  name="core-image"
  content={
    '<figure class="wp-block-image size-large"><img src="/website-assets/media/2025/12/Dynamo-Streams-Image-1024x652.png" alt="DynamoDB Streams configuration" class="wp-image-1673"/><figcaption class="wp-element-caption">Figure 6. DynamoDB Streams configuration. </figcaption></figure>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>DynamoDB Streams are now more reliable and flexible with JSON nesting support and improved batch deletion handling.&nbsp;</p>'
  }
/>

<CoreBlock
  name="core-buttons"
  content={
    '<div class="wp-block-buttons"><div class="wp-block-button"><a class="wp-block-button__link wp-element-button" href="https://spiceai.org/docs/components/data-connectors/dynamodb">DynamoDB Connector Docs</a></div></div>'
  }
/>

<CoreBlock
  name="core-heading"
  content={
    '<h3 class="wp-block-heading h4"><strong>Caching Acceleration Mode Improvements&nbsp;</strong></h3>'
  }
/>

<CoreBlock
  name="core-image"
  content={
    '<figure class="wp-block-image size-large"><img src="/website-assets/media/2026/01/Cache-Acceleration-Mode-1024x652.png" alt="Cache Acceleration Mode" class="wp-image-1909"/><figcaption class="wp-element-caption">Figure 6. Sample caching acceleration mode configuration. </figcaption></figure>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Major performance optimizations and reliability fixes&nbsp;for caching acceleration mode&nbsp;deliver&nbsp;sub-millisecond cached queries with faster response times on cache misses.&nbsp;</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p><strong><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-black-color">Performance:&nbsp;</mark></strong></p>'
  }
/>

<CoreBlock
  name="core-list"
  content={
    '<ul class="wp-block-list"><li><strong><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-black-color">Non-blocking cache writes:</mark></strong> Cache misses no longer block query responses;&nbsp;data writes asynchronously&nbsp;</li><li><strong><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-black-color">Batch cache writes:</mark></strong> Multiple entries written in batches for better throughput&nbsp;</li></ul>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p><strong><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-black-color">Reliability:&nbsp;</mark></strong></p>'
  }
/>

<CoreBlock
  name="core-list"
  content={
    '<ul class="wp-block-list"><li><strong><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-black-color">Stale-While-Revalidate (SWR) behavior:</mark></strong> Refreshes only&nbsp;the&nbsp;entries&nbsp;that were accessed instead of refreshing all stale rows&nbsp;&nbsp;</li><li><strong><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-black-color">Deduplicated refresh requests:</mark></strong> Prevents redundant source queries&nbsp;</li><li><strong><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-black-color">Fixed cache hit detection: </mark></strong>Queries now correctly detect cached data&nbsp;</li></ul>'
  }
/>

<CoreBlock
  name="core-buttons"
  content={
    '<div class="wp-block-buttons"><div class="wp-block-button"><a class="wp-block-button__link wp-element-button" href="https://spiceai.org/docs/features/data-acceleration/refresh-modes/caching">Caching Acceleration Mode Docs</a></div></div>'
  }
/>

<CoreBlock
  name="core-heading"
  content={
    '<h2 class="wp-block-heading h3"><strong>Additional Features&nbsp;</strong></h2>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p><a href="https://spiceai.org/docs/features/query-federation/parameterized-queries" target="_blank" rel="noreferrer noopener"><strong>Prepared Statements:</strong></a>&nbsp;Spice now supports prepared statements, enabling parameterized queries&nbsp;that improve&nbsp;performance&nbsp;and&nbsp;security by preventing&nbsp;SQL injection&nbsp;attacks&nbsp;with full&nbsp;SDK support&nbsp;across the&nbsp;Go, Rust, .NET, Java, JavaScript,&nbsp;and&nbsp;Python&nbsp;clients.&nbsp;</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p><a href="https://github.com/apache/iceberg-rust/releases/tag/v0.8.0" target="_blank" rel="noreferrer noopener"><strong>iceberg-rust v0.8.0:</strong></a>&nbsp;v0.8.0 brings&nbsp;support for Iceberg&nbsp;V3&nbsp;table&nbsp;metadata format,&nbsp;INSERT INTO for partitioned tables, and more.&nbsp;</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p><a href="https://spiceai.org/docs/features/data-acceleration/snapshots" target="_blank" rel="noreferrer noopener"><strong>Acceleration Snapshots Improvements:</strong></a><strong>&nbsp;</strong>Additions&nbsp;in v1.11 include&nbsp;flexible triggers based on time intervals or batch counts, automatic compaction to reduce storage overhead, and better creation policies that only&nbsp;create&nbsp;snapshot when data changes.&nbsp;</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p><a href="https://spiceai.org/docs/components/data-connectors" target="_blank" rel="noreferrer noopener"><strong>New Data Connectors</strong></a><strong></strong>&nbsp;</p>'
  }
/>

<CoreBlock
  name="core-list"
  content={
    '<ul class="wp-block-list"><li>NFS: Query&nbsp;data on&nbsp;Unix/Linux NFS exports&nbsp;</li><li><a href="https://spiceai.org/docs/next/components/data-connectors/scylladb" target="_blank" rel="noreferrer noopener">ScyllaDB</a>: Query&nbsp;the&nbsp;high-performance NoSQL database&nbsp;via CQL.&nbsp;</li></ul>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p><a href="https://spiceai.org/docs/components/models/google" target="_blank" rel="noreferrer noopener"><strong>Google LLM Support:</strong></a>&nbsp;Spice now supports Google embedding and chat models via the Google AI provider&nbsp;</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p><strong>URL Tables:&nbsp;</strong>Query data directly via URL&nbsp;in SQL&nbsp;from&nbsp;S3, Azure Blob Storage, and HTTP/HTTPS.&nbsp;</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p><a href="https://spiceai.org/docs/next/features/data-acceleration/hash-index" target="_blank" rel="noreferrer noopener"><strong>Hash Indexing&nbsp;for Arrow Acceleration&nbsp;(experimental)</strong></a><strong>:</strong>&nbsp;Arrow-based accelerations now support&nbsp;opt-in&nbsp;hash indexing for faster point lookups on equality predicates.</p>'
  }
/>

<CoreBlock
  name="core-heading"
  content={
    '<h3 class="wp-block-heading h4"><strong>From the Blog: How we Use Apache&nbsp;DataFusion&nbsp;at Spice AI&nbsp;</strong><em>&nbsp;</em></h3>'
  }
/>

<CoreBlock
  name="core-image"
  content={
    '<figure class="wp-block-image size-large"><img src="/website-assets/media/2026/01/Engineering-at-Spice-AI-Apache-DataFusion-1024x538.png" alt="Engineering at Spice AI Apache DataFusion" class="wp-image-1876"/></figure>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>A technical&nbsp;deep-dive&nbsp;on how Spice uses and extends Apache&nbsp;DataFusion&nbsp;with custom table providers, optimizer rules, and UDFs to power federated SQL, search, and AI inference.&nbsp;</p>'
  }
/>

<CoreBlock
  name="core-buttons"
  content={
    '<div class="wp-block-buttons"><div class="wp-block-button"><a class="wp-block-button__link wp-element-button" href="/blog/how-we-use-apache-datafusion-at-spice-ai">Read the blog</a></div></div>'
  }
/>

<CoreBlock
  name="core-heading"
  content={
    '<h3 class="wp-block-heading h4"><strong>From the Blog: Real-Time Control Plane Acceleration with DynamoDB Streams</strong></h3>'
  }
/>

<CoreBlock
  name="core-image"
  content={
    '<figure class="wp-block-image size-large"><img src="/website-assets/media/2026/01/image-33-1024x538.png" alt="Real-Time Control Plane Acceleration with DynamoDB Streams blog header" class="wp-image-1889"/></figure>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Learn how to&nbsp;stream&nbsp;DynamoDB data to thousands of nodes with sub-second latency using a two-tier architecture with DynamoDB Streams and Spice acceleration.&nbsp;</p>'
  }
/>

<CoreBlock
  name="core-buttons"
  content={
    '<div class="wp-block-buttons"><div class="wp-block-button"><a class="wp-block-button__link wp-element-button" href="/blog/real-time-acceleration-with-dynamodb-streams">Read the blog</a></div></div>'
  }
/>

<CoreBlock
  name="core-heading"
  content={
    '<h3 class="wp-block-heading h4"><strong>New Recipe in the Spice Cookbook: ScyllaDB&nbsp;Connector<em> &nbsp;&nbsp;</em></strong></h3>'
  }
/>

<CoreBlock
  name="core-image"
  content={
    '<figure class="wp-block-image size-large"><img src="/website-assets/media/2026/01/ScyllaDB-Connector-Cookbook-1024x536.png" alt="ScyllaDB Connector Cookbook" class="wp-image-1910"/></figure>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Learn how to connect Spice to&nbsp;ScyllaDB&nbsp;for sub-second federated queries.&nbsp;</p>'
  }
/>

<CoreBlock
  name="core-buttons"
  content={
    '<div class="wp-block-buttons"><div class="wp-block-button"><a class="wp-block-button__link wp-element-button" href="https://github.com/spiceai/cookbook/tree/trunk/scylladb">Try the cookbook</a></div></div>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>As always, we\'d love your feedback! <a href="/slack">Join us on Slack</a> to connect directly with the team and other Spice users. </p>'
  }
/>

To try v1.11 on your own workloads, start with [SQL federation and acceleration](/platform/sql-federation-acceleration) and the [data lake accelerator](/use-case/datalake-accelerator), or [get a demo](/get-a-demo).

<ContentResourceFeatured
  fields={{
    heading: 'Explore more Spice resources',
    paragraph:
      'Tutorials, docs, and blog posts to help you go deeper with Spice.',
    mode: 'related',
    resources: false,
    padding_top: 'unset',
    padding_bottom: 'unset',
    related_posts: [
      {
        title: 'A Developer&#8217;s Guide to Understanding Spice.ai',
        slug: '/blog/a-developers-guide-to-understanding-spice-ai',
        excerpt:
          'This guide helps developers build a mental model of why, how, and where to use Spice.',
        image:
          '/website-assets/media/2026/02/A-developers-guide-to-understanding-Spice.ai_.png',
        type: 'Blog',
        taxonomy: [
          'Engineering',
          'Spice AI',
          'Spice Cloud Platform',
          'Spice OSS',
        ],
      },
      {
        title: 'Real-Time Control Plane Acceleration with DynamoDB Streams ',
        slug: '/blog/real-time-acceleration-with-dynamodb-streams',
        excerpt:
          'How to sync DynamoDB data to thousands of nodes with sub-second latency using a two-tier architecture with DynamoDB Streams and Spice acceleration.',
        image: '/website-assets/media/2026/01/image-33.png',
        type: 'Blog',
        taxonomy: [
          'Data Acceleration',
          'Engineering',
          'Spice Cloud Platform',
          'Spice OSS',
        ],
      },
      {
        title: 'How we use Apache DataFusion at Spice AI',
        slug: '/blog/how-we-use-apache-datafusion-at-spice-ai',
        excerpt:
          'Why we chose to build on DataFusion and how we extended it with custom TableProviders, optimizer rules, and UDFs for federated SQL',
        image:
          '/website-assets/media/2026/01/Engineering-at-Spice-AI-Apache-DataFusion.png',
        type: 'Blog',
        taxonomy: [
          'Spice AI',
          'Spice Cloud Platform',
          'Spice OSS',
          'SQL Federation',
        ],
      },
    ],
  }}
/>

<TalkToAnEngineerCta />

<ContentRichText
  fields={{
    coverage: 'rc-end',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<CoreBlock name="core-paragraph" content={'<p></p>'} />

---

## Spice Cloud v1.8.0: Iceberg Write Support, Acceleration Snapshots & More
URL: https://spice.ai/blog/spice-cloud-v1-8-0-iceberg-writes
Date: 2025-10-08T17:29:00
Description: Announcing Spice Cloud v1.8.0 - now with Iceberg write support, acceleration snapshots, partitioned S3 Vectors indexes & a new AI SQL function

<ContentRichText
  fields={{
    coverage: 'rc-start',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p><br>Spice Cloud &amp;&nbsp;Spice.ai Enterprise 1.8.0 are live! v1.8.0 includes Iceberg write support, acceleration snapshots, partitioned S3 Vector indexes, a new AI&nbsp;SQL function for LLM integration, and an updated Spice.js SDK.</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>V1.8.0 also introduces developer experience upgrades, including a redesigned Spice Cloud dashboard with tabbed navigation:</p>'
  }
/>

<CoreBlock
  name="core-image"
  content={
    '<figure class="wp-block-image"><img src="https://cdn.prod.website-files.com/6362f59f9fd4ac355fc06eaf/68e5abebee8ba14ddc7a3b18_Group%201171274515.png" alt="Switch between datasets, queries, and models without losing context"/><figcaption class="wp-element-caption">Figure 1: Switch between datasets, queries, and models without losing context.</figcaption></figure>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Spice Cloud customers will automatically upgrade to v1.8.0 on&nbsp;<a href="/login?from=landing">deployment</a>, while Spice.ai Enterprise customers can consume the Enterprise v1.8.0 image from the&nbsp;<a href="https://aws.amazon.com/marketplace/pp/prodview-jmf6jskjvnq7i">Spice AWS&nbsp;Marketplace listing</a>.</p>'
  }
/>

<CoreBlock
  name="core-heading"
  content={
    '<h2 class="wp-block-heading h4">What\'s New in Spice Cloud v1.8.0</h2>'
  }
/>

<CoreBlock
  name="core-heading"
  content={
    '<h3 class="wp-block-heading h5"><strong>Iceberg Write Support&nbsp;(Preview)</strong></h3>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Spice now supports writing to Apache Iceberg tables using standard SQL&nbsp;<code>INSERT INTO</code>&nbsp;statements. This greatly simplifies creating and updating Iceberg datasets in the Spice runtime -&nbsp;letting teams directly manipulate open table data with&nbsp;SQL instead of third-party tools. Learn more about <a href="/platform/sql-federation-acceleration">Spice SQL federation</a> or get started with Iceberg writes in Spice&nbsp;<a href="https://spiceai.org/docs/components/data-connectors/iceberg">here</a>.</p>'
  }
/>

<CoreBlock name="core-paragraph" content={'<p>Example query:</p>'} />

```python
-- Insert from another table
INSERT INTO iceberg_table
SELECT * FROM existing_table;

-- Insert with values
INSERT INTO iceberg_table (id, name, amount)
VALUES (1, 'John', 100.0), (2, 'Jane', 200.0);

-- Insert into catalog table
INSERT INTO ice.sales.transactions
VALUES (1001, '2025-01-15', 299.99, 'completed');
```

<CoreBlock
  name="core-heading"
  content={
    '<h3 class="wp-block-heading h5">Acceleration Snapshots (Preview)</h3>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>A new snapshotting system enables datasets accelerated with file-based engines (DuckDB or SQLite) to bootstrap from stored snapshots in object storage like S3 - significantly reducing cold-start latency and simplifying distributed deployments.<a href="/blog">&nbsp;Learn more.</a></p>'
  }
/>

<CoreBlock
  name="core-heading"
  content={
    '<h3 class="wp-block-heading h5">Partitioned Amazon S3 Vector Indexes</h3>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Vector search at scale is now faster and more efficient with partitioned Amazon S3 Vector indexes - ideal for large-scale semantic search, recommendation systems, and embedding-based applications. Combine with <a href="/platform/hybrid-sql-search">hybrid SQL search</a> for unified keyword and vector retrieval.<a href="https://spiceai.org/docs/components/vectors/s3_vectors">&nbsp;Learn more.</a></p>'
  }
/>

<CoreBlock
  name="core-heading"
  content={'<h3 class="wp-block-heading h5">AI SQL Function (Preview)</h3>'}
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>A new asynchronous&nbsp;<code>ai&nbsp;</code>SQL function enables developers to call large language models (LLMs) directly from SQL, making it possible to integrate <a href="/platform/llm-inference">LLM inference</a> directly into federated or analytical workflows without additional services.<a href="https://spiceai.org/docs/reference/sql/ai">&nbsp;Learn more.</a></p>'
  }
/>

<CoreBlock
  name="core-heading"
  content={'<h3 class="wp-block-heading h5">Spice.js v3.0.3 SDK</h3>'}
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>v3.0.3 brings improved reliability and broader platform support. Highlights include new query methods, automatic transport fallback between gRPC and HTTP, and built-in health checks and dataset refresh controls.&nbsp;<a href="https://spiceai.org/docs/sdks/javascript">Learn more</a>.</p>'
  }
/>

<CoreBlock
  name="core-heading"
  content={'<h3 class="wp-block-heading h5">Bug &amp; Stability Fixes</h3>'}
/>

<CoreBlock
  name="core-paragraph"
  content={'<p>v1.8.0 also includes numerous fixes and improvements:</p>'}
/>

<CoreBlock
  name="core-list"
  content={
    '<ul class="wp-block-list"><li><strong>Reliability</strong>: Improved logging, error handling, and network readiness checks across connectors (Iceberg, Databricks, etc.).</li><li><strong>Vector search durability and scale</strong>: Refined logging, stricter default limits, safeguards against index-only scans and duplicate results, and always-accessible metadata for robust queryability at scale.</li><li><strong>Cache behavior</strong>: Tightened cache logic for modification queries.</li><li><strong>Full-Text Search</strong>: FTS metadata columns now usable in projections.</li><li><strong>RRF Hybrid Search</strong>: Reciprocal Rank Fusion (RRF) UDTF enhancements for advanced hybrid search scenarios.</li></ul>'
  }
/>

<CoreBlock name="core-paragraph" content={'<p>‍</p>'} />

<CoreBlock
  name="core-paragraph"
  content={
    '<p>For more on v1.8.0, check out the full&nbsp;<a href="https://spiceai.org/releases/v1.8.0">release notes</a>.</p>'
  }
/>

<CoreBlock
  name="core-heading"
  content={'<h2 class="wp-block-heading h4">v1.8 Release Community Call</h2>'}
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p><strong></strong>Join us on Thursday, October 16th for live demos of the new functionality delivered in v1.8!&nbsp;<a href="https://us06web.zoom.us/meeting/register/OZwju7JDR6u3h9bJ6jdoQg?utm_campaign=23455564-v1.7.0%20Release&amp;utm_medium=email&amp;_hsenc=p2ANqtz-_OxntfMUJd29JhuKpDEcdpRC8TMOIPtEFP4UeiSpDYjmJRG6Ta8S10WwosIQ1ccZhCD6JPZ8pmmyGJCsOtLzWsRFznWw&amp;_hsmi=2&amp;utm_content=2&amp;utm_source=hs_email#/registration">Register here</a>.<br>‍</p>'
  }
/>

<CoreBlock
  name="core-image"
  content={
    '<figure class="wp-block-image"><img src="https://cdn.prod.website-files.com/6362f59f9fd4ac355fc06eaf/68e591bba48c6127ef06e0b9_Group%201171274514.png" alt="October 16th, v1.8 Release Community Call"/><figcaption class="wp-element-caption">Figure 2: October 16th, v1.8 Release Community Call</figcaption></figure>'
  }
/>

<CoreBlock
  name="core-heading"
  content={
    '<h3 class="wp-block-heading h5">Resources to Get Started with Spice</h3>'
  }
/>

<CoreBlock
  name="core-list"
  content={
    '<ul class="wp-block-list"><li><a href="/login?from=landing">Sign up</a>&nbsp;for Spice Cloud for free, or&nbsp;<a href="https://spiceai.org/docs/getting-started">get started</a>&nbsp;with Spice Open Source</li><li>Explore the Spice&nbsp;<a href="/cookbook">cookbooks</a>&nbsp;and&nbsp;<a href="https://spiceai.org/docs">docs</a></li><li><a href="https://meetings.hubspot.com/vladi-semenov">Schedule a demo</a>&nbsp;if you\'d like to see the product live or have any questions</li></ul>'
  }
/>

<CoreBlock name="core-paragraph" content={'<p>‍</p>'} />

Iceberg writes extend Spice's [operational data lakehouse](/use-case/operational-data-lakehouse). Compare plans on [Spice Cloud pricing](/pricing) or [get a demo](/get-a-demo).

<ContentResourceFeatured
  fields={{
    heading: 'Explore more Spice resources',
    paragraph:
      'Tutorials, docs, and blog posts to help you go deeper with Spice.',
    mode: 'related',
    resources: false,
    padding_top: 'unset',
    padding_bottom: 'unset',
    related_posts: [
      {
        title: 'A Developer&#8217;s Guide to Understanding Spice.ai',
        slug: '/blog/a-developers-guide-to-understanding-spice-ai',
        excerpt:
          'This guide helps developers build a mental model of why, how, and where to use Spice.',
        image:
          '/website-assets/media/2026/02/A-developers-guide-to-understanding-Spice.ai_.png',
        type: 'Blog',
        taxonomy: [
          'Engineering',
          'Spice AI',
          'Spice Cloud Platform',
          'Spice OSS',
        ],
      },
      {
        title:
          'Spice Cloud v1.11: Spice Cayenne Reaches Beta, Apache DataFusion v51, DynamoDB Streams Improvements, &amp; More',
        slug: '/blog/spice-cloud-v1-11',
        excerpt:
          'Spice Cloud v1.11 focuses on what matters most in production: faster queries, lower memory usage, and predictable performance across acceleration and caching.',
        image: '/website-assets/media/2026/01/Spice-Cloud-v1.11-Update.png',
        type: 'Blog',
        taxonomy: ['Releases', 'Spice Cloud Platform'],
      },
      {
        title: 'Real-Time Control Plane Acceleration with DynamoDB Streams ',
        slug: '/blog/real-time-acceleration-with-dynamodb-streams',
        excerpt:
          'How to sync DynamoDB data to thousands of nodes with sub-second latency using a two-tier architecture with DynamoDB Streams and Spice acceleration.',
        image: '/website-assets/media/2026/01/image-33.png',
        type: 'Blog',
        taxonomy: [
          'Data Acceleration',
          'Engineering',
          'Spice Cloud Platform',
          'Spice OSS',
        ],
      },
    ],
  }}
/>

<TalkToAnEngineerCta />

<ContentRichText
  fields={{
    coverage: 'rc-end',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

---

## Spice Cloud v1.9.0: Introducing the Spice Cayenne Data Accelerator
URL: https://spice.ai/blog/spice-cloud-v1-9-0-cayenne-data-accelerator
Date: 2025-11-20T18:21:00
Description: Spice Cloud v1.9.0 adds the Cayenne Data Accelerator, Apache DataFusion v50, HTTP data connector support for querying endpoints as tables, and much more.

<ContentRichText
  fields={{
    coverage: 'rc-start',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<CoreBlock
  name="core-paragraph"
  content={'<p>Spice Cloud &amp; Spice.ai Enterprise 1.9.0 are live!</p>'}
/>

<CoreBlock
  name="core-paragraph"
  content={
    "<p>Our mission at Spice is to make building data-intensive applications and AI systems easier, faster, and more secure. With&nbsp;<strong>v1.9.0</strong>, we're taking a big step forward.</p>"
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>This release introduces&nbsp;<strong>Spice Cayenne</strong>, our new premier data accelerator based on&nbsp;<a href="https://github.com/vortex-data/vortex"><strong>Vortex</strong></a>, upgrades to&nbsp;<strong>DataFusion v50</strong>&nbsp;and&nbsp;<strong>DuckDB v1.4.2</strong>, new&nbsp;<strong>HTTP Data Connector&nbsp;</strong>support for querying API endpoints as tables, and many more improvements across performance, scalability, and developer experience.</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Spice Cloud customers will automatically upgrade to v1.9.0 on&nbsp;<a href="/login?from=landing">deployment</a>, while Spice.ai Enterprise customers can consume the Enterprise v1.9.0 image from the&nbsp;<a href="https://aws.amazon.com/marketplace/pp/prodview-jmf6jskjvnq7i">Spice AWS Marketplace listing</a>.</p>'
  }
/>

<CoreBlock
  name="core-heading"
  content={
    '<h2 class="wp-block-heading h4">What\'s New in Spice Cloud v1.9.0</h2>'
  }
/>

<CoreBlock
  name="core-heading"
  content={
    '<h3 class="wp-block-heading h5">Cayenne Data Accelerator (Beta)</h3>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p><em>Cayenne&nbsp;</em>is the new premier <a href="/use-case/datalake-accelerator">data accelerator</a> for high-volume, multi-file workloads. Built on the&nbsp;<a href="https://github.com/vortex-data/vortex" target="_blank" rel="noreferrer noopener">Vortex columnar format</a>&nbsp;from the Linux Foundation, Cayenne offers better ingestion and query performance than DuckDB without single-file scaling limits. Spice Cayenne supports high concurrency, retention policies, and SQL-based lifecycle management.</p>'
  }
/>

<CoreBlock
  name="core-image"
  content={
    '<figure class="wp-block-image aligncenter text-center"><img src="https://cdn.prod.website-files.com/6362f59f9fd4ac355fc06eaf/691e540a7c3632b21a5408f8_1531%20(2).png" alt="TPC-H SF-100 benchmark"/><figcaption class="wp-element-caption">Figure 1: TPC-H SF-100 benchmark</figcaption></figure>'
  }
/>

<CoreBlock
  name="core-image"
  content={
    '<figure class="wp-block-image text-center"><img src="https://cdn.prod.website-files.com/6362f59f9fd4ac355fc06eaf/691e6554852d99146f57a322_1532%20(3).png" alt="ClickBench benchmark"/><figcaption class="wp-element-caption">Figure 2: ClickBench benchmark</figcaption></figure>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Learn more about getting started with Cayenne&nbsp;<a href="https://spiceai.org/docs/components/data-accelerators/cayenne">in the docs</a>.</p>'
  }
/>

<CoreBlock
  name="core-heading"
  content={'<h2 class="wp-block-heading h4">Apache DataFusion v50 Upgrade</h2>'}
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>DataFusion v50 features faster filter pushdown, new SQL functions, and more reliable execution plans. Learn more in the Apache DataFusion&nbsp;<a href="https://datafusion.apache.org/blog/2025/09/29/datafusion-50.0.0/">blog</a>.</p>'
  }
/>

<CoreBlock
  name="core-image"
  content={
    '<figure class="wp-block-image text-center"><img src="https://cdn.prod.website-files.com/6362f59f9fd4ac355fc06eaf/691d1e6ce12448257fb4fcce_Datafusion%20v50%20image.png" alt="Apache DataFusion performance improvements"/><figcaption class="wp-element-caption">Figure 3: Apache DataFusion performance improvements</figcaption></figure>'
  }
/>

<CoreBlock
  name="core-heading"
  content={
    '<h2 class="wp-block-heading h4">HTTP Data Connector:&nbsp;Query Endpoints as Tables</h2>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Query HTTP endpoints as tables in SQL queries with dynamic filters, with full support for results-caching including new stale-while-revalidate (SWR) support. Learn more&nbsp;<a href="https://spiceai.org/docs/components/data-connectors/https">here</a>.</p>'
  }
/>

<CoreBlock
  name="core-image"
  content={
    '<figure class="wp-block-image text-center"><img src="https://cdn.prod.website-files.com/6362f59f9fd4ac355fc06eaf/691e5dba41d559601009c00b_Group%201171274550%20(1).png" alt="HTTP data connector query"/><figcaption class="wp-element-caption">Figure 4: HTTP&nbsp;data connector query</figcaption></figure>'
  }
/>

<CoreBlock
  name="core-heading"
  content={
    '<h2 class="wp-block-heading h4">Full-Text and Vector Search on Views</h2>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>You can now add full-text indexes or embeddings to accelerated views for advanced <a href="/platform/hybrid-sql-search">search</a> across pre-aggregated or transformed data. Vector engines on views are now also supported. Visit the&nbsp;<a href="https://spiceai.org/docs/features/search">search</a>&nbsp;and&nbsp;<a href="https://spiceai.org/docs/features/embeddings">embeddings</a>&nbsp;docs for more information.</p>'
  }
/>

<CoreBlock
  name="core-image"
  content={
    '<figure class="wp-block-image text-center"><img src="https://cdn.prod.website-files.com/6362f59f9fd4ac355fc06eaf/691d226ebbcf8d60b1d66481_Untitled%20(6).png" alt="Full-text and vector search on views example"/><figcaption class="wp-element-caption">Figure 5: Full-text and vector search on views example</figcaption></figure>'
  }
/>

<CoreBlock
  name="core-heading"
  content={
    '<h2 class="wp-block-heading h4">AWS&nbsp;Authentication Improvements</h2>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>AWS SDK credential initialization now includes more robust retry logic and better handling, supporting transient and extended network and AWS outages without manual intervention. Learn more.</p>'
  }
/>

<CoreBlock
  name="core-heading"
  content={'<h3 class="wp-block-heading h5">Additional Updates</h3>'}
/>

<CoreBlock
  name="core-list"
  content={
    '<ul class="wp-block-list"><li><strong>DuckDB v1.4.2</strong>: Composite ART indexes for accelerated table scans, intermediate materialization, and better refresh performance</li><li><strong>Git Data Connector</strong>: Query data directly from Git repositories&nbsp;</li><li><strong>DynamoDB Connector Improvements</strong>: Improved filter handling, parallel scan support, and better handling for misconfigured queries</li><li><strong>Spice Java SDK v0.4.0</strong>&nbsp;with configurable memory limits</li><li><strong>CLI Improvements:</strong>&nbsp;version pinning, persistent query history, and tab completion</li><li><strong>Dedicated Query Thread Pool</strong>&nbsp;is now enabled by default</li></ul>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>For more details on v1.9.0, visit the&nbsp;<a href="https://spiceai.org/releases/v1.9.0">release notes</a>.</p>'
  }
/>

To see Cayenne acceleration on your own data, review [Spice Cloud pricing](/pricing) or [get a demo](/get-a-demo).

<ContentResourceFeatured
  fields={{
    heading: 'Explore more Spice resources',
    paragraph:
      'Tutorials, docs, and blog posts to help you go deeper with Spice.',
    mode: 'related',
    resources: false,
    padding_top: 'unset',
    padding_bottom: 'unset',
    related_posts: [],
  }}
/>

<ContentRichText
  fields={{
    coverage: 'rc-end',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

---

## Spice Cloud v2.0-rc.2: Cayenne RC, ADBC BigQuery, and Catalog Connectors
URL: https://spice.ai/blog/spice-cloud-v2-0-rc-2
Date: 2026-04-20T12:30:00
Description: Spice Cloud v2.0-rc.2 introduces Spice Cayenne release candidate status, ADBC with BigQuery support, new catalog connectors, and major developer experience upgrades.

<ContentRichText
  fields={{
    coverage: 'rc-start',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

Spice.ai v2.0-rc.2 is now available in Spice Cloud!

v2.0 brings major Spice Cayenne upgrades, a new ADBC Data Connector with BigQuery support, new Catalog Connectors, and a range of developer experience improvements across the Spice Cloud Portal.

Let's get into it.

## New in Spice Cloud!

### Update Channel for Preview Releases

![Spice Cloud update channel selector with Preview and Stable options](/website-assets/media/2025/11/SCP_release_selector.png)

Spice Cloud users can now select Preview or Stable update channels, with Spice apps automatically upgraded to preview versions (including v2.0-rc.2). Head to Settings -> Runtime to try v2.0 before it's GA!

### [api.spice.ai](https://api.spice.ai) Management API

Programmatic control over your entire Spice Cloud footprint (apps, deployments, secrets, API keys, and organization members) via the [api.spice.ai](https://api.spice.ai) REST API and a new Terraform provider for infrastructure-as-code workflows. The API supports OAuth clients for external applications that need to authenticate on behalf of your organization, with granular scopes controlling access per resource type.

[Visit the management API docs for more info](https://docs.spice.ai/api)

### Audit Log

![Spice Cloud audit log showing organization activity history](/website-assets/media/2025/11/SCP_audit_log.png)

Track every change to your Spice Cloud organization - Apps, deployments, configuration updates, and secret management - with a full audit trail of who changed what and when. Available on all plans, with downloadable logs and retention periods of up to 60 days on the Enterprise plan.

Continue reading for the overview of v2.0-rc.2, or check out the full release notes at [spiceai.org/releases/v2.0-rc.2](https://spiceai.org/releases/v2.0-rc.2)

## Major v2.0-rc.2 Features

### Spice Cayenne Reaches RC

![Spice Cayenne architecture diagram](/website-assets/media/2025/11/Spice_Cayenne_2.0rc2_diagram.png)

Spice Cayenne, the Spice data accelerator built on the Vortex columnar format, has been promoted to release candidate status. Cayenne delivers 1.4x faster queries than DuckDB with 3x lower memory usage on TPC-H SF100 benchmarks.

New in RC2:

- **`MERGE INTO`**: Upsert-style insert/update/delete operations on Cayenne catalog tables, fully distributed across executors.
- **`PARTITION BY`**: Define Cayenne table partitioning directly in SQL; partition metadata is persisted and reloaded on restart.
- **Reliability fixes**: Correct target file size enforcement (default 128MB), and proper primary key and conflict resolution handling for Cayenne tables.

[Spice Cayenne Docs](https://spiceai.org/docs/components/data-accelerators/cayenne)

### ADBC Data Connector & Catalog

![ADBC data connector and catalog in Spice](/website-assets/media/2025/11/adbc_data_connector.png)

Spice now offers an ADBC data connector and catalog for connectivity to any data system with an ADBC Driver, such as BigQuery. It supports full query federation, automatic schema, and table discovery.

[ADBC Connector Docs](https://spiceai.org/docs/next/components/data-connectors/adbc)

### New Catalog Connectors

![PostgreSQL catalog connector example in Spice](/website-assets/media/2025/11/postgres_example.png)

Catalog connectors for PostgreSQL, MySQL, MS SQL, and Snowflake make it straightforward to expose external database metadata through Spice for cross-system federation, using each system's native metadata catalog for schema and table discovery.

[Catalog Connector Docs](https://spiceai.org/docs/next/components/catalogs)

### Apache DataFusion v52 Upgrade

![Apache DataFusion v52.4.0 upgrade overview](/website-assets/media/2025/11/DataFusion_v52.4_Upgrade.png)

DataFusion has been upgraded to v52.4.0, with updates across `arrow-rs`, `datafusion-federation`, and `datafusion-table-providers`. This release adds strict overflow handling (`try_cast_to` now returns errors on overflow rather than silently producing NULL values), along with a federation fix for Inexact filter pushdown with aliases and improved partial aggregation performance for FlightSQLExec.

[Apache DataFusion Docs](https://datafusion.apache.org/blog/output/2026/01/12/datafusion-52.0.0)

## Additional Updates

- Delta Lake Column Mapping: Name and Id column mapping modes are now supported for Delta Lake datasets.
- HTTP Pagination: The HTTP data connector now supports paginated API endpoints.
- JSON Ingestion: Added support for single-object JSON documents, soda format support (Socrata Open Data), json_pointer extraction for nested payloads, and improved auto-detection across arrays, objects, JSONL, and BOM-prefixed input.
- Per-Model Rate-Limited AI UDF Execution: Control concurrent AI function invocations on a per-model basis.
- Caching Retention: Added retention policies for cached query results.
- DynamoDB DML: INSERT, UPDATE, and DELETE support for the DynamoDB table provider.
- mTLS Client Auth: Added mTLS client authentication to the spice sql REPL.

...and much more! Check out the full release notes for details:

[Read the release blog](https://spiceai.org/releases/v2.0-rc.2)

## Related Deep Dives

### Apache Iceberg at Spice AI: Query, Accelerate, and Write to Open Table Formats

![Apache Iceberg at Spice AI blog header](/website-assets/media/2026/01/Apache-Iceberg-at-Spice-AI.png)

Learn how Spice AI integrates Apache Iceberg for zero-ETL federation, sub-second query acceleration, and ACID-compliant writes to open table formats stored in object storage.

[Read the blog](/blog/apache-iceberg-at-spice-ai)

### Vortex at Spice AI: The Columnar Format for Data-Intensive Workloads

![Vortex at Spice AI blog header](/website-assets/media/2026/04/vortex-at-spice-ai-the-columnar-format-for-data-intensive-workloads.png)

Spice AI uses the Vortex columnar format in Cayenne to speed data-intensive workloads, reduce memory use, and scale concurrent ingestion and query execution. This blog reviews the implementation and how we've extended Vortex.

[Read the blog](/blog/vortex-at-spice-ai-the-columnar-format-for-data-intensive-workloads)

### Apache Ballista at Spice AI: Distributed Query Execution Without the Operational Tax

![Apache Ballista at Spice AI blog header](/website-assets/media/2026/02/ballista-blog-header.png)

This blog explores how we built distributed query execution, replacing Ballista's single-scheduler design with a multi-active HA architecture on top of object storage.

[Read the blog](/blog/apache-ballista-at-spice-ai)

## Join the Spice Community on Slack

Interested in discussing the release or learning more about the platform? Connect with fellow Spice users, swap tips, ask questions, and get a front-row seat to product updates and roadmap insights in the Spice Community Slack channel!

[Join the Spice Community on Slack](/slack)

Spice 2.0 RC.2 rounds out the [operational data lakehouse](/use-case/operational-data-lakehouse): [federated SQL and acceleration](/platform/sql-federation-acceleration), search, and AI in one runtime. To evaluate the release, [get a demo](/get-a-demo).

<ContentRichText
  fields={{
    coverage: 'rc-end',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

---

## Spice OSS, rebuilt in Rust
URL: https://spice.ai/blog/spice-oss-rebuilt-in-rust
Date: 2024-04-01T19:19:00
Description: Spice.ai OSS has been rebuilt from the ground up in Rust, delivering the performance, safety, and portability needed for production data infrastructure.

<ContentRichText
  fields={{
    coverage: 'rc-start',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Last week we <a href="/blog/adding-spice-the-next-generation-of-spice-ai-oss" target="_blank" rel="noreferrer noopener">announced</a> the next-generation of Spice OSS, the technology behind <a href="https://docs.spice.ai/building-blocks/spice-firecache" target="_blank" rel="noreferrer noopener">Spice Firecache</a>, completely rebuilt from the ground up in Rust.</p>'
  }
/>

<CoreBlock
  name="core-heading"
  content={'<h2 class="wp-block-heading h4">What Spice OSS Provides</h2>'}
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Spice OSS is as a unified SQL query interface and portable runtime to locally materialize, accelerate, and query data tables sourced from any database, data warehouse or data lake.</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Spice federates SQL query across databases (MySQL, PostgreSQL, etc.), data warehouses (Snowflake, BigQuery, etc.) and data lakes (S3, MinIO, Databricks, etc.) so you can easily use and combine data wherever it lives. And of course Spice OSS connects to the Spice.ai Cloud Platform.</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Datasets can be materialized and accelerated using your engine of choice, including DuckDB, SQLite, PostgreSQL, and in-memory Apache Arrow records, for ultra-fast, low-latency query. Accelerated engines run in your infrastructure giving you flexibility and control over price and performance.</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>You can get started with Spice on your own machine in less than 30 seconds by following the quickstart at&nbsp;<a href="https://github.com/spiceai/spiceai#quickstart" target="_blank" rel="noreferrer noopener">github.com/spiceai/spiceai</a>&nbsp;as Phillip demonstrated below.</p>'
  }
/>

<PostVideo
  fields={{
    thumbnail: false,
    type: 'youtube',
    video_id: 'AZyrecVWnEs',
    video_title: 'SQL query federation and acceleration with Spice',
    video_upload_date: '2024-03-28T09:17:27-07:00',
    video_channel: 'Spice AI',
    video_description:
      'Quickstart demo of SQL query federation and acceleration with Spice.',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

The Rust runtime described here now powers [SQL query federation and acceleration](/platform/sql-federation-acceleration) and [edge-to-cloud deployments](/feature/edge-to-cloud-deployments). To see it in action, [get a demo](/get-a-demo).

<ContentResourceFeatured
  fields={{
    heading: 'Explore more Spice resources',
    paragraph:
      'Tutorials, docs, and blog posts to help you go deeper with Spice.',
    mode: 'related',
    resources: false,
    padding_top: 'unset',
    padding_bottom: 'unset',
    related_posts: [],
  }}
/>

<TalkToAnEngineerCta />

<ContentRichText
  fields={{
    coverage: 'rc-end',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

---

## Getting Started with Spice.ai SQL Query Federation & Acceleration
URL: https://spice.ai/blog/spice-sql-query-federation-acceleration
Date: 2025-10-14T17:15:00
Description: Learn how to use Spice.ai to federate and accelerate queries across operational and analytical systems with zero ETL.

<ContentRichText
  fields={{
    coverage: 'rc-start',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

**TL;DR:** Spice provides [SQL query federation](/platform/sql-federation-acceleration) and local acceleration in a lightweight runtime that lets applications query distributed data sources (databases, warehouses, and lakes) through a single SQL interface with sub-second performance, zero ETL, and no data movement.

---

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Modern applications succeed when they can deliver speed, intelligence, and reliability at scale. Achieving that depends increasingly on how quickly and efficiently they can access the relevant underlying data sources. Most enterprises, however, rely on pipelines, warehouses, and APIs that make real-time or intelligent apps prohibitively expensive or slow. Engineering teams are faced with how to make these fragmented systems faster, more secure, and more productive without rebuilding from scratch.&nbsp;<strong>Spice was built to solve this problem</strong>, delivering&nbsp;<a href="https://spiceai.org/docs/features/query-federation">SQL query federation</a>&nbsp;and&nbsp;<a href="https://spiceai.org/docs/features/data-acceleration">local acceleration</a>&nbsp;in a lightweight, portable runtime that turns distributed data environments into a high-performance data layer capable of supporting the most demanding workloads.</p>'
  }
/>

<CoreBlock
  name="core-image"
  content={
    '<figure class="wp-block-image"><img src="https://cdn.prod.website-files.com/6362f59f9fd4ac355fc06eaf/68e83039bde461038fcf015e_Feature_%20Federated%20SQL%20query.png" alt="Feature Federated SQL Query"/><figcaption class="wp-element-caption">Figure 1: Federated SQL Query in Spice</figcaption></figure>'
  }
/>

<CoreBlock
  name="core-heading"
  content={
    '<h2 class="wp-block-heading h4">The Current State of Data Access in the Enterprise</h2>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>The primary mandate for development teams is satisfying the performance, availability, and security benchmarks your use case mandates at a cost profile that makes sense for your business; how you satisfy those requirements in terms of the underlying technology deployed is ultimately an implementation detail.&nbsp;</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    "<p>It's evident that this philosophy is put into practice when you take a peek behind the 'enterprise curtain', where you'll see a patchwork of different systems deployed at different layers of abstraction: operational and analytical apps built on on-premise, cloud, hybrid, or serverless infrastructure depending on the use case.&nbsp;</p>"
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>In order to make these very heterogenous architectures operational, historically (largely by necessity) development teams would have to patch together a variety of pipelines to connect to data spread out across the enterprise: customer records in transactional databases, historical data in warehouses or data lakes, semi-structured content in object stores, etc. All across a variety of deployment tiers.&nbsp;</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>How can you make your existing infrastructure investment more productive, secure, and performant, while also serving the low-latency data access that intelligent applications and agents demand? Copying everything into a single warehouse no longer satisfies the performance, security, or cost requirements of modern workloads.</p>'
  }
/>

<CoreBlock
  name="core-heading"
  content={
    '<h2 class="wp-block-heading h4">How Spice\'s SQL Federation &amp; Acceleration Solves the Data Access Problem</h2>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Spice is an&nbsp;<a href="https://spiceai.org/docs">open-source data and AI platform</a>&nbsp;that federates and accelerates your operational and analytical data and deploys it at the application layer. Instead of centralizing all data in one system, it lets teams query data in place across multiple sources in a lightweight runtime that&nbsp;<a href="https://spiceai.org/docs/deployment">runs anywhere</a>&nbsp;- edge, cloud, or on-prem.&nbsp;</p>'
  }
/>

<CoreBlock
  name="core-list"
  content={
    '<ul class="wp-block-list"><li><a href="https://spiceai.org/docs/features/query-federation"><strong>SQL Query Federation</strong></a>: Run SQL queries across OLTP databases, OLAP warehouses, and object stores without ETL.</li></ul>'
  }
/>

<CoreBlock
  name="core-image"
  content={
    '<figure class="wp-block-image"><img src="https://cdn.prod.website-files.com/6362f59f9fd4ac355fc06eaf/68e8430bca13c2e941a61612_query-federation-d7f02526f15c1186e289e83f505be9f1.png" alt="Spice.ai Open Source Query Federation"/><figcaption class="wp-element-caption">Figure 2: SQL&nbsp;Query Federation in Spice</figcaption></figure>'
  }
/>

<CoreBlock name="core-paragraph" content={'<p>‍</p>'} />

<CoreBlock
  name="core-paragraph"
  content={
    '<p><a href="https://spiceai.org/docs/features/data-acceleration"><strong>SQL Query Acceleration</strong></a>: Cache or index working sets locally in DuckDB or SQLite, cutting query latency from seconds to milliseconds.</p>'
  }
/>

<CoreBlock
  name="core-image"
  content={
    '<figure class="wp-block-image"><img src="https://cdn.prod.website-files.com/6362f59f9fd4ac355fc06eaf/68e8430aca13c2e941a61606_38023425.png" alt="SQL Query Acceleration in Spice"/><figcaption class="wp-element-caption">Figure 3: SQL&nbsp;Query Acceleration in Spice</figcaption></figure>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>By combining <a href="/platform/sql-federation-acceleration">SQL federation and acceleration</a> in a single runtime, Spice reduces infrastructure complexity and delivers the sub-second latency needed for real-time apps and AI agents - whereas traditional approaches rely on heavy ETL pipelines or pre-aggregations to make object storage and open table formats queryable. And for use cases that demand search, Spice packages keyword, vector, and full-text search in one SQL query for truly hybrid retrieval.</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>This breadth of capabilities brings object storage fully into the operational path; Spice&nbsp;<a href="/blog/making-object-storage-operational">turns object storage into active, queryable data layers</a>&nbsp;that support real-time ingestion, transformation, and retrieval. You can query data where it lives, ingest real-time updates&nbsp;<a href="https://spiceai.org/docs/features/cdc">through change-data-capture</a>&nbsp;(CDC), index for<a href="https://spiceai.org/docs/features/search">&nbsp;vector and full-text search</a>, and&nbsp;<a href="https://spiceai.org/docs/components/data-connectors/iceberg">write directly back to Iceberg tables</a>&nbsp;using standard SQL.</p>'
  }
/>

<CoreBlock
  name="core-heading"
  content={
    '<h2 class="wp-block-heading h4">Use Case Example: Combining S3, PostgreSQL, and Dremio Data in Single Query</h2>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Consider a customer portal that needs to show per-customer delivery stats in real time, which for this use case means joining customer orders in S3 with trip data stored in Dremio. With a traditional pipeline, this would require duplicating data into a warehouse, incurring both cost and latency.</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    "<p>Spice, conversely, federates and accelerates that data locally. Here's what it looks like in practice (which you can validate for yourself in the next section):</p>"
  }
/>

<CoreBlock
  name="core-list"
  content={
    '<ul class="wp-block-list"><li>Raw S3 query (~2,800 rows):&nbsp;<strong>0.87s</strong></li><li>Accelerated S3 query with Spice:&nbsp;<strong>0.02s</strong>&nbsp;(40x faster)</li><li>Raw Dremio query (100,000 rows):&nbsp;<strong>2.67s</strong></li><li>Accelerated Dremio query with Spice:&nbsp;<strong>0.01s</strong>&nbsp;(250x faster)</li><li>Federated aggregation across both:&nbsp;<strong>0.009s<br></strong></li></ul>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>This performance delta transforms multi-system queries from a batch job into something fast enough for an interactive app.</p>'
  }
/>

<CoreBlock
  name="core-heading"
  content={
    '<h2 class="wp-block-heading h4"><strong>Cookbook: How To Run It Yourself</strong></h2>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Watch the video and follow along with the cookbook below to see how to fetch combined data from S3 Parquet, PostgreSQL, and Dremio in a single query.</p>'
  }
/>

<PostVideo
  fields={{
    thumbnail: false,
    type: 'youtube',
    video_id: '0zQtYsw9858',
    video_title:
      'How to Federate SQL Queries Across Data Sources with Spice.ai Open Source',
    video_upload_date: '2025-10-01T16:53:46-07:00',
    video_channel: 'Spice AI',
    video_description:
      'How to federate SQL queries across data sources with Spice.ai Open Source.',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<CoreBlock
  name="core-heading"
  content={
    '<h2 class="wp-block-heading h4">Follow these steps to use Spice to federate SQL queries across data sources</h2>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p><strong>Step 1.</strong>&nbsp;Clone the&nbsp;<a href="https://github.com/spiceai/cookbook">github.com/spiceai/cookbook</a>&nbsp;repo and navigate to the&nbsp;<code>federation</code>&nbsp;directory.</p>'
  }
/>

```python
git clone https://github.com/spiceai/cookbook
cd cookbook/federation
```

<CoreBlock
  name="core-paragraph"
  content={
    '<p><strong>Step 2.</strong>&nbsp;Initialize the Spice app. Use the default name by pressing enter when prompted.</p>'
  }
/>

```python
spice init
name: (federation)?
```

<CoreBlock
  name="core-paragraph"
  content={
    '<p><strong>Step 3.</strong>&nbsp;Log into the demo Dremio instance. Ensure this command is run in the&nbsp;<code>federation</code>&nbsp;directory.</p>'
  }
/>

```python
spice login dremio -u demo -p demo1234
```

<CoreBlock
  name="core-paragraph"
  content={
    '<p><strong>Step 4.</strong>&nbsp;Add the&nbsp;<code>spiceai/fed-demo</code>&nbsp;Spicepod from&nbsp;<a href="https://spicerack.org/">spicerack.org</a>.</p>'
  }
/>

```python
spice add spiceai/fed-demo
```

<CoreBlock
  name="core-paragraph"
  content={'<p><strong>Step 5.</strong>&nbsp;Start the Spice runtime.</p>'}
/>

```python
spice run
2025/01/27 11:36:41 INFO Checking for latest Spice runtime release...
2025/01/27 11:36:42 INFO Spice.ai runtime starting...
2025-01-27T19:36:43.199530Z  INFO runtime::init::dataset: Initializing dataset dremio_source
2025-01-27T19:36:43.199589Z  INFO runtime::init::dataset: Initializing dataset s3_source
2025-01-27T19:36:43.199709Z  INFO runtime::init::dataset: Initializing dataset dremio_source_accelerated
2025-01-27T19:36:43.199537Z  INFO runtime::init::dataset: Initializing dataset s3_source_accelerated
2025-01-27T19:36:43.201310Z  INFO runtime::flight: Spice Runtime Flight listening on 127.0.0.1:50051
2025-01-27T19:36:43.201625Z  INFO runtime::metrics_server: Spice Runtime Metrics listening on 127.0.0.1:9090
2025-01-27T19:36:43.205435Z  INFO runtime::http: Spice Runtime HTTP listening on 127.0.0.1:8090
2025-01-27T19:36:43.209349Z  INFO runtime::opentelemetry: Spice Runtime OpenTelemetry listening on 127.0.0.1:50052
2025-01-27T19:36:43.401179Z  INFO runtime::init::results_cache: Initialized results cache; max size: 128.00 MiB, item ttl: 1s
2025-01-27T19:36:43.624011Z  INFO runtime::init::dataset: Dataset dremio_source_accelerated registered (dremio:datasets.taxi_trips), acceleration (arrow), results cache enabled.
2025-01-27T19:36:43.625619Z  INFO runtime::accelerated_table::refresh_task: Loading data for dataset dremio_source_accelerated
2025-01-27T19:36:43.776300Z  INFO runtime::init::dataset: Dataset dremio_source registered (dremio:datasets.taxi_trips), results cache enabled.
2025-01-27T19:36:44.182533Z  INFO runtime::init::dataset: Dataset s3_source registered (s3://spiceai-demo-datasets/cleaned_sales_data.parquet), results cache enabled.
2025-01-27T19:36:44.203734Z  INFO runtime::init::dataset: Dataset s3_source_accelerated registered (s3://spiceai-demo-datasets/cleaned_sales_data.parquet), acceleration (sqlite), results cache enabled.
2025-01-27T19:36:44.205146Z  INFO runtime::accelerated_table::refresh_task: Loading data for dataset s3_source_accelerated
2025-01-27T19:36:45.138393Z  INFO runtime::accelerated_table::refresh_task: Loaded 2,823 rows (1010.18 kiB) for dataset s3_source_accelerated in 933ms.
2025-01-27T19:36:46.313896Z  INFO runtime::accelerated_table::refresh_task: Loaded 100,000 rows (27.91 MiB) for dataset dremio_source_accelerated in 2s 688ms.
```

<CoreBlock
  name="core-paragraph"
  content={
    '<p><strong>Step 6.</strong>&nbsp;In another terminal window, start the Spice SQL REPL and perform the following SQL queries:</p>'
  }
/>

```python
spice sql
-- Query the federated S3 source
select * from s3_source;
+--------------+------------------+------------+-------------------+---------+---------------------+---------+---------+-------+------+--------------+------+--------------+--------------------+------------------+-------------------------------+---------------+-------+-------+-------------+---------+-----------+-------------------+--------------------+-----------+
| order_number | quantity_ordered | price_each | order_line_number | sales   | order_date          | status  | quarter | month | year | product_line | msrp | product_code | customer_name      | phone            | address_line1                 | address_line2 | city  | state | postal_code | country | territory | contact_last_name | contact_first_name | deal_size |
+--------------+------------------+------------+-------------------+---------+---------------------+---------+---------+-------+------+--------------+------+--------------+--------------------+------------------+-------------------------------+---------------+-------+-------+-------------+---------+-----------+-------------------+--------------------+-----------+
| 10107        | 30               | 95.7       | 2                 | 2871.0  | 2003-02-24T00:00:00 | Shipped | 1       | 2     | 2003 | Motorcycles  | 95   | S10_1678     | Land of Toys Inc.  | 2125557818       | 897 Long Airport Avenue       |               | NYC   | NY    | 10022       | USA     |           | Yu                | Kwai               | Small     |
| 10121        | 34               | 81.35      | 5                 | 2765.9  | 2003-05-07T00:00:00 | Shipped | 2       | 5     | 2003 | Motorcycles  | 95   | S10_1678     | Reims Collectables | 26.47.1555       | 59 rue de l'Abbaye            |               | Reims |       | 51100       | France  | EMEA      | Henriot           | Paul               | Small     |
| 10134        | 41               | 94.74      | 2                 | 3884.34 | 2003-07-01T00:00:00 | Shipped | 3       | 7     | 2003 | Motorcycles  | 95   | S10_1678     | Lyon Souveniers    | +33 1 46 62 7555 | 27 rue du Colonel Pierre Avia |               | Paris |       | 75508       | France  | EMEA      | Da Cunha          | Daniel             | Medium    |
...
+--------------+------------------+------------+-------------------+---------+---------------------+---------+---------+-------+------+--------------+------+--------------+--------------------+------------------+-------------------------------+---------------+-------+-------+-------------+---------+-----------+-------------------+--------------------+-----------+

Time: 0.876282458 seconds. 500/2823 rows displayed.
```

```python
-- Query the accelerated S3 source
select * from s3_source_accelerated;
```

<CoreBlock name="core-paragraph" content={'<p>Output:</p>'} />

```python
+---------------------+-----------------+------------------+-------------+------------+--------------+
| pickup_datetime     | passenger_count | trip_distance_mi | fare_amount | tip_amount | total_amount |
+---------------------+-----------------+------------------+-------------+------------+--------------+
| 2013-08-22T08:24:12 | 1               | 1.1              | 7.5         | 0.0        | 8.0          |
| 2013-08-21T12:40:46 | 1               | 6.1              | 23.0        | 0.0        | 23.5         |
| 2013-08-24T00:40:17 | 2               | 0.6              | 4.5         | 0.0        | 5.5          |
...
+---------------------+-----------------+------------------+-------------+------------+--------------+

Time: 0.015666208 seconds. 500/100000 rows displayed.
-- Perform an aggregation query that combines data from S3 and Dremio
WITH all_sales AS (
    SELECT sales FROM s3_source_accelerated
    UNION ALL
    select fare_amount+tip_amount as sales from dremio_source_accelerated
)

SELECT SUM(sales) as total_sales,
       COUNT(*) AS total_transactions,
       MAX(sales) AS max_sale,
       AVG(sales) AS avg_sale
FROM all_sales;
```

<CoreBlock name="core-paragraph" content={'<p>Output:</p>'} />

```python
+--------------------+--------------------+----------+--------------------+
| total_sales        | total_transactions | max_sale | avg_sale           |
+--------------------+--------------------+----------+--------------------+
| 11501140.079999998 | 102823             | 14082.8  | 111.85376890384445 |
+--------------------+--------------------+----------+--------------------+

Time: 0.009526666 seconds. 1 rows.
```

<CoreBlock
  name="core-heading"
  content={'<h2 class="wp-block-heading h4">Closing Thoughts</h2>'}
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Federated SQL with Spice gives development teams a faster, simpler way to work with distributed data, and allows enterprises to accommodate modern access patterns on top of their existing infrastructure investment. By eliminating ETL bottlenecks and enabling low-latency queries across multiple systems, Spice delivers consistent, high-performance access to data wherever it lives.</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Clone the<a href="https://github.com/spiceai/cookbook/blob/trunk/federation/README.md">&nbsp;cookbook repo</a>&nbsp;and give Spice federation a try!</p>'
  }
/>

<CoreBlock
  name="core-heading"
  content={'<h3 class="wp-block-heading h5">Getting Started with Spice</h3>'}
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Spice is open source (Apache 2.0) and can be&nbsp;<a href="https://spiceai.org/docs/getting-started">installed in less than a minute</a>&nbsp;on macOS, Linux, or Windows, and also offers an&nbsp;<a href="/pricing">enterprise-grade Cloud deployment</a>.</p>'
  }
/>

<CoreBlock
  name="core-list"
  content={
    '<ul class="wp-block-list"><li>Explore the&nbsp;<a href="https://spiceai.org/docs">open source docs</a>&nbsp;and&nbsp;<a href="/blog">blog</a></li><li>Visit the&nbsp;<a href="https://spiceai.org/docs/getting-started">getting started guide</a>‍</li><li>Explore the 75+&nbsp;<a href="/cookbook">cookbooks</a></li><li><a href="/cookbook">‍</a>Try&nbsp;<a href="/pricing">Spice.ai Cloud&nbsp;</a>for a fully managed deployment and<a href="/login?from=landing">&nbsp;get started for free</a>.</li></ul>'
  }
/>

<CoreBlock name="core-paragraph" content={'<p></p>'} />

## Frequently Asked Questions

### What is SQL query federation?

SQL query federation is the ability to execute a single SQL query across multiple data sources (databases, data warehouses, data lakes, and APIs) without moving the data first. Spice federates queries across [30+ connectors](/platform/sql-federation-acceleration) and returns results through a unified SQL interface, eliminating the need for ETL pipelines or data duplication.

### How does data acceleration differ from caching?

Data acceleration materializes selected datasets into a local engine (Arrow, DuckDB, SQLite, or [Cayenne](/blog/introducing-spice-cayenne-data-accelerator)) with configurable refresh policies, so queries always hit pre-loaded data. Traditional caching stores individual query results with TTL-based expiration. Acceleration provides consistent sub-millisecond performance for any query pattern against the accelerated dataset, not just previously executed queries.

### Can Spice query data without moving it from the source?

Yes. Spice's federation layer pushes query predicates down to source systems and returns only the matching rows. For data that is queried frequently, you can optionally enable acceleration to materialize a local copy with automatic refresh. Both modes avoid traditional ETL: the data stays at the source or is managed declaratively by Spice.

### What data sources does Spice support for federation?

Spice supports over 30 data connectors including PostgreSQL, MySQL, DynamoDB, Snowflake, Databricks, S3 (Parquet, Iceberg, Delta Lake), ClickHouse, Dremio, SharePoint, GitHub, and more. New connectors are added regularly. See the full list in the [Spice documentation](https://spiceai.org/docs/components/data-connectors). Teams that federate through Dremio today can move off it one dataset at a time with the [phased Dremio migration guide](/blog/migrating-off-dremio-phased-guide).

Federation also scales out: [distributed query](/feature/distributed-query) runs the same SQL across a multi-node cluster.

<ContentResourceFeatured
  fields={{
    heading: 'Explore more Spice resources',
    paragraph:
      'Tutorials, docs, and blog posts to help you go deeper with Spice.',
    mode: 'related',
    resources: false,
    padding_top: 'unset',
    padding_bottom: 'unset',
    related_posts: [],
  }}
/>

<TalkToAnEngineerCta />

<ContentRichText
  fields={{
    coverage: 'rc-end',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

---

## Spice.ai's approach to Time-Series AI
URL: https://spice.ai/blog/spiceais-approach-to-time-series-ai
Date: 2021-11-18T18:27:54
Description: Explore the challenges of time-series AI and why Spice.ai uses a data-driven reinforcement learning approach to help developers build adaptive, intelligent applications.

<ContentRichText
  fields={{
    coverage: 'rc-start',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>The Spice.ai project strives to help developers build applications that leverage new AI advances which can be easily trained, deployed, and integrated. We recently introduced <a href="https://spiceai.org/docs/getting-started/spicepods">Spicepods</a>: a declarative way to create AI applications with Spice.ai technology. While there are many libraries and platforms in the space, Spice.ai is focused on time-series data aligning to application-centric and frequently time-dependent data, and a reinforcement learning approach, which can be more developer-friendly than expensive, labeled supervised learning.</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>This post will discuss some of the challenges and directions for the technology we are developing.</p>'
  }
/>

<CoreBlock
  name="core-heading"
  content={'<h2 class="wp-block-heading h3" id="time-series">Time Series</h2>'}
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p><img src="https://web.archive.org/web/20251115000318im_/https://user-images.githubusercontent.com/19952490/142404970-de910848-cdb4-451b-a0d5-302c90215216.png" alt="Time Series processing visualization: a time window is usually chosen to process part of the data stream">&nbsp;<em>Figure 1. Time Series processing visualization: a time window is usually chosen to process part of the data stream</em></p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Time series AI has become more popular over recent years, and there is extensive literature on the subject, including time-series-focused neural networks. Research in this space points to the likelihood that there is no silver bullet, and a single approach to time series AI will not be sufficient. However, for developers, this can make building a product complex, as it comes with the challenge of exploring and evaluating many algorithms and approaches.</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    "<p>A fundamental challenge of time series is the data itself. The shape and length are usually variable and can even be infinite (real-time streams of data). The volume of data required is often too much for simple and efficient machine learning algorithms such as Decision Trees. This challenge makes Deep Learning popular to process such data. There are several types of neural networks that have been shown to work well with time series so let's review some of the common classes:</p>"
  }
/>

<CoreBlock
  name="core-list"
  content={
    '<ul class="wp-block-list"><li><a href="https://en.wikipedia.org/wiki/Convolutional_neural_network" target="_blank" rel="noreferrer noopener">Convolutional Neural Networks (CNN)</a>: CNN\'s can only accept data with fixed lengths: even with the ability to pad the data, this is a major drawback for time-series data as a specific time window needs to be decided. Despite this limitation, they are the most efficient network to train (computation, data needed, time) and usually the smallest storage. CNN\'s are very robust and used in image/video processing, making them a very good baseline to start with while also benefiting from refined and mature development over the years, such as with the very efficient MobileNet with depth-wise convolutions.</li><li><a href="https://en.wikipedia.org/wiki/Recurrent_neural_network" target="_blank" rel="noreferrer noopener">Recurrent Neural Networks (RNN)</a>: RNNs have been researched for several decades, and while they aren\'t as fast to train as CNNs, they can be faster to apply as there is no need to feed a time window like CNNs if the desired input/output is in real-time (in a continuous fashion, also called \'online). RNNs are proven to be very good in some situations, and many new models are being discovered.</li><li><a href="https://en.wikipedia.org/wiki/Transformer_(deep_learning)" target="_blank" rel="noreferrer noopener">Transformers</a>: Most of the state-of-the-art results today have been made from transformers and their variations. They are very good at correlating sparse information. Popularized in the famous paper <a href="https://en.wikipedia.org/wiki/Attention_Is_All_You_Need" target="_blank" rel="noreferrer noopener">Attention is all you need</a>, transformers are proven to be flexible with high-performance in many classes (Vision Transformers, Perceiver, etc.). They suffer the same limitation as CNNs for the length of their input (fixed at training time), but they also have a disadvantage of not scaling well with the size of the data (quadratic growth with the length of the time series). They are also the most expensive network to train in general.</li></ul>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    "<p>While not a complete representation of classes of neural networks, this list represents the areas of the most potential for Spice.ai's time-series AI technology. We also see other interesting paradigms to explore when improving the core technology like Memory Augmented Neural Networks (MANN) or neural network-based Genetical Algorithms.</p>"
  }
/>

<CoreBlock
  name="core-heading"
  content={
    '<h2 class="wp-block-heading h3" id="reinforcement-learning">Reinforcement Learning</h2>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    "<p>Reinforcement Learning (RL) has grown steadily, especially in fields like robotics. Usually, RL doesn't require as much data processing as Supervised Learning, where large datasets can be demanding for hardware and people alike. RL is more dynamic: agents aren't trained to replicate a specific behaviors/output but explore and 'exploit' their environment to maximize a given reward.</p>"
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    "<p>Most of today's research is based on environments the agent can interact with during the training process, known as online learning. Usually, efficient training processes have multiple agent/environment pairs training together and sharing their experiences. Having an environment for agents to interact enables different actions from the actual historical state known as&nbsp;<strong>on-policy learning</strong>, and using only past experiences without an environment is&nbsp;<strong>off-policy learning</strong>.</p>"
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p><img src="https://web.archive.org/web/20251115000318im_/https://user-images.githubusercontent.com/19952490/142404987-cc6f0654-d2bd-496a-b6a4-52da19b9f912.png" alt="AI training without interacting with the environment">&nbsp;<em>Figure 2. AI training without interacting with the environment (real world nor simulation). Only gathered data is used for training.</em></p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Spice.ai is initially taking an off-policy approach, where an environment (either pre-made or given by the user) is not required. Despite limiting the exploration of agents, this aligns to an application-centric approach as:</p>'
  }
/>

<CoreBlock
  name="core-list"
  content={
    '<ul class="wp-block-list"><li>Creating a real-world model or environment can be difficult and expensive to create, arguably even impossible.</li><li>Off-policy learning is normally more efficient than on-policy (time/data and computation).</li></ul>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>The Spice.ai approach to time series AI can be described as \'Data-Driven\' Reinforcement Learning. This domain is very exciting, and we are building upon excellent research that is being published. The&nbsp;<a href="https://web.archive.org/web/20251115000318/https://bair.berkeley.edu/" target="_blank" rel="noreferrer noopener">Berkeley Artificial Intelligence Research</a>\'s blog shows the potential of this field and many other research entities that have made great discoveries like&nbsp;<a href="https://web.archive.org/web/20251115000318/https://deepmind.com/" target="_blank" rel="noreferrer noopener">DeepMind</a>,&nbsp;<a href="https://web.archive.org/web/20251115000318/https://openai.com/" target="_blank" rel="noreferrer noopener">Open AI</a>,&nbsp;<a href="https://web.archive.org/web/20251115000318/https://ai.facebook.com/" target="_blank" rel="noreferrer noopener">Facebook AI</a>&nbsp;and&nbsp;<a href="https://web.archive.org/web/20251115000318/https://ai.google/" target="_blank" rel="noreferrer noopener">Google AI</a>&nbsp;(among many others). We are inspired and are building upon all the research in Reinforcement Learning to develop core Spice.ai technology.</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>If you are interested in Reinforcement Learning, we recommend following these blogs, and if you\'d like to partner with us on the mission of making it easier to build intelligent applications by leveraging RL, we invite you to discuss with us on <a href="/slack">Slack</a>, or reach out on <a href="https://x.com/spice_ai" target="_blank" rel="noreferrer noopener">Twitter</a>.</p>'
  }
/>

Spice AI's focus has since expanded from time-series AI to the operational data lakehouse. See how the platform handles [SQL federation and acceleration](/platform/sql-federation-acceleration) and [retrieval-augmented generation](/use-case/retrieval-augmented-generation) today, or [get a demo](/get-a-demo).

<ContentResourceFeatured
  fields={{
    heading: 'Explore more Spice resources',
    paragraph:
      'Tutorials, docs, and blog posts to help you go deeper with Spice.',
    mode: 'related',
    resources: false,
    padding_top: 'unset',
    padding_bottom: 'unset',
    related_posts: [
      {
        title: 'A Developer&#8217;s Guide to Understanding Spice.ai',
        slug: '/blog/a-developers-guide-to-understanding-spice-ai',
        excerpt:
          'This guide helps developers build a mental model of why, how, and where to use Spice.',
        image:
          '/website-assets/media/2026/02/A-developers-guide-to-understanding-Spice.ai_.png',
        type: 'Blog',
        taxonomy: [
          'Engineering',
          'Spice AI',
          'Spice Cloud Platform',
          'Spice OSS',
        ],
      },
      {
        title: 'Real-Time Control Plane Acceleration with DynamoDB Streams ',
        slug: '/blog/real-time-acceleration-with-dynamodb-streams',
        excerpt:
          'How to sync DynamoDB data to thousands of nodes with sub-second latency using a two-tier architecture with DynamoDB Streams and Spice acceleration.',
        image: '/website-assets/media/2026/01/image-33.png',
        type: 'Blog',
        taxonomy: [
          'Data Acceleration',
          'Engineering',
          'Spice Cloud Platform',
          'Spice OSS',
        ],
      },
      {
        title: 'How we use Apache DataFusion at Spice AI',
        slug: '/blog/how-we-use-apache-datafusion-at-spice-ai',
        excerpt:
          'Why we chose to build on DataFusion and how we extended it with custom TableProviders, optimizer rules, and UDFs for federated SQL',
        image:
          '/website-assets/media/2026/01/Engineering-at-Spice-AI-Apache-DataFusion.png',
        type: 'Blog',
        taxonomy: [
          'Spice AI',
          'Spice Cloud Platform',
          'Spice OSS',
          'SQL Federation',
        ],
      },
    ],
  }}
/>

<TalkToAnEngineerCta />

<ContentRichText
  fields={{
    coverage: 'rc-end',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

---

## Spicepods: From Zero to Hero
URL: https://spice.ai/blog/spicepods-from-zero-to-hero
Date: 2021-12-02T18:41:30
Description: A step-by-step guide to authoring a Spicepod from scratch and using it to build an application that learns and adapts over time.

<ContentRichText
  fields={{
    coverage: 'rc-start',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>In my previous post,&nbsp;<a href="/blog/making-apps-that-learn-and-adapt" target="_blank" rel="noreferrer noopener">Teaching Apps how to Learn with Spicepods</a>, I introduced Spicepods as packages of configuration that describe an application\'s data-driven goals and how it should learn from data. To leverage Spice.ai in your application, you can author a Spicepod from scratch or build upon one fetched from the spicerack.org registry. In this post, we\'ll walk through the creation and authoring of a Spicepod step-by-step from scratch.</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={'<p>As a refresher, a Spicepod consists of:</p>'}
/>

<CoreBlock
  name="core-list"
  content={
    '<ul class="wp-block-list"><li>A required YAML manifest that describes how the pod should learn from data</li><li>Optional seed data</li><li>Learned model/state</li><li>Performance telemetry and metrics</li></ul>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>We\'ll create the Spicepod for the&nbsp;<a href="https://web.archive.org/web/20251114231007/https://github.com/spiceai/quickstarts/tree/trunk/serverops/README.md" target="_blank" rel="noreferrer noopener">ServerOps Quickstart</a>, an application that learns when to optimally run server maintenance operations based upon the CPU-usage patterns of a server machine.</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>We\'ll also use the Spice CLI, which you can install by following the <a href="https://spiceai.org/docs/getting-started" target="_blank" rel="noreferrer noopener">Getting Started guide</a> or <a href="https://www.youtube.com/watch?v=yAIyjb1RxX4" target="_blank" rel="noreferrer noopener">Getting Started YouTube video</a>.</p>'
  }
/>

<CoreBlock
  name="core-heading"
  content={
    '<h2 class="wp-block-heading h4" id="fast-iterations">Fast iterations</h2>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Modern web development workflows often include a file watcher to hot-reload so you can iteratively see the effect of your change with a live preview.</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Spice.ai takes inspiration and enables a similar Spicepod manifest authoring experience. If you first start the Spice.ai runtime in your application root before creating your Spicepod, it will watch for changes and apply them continuously so that you can develop in a fast, iterative workflow.</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>You would normally do this by opening two terminal windows side-by-side, one that runs the runtime using the command&nbsp;<code>spice run</code>&nbsp;and one where you enter CLI commands. In addition, developers would open the Spice.ai dashboard located at&nbsp;<a href="https://web.archive.org/web/20251114231007/http://localhost:8000/" target="_blank" rel="noreferrer noopener">http://localhost:8000</a>&nbsp;to preview changes they make.</p>'
  }
/>

<CoreBlock
  name="core-image"
  content={
    '<figure class="wp-block-image"><img src="https://web.archive.org/web/20251114231007im_/https://user-images.githubusercontent.com/80174/144368808-1b1ce9dc-e296-42ff-a65d-44b8aa97605f.png" alt="Figure 1. Spice.ai\'s modern development workflow"/></figure>'
  }
/>

<CoreBlock
  name="core-heading"
  content={
    '<h2 class="wp-block-heading h4" id="creating-a-spicepod">Creating a Spicepod</h2>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    "<p>The easiest way to create a Spicepod is to use the Spice.ai CLI command:&nbsp;<code>spice init &lt;Spicepod name&gt;</code>. We'll make one in the ServerOps Quickstart application called&nbsp;<code>serverops</code>.</p>"
  }
/>

<CoreBlock
  name="core-image"
  content={
    '<figure class="wp-block-image"><img src="https://web.archive.org/web/20251114231007im_/https://user-images.githubusercontent.com/80174/144368947-2698d7e2-e451-4961-a289-d84f4f328eae.png" alt="Figure 2. Creating a Spicepod."/></figure>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    "<p>The CLI saves the Spicepod manifest file in the&nbsp;<code>spicepods</code>&nbsp;directory of your application. You can see it created a new serverops.yaml file, which should be included in your application and be committed to your source repository. Let's take a look at it.</p>"
  }
/>

<CoreBlock
  name="core-image"
  content={
    '<figure class="wp-block-image"><img src="https://web.archive.org/web/20251114231007im_/https://user-images.githubusercontent.com/80174/144369087-59022f3d-84cc-4f8f-bceb-c60351ac69b7.png" alt="Figure 3. Spicepod manifest."/></figure>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>The initialized manifest file is very simple. It contains a name and three main sections being:</p>'
  }
/>

<CoreBlock
  name="core-list"
  content={
    '<ul class="wp-block-list"><li>dataspaces</li><li>actions</li><li>training</li></ul>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>We\'ll walk through each of these in detail, and as a Spicepod author, you can always reference the documentation for the <a href="https://spiceai.org/docs/getting-started/spicepods" target="_blank" rel="noreferrer noopener">Spicepod manifest syntax</a>.</p>'
  }
/>

<CoreBlock
  name="core-heading"
  content={
    '<h2 class="wp-block-heading h4" id="authoring-a-spicepod-manifest">Authoring a Spicepod manifest</h2>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>You author and edit Spicepod manifest files in your favorite text editor with a combination of Spice.ai CLI helper commands. We eventually plan to have a VS Code extension and dashboard/portal editing abilities to make this even easier.</p>'
  }
/>

<CoreBlock
  name="core-heading"
  content={
    '<h2 class="wp-block-heading h4" id="adding-a-dataspace">Adding a dataspace</h2>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>To build an intelligent, data-driven application, we must first start with data.</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>A Spice.ai <strong>dataspace</strong> is a logical grouping of data with definitions of how that data should be loaded and processed, usually from a single source. A combination of its data source and its name identifies it, for example, nasdaq/msft or twitter/tweets. Read more about Dataspaces in the <a href="https://spiceai.org/docs" target="_blank" rel="noreferrer noopener">Core Concepts</a> documentation.</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Let\'s add a dataspace to the Spicepod manifest to load CPU metric data from a CSV file. This file is a snapshot of data from <a href="https://www.influxdata.com/" target="_blank" rel="noreferrer noopener">InfluxDB</a>, a time-series database we like.</p>'
  }
/>

<CoreBlock
  name="core-image"
  content={
    '<figure class="wp-block-image"><img src="https://web.archive.org/web/20251114231007im_/https://user-images.githubusercontent.com/80174/144369723-4336a4d5-1637-42c8-94aa-369531d6d1f7.png" alt="Figure 4. Adding a dataspace."/></figure>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>We can see this dataspace is identified by its source&nbsp;<code>hostmetrics</code>&nbsp;and name&nbsp;<code>cpu</code>. It includes a&nbsp;<code>data</code>&nbsp;section with a file data connector, the path to the file, and a data processor to know how to process it. In addition, it defines a single measurement&nbsp;<code>usage_idle</code>&nbsp;under the measurements section, which is a measurement of CPU load. In Spice.ai, measurements are the core primitive the AI engine uses to learn and is always numerical data. Spice.ai includes a growing library of community contributable data connectors and data processors you can consist of in your Spicepod to access data. You can also contribute your own.</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    "<p>Finally, because the data is a snapshot of live data loaded from a file, we must set a Spicepod&nbsp;<code>epoch_time</code>&nbsp;that defines the data's start Unix time.</p>"
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Now we have a dataspace, called&nbsp;<code>hostmetrics/cpu</code>, that loads CSV data from a file and processes the data into a&nbsp;<code>usage_idle</code>&nbsp;measurement. The file connector might be swapped out with the InfluxDB connector in a production application to stream real-time CPU metrics into Spice.ai. And in addition, applications can always send real-time data to the Spice.ai runtime through its API with a simple HTTP POST (and in the future, using Web Sockets and gRPC).</p>'
  }
/>

<CoreBlock
  name="core-heading"
  content={
    '<h2 class="wp-block-heading h4" id="adding-actions">Adding actions</h2>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    "<p>Now that the Spicepod has data, let's define some data-driven actions so the ServerOps application can learn when is the best time to take them. We'll add three actions using the CLI helper command,&nbsp;<code>spice action add</code>.</p>"
  }
/>

<CoreBlock
  name="core-image"
  content={
    '<figure class="wp-block-image"><img src="https://web.archive.org/web/20251114231007im_/https://user-images.githubusercontent.com/80174/144369840-1dcea686-9661-408a-a8a4-c62e3d84093f.png" alt="Figure 5. Adding actions."/></figure>'
  }
/>

<CoreBlock name="core-paragraph" content={'<p>And in the manifest:</p>'} />

<CoreBlock
  name="core-image"
  content={
    '<figure class="wp-block-image"><img src="https://web.archive.org/web/20251114231007im_/https://user-images.githubusercontent.com/80174/144371117-5eb816aa-e088-4160-8f33-9dabf1a5bb7c.png" alt="Figure 6. Actions added to the manifest"/></figure>'
  }
/>

<CoreBlock
  name="core-heading"
  content={
    '<h2 class="wp-block-heading h4" id="adding-rewards">Adding rewards</h2>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    "<p>The Spicepod now has data and possible actions, so we can now define how it should learn when to take them. Similar to how humans learn, we can set rewards or punishments for actions taken based on their effect and the data. Let's add scaffold rewards for all actions using the&nbsp;<code>spice rewards add</code>&nbsp;command.</p>"
  }
/>

<CoreBlock
  name="core-image"
  content={
    '<figure class="wp-block-image"><img src="https://web.archive.org/web/20251114231007im_/https://user-images.githubusercontent.com/80174/144371214-86803184-5100-45cb-a592-ac3114176dba.png" alt="Figure 7. Adding rewards"/></figure>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>We now have rewards set for each action. The rewards are uniform (all the same), meaning the Spicepod is rewarded the same for each action. Higher rewards are better, so if we change&nbsp;<code>perform_maintenance</code>&nbsp;to 2, the Spicepod will learn to perform maintenance more often than the other actions. Of course, instead of setting these arbitrarily, we want to learn from data, and we can do that by referencing the state of data at each time-step in the time-series data as the AI engine trains.</p>'
  }
/>

<CoreBlock
  name="core-image"
  content={
    '<figure class="wp-block-image"><img src="https://web.archive.org/web/20251114231007im_/https://user-images.githubusercontent.com/80174/144371299-70b40d99-85e1-4ab8-b1e1-f4f40aa27fc7.png" alt="Figure 8. Rewards added to the manifest"/></figure>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>The rewards themselves are just code. Currently, we currently support Python code, either inline or in a .py&nbsp;<a href="https://web.archive.org/web/20251114231007/https://docs.spiceai.org/concepts/rewards/external/" target="_blank" rel="noreferrer noopener">external code file</a>&nbsp;and we plan to support several other languages. The reward code can access the time-step state through the&nbsp;<code>prev_state</code>&nbsp;and&nbsp;<code>new_state</code>&nbsp;variables and the dataspace name. For the full documentation, see&nbsp;<a href="https://web.archive.org/web/20251114231007/https://docs.spiceai.org/concepts/rewards/" target="_blank" rel="noreferrer noopener">Rewards</a>.</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    "<p>Let's add this reward code to perform_maintenance, which will reward performing maintenance when there is low CPU usage.</p>"
  }
/>

<CoreBlock
  name="core-code"
  content={
    '<pre class="wp-block-code"><code>cpu_usage_prev = 100 - prev_state.hostmetrics_cpu_usage_idle<br>cpu_usage_new = 100 - new_state.hostmetrics_cpu_usage_idle<br>cpu_usage_delta = cpu_usage_prev - cpu_usage_new<br>reward = cpu_usage_delta / 100</code></pre>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>This code takes the CPU usage (100 minus the idle time) deltas between the previous time state and the current time state, and sets the reward to be a normalized delta value between 0 and 1. When the CPU usage is moving from higher&nbsp;<code>cpu_usage_prev</code>&nbsp;to lower&nbsp;<code>cpu_usage_low</code>, its a better time to run server maintenance and so we reward the inverse of the delta. E.g.&nbsp;<code>80% - 50% = 30% = 0.3</code>. However, if the CPU moves lower to higher,&nbsp;<code>50% - 80% = -30% = -0.3</code>, it\'s a bad time to run maintenance, so we provide a negative reward or "punish" the action.</p>'
  }
/>

<CoreBlock
  name="core-image"
  content={
    '<figure class="wp-block-image"><img src="https://web.archive.org/web/20251114231007im_/https://user-images.githubusercontent.com/80174/144371629-497f0ed4-1217-4e55-b7dd-0eec3eb187ae.png" alt="Figure 9. Reward code"/></figure>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Through these rewards and punishments and the CPU metric data, the Spicepod will when it is a good time to perform maintence and be the decision engine for the ServerOps application. You might be thinking you could write code without AI to do this, which is true, but handling the variety of cases, like CPU spikes, or patterns in the data, like cyclical server load, would take a lot of code and a development time. Applying AI helps you build faster.</p>'
  }
/>

<CoreBlock
  name="core-heading"
  content={
    '<h2 class="wp-block-heading h4" id="putting-it-all-together">Putting it all together</h2>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>The manifest now has defined data, actions, and rewards. The Spicepod can get data to learn which actions to take and when based on the rewards provided.</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>If the Spice.ai runtime is running, the Spicepod automatically trains each time the manifest file is saved. As this happens reward performance can be monitored in the dashboard.</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Once a training run completes, the application can query the Spicepod for a decision recommendation by calling the recommendations API&nbsp;<a href="https://web.archive.org/web/20251114231007/http://localhost:8000/api/v0.1/pods/serverops/recommendation" target="_blank" rel="noreferrer noopener">http://localhost:8000/api/v0.1/pods/serverops/recommendation</a>. The API returns a JSON document that provides the recommended action, the confidence of taking that action, and when that recommendation is valid.</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>In the&nbsp;<a href="https://web.archive.org/web/20251114231007/https://github.com/spiceai/quickstarts/tree/trunk/serverops/README.md" target="_blank" rel="noreferrer noopener">ServerOps Quickstart</a>, this API is called from the server maintenance PowerShell script to make an intelligent decision on when to run maintenance. The&nbsp;<a href="https://web.archive.org/web/20251114231007/https://github.com/spiceai/samples/tree/trunk/serverops/README.md" target="_blank" rel="noreferrer noopener">ServerOps Sample</a>, which uses live data, can be continuously trained to learn and adapt even as the live data changes due to load patterns changing.</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>The full Spicepod manifest from this walkthrough can be added from <a href="https://spicerack.org/" target="_blank" rel="noreferrer noopener">spicerack.org</a> using the <code>spice add quickstarts/serverops</code> command.</p>'
  }
/>

<CoreBlock
  name="core-heading"
  content={'<h2 class="wp-block-heading h4" id="summary">Summary</h2>'}
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Leveraging Spice.ai to be the decision engine for your server maintenance application helps you build smarter applications, faster that will continue to learn and adapt over time, even as usage patterns change over time.</p>'
  }
/>

<CoreBlock
  name="core-heading"
  content={
    '<h3 class="wp-block-heading h5" id="learn-more-and-contribute">Learn more and contribute</h3>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Building intelligent apps that leverage AI is still way too hard, even for advanced developers. Our mission is to make this as easy as creating a modern web page. If the vision resonates with you, join us!</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Our <a href="https://github.com/spiceai/spiceai/blob/trunk/docs/ROADMAP.md" target="_blank" rel="noreferrer noopener">Spice.ai Roadmap</a> is public, and now that we have launched, the project and work are open for collaboration.</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>If you are interested in partnering, we\'d love to talk. Try out <a href="https://spiceai.org/docs/getting-started" target="_blank" rel="noreferrer noopener">Spice.ai</a>, <a href="mailto:hey@spice.ai" target="_blank" rel="noreferrer noopener">email us</a> "hey," join our community <a href="/slack">Slack</a>, or reach out on <a href="https://x.com/spice_ai" target="_blank" rel="noreferrer noopener">Twitter</a>.</p>'
  }
/>

Spicepods remain the declarative heart of Spice today, configuring [federated SQL and acceleration](/platform/sql-federation-acceleration) and [AI model serving](/feature/ai-model-serving). To see modern Spicepods in action, [get a demo](/get-a-demo).

<CoreBlock
  name="core-paragraph"
  content={'<p>We are just getting started! 🚀</p>'}
/>

<CoreBlock name="core-paragraph" content={'<p>Luke</p>'} />

<ContentResourceFeatured
  fields={{
    heading: 'Explore more Spice resources',
    paragraph:
      'Tutorials, docs, and blog posts to help you go deeper with Spice.',
    mode: 'related',
    resources: false,
    padding_top: 'unset',
    padding_bottom: 'unset',
    related_posts: [
      {
        title: 'A Developer&#8217;s Guide to Understanding Spice.ai',
        slug: '/blog/a-developers-guide-to-understanding-spice-ai',
        excerpt:
          'This guide helps developers build a mental model of why, how, and where to use Spice.',
        image:
          '/website-assets/media/2026/02/A-developers-guide-to-understanding-Spice.ai_.png',
        type: 'Blog',
        taxonomy: [
          'Engineering',
          'Spice AI',
          'Spice Cloud Platform',
          'Spice OSS',
        ],
      },
      {
        title: 'Real-Time Control Plane Acceleration with DynamoDB Streams ',
        slug: '/blog/real-time-acceleration-with-dynamodb-streams',
        excerpt:
          'How to sync DynamoDB data to thousands of nodes with sub-second latency using a two-tier architecture with DynamoDB Streams and Spice acceleration.',
        image: '/website-assets/media/2026/01/image-33.png',
        type: 'Blog',
        taxonomy: [
          'Data Acceleration',
          'Engineering',
          'Spice Cloud Platform',
          'Spice OSS',
        ],
      },
      {
        title: 'How we use Apache DataFusion at Spice AI',
        slug: '/blog/how-we-use-apache-datafusion-at-spice-ai',
        excerpt:
          'Why we chose to build on DataFusion and how we extended it with custom TableProviders, optimizer rules, and UDFs for federated SQL',
        image:
          '/website-assets/media/2026/01/Engineering-at-Spice-AI-Apache-DataFusion.png',
        type: 'Blog',
        taxonomy: [
          'Spice AI',
          'Spice Cloud Platform',
          'Spice OSS',
          'SQL Federation',
        ],
      },
    ],
  }}
/>

<TalkToAnEngineerCta />

<ContentRichText
  fields={{
    coverage: 'rc-end',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

---

## Teaching Apps how to Learn with Spicepods
URL: https://spice.ai/blog/teaching-apps-how-to-learn-with-spicepods
Date: 2021-11-15T18:20:37
Description: Learn how Spicepods define application goals, rewards, and learning behavior - making it easy for developers to build applications that learn and adapt over time.

<ContentRichText
  fields={{
    coverage: 'rc-start',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>The last post in this series,&nbsp;<a href="/blog/making-apps-that-learn-and-adapt" target="_blank" rel="noreferrer noopener">Making Apps that Learn and Adapt</a>, described the shift from building AI/ML solutions to building apps that learn and adapt. But, how does the app learn? And as a developer, how do I teach it what it should learn?</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>With <a href="https://spiceai.org/docs/getting-started" target="_blank" rel="noreferrer noopener">Spice.ai</a>, we teach the app how to learn using a Spicepod.</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    "<p>Imagine you own a restaurant. You created a menu, hired staff, constructed the kitchen and dining room, and got off to a great start when it first opened. However, over the years, your customers' tastes changed, you've had to make compromises on ingredients, and there's a hot new place down the street... business is stagnating, and you know that you need to make some changes to stay competitive.</p>"
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    "<p>You have a few options. First, you could gather all the data, such as customer surveyss, seasonal produce metrics, and staff performance profiles. You may even hire outside consultants. You then take this data to your office, and after spending some time organizing, filtering, and collating it, you've discovered an insight! Your seafood dishes sell poorly and cost the most... you are losing money! You spend several weeks or months perfecting a new menu, which you roll out with much fanfare! And then... business is still poor. What!? How could this be? It was a data-driven approach! You start the process again. While this approach is a worthy option, it has long latency from data to learning to implementation.</p>"
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Another option is to build real-time learning and adaption directly into the restaurant. Imagine a staff member whose sole job was learning and adapting how the restaurant should operate; lets name them Blue. You write a guide for Blue that defines certain goal metrics, like customer food ratings, staff happiness, and of course, profit. Blue tracks each dish served, from start to finish, from who prepared it to its temperature, its costs, and its final customer taste rating. Blue not only learns from each customer review as each dish is consumed but also how dish preparation affects other goal metrics, like profitability. The restaurant staff consults Blue to determine any adjustments to improve goal metrics as they work. The latency from data to learning, to adaption, has been reduced, from weeks or months to minutes. This option, of course, is not feasible for most restaurants, but software applications can use this approach. Blue and his instructions are analogous to the Spice.ai runtime and manifest.</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>In the Spice.ai model, developers teach the app how to learn by describing goals and rewarding its actions, much like how a parent might teach a child. As these rewards are applied in training, the app learns what actions maximize its rewards towards the defined goals.</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    "<p>Returning to the restaurant example, you can think of the Spice.ai runtime as Blue, and Spicepod manifests as the guide on how Blue should learn. Individual staff members would consult with Blue for ongoing recommendations on decisions to make and how to act. These goals and rewards are defined in&nbsp;<strong>Spicepods</strong>&nbsp;or \"pods\" for short. Spicepods are packages of configuration that describe the application's goals and how it should learn from data. Although it's not a direct analogy, Spicepods and their manifests can be conceptualized similar to Docker containers and Dockerfiles. In contrast, Dockerfiles define the packaging of your app, Spicepods specify the packaging of your app's learning and data.</p>"
  }
/>

<CoreBlock
  name="core-heading"
  content={
    '<h2 class="wp-block-heading h4"><strong>Anatomy of a Spicepod</strong></h2>'
  }
/>

<CoreBlock name="core-paragraph" content={'<p>A Spicepod consists of:</p>'} />

<CoreBlock
  name="core-list"
  content={
    '<ul class="wp-block-list"><li>A required YAML manifest that describes how the pod should learn from data</li><li>Optional seed data</li><li>Learned model/state</li><li>Performance telemetry and metrics</li></ul>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Developers author Spicepods using the&nbsp;<code>spice</code>&nbsp;CLI command such as with&nbsp;<code>spice pod init &lt;name&gt;</code>&nbsp;or simply by creating a manifest file such as&nbsp;<code>mypod.yaml</code>&nbsp;in the&nbsp;<code>spicepods</code>&nbsp;directory of their application.</p>'
  }
/>

<CoreBlock
  name="core-heading"
  content={
    '<h2 class="wp-block-heading h4"><strong>Spicepods as packages</strong></h2>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>On disk, Spicepods are generally layouts of a manifest file, seed data, and trained models, but they can also be exported as zipped packages.</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>When the runtime exports a Spicepod using the&nbsp;<code>spice export</code>&nbsp;command, it is saved with a&nbsp;<code>.spicepod</code>&nbsp;extension. It can then be shared, archived, or imported into another instance of the Spice.ai runtime.</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Soon, we also expect to enable publishing of&nbsp;<code>.spicepods</code>&nbsp;to spicerack.org, from where community-created Spicepods can easily be added to your application using&nbsp;<code>spice add &lt;pod name&gt;</code>&nbsp;(currently, only Spice AI published pods are available on spicerack.org).</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Treating Spicepods as packages and enabling their sharing and distribution through spicerack.org will help developers share their "restaurant guides" and build upon each other\'s work, much like they do with npmjs.org or pypi.org. In this way, developers can together build better and more intelligent applications.</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>In the next post, we\'ll dive deeper into authoring a Spicepod manifest to create an intelligent application. Follow&nbsp;<a href="https://web.archive.org/web/20251115002509/https://twitter.com/spice_ai" target="_blank" rel="noreferrer noopener">@spice_ai</a>&nbsp;on Twitter to get an update when we post.</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>If you haven\'t already, read the next the first post in the series, <a href="/blog/making-apps-that-learn-and-adapt" target="_blank" rel="noreferrer noopener">Making Apps that Learn and Adapt</a>.</p>'
  }
/>

<CoreBlock
  name="core-heading"
  content={
    '<h2 class="wp-block-heading h4" id="learn-more-and-contribute">Learn more and contribute</h2>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Building intelligent apps that leverage AI is still way too hard, even for advanced developers. Our mission is to make this as easy as creating a modern web page. If the vision resonates with you, join us!</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Our&nbsp;<a href="https://web.archive.org/web/20251115002509/https://github.com/spiceai/spiceai/blob/trunk/docs/ROADMAP.md" target="_blank" rel="noreferrer noopener">Spice.ai Roadmap</a>&nbsp;is public, and now that we have launched, the project and work are open for collaboration.</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>If you are interested in partnering, we\'d love to talk. Try out <a href="https://spiceai.org/docs/getting-started" target="_blank" rel="noreferrer noopener">Spice.ai</a>, <a href="mailto:hey@spice.ai" target="_blank" rel="noreferrer noopener">email us</a> "hey," join our community <a href="/slack">Slack</a>, or reach out on <a href="https://x.com/spice_ai" target="_blank" rel="noreferrer noopener">Twitter</a>.</p>'
  }
/>

The Spicepod concept introduced here lives on in today's platform, where it declares datasets for [SQL query federation and acceleration](/platform/sql-federation-acceleration) and models for [AI model serving](/feature/ai-model-serving). [Get a demo](/get-a-demo) to see the current platform.

<CoreBlock
  name="core-paragraph"
  content={'<p>We are just getting started! 🚀</p>'}
/>

<CoreBlock name="core-paragraph" content={'<p>Luke</p>'} />

<ContentResourceFeatured
  fields={{
    heading: 'Explore more Spice resources',
    paragraph:
      'Tutorials, docs, and blog posts to help you go deeper with Spice.',
    mode: 'related',
    resources: false,
    padding_top: 'unset',
    padding_bottom: 'unset',
    related_posts: [
      {
        title: 'A Developer&#8217;s Guide to Understanding Spice.ai',
        slug: '/blog/a-developers-guide-to-understanding-spice-ai',
        excerpt:
          'This guide helps developers build a mental model of why, how, and where to use Spice.',
        image:
          '/website-assets/media/2026/02/A-developers-guide-to-understanding-Spice.ai_.png',
        type: 'Blog',
        taxonomy: [
          'Engineering',
          'Spice AI',
          'Spice Cloud Platform',
          'Spice OSS',
        ],
      },
      {
        title: 'Real-Time Control Plane Acceleration with DynamoDB Streams ',
        slug: '/blog/real-time-acceleration-with-dynamodb-streams',
        excerpt:
          'How to sync DynamoDB data to thousands of nodes with sub-second latency using a two-tier architecture with DynamoDB Streams and Spice acceleration.',
        image: '/website-assets/media/2026/01/image-33.png',
        type: 'Blog',
        taxonomy: [
          'Data Acceleration',
          'Engineering',
          'Spice Cloud Platform',
          'Spice OSS',
        ],
      },
      {
        title: 'How we use Apache DataFusion at Spice AI',
        slug: '/blog/how-we-use-apache-datafusion-at-spice-ai',
        excerpt:
          'Why we chose to build on DataFusion and how we extended it with custom TableProviders, optimizer rules, and UDFs for federated SQL',
        image:
          '/website-assets/media/2026/01/Engineering-at-Spice-AI-Apache-DataFusion.png',
        type: 'Blog',
        taxonomy: [
          'Spice AI',
          'Spice Cloud Platform',
          'Spice OSS',
          'SQL Federation',
        ],
      },
    ],
  }}
/>

<TalkToAnEngineerCta />

<ContentRichText
  fields={{
    coverage: 'rc-end',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

---

## The Analytics Replica Pattern: The Shortest Path to Data-Grounded AI
URL: https://spice.ai/blog/the-analytics-replica-pattern-shortening-the-path-to-data-based-ai
Date: 2026-07-29T00:00:00
Description: The analytics replica pattern keeps operational systems isolated while delivering real-time analytical queries for AI agents and dashboards, without ETL or operational risk.

<ContentRichText
  fields={{
    coverage: 'rc-start',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

## Introduction

Your operational database is essential to your business. It has been battle-tested and hardened over time to meet your needs. Now, you want to enable AI to answer questions over your operational data. Questions like: Which customers churned today? Which orders are delayed? What inventory is available right now? These analytical queries scan many rows at once, but cause issues when directed at operational databases optimized for the opposite - updating individual records quickly. Running analytical queries directly on production databases is a liability.

The analytics replica pattern deploys a logical replica alongside your operational database that absorbs the analytical load, so mission-critical operational databases keep serving transactions without being impacted by analytical queries. Analytics replicas can be deployed in minutes and are incrementally adoptable, a table or database at a time.

## Real-time analytics on operational data

ETL pipelines have been traditionally used to export data from operational stores and load it into a data warehouse or data lake for analytical queries. This is costly to build, deploy and operate. And even when running, ETL often introduces significant latency between when transactions happen and when they are available to query.

Hybrid stores, like Databricks' LTAP, attempt to unify transactions and analytics in one platform, but require often costly migrations of your operational data to them. And using a single system for both operational data and analytics means coupling scaling, failure-domains, and tuning.

The analytics replica pattern is the fastest, incrementally adoptable path to analytical queries on your operational data.

## What use cases does the analytics replica pattern enable?

An analytics replica is useful whenever an application, dashboard, or AI agent needs to query the current state of the business without impacting the production database.

These workloads need faster access to operational data than an ETL pipeline provides, and their access patterns (e.g. scan-heavy queries, joins, or aggregations) are too heavy to run on a production database. And agents that run in loops 24/7 introduce new demanding workloads far beyond the scale of the app and dashboard era.

**Examples include:**

- **Customer-facing agents:** Agents answering analytical queries like 'What invoices are overdue?' require governed and sandboxed access to real-time operational data.
- **Fraud and anomaly detection:** Fraud detection in [financial services](/industry/financial-services) comparing transactions against recent customer behavior, merchant activity, or historical baselines.
- **Real-time dashboards:** Business teams monitoring [real-time operational analytics](/use-case/analytics) like today's revenue or open orders, without competing with production traffic.
- **Inventory and supply-chain tracking:** Applications rolling up stock and in-flight shipments across locations while transactions continue in the system of record.
- **IoT and device monitoring:** Field operators assessing variance between live readings and per-device baselines to catch drift or outages.

In each case, the analytics replica pattern gives applications and agents isolated query into live operational state without production databases in the query path.

## Why use Spice as an analytics replica?

![Agent-native CDC replication](/website-assets/media/2026/07/Analytics-Replica.svg)

_Figure 1: Analytics replica with Spice._

Spice makes it easy to implement this pattern: attach a [replicating analytics node](/platform/analytics) to your _existing_ operational databases including PostgreSQL, MySQL, and MongoDB without ETL or migration.

**High-throughput Replication.** When Spice starts, it loads a snapshot of the source and then [continuously replicates changes](/feature/real-time-change-data-capture) from the database's native changelog (e.g. PostgreSQL's write-ahead log, MySQL binlog, etc.) and applies changes as they are committed. There's no batch interval; a committed change is replicated within seconds. [Spice Cayenne](/blog/introducing-spice-cayenne-data-accelerator), the premier ingestion and acceleration engine in the Spice runtime, makes this replication fast - providing up-to-the-second freshness.

**Optimized for analytics.** Spice is built on [Apache DataFusion](/blog/how-we-use-apache-datafusion-at-spice-ai) and [Vortex](/blog/vortex-at-spice-ai-the-columnar-format-for-data-intensive-workloads) for high-performance execution of analytical queries. Spice Cayenne ensures query execution is fast even over rapidly changing datasets.

**Policy-enforced, isolated, and auditable.** Row and column-level filtering is enforced at query time, in the replica. Each agent or user sees only the tables, rows, and columns it is permitted to see, and clients authenticate with a Spice token rather than the credentials to the underlying database. Every query is traced making it easy to audit what agents are doing with your data. The replica runs on its own storage and compute. An agent can issue concurrent aggregations without producing load on production databases.

The demo below deploys an analytics replica against Postgres in under two minutes, and then runs a million-row aggregation that takes Postgres one minute, and the replica three seconds:

<PostVideo
  fields={{
    thumbnail: false,
    type: 'youtube',
    video_id: 'zfi3WNOLjzA',
    video_title:
      'Analytics Replica for AI Agents Demo: Postgres Queries from 1 Minute to 3 Seconds',
    video_upload_date: '2026-08-13T11:46:12-07:00',
    video_channel: 'Spice AI',
    video_description:
      'Demo deploying an analytics replica against PostgreSQL, then running a million-row aggregation in three seconds.',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

## Spice Cayenne: Analytical query built for fast ingest

Row-based stores like PostgreSQL and MySQL are optimized for small writes and column-based stores for analytical scans. Analytics replicas have to do both - ingest a continuous change stream and serve fast analytical queries over the same data.

[Spice Cayenne](/blog/introducing-spice-cayenne-data-accelerator) does this by a tiered write path built on sequence-ordered visibility, pushed-down deletion vectors, and merge-on-read (like Iceberg or Delta Lake), optimized for high-throughput ingestion, even for small writes.

<img
  src="/website-assets/media/2026/07/cdc_life_of_a_change_waterfall_v2.svg?bglight"
  alt="CDC life of a change waterfall"
  width="680"
  height="792"
/>

_Figure 2: Replication lifecycle in Spice._

**Fast query with constant writes.** Cayenne uses a tiered write path: changes land in an in-memory tier, compact into warm Vortex files locally, and eventually land in object storage. Queries span all tiers, so data is visible in seconds while scaling to petabytes.

**Ingestion without impacting query performance.** Queries stay fast and correct under frequent writes because incoming data is first ingested, then made visible by a single atomic pointer flip.

**Compaction for read performance.** As data accumulates in tiers, it is compacted - rewritten into larger files with deletions applied and statistics recomputed. Spice stages these changes and commits them atomically, so every query sees consistent versions of the data.

Cayenne is the secret sauce behind the pattern. In a follow-up post, we'll take a look under the hood in a technical deep dive on Cayenne ingestion - including decoupled read and write paths, in-memory ingestion tier, compaction model, and update/delete handling.

## Availability and Pricing

Support for PostgreSQL, MongoDB, and DynamoDB is available today, with MySQL shipping in August. If there's a specific database you'd like to see supported, please [reach out](/contact). We're adding sources regularly and prioritize based on customer demand.

Analytics replicas follow the same billing model as the rest of Spice Cloud: you pay for the vCPUs your workload consumes. See [Spice Cloud pricing](/pricing/cloud) for what's included for each plan.

## Try It

Deploy a replica in less than 5 minutes:

![Spice Cloud add analytics node](/website-assets/media/2026/07/spice-cloud-add-analytics-node.png)

_Figure 3: Add an analytics node in Spice Cloud._

1. Select an operational database to replicate.
2. Select a region to deploy to.
3. Add your database connection string.
4. Select the tables to replicate.

That's it!

Don't just take our word for it. [Give it a try in Spice Cloud](/login), and reach out with any questions in the [Spice Community Slack](/slack).

## Frequently Asked Questions

### How is an analytics replica different from a read replica?

A read replica is a copy of the database running the same row-oriented engine as the primary, so it inherits the same limits on scan-heavy analytical queries. An analytics replica stores the replicated data in a columnar engine built for aggregations, joins, and large scans. Spice uses [Apache DataFusion](/learn/apache-datafusion) and Vortex for analytical execution. Both offload work from the primary, but only the analytics replica changes the storage and execution model to fit analytical workloads.

### How is the analytics replica pattern different from ETL into a data warehouse?

ETL exports data on a schedule into a separate warehouse, which adds pipeline infrastructure to build and operate and introduces latency between a transaction and when it is queryable. An analytics replica replicates directly from the database's changelog, so committed changes are queryable within seconds and there is no pipeline to maintain. It is also incrementally adoptable: start with one table rather than migrating a whole schema.

### How is an analytics replica different from an HTAP database?

Hybrid (HTAP) stores unify transactions and analytics in one platform, but typically require migrating your operational data to them, and a single system couples scaling, failure domains, and tuning for both workloads. An analytics replica attaches to the operational database you already run, keeping the two workloads on separate storage and compute with independent failure domains.

### Do I have to replicate the entire database?

No. The pattern is incrementally adoptable: replicate a single table, a set of tables, or a whole database, and expand as needs grow. In Spice Cloud you select the tables to replicate when adding an analytics node.

### Can AI agents safely query an analytics replica?

Yes. The replica is the isolation boundary. Row- and column-level filtering is enforced at query time, agents authenticate with a Spice token rather than database credentials, and every query is traced for audit, giving agents [sandboxed access to operational data](/feature/secure-ai-sandboxing). Because the replica runs on its own storage and compute, agent query loops never add load to the production database.

### How fresh is the data in an analytics replica?

Committed changes are replicated within seconds; Spice applies changes continuously from the database's native changelog with no batch interval. See [change data capture](/learn/change-data-capture) for how log-based replication achieves this freshness without polling the source.

<aside className="my-8 rounded-xl border border-[#dce6ff] bg-[#f7faff] px-5 pt-2.5 pb-3">
  <h3 className="m-0 leading-snug">
    More on Spice <span aria-hidden="true">&#10003;</span>
  </h3>
  <p className="mb-0 mt-2">
    An analytics replica is just the start. Once operational data is available
    for query, teams often want to connect and join that data with other data
    systems, search across it, and of course connect it to agents. The Spice
    Cloud Platform includes data federation across [40+ data
    connectors](/integrations) spanning data lakes, warehouses, databases, and
    APIs, and combines SQL-first vector search, full-text search, with
    re-ranking along with AI execution in the same query. Spice can be deployed
    anywhere - at the edge, as a sidecar, on-prem, or in Spice Cloud.
  </p>
</aside>

<ContentRichText
  fields={{
    coverage: 'rc-end',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

---

## True Hybrid Search: Vector, Full-Text, and SQL in One Runtime
URL: https://spice.ai/blog/true-hybrid-search
Date: 2025-09-22T17:46:00
Description: Build hybrid search without managing multiple systems. Query vectors, run full-text search, and execute SQL in one unified runtime.

<ContentRichText
  fields={{
    coverage: 'rc-start',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<CoreBlock
  name="core-heading"
  content={'<h2 class="wp-block-heading h4">TL;DR&nbsp;</h2>'}
/>

<CoreBlock
  name="core-list"
  content={
    '<ul class="wp-block-list"><li><strong>The success of enterprise AI projects boils down to search and retrieval.</strong>&nbsp;In order to deliver production-grade AI apps, developers need tools that efficiently access data across distributed systems.&nbsp;</li><li><strong>Modern AI apps demand hybrid search</strong>&nbsp;across structured, unstructured, and vectorized data. Today\'s fragmented stacks introduce latency, complexity, and risk.</li><li><strong>Spice solves the search challenge</strong>&nbsp;with its hybrid SQL search functionality that natively combines keyword/text search, relational filters, and vector similarity in one query.</li><li><strong>Hybrid search alone isn\'t enough.&nbsp;</strong>To deliver production-grade AI, it must be combined with query federation, acceleration, and inference. Spice AI unifies query, search, and inference in a single, open-source runtime that queries data in place-across databases, warehouses, and object stores like S3-while accelerating the slowest layers.</li><li><strong>Spice operationalizes object stores for AI,</strong>&nbsp;making S3, ADLS, and GCS fast enough for semantic and hybrid search without duplicating data into specialized systems.</li></ul>'
  }
/>

<CoreBlock
  name="core-heading"
  content={'<h2 class="wp-block-heading h4">Show Me the (Data)!</h2>'}
/>

<CoreBlock
  name="core-paragraph"
  content={
    "<p>It's well established (and maybe even trite) to say that enterprises are going all-in on artificial intelligence, with more than $40 billion directed toward generative AI projects in recent years.</p>"
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>The initial results have been underwhelming. A&nbsp;<a href="https://mlq.ai/media/quarterly_decks/v0.1_State_of_AI_in_Business_2025_Report.pdf">recent study</a>&nbsp;from the Massachusetts Institute of Technology\'s&nbsp;<a href="https://nanda.media.mit.edu/">NANDA</a>&nbsp;initiative concluded that despite the enormous allocation of capital, 95% of enterprises have seen no measurable ROI from their AI initiatives. Only 5% of custom AI pilots ever make it to production, and just a fraction of those deliver meaningful business outcomes.</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    "<p>AI models are only as effective as the context (data) they can retrieve, but enterprise data is scattered across transactional databases, analytical platforms, object stores, and countless other data sources. To accommodate this fragmentation, enterprises have historically relied on fragile ETL pipelines, complex integrations, and siloed point solutions like search engines or vector databases. Each new layer introduces latency, operational overhead, and security risk. The proof is reflected in the results of MIT's study: instead of accelerating innovation, these pipelines are slowing it down. Enterprise-grade AI applications fail not necessarily due to the underlying models or because they can't be built, but because they can't reliably access the data they need.</p>"
  }
/>

<CoreBlock
  name="core-heading"
  content={'<h2 class="wp-block-heading h4">The Search Imperative</h2>'}
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Enterprise AI is fundamentally a search and retrieval problem. Applications and agents must be able to reach across structured and unstructured data, apply both exact filters and semantic search, and return the right context in milliseconds.</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={'<p>This requires three retrieval paradigms:</p>'}
/>

<CoreBlock
  name="core-list"
  content={
    '<ul class="wp-block-list"><li><strong>Exact filtering</strong>: Exact matches and filters on structured, relational, or semi-structured data for fields, timestamps, and metadata.</li><li><strong>Keyword search</strong>: Keyword discovery in unstructured text like documents and logs, ranked on term frequency and proximity.</li><li><strong>Semantic search</strong>: Vector embeddings for semantic-based similarity across any data type, from tables to narratives, beyond literal terms.</li></ul>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>‍Large organizations have worked around this problem by standing up multiple specialized systems: a relational database for queries, a search engine for text, a vector store for embeddings, etc. They then build pipelines to keep those systems in sync, often resulting in complexity and fragility.</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Meanwhile, object storage offerings like Amazon S3, Azure Blob, and Google Cloud Storage serve as the system of record for massive volumes of enterprise data - and thus excellent data sources for AI applications. However, they were never designed for low-latency retrieval. Even with the emergence of open formats like Parquet, Iceberg, and Delta, raw performance lags far behind what modern AI applications require.</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>This ultimately leaves enterprise developers in a catch-22: either they duplicate data into faster but more expensive systems, or they accept latency that makes real-time AI use cases impractical.&nbsp;</p>'
  }
/>

<CoreBlock
  name="core-heading"
  content={'<h2 class="wp-block-heading h4">An Emerging Data Convergence</h2>'}
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Three industry shifts are now reshaping this landscape and enabling a new generation of applications:</p>'
  }
/>

<CoreBlock
  name="core-list"
  content={
    '<ol class="wp-block-list"><li><strong>Object stores are becoming queryable</strong>. With Iceberg, Delta, Hudi, and now S3 Vectors, they are evolving into platforms for active workloads, not just cold storage.</li><li><strong>AI workloads are inherently hybrid</strong>. They need structured data for grounding, unstructured text for context, and embeddings for semantics. No single monolithic database can meet these needs.</li><li><strong>Enterprises are under pressure to simplify</strong>. The cost of maintaining separate systems for query, search, and vector retrieval is too high - in dollars, in complexity, and in security risk.</li></ol>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Taken together, these shifts mandate a new substrate that unifies search, query federation, and inference across all enterprise data.</p>'
  }
/>

<CoreBlock
  name="core-heading"
  content={
    '<h2 class="wp-block-heading h4">Spice.ai: From Fragmented Data to Unified Intelligence</h2>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p><a href="/">Spice.ai</a> was purpose-built to address this challenge, offering a data and AI platform that combines <a href="/platform/hybrid-sql-search">hybrid search</a> (vector, full-text, and keyword) with query federation, acceleration, and LLM inference in one engine. </p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Where other vendors solve a piece of the problem, Spice addresses the full lifecycle. For developers, this means one query interface replacing three. A hybrid search against structured, unstructured, and vectorized data can be expressed in a single SQL statement, with Spice abstracting all of the orchestration. Applications that once required stitching together a handful of different systems can now be built against one, and results that once took minutes arrive in milliseconds.&nbsp;</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Take the below Spice query as an example. One SQL combines vector search, full-text search, temporal and lexical filtering.</p>'
  }
/>

<CoreBlock
  name="core-image"
  content={
    '<figure class="wp-block-image"><img src="https://cdn.prod.website-files.com/6362f59f9fd4ac355fc06eaf/68cb54f77549b2082b228bf6_d80c2f7c.png" alt="Hybrid SQL search query"/><figcaption class="wp-element-caption">Figure 1: Hybrid&nbsp;SQL search query</figcaption></figure>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    "<p>But search alone isn't enough. Enterprise AI applications also need low latency retrieval across data systems when integrating with LLMs. That's why Spice pairs its search engine with query federation, acceleration, and AI inference in a single, deploy-anywhere runtime. Instead of moving data, Spice queries it where it resides - across OLTP databases, OLAP warehouses, and object stores like S3 - while accelerating the slowest layers through caching and materialization for sub-second access. This makes it possible to serve data and AI-powered experiences directly from your existing systems - securely, at low latency, and without costly re-engineering.</p>"
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>In turn, this architecture turns object stores from passive archives into active, AI-ready data layers. With the introduction of&nbsp;<a href="/blog/amazon-s3-vectors">native support for Amazon S3 Vectors</a>, Spice can even create, store, and query embeddings natively in S3, making semantic search as accessible as traditional text search or object retrieval.</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Enterprises eliminate the operational drag of ETL pipelines and duplicated data stores, security improves because sensitive databases are never directly exposed to AI agents, and perhaps most importantly, AI apps that failed due to lack of reliable retrieval are now viable.</p>'
  }
/>

<CoreBlock
  name="core-heading"
  content={'<h2 class="wp-block-heading h4">Architecture Overview</h2>'}
/>

<CoreBlock
  name="core-paragraph"
  content={
    "<p>Spice's lightweight compute engine is designed to integrate directly into your application stack and is built on a fully open-source foundation. It embeds the DataFusion SQL query engine, supports over 35 open-source connectors, and can locally materialize data for acceleration using DuckDB, SQLite, or PostgreSQL.</p>"
  }
/>

<CoreBlock
  name="core-paragraph"
  content={'<p><strong>Core components of Spice:</strong></p>'}
/>

<CoreBlock
  name="core-list"
  content={
    '<ul class="wp-block-list"><li><a href="https://spiceai.org/docs/features/search"><strong>Search &amp; Retrieval</strong></a>. Vector, hybrid, and full-text search across structured and unstructured data.</li><li><a href="https://spiceai.org/docs/features/query-federation"><strong>Federated SQL Engine</strong></a>. Execute queries across disparate data sources.</li><li><a href="https://spiceai.org/docs/features/data-acceleration"><strong>Acceleration Engine</strong></a>. Materialize and pre-cache data for millisecond access.</li><li><a href="https://spiceai.org/docs/features/large-language-models"><strong>LLM Inference</strong></a>. Load models locally or use as a router to hosted AI platforms like OpenAI, Anthropic, Bedrock, or NVIDIA NIM.</li></ul>'
  }
/>

<CoreBlock
  name="core-image"
  content={
    '<figure class="wp-block-image"><img src="https://cdn.prod.website-files.com/6362f59f9fd4ac355fc06eaf/68cb54f77549b2082b228bf3_3cae8341.png" alt="Spice.ai Compute Engine"/><figcaption class="wp-element-caption">Figure 2: Spice.ai Compute Engine</figcaption></figure>'
  }
/>

<CoreBlock name="core-paragraph" content={'<p>Spice can be deployed:</p>'} />

<CoreBlock
  name="core-list"
  content={
    '<ul class="wp-block-list"><li><strong>As a sidecar</strong>: Co-located with your application for ultra-low latency.</li><li><strong>As a shared service</strong>: Centralized deployment serving multiple applications.</li><li><strong>At the edge</strong>: Serve data and AI capabilities as close as possible to the user.</li><li><strong>In the cloud</strong>: Fully-managed via the&nbsp;<a href="/pricing">Spice.ai Cloud Platform</a>.</li></ul>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>This deployment flexibility ensures Spice fits to your application architecture and compliance requirements.&nbsp;</p>'
  }
/>

<CoreBlock
  name="core-heading"
  content={'<h2 class="wp-block-heading h4">Applications Built on Spice</h2>'}
/>

<CoreBlock
  name="core-paragraph"
  content={
    "<p>Whether you're powering a RAG-enabled customer service bot, an internal AI agent, or&nbsp;a high-throughput transactional API, the foundational challenge is the same: getting fast, secure access to the right data at the right time.</p>"
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Spice solves that challenge once, and lets you deploy the same solution for every workload. Spice enables three primary categories of applications: AI Apps, RAG Apps, and Data Apps.&nbsp;</p>'
  }
/>

<CoreBlock
  name="core-heading"
  content={'<h2 class="wp-block-heading h4"><strong>1. AI Apps</strong></h2>'}
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>AI models are only as good as the context they can access. As discussed, most enterprise AI efforts fail because retrieval is too slow, incomplete, or insecure.</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={'<p>Key benefits of using Spice for AI Apps include:</p>'}
/>

<CoreBlock
  name="core-list"
  content={
    '<ul class="wp-block-list"><li><a href="https://spiceai.org/docs/components/tools"><strong>Ground LLMs in enterprise data</strong></a>&nbsp;without moving data into separate stores.</li><li><a href="https://spiceai.org/docs/features/search"><strong>Retrieve structured and unstructured data in real time</strong></a>, with hybrid SQL search.</li><li><a href="https://spiceai.org/docs/features/large-language-models"><strong>Keep sensitive systems secure</strong></a>&nbsp;by acting as a containerized execution layer, so AI agents never query a production database directly.<br></li></ul>'
  }
/>

<CoreBlock
  name="core-image"
  content={
    '<figure class="wp-block-image"><img src="https://cdn.prod.website-files.com/6362f59f9fd4ac355fc06eaf/68cb54f77549b2082b228bff_55df2a12.png" alt="AI app architecture"/><figcaption class="wp-element-caption">Figure 3: AI app architecture</figcaption></figure>'
  }
/>

<CoreBlock
  name="core-heading"
  content={'<h2 class="wp-block-heading h4"><strong>2. RAG Apps</strong></h2>'}
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Traditional RAG (retrieval-augmented generation) is powerful but fragile - performance, relevance, and freshness/veracity all depend on the retrieval layer.</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={'<p>Key benefits of using Spice for RAG Apps include:</p>'}
/>

<CoreBlock
  name="core-list"
  content={
    '<ul class="wp-block-list"><li><a href="https://spiceai.org/docs/features/search"><strong>Unified retrieval</strong></a>&nbsp;that spans transactional, analytical, and object store data sources.</li><li><a href="/blog/announcing-spice-ai-open-source-1-0-stable#datalake-accelerator--barracuda"><strong>Low-latency query performance</strong></a>&nbsp;for interactive AI experiences.</li><li><a href="https://spiceai.org/docs/use-cases/agentic-ai-apps#data-acceleration-and-materialization-with-change-data-capture-cdc"><strong>Dynamic materializations</strong></a>&nbsp;that refresh context automatically, ensuring AI agents always have the latest data without paying a tax on re-ingestion.</li></ul>'
  }
/>

<CoreBlock name="core-paragraph" content={'<p>‍</p>'} />

<CoreBlock
  name="core-image"
  content={
    '<figure class="wp-block-image"><img src="https://cdn.prod.website-files.com/6362f59f9fd4ac355fc06eaf/68cb54f77549b2082b228bfc_9196f022.png" alt="Hybrid search architecture"/><figcaption class="wp-element-caption">Figure 4: Hybrid search architecture</figcaption></figure>'
  }
/>

<CoreBlock
  name="core-heading"
  content={'<h2 class="wp-block-heading h4"><strong>3. Data Apps</strong></h2>'}
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Modern data applications often need to unify data from multiple disparate systems, deliver low-latency results, and scale globally without constant ETL jobs or manual integrations.</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={'<p>Key benefits of using Spice for Data Apps include:</p>'}
/>

<CoreBlock
  name="core-list"
  content={
    '<ul class="wp-block-list"><li><a href="https://spiceai.org/docs/features/query-federation"><strong>Federated SQL queries</strong></a>&nbsp;across OLTP, OLAP, and object store systems without pre-processing or data duplication.</li><li><a href="https://spiceai.org/docs/features/data-acceleration"><strong>Accelerated database and object store queries</strong></a>&nbsp;to sub-second speeds, enabling a "Database CDN" model where working datasets are staged close to the application.</li><li><a href="https://spiceai.org/docs/features/cdc"><strong>Real-time updates</strong></a>&nbsp;via Change Data Capture (CDC), intervals, or event triggers, so apps never query stale data.</li></ul>'
  }
/>

<CoreBlock
  name="core-image"
  content={
    '<figure class="wp-block-image"><img src="https://cdn.prod.website-files.com/6362f59f9fd4ac355fc06eaf/68cb54f77549b2082b228bf9_f4cf3e10.png" alt="Federation + Acceleration in Spice"/><figcaption class="wp-element-caption">Figure 5: Federation + Acceleration in Spice</figcaption></figure>'
  }
/>

<CoreBlock
  name="core-heading"
  content={
    '<h2 class="wp-block-heading h4">The Path Forward with Spice&nbsp;</h2>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>The boundaries between operational databases, analytics, and object stores are dissolving, and AI applications demand all three together in real-time.&nbsp;</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    "<p>Traditional approaches, anchored on moving and transforming data between systems, can't keep up with these demands. Spice makes search and retrieval reliable, fast, and unified - turning fragmented data into a single searchable layer. With sub-second access to transactional, analytical, and object data, enterprises can finally deliver intelligent applications at scale.</p>"
  }
/>

<CoreBlock
  name="core-heading"
  content={'<h3 class="wp-block-heading h5">Getting Started</h3>'}
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Spice is open source (Apache 2.0) and can be&nbsp;<a href="https://spiceai.org/docs/getting-started">installed in less than a minute</a>&nbsp;on macOS, Linux, or Windows:</p>'
  }
/>

<CoreBlock
  name="core-list"
  content={
    '<ol class="wp-block-list"><li>Explore the&nbsp;<a href="https://spiceai.org/docs">open source docs</a>&nbsp;and&nbsp;<a href="/blog">blog</a>&nbsp;for cookbooks, integration examples.</li><li>Visit the&nbsp;<a href="https://spiceai.org/docs/getting-started">getting started guide</a>&nbsp;</li><li>Explore the 70+&nbsp;<a href="/cookbook">cookbooks&nbsp;</a></li><li>Try&nbsp;<a href="/pricing">Spice.ai Cloud&nbsp;</a>for a fully managed deployment and<a href="/login?from=landing">&nbsp;get started for free</a>.&nbsp;</li></ol>'
  }
/>

<CoreBlock name="core-paragraph" content={'<p>‍</p>'} />

Hybrid search also powers end-to-end [application search](/use-case/application-search) experiences, from indexing to relevance tuning.

## Frequently Asked Questions

### What makes a hybrid search implementation "true" hybrid?

True hybrid search runs keyword search, relational filters, and vector similarity natively in one engine and one query, rather than bolting a search engine and a vector database onto a database with pipelines between them. The distinction matters because a fragmented stack introduces latency, synchronization complexity, and security risk at each seam. A single runtime merges vector and keyword results in the same query that applies the relational filters.

### Is hybrid search slower than running vector search alone?

No, hybrid search does not add meaningful latency over a single retrieval method. The vector and keyword retrievals are independent, so they execute concurrently rather than sequentially. The fusion step that merges the two ranked lists is a lightweight computation over a small candidate set.

### How does hybrid search combine results from vector and keyword search?

The most common method is [reciprocal rank fusion (RRF)](/learn/reciprocal-rank-fusion), a ranking algorithm that merges result lists by position rather than raw score. Each document receives a score based on its rank in each list, and documents that rank well in both lists rise to the top. Rank-based fusion avoids the problem that vector similarity scores and BM25 scores sit on different scales.

### Do you need a separate vector database for hybrid search?

No, a separate vector database is not required when the query engine supports vector, full-text, and relational retrieval natively. Spice executes all three in one SQL statement, so there is no second system to deploy or keep in sync. This removes the pipelines that otherwise copy data between a database, a search engine, and a vector store.

### What role do embeddings play in hybrid search?

Embeddings are dense vector representations of text that capture semantic meaning, and they power the vector leg of a hybrid search pipeline. An [embedding model](/learn/embeddings) encodes both the query and the documents into vectors, and similarity between vectors approximates similarity in meaning. The keyword leg does not use embeddings, which is why it still matches rare terms an embedding model handles poorly.

### When is keyword search better than vector search?

Keyword search wins when the query contains exact identifiers: product names, model numbers, error codes, or domain-specific jargon that embeds poorly. Vector search wins on synonym-heavy or intent-driven queries where the user's wording differs from the source text. The tradeoffs are covered in more depth in [full-text search vs vector search](/learn/full-text-search-vs-vector-search).

### What is a common mistake when implementing hybrid search?

A common mistake is combining raw scores from the two retrieval methods without normalization. Cosine similarity ranges from -1 to 1 while BM25 scores are unbounded, so summing them directly lets one method dominate the ranking. Rank-based fusion methods like RRF avoid this by ignoring raw scores entirely.

<ContentResourceFeatured
  fields={{
    heading: 'Explore more Spice resources',
    paragraph:
      'Tutorials, docs, and blog posts to help you go deeper with Spice.',
    mode: 'related',
    resources: false,
    padding_top: 'unset',
    padding_bottom: 'unset',
    related_posts: [],
  }}
/>

<TalkToAnEngineerCta />

<ContentRichText
  fields={{
    coverage: 'rc-end',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

---

## Vortex at Spice AI: The Columnar Format for Data-Intensive Workloads
URL: https://spice.ai/blog/vortex-at-spice-ai-the-columnar-format-for-data-intensive-workloads
Date: 2026-04-07T00:00:00
Description: How Spice AI uses the Vortex columnar format in Cayenne to improve query latency, reduce memory overhead, and support high-concurrency data-intensive workloads.

<ContentRichText
  fields={{
    coverage: 'rc-start',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

## TL;DR

Legacy columnar formats decompress data before compute touches it. While often negligible at small scale, this becomes a tax on memory, latency, and CPU as workloads expand.

[Vortex](https://github.com/vortex-data/vortex) is a next-gen open-source columnar format from the Linux Foundation that eliminates that tax. It runs compute kernels directly on encoded data, skipping decompression entirely for many operations. When decompression is needed, data lands directly in Arrow arrays with no intermediate copies.

We built [Spice Cayenne](https://spice.ai/blog/introducing-spice-cayenne-data-accelerator) on [Vortex](https://github.com/vortex-data/vortex) as the acceleration engine for data-intensive workloads. On TPC-H SF-100, [Spice Cayenne runs 1.4x faster](https://spice.ai/blog/introducing-spice-cayenne-data-accelerator) than DuckDB file mode and uses 3x less memory, and 14% faster and 3.4x less memory on ClickBench.

This post covers what Vortex is, how it drives Cayenne's performance, and what we learned shipping it.

## Introduction

In late 2025, we selected [Vortex](https://github.com/vortex-data/vortex) as the premier columnar format for the [Spice.ai](https://spice.ai) platform. It now powers [Spice Cayenne](https://spice.ai/blog/introducing-spice-cayenne-data-accelerator) in production.

This post explains how we got there and what we learned shipping it:

- What Vortex is and how it differs from Parquet
- Why we chose Vortex for Cayenne's data layer
- How we designed Cayenne's architecture, using Vortex for data files and SQLite/Turso as the metadata store
- Strategies for managing virtual files, deletion vectors, and compression
- Vortex's DataFusion integration
- 7 production lessons from shipping Vortex in Spice Cayenne

## Engineering at Spice AI Series

This post is the third installment of our series on the open-source technologies powering Spice.ai:

- [Apache DataFusion](https://spice.ai/blog/how-we-use-apache-datafusion-at-spice-ai): SQL query engine foundation
- [Apache Iceberg](https://spice.ai/blog/apache-iceberg-at-spice-ai): Open table format integration

Up next:

- Apache Ballista: Distributed query execution
- Rust: Systems programming foundation
- Apache Arrow: Core data format
- DuckDB: Embedded analytics and acceleration

## So, What Is Vortex?

Vortex is an open-source columnar file format from the Linux Foundation, built to resolve the tradeoff between compression and query speed that makes existing formats struggle at scale. Vortex delivers [100x faster random access, 10-20x faster full scans, and 5x faster writes](https://github.com/vortex-data/vortex) than Parquet. It is the product of decades of database research but was built for the present: the access patterns, ingestion rates, and modern AI workloads that existing formats were not designed for.

![Research in Vortex](/website-assets/media/2026/02/research-in-vortex.png)

<p className="text-center text-sm text-neutrals-dark-grey mt-[-0.5rem]">
  Source: Vortex
</p>

Vortex's architecture separates logical from physical concerns. The logical layer defines types and schema, while the physical layer handles encoding and storage. Each column is encoded independently based on data statistics: dictionary for low-cardinality strings, delta for monotonic integers, bit-packing for small integer ranges. Encodings can nest; for example, a dictionary-encoded column can itself be bit-packed. Beyond these foundational encodings, Vortex also supports [FSST](https://spiceai.org/docs/components/data-accelerators/cayenne#high-performance-columnar-storage) (Fast Static Symbol Table) for string compression with O(1) random access, FastLanes for SIMD-vectorized decoding of bit-packed integers, and ALP for adaptive lossless floating-point compression. Files are split into chunks, which enables parallel reads and gives the query engine granular statistics for skipping irrelevant segments before any data I/O happens.

The step function in performance improvement comes where computation happens. Compute kernels operate directly on encoded data, and many operations skip decompression entirely. When decompression is needed, data lands directly in Arrow arrays with no intermediate copies. The kernels are built for modern hardware. Vortex uses AVX2 gather instructions for take operations (with runtime detection and scalar fallback), SIMD-friendly FastLanes bit-packing, and is developing CUDA GPU kernels for filter and slice operations. Finally, Vortex is implemented in Rust, which aligns with Spice's systems stack and keeps memory overhead predictable without a garbage collector.

This design sits at a deliberate point in the compression spectrum, around 0.4x, between Arrow IPC (1.0x, uncompressed) and Parquet (roughly 0.3x). Arrow IPC is fast to read but storage costs scale poorly for large hot datasets. Parquet compresses well, but at high query repetition, 100 queries per second against the same dataset, you decompress the same blocks 100 times.

Vortex resolves those tradeoffs.

## How Vortex Fits in Spice's Architecture

[Spice](https://spice.ai) is built on four core primitives: [data federation](https://spice.ai/platform/sql-federation-acceleration), [query acceleration](https://spiceai.org/docs/features/data-acceleration), [hybrid search](https://spice.ai/platform/hybrid-sql-search), and [LLM inference](https://spice.ai/platform/llm-inference). Combined, they offer a complete data platform for AI context. Vortex sits at the acceleration layer.

[Spice accelerates datasets](https://spice.ai/platform/sql-federation-acceleration) by materializing working sets from distributed sources into local engines. Instead of querying a remote database or object storage bucket on every request, Spice maintains a working set of locally accelerated data and serves queries from there. For application and agent-serving workloads, this is the difference between hundreds of milliseconds and seconds to minutes latency.

A core design principle of Spice is optionality. As such, [several acceleration engines](https://spiceai.org/docs/components/data-accelerators) are offered to customers to align with use case requirements: Arrow for in-memory speed, DuckDB for analytical workloads, SQLite for small relational tables, and PostgreSQL for workloads that need a full relational engine. Each has a different performance and operational profile, and customers choose based on their use case.

As customers pushed higher data volumes into Spice, three problems with the existing accelerators appeared consistently:

- DuckDB's single-file architecture, serialized concurrent writes, and ingestion under load creates queuing
- Memory overhead grows proportionally with dataset size
- With large enough datasets, the single-file model creates practical size limits

These production limitations reduced the surface area of use cases Spice could support.

Spice Cayenne is the engine built to address those use cases.

## Why Vortex for Cayenne?

We needed a storage layer that could handle high write throughput, compress efficiently for hot data, and stay operationally simple.

We evaluated several storage options beyond existing DuckDB and SQLite engines:

| Option                                                                                 | Problem                                                                           |
| -------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------- |
| Multiple DuckDB files                                                                  | Significant resource and operational overhead with limited optimization potential |
| Parquet                                                                                | Slow decompression for hot data, no native update support, still requires catalog |
| Arrow IPC                                                                              | Large uncompressed files, expensive to store                                      |
| [Nimble & Lance (LV2)](https://materializedview.io/p/nimble-and-lance-parquet-killers) | Less adoption and lower performance profile.                                      |
| Iceberg/Delta                                                                          | Slow, complex metadata management, catalog server requirements                    |

Vortex solved our key challenges:

| Requirement                                 | Vortex solution                                                                          |
| ------------------------------------------- | ---------------------------------------------------------------------------------------- |
| DuckDB-like performance and latency profile | Encoding-efficient compression + zero-copy                                               |
| No single-file limits                       | Multi-file architecture with metadata in SQLite                                          |
| Arrow-native                                | Direct decompression to Arrow arrays                                                     |
| Simple operations                           | Files + SQL metadata                                                                     |
| High concurrency                            | Stage files, then single SQL transaction                                                 |
| Extensibility                               | Every major component is extensible, enabling custom encodings, compression, and layouts |

The benchmarks confirmed the decision. On TPC-H SF-100, Cayenne runs 1.4x faster than DuckDB file mode and uses 3x less memory:

![TPC-H benchmark](/website-assets/media/2025/12/TPCH-Benchmark-1024x1024.png)

On ClickBench, 14% faster and 3.4x less memory:

![ClickBench benchmark](/website-assets/media/2025/12/Clickbench-Benchmark-1024x1024.png)

Full results are in the [Spice Cayenne launch blog](/blog/introducing-spice-cayenne-data-accelerator).

## Cayenne Architecture

![Spice Cayenne architecture](/website-assets/media/2025/12/Spice-Cayenne-Architecture-1-1024x692.png)

Spice Cayenne uses SQLite as a metadata store and Vortex files for the actual data. This design is also used by the [DuckLake architecture](https://ducklake.select/2025/05/27/ducklake-01/): separate the catalog from the data, use a transactional database for metadata, and immutable files for data storage.

While we are agnostic on the choice of metadata provider, the current implementation leverages SQLite (or [Turso](https://github.com/tursodatabase/)) because it offers atomic transactions and the ability to store millions of snapshots as rows. A single SQL query retrieves all metadata needed to plan a scan.

## Key Design Decisions

### Virtual Files: Directories as ListingTables

Each Cayenne snapshot is a directory, not a single physical file. Inside that directory, Vortex manages multiple segment files. DataFusion sees it as a ListingTable over that directory.

This matters for lifecycle management. To delete or expire a snapshot, you drop the directory. New segments write into the directory without blocking reads. Directories are also a natural unit for compaction: write merged data into a new snapshot directory, then atomically swap the metadata pointer and clean up the old one.

Vortex automatically splits writes into multiple chunk files within the directory. The `cayenne_target_file_size_mb` parameter controls when a new chunk file is created, giving you tunable parallelism and more granular statistics for query optimization. If you frequently filter on a specific column, the `sort_columns` parameter lets you pre-sort data on ingestion so that segments align with your query patterns, maximizing how many segments get pruned at scan time.

Vortex maintains per-chunk zone map statistics for every column: minimum and maximum values, null count, distinct count, and uncompressed size. These statistics are embedded in Vortex file footers, and the ListingTable aggregates them across all files for DataFusion's query optimizer. When `sort_columns` is configured, sorted data produces tighter min/max bounds per zone, making pruning more effective. For a table with sorted timestamps, a query filtering on `WHERE timestamp > '2024-01-20'` skips every zone whose maximum timestamp falls below that threshold before any decompression happens.

### Deletion Vectors and Sequence Numbers

Upsert semantics in an immutable file format require a way to mark rows as deleted without rewriting files. Deletion vector metadata (which files exist, their sequence numbers, deletion type, etc.) is stored in the SQLite metastore while deletion vector data is stored as separate Arrow IPC files alongside the data segments.

The key insight behind sequence numbers is that a delete record carries a `delete_sequence`. That delete only applies to rows where the data sequence is less than the delete sequence. This means you can write new versions of a row without retroactively deleting them. The ordering is self-contained in the metadata.

We support three deletion vector strategies based on table configuration:

| Strategy          | Use Case                    | Implementation                                                                           |
| ----------------- | --------------------------- | ---------------------------------------------------------------------------------------- |
| PositionBased     | No Primary key              | RoaringBitmap of row positions                                                           |
| Int64Pk           | Single Int64 primary key    | HashMap&lt;i64, i64&gt; direct lookup (PK → delete sequence)                             |
| RowConverterBased | Composite or non-integer PK | HashMap&lt;Box&lt;[u8]&gt;, i64&gt; via Arrow RowConverter (key bytes → delete sequence) |

The performance characteristics differ significantly. For position-based deletion, the RoaringBitmap is pushed down directly to Vortex's scan layer via `Selection::ExcludeRoaring`. Deleted rows are skipped during decompression and never materialize as Arrow arrays. The PK-based strategies filter in a DataFusion execution plan node after scanning, but the Int64Pk path uses a SIMD-optimized DeletionIndex, a Swiss table-style hash index with bloom filter that checks 16 slots in parallel on x86, providing O(1) rejection of non-deleted keys before probing the hash table.

### Compaction

Deletion vectors accumulate over time. Compaction resolves this by merging data and deletion vectors into a new snapshot. The `commit_compaction` operation is a single atomic SQLite transaction that updates the snapshot ID, clears all delete files, and resets insert tracking records. After compaction, the old snapshot directory and its deletion vector files can be cleaned up.

For position-based deletion, RoaringBitmap provides 50-90% memory savings over a HashSet for sparse deletions, with SIMD-accelerated contains operations.

### Compression Strategies

Vortex supports two compression strategies, configurable per-accelerator.

[Btrblocks](https://github.com/maxi-k/btrblocks) is the default. It selects the best encoding per column based on data statistics, drawing from a cascade of lightweight encodings: dictionary for low-cardinality strings, delta for monotonic integers, or bit-packing for small integer ranges. The encodings are designed for SIMD execution, so decode is fast.

Zstd is the right choice for cold data you want to store cheaply but do not query frequently. It compresses further than Btrblocks in many cases but decode is slower.

## DataFusion Integration

Spice Cayenne plugs into [Apache DataFusion](https://datafusion.apache.org/) as a custom TableProvider. When a query hits a Cayenne table, DataFusion's physical planning calls into Cayenne's scan implementation, which resolves SQLite metadata, identifies which Vortex segments to read, applies deletion vectors, and returns Arrow record batches.

Projection and predicate pushdown work at the Vortex layer. Vortex's per-segment statistics skip segments that cannot satisfy a filter predicate before any decompression happens.

Memory behavior under concurrent load is predictable because Spice uses a DataFusion GreedyMemoryPool wrapped in a TrackConsumersPool that enforces a per-runtime memory ceiling. When a query exceeds `runtime.query.memory_limit`, DataFusion automatically spills to disk rather than failing, which matters for large analytical queries running alongside ingestion.

For more on how DataFusion fits into Spice's query architecture, see [Apache DataFusion at Spice AI](https://spice.ai/blog/how-we-use-apache-datafusion-at-spice-ai).

## Distributed Execution: Vortex Shuffles

Vortex extends beyond Cayenne's local storage into Spice's distributed execution layer. Spice integrates Apache Ballista for multi-node distributed queries, and shuffle data between query stages can be serialized in Vortex IPC format instead of the default Arrow IPC.

The shuffle format is configurable at the runtime level. Vortex's encoding-aware compression produces smaller shuffle files than Arrow IPC, reducing network transfer and disk I/O between executors.

Shuffle writer: The `VortexWriteTracker` converts Arrow RecordBatches to Vortex arrays and serializes them via Vortex IPC. For hash-repartitioned shuffles, each output partition's arrays are buffered independently and serialized to Vortex IPC bytes before uploading to disk or object storage.

Shuffle reader: The reader auto-detects `.vortex` files and reads them back using `SyncIPCReader`, converting Vortex arrays to Arrow RecordBatches on the fly. A `CoalescedShuffleReaderStream` coalesces small batches from shuffle files into target-sized batches for efficient downstream processing.

In-memory shuffles: When shuffle data fits in executor memory, `InMemoryShuffleData` holds either Arrow RecordBatches or Vortex arrays. For Vortex shuffles, data stays in Vortex encoding between stages, no decompress-recompress cycle.

Flight service integration: Vortex partitions are served over Arrow Flight between executors, with on-the-fly conversion from Vortex arrays to Arrow RecordBatches at the serving boundary.

## Contributing to Vortex

The Spice AI team is actively contributing to the Vortex project. A few examples:

N-ary CASE WHEN expression pushdown. We implemented SQL-style CASE WHEN expressions as a native Vortex scalar function ([vortex-data/vortex#6786](https://github.com/vortex-data/vortex/pull/6786)). This enables CASE WHEN expressions to evaluate directly on encoded data, condition checks and branch selection happen without decompression. The DataFusion integration converts CaseExpr nodes into Vortex's native representation and pushes them down through the scan layer.

Production hardening. Shipping Vortex in production surfaced edge cases that we have fixed and are working to upstream.

Resilient filter pushdown: Unsupported filter nodes (such as empty IN-lists) aborted entire scans. We changed the behavior to bubble up TRUE for unsupported nodes within AND/OR trees, so partial pushdown still works.

Balanced IN-list OR trees: Large IN (...) filters produced deeply nested OR trees that stack-overflowed. We restructured list_contains to build balanced binary trees.

Optional direct VortexSink file writing: DataFusion's demuxer registered child metrics under parents, causing OOM on high-partition tables. For these tables, we write files directly in VortexSink, which also fixed target file size enforcement under parallel writes.

## Production Lessons

After building Cayenne with Vortex, here are some learnings that are hopefully helpful in your own project:

**Lesson 1: SQLite is a very capable embedded metadata store**

SQLite handles concurrent reads effectively, transactions are rock-solid, and the operational model (just a file) is trivially simple.

**Lesson 2: Cache sizing matters**

Footer and segment caches have dramatic impact on read performance. Our defaults (128MB footer, 256MB segment) work well for typical workloads, but expose tuning parameters for users with specific needs.

**Lesson 3: Push deletions down as far as possible**

Reject deleted rows at the lowest layer you can. Position-based deletion via `ExcludeRoaring` skips rows during decompression. PK-based deletion uses a bloom filter for O(1) rejection before the hash table. Each layer you avoid, decompression, materialization, filtering, saves CPU and memory.

**Lesson 4: Zero-copy is worth the constraints**

Accepting Vortex's type constraints (no Interval, no Duration, etc.) is worth it for true zero-copy Arrow access. The performance difference is substantial.

**Lesson 5: Expression pushdown compounds**

Pushing expressions like CASE WHEN into Vortex so they evaluate on encoded data compounds with other pushdowns (predicate, projection). Each layer you skip reduces the work for every subsequent layer.

**Lesson 6: Keep shuffle data in encoding-efficient format**

In distributed queries, shuffle data is typically serialized as Arrow IPC between stages. Replacing this with Vortex IPC keeps data compressed during transfer without paying decompression cost at the sender or re-compression cost at the receiver.

**Lesson 7: Rewrite filters to maximize pushdown**

Getting the best performance from Vortex with DataFusion depends on pushing as many filter expressions as possible into Vortex so they run on Vortex compute kernels. Not every DataFusion predicate maps cleanly to a native Vortex filter, so it is worth identifying the ones that do not push down and rewriting them into equivalent forms that do.

## Getting Started with Vortex and Cayenne

Cayenne's separation of data and metadata is an implementation detail handled internally. From a configuration perspective, enabling it is as simple as:

```yaml
datasets:
  - from: spice.ai:path.to.my_dataset
    name: my_dataset
    acceleration:
      engine: cayenne
      mode: file
```

For storage, NVMe gives the lowest latency and best throughput for Vortex's random access patterns and is the recommended choice for most deployments. If you need data to persist across restarts or be shared across Spice instances, Cayenne also supports [S3 Express One Zone](https://spiceai.org/docs/components/data-accelerators/cayenne#aws-s3-express-one-zone-storage), which provides single-digit millisecond latency with full durability while keeping metadata local.

## Conclusion

Choosing a storage format is ultimately a bet on a set of tradeoffs. We believe Vortex makes the right ones for where data infrastructure is heading: compressing efficiently enough to be practical at scale, reading fast enough for real-time workloads, and built on an architecture extensible enough to support the heterogeneous access patterns that AI applications are introducing.

Built on that foundation, Cayenne gives Spice a local acceleration layer that scales with data volume and write concurrency without the operational complexity of a distributed system or the scaling limits of a single-file engine. With Vortex-based shuffles in Ballista, that same format efficiency extends across the distributed query pipeline.

We encourage you to explore the [Vortex project](https://github.com/vortex-data/vortex) if you want to go deeper on the format itself, the [Spice Cayenne documentation](https://spiceai.org/docs/components/data-accelerators/cayenne) for configuration and deployment details, and the [Cayenne launch blog](https://spice.ai/blog/introducing-spice-cayenne-data-accelerator) for the full benchmark breakdown.

Questions or feedback? Find us in the [Vortex](https://vortex-data.slack.com/join/shared_invite/zt-3i4ian4du-mmm~~g9jdz2U_B0dA8CIEg#/shared-invite/email) and [Spice](/slack) Slack communities.

In production, Vortex-backed Cayenne powers [data lake acceleration](/use-case/datalake-accelerator) behind Spice's [federated SQL engine](/platform/sql-federation-acceleration). To benchmark it on your data, [get a demo](/get-a-demo).

<ContentRichText
fields={{
    coverage: 'rc-end',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<AccordionFaq
  fields={{
    heading: 'Vortex at Spice AI FAQ',
    paragraph: '',
    items: [
      {
        title: 'What is Vortex and why did Spice AI choose it for Cayenne?',
        paragraph:
          '<p>Vortex is an open-source columnar format optimized for running compute directly on encoded data. Spice AI chose Vortex for Cayenne because it provides a strong balance of compression, low-latency reads, and operational simplicity for high-concurrency, data-intensive workloads.</p>',
      },
      {
        title: 'How is Vortex different from Parquet in this architecture?',
        paragraph:
          '<p>Parquet is widely adopted and efficient for many analytical workloads, but frequent decompression can become expensive on hot query paths. In the Cayenne architecture, Vortex enables more work to happen on encoded data and uses richer segment-level statistics for pruning, reducing CPU and memory overhead under repeated access patterns.</p>',
      },
      {
        title: 'What role does SQLite play in Spice Cayenne?',
        paragraph:
          '<p>SQLite acts as the transactional metadata store for snapshots, file manifests, and deletion vector metadata, while Vortex files hold table data. This split keeps metadata operations simple and atomic while allowing data files to scale independently.</p>',
      },
      {
        title:
          'How does Cayenne handle deletes and upserts with immutable files?',
        paragraph:
          '<p>Cayenne uses deletion vectors and sequence numbers. Deletes are tracked in metadata and applied according to sequence ordering, which allows new row versions to be written without rewriting full data files. Periodic compaction then merges data and delete state into fresh snapshots.</p>',
      },
      {
        title: 'How can I start using Cayenne with Vortex in Spice?',
        paragraph:
          '<p>Enable file-mode acceleration with <code>engine: cayenne</code> in your dataset configuration, then run Spice with your configured source. For setup details and tuning guidance, see the <a href="https://spiceai.org/docs/components/data-accelerators/cayenne">Cayenne documentation</a> and the <a href="https://spice.ai/blog/introducing-spice-cayenne-data-accelerator">launch blog</a>.</p>',
      },
      {
        title: 'Is Vortex compatible with Apache Arrow?',
        paragraph:
          '<p>Yes, Vortex is designed to work directly with Apache Arrow. When decompression is needed, Vortex data lands in Arrow arrays with no intermediate copies, and Cayenne returns Arrow record batches to DataFusion. This zero-copy path avoids the conversion overhead that a separate serialization layer would add.</p>\n',
      },
      {
        title:
          'Does Cayenne require a catalog server like Apache Iceberg or Delta Lake?',
        paragraph:
          '<p>No, Cayenne does not require a separate catalog server. Snapshot and file metadata live in an embedded SQLite or Turso database next to the Vortex data files, so there is no additional service to deploy or operate. Commits are atomic SQLite transactions, and one SQL query retrieves the metadata needed to plan a scan.</p>\n',
      },
      {
        title: 'When should I choose Cayenne over the DuckDB accelerator?',
        paragraph:
          '<p>Choose Cayenne when dataset size, write concurrency, or memory overhead outgrows a single-file engine. <a href="/learn/duckdb">DuckDB</a> remains a good fit for analytical workloads at moderate scale, while Cayenne targets workloads where large datasets are ingested and queried concurrently. On TPC-H SF-100, Cayenne runs 1.4x faster than DuckDB file mode and uses 3x less memory.</p>\n',
      },
      {
        title: 'Is a data accelerator like Cayenne the same as a cache?',
        paragraph:
          '<p>No, an accelerator and a cache solve latency differently. A cache stores the results of previous requests and depends on invalidation logic to stay correct, while a data accelerator maintains a materialized working set of the source data that remains queryable with full SQL. The <a href="/learn/caching-vs-data-acceleration">caching vs data acceleration</a> comparison covers the differences in freshness, query flexibility, and operational cost.</p>\n',
      },
      {
        title: 'Do I need to change my SQL queries to use Cayenne?',
        paragraph:
          "<p>No, queries do not change when a dataset is accelerated with Cayenne. Acceleration is configured per dataset with <code>engine: cayenne</code>, and queries continue to run through DataFusion, which plans scans against Cayenne's TableProvider automatically. Metadata resolution, segment selection, and deletion vector handling are internal to the accelerator.</p>\n",
      },
      {
        title: 'What data types does Vortex not support?',
        paragraph:
          "<p>Vortex does not support every Arrow data type; Interval and Duration are two examples. Cayenne accepts these constraints because they enable zero-copy access into Arrow arrays, a tradeoff that proved worthwhile in production. Workloads that depend on unsupported types can use one of Spice's other acceleration engines, such as DuckDB or PostgreSQL.</p>\n",
      },
      {
        title:
          'Can accelerated data persist across restarts or be shared between Spice instances?',
        paragraph:
          "<p>Yes, Cayenne supports durable, shared storage through S3 Express One Zone, which provides single-digit millisecond latency with full durability while metadata stays local. For deployments that do not need shared storage, local NVMe offers the lowest latency and best throughput for Vortex's random access patterns.</p>\n",
      },
      {
        title: 'Who maintains Vortex, and is it open source?',
        paragraph:
          '<p>Vortex is an open-source project hosted by the Linux Foundation and licensed under Apache 2.0. The Spice AI team contributes upstream, including native CASE WHEN expression pushdown and filter pushdown hardening. For an overview of the format outside the Spice context, see <a href="/learn/vortex">What is Vortex?</a>.</p>\n',
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

---

## What Data Informs AI-driven Decision Making?
URL: https://spice.ai/blog/what-data-informs-ai-driven-decision-making
Date: 2022-01-04T05:36:13
Description: Learn the three classes of data required for intelligent decision-making and how Spice.ai simplifies runtime data engineering for AI-powered applications.

<ContentRichText
  fields={{
    coverage: 'rc-start',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>AI unlocks a new generation of intelligent&nbsp;<a href="/blog/making-apps-that-learn-and-adapt" target="_blank" rel="noreferrer noopener">applications that learn and adapt</a>&nbsp;from data. These applications use machine learning (ML) to out-perform traditionally developed software. However, the data engineering required to leverage ML is a significant challenge for many product teams. In this post, we\'ll explore the three classes of data you need to build next-generation applications and how Spice.ai handles runtime data engineering for you.</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>While ML has many different applications, one way to think about ML in a real-time application that can adapt is as a decision engine. Phillip discussed decision engines and their potential uses in&nbsp;<a href="/blog/a-new-class-of-applications-that-learn-and-adapt" target="_blank" rel="noreferrer noopener">A New Class of Applications That Learn and Adapt</a>. This decision engine learns and informs the application how to operate. Of course, applications can and do make decisions without ML, but a developer normally has to code that logic. And the intelligence of that code is fixed, whereas ML enables a machine to constantly find the appropriate logic and evolve the code as it learns. For ML to do this, it needs three classes of data.</p>'
  }
/>

<CoreBlock
  name="core-heading"
  content={
    '<h2 class="wp-block-heading h3" id="the-three-classes-of-data-for-informed-decision-making">The three classes of data for informed decision making</h2>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    "<p>We don't want any decision, though. We want high-quality, informed decisions. If you consider making higher quality, informed decisions over time, you need three classes of information. These classes are historical information, real-time or present information, and the results of your decisions.</p>"
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Especially recently, stock or crypto trading is something many of us can relate to. To make high-quality, informed investing decisions, you first need general historical information on the price, security, financials, industry, previous trades, etc. You study this information and learn what might make a good investment or trade.</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Second, you need a real-time updated stream of data as it happens to make a decision. If you were stock trading, this information might be the stock price on the day or hour you want to make the trade. You need to apply what you learned from historical data to the current information to decide what trade to place.</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    "<p>Finally, if we're going to make better decisions over time, we need to capture and learn from the results of those decisions. Whether you make a great or poor trade, you want to incorporate that experience into your historical learning.</p>"
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Using all three data classes together results in higher quality decisions over time. Broad data across these classes are useful, and we could make some nice trades with that. Still, we can make an even higher quality trading decision with personal context. For example, we may want to consider the individual tax consequences or risk level of the trade for our situation. So each of these classes also comes with global or local variants. We combine global information, like what worked well for everyone, and local experience, what worked well for us and our situation, to make the best, overall informed decision.</p>'
  }
/>

<CoreBlock
  name="core-heading"
  content={
    '<h3 class="wp-block-heading h4" id="the-waterfall-approach-to-data-engineering">The waterfall approach to data engineering</h3>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Consider how you would capture these three data classes and make them available to both the application and ML in the trading example. This data engineering can be a pretty big challenge.</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>First, you need a way to gather and consume historical information, like stock prices, and keep that updated over time. You need to handle streaming constantly updated real-time data to make runtime decisions on how to operate. You need to capture and match the decisions you make and feed that back into learning. And finally, you need a way to provide personal or local context, like holding off on sell trades until next year, to stay within a tax threshold, or identifying a pattern you like to trade. If all this wasn\'t enough, as we learned from Phillip\'s <a href="/blog/ai-needs-ai-ready-data" target="_blank" rel="noreferrer noopener">AI needs AI-ready data</a> post, all three data classes need to be in a format that ML can use.</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>If you can afford a data or ML team, they may do much of this for you. However, this model starts to look quite waterfall-like and is not suited well to applications that want to learn and adapt in real-time. Like a waterfall approach, you would provide requirements to your data team, and they would do the data engineering required to provide you with the first two classes of data, historical and real-time. They may give you ML-ready data or train an ML model for you. However, there is often a large latency to apply that data or model in your application and a long turn-around time if it does not meet your requirements. In addition, to capture the third class of data, you would need to capture and send the results of the decisions your application made as a result of using those models back to the data team to incorporate in future learning. This latency through the data, decision-making, learning, and adaptation process is often infeasible for a real-world app.</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    "<p>And, if you can't afford a data team, you have to figure out how to do all that yourself.</p>"
  }
/>

<CoreBlock
  name="core-heading"
  content={
    '<h3 class="wp-block-heading h4" id="the-agile-approach">The agile approach</h3>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Modern software engineering practices have favored agile methodologies to reduce time to learn and adapt applications to customer and business needs. Spice.ai takes inspiration from agile methods to provide developers with a fast, iterative development cycle.</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Spice.ai provides mechanisms for making all three classes of data available to both the application and the decision engine. Developers author Spicepods declaring how data should be captured, consumed, and made ML-ready so that all three classes are consistent and ML available.</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>The Spice.ai runtime exposes developer-friendly APIs and data connectors for capturing and consuming data and annotating that data with personal context. The runtime generates AI-ready data for you and makes it available directly for ML. These APIs also make it easy to capture application decisions and incorporate the resulting learning.</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>The Spice.ai approach short circuits the traditional waterfall-like data process by keeping as much data as possible application local instead of round-tripping through an external pipeline or team, especially valuable for real-time data. The application can learn and adapt faster by reducing the latency of decision consequences to learning.</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Spice.ai enables personalized learning from personal context and experiences through the interpretations mechanism. Interpretations allow an application to provide additional information or an "interpretation" of a time range as input to learning. The trading example could be as simple as labeling a time range as a good time to buy or providing additional contextual information such as tax considerations, etc. Developers can also use interpretations to record the results of decisions with more context than what might be available in the observation space. You can read more about Interpretations in the&nbsp;<a href="https://spiceai.org/docs" target="_blank" rel="noreferrer noopener">Spice.ai docs</a>.</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>While Spice.ai focuses on ensuring consistent ML-ready data is available, it does not replace traditional data systems or teams. They still have their place, especially for large historical datasets, and Spice.ai can consume data produced by them. Where possible, especially for application and real-time data, Spice.ai keeps runtime data local to create a virtuous cycle of data from the application to the decision engine and back again, enabling faster and more agile learning and adaption.</p>'
  }
/>

<CoreBlock
  name="core-heading"
  content={'<h2 class="wp-block-heading h3" id="summary">Summary</h2>'}
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>In summary, to build an intelligent application driven from AI recommended decisions, a significant amount of data engineering can be required to learn, make decisions, and incorporate the results. The Spice.ai runtime enables you as a developer to focus on consuming those decisions and tuning how the AI engine should learn rather than the runtime data engineering.</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>The potential of the next generation of intelligent applications to improve the quality of our lives is very exciting. Using AI to help applications make better decisions, whether that be AI-assisted investing, improving the energy efficiency of our homes and buildings, or supporting us in deciding on the most appropriate medical treatment, is very promising.</p>'
  }
/>

<CoreBlock
  name="core-heading"
  content={
    '<h3 class="wp-block-heading h4" id="learn-more-and-contribute">Learn more and contribute</h3>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Even for advanced developers, building intelligent apps that leverage AI is still way too hard. Our mission is to make this as easy as creating a modern web page. If that vision resonates with you, join us!</p>'
  }
/>

Today, Spice answers this question with the operational data lakehouse: [federated SQL](/platform/sql-federation-acceleration) over your sources and [retrieval-augmented generation](/use-case/retrieval-augmented-generation) to ground AI in that data. [Get a demo](/get-a-demo) to see it applied.

<CoreBlock
  name="core-paragraph"
  content={
    '<p>If you want to get involved, we\'d love to talk. Try out <a href="https://spiceai.org/docs/getting-started" target="_blank" rel="noreferrer noopener">Spice.ai</a>, <a href="mailto:hey@spice.ai" target="_blank" rel="noreferrer noopener">email us</a> "hey," join our community <a href="/slack">Slack</a>, or reach out on <a href="https://x.com/spice_ai" target="_blank" rel="noreferrer noopener">Twitter</a>.</p>'
  }
/>

<CoreBlock name="core-paragraph" content={'<p>Luke</p>'} />

<ContentResourceFeatured
  fields={{
    heading: 'Explore more Spice resources',
    paragraph:
      'Tutorials, docs, and blog posts to help you go deeper with Spice.',
    mode: 'related',
    resources: false,
    padding_top: 'unset',
    padding_bottom: 'unset',
    related_posts: [
      {
        title: 'A Developer&#8217;s Guide to Understanding Spice.ai',
        slug: '/blog/a-developers-guide-to-understanding-spice-ai',
        excerpt:
          'This guide helps developers build a mental model of why, how, and where to use Spice.',
        image:
          '/website-assets/media/2026/02/A-developers-guide-to-understanding-Spice.ai_.png',
        type: 'Blog',
        taxonomy: [
          'Engineering',
          'Spice AI',
          'Spice Cloud Platform',
          'Spice OSS',
        ],
      },
      {
        title: 'Real-Time Control Plane Acceleration with DynamoDB Streams ',
        slug: '/blog/real-time-acceleration-with-dynamodb-streams',
        excerpt:
          'How to sync DynamoDB data to thousands of nodes with sub-second latency using a two-tier architecture with DynamoDB Streams and Spice acceleration.',
        image: '/website-assets/media/2026/01/image-33.png',
        type: 'Blog',
        taxonomy: [
          'Data Acceleration',
          'Engineering',
          'Spice Cloud Platform',
          'Spice OSS',
        ],
      },
      {
        title: 'How we use Apache DataFusion at Spice AI',
        slug: '/blog/how-we-use-apache-datafusion-at-spice-ai',
        excerpt:
          'Why we chose to build on DataFusion and how we extended it with custom TableProviders, optimizer rules, and UDFs for federated SQL',
        image:
          '/website-assets/media/2026/01/Engineering-at-Spice-AI-Apache-DataFusion.png',
        type: 'Blog',
        taxonomy: [
          'Spice AI',
          'Spice Cloud Platform',
          'Spice OSS',
          'SQL Federation',
        ],
      },
    ],
  }}
/>

<TalkToAnEngineerCta />

<ContentRichText
  fields={{
    coverage: 'rc-end',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

---

## Write to Apache Iceberg Tables with SQL in Spice
URL: https://spice.ai/blog/write-to-apache-iceberg-tables-with-sql
Date: 2025-11-18T23:27:09
Description: Spice v1.8 adds native Apache Iceberg write support with standard SQL INSERT INTO statements. Build complete data workflows without ETL - query, accelerate, and write from one runtime.

<ContentRichText
  fields={{
    coverage: 'rc-start',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

**TL;DR:** Spice v1.8 adds native [Apache Iceberg](https://iceberg.apache.org/) write support using standard SQL `INSERT INTO` statements. Write query results, transformed data, or new records directly to Iceberg tables from the same runtime used for [federation and acceleration](/platform/sql-federation-acceleration), no separate ETL pipeline required.

---

<CoreBlock
  name="core-paragraph"
  content={
    '<p>With the release of&nbsp;<a href="/blog/spice-cloud-v1-8-0-iceberg-writes">Spice v1.8</a>, developers&nbsp;<a href="https://spiceai.org/docs/components/data-connectors/iceberg">can now write</a>&nbsp;directly to&nbsp;<a href="https://iceberg.apache.org/">Apache Iceberg</a>&nbsp;tables and catalogs using standard SQL&nbsp;<code>INSERT INTO</code>&nbsp;statements.&nbsp;</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>This feature extends&nbsp;<a href="/blog/spice-sql-query-federation-acceleration">Spice\'s SQL federation</a>&nbsp;capabilities beyond reads, enabling data ingestion, transformation, and pipeline workloads to write results back into Iceberg directly from the same runtime used for queries and acceleration.</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>What sets Spice apart from other query engines is its broader, application-focused feature set designed for modern data and AI workloads. Spice brings together federation,&nbsp;<a href="https://spiceai.org/docs/features/search">hybrid search</a>, embedded&nbsp;<a href="https://spiceai.org/docs/features/large-language-models">LLM inference</a>, and now native writes in one unified runtime - enabling teams to build complete, end-to-end workflows without the management overhead and performance concessions of using multiple systems.&nbsp;</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p><a href="https://spiceai.org/docs/components/data-connectors/iceberg">Iceberg write support</a>&nbsp;is available in preview, with append-only operations and schema validation for secure and predictable data management.</p>'
  }
/>

<PostVideo
  fields={{
    thumbnail: false,
    type: 'youtube',
    video_id: 'LGGFmNN9-3w',
    video_title:
      'Writing to Apache Iceberg Tables with Spice.ai | Spice.ai Demo',
    video_upload_date: '2025-10-16T14:26:01-07:00',
    video_channel: 'Spice AI',
    video_description:
      'Demo of writing to Apache Iceberg tables with SQL using Spice.ai.',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<CoreBlock
  name="core-heading"
  content={
    '<h2 class="wp-block-heading h4">From Read-Only Federation to Full Data Workflows</h2>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Data teams are standardizing on open table formats like Apache Iceberg to unify analytical and operational data across systems; Iceberg offers a consistent way to store, version, and manage data across different engines and clouds, helping teams avoid vendor lock-in while maintaining strong governance and interoperability.</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Supporting Iceberg writes natively inside Spice means development teams can:</p>'
  }
/>

<CoreBlock
  name="core-list"
  content={
    '<ul class="wp-block-list"><li><strong>Direct Writes to Iceberg without ETL:</strong>&nbsp;Insert data directly into Iceberg from SQL queries.</li><li><strong>Simplify ingestion paths:</strong>&nbsp;Load transformed or federated data into Iceberg without separate tools.</li><li><strong>Enforce governance:</strong>&nbsp;Maintain schema validation and secure access through read_write permissions.</li></ul>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Paired with Spice\'s built-in <a href="/platform/sql-federation-acceleration">SQL federation and acceleration</a>, these write capabilities make it easier to use Iceberg not just as a storage solution, but as a&nbsp;<a href="/blog/making-object-storage-operational">queryable data layer</a>&nbsp;for both operational and AI workloads</p>'
  }
/>

<CoreBlock
  name="core-heading"
  content={'<h2 class="wp-block-heading h4">How It Works</h2>'}
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Spice supports&nbsp;<code>INSERT_INTO</code>&nbsp;statements on Iceberg tables and catalogs explicitly marked as&nbsp;<code>read_write</code>.</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Example&nbsp;<a href="https://spiceai.org/docs/getting-started/spicepods">Spicepod</a>&nbsp;configuration:</p>'
  }
/>

```python
catalogs:
  - from: iceberg:http://localhost:8181/v1/namespaces
    access: read_write  # Uncomment this line
    name: ice
    params:
      iceberg_s3_endpoint: http://localhost:9000
      iceberg_s3_access_key_id: admin
      iceberg_s3_secret_access_key: password
      iceberg_s3_region: us-east-1
```

<CoreBlock
  name="core-paragraph"
  content={"<p>And, here's an example SQL&nbsp;query:</p>"}
/>

```python
-- Insert from another table
INSERT INTO iceberg_table
SELECT * FROM existing_table;

-- Insert with values
INSERT INTO iceberg_table (id, name, amount)
VALUES (1, 'John', 100.0), (2, 'Jane', 200.0);

-- Insert into catalog table
INSERT INTO ice.sales.transactions
VALUES (1001, '2025-01-15', 299.99, 'completed');
```

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Support for updates, deletes, and merges will be added in future releases.</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    "<p>Now, let's walk through an end-to-end workflow demonstrating how to execute Iceberg writes in Spice.</p>"
  }
/>

<CoreBlock
  name="core-heading"
  content={
    '<h2 class="wp-block-heading h4">Write to Iceberg Tables with Spice Cookbook</h2>'
  }
/>

<CoreBlock name="core-paragraph" content={'<p>Prerequisites:&nbsp;</p>'} />

<CoreBlock
  name="core-list"
  content={
    '<ul class="wp-block-list"><li>Access to an Iceberg catalog, or Docker to run an Iceberg catalog locally.</li><li>Spice is installed (see the&nbsp;<a href="https://spiceai.org/docs/getting-started">Getting Started</a>&nbsp;documentation).</li></ul>'
  }
/>

<CoreBlock
  name="core-heading"
  content={
    '<h3 class="wp-block-heading h5">Step 1: Create a new directory and initialize a Spicepod</h3>'
  }
/>

```python
mkdir iceberg-catalog-recipe
cd iceberg-catalog-recipe
spice init
```

<CoreBlock
  name="core-heading"
  content={
    '<h3 class="wp-block-heading h5">Step 2. Run the Docker container for the Iceberg catalog</h3>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>In a separate terminal, clone the cookbook repository and run the Docker container for the Iceberg catalog.</p>'
  }
/>

```python
git clone https://github.com/spiceai/cookbook.git
cd cookbook/catalogs/iceberg
docker compose up -d
```

<CoreBlock
  name="core-heading"
  content={
    '<h3 class="wp-block-heading h5">Step 3. Add the Iceberg Catalog Connector to your Spicepod</h3>'
  }
/>

```python
catalogs:
  - from: iceberg:http://localhost:8181/v1/namespaces
    # access: read_write
    name: ice
    params:
      iceberg_s3_endpoint: http://localhost:9000
      iceberg_s3_access_key_id: admin
      iceberg_s3_secret_access_key: password
      iceberg_s3_region: us-east-1
```

<CoreBlock
  name="core-heading"
  content={'<h3 class="wp-block-heading h5">Step 4. Run Spice</h3>'}
/>

```python
spice run

2025/01/27 11:08:36 INFO Checking for latest Spice runtime release...
2025/01/27 11:08:37 INFO Spice.ai runtime starting...
2025-01-27T19:08:37.494155Z  INFO runtime::init::dataset: No datasets were configured. If this is unexpected, check the Spicepod configuration.
2025-01-27T19:08:37.494905Z  INFO runtime::init::catalog: Registering catalog 'ice' for iceberg
2025-01-27T19:08:37.499162Z  INFO runtime::metrics_server: Spice Runtime Metrics listening on 127.0.0.1:9090
2025-01-27T19:08:37.499174Z  INFO runtime::flight: Spice Runtime Flight listening on 127.0.0.1:50051
2025-01-27T19:08:37.500689Z  INFO runtime::http: Spice Runtime HTTP listening on 127.0.0.1:8090
2025-01-27T19:08:37.503376Z  INFO runtime::opentelemetry: Spice Runtime OpenTelemetry listening on 127.0.0.1:50052
2025-01-27T19:08:37.696469Z  INFO runtime::init::results_cache: Initialized results cache; max size: 128.00 MiB, item ttl: 1s
2025-01-27T19:08:37.697178Z  INFO runtime::init::catalog: Registered catalog 'ice' with 1 schema and 8 tables
```

<CoreBlock
  name="core-heading"
  content={
    '<h3 class="wp-block-heading h5">Step 5. Query the Iceberg catalog</h3>'
  }
/>

```python
spice sql
sql> show tables;
+---------------+--------------+--------------+------------+
| table_catalog | table_schema | table_name   | table_type |
+---------------+--------------+--------------+------------+
| ice           | tpch_sf1     | lineitem     | BASE TABLE |
| ice           | tpch_sf1     | nation       | BASE TABLE |
| ice           | tpch_sf1     | orders       | BASE TABLE |
| ice           | tpch_sf1     | supplier     | BASE TABLE |
| ice           | tpch_sf1     | customer     | BASE TABLE |
| ice           | tpch_sf1     | partsupp     | BASE TABLE |
| ice           | tpch_sf1     | region       | BASE TABLE |
| ice           | tpch_sf1     | part         | BASE TABLE |
| spice         | runtime      | task_history | BASE TABLE |
| spice         | runtime      | metrics      | BASE TABLE |
+---------------+--------------+--------------+------------+
```

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Run&nbsp;<em>Pricing Summary Report Query (Q1)</em>. More information about TPC-H and all the queries involved can be found in the official&nbsp;<a href="https://www.tpc.org/tpc_documents_current_versions/pdf/tpc-h_v2.17.1.pdf">TPC Benchmark H Standard Specification</a>.</p>'
  }
/>

```python
select
  l_returnflag,
  l_linestatus,
  sum(l_quantity) as sum_qty,
  sum(l_extendedprice) as sum_base_price,
  sum(l_extendedprice * (1 - l_discount)) as sum_disc_price,
  sum(l_extendedprice * (1 - l_discount) * (1 + l_tax)) as sum_charge,
  avg(l_quantity) as avg_qty,
  avg(l_extendedprice) as avg_price,
  avg(l_discount) as avg_disc,
  count(*) as count_order
from
  ice.tpch_sf1.lineitem
where
  l_shipdate <= date '1998-12-01' - interval '110' day
group by
  l_returnflag,
  l_linestatus
order by
  l_returnflag,
  l_linestatus
;
```

<CoreBlock name="core-paragraph" content={'<p>Output:</p>'} />

```python
+--------------+--------------+-------------+-----------------+-------------------+---------------------+-----------+--------------+----------+-------------+
| l_returnflag | l_linestatus | sum_qty     | sum_base_price  | sum_disc_price    | sum_charge          | avg_qty   | avg_price    | avg_disc | count_order |
+--------------+--------------+-------------+-----------------+-------------------+---------------------+-----------+--------------+----------+-------------+
| A            | F            | 37734107.00 | 56586554400.73  | 53758257134.8700  | 55909065222.827692  | 25.522005 | 38273.129734 | 0.049985 | 1478493     |
| N            | F            | 991417.00   | 1487504710.38   | 1413082168.0541   | 1469649223.194375   | 25.516471 | 38284.467760 | 0.050093 | 38854       |
| N            | O            | 73416597.00 | 110112303006.41 | 104608220776.3836 | 108796375788.183317 | 25.502437 | 38249.282778 | 0.049996 | 2878807     |
| R            | F            | 37719753.00 | 56568041380.90  | 53741292684.6040  | 55889619119.831932  | 25.505793 | 38250.854626 | 0.050009 | 1478870     |
+--------------+--------------+-------------+-----------------+-------------------+---------------------+-----------+--------------+----------+-------------+

Time: 0.186233833 seconds. 10 rows.
```

<CoreBlock
  name="core-heading"
  content={
    '<h3 class="wp-block-heading h5">Step 6. Write to Iceberg tables</h3>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>To enable write operations to Iceberg tables, uncomment the&nbsp;<code>access: read_write</code>&nbsp;configuration and restart Spice.</p>'
  }
/>

<CoreBlock
  name="core-heading"
  content={
    '<h3 class="wp-block-heading h5">6.1. Update the Spicepod configuration</h3>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Edit the&nbsp;<code>spicepod.yaml</code>&nbsp;file to uncomment the access line:</p>'
  }
/>

```python
catalogs:
  - from: iceberg:http://localhost:8181/v1/namespaces
    access: read_write  # Uncomment this line
    name: ice
    params:
      iceberg_s3_endpoint: http://localhost:9000
      iceberg_s3_access_key_id: admin
      iceberg_s3_secret_access_key: password
      iceberg_s3_region: us-east-1
```

<CoreBlock
  name="core-heading"
  content={'<h3 class="wp-block-heading h5">6.2. Restart Spice</h3>'}
/>

<CoreBlock
  name="core-paragraph"
  content={'<p>Stop the current Spice instance (Ctrl+C) and restart it:</p>'}
/>

```python
spice run
```

<CoreBlock
  name="core-heading"
  content={
    '<h3 class="wp-block-heading h5">6.3. Insert data into Iceberg tables</h3>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Now you can write data to the Iceberg tables using SQL&nbsp;<a href="https://spiceai.org/docs/reference/sql/dml#insert">INSERT statements</a>:</p>'
  }
/>

```python
spice sql
```

<CoreBlock
  name="core-paragraph"
  content={'<p>‍Example: Insert a new region into the region table:</p>'}
/>

```python
INSERT INTO ice.tpch_sf1.region (r_regionkey, r_name, r_comment)
VALUES (5, 'ANTARCTICA', 'A cold and remote region');

+-------+
| count |
+-------+
| 1     |
+-------+
```

<CoreBlock
  name="core-paragraph"
  content={'<p>Example: Insert a new nation into the nation table:</p>'}
/>

```python
INSERT INTO ice.tpch_sf1.nation (n_nationkey, n_name, n_regionkey, n_comment)
VALUES (25, 'PENGUINIA', 5, 'A vibrant home for brave penguins in Antarctica');

+-------+
| count |
+-------+
| 1     |
+-------+
```

<CoreBlock
  name="core-paragraph"
  content={'<p>‍Verify the inserts by querying the tables:</p>'}
/>

```python
SELECT * FROM ice.tpch_sf1.region WHERE r_regionkey = 5;
SELECT * FROM ice.tpch_sf1.nation WHERE n_nationkey = 25;
```

<CoreBlock
  name="core-heading"
  content={
    '<h3 class="wp-block-heading h5">Step 7. View the Iceberg tables in MinIO</h3>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Navigate to&nbsp;<a href="http://localhost:9001/">http://localhost:9001</a>&nbsp;and login with&nbsp;<code>admin</code>&nbsp;and&nbsp;<code>password</code>. View the&nbsp;<code>iceberg</code>&nbsp;bucket to see the created Iceberg tables.</p>'
  }
/>

<CoreBlock
  name="core-heading"
  content={'<h3 class="wp-block-heading h5">Step 8. Clean up</h3>'}
/>

```python
docker compose down --volumes --rmi local
```

<CoreBlock
  name="core-heading"
  content={
    '<h2 class="wp-block-heading h4">Next steps with Iceberg writes in Spice</h2>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Iceberg write support is available in preview. See the<a href="https://spiceai.org/docs/components/data-connectors/iceberg">&nbsp;Iceberg connector docs</a>&nbsp;for configuration details and try the&nbsp;<a href="https://github.com/spiceai/cookbook/blob/trunk/catalogs/iceberg/README.md">Iceberg Catalog Connector</a>&nbsp;recipe to get started.&nbsp;</p>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Feedback is welcome as we round out support for Iceberg writes in upcoming releases!&nbsp;</p>'
  }
/>

SQL writes complete the [operational data lakehouse](/use-case/operational-data-lakehouse) loop: read, accelerate, and write back with one engine. To try Iceberg writes on your lakehouse, [get a demo](/get-a-demo).

## Frequently Asked Questions

### Do you need Apache Spark to write to Apache Iceberg tables?

No. Apache Iceberg is engine-agnostic, and Spice writes to Iceberg tables with standard SQL `INSERT INTO` statements from a single runtime, so teams that only need SQL ingestion can skip running a Spark cluster for writes. For background on how the table format itself works, see the guide to [Apache Iceberg](/learn/apache-iceberg).

### Can Spice write data from other databases into Iceberg tables?

Yes. An `INSERT INTO ... SELECT` statement can read from any connected data source and write the results into an Iceberg table, because writes run on the same [SQL federation engine](/platform/sql-federation-acceleration) that handles reads. This moves data from operational databases or object storage into Iceberg without a separate ingestion tool.

### Can other query engines read the data Spice writes to Iceberg?

Yes. Spice commits writes through the standard Iceberg protocol: new Parquet data files land in object storage, and the catalog metadata pointer updates atomically. Any Iceberg-compatible engine reading from the same catalog sees the new snapshot. The [Apache Iceberg at Spice AI](/blog/apache-iceberg-at-spice-ai) deep dive covers the commit path in detail.

### Can you update or delete rows in an Iceberg table with Spice?

Not yet. Iceberg write support in Spice v1.8 is in preview and append-only, so `INSERT INTO` is the supported operation. Support for updates, deletes, and merges is planned for future releases.

### What happens if an INSERT does not match the Iceberg table schema?

Spice validates every insert against the target table's schema before writing. Statements with mismatched columns fail validation instead of writing malformed data, which keeps tables predictable for downstream readers.

### Why write to Iceberg tables instead of plain Parquet files on object storage?

Writing through an Iceberg catalog adds ACID transactions, schema evolution, and snapshot-based time travel on top of the same Parquet files, so concurrent readers and writers see consistent results. It also keeps table metadata accurate, which lets query engines prune data files from metadata statistics instead of scanning entire directories.

### Can you query data immediately after writing it to an Iceberg table?

Yes. Rows committed with `INSERT INTO` are queryable from the same runtime as soon as the statement completes, so a `SELECT` issued right after the insert returns the new records. The walkthrough in this post verifies each insert exactly this way.

<ContentResourceFeatured
  fields={{
    heading: 'Explore more Spice resources',
    paragraph:
      'Tutorials, docs, and blog posts to help you go deeper with Spice.',
    mode: 'related',
    resources: false,
    padding_top: 'unset',
    padding_bottom: 'unset',
    related_posts: [
      {
        title: 'Real-Time Control Plane Acceleration with DynamoDB Streams ',
        slug: '/blog/real-time-acceleration-with-dynamodb-streams',
        excerpt:
          'How to sync DynamoDB data to thousands of nodes with sub-second latency using a two-tier architecture with DynamoDB Streams and Spice acceleration.',
        image: '/website-assets/media/2026/01/image-33.png',
        type: 'Blog',
        taxonomy: [
          'Data Acceleration',
          'Engineering',
          'Spice Cloud Platform',
          'Spice OSS',
        ],
      },
      {
        title: 'How we use Apache DataFusion at Spice AI',
        slug: '/blog/how-we-use-apache-datafusion-at-spice-ai',
        excerpt:
          'Why we chose to build on DataFusion and how we extended it with custom TableProviders, optimizer rules, and UDFs for federated SQL',
        image:
          '/website-assets/media/2026/01/Engineering-at-Spice-AI-Apache-DataFusion.png',
        type: 'Blog',
        taxonomy: [
          'Spice AI',
          'Spice Cloud Platform',
          'Spice OSS',
          'SQL Federation',
        ],
      },
    ],
  }}
/>

<TalkToAnEngineerCta />

<ContentRichText
  fields={{
    coverage: 'rc-end',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<CoreBlock name="core-paragraph" content={'<p></p>'} />

---

## Careers
URL: https://spice.ai/careers
Date: 2025-11-19T20:45:41
Description: Join Spice AI and help build the future of data and AI infrastructure.

<HeroCenteredText
  fields={{
    graphic_position: 'graphic-right',
    heading_tag: 'h1',
    heading: 'Build the future of data and AI',
    paragraph:
      'Join a team pushing the boundaries of data infrastructure, AI, and developer experience. Work on hard problems, ship real impact, and grow with us.',
    cta: [
      {
        type: 'filled',
        cta: {
          title: 'Join our team',
          url: 'https://jobs.lever.co/spiceai',
          target: '_blank',
        },
      },
      {
        type: 'bordered',
        cta: {
          title: 'Meet the Team',
          url: '/careers/',
          target: '',
        },
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<ContentImageVideo
  fields={{
    variant: 'variant-2',
    heading: 'Help shape the next generation of intelligent software',
    heading_tag: 'h2',
    paragraph:
      "Spice AI is building the world's most powerful open-source data and AI  engine. We're a small, high-impact team working across distributed systems, query engines, AI, open-source tooling, and modern developer experience. If you thrive in fast-moving environments, love solving difficult problems, and want to work with people who care deeply about craft, you'll fit right in.",
    cta: [
      {
        type: 'filled',
        cta: {
          title: 'Learn more',
          url: 'https://baunfire.vercel.app/about-us/',
          target: '',
        },
      },
      {
        type: 'bordered',
        cta: {
          title: 'Open roles',
          url: 'https://jobs.lever.co/spiceai',
          target: '_blank',
        },
      },
    ],
    media_type: 'image',
    media_image: {
      ID: 1327,
      id: 1327,
      title: 'spice_team_photo',
      filename: 'spice_team_photo.jpg',
      filesize: 769307,
      url: '/website-assets/media/2025/11/spice_team_photo.jpg',
      link: '/careers/attachment/spice_team_photo/',
      alt: 'The Spice AI team posing together at a team offsite event',
      author: '6',
      description: '',
      caption: '',
      name: 'spice_team_photo',
      status: 'inherit',
      uploaded_to: 961,
      date: '2025-11-24 23:45:57',
      modified: '2025-11-24 23:45:57',
      menu_order: 0,
      mime_type: 'image/jpeg',
      type: 'image',
      subtype: 'jpeg',
      icon: '/website-assets/media/default.png',
      width: 2048,
      height: 1536,
      sizes: {
        thumbnail: '/website-assets/media/2025/11/spice_team_photo.jpg',
        'thumbnail-width': 150,
        'thumbnail-height': 150,
        medium: '/website-assets/media/2025/11/spice_team_photo.jpg',
        'medium-width': 300,
        'medium-height': 225,
        medium_large: '/website-assets/media/2025/11/spice_team_photo.jpg',
        'medium_large-width': 768,
        'medium_large-height': 576,
        large: '/website-assets/media/2025/11/spice_team_photo.jpg',
        'large-width': 1024,
        'large-height': 768,
        '1536x1536': '/website-assets/media/2025/11/spice_team_photo.jpg',
        '1536x1536-width': 1536,
        '1536x1536-height': 1152,
        '2048x2048': '/website-assets/media/2025/11/spice_team_photo.jpg',
        '2048x2048-width': 2048,
        '2048x2048-height': 1536,
      },
    },
    graphic_overlay: false,
    media_video: '',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<ContentJobPostings
  fields={{
    heading: 'Open Positions',
    heading_tag: 'h2',
    paragraph: 'Check out our open positions.',
    cta: {
      title: 'Contact us',
      url: '/contact/',
      target: '',
    },
    padding_top: 'st-lg',
    padding_bottom: 'sb-lg',
  }}
/>

<ContentThreeAcrossIconText
  fields={{
    heading: 'Our values',
    heading_tag: 'h2',
    paragraph:
      'Our values guide how we build, collaborate, and serve the developers who rely on us. They reflect who we are as a team and how we show up every day to advance the future of data and AI.',
    items: [
      {
        icon: {
          ID: 1152,
          id: 1152,
          title: 'About-Us-Leadtheway',
          filename: 'About-Us-Leadtheway.png',
          filesize: 18253,
          url: '/website-assets/media/2025/11/About-Us-Leadtheway.png',
          link: '/about-us/attachment/about-us-leadtheway/',
          alt: '',
          author: '6',
          description: '',
          caption: '',
          name: 'about-us-leadtheway',
          status: 'inherit',
          uploaded_to: 963,
          date: '2025-11-21 22:36:08',
          modified: '2025-11-21 22:36:08',
          menu_order: 0,
          mime_type: 'image/png',
          type: 'image',
          subtype: 'png',
          icon: '/website-assets/media/default.png',
          width: 300,
          height: 300,
          sizes: {
            thumbnail: '/website-assets/media/2025/11/About-Us-Leadtheway-150x150.png',
            'thumbnail-width': 150,
            'thumbnail-height': 150,
            medium: '/website-assets/media/2025/11/About-Us-Leadtheway.png',
            'medium-width': 300,
            'medium-height': 300,
            medium_large: '/website-assets/media/2025/11/About-Us-Leadtheway.png',
            'medium_large-width': 300,
            'medium_large-height': 300,
            large: '/website-assets/media/2025/11/About-Us-Leadtheway.png',
            'large-width': 300,
            'large-height': 300,
            '1536x1536': '/website-assets/media/2025/11/About-Us-Leadtheway.png',
            '1536x1536-width': 300,
            '1536x1536-height': 300,
            '2048x2048': '/website-assets/media/2025/11/About-Us-Leadtheway.png',
            '2048x2048-width': 300,
            '2048x2048-height': 300,
          },
        },
        title: 'Lead the way',
        description:
          'Leading the way requires each of us to be a leader - to take ownership,  provide clarity, and progress towards realizing our vision.',
      },
      {
        icon: {
          ID: 1151,
          id: 1151,
          title: 'AboutUs_Work as one',
          filename: 'AboutUs_Work-as-one.svg',
          filesize: 4412,
          url: '/website-assets/media/2025/11/AboutUs_Work-as-one.svg',
          link: '/about-us/attachment/aboutus_work-as-one/',
          alt: '',
          author: '6',
          description: '',
          caption: '',
          name: 'aboutus_work-as-one',
          status: 'inherit',
          uploaded_to: 963,
          date: '2025-11-21 22:31:14',
          modified: '2025-11-21 22:31:14',
          menu_order: 0,
          mime_type: 'image/svg+xml',
          type: 'image',
          subtype: 'svg+xml',
          icon: '/website-assets/media/default.png',
          width: 0,
          height: 0,
          sizes: {
            thumbnail: '/website-assets/media/2025/11/AboutUs_Work-as-one.svg',
            'thumbnail-width': 1,
            'thumbnail-height': 1,
            medium: '/website-assets/media/2025/11/AboutUs_Work-as-one.svg',
            'medium-width': 1,
            'medium-height': 1,
            medium_large: '/website-assets/media/2025/11/AboutUs_Work-as-one.svg',
            'medium_large-width': 1,
            'medium_large-height': 1,
            large: '/website-assets/media/2025/11/AboutUs_Work-as-one.svg',
            'large-width': 1,
            'large-height': 1,
            '1536x1536': '/website-assets/media/2025/11/AboutUs_Work-as-one.svg',
            '1536x1536-width': 1,
            '1536x1536-height': 1,
            '2048x2048': '/website-assets/media/2025/11/AboutUs_Work-as-one.svg',
            '2048x2048-width': 1,
            '2048x2048-height': 1,
          },
        },
        title: 'Work as one',
        description:
          'We trust, respect, and encourage each other through every challenge, and celebrate every success together. ',
      },
      {
        icon: {
          ID: 1145,
          id: 1145,
          title: 'AboutUs_Empower developers',
          filename: 'AboutUs_Empower-developers.svg',
          filesize: 5933,
          url: '/website-assets/media/2025/11/AboutUs_Empower-developers.svg',
          link: '/about-us/attachment/aboutus_empower-developers/',
          alt: '',
          author: '6',
          description: '',
          caption: '',
          name: 'aboutus_empower-developers',
          status: 'inherit',
          uploaded_to: 963,
          date: '2025-11-21 22:31:10',
          modified: '2025-11-21 22:31:10',
          menu_order: 0,
          mime_type: 'image/svg+xml',
          type: 'image',
          subtype: 'svg+xml',
          icon: '/website-assets/media/default.png',
          width: 0,
          height: 0,
          sizes: {
            thumbnail: '/website-assets/media/2025/11/AboutUs_Empower-developers.svg',
            'thumbnail-width': 1,
            'thumbnail-height': 1,
            medium: '/website-assets/media/2025/11/AboutUs_Empower-developers.svg',
            'medium-width': 1,
            'medium-height': 1,
            medium_large: '/website-assets/media/2025/11/AboutUs_Empower-developers.svg',
            'medium_large-width': 1,
            'medium_large-height': 1,
            large: '/website-assets/media/2025/11/AboutUs_Empower-developers.svg',
            'large-width': 1,
            'large-height': 1,
            '1536x1536': '/website-assets/media/2025/11/AboutUs_Empower-developers.svg',
            '1536x1536-width': 1,
            '1536x1536-height': 1,
            '2048x2048': '/website-assets/media/2025/11/AboutUs_Empower-developers.svg',
            '2048x2048-width': 1,
            '2048x2048-height': 1,
          },
        },
        title: 'Empower developers',
        description:
          "We're dedicated to delivering the greatest developer experiences imaginable.",
      },
      {
        icon: {
          ID: 1146,
          id: 1146,
          title: 'AboutUs_Integrity, accountability, and congruency',
          filename: 'AboutUs_Integrity-accountability-and-congruency.svg',
          filesize: 6049,
          url: '/website-assets/media/2025/11/AboutUs_Integrity-accountability-and-congruency.svg',
          link: '/about-us/attachment/aboutus_integrity-accountability-and-congruency/',
          alt: '',
          author: '6',
          description: '',
          caption: '',
          name: 'aboutus_integrity-accountability-and-congruency',
          status: 'inherit',
          uploaded_to: 963,
          date: '2025-11-21 22:31:10',
          modified: '2025-11-21 22:31:10',
          menu_order: 0,
          mime_type: 'image/svg+xml',
          type: 'image',
          subtype: 'svg+xml',
          icon: '/website-assets/media/default.png',
          width: 0,
          height: 0,
          sizes: {
            thumbnail:
              '/website-assets/media/2025/11/AboutUs_Integrity-accountability-and-congruency.svg',
            'thumbnail-width': 1,
            'thumbnail-height': 1,
            medium:
              '/website-assets/media/2025/11/AboutUs_Integrity-accountability-and-congruency.svg',
            'medium-width': 1,
            'medium-height': 1,
            medium_large:
              '/website-assets/media/2025/11/AboutUs_Integrity-accountability-and-congruency.svg',
            'medium_large-width': 1,
            'medium_large-height': 1,
            large:
              '/website-assets/media/2025/11/AboutUs_Integrity-accountability-and-congruency.svg',
            'large-width': 1,
            'large-height': 1,
            '1536x1536':
              '/website-assets/media/2025/11/AboutUs_Integrity-accountability-and-congruency.svg',
            '1536x1536-width': 1,
            '1536x1536-height': 1,
            '2048x2048':
              '/website-assets/media/2025/11/AboutUs_Integrity-accountability-and-congruency.svg',
            '2048x2048-width': 1,
            '2048x2048-height': 1,
          },
        },
        title: 'Integrity, accountability, and congruency',
        description: 'Judged by actions. Walk your talk.',
      },
      {
        icon: {
          ID: 1149,
          id: 1149,
          title: 'AboutUs_Simplicity is perfection',
          filename: 'AboutUs_Simplicity-is-perfection.svg',
          filesize: 4092,
          url: '/website-assets/media/2025/11/AboutUs_Simplicity-is-perfection.svg',
          link: '/about-us/attachment/aboutus_simplicity-is-perfection/',
          alt: '',
          author: '6',
          description: '',
          caption: '',
          name: 'aboutus_simplicity-is-perfection',
          status: 'inherit',
          uploaded_to: 963,
          date: '2025-11-21 22:31:13',
          modified: '2025-11-21 22:31:13',
          menu_order: 0,
          mime_type: 'image/svg+xml',
          type: 'image',
          subtype: 'svg+xml',
          icon: '/website-assets/media/default.png',
          width: 0,
          height: 0,
          sizes: {
            thumbnail: '/website-assets/media/2025/11/AboutUs_Simplicity-is-perfection.svg',
            'thumbnail-width': 1,
            'thumbnail-height': 1,
            medium: '/website-assets/media/2025/11/AboutUs_Simplicity-is-perfection.svg',
            'medium-width': 1,
            'medium-height': 1,
            medium_large: '/website-assets/media/2025/11/AboutUs_Simplicity-is-perfection.svg',
            'medium_large-width': 1,
            'medium_large-height': 1,
            large: '/website-assets/media/2025/11/AboutUs_Simplicity-is-perfection.svg',
            'large-width': 1,
            'large-height': 1,
            '1536x1536': '/website-assets/media/2025/11/AboutUs_Simplicity-is-perfection.svg',
            '1536x1536-width': 1,
            '1536x1536-height': 1,
            '2048x2048': '/website-assets/media/2025/11/AboutUs_Simplicity-is-perfection.svg',
            '2048x2048-width': 1,
            '2048x2048-height': 1,
          },
        },
        title: 'Simplicity is perfection',
        description:
          'We deliver the simplest solutions possible. Simple means less pain for developers, lower costs, and less labor. ',
      },
      {
        icon: {
          ID: 1150,
          id: 1150,
          title: 'AboutUs_Vectors over scalars',
          filename: 'AboutUs_Vectors-over-scalars.svg',
          filesize: 4311,
          url: '/website-assets/media/2025/11/AboutUs_Vectors-over-scalars.svg',
          link: '/about-us/attachment/aboutus_vectors-over-scalars/',
          alt: '',
          author: '6',
          description: '',
          caption: '',
          name: 'aboutus_vectors-over-scalars',
          status: 'inherit',
          uploaded_to: 963,
          date: '2025-11-21 22:31:13',
          modified: '2025-11-21 22:31:13',
          menu_order: 0,
          mime_type: 'image/svg+xml',
          type: 'image',
          subtype: 'svg+xml',
          icon: '/website-assets/media/default.png',
          width: 0,
          height: 0,
          sizes: {
            thumbnail: '/website-assets/media/2025/11/AboutUs_Vectors-over-scalars.svg',
            'thumbnail-width': 1,
            'thumbnail-height': 1,
            medium: '/website-assets/media/2025/11/AboutUs_Vectors-over-scalars.svg',
            'medium-width': 1,
            'medium-height': 1,
            medium_large: '/website-assets/media/2025/11/AboutUs_Vectors-over-scalars.svg',
            'medium_large-width': 1,
            'medium_large-height': 1,
            large: '/website-assets/media/2025/11/AboutUs_Vectors-over-scalars.svg',
            'large-width': 1,
            'large-height': 1,
            '1536x1536': '/website-assets/media/2025/11/AboutUs_Vectors-over-scalars.svg',
            '1536x1536-width': 1,
            '1536x1536-height': 1,
            '2048x2048': '/website-assets/media/2025/11/AboutUs_Vectors-over-scalars.svg',
            '2048x2048-width': 1,
            '2048x2048-height': 1,
          },
        },
        title: 'Vectors over scalars',
        description:
          'Velocity, direction, and momentum matter more than point values. Continuous improvement.',
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<CarouselTimeline
  fields={{
    heading: 'Our hiring process',
    heading_tag: 'h2',
    paragraph:
      'Interested in joining us on our journey? We are always looking for talented and driven people who will help push us forward. Here is a breakdown of what to expect from our hiring process.',
    items: [
      {
        title: 'Stage 1: Introductions',
        paragraph:
          'Meet one or two members of the Spice AI team, introduce yourself, and learn more about how you might contribute to the mission.',
      },
      {
        title: 'Stage 2: Book challenge',
        paragraph:
          'Lead a mini "book club" session with the team on a book or research paper, and discuss and debate its merits.',
      },
      {
        title: 'Stage 3: Pair programming',
        paragraph:
          'No whiteboard interviews. Jump into a pair-programming session with an engineer on the team and solve real-world problems.',
      },
      {
        title: 'Stage 4: Design and problem-solving',
        paragraph:
          'Design a solution to a systems design and/or machine learning problem.',
      },
      {
        title: 'Stage 5: Offer',
        paragraph:
          "If it's a fit, we'll typically provide a competitive offer within 48 hours of interviews.",
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<CarouselTestimonials
  fields={{
    heading: 'Why Spice AI?',
    heading_tag: 'h2',
    paragraph:
      'Face and overcome challenging problems at the intersection of data and AI. Help to shape the future of the industry.',
    cta: '',
    items: [
      {
        title: 'Roger Frey',
        person: 'Roger Frey',
        position: 'President and COO',
        message:
          "I saw the high caliber of the team's engineers during my interviews and immediately knew Spice AI was an ambitious startup with a serious chance of building the next software application paradigm; I couldn't not join.",
        logo: null,
        image: false,
        github: '',
        linkedin: '',
        source: 'employee',
      },
      {
        title: 'Jack Eadie',
        person: 'Jack Eadie',
        position: 'Senior Software Engineer',
        message:
          'I am extremely proud to be a part of Spice AI. The team is exceptional, driven by ambitious goals, and led by outstanding, supportive leadership. From the moment I joined, I was impressed. I am very optimistic about the future of the company.',
        logo: null,
        image: false,
        github: 'https://github.com/Jeadie',
        linkedin: '',
        source: 'employee',
      },
      {
        title: 'Evgenii Kramkov',
        person: 'Evgenii Kramkov',
        position: 'Senior Software Engineer',
        message:
          "After 17 years working on large enterprise projects, I'm excited to join Spice AI to work on challenging technical problems at the intersection of large-scale data, query engines, and AI-making a real impact while also contributing to leading open-source projects. Spice AI is a small, exceptional team focused on quality and moving fast-exactly what I was looking for.",
        logo: null,
        image: false,
        github: 'https://github.com/ewgenius',
        linkedin: '',
        source: 'employee',
      },
      {
        title: 'Sergei Grebnov',
        person: 'Sergei Grebnov',
        position: 'Senior Software Engineer',
        message:
          "Working at Spice has presented me with so many unique data and AI challenges in such a short timeframe, making me grow at a rate I thought was impossible! I'm so proud of the product my colleagues and I are creating, and am grateful to work with such a talented team.",
        logo: null,
        image: false,
        github: 'https://github.com/peasee',
        linkedin: '',
        source: 'employee',
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<TalkToAnEngineerCta />

---

## Contact
URL: https://spice.ai/contact
Date: 2025-11-19T20:34:04
Description: Get in touch with the Spice AI team. Whether you're exploring enterprise deployments, pricing, integrations, or technical questions, we're here to help.

<HeroForm
  fields={{
    heading_tag: 'h1',
    heading: 'Contact us',
    paragraph:
      'Have questions about the Spice platform, enterprise deployments, partnerships, or getting started? Reach out and our team will get back to you shortly.',
    message:
      '"Spice opened the door to take these critical control-plane datasets and move them next to our services in the runtime path."',
    author: 'Peter Janovsky',
    position: 'Software Architect, Twilio',
    logos: [
      {
        logo: {
          ID: 443,
          id: 443,
          title: 'Homepage_Logos_Twilio',
          filename: 'Homepage_Logos_Twilio-1.svg',
          filesize: 4020,
          url: '/website-assets/media/2025/11/Homepage_Logos_Twilio-1.svg',
          link: '/home/homepage_logos_twilio-2/',
          alt: 'Twilio logo',
          author: '6',
          description: '',
          caption: '',
          name: 'homepage_logos_twilio-2',
          status: 'inherit',
          uploaded_to: 2,
          date: '2025-11-05 18:46:45',
          modified: '2025-11-05 18:46:45',
          menu_order: 0,
          mime_type: 'image/svg+xml',
          type: 'image',
          subtype: 'svg+xml',
          icon: '/website-assets/media/default.png',
          width: 0,
          height: 0,
          sizes: {
            thumbnail: '/website-assets/media/2025/11/Homepage_Logos_Twilio-1.svg',
            'thumbnail-width': 1,
            'thumbnail-height': 1,
            medium: '/website-assets/media/2025/11/Homepage_Logos_Twilio-1.svg',
            'medium-width': 1,
            'medium-height': 1,
            medium_large: '/website-assets/media/2025/11/Homepage_Logos_Twilio-1.svg',
            'medium_large-width': 1,
            'medium_large-height': 1,
            large: '/website-assets/media/2025/11/Homepage_Logos_Twilio-1.svg',
            'large-width': 1,
            'large-height': 1,
            '1536x1536': '/website-assets/media/2025/11/Homepage_Logos_Twilio-1.svg',
            '1536x1536-width': 1,
            '1536x1536-height': 1,
            '2048x2048': '/website-assets/media/2025/11/Homepage_Logos_Twilio-1.svg',
            '2048x2048-width': 1,
            '2048x2048-height': 1,
          },
        },
      },
      {
        logo: {
          ID: 442,
          id: 442,
          title: 'Homepage_Logos_NRC',
          filename: 'Homepage_Logos_NRC-1.svg',
          filesize: 1030,
          url: '/website-assets/media/2025/11/Homepage_Logos_NRC-1.svg',
          link: '/home/homepage_logos_nrc-2/',
          alt: 'NRC Health logo',
          author: '6',
          description: '',
          caption: '',
          name: 'homepage_logos_nrc-2',
          status: 'inherit',
          uploaded_to: 2,
          date: '2025-11-05 18:46:45',
          modified: '2025-11-05 18:46:45',
          menu_order: 0,
          mime_type: 'image/svg+xml',
          type: 'image',
          subtype: 'svg+xml',
          icon: '/website-assets/media/default.png',
          width: 0,
          height: 0,
          sizes: {
            thumbnail: '/website-assets/media/2025/11/Homepage_Logos_NRC-1.svg',
            'thumbnail-width': 1,
            'thumbnail-height': 1,
            medium: '/website-assets/media/2025/11/Homepage_Logos_NRC-1.svg',
            'medium-width': 1,
            'medium-height': 1,
            medium_large: '/website-assets/media/2025/11/Homepage_Logos_NRC-1.svg',
            'medium_large-width': 1,
            'medium_large-height': 1,
            large: '/website-assets/media/2025/11/Homepage_Logos_NRC-1.svg',
            'large-width': 1,
            'large-height': 1,
            '1536x1536': '/website-assets/media/2025/11/Homepage_Logos_NRC-1.svg',
            '1536x1536-width': 1,
            '1536x1536-height': 1,
            '2048x2048': '/website-assets/media/2025/11/Homepage_Logos_NRC-1.svg',
            '2048x2048-width': 1,
            '2048x2048-height': 1,
          },
        },
      },
      {
        logo: {
          ID: 441,
          id: 441,
          title: 'Homepage_Logos_BasisSet',
          filename: 'Homepage_Logos_BasisSet-1.svg',
          filesize: 2629,
          url: '/website-assets/media/2025/11/Homepage_Logos_BasisSet-1.svg',
          link: '/home/homepage_logos_basisset-2/',
          alt: 'Basis Set Ventures logo',
          author: '6',
          description: '',
          caption: '',
          name: 'homepage_logos_basisset-2',
          status: 'inherit',
          uploaded_to: 2,
          date: '2025-11-05 18:46:45',
          modified: '2025-11-05 18:46:45',
          menu_order: 0,
          mime_type: 'image/svg+xml',
          type: 'image',
          subtype: 'svg+xml',
          icon: '/website-assets/media/default.png',
          width: 0,
          height: 0,
          sizes: {
            thumbnail: '/website-assets/media/2025/11/Homepage_Logos_BasisSet-1.svg',
            'thumbnail-width': 1,
            'thumbnail-height': 1,
            medium: '/website-assets/media/2025/11/Homepage_Logos_BasisSet-1.svg',
            'medium-width': 1,
            'medium-height': 1,
            medium_large: '/website-assets/media/2025/11/Homepage_Logos_BasisSet-1.svg',
            'medium_large-width': 1,
            'medium_large-height': 1,
            large: '/website-assets/media/2025/11/Homepage_Logos_BasisSet-1.svg',
            'large-width': 1,
            'large-height': 1,
            '1536x1536': '/website-assets/media/2025/11/Homepage_Logos_BasisSet-1.svg',
            '1536x1536-width': 1,
            '1536x1536-height': 1,
            '2048x2048': '/website-assets/media/2025/11/Homepage_Logos_BasisSet-1.svg',
            '2048x2048-width': 1,
            '2048x2048-height': 1,
          },
        },
      },
      {
        logo: {
          ID: 440,
          id: 440,
          title: 'Homepage_Logos_Barracuda',
          filename: 'Homepage_Logos_Barracuda-1.svg',
          filesize: 7450,
          url: '/website-assets/media/2025/11/Homepage_Logos_Barracuda-1.svg',
          link: '/home/homepage_logos_barracuda-2/',
          alt: 'Barracuda Networks logo',
          author: '6',
          description: '',
          caption: '',
          name: 'homepage_logos_barracuda-2',
          status: 'inherit',
          uploaded_to: 2,
          date: '2025-11-05 18:46:45',
          modified: '2025-11-05 18:46:45',
          menu_order: 0,
          mime_type: 'image/svg+xml',
          type: 'image',
          subtype: 'svg+xml',
          icon: '/website-assets/media/default.png',
          width: 0,
          height: 0,
          sizes: {
            thumbnail: '/website-assets/media/2025/11/Homepage_Logos_Barracuda-1.svg',
            'thumbnail-width': 1,
            'thumbnail-height': 1,
            medium: '/website-assets/media/2025/11/Homepage_Logos_Barracuda-1.svg',
            'medium-width': 1,
            'medium-height': 1,
            medium_large: '/website-assets/media/2025/11/Homepage_Logos_Barracuda-1.svg',
            'medium_large-width': 1,
            'medium_large-height': 1,
            large: '/website-assets/media/2025/11/Homepage_Logos_Barracuda-1.svg',
            'large-width': 1,
            'large-height': 1,
            '1536x1536': '/website-assets/media/2025/11/Homepage_Logos_Barracuda-1.svg',
            '1536x1536-width': 1,
            '1536x1536-height': 1,
            '2048x2048': '/website-assets/media/2025/11/Homepage_Logos_Barracuda-1.svg',
            '2048x2048-width': 1,
            '2048x2048-height': 1,
          },
        },
      },
    ],
    form_title: 'Get in touch',
    form: {
      region: 'na1',
      form_id: '086d9557-42de-40f4-af0a-2d4c676207e9',
      portal_id: '46107967',
    },
  }}
/>

---

## Spice.ai Cookbook
URL: https://spice.ai/cookbook
Date: 2026-02-24T00:00:00
Description: A collection of guides and samples to help you build data-grounded AI apps and agents with Spice.ai Open-Source. Find ready-to-use examples for data acceleration, AI agents, LLM memory, and more.

<HeroCenteredText
  fields={{
    graphic_position: 'no-graphic',
    heading: '🧑‍🍳 Spice.ai Cookbook',
    heading_tag: 'h1',
    paragraph:
      '78 guides and samples to help you build data-grounded AI apps and agents with Spice.ai Open-Source. Find ready-to-use examples for data acceleration, AI agents, LLM memory, and more.',
    cta: [
      {
        type: 'filled',
        cta: {
          title: 'Browse the cookbook repo',
          url: 'https://github.com/spiceai/cookbook',
          target: '_blank',
        },
      },
      {
        type: 'bordered',
        cta: {
          title: 'Get a demo',
          url: '/get-a-demo',
          target: '',
        },
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<TabsCardsGrid
  fields={{
    heading: 'Featured Recipes',
    heading_tag: 'h2',
    paragraph:
      'Most popular cookbook recipes for SQL federation, local models, acceleration, and LLM memory.',
    enable_filters: false,
    source: 'recipe',
    posts: [
      {
        title: 'Federated SQL Query',
        description: 'Join S3, PostgreSQL, and Dremio data in one SQL query.',
        cta: {
          title: 'View recipe',
          url: 'https://github.com/spiceai/cookbook/blob/trunk/federation/README.md',
          target: '_blank',
        },
      },
      {
        title: 'Run Llama3 Locally',
        description:
          'Use Llama models from HuggingFace with Spice. Includes video walkthrough.',
        cta: {
          title: 'View recipe',
          url: 'https://github.com/spiceai/cookbook/blob/trunk/llama/README.md',
          target: '_blank',
        },
      },
      {
        title: 'Data Acceleration with DuckDB',
        description:
          'Speed up queries using DuckDB. Includes video walkthrough.',
        cta: {
          title: 'View recipe',
          url: 'https://github.com/spiceai/cookbook/blob/trunk/duckdb/accelerator/README.md',
          target: '_blank',
        },
      },
    ],
    padding_top: 'st-sm',
    padding_bottom: 'sb-lg',
  }}
/>

{/*

  <TabsCardsGrid
    fields={{
      heading: 'Sample Applications and Guides',
      heading_tag: 'h2',
      paragraph:
        'Example apps and guides for real-world Spice.ai usage and best practices.',
      enable_filters: false,
      source: 'recipe',
      posts: [
        {
          title: 'Command Query Responsibility Segregation (CQRS)',
          description:
            'Sample application implementing the CQRS pattern with Spice.',
          cta: {
            title: 'View recipe',
            url: 'https://github.com/spiceai/cookbook/blob/trunk/cqrs/README.md',
            target: '_blank',
          },
        },
      ],
      padding_top: 'st-lg',
      padding_bottom: 'sb-lg',
    }}
  />
*/}

<TabsCardsGrid
  fields={{
    heading: 'Core Features',
    heading_tag: 'h2',
    paragraph:
      'Discover core capabilities like data federation, acceleration, search, and LLM inference to enhance your applications.',
    enable_filters: false,
    source: 'recipe',
    posts: [
      {
        title: 'Federated SQL Query',
        description:
          'Query data from S3, PostgreSQL, and Dremio in a single query.',
        cta: {
          title: 'View recipe',
          url: 'https://github.com/spiceai/cookbook/blob/trunk/federation/README.md',
          target: '_blank',
        },
      },
      {
        title: 'OpenAI SDK',
        description: 'Use the OpenAI SDK to connect to models hosted on Spice.',
        cta: {
          title: 'View recipe',
          url: 'https://github.com/spiceai/cookbook/blob/trunk/openai_sdk/README.md',
          target: '_blank',
        },
      },
      {
        title: 'AI SQL Function',
        description:
          'Invoke LLMs directly within SQL queries using the AI SQL function.',
        cta: {
          title: 'View recipe',
          url: 'https://github.com/spiceai/cookbook/blob/trunk/ai/README.md',
          target: '_blank',
        },
      },
      {
        title: 'DuckDB Data Accelerator',
        description:
          'Accelerate data locally using DuckDB. Includes video walkthrough.',
        cta: {
          title: 'View recipe',
          url: 'https://github.com/spiceai/cookbook/blob/trunk/duckdb/accelerator/README.md',
          target: '_blank',
        },
      },
      {
        title: 'Amazon S3 Vectors Search',
        description:
          'Use Amazon S3 Vectors to store embeddings and run efficient vector search. Includes video walkthrough.',
        cta: {
          title: 'View recipe',
          url: 'https://github.com/spiceai/cookbook/tree/trunk/vectors/s3',
          target: '_blank',
        },
      },
      {
        title: 'Spice Cayenne Data Accelerator',
        description:
          'Accelerate data locally using the Spice Cayenne Data Accelerator.',
        cta: {
          title: 'View recipe',
          url: 'https://github.com/spiceai/cookbook/blob/trunk/cayenne/README.md',
          target: '_blank',
        },
      },
    ],
    padding_top: 'st-lg',
    padding_bottom: 'sb-lg',
  }}
/>

<TabsCardsGrid
  fields={{
    heading: 'Models, AI, and Agents',
    heading_tag: 'h2',
    paragraph:
      'Integrate with popular AI models, LLMs, and build intelligent agents using Spice.ai.',
    enable_filters: false,
    source: 'recipe',
    posts: [
      {
        title: 'Azure OpenAI Models',
        description: 'Connect and use Azure OpenAI models with Spice.',
        cta: {
          title: 'View recipe',
          url: 'https://github.com/spiceai/cookbook/blob/trunk/azure_openai/README.md',
          target: '_blank',
        },
      },
      {
        title: 'Running Llama3 Locally',
        description:
          'Use the Llama family of models locally from HuggingFace using Spice. Includes video walkthrough.',
        cta: {
          title: 'View recipe',
          url: 'https://github.com/spiceai/cookbook/blob/trunk/llama/README.md',
          target: '_blank',
        },
      },
      {
        title: 'OpenAI SDK',
        description: 'Use the OpenAI SDK to connect to models hosted on Spice.',
        cta: {
          title: 'View recipe',
          url: 'https://github.com/spiceai/cookbook/blob/trunk/openai_sdk/README.md',
          target: '_blank',
        },
      },
      {
        title: 'OpenAI Responses API',
        description: 'Use the OpenAI Responses API with Spice.',
        cta: {
          title: 'View recipe',
          url: 'https://github.com/spiceai/cookbook/blob/trunk/openai-responses-api/README.md',
          target: '_blank',
        },
      },
      {
        title: 'OpenAI Models',
        description: 'Use OpenAI LLM and embedding models in Spice.',
        cta: {
          title: 'View recipe',
          url: 'https://github.com/spiceai/cookbook/blob/trunk/models/openai/README.md',
          target: '_blank',
        },
      },
      {
        title: 'LLM Memory',
        description: 'Persistent memory for language models.',
        cta: {
          title: 'View recipe',
          url: 'https://github.com/spiceai/cookbook/blob/trunk/llm-memory/README.md',
          target: '_blank',
        },
      },
      {
        title: 'Text to SQL (NSQL)',
        description:
          'Ask natural language (NLP) questions of your datasets using the built-in text-to-SQL tool.',
        cta: {
          title: 'View recipe',
          url: 'https://github.com/spiceai/cookbook/blob/trunk/text-to-sql/README.md',
          target: '_blank',
        },
      },
      {
        title: 'AI SQL Function',
        description:
          'Invoke LLMs directly within SQL queries using the AI SQL function.',
        cta: {
          title: 'View recipe',
          url: 'https://github.com/spiceai/cookbook/blob/trunk/ai/README.md',
          target: '_blank',
        },
      },
      {
        title: 'Generative Visualizations',
        description:
          'Generate SQL queries and Chart.js visualizations from natural language using AI.',
        cta: {
          title: 'View recipe',
          url: 'https://github.com/spiceai/cookbook/blob/trunk/generative-visualisations/README.md',
          target: '_blank',
        },
      },
      {
        title: 'Nvidia NIM on Kubernetes',
        description:
          'Deploy Nvidia NIM infrastructure on Kubernetes with GPUs connected to Spice.',
        cta: {
          title: 'View recipe',
          url: 'https://github.com/spiceai/cookbook/blob/trunk/nvidia-nim/kubernetes/README.md',
          target: '_blank',
        },
      },
      {
        title: 'Nvidia NIM on AWS EC2',
        description:
          'Deploy Nvidia NIM on AWS GPU-optimized EC2 instances connected to Spice.',
        cta: {
          title: 'View recipe',
          url: 'https://github.com/spiceai/cookbook/blob/trunk/nvidia-nim/ec2/README.md',
          target: '_blank',
        },
      },
      {
        title: 'Searching GitHub Files',
        description:
          'Search GitHub files with embeddings and vector similarity search. Includes video walkthrough.',
        cta: {
          title: 'View recipe',
          url: 'https://github.com/spiceai/cookbook/blob/trunk/search_github_files/README.md',
          target: '_blank',
        },
      },
      {
        title: 'Hybrid-Search with RRF',
        description:
          'Combine multiple search methods using Reciprocal Rank Fusion (RRF) for improved search results.',
        cta: {
          title: 'View recipe',
          url: 'https://github.com/spiceai/cookbook/blob/trunk/search/README.md',
          target: '_blank',
        },
      },
      {
        title: 'xAI Models',
        description: 'Use xAI models such as Grok. Includes video walkthrough.',
        cta: {
          title: 'View recipe',
          url: 'https://github.com/spiceai/cookbook/blob/trunk/models/xai/README.md',
          target: '_blank',
        },
      },
      {
        title: 'DeepSeek Model',
        description: 'Use DeepSeek model through Spice.',
        cta: {
          title: 'View recipe',
          url: 'https://github.com/spiceai/cookbook/blob/trunk/deepseek/README.md',
          target: '_blank',
        },
      },
      {
        title: 'Filesystem Hosted Model',
        description: 'Use models hosted directly on filesystems.',
        cta: {
          title: 'View recipe',
          url: 'https://github.com/spiceai/cookbook/blob/trunk/models/filesystem/README.md',
          target: '_blank',
        },
      },
      {
        title: 'Web Search Tools using Perplexity',
        description:
          'Provide LLMs with web search access for more informed answers.',
        cta: {
          title: 'View recipe',
          url: 'https://github.com/spiceai/cookbook/blob/trunk/websearch/README.md',
          target: '_blank',
        },
      },
      {
        title: 'Language Model Evaluations',
        description: 'Use Spice to evaluate language models.',
        cta: {
          title: 'View recipe',
          url: 'https://github.com/spiceai/cookbook/blob/trunk/evals/README.md',
          target: '_blank',
        },
      },
      {
        title: 'LLM as a Judge',
        description:
          'Define LLM judge models to evaluate the performance of other language models.',
        cta: {
          title: 'View recipe',
          url: 'https://github.com/spiceai/cookbook/blob/trunk/llm-judge/README.md',
          target: '_blank',
        },
      },
      {
        title: 'Model-Context-Protocol (MCP)',
        description: 'Use Spice to connect to or host MCP servers.',
        cta: {
          title: 'View recipe',
          url: 'https://github.com/spiceai/cookbook/blob/trunk/mcp/README.md',
          target: '_blank',
        },
      },
      {
        title: 'Amazon S3 Vectors',
        description:
          'Use Amazon S3 Vectors to store embeddings and perform efficient vector search. Includes video walkthrough.',
        cta: {
          title: 'View recipe',
          url: 'https://github.com/spiceai/cookbook/tree/trunk/vectors/s3',
          target: '_blank',
        },
      },
    ],
    padding_top: 'st-lg',
    padding_bottom: 'sb-lg',
  }}
/>

<TabsCardsGrid
  fields={{
    heading: 'Data Acceleration, Materialization, and Federation',
    heading_tag: 'h2',
    paragraph:
      'Optimize query performance with local acceleration, data materialization, and federation techniques.',
    enable_filters: false,
    source: 'recipe',
    posts: [
      {
        title: 'DuckDB Data Accelerator',
        description:
          'Accelerate data locally using DuckDB. Includes video walkthrough.',
        cta: {
          title: 'View recipe',
          url: 'https://github.com/spiceai/cookbook/blob/trunk/duckdb/accelerator/README.md',
          target: '_blank',
        },
      },
      {
        title: 'PostgreSQL Data Accelerator',
        description: 'Accelerate data locally using PostgreSQL.',
        cta: {
          title: 'View recipe',
          url: 'https://github.com/spiceai/cookbook/blob/trunk/postgres/accelerator/README.md',
          target: '_blank',
        },
      },
      {
        title: 'SQLite Data Accelerator',
        description: 'Accelerate data locally using SQLite.',
        cta: {
          title: 'View recipe',
          url: 'https://github.com/spiceai/cookbook/blob/trunk/sqlite/accelerator/README.md',
          target: '_blank',
        },
      },
      {
        title: 'Apache Arrow Data Accelerator',
        description: 'Accelerate data using Apache Arrow.',
        cta: {
          title: 'View recipe',
          url: 'https://github.com/spiceai/cookbook/blob/trunk/arrow/README.md',
          target: '_blank',
        },
      },
      {
        title: 'Hashed Partitioning with DuckDB',
        description: 'Use hashed partitioning for performance with DuckDB.',
        cta: {
          title: 'View recipe',
          url: 'https://github.com/spiceai/cookbook/blob/trunk/hashed_partitioning/README.md',
          target: '_blank',
        },
      },
      {
        title: 'Dataset Partitioning',
        description:
          'Partition accelerated datasets to improve query performance.',
        cta: {
          title: 'View recipe',
          url: 'https://github.com/spiceai/cookbook/blob/trunk/acceleration/partitioning/README.md',
          target: '_blank',
        },
      },
      {
        title: 'Database Snapshots',
        description:
          'Bootstrap DuckDB accelerations from object storage to skip cold starts.',
        cta: {
          title: 'View recipe',
          url: 'https://github.com/spiceai/cookbook/blob/trunk/acceleration/snapshots/README.md',
          target: '_blank',
        },
      },
      {
        title: 'Accelerated Views',
        description: 'Use view materialization for improved performance.',
        cta: {
          title: 'View recipe',
          url: 'https://github.com/spiceai/cookbook/blob/trunk/views/README.md',
          target: '_blank',
        },
      },
      {
        title: 'Indexes on Accelerated Data',
        description: 'Create and manage indexes on accelerated data.',
        cta: {
          title: 'View recipe',
          url: 'https://github.com/spiceai/cookbook/blob/trunk/acceleration/indexes/README.md',
          target: '_blank',
        },
      },
    ],
    padding_top: 'st-lg',
    padding_bottom: 'sb-lg',
  }}
/>

<TabsCardsGrid
  fields={{
    heading: 'Search & Embeddings',
    heading_tag: 'h2',
    paragraph:
      'Implement advanced search capabilities and leverage embeddings for vector similarity search.',
    enable_filters: false,
    source: 'recipe',
    posts: [
      {
        title: 'Searching GitHub Files',
        description:
          'Search GitHub files with embeddings and vector similarity search. Includes video walkthrough.',
        cta: {
          title: 'View recipe',
          url: 'https://github.com/spiceai/cookbook/blob/trunk/search_github_files/README.md',
          target: '_blank',
        },
      },
      {
        title: 'Hybrid-Search with RRF',
        description:
          'Combine multiple search methods using Reciprocal Rank Fusion (RRF) for improved search results.',
        cta: {
          title: 'View recipe',
          url: 'https://github.com/spiceai/cookbook/blob/trunk/search/README.md',
          target: '_blank',
        },
      },
      {
        title: 'Amazon S3 Vectors',
        description:
          'Use Amazon S3 Vectors to store embeddings and perform efficient vector search. Includes video walkthrough.',
        cta: {
          title: 'View recipe',
          url: 'https://github.com/spiceai/cookbook/tree/trunk/vectors/s3',
          target: '_blank',
        },
      },
    ],
    padding_top: 'st-lg',
    padding_bottom: 'sb-lg',
  }}
/>

<TabsCardsGrid
  fields={{
    heading: 'Data Connectors',
    heading_tag: 'h2',
    paragraph:
      'Connect to various data sources and systems to query, analyze, and manage your data efficiently.',
    enable_filters: false,
    source: 'recipe',
    posts: [
      {
        title: 'PostgreSQL Connector',
        description: 'Connect to and query PostgreSQL databases.',
        cta: {
          title: 'View recipe',
          url: 'https://github.com/spiceai/cookbook/blob/trunk/postgres/connector/README.md',
          target: '_blank',
        },
      },
      {
        title: 'AWS RDS PostgreSQL',
        description: 'Connect to AWS RDS PostgreSQL instances.',
        cta: {
          title: 'View recipe',
          url: 'https://github.com/spiceai/cookbook/blob/trunk/postgres/rds/README.md',
          target: '_blank',
        },
      },
      {
        title: 'Supabase PostgreSQL',
        description: 'Connect to Supabase PostgreSQL databases.',
        cta: {
          title: 'View recipe',
          url: 'https://github.com/spiceai/cookbook/blob/trunk/postgres/supabase/README.md',
          target: '_blank',
        },
      },
      {
        title: 'MySQL Connector',
        description: 'Connect to and query MySQL databases.',
        cta: {
          title: 'View recipe',
          url: 'https://github.com/spiceai/cookbook/blob/trunk/mysql/connector/README.md',
          target: '_blank',
        },
      },
      {
        title: 'AWS RDS Aurora MySQL',
        description: 'Connect to AWS RDS Aurora with MySQL compatibility.',
        cta: {
          title: 'View recipe',
          url: 'https://github.com/spiceai/cookbook/blob/trunk/mysql/rds-aurora/README.md',
          target: '_blank',
        },
      },
      {
        title: 'PlanetScale MySQL',
        description: 'Connect to PlanetScale MySQL databases.',
        cta: {
          title: 'View recipe',
          url: 'https://github.com/spiceai/cookbook/blob/trunk/mysql/planetscale/README.md',
          target: '_blank',
        },
      },
      {
        title: 'Clickhouse Connector',
        description: 'Connect to and query Clickhouse databases.',
        cta: {
          title: 'View recipe',
          url: 'https://github.com/spiceai/cookbook/blob/trunk/clickhouse/README.md',
          target: '_blank',
        },
      },
      {
        title: 'Databricks Connector',
        description:
          'Connect to and query Databricks instances using Delta Lake or Spark Connect.',
        cta: {
          title: 'View recipe',
          url: 'https://github.com/spiceai/cookbook/blob/trunk/databricks/README.md',
          target: '_blank',
        },
      },
      {
        title: 'Delta Lake Connector',
        description: 'Query data from Delta Lake tables.',
        cta: {
          title: 'View recipe',
          url: 'https://github.com/spiceai/cookbook/blob/trunk/delta-lake/README.md',
          target: '_blank',
        },
      },
      {
        title: 'Debezium CDC from Postgres',
        description: 'Stream changes from PostgreSQL using Debezium CDC.',
        cta: {
          title: 'View recipe',
          url: 'https://github.com/spiceai/cookbook/blob/trunk/cdc-debezium/README.md',
          target: '_blank',
        },
      },
      {
        title: 'Debezium CDC with SASL/SCRAM',
        description:
          'Stream MySQL changes using Debezium with SASL/SCRAM authentication.',
        cta: {
          title: 'View recipe',
          url: 'https://github.com/spiceai/cookbook/blob/trunk/cdc-debezium/sasl-scram/README.md',
          target: '_blank',
        },
      },
      {
        title: 'Dremio Connector',
        description: 'Connect to and query Dremio.',
        cta: {
          title: 'View recipe',
          url: 'https://github.com/spiceai/cookbook/blob/trunk/dremio/README.md',
          target: '_blank',
        },
      },
      {
        title: 'DuckDB Connector',
        description: 'Query DuckDB databases with sample TPCH data.',
        cta: {
          title: 'View recipe',
          url: 'https://github.com/spiceai/cookbook/blob/trunk/duckdb/connector/README.md',
          target: '_blank',
        },
      },
      {
        title: 'File Connector',
        description: 'Query data from local files.',
        cta: {
          title: 'View recipe',
          url: 'https://github.com/spiceai/cookbook/blob/trunk/file/README.md',
          target: '_blank',
        },
      },
      {
        title: 'FTP Connector',
        description: 'Query data from FTP servers.',
        cta: {
          title: 'View recipe',
          url: 'https://github.com/spiceai/cookbook/blob/trunk/ftp/README.md',
          target: '_blank',
        },
      },
      {
        title: 'GitHub Connector',
        description:
          'Connect to and query GitHub data. Includes video walkthrough.',
        cta: {
          title: 'View recipe',
          url: 'https://github.com/spiceai/cookbook/blob/trunk/github/README.md',
          target: '_blank',
        },
      },
      {
        title: 'GraphQL Connector',
        description: 'Query data from GraphQL endpoints.',
        cta: {
          title: 'View recipe',
          url: 'https://github.com/spiceai/cookbook/blob/trunk/graphql/README.md',
          target: '_blank',
        },
      },
      {
        title: 'HTTP Connector',
        description: 'Query data from HTTP(s) endpoints like REST APIs.',
        cta: {
          title: 'View recipe',
          url: 'https://github.com/spiceai/cookbook/blob/trunk/http/README.md',
          target: '_blank',
        },
      },
      {
        title: 'MSSQL Connector',
        description: 'Connect to Microsoft SQL Server databases.',
        cta: {
          title: 'View recipe',
          url: 'https://github.com/spiceai/cookbook/blob/trunk/mssql/README.md',
          target: '_blank',
        },
      },
      {
        title: 'ODBC Connector',
        description: 'Connect to databases using ODBC.',
        cta: {
          title: 'View recipe',
          url: 'https://github.com/spiceai/cookbook/blob/trunk/odbc/README.md',
          target: '_blank',
        },
      },
      {
        title: 'Redshift Connector',
        description: 'Read and write TPC-H data with Amazon Redshift.',
        cta: {
          title: 'View recipe',
          url: 'https://github.com/spiceai/cookbook/blob/trunk/redshift/README.md',
          target: '_blank',
        },
      },
      {
        title: 'Oracle Connector',
        description: 'Connect to and query Oracle databases.',
        cta: {
          title: 'View recipe',
          url: 'https://github.com/spiceai/cookbook/blob/trunk/oracle/README.md',
          target: '_blank',
        },
      },
      {
        title: 'Glue Connector',
        description: 'Connect to AWS Glue.',
        cta: {
          title: 'View recipe',
          url: 'https://github.com/spiceai/cookbook/blob/trunk/glue/README.md',
          target: '_blank',
        },
      },
      {
        title: 'S3 Connector',
        description: 'Query data from S3 compatible storage.',
        cta: {
          title: 'View recipe',
          url: 'https://github.com/spiceai/cookbook/blob/trunk/s3/README.md',
          target: '_blank',
        },
      },
      {
        title: 'ScyllaDB Connector',
        description: 'Query data from ScyllaDB clusters using federated SQL.',
        cta: {
          title: 'View recipe',
          url: 'https://github.com/spiceai/cookbook/blob/trunk/scylladb/README.md',
          target: '_blank',
        },
      },
      {
        title: 'SharePoint Connector',
        description: 'Connect to SharePoint and OneDrive for Business.',
        cta: {
          title: 'View recipe',
          url: 'https://github.com/spiceai/cookbook/blob/trunk/sharepoint/README.md',
          target: '_blank',
        },
      },
      {
        title: 'SMB Connector',
        description: 'Query data files from SMB/CIFS network shares.',
        cta: {
          title: 'View recipe',
          url: 'https://github.com/spiceai/cookbook/blob/trunk/smb/README.md',
          target: '_blank',
        },
      },
      {
        title: 'Snowflake Connector',
        description: 'Connect to and query Snowflake databases.',
        cta: {
          title: 'View recipe',
          url: 'https://github.com/spiceai/cookbook/blob/trunk/snowflake/README.md',
          target: '_blank',
        },
      },
      {
        title: 'Spice.ai Cloud Connector',
        description: 'Connect to the Spice.ai Cloud Platform.',
        cta: {
          title: 'View recipe',
          url: 'https://github.com/spiceai/cookbook/blob/trunk/spiceai/README.md',
          target: '_blank',
        },
      },
      {
        title: 'Apache Spark Connector',
        description: 'Connect to and query Apache Spark.',
        cta: {
          title: 'View recipe',
          url: 'https://github.com/spiceai/cookbook/blob/trunk/spark/README.md',
          target: '_blank',
        },
      },
      {
        title: 'IMAP Emails',
        description: 'Federated SQL query of mail across IMAP email servers.',
        cta: {
          title: 'View recipe',
          url: 'https://github.com/spiceai/cookbook/blob/trunk/imap/README.md',
          target: '_blank',
        },
      },
      {
        title: 'IMAP Outlook Mailbox',
        description: 'Connect Spice to an Outlook mailbox via IMAP.',
        cta: {
          title: 'View recipe',
          url: 'https://github.com/spiceai/cookbook/blob/trunk/imap/outlook.md',
          target: '_blank',
        },
      },
      {
        title: 'MongoDB Connector',
        description: 'Connect to and query MongoDB databases.',
        cta: {
          title: 'View recipe',
          url: 'https://github.com/spiceai/cookbook/blob/trunk/mongodb/connector/README.md',
          target: '_blank',
        },
      },
      {
        title: 'Live Orders Analytics with Apache Kafka Data Connector',
        description:
          'Combine real-time data streaming from Kafka with other datasets using Spice.',
        cta: {
          title: 'View recipe',
          url: 'https://github.com/spiceai/cookbook/blob/trunk/kafka/README.md',
          target: '_blank',
        },
      },
    ],
    padding_top: 'st-lg',
    padding_bottom: 'sb-lg',
  }}
/>

<TabsCardsGrid
  fields={{
    heading: 'Catalog Connectors',
    heading_tag: 'h2',
    paragraph:
      'Connect to data catalogs to discover, manage, and utilize your data assets effectively.',
    enable_filters: false,
    source: 'recipe',
    posts: [
      {
        title: 'Spice.ai Cloud Platform Catalog',
        description: 'Connect to the Spice.ai Cloud Platform catalog.',
        cta: {
          title: 'View recipe',
          url: 'https://github.com/spiceai/cookbook/blob/trunk/catalogs/spiceai/README.md',
          target: '_blank',
        },
      },
      {
        title: 'Databricks Unity Catalog',
        description: 'Connect to Databricks Unity catalog.',
        cta: {
          title: 'View recipe',
          url: 'https://github.com/spiceai/cookbook/blob/trunk/catalogs/databricks/README.md',
          target: '_blank',
        },
      },
      {
        title: 'Unity Catalog',
        description: 'Connect to Unity catalog.',
        cta: {
          title: 'View recipe',
          url: 'https://github.com/spiceai/cookbook/blob/trunk/catalogs/unity_catalog/README.md',
          target: '_blank',
        },
      },
      {
        title: 'Iceberg Catalog Connector',
        description:
          'Connect to Iceberg catalog with support for reading and writing Iceberg tables.',
        cta: {
          title: 'View recipe',
          url: 'https://github.com/spiceai/cookbook/blob/trunk/catalogs/iceberg/README.md',
          target: '_blank',
        },
      },
      {
        title: 'Glue Catalog Connector',
        description: 'Connect to AWS Glue Catalog.',
        cta: {
          title: 'View recipe',
          url: 'https://github.com/spiceai/cookbook/blob/trunk/catalogs/glue/README.md',
          target: '_blank',
        },
      },
    ],
    padding_top: 'st-lg',
    padding_bottom: 'sb-lg',
  }}
/>

<TabsCardsGrid
  fields={{
    heading: 'Visualization',
    heading_tag: 'h2',
    paragraph: 'Visualize data with BI and analytics tools.',
    enable_filters: false,
    source: 'recipe',
    posts: [
      {
        title: 'Sales BI with Apache Superset',
        description: 'Visualize data in Spice with Apache Superset.',
        cta: {
          title: 'View recipe',
          url: 'https://github.com/spiceai/cookbook/blob/trunk/sales-bi/README.md',
          target: '_blank',
        },
      },
      {
        title: 'Grafana Datasource',
        description: 'Add Spice as a Grafana datasource.',
        cta: {
          title: 'View recipe',
          url: 'https://github.com/spiceai/cookbook/blob/trunk/grafana-datasource/README.md',
          target: '_blank',
        },
      },
    ],
    padding_top: 'st-lg',
    padding_bottom: 'sb-lg',
  }}
/>

<TabsCardsGrid
  fields={{
    heading: 'API Clients',
    heading_tag: 'h2',
    paragraph: 'Use API clients for data access and integration.',
    enable_filters: false,
    source: 'recipe',
    posts: [
      {
        title: 'Python ADBC Client',
        description:
          'Query Spice using ADBC and Parameterized Queries with Python.',
        cta: {
          title: 'View recipe',
          url: 'https://github.com/spiceai/cookbook/blob/trunk/clients/adbc/README.md',
          target: '_blank',
        },
      },
      {
        title: 'Java JDBC Client',
        description: 'Query Spice.ai using the Java JDBC client.',
        cta: {
          title: 'View recipe',
          url: 'https://github.com/spiceai/cookbook/blob/trunk/clients/java/README.md',
          target: '_blank',
        },
      },
      {
        title: 'Scala JDBC Client',
        description: 'Query Spice.ai using the Scala JDBC client.',
        cta: {
          title: 'View recipe',
          url: 'https://github.com/spiceai/cookbook/blob/trunk/clients/scala/README.md',
          target: '_blank',
        },
      },
    ],
    padding_top: 'st-lg',
    padding_bottom: 'sb-lg',
  }}
/>

<TabsCardsGrid
  fields={{
    heading: 'Deployment',
    heading_tag: 'h2',
    paragraph: 'Deploy Spice.ai in different environments.',
    enable_filters: false,
    source: 'recipe',
    posts: [
      {
        title: 'Deploying to Kubernetes',
        description: 'Deploy Spice.ai on Kubernetes.',
        cta: {
          title: 'View recipe',
          url: 'https://github.com/spiceai/cookbook/blob/trunk/kubernetes/README.md',
          target: '_blank',
        },
      },
      {
        title: 'Running in Docker',
        description: 'Run Spice.ai in Docker containers.',
        cta: {
          title: 'View recipe',
          url: 'https://github.com/spiceai/cookbook/blob/trunk/docker/README.md',
          target: '_blank',
        },
      },
      {
        title: 'Sidecar Deployment Architecture',
        description: 'Deploy Spice as a sidecar alongside your application.',
        cta: {
          title: 'View recipe',
          url: 'https://github.com/spiceai/cookbook/blob/trunk/architectures/sidecar/README.md',
          target: '_blank',
        },
      },
      {
        title: 'Microservice Deployment Architecture',
        description: 'Deploy Spice as a standalone microservice architecture.',
        cta: {
          title: 'View recipe',
          url: 'https://github.com/spiceai/cookbook/blob/trunk/architectures/microservice/README.md',
          target: '_blank',
        },
      },
    ],
    padding_top: 'st-lg',
    padding_bottom: 'sb-lg',
  }}
/>

<TabsCardsGrid
  fields={{
    heading: 'Advanced Topics',
    heading_tag: 'h2',
    paragraph:
      'Explore advanced deployment and data architecture patterns for production workloads.',
    enable_filters: false,
    source: 'recipe',
    posts: [
      {
        title: 'Local Dataset Replication',
        description:
          'Link datasets in a parent/child relationship within the current Spicepod.',
        cta: {
          title: 'View recipe',
          url: 'https://github.com/spiceai/cookbook/blob/trunk/localpod/README.md',
          target: '_blank',
        },
      },
      {
        title: 'Distributed Query',
        description:
          'Run queries distributed across multiple nodes for large datasets.',
        cta: {
          title: 'View recipe',
          url: 'https://github.com/spiceai/cookbook/blob/trunk/distributed/README.md',
          target: '_blank',
        },
      },
    ],
    padding_top: 'st-lg',
    padding_bottom: 'sb-lg',
  }}
/>

<TabsCardsGrid
  fields={{
    heading: 'Performance and Benchmarking',
    heading_tag: 'h2',
    paragraph:
      'Measure and optimize performance with benchmarks and best practices for your Spice.ai deployment.',
    enable_filters: false,
    source: 'recipe',
    posts: [
      {
        title: 'TPC-H Benchmarking',
        description: 'Benchmark performance using TPC-H.',
        cta: {
          title: 'View recipe',
          url: 'https://github.com/spiceai/cookbook/blob/trunk/tpc-h/README.md',
          target: '_blank',
        },
      },
      {
        title: 'Results Caching',
        description: 'Cache query results for improved performance.',
        cta: {
          title: 'View recipe',
          url: 'https://github.com/spiceai/cookbook/blob/trunk/caching/sql_results/README.md',
          target: '_blank',
        },
      },
      {
        title: 'Caching Accelerator',
        description:
          'Use intelligent HTTP response caching with stale-while-revalidate (SWR).',
        cta: {
          title: 'View recipe',
          url: 'https://github.com/spiceai/cookbook/blob/trunk/caching/accelerator/README.md',
          target: '_blank',
        },
      },
      {
        title: 'Indexes on Accelerated Data',
        description: 'Create and manage indexes on accelerated data.',
        cta: {
          title: 'View recipe',
          url: 'https://github.com/spiceai/cookbook/blob/trunk/acceleration/indexes/README.md',
          target: '_blank',
        },
      },
    ],
    padding_top: 'st-lg',
    padding_bottom: 'sb-lg',
  }}
/>

<TabsCardsGrid
  fields={{
    heading: 'Configuration',
    heading_tag: 'h2',
    paragraph:
      'Fine-tune your Spice.ai deployment with advanced configuration options for optimal performance.',
    enable_filters: false,
    source: 'recipe',
    posts: [
      {
        title: 'Data Retention Policy',
        description: 'Configure data retention policies.',
        cta: {
          title: 'View recipe',
          url: 'https://github.com/spiceai/cookbook/blob/trunk/retention/README.md',
          target: '_blank',
        },
      },
      {
        title: 'Refresh Data Window',
        description: 'Configure data refresh windows.',
        cta: {
          title: 'View recipe',
          url: 'https://github.com/spiceai/cookbook/blob/trunk/refresh-data-window/README.md',
          target: '_blank',
        },
      },
      {
        title: 'Advanced Data Refresh',
        description: 'Advanced configuration for data refresh.',
        cta: {
          title: 'View recipe',
          url: 'https://github.com/spiceai/cookbook/blob/trunk/acceleration/data-refresh/README.md',
          target: '_blank',
        },
      },
      {
        title: 'Data Quality with Constraints',
        description: 'Add data quality constraints.',
        cta: {
          title: 'View recipe',
          url: 'https://github.com/spiceai/cookbook/blob/trunk/acceleration/constraints/README.md',
          target: '_blank',
        },
      },
      {
        title: 'Cron Dataset Schedules',
        description: 'Schedule dataset refreshes using cron syntax.',
        cta: {
          title: 'View recipe',
          url: 'https://github.com/spiceai/cookbook/blob/trunk/cron-schedules/README.md',
          target: '_blank',
        },
      },
    ],
    padding_top: 'st-lg',
    padding_bottom: 'sb-lg',
  }}
/>

<TabsCardsGrid
  fields={{
    heading: 'SDKs',
    heading_tag: 'h2',
    paragraph: 'Use SDKs for different programming languages.',
    enable_filters: false,
    source: 'recipe',
    posts: [
      {
        title: 'OpenAI SDK',
        description: 'Use the OpenAI SDK to connect to models hosted on Spice.',
        cta: {
          title: 'View recipe',
          url: 'https://github.com/spiceai/cookbook/blob/trunk/openai_sdk/README.md',
          target: '_blank',
        },
      },
      {
        title: 'Rust SDK',
        description: 'Query Spice.ai using the Rust SDK.',
        cta: {
          title: 'View recipe',
          url: 'https://github.com/spiceai/cookbook/blob/trunk/client-sdk/spice-rs-sdk-sample/README.md',
          target: '_blank',
        },
      },
      {
        title: 'Python SDK',
        description: 'Query Spice.ai using the Python SDK.',
        cta: {
          title: 'View recipe',
          url: 'https://github.com/spiceai/cookbook/blob/trunk/client-sdk/spicepy-sdk-sample/README.md',
          target: '_blank',
        },
      },
      {
        title: 'Go SDK',
        description: 'Query Spice.ai using the Go SDK.',
        cta: {
          title: 'View recipe',
          url: 'https://github.com/spiceai/cookbook/blob/trunk/client-sdk/gospice-sdk-sample/README.md',
          target: '_blank',
        },
      },
      {
        title: 'Spice.js JavaScript (Node.js) SDK',
        description:
          'Query Spice.ai using the JavaScript (Node.js) SDK with examples.',
        cta: {
          title: 'View recipe',
          url: 'https://github.com/spiceai/cookbook/blob/trunk/client-sdk/spice.js-sdk-sample/README.md',
          target: '_blank',
        },
      },
      {
        title: 'Java SDK',
        description: 'Query Spice.ai using the Java SDK.',
        cta: {
          title: 'View recipe',
          url: 'https://github.com/spiceai/cookbook/blob/trunk/client-sdk/spice-java-sdk-sample/README.md',
          target: '_blank',
        },
      },
    ],
    padding_top: 'st-lg',
    padding_bottom: 'sb-lg',
  }}
/>

<TabsCardsGrid
  fields={{
    heading: 'Security',
    heading_tag: 'h2',
    paragraph:
      'Secure your Spice.ai deployment and data access with robust security practices and configurations.',
    enable_filters: false,
    source: 'recipe',
    posts: [
      {
        title: 'Intelligent Security Copilot',
        description: 'Analyze real-time data access patterns with Spice.ai.',
        cta: {
          title: 'View recipe',
          url: 'https://github.com/spiceai/cookbook/blob/trunk/guides/security-analyzer/README.md',
          target: '_blank',
        },
      },
      {
        title: 'TLS Encryption',
        description: 'Enable encryption in transit using TLS.',
        cta: {
          title: 'View recipe',
          url: 'https://github.com/spiceai/cookbook/blob/trunk/tls/README.md',
          target: '_blank',
        },
      },
      {
        title: 'API Key Authentication',
        description: 'Secure access with API key authentication.',
        cta: {
          title: 'View recipe',
          url: 'https://github.com/spiceai/cookbook/blob/trunk/api_key/README.md',
          target: '_blank',
        },
      },
    ],
    padding_top: 'st-lg',
    padding_bottom: 'sb-lg',
  }}
/>

<AccordionFaq
  fields={{
    heading: 'FAQs',
    heading_tag: 'h2',
    paragraph:
      'Common questions about using the Spice.ai OSS Cookbook and choosing the right recipe to start with.',
    items: [
      {
        title: 'What is the Spice.ai OSS Cookbook?',
        paragraph:
          '<p>The cookbook is a curated set of practical, ready-to-run recipes for Spice.ai Open Source. Recipes cover connectors, federation, acceleration, hybrid search, model integration, and deployment patterns.</p>\n',
      },
      {
        title: 'Which recipe should I start with?',
        paragraph:
          '<p>If you are new to Spice, start with a recipe that matches your immediate goal: federated SQL for multi-source queries, DuckDB acceleration for faster performance, or OpenAI SDK and MCP recipes for AI agent use cases.</p>\n',
      },
      {
        title: 'Do cookbook recipes work with Spice Cloud?',
        paragraph:
          '<p>Yes. Cookbook patterns are based on Spice OSS capabilities and can be adapted to Spice Cloud workflows. You can start locally with OSS and move to managed deployments as workloads grow. See <a href="/pricing">Spice Cloud pricing</a>.</p>\n',
      },
    ],
    padding_top: 'st-lg',
    padding_bottom: 'sb-lg',
  }}
/>

<ContentCta
  fields={{
    override_global_setting: false,
    custom_content: {
      heading: '',
      paragraph: '',
      cta: null,
    },
    padding_top: 'unset',
    padding_bottom: 'unset',
    gcta_heading: 'Build faster with Spice',
    gcta_paragraph:
      'See how teams use Spice to turn cookbook patterns into production data and AI applications.',
    gcta_cta: {
      title: 'Get a demo',
      url: 'https://meetings.hubspot.com/vladi-semenov',
      target: '_blank',
    },
  }}
/>

---

## AI Model Serving
URL: https://spice.ai/feature/ai-model-serving
Date: 2025-11-14T14:45:31
Description: Serve, evaluate, and ground AI models directly inside Spice. Call LLMs locally or connect to hosted providers from one secure, high-performance runtime.

<HeroTextImageFiftyFifty
  fields={{
    variant: 'variant-1',
    eyebrow: 'AI Model Serving',
    heading_tag: 'h1',
    heading: 'Invoke and run AI models anywhere',
    paragraph:
      'Build faster, data-grounded AI without complex orchestration. Call, serve, and evaluate AI models locally or from hosted providers-directly in Spice. ',
    cta: [
      {
        type: 'filled',
        cta: {
          title: 'Get a demo',
          url: 'https://meetings.hubspot.com/vladi-semenov',
          target: '',
        },
      },
      {
        type: 'bordered',
        cta: {
          title: 'View the docs ',
          url: 'https://spiceai.org/docs/components/tools',
          target: '',
        },
      },
    ],
    media_type: 'image',
    media_image: {
      ID: 1588,
      id: 1588,
      title: 'feature_ai_model_serving_header',
      filename: 'feature_ai_model_serving_header.png',
      filesize: 134088,
      url: '/website-assets/media/2025/12/feature_ai_model_serving_header.png',
      link: '/feature/ai-model-serving/attachment/feature_ai_model_serving_header/',
      alt: 'Diagram of Spice.ai connecting apps to S3, Databricks, and MySQL data stores, AI model providers, and data catalogs',
      author: '6',
      description: '',
      caption: '',
      name: 'feature_ai_model_serving_header',
      status: 'inherit',
      uploaded_to: 547,
      date: '2025-12-02 01:33:42',
      modified: '2025-12-02 01:33:42',
      menu_order: 0,
      mime_type: 'image/png',
      type: 'image',
      subtype: 'png',
      icon: '/website-assets/media/default.png',
      width: 1360,
      height: 740,
      sizes: {
        thumbnail:
          '/website-assets/media/2025/12/feature_ai_model_serving_header.png',
        'thumbnail-width': 150,
        'thumbnail-height': 150,
        medium:
          '/website-assets/media/2025/12/feature_ai_model_serving_header.png',
        'medium-width': 300,
        'medium-height': 163,
        medium_large:
          '/website-assets/media/2025/12/feature_ai_model_serving_header.png',
        'medium_large-width': 768,
        'medium_large-height': 418,
        large:
          '/website-assets/media/2025/12/feature_ai_model_serving_header.png',
        'large-width': 1024,
        'large-height': 557,
        '1536x1536':
          '/website-assets/media/2025/12/feature_ai_model_serving_header.png',
        '1536x1536-width': 1360,
        '1536x1536-height': 740,
        '2048x2048':
          '/website-assets/media/2025/12/feature_ai_model_serving_header.png',
        '2048x2048-width': 1360,
        '2048x2048-height': 740,
      },
    },
    media_video: '',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<ContentTwoUpGridStats
  fields={{
    layout: 'tabs-carousel',
    heading: 'Do more with your data',
    heading_tag: 'h2',
    paragraph:
      'Increase the reliability, performance, and security of data-driven AI workflows.',
    stats: [
      {
        amount: '100',
        suffix: 'x',
        after_text: 'up to 100x faster queries',
      },
      {
        amount: '80',
        suffix: '%',
        after_text: 'up to 80% cost savings on data lakehouse spend',
      },
      {
        amount: '2',
        suffix: 'x',
        after_text: 'increase in data reliability for critical workloads',
      },
    ],
    items: [
      {
        title: 'AI grounded in your data',
        description:
          'Run inference where your data lives. Spice removes external dependencies by colocating data, models, and compute in a single engine. Reduce latency and hallucinations by grounding models in federated and accelerated datasets.',
        image: {
          ID: 1516,
          id: 1516,
          title: 'feature_ai_model_serving_data_grounding',
          filename: 'feature_ai_model_serving_data_grounding.png',
          filesize: 144792,
          url: '/website-assets/media/2025/12/feature_ai_model_serving_data_grounding.png',
          link: '/feature/ai-model-serving/attachment/feature_ai_model_serving_data_grounding/',
          alt: 'Diagram of Spice.ai serving agents, models, tools, evals, and embeddings between apps and OpenAI, Anthropic, xAI, and NVIDIA NIM',
          author: '6',
          description: '',
          caption: '',
          name: 'feature_ai_model_serving_data_grounding',
          status: 'inherit',
          uploaded_to: 547,
          date: '2025-12-01 18:11:40',
          modified: '2025-12-01 18:11:40',
          menu_order: 0,
          mime_type: 'image/png',
          type: 'image',
          subtype: 'png',
          icon: '/website-assets/media/default.png',
          width: 1388,
          height: 772,
          sizes: {
            thumbnail:
              '/website-assets/media/2025/12/feature_ai_model_serving_data_grounding.png',
            'thumbnail-width': 150,
            'thumbnail-height': 150,
            medium:
              '/website-assets/media/2025/12/feature_ai_model_serving_data_grounding.png',
            'medium-width': 300,
            'medium-height': 167,
            medium_large:
              '/website-assets/media/2025/12/feature_ai_model_serving_data_grounding.png',
            'medium_large-width': 768,
            'medium_large-height': 427,
            large:
              '/website-assets/media/2025/12/feature_ai_model_serving_data_grounding.png',
            'large-width': 1024,
            'large-height': 570,
            '1536x1536':
              '/website-assets/media/2025/12/feature_ai_model_serving_data_grounding.png',
            '1536x1536-width': 1388,
            '1536x1536-height': 772,
            '2048x2048':
              '/website-assets/media/2025/12/feature_ai_model_serving_data_grounding.png',
            '2048x2048-width': 1388,
            '2048x2048-height': 772,
          },
        },
      },
      {
        title: 'Flexible models and deployments',
        description:
          'Spice supports custom, open-source, and commercial models, adapting to your workload and regulatory requirements. Deploy and scale models anywhere-locally, in the cloud, or at the edge. ',
        image: {
          ID: 1518,
          id: 1518,
          title: 'feature_ai_model_serving_optionality',
          filename: 'feature_ai_model_serving_optionality.png',
          filesize: 309328,
          url: '/website-assets/media/2025/12/feature_ai_model_serving_optionality.png',
          link: '/feature/ai-model-serving/attachment/feature_ai_model_serving_optionality/',
          alt: 'Grid of supported AI model providers including OpenAI, xAI, Anthropic, and NVIDIA NIM',
          author: '6',
          description: '',
          caption: '',
          name: 'feature_ai_model_serving_optionality',
          status: 'inherit',
          uploaded_to: 547,
          date: '2025-12-01 18:11:45',
          modified: '2025-12-01 18:11:45',
          menu_order: 0,
          mime_type: 'image/png',
          type: 'image',
          subtype: 'png',
          icon: '/website-assets/media/default.png',
          width: 1360,
          height: 744,
          sizes: {
            thumbnail:
              '/website-assets/media/2025/12/feature_ai_model_serving_optionality.png',
            'thumbnail-width': 150,
            'thumbnail-height': 150,
            medium:
              '/website-assets/media/2025/12/feature_ai_model_serving_optionality.png',
            'medium-width': 300,
            'medium-height': 164,
            medium_large:
              '/website-assets/media/2025/12/feature_ai_model_serving_optionality.png',
            'medium_large-width': 768,
            'medium_large-height': 420,
            large:
              '/website-assets/media/2025/12/feature_ai_model_serving_optionality.png',
            'large-width': 1024,
            'large-height': 560,
            '1536x1536':
              '/website-assets/media/2025/12/feature_ai_model_serving_optionality.png',
            '1536x1536-width': 1360,
            '1536x1536-height': 744,
            '2048x2048':
              '/website-assets/media/2025/12/feature_ai_model_serving_optionality.png',
            '2048x2048-width': 1360,
            '2048x2048-height': 744,
          },
        },
      },
      {
        title: 'Built-in tooling and memory',
        description:
          'Augment models with native federation, search, and retrieval for more robust AI workflows. Enable long-term memory through persistent datasets so models can recall and learn across interactions.',
        image: {
          ID: 1519,
          id: 1519,
          title: 'feature_ai_model_serving_built_in_tooling',
          filename: 'feature_ai_model_serving_built_in_tooling.png',
          filesize: 156751,
          url: '/website-assets/media/2025/12/feature_ai_model_serving_built_in_tooling.png',
          link: '/feature/ai-model-serving/attachment/feature_ai_model_serving_built_in_tooling/',
          alt: 'Diagram of Spice.ai OSS serving search and SQL over accelerated data and local embeddings backed by Amazon S3 buckets',
          author: '6',
          description: '',
          caption: '',
          name: 'feature_ai_model_serving_built_in_tooling',
          status: 'inherit',
          uploaded_to: 547,
          date: '2025-12-01 18:11:51',
          modified: '2025-12-01 18:11:51',
          menu_order: 0,
          mime_type: 'image/png',
          type: 'image',
          subtype: 'png',
          icon: '/website-assets/media/default.png',
          width: 1388,
          height: 736,
          sizes: {
            thumbnail:
              '/website-assets/media/2025/12/feature_ai_model_serving_built_in_tooling.png',
            'thumbnail-width': 150,
            'thumbnail-height': 150,
            medium:
              '/website-assets/media/2025/12/feature_ai_model_serving_built_in_tooling.png',
            'medium-width': 300,
            'medium-height': 159,
            medium_large:
              '/website-assets/media/2025/12/feature_ai_model_serving_built_in_tooling.png',
            'medium_large-width': 768,
            'medium_large-height': 407,
            large:
              '/website-assets/media/2025/12/feature_ai_model_serving_built_in_tooling.png',
            'large-width': 1024,
            'large-height': 543,
            '1536x1536':
              '/website-assets/media/2025/12/feature_ai_model_serving_built_in_tooling.png',
            '1536x1536-width': 1388,
            '1536x1536-height': 736,
            '2048x2048':
              '/website-assets/media/2025/12/feature_ai_model_serving_built_in_tooling.png',
            '2048x2048-width': 1388,
            '2048x2048-height': 736,
          },
        },
      },
      {
        title: 'AI sandboxing',
        description:
          'Isolate, monitor, and control AI execution. Prevent unwanted model outputs and data leakage with sandbox environments for model inference and tool usage.',
        image: {
          ID: 1517,
          id: 1517,
          title: 'feature_ai_model_serving_sandboxing',
          filename: 'feature_ai_model_serving_sandboxing.png',
          filesize: 181675,
          url: '/website-assets/media/2025/12/feature_ai_model_serving_sandboxing.png',
          link: '/feature/ai-model-serving/attachment/feature_ai_model_serving_sandboxing/',
          alt: 'Diagram of Spice.ai sandboxing AI execution with monitoring, policy, and a firewall between models and Amazon S3, Snowflake, and PostgreSQL',
          author: '6',
          description: '',
          caption: '',
          name: 'feature_ai_model_serving_sandboxing',
          status: 'inherit',
          uploaded_to: 547,
          date: '2025-12-01 18:11:42',
          modified: '2025-12-01 18:11:42',
          menu_order: 0,
          mime_type: 'image/png',
          type: 'image',
          subtype: 'png',
          icon: '/website-assets/media/default.png',
          width: 1388,
          height: 772,
          sizes: {
            thumbnail:
              '/website-assets/media/2025/12/feature_ai_model_serving_sandboxing.png',
            'thumbnail-width': 150,
            'thumbnail-height': 150,
            medium:
              '/website-assets/media/2025/12/feature_ai_model_serving_sandboxing.png',
            'medium-width': 300,
            'medium-height': 167,
            medium_large:
              '/website-assets/media/2025/12/feature_ai_model_serving_sandboxing.png',
            'medium_large-width': 768,
            'medium_large-height': 427,
            large:
              '/website-assets/media/2025/12/feature_ai_model_serving_sandboxing.png',
            'large-width': 1024,
            'large-height': 570,
            '1536x1536':
              '/website-assets/media/2025/12/feature_ai_model_serving_sandboxing.png',
            '1536x1536-width': 1388,
            '1536x1536-height': 772,
            '2048x2048':
              '/website-assets/media/2025/12/feature_ai_model_serving_sandboxing.png',
            '2048x2048-width': 1388,
            '2048x2048-height': 772,
          },
        },
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<ContentImageVideo
  fields={{
    variant: 'variant-1',
    heading: 'Integrations across all your data sources',
    heading_tag: 'h2',
    paragraph:
      'Spice supports Hugging Face, OpenAI, Anthropic, xAI, NVIDIA NIM, and more out of the box. Serve and evaluate models across providers while keeping one consistent runtime for inference, evaluation, and observability.',
    cta: [
      {
        type: 'filled',
        cta: {
          title: 'See connectors',
          url: '/integrations',
          target: '',
        },
      },
    ],
    media_type: 'image',
    media_image: {
      ID: 412,
      id: 412,
      title: 'platform_integrations',
      filename: 'platform_integrations.png',
      filesize: 1330111,
      url: '/website-assets/media/2025/11/platform_integrations.png',
      link: '/feature/ai-model-serving/attachment/platform_integrations/',
      alt: '',
      author: '5',
      description: '',
      caption: '',
      name: 'platform_integrations',
      status: 'inherit',
      uploaded_to: 406,
      date: '2025-11-03 00:43:41',
      modified: '2025-11-03 00:43:41',
      menu_order: 0,
      mime_type: 'image/png',
      type: 'image',
      subtype: 'png',
      icon: '/website-assets/media/default.png',
      width: 1360,
      height: 1034,
      sizes: {
        thumbnail: '/website-assets/media/2025/11/platform_integrations.png',
        'thumbnail-width': 150,
        'thumbnail-height': 150,
        medium: '/website-assets/media/2025/11/platform_integrations.png',
        'medium-width': 300,
        'medium-height': 228,
        medium_large: '/website-assets/media/2025/11/platform_integrations.png',
        'medium_large-width': 768,
        'medium_large-height': 584,
        large: '/website-assets/media/2025/11/platform_integrations.png',
        'large-width': 1024,
        'large-height': 779,
        '1536x1536': '/website-assets/media/2025/11/platform_integrations.png',
        '1536x1536-width': 1360,
        '1536x1536-height': 1034,
        '2048x2048': '/website-assets/media/2025/11/platform_integrations.png',
        '2048x2048-width': 1360,
        '2048x2048-height': 1034,
      },
    },
    graphic_overlay: false,
    media_video: '',
    padding_top: 'st-lg',
    padding_bottom: 'sb-lg',
  }}
/>

<Testimonials
  heading="Deployed in production"
  headingTag="h2"
  paragraph="Teams trust Spice to bring inference closer to their data, enabling low-latency, enterprise-grade AI across industries."
  items={['nrc-tim', 'basisset']}
/>

<AccordionFaq
  fields={{
    heading: 'FAQs',
    heading_tag: 'h2',
    paragraph: 'Answers to common questions about serving AI models in Spice',
    items: [
      {
        title: 'Which AI model providers does Spice support?',
        paragraph:
          '<p>Spice supports Hugging Face, OpenAI, Anthropic, xAI, and NVIDIA NIM out of the box, along with custom, open-source, and commercial models. Every provider runs behind one consistent runtime for inference, evaluation, and observability, so applications keep the same interface across providers.</p>\n',
      },
      {
        title: 'Can I call AI models directly from SQL?',
        paragraph:
          '<p>Yes. Spice supports <a href="/platform/llm-inference">LLM inference from SQL</a>, so you can invoke large language models inside queries to summarize, translate, generate, or classify text alongside your data. Results return as query output, without additional orchestration code.</p>\n',
      },
      {
        title: 'How does Spice reduce hallucinations in AI applications?',
        paragraph:
          '<p>Spice grounds models in federated and accelerated datasets by colocating data, models, and compute in a single engine. Running inference where the data lives removes external dependencies and reduces both latency and hallucinations. The same foundation supports <a href="/use-case/retrieval-augmented-generation">retrieval-augmented generation</a> workloads.</p>\n',
      },
      {
        title: 'Where can I deploy models served by Spice?',
        paragraph:
          '<p>Models can be deployed and scaled locally, in the cloud, or at the edge. Spice adapts to your workload and regulatory requirements while keeping one runtime across each environment.</p>\n',
      },
      {
        title: 'How does Spice secure model inference and tool usage?',
        paragraph:
          '<p>Spice isolates, monitors, and controls AI execution with sandbox environments for model inference and tool usage. Sandboxing helps prevent unwanted model outputs and data leakage while keeping every interaction observable.</p>\n',
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<TalkToAnEngineerCta />

---

## Distributed Query
URL: https://spice.ai/feature/distributed-query
Date: 2025-11-04T19:51:09
Description: Scale beyond single-node limits with petabyte-scale, multi-node, distributed queries.

<HeroTextImageFiftyFifty
  fields={{
    variant: 'variant-1',
    eyebrow: 'Distributed Query',
    heading_tag: 'h1',
    heading: 'Scale SQL queries across distributed nodes',
    paragraph:
      'Extend from a single-node engine to a distributed cluster. Parallelize scans, joins, and inference across executors for high-performance, fault-tolerant processing.',
    cta: [
      {
        type: 'filled',
        cta: {
          title: 'Get a demo',
          url: 'https://meetings.hubspot.com/vladi-semenov',
          target: '',
        },
      },
      {
        type: 'bordered',
        cta: {
          title: 'View the docs ',
          url: 'https://spiceai.org/docs/features/distributed-query',
          target: '_blank',
        },
      },
    ],
    media_type: 'image',
    media_image: {
      ID: 1577,
      id: 1577,
      title: 'feature_distributed_query_header',
      filename: 'feature_distributed_query_header.png',
      filesize: 306514,
      url: '/website-assets/media/2025/12/feature_distributed_query_header.png',
      link: '/feature/distributed-query/attachment/feature_distributed_query_header/',
      alt: 'Diagram of a Spice.ai clustered deployment with runtime, scheduler, distributed optimizer, and executor nodes',
      author: '6',
      description: '',
      caption: '',
      name: 'feature_distributed_query_header',
      status: 'inherit',
      uploaded_to: 423,
      date: '2025-12-02 00:53:10',
      modified: '2025-12-02 00:53:10',
      menu_order: 0,
      mime_type: 'image/png',
      type: 'image',
      subtype: 'png',
      icon: '/website-assets/media/default.png',
      width: 1360,
      height: 752,
      sizes: {
        thumbnail:
          '/website-assets/media/2025/12/feature_distributed_query_header.png',
        'thumbnail-width': 150,
        'thumbnail-height': 150,
        medium:
          '/website-assets/media/2025/12/feature_distributed_query_header.png',
        'medium-width': 300,
        'medium-height': 166,
        medium_large:
          '/website-assets/media/2025/12/feature_distributed_query_header.png',
        'medium_large-width': 768,
        'medium_large-height': 425,
        large:
          '/website-assets/media/2025/12/feature_distributed_query_header.png',
        'large-width': 1024,
        'large-height': 566,
        '1536x1536':
          '/website-assets/media/2025/12/feature_distributed_query_header.png',
        '1536x1536-width': 1360,
        '1536x1536-height': 752,
        '2048x2048':
          '/website-assets/media/2025/12/feature_distributed_query_header.png',
        '2048x2048-width': 1360,
        '2048x2048-height': 752,
      },
    },
    media_video: '',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<ContentTwoUpGridStats
  fields={{
    layout: 'tabs-carousel',
    heading: 'Do more with your data',
    heading_tag: 'h2',
    paragraph:
      'Consolidate operational, analytical, and object store data into a governed and accelerated SQL query engine.',
    stats: [
      {
        amount: 'Up to 100',
        suffix: 'x',
        after_text: 'up to 100x faster queries',
      },
      {
        amount: 'Up to 80',
        suffix: '%',
        after_text: 'up to 80% cost savings on data lakehouse spend',
      },
      {
        amount: '2',
        suffix: 'x',
        after_text: 'increase in data reliability for critical workloads',
      },
    ],
    items: [
      {
        title: 'Declarative cluster configuration',
        description:
          'Define distributed clusters directly in your Spice environment. Designate a master node and executor pool that register automatically with the scheduler-no external orchestration or complex setup required.',
        image: {
          ID: 1539,
          id: 1539,
          title: 'feature_distributed_query_configuration',
          filename: 'feature_distributed_query_configuration.png',
          filesize: 431326,
          url: '/website-assets/media/2025/12/feature_distributed_query_configuration.png',
          link: '/feature/distributed-query/attachment/feature_distributed_query_configuration/',
          alt: 'Terminal running the spiced cluster-mode scheduler command to start a Spice cluster scheduler',
          author: '6',
          description: '',
          caption: '',
          name: 'feature_distributed_query_configuration',
          status: 'inherit',
          uploaded_to: 423,
          date: '2025-12-01 18:32:03',
          modified: '2025-12-01 18:32:03',
          menu_order: 0,
          mime_type: 'image/png',
          type: 'image',
          subtype: 'png',
          icon: '/website-assets/media/default.png',
          width: 1360,
          height: 868,
          sizes: {
            thumbnail:
              '/website-assets/media/2025/12/feature_distributed_query_configuration.png',
            'thumbnail-width': 150,
            'thumbnail-height': 150,
            medium:
              '/website-assets/media/2025/12/feature_distributed_query_configuration.png',
            'medium-width': 300,
            'medium-height': 191,
            medium_large:
              '/website-assets/media/2025/12/feature_distributed_query_configuration.png',
            'medium_large-width': 768,
            'medium_large-height': 490,
            large:
              '/website-assets/media/2025/12/feature_distributed_query_configuration.png',
            'large-width': 1024,
            'large-height': 653,
            '1536x1536':
              '/website-assets/media/2025/12/feature_distributed_query_configuration.png',
            '1536x1536-width': 1360,
            '1536x1536-height': 868,
            '2048x2048':
              '/website-assets/media/2025/12/feature_distributed_query_configuration.png',
            '2048x2048-width': 1360,
            '2048x2048-height': 868,
          },
        },
      },
      {
        title: 'Parallel execution engine',
        description:
          'Built on Apache Ballista and DataFusion, Spice distributes query stages across nodes for concurrent reads, joins, and aggregations. Each executor processes partitions independently and merges results in real time.',
        image: {
          ID: 1536,
          id: 1536,
          title: 'feature_distributed_query_parallel_execution',
          filename: 'feature_distributed_query_parallel_execution.png',
          filesize: 265990,
          url: '/website-assets/media/2025/12/feature_distributed_query_parallel_execution.png',
          link: '/feature/distributed-query/attachment/feature_distributed_query_parallel_execution/',
          alt: 'Diagram of a Spice.ai Enterprise cluster running multi-node distributed query across four executors with Kubernetes operators',
          author: '6',
          description: '',
          caption: '',
          name: 'feature_distributed_query_parallel_execution',
          status: 'inherit',
          uploaded_to: 423,
          date: '2025-12-01 18:31:52',
          modified: '2025-12-01 18:31:52',
          menu_order: 0,
          mime_type: 'image/png',
          type: 'image',
          subtype: 'png',
          icon: '/website-assets/media/default.png',
          width: 1388,
          height: 868,
          sizes: {
            thumbnail:
              '/website-assets/media/2025/12/feature_distributed_query_parallel_execution.png',
            'thumbnail-width': 150,
            'thumbnail-height': 150,
            medium:
              '/website-assets/media/2025/12/feature_distributed_query_parallel_execution.png',
            'medium-width': 300,
            'medium-height': 188,
            medium_large:
              '/website-assets/media/2025/12/feature_distributed_query_parallel_execution.png',
            'medium_large-width': 768,
            'medium_large-height': 480,
            large:
              '/website-assets/media/2025/12/feature_distributed_query_parallel_execution.png',
            'large-width': 1024,
            'large-height': 640,
            '1536x1536':
              '/website-assets/media/2025/12/feature_distributed_query_parallel_execution.png',
            '1536x1536-width': 1388,
            '1536x1536-height': 868,
            '2048x2048':
              '/website-assets/media/2025/12/feature_distributed_query_parallel_execution.png',
            '2048x2048-width': 1388,
            '2048x2048-height': 868,
          },
        },
      },
      {
        title: 'Automatic dependency management',
        description:
          "Spice executors automatically detect and load dependencies-like embedding models or UDFs-from the master node. Runtime optimizers ensure each executor fetches only what's required, reducing overhead.",
        image: {
          ID: 1538,
          id: 1538,
          title: 'feature_distributed_query_dependency_management',
          filename: 'feature_distributed_query_dependency_management.png',
          filesize: 445764,
          url: '/website-assets/media/2025/12/feature_distributed_query_dependency_management.png',
          link: '/feature/distributed-query/attachment/feature_distributed_query_dependency_management/',
          alt: 'Terminal showing an EXPLAIN statement that returns the distributed_plan for a query across executor nodes',
          author: '6',
          description: '',
          caption: '',
          name: 'feature_distributed_query_dependency_management',
          status: 'inherit',
          uploaded_to: 423,
          date: '2025-12-01 18:32:01',
          modified: '2025-12-01 18:32:01',
          menu_order: 0,
          mime_type: 'image/png',
          type: 'image',
          subtype: 'png',
          icon: '/website-assets/media/default.png',
          width: 1386,
          height: 873,
          sizes: {
            thumbnail:
              '/website-assets/media/2025/12/feature_distributed_query_dependency_management.png',
            'thumbnail-width': 150,
            'thumbnail-height': 150,
            medium:
              '/website-assets/media/2025/12/feature_distributed_query_dependency_management.png',
            'medium-width': 300,
            'medium-height': 189,
            medium_large:
              '/website-assets/media/2025/12/feature_distributed_query_dependency_management.png',
            'medium_large-width': 768,
            'medium_large-height': 484,
            large:
              '/website-assets/media/2025/12/feature_distributed_query_dependency_management.png',
            'large-width': 1024,
            'large-height': 645,
            '1536x1536':
              '/website-assets/media/2025/12/feature_distributed_query_dependency_management.png',
            '1536x1536-width': 1386,
            '1536x1536-height': 873,
            '2048x2048':
              '/website-assets/media/2025/12/feature_distributed_query_dependency_management.png',
            '2048x2048-width': 1386,
            '2048x2048-height': 873,
          },
        },
      },
      {
        title: 'Optimized query planning',
        description:
          'A custom optimizer decomposes large scans into shuffle partitions and pushes projections closer to the data source. Less data movement, faster results, and lower network cost.',
        image: {
          ID: 1640,
          id: 1640,
          title: 'feature_distributed_query_optimized_query_planning',
          filename: 'feature_distributed_query_optimized_query_planning.png',
          filesize: 279407,
          url: '/website-assets/media/2025/12/feature_distributed_query_optimized_query_planning.png',
          link: '/feature/distributed-query/attachment/feature_distributed_query_optimized_query_planning/',
          alt: 'Diagram of the Spice.ai distributed optimizer planning shuffle stages between the scheduler, executors, and scheduler catalog',
          author: '6',
          description: '',
          caption: '',
          name: 'feature_distributed_query_optimized_query_planning',
          status: 'inherit',
          uploaded_to: 423,
          date: '2025-12-03 01:29:41',
          modified: '2025-12-03 01:29:41',
          menu_order: 0,
          mime_type: 'image/png',
          type: 'image',
          subtype: 'png',
          icon: '/website-assets/media/default.png',
          width: 1388,
          height: 780,
          sizes: {
            thumbnail:
              '/website-assets/media/2025/12/feature_distributed_query_optimized_query_planning.png',
            'thumbnail-width': 150,
            'thumbnail-height': 150,
            medium:
              '/website-assets/media/2025/12/feature_distributed_query_optimized_query_planning.png',
            'medium-width': 300,
            'medium-height': 169,
            medium_large:
              '/website-assets/media/2025/12/feature_distributed_query_optimized_query_planning.png',
            'medium_large-width': 768,
            'medium_large-height': 432,
            large:
              '/website-assets/media/2025/12/feature_distributed_query_optimized_query_planning.png',
            'large-width': 1024,
            'large-height': 575,
            '1536x1536':
              '/website-assets/media/2025/12/feature_distributed_query_optimized_query_planning.png',
            '1536x1536-width': 1388,
            '1536x1536-height': 780,
            '2048x2048':
              '/website-assets/media/2025/12/feature_distributed_query_optimized_query_planning.png',
            '2048x2048-width': 1388,
            '2048x2048-height': 780,
          },
        },
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<ContentImageVideo
  fields={{
    variant: 'variant-1',
    heading: 'Integrations across all your data sources',
    heading_tag: 'h2',
    paragraph:
      'Accelerate your data stack with a library of 40+ prebuilt connectors for the most common databases, warehouses, and file stores-from Databricks and S3 to MySQL and PostgreSQL.',
    cta: [
      {
        type: 'filled',
        cta: {
          title: 'See connectors',
          url: '/integrations',
          target: '',
        },
      },
    ],
    media_type: 'image',
    media_image: {
      ID: 612,
      id: 612,
      title: 'platform_integrations',
      filename: 'platform_integrations.png',
      filesize: 1330111,
      url: '/website-assets/media/2025/11/platform_integrations.png',
      link: '/platform/sql-federation-acceleration/attachment/platform_integrations/',
      alt: '',
      author: '6',
      description: '',
      caption: '',
      name: 'platform_integrations',
      status: 'inherit',
      uploaded_to: 543,
      date: '2025-11-18 19:42:54',
      modified: '2025-11-18 19:42:54',
      menu_order: 0,
      mime_type: 'image/png',
      type: 'image',
      subtype: 'png',
      icon: '/website-assets/media/default.png',
      width: 1360,
      height: 1034,
      sizes: {
        thumbnail: '/website-assets/media/2025/11/platform_integrations.png',
        'thumbnail-width': 150,
        'thumbnail-height': 150,
        medium: '/website-assets/media/2025/11/platform_integrations.png',
        'medium-width': 300,
        'medium-height': 228,
        medium_large: '/website-assets/media/2025/11/platform_integrations.png',
        'medium_large-width': 768,
        'medium_large-height': 584,
        large: '/website-assets/media/2025/11/platform_integrations.png',
        'large-width': 1024,
        'large-height': 779,
        '1536x1536': '/website-assets/media/2025/11/platform_integrations.png',
        '1536x1536-width': 1360,
        '1536x1536-height': 1034,
        '2048x2048': '/website-assets/media/2025/11/platform_integrations.png',
        '2048x2048-width': 1360,
        '2048x2048-height': 1034,
      },
    },
    graphic_overlay: false,
    media_video: '',
    padding_top: 'st-lg',
    padding_bottom: 'sb-lg',
  }}
/>

<Testimonials
  heading="Deployed in production"
  headingTag="h2"
  paragraph="Run data-intensive workloads on a high-performance engine trusted by teams building real-time systems at scale."
  items={['twilio', 'barracuda', 'nrc-tim']}
/>

<AccordionFaq
  fields={{
    heading: 'FAQs',
    heading_tag: 'h2',
    paragraph:
      'Answers to common questions about distributed SQL queries in Spice',
    items: [
      {
        title: 'How does Spice execute a SQL query across multiple nodes?',
        paragraph:
          '<p>Spice distributes query stages across a cluster built on Apache Ballista and DataFusion. A master node schedules work across an executor pool, and each executor processes partitions independently for concurrent reads, joins, and aggregations, merging results in real time.</p>\n',
      },
      {
        title: 'When should I use distributed query instead of a single node?',
        paragraph:
          '<p>Use distributed query when datasets or workloads exceed single-node limits, such as petabyte-scale scans, large joins, or inference over big tables. Single-node Spice with <a href="/platform/sql-federation-acceleration">SQL federation and acceleration</a> covers many workloads, and a distributed cluster extends the same engine when you need to parallelize across executors.</p>\n',
      },
      {
        title: 'Do I need an external orchestrator to run a Spice cluster?',
        paragraph:
          '<p>No. Clusters are defined declaratively in your Spice environment: you designate a master node and an executor pool, and executors register automatically with the scheduler. No external orchestration or complex setup is required.</p>\n',
      },
      {
        title:
          'How does Spice reduce data movement during distributed execution?',
        paragraph:
          '<p>A custom optimizer decomposes large scans into shuffle partitions and pushes projections closer to the data source, so executors fetch only the data a query needs. Executors also load dependencies such as embedding models or UDFs automatically from the master node, reducing overhead.</p>\n',
      },
      {
        title: 'Which data sources can a distributed query read from?',
        paragraph:
          '<p>Distributed queries use the same connector library as the rest of Spice, with 40+ prebuilt connectors for databases, warehouses, and file stores, including Databricks, S3, MySQL, and PostgreSQL. This makes clusters well suited for <a href="/use-case/datalake-accelerator">data lake acceleration</a> at scale.</p>\n',
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<TalkToAnEngineerCta />

---

## Edge to Cloud Deployments
URL: https://spice.ai/feature/edge-to-cloud-deployments
Date: 2025-11-14T14:44:32
Description: Deploy Spice anywhere, from lightweight sidecars to enterprise clusters. Choose the architecture that fits your performance, scale, and governance needs.

<HeroTextImageFiftyFifty
  fields={{
    variant: 'variant-1',
    eyebrow: 'Edge to Cloud Deployments',
    heading_tag: 'h1',
    heading: 'Edge to Cloud deployments',
    paragraph:
      'Deploy Spice anywhere, from a lightweight sidecar to an enterprise cluster. Choose the architecture that fits your performance, scale, and governance needs.',
    cta: [
      {
        type: 'filled',
        cta: {
          title: 'Get a demo',
          url: 'https://meetings.hubspot.com/vladi-semenov',
          target: '',
        },
      },
      {
        type: 'bordered',
        cta: {
          title: 'View the docs ',
          url: 'https://spiceai.org/docs/deployment',
          target: '',
        },
      },
    ],
    media_type: 'image',
    media_image: {
      ID: 1595,
      id: 1595,
      title: 'feature_edge_to_cloud_header',
      filename: 'feature_edge_to_cloud_header.png',
      filesize: 239999,
      url: '/website-assets/media/2025/12/feature_edge_to_cloud_header.png',
      link: '/feature/edge-to-cloud-deployments/attachment/feature_edge_to_cloud_header/',
      alt: 'Diagram of Spice.ai sidecar, microservice, and cluster deployment patterns connecting apps to S3, Databricks, and MySQL',
      author: '6',
      description: '',
      caption: '',
      name: 'feature_edge_to_cloud_header',
      status: 'inherit',
      uploaded_to: 548,
      date: '2025-12-02 02:38:20',
      modified: '2025-12-02 02:38:20',
      menu_order: 0,
      mime_type: 'image/png',
      type: 'image',
      subtype: 'png',
      icon: '/website-assets/media/default.png',
      width: 1388,
      height: 836,
      sizes: {
        thumbnail:
          '/website-assets/media/2025/12/feature_edge_to_cloud_header.png',
        'thumbnail-width': 150,
        'thumbnail-height': 150,
        medium:
          '/website-assets/media/2025/12/feature_edge_to_cloud_header.png',
        'medium-width': 300,
        'medium-height': 181,
        medium_large:
          '/website-assets/media/2025/12/feature_edge_to_cloud_header.png',
        'medium_large-width': 768,
        'medium_large-height': 463,
        large: '/website-assets/media/2025/12/feature_edge_to_cloud_header.png',
        'large-width': 1024,
        'large-height': 617,
        '1536x1536':
          '/website-assets/media/2025/12/feature_edge_to_cloud_header.png',
        '1536x1536-width': 1388,
        '1536x1536-height': 836,
        '2048x2048':
          '/website-assets/media/2025/12/feature_edge_to_cloud_header.png',
        '2048x2048-width': 1388,
        '2048x2048-height': 836,
      },
    },
    media_video: '',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<ContentTwoUpGridStats
  fields={{
    layout: 'tabs-carousel',
    heading: 'Do more with your data',
    heading_tag: 'h2',
    paragraph:
      'Consolidate operational, analytical, and object store data into a governed and accelerated SQL query engine.',
    stats: [
      {
        amount: '100',
        suffix: 'x',
        after_text: 'up to 100x faster queries',
      },
      {
        amount: '80',
        suffix: '%',
        after_text: 'up to 80% cost savings on data lakehouse spend',
      },
      {
        amount: '2',
        suffix: 'x',
        after_text: 'increase in data reliability for critical workloads',
      },
    ],
    items: [
      {
        title: 'Sidecar deployments',
        description:
          'Deploy Spice as a sidecar alongside your application for ultra-low latency. Ideal for real-time decision-making and embedded AI workloads, sidecar deployments simplify lifecycle management and improve data resiliency.',
        image: {
          ID: 1591,
          id: 1591,
          title: 'feature_edge_to_cloud_sidecar',
          filename: 'feature_edge_to_cloud_sidecar.png',
          filesize: 98542,
          url: '/website-assets/media/2025/12/feature_edge_to_cloud_sidecar.png',
          link: '/feature/edge-to-cloud-deployments/attachment/feature_edge_to_cloud_sidecar/',
          alt: 'Diagram of Spice.ai running as a sidecar with an accelerator, serving app requests to S3, Databricks, and MySQL data stores',
          author: '6',
          description: '',
          caption: '',
          name: 'feature_edge_to_cloud_sidecar',
          status: 'inherit',
          uploaded_to: 548,
          date: '2025-12-02 01:46:40',
          modified: '2025-12-02 01:46:40',
          menu_order: 0,
          mime_type: 'image/png',
          type: 'image',
          subtype: 'png',
          icon: '/website-assets/media/default.png',
          width: 1388,
          height: 500,
          sizes: {
            thumbnail:
              '/website-assets/media/2025/12/feature_edge_to_cloud_sidecar.png',
            'thumbnail-width': 150,
            'thumbnail-height': 150,
            medium:
              '/website-assets/media/2025/12/feature_edge_to_cloud_sidecar.png',
            'medium-width': 300,
            'medium-height': 108,
            medium_large:
              '/website-assets/media/2025/12/feature_edge_to_cloud_sidecar.png',
            'medium_large-width': 768,
            'medium_large-height': 277,
            large:
              '/website-assets/media/2025/12/feature_edge_to_cloud_sidecar.png',
            'large-width': 1024,
            'large-height': 369,
            '1536x1536':
              '/website-assets/media/2025/12/feature_edge_to_cloud_sidecar.png',
            '1536x1536-width': 1388,
            '1536x1536-height': 500,
            '2048x2048':
              '/website-assets/media/2025/12/feature_edge_to_cloud_sidecar.png',
            '2048x2048-width': 1388,
            '2048x2048-height': 500,
          },
        },
      },
      {
        title: 'Microservice deployments',
        description:
          'Run Spice as an independent microservice. Scalable, fault-tolerant, and easy to replicate for high availability.',
        image: {
          ID: 1585,
          id: 1585,
          title: 'feature_edge_to_cloud_microservice',
          filename: 'feature_edge_to_cloud_microservice.png',
          filesize: 101730,
          url: '/website-assets/media/2025/12/feature_edge_to_cloud_microservice.png',
          link: '/feature/edge-to-cloud-deployments/attachment/feature_edge_to_cloud_microservice/',
          alt: 'Diagram of apps querying a standalone Spice.ai microservice connected to S3, Databricks, and MySQL data stores',
          author: '6',
          description: '',
          caption: '',
          name: 'feature_edge_to_cloud_microservice',
          status: 'inherit',
          uploaded_to: 548,
          date: '2025-12-02 01:22:33',
          modified: '2025-12-02 01:22:33',
          menu_order: 0,
          mime_type: 'image/png',
          type: 'image',
          subtype: 'png',
          icon: '/website-assets/media/default.png',
          width: 1388,
          height: 500,
          sizes: {
            thumbnail:
              '/website-assets/media/2025/12/feature_edge_to_cloud_microservice.png',
            'thumbnail-width': 150,
            'thumbnail-height': 150,
            medium:
              '/website-assets/media/2025/12/feature_edge_to_cloud_microservice.png',
            'medium-width': 300,
            'medium-height': 108,
            medium_large:
              '/website-assets/media/2025/12/feature_edge_to_cloud_microservice.png',
            'medium_large-width': 768,
            'medium_large-height': 277,
            large:
              '/website-assets/media/2025/12/feature_edge_to_cloud_microservice.png',
            'large-width': 1024,
            'large-height': 369,
            '1536x1536':
              '/website-assets/media/2025/12/feature_edge_to_cloud_microservice.png',
            '1536x1536-width': 1388,
            '1536x1536-height': 500,
            '2048x2048':
              '/website-assets/media/2025/12/feature_edge_to_cloud_microservice.png',
            '2048x2048-width': 1388,
            '2048x2048-height': 500,
          },
        },
      },
      {
        title: 'Tiered deployments',
        description:
          'Combine sidecar and microservice patterns to support mixed access patterns. Separate critical-path workloads from less performance-sensitive tasks and optimize for both real-time responses and scalability across separate tiers.',
        image: {
          ID: 1524,
          id: 1524,
          title: 'feature_edge_to_cloud_tiered',
          filename: 'feature_edge_to_cloud_tiered.png',
          filesize: 134654,
          url: '/website-assets/media/2025/12/feature_edge_to_cloud_tiered.png',
          link: '/feature/edge-to-cloud-deployments/attachment/feature_edge_to_cloud_tiered/',
          alt: 'Diagram of a tiered deployment where a Spice.ai sidecar with an accelerator connects through a shared Spice.ai tier to S3, Databricks, and MySQL',
          author: '6',
          description: '',
          caption: '',
          name: 'feature_edge_to_cloud_tiered',
          status: 'inherit',
          uploaded_to: 548,
          date: '2025-12-01 18:15:47',
          modified: '2025-12-01 18:15:47',
          menu_order: 0,
          mime_type: 'image/png',
          type: 'image',
          subtype: 'png',
          icon: '/website-assets/media/default.png',
          width: 1388,
          height: 552,
          sizes: {
            thumbnail:
              '/website-assets/media/2025/12/feature_edge_to_cloud_tiered.png',
            'thumbnail-width': 150,
            'thumbnail-height': 150,
            medium:
              '/website-assets/media/2025/12/feature_edge_to_cloud_tiered.png',
            'medium-width': 300,
            'medium-height': 119,
            medium_large:
              '/website-assets/media/2025/12/feature_edge_to_cloud_tiered.png',
            'medium_large-width': 768,
            'medium_large-height': 305,
            large:
              '/website-assets/media/2025/12/feature_edge_to_cloud_tiered.png',
            'large-width': 1024,
            'large-height': 407,
            '1536x1536':
              '/website-assets/media/2025/12/feature_edge_to_cloud_tiered.png',
            '1536x1536-width': 1388,
            '1536x1536-height': 552,
            '2048x2048':
              '/website-assets/media/2025/12/feature_edge_to_cloud_tiered.png',
            '2048x2048-width': 1388,
            '2048x2048-height': 552,
          },
        },
      },
      {
        title: 'Managed cloud deployments',
        description:
          'Use the fully managed Spice Cloud Platform for instant setup, automatic scaling, and zero operational overhead, enabling your team to stay focused on application development.',
        image: {
          ID: 1523,
          id: 1523,
          title: 'feature_edge_to_cloud_managed',
          filename: 'feature_edge_to_cloud_managed.png',
          filesize: 140174,
          url: '/website-assets/media/2025/12/feature_edge_to_cloud_managed.png',
          link: '/feature/edge-to-cloud-deployments/attachment/feature_edge_to_cloud_managed/',
          alt: 'Diagram of apps connecting through a managed Spice.ai cluster to data stores and AI models from OpenAI, xAI, and Anthropic',
          author: '6',
          description: '',
          caption: '',
          name: 'feature_edge_to_cloud_managed',
          status: 'inherit',
          uploaded_to: 548,
          date: '2025-12-01 18:15:44',
          modified: '2025-12-01 18:15:44',
          menu_order: 0,
          mime_type: 'image/png',
          type: 'image',
          subtype: 'png',
          icon: '/website-assets/media/default.png',
          width: 1388,
          height: 556,
          sizes: {
            thumbnail:
              '/website-assets/media/2025/12/feature_edge_to_cloud_managed.png',
            'thumbnail-width': 150,
            'thumbnail-height': 150,
            medium:
              '/website-assets/media/2025/12/feature_edge_to_cloud_managed.png',
            'medium-width': 300,
            'medium-height': 120,
            medium_large:
              '/website-assets/media/2025/12/feature_edge_to_cloud_managed.png',
            'medium_large-width': 768,
            'medium_large-height': 308,
            large:
              '/website-assets/media/2025/12/feature_edge_to_cloud_managed.png',
            'large-width': 1024,
            'large-height': 410,
            '1536x1536':
              '/website-assets/media/2025/12/feature_edge_to_cloud_managed.png',
            '1536x1536-width': 1388,
            '1536x1536-height': 556,
            '2048x2048':
              '/website-assets/media/2025/12/feature_edge_to_cloud_managed.png',
            '2048x2048-width': 1388,
            '2048x2048-height': 556,
          },
        },
      },
      {
        title: 'Enterprise deployments',
        description:
          'Spice.ai Enterprise supports large-scale, clustered deployments with advanced security, monitoring, and governance. Integrate directly with Kubernetes or Spice Cloud for maximum control and availability.',
        image: {
          ID: 1522,
          id: 1522,
          title: 'feature_edge_to_cloud_enterprise',
          filename: 'feature_edge_to_cloud_enterprise.png',
          filesize: 134504,
          url: '/website-assets/media/2025/12/feature_edge_to_cloud_enterprise.png',
          link: '/feature/edge-to-cloud-deployments/attachment/feature_edge_to_cloud_enterprise/',
          alt: 'Diagram of apps querying a clustered Spice.ai enterprise deployment connected to S3, Databricks, and MySQL data stores',
          author: '6',
          description: '',
          caption: '',
          name: 'feature_edge_to_cloud_enterprise',
          status: 'inherit',
          uploaded_to: 548,
          date: '2025-12-01 18:15:42',
          modified: '2025-12-01 18:15:42',
          menu_order: 0,
          mime_type: 'image/png',
          type: 'image',
          subtype: 'png',
          icon: '/website-assets/media/default.png',
          width: 1388,
          height: 588,
          sizes: {
            thumbnail:
              '/website-assets/media/2025/12/feature_edge_to_cloud_enterprise.png',
            'thumbnail-width': 150,
            'thumbnail-height': 150,
            medium:
              '/website-assets/media/2025/12/feature_edge_to_cloud_enterprise.png',
            'medium-width': 300,
            'medium-height': 127,
            medium_large:
              '/website-assets/media/2025/12/feature_edge_to_cloud_enterprise.png',
            'medium_large-width': 768,
            'medium_large-height': 326,
            large:
              '/website-assets/media/2025/12/feature_edge_to_cloud_enterprise.png',
            'large-width': 1024,
            'large-height': 434,
            '1536x1536':
              '/website-assets/media/2025/12/feature_edge_to_cloud_enterprise.png',
            '1536x1536-width': 1388,
            '1536x1536-height': 588,
            '2048x2048':
              '/website-assets/media/2025/12/feature_edge_to_cloud_enterprise.png',
            '2048x2048-width': 1388,
            '2048x2048-height': 588,
          },
        },
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<ContentImageVideo
  fields={{
    variant: 'variant-1',
    heading: 'Integrations across all of your data sources',
    heading_tag: 'h2',
    paragraph:
      'Accelerate your data stack with a library of 40+ prebuilt connectors for the most common databases, warehouses, and file stores-from Databricks and S3 to MySQL and PostgreSQL.',
    cta: [
      {
        type: 'filled',
        cta: {
          title: 'See connectors',
          url: '/integrations',
          target: '',
        },
      },
    ],
    media_type: 'image',
    media_image: {
      ID: 612,
      id: 612,
      title: 'platform_integrations',
      filename: 'platform_integrations.png',
      filesize: 1330111,
      url: '/website-assets/media/2025/11/platform_integrations.png',
      link: '/platform/sql-federation-acceleration/attachment/platform_integrations/',
      alt: '',
      author: '6',
      description: '',
      caption: '',
      name: 'platform_integrations',
      status: 'inherit',
      uploaded_to: 543,
      date: '2025-11-18 19:42:54',
      modified: '2025-11-18 19:42:54',
      menu_order: 0,
      mime_type: 'image/png',
      type: 'image',
      subtype: 'png',
      icon: '/website-assets/media/default.png',
      width: 1360,
      height: 1034,
      sizes: {
        thumbnail: '/website-assets/media/2025/11/platform_integrations.png',
        'thumbnail-width': 150,
        'thumbnail-height': 150,
        medium: '/website-assets/media/2025/11/platform_integrations.png',
        'medium-width': 300,
        'medium-height': 228,
        medium_large: '/website-assets/media/2025/11/platform_integrations.png',
        'medium_large-width': 768,
        'medium_large-height': 584,
        large: '/website-assets/media/2025/11/platform_integrations.png',
        'large-width': 1024,
        'large-height': 779,
        '1536x1536': '/website-assets/media/2025/11/platform_integrations.png',
        '1536x1536-width': 1360,
        '1536x1536-height': 1034,
        '2048x2048': '/website-assets/media/2025/11/platform_integrations.png',
        '2048x2048-width': 1360,
        '2048x2048-height': 1034,
      },
    },
    graphic_overlay: false,
    media_video: '',
    padding_top: 'st-lg',
    padding_bottom: 'sb-lg',
  }}
/>

<Testimonials
  heading="Deployed in production"
  headingTag="h2"
  paragraph="Run data-intensive workloads on a high-performance engine trusted by teams building real-time systems at scale."
  items={['twilio', 'barracuda', 'nrc-dustin']}
/>

<AccordionFaq
  fields={{
    heading: 'FAQs',
    heading_tag: 'h2',
    paragraph: 'Answers to common questions about deploying Spice',
    items: [
      {
        title: 'When should I deploy Spice as a sidecar versus a microservice?',
        paragraph:
          '<p>Deploy Spice as a sidecar when your application needs ultra-low-latency data access, such as real-time decision-making or embedded AI workloads. Run it as an independent microservice when you need a scalable, fault-tolerant service that is easy to replicate for high availability. Tiered deployments combine both patterns, separating critical-path workloads from less performance-sensitive tasks.</p>\n',
      },
      {
        title: 'Does Spice run on Kubernetes?',
        paragraph:
          '<p>Yes. Spice.ai Enterprise supports large-scale, clustered deployments that integrate directly with Kubernetes or Spice Cloud, with advanced security, monitoring, and governance for maximum control and availability.</p>\n',
      },
      {
        title: 'Is there a fully managed way to run Spice?',
        paragraph:
          '<p>Yes. The fully managed Spice Cloud Platform provides instant setup, automatic scaling, and zero operational overhead, so teams stay focused on application development. See <a href="/pricing">Spice Cloud pricing</a> for plan details.</p>\n',
      },
      {
        title: 'Do all deployment models use the same runtime and connectors?',
        paragraph:
          '<p>Yes. Every deployment option runs the same Spice engine with <a href="/platform/sql-federation-acceleration">SQL federation and acceleration</a> and a library of 40+ prebuilt connectors. Applications behave consistently whether Spice runs as a sidecar, a microservice, or a managed cluster.</p>\n',
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<TalkToAnEngineerCta />

---

## MCP Server & Gateway
URL: https://spice.ai/feature/mcp-server-gateway
Date: 2025-11-14T14:44:48
Description: Deploy MCP servers locally or over SSE, route tools to models, and expose Spice securely as an MCP gateway with full observability.

<HeroTextImageFiftyFifty
  fields={{
    variant: 'variant-1',
    eyebrow: 'MCP Server & Gateway',
    heading_tag: 'h1',
    heading: 'Enterprise-grade MCP gateway for real-time AI',
    paragraph:
      'Spice connects and governs distributed Model Context Protocol (MCP) servers over SSE - scaling and securing data-driven AI workflows.',
    cta: [
      {
        type: 'filled',
        cta: {
          title: 'Get a demo',
          url: 'https://meetings.hubspot.com/vladi-semenov',
          target: '',
        },
      },
      {
        type: 'bordered',
        cta: {
          title: 'View the docs',
          url: 'https://spiceai.org/docs/components/tools/mcp',
          target: '',
        },
      },
    ],
    media_type: 'image',
    media_image: {
      ID: 1576,
      id: 1576,
      title: 'feature_mcp_header',
      filename: 'feature_mcp_header.png',
      filesize: 150419,
      url: '/website-assets/media/2025/12/feature_mcp_header.png',
      link: '/feature/mcp-server-gateway/attachment/feature_mcp_header/',
      alt: 'Diagram of Spice AI as an MCP server connecting a client app to data stores and MCP tools like Slack, Stripe, and Twilio',
      author: '6',
      description: '',
      caption: '',
      name: 'feature_mcp_header',
      status: 'inherit',
      uploaded_to: 550,
      date: '2025-12-02 00:50:49',
      modified: '2025-12-02 00:50:49',
      menu_order: 0,
      mime_type: 'image/png',
      type: 'image',
      subtype: 'png',
      icon: '/website-assets/media/default.png',
      width: 1360,
      height: 834,
      sizes: {
        thumbnail: '/website-assets/media/2025/12/feature_mcp_header.png',
        'thumbnail-width': 150,
        'thumbnail-height': 150,
        medium: '/website-assets/media/2025/12/feature_mcp_header.png',
        'medium-width': 300,
        'medium-height': 184,
        medium_large: '/website-assets/media/2025/12/feature_mcp_header.png',
        'medium_large-width': 768,
        'medium_large-height': 471,
        large: '/website-assets/media/2025/12/feature_mcp_header.png',
        'large-width': 1024,
        'large-height': 628,
        '1536x1536': '/website-assets/media/2025/12/feature_mcp_header.png',
        '1536x1536-width': 1360,
        '1536x1536-height': 834,
        '2048x2048': '/website-assets/media/2025/12/feature_mcp_header.png',
        '2048x2048-width': 1360,
        '2048x2048-height': 834,
      },
    },
    media_video: '',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<ContentTwoUpGridStats
  fields={{
    layout: 'tabs-carousel',
    heading: 'Do more with your data',
    heading_tag: 'h2',
    paragraph:
      'Increase the reliability, performance, and security of data-driven AI workflows.',
    stats: [
      {
        amount: 'Up to 100',
        suffix: 'x',
        after_text: 'up to 100x faster queries',
      },
      {
        amount: 'Up to 80',
        suffix: '%',
        after_text: 'up to 80% cost savings on data lakehouse spend',
      },
      {
        amount: '2',
        suffix: 'x',
        after_text: 'increase in data reliability for critical workloads',
      },
    ],
    items: [
      {
        title: 'Internal and federated MCP hosting',
        description:
          'Run stdio-based tools locally for secure, low-latency decision-making, or federate to remote MCP servers over SSE.',
        image: {
          ID: 1550,
          id: 1550,
          title: 'feature_mcp_federated_hosting',
          filename: 'feature_mcp_federated_hosting.png',
          filesize: 228352,
          url: '/website-assets/media/2025/12/feature_mcp_federated_hosting.png',
          link: '/feature/mcp-server-gateway/attachment/feature_mcp_federated_hosting/',
          alt: 'Diagram of federated Spice AI MCP servers connecting MCP clients to data sources like Amazon S3, Databricks, GitHub, and PostgreSQL',
          author: '6',
          description: '',
          caption: '',
          name: 'feature_mcp_federated_hosting',
          status: 'inherit',
          uploaded_to: 550,
          date: '2025-12-01 22:19:57',
          modified: '2025-12-01 22:19:57',
          menu_order: 0,
          mime_type: 'image/png',
          type: 'image',
          subtype: 'png',
          icon: '/website-assets/media/default.png',
          width: 1388,
          height: 940,
          sizes: {
            thumbnail:
              '/website-assets/media/2025/12/feature_mcp_federated_hosting.png',
            'thumbnail-width': 150,
            'thumbnail-height': 150,
            medium:
              '/website-assets/media/2025/12/feature_mcp_federated_hosting.png',
            'medium-width': 300,
            'medium-height': 203,
            medium_large:
              '/website-assets/media/2025/12/feature_mcp_federated_hosting.png',
            'medium_large-width': 768,
            'medium_large-height': 520,
            large:
              '/website-assets/media/2025/12/feature_mcp_federated_hosting.png',
            'large-width': 1024,
            'large-height': 693,
            '1536x1536':
              '/website-assets/media/2025/12/feature_mcp_federated_hosting.png',
            '1536x1536-width': 1388,
            '1536x1536-height': 940,
            '2048x2048':
              '/website-assets/media/2025/12/feature_mcp_federated_hosting.png',
            '2048x2048-width': 1388,
            '2048x2048-height': 940,
          },
        },
      },
      {
        title: 'Modular, distributed orchestration',
        description:
          'Spice replaces centralized orchestration with a modular, federated model. Each MCP server communicates securely and asynchronously, improving performance and reliability across distributed systems.',
        image: {
          ID: 1553,
          id: 1553,
          title: 'feature_mcp_modular_orchestration',
          filename: 'feature_mcp_modular_orchestration.png',
          filesize: 125824,
          url: '/website-assets/media/2025/12/feature_mcp_modular_orchestration.png',
          link: '/feature/mcp-server-gateway/attachment/feature_mcp_modular_orchestration/',
          alt: 'Diagram of Spice.ai OSS agent orchestration routing prompts to models, data, and tools and connecting to an MCP client',
          author: '6',
          description: '',
          caption: '',
          name: 'feature_mcp_modular_orchestration',
          status: 'inherit',
          uploaded_to: 550,
          date: '2025-12-01 22:20:05',
          modified: '2025-12-01 22:20:05',
          menu_order: 0,
          mime_type: 'image/png',
          type: 'image',
          subtype: 'png',
          icon: '/website-assets/media/default.png',
          width: 1388,
          height: 624,
          sizes: {
            thumbnail:
              '/website-assets/media/2025/12/feature_mcp_modular_orchestration.png',
            'thumbnail-width': 150,
            'thumbnail-height': 150,
            medium:
              '/website-assets/media/2025/12/feature_mcp_modular_orchestration.png',
            'medium-width': 300,
            'medium-height': 135,
            medium_large:
              '/website-assets/media/2025/12/feature_mcp_modular_orchestration.png',
            'medium_large-width': 768,
            'medium_large-height': 345,
            large:
              '/website-assets/media/2025/12/feature_mcp_modular_orchestration.png',
            'large-width': 1024,
            'large-height': 460,
            '1536x1536':
              '/website-assets/media/2025/12/feature_mcp_modular_orchestration.png',
            '1536x1536-width': 1388,
            '1536x1536-height': 624,
            '2048x2048':
              '/website-assets/media/2025/12/feature_mcp_modular_orchestration.png',
            '2048x2048-width': 1388,
            '2048x2048-height': 624,
          },
        },
      },
      {
        title: 'Hybrid access for AI and data',
        description:
          'Combine MCP tool results with federated SQL queries, embeddings, and search. Expose tools via MCP so other Spice instances or external systems can discover and securely invoke them at scale.',
        image: {
          ID: 1552,
          id: 1552,
          title: 'feature_mcp_hybrid_access',
          filename: 'feature_mcp_hybrid_access.png',
          filesize: 157127,
          url: '/website-assets/media/2025/12/feature_mcp_hybrid_access.png',
          link: '/feature/mcp-server-gateway/attachment/feature_mcp_hybrid_access/',
          alt: 'Diagram of Spice.ai OSS serving search and SQL queries from accelerated data and embeddings backed by AWS S3 buckets and databases',
          author: '6',
          description: '',
          caption: '',
          name: 'feature_mcp_hybrid_access',
          status: 'inherit',
          uploaded_to: 550,
          date: '2025-12-01 22:20:02',
          modified: '2025-12-01 22:20:02',
          menu_order: 0,
          mime_type: 'image/png',
          type: 'image',
          subtype: 'png',
          icon: '/website-assets/media/default.png',
          width: 1388,
          height: 736,
          sizes: {
            thumbnail:
              '/website-assets/media/2025/12/feature_mcp_hybrid_access.png',
            'thumbnail-width': 150,
            'thumbnail-height': 150,
            medium:
              '/website-assets/media/2025/12/feature_mcp_hybrid_access.png',
            'medium-width': 300,
            'medium-height': 159,
            medium_large:
              '/website-assets/media/2025/12/feature_mcp_hybrid_access.png',
            'medium_large-width': 768,
            'medium_large-height': 407,
            large:
              '/website-assets/media/2025/12/feature_mcp_hybrid_access.png',
            'large-width': 1024,
            'large-height': 543,
            '1536x1536':
              '/website-assets/media/2025/12/feature_mcp_hybrid_access.png',
            '1536x1536-width': 1388,
            '1536x1536-height': 736,
            '2048x2048':
              '/website-assets/media/2025/12/feature_mcp_hybrid_access.png',
            '2048x2048-width': 1388,
            '2048x2048-height': 736,
          },
        },
      },
      {
        title: 'Governed routing to models',
        description:
          'Dynamically assign tools to specific models with fine-grained access controls. Distributed tracing ensures full visibility into execution paths across MCP servers, models, and data sources.',
        image: {
          ID: 1551,
          id: 1551,
          title: 'feature_mcp_governed_routing',
          filename: 'feature_mcp_governed_routing.png',
          filesize: 198274,
          url: '/website-assets/media/2025/12/feature_mcp_governed_routing.png',
          link: '/feature/mcp-server-gateway/attachment/feature_mcp_governed_routing/',
          alt: 'Diagram of an agent workflow where Spice.ai OSS plans and executes steps across data sources and MCP tools like Slack, Stripe, and Twilio',
          author: '6',
          description: '',
          caption: '',
          name: 'feature_mcp_governed_routing',
          status: 'inherit',
          uploaded_to: 550,
          date: '2025-12-01 22:20:00',
          modified: '2025-12-01 22:20:00',
          menu_order: 0,
          mime_type: 'image/png',
          type: 'image',
          subtype: 'png',
          icon: '/website-assets/media/default.png',
          width: 1388,
          height: 848,
          sizes: {
            thumbnail:
              '/website-assets/media/2025/12/feature_mcp_governed_routing.png',
            'thumbnail-width': 150,
            'thumbnail-height': 150,
            medium:
              '/website-assets/media/2025/12/feature_mcp_governed_routing.png',
            'medium-width': 300,
            'medium-height': 183,
            medium_large:
              '/website-assets/media/2025/12/feature_mcp_governed_routing.png',
            'medium_large-width': 768,
            'medium_large-height': 469,
            large:
              '/website-assets/media/2025/12/feature_mcp_governed_routing.png',
            'large-width': 1024,
            'large-height': 626,
            '1536x1536':
              '/website-assets/media/2025/12/feature_mcp_governed_routing.png',
            '1536x1536-width': 1388,
            '1536x1536-height': 848,
            '2048x2048':
              '/website-assets/media/2025/12/feature_mcp_governed_routing.png',
            '2048x2048-width': 1388,
            '2048x2048-height': 848,
          },
        },
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<ContentImageVideo
  fields={{
    variant: 'variant-1',
    heading: 'Integrations across all your data sources',
    heading_tag: 'h2',
    paragraph:
      'Accelerate your data stack with a library of 40+ prebuilt connectors for the most common databases, warehouses, and object stores-from Databricks and S3 to MySQL and PostgreSQL.',
    cta: [
      {
        type: 'filled',
        cta: {
          title: 'See connectors',
          url: '/integrations',
          target: '',
        },
      },
    ],
    media_type: 'image',
    media_image: {
      ID: 612,
      id: 612,
      title: 'platform_integrations',
      filename: 'platform_integrations.png',
      filesize: 1330111,
      url: '/website-assets/media/2025/11/platform_integrations.png',
      link: '/platform/sql-federation-acceleration/attachment/platform_integrations/',
      alt: '',
      author: '6',
      description: '',
      caption: '',
      name: 'platform_integrations',
      status: 'inherit',
      uploaded_to: 543,
      date: '2025-11-18 19:42:54',
      modified: '2025-11-18 19:42:54',
      menu_order: 0,
      mime_type: 'image/png',
      type: 'image',
      subtype: 'png',
      icon: '/website-assets/media/default.png',
      width: 1360,
      height: 1034,
      sizes: {
        thumbnail: '/website-assets/media/2025/11/platform_integrations.png',
        'thumbnail-width': 150,
        'thumbnail-height': 150,
        medium: '/website-assets/media/2025/11/platform_integrations.png',
        'medium-width': 300,
        'medium-height': 228,
        medium_large: '/website-assets/media/2025/11/platform_integrations.png',
        'medium_large-width': 768,
        'medium_large-height': 584,
        large: '/website-assets/media/2025/11/platform_integrations.png',
        'large-width': 1024,
        'large-height': 779,
        '1536x1536': '/website-assets/media/2025/11/platform_integrations.png',
        '1536x1536-width': 1360,
        '1536x1536-height': 1034,
        '2048x2048': '/website-assets/media/2025/11/platform_integrations.png',
        '2048x2048-width': 1360,
        '2048x2048-height': 1034,
      },
    },
    graphic_overlay: false,
    media_video: '',
    padding_top: 'st-lg',
    padding_bottom: 'sb-lg',
  }}
/>

<Testimonials
  heading="Deployed in production"
  headingTag="h2"
  paragraph="Teams trust Spice to bring inference closer to their data, enabling low-latency, enterprise-grade AI."
  items={['nrc-tim', 'basisset']}
/>

<AccordionFaq
  fields={{
    heading: 'FAQs',
    heading_tag: 'h2',
    paragraph:
      'Answers to common questions about the Spice MCP server and gateway',
    items: [
      {
        title: 'What does an MCP gateway do?',
        paragraph:
          '<p>An MCP gateway provides a single, governed access point between AI models and distributed Model Context Protocol (MCP) servers. Spice acts as this gateway, connecting and governing MCP servers over SSE while applying security, routing, and observability to data-driven AI workflows.</p>\n',
      },
      {
        title:
          'Can Spice host MCP tools locally and connect to remote servers?',
        paragraph:
          '<p>Yes. Spice runs stdio-based tools locally for secure, low-latency execution and federates to remote MCP servers over SSE. Each MCP server communicates securely and asynchronously in a modular, distributed model rather than through centralized orchestration.</p>\n',
      },
      {
        title: 'How do I control which tools an AI model can access?',
        paragraph:
          '<p>Spice dynamically assigns tools to specific models with fine-grained access controls, and distributed tracing gives full visibility into execution paths across MCP servers, models, and data sources. These controls are the foundation for <a href="/use-case/secure-ai-agents">secure AI agent deployments</a>.</p>\n',
      },
      {
        title: 'Can agents combine MCP tool results with live data queries?',
        paragraph:
          '<p>Yes. Spice combines MCP tool results with federated SQL queries, embeddings, and search in one runtime, built on <a href="/platform/sql-federation-acceleration">SQL federation and acceleration</a>. Tools can also be exposed via MCP so other Spice instances or external systems can discover and securely invoke them at scale.</p>\n',
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<TalkToAnEngineerCta />

---

## Real-Time Change Data Capture
URL: https://spice.ai/feature/real-time-change-data-capture
Date: 2025-11-14T14:45:01
Description: Sync accelerated datasets with real-time changes using Change Data Capture (CDC) and maintain low-latency analytics without full-table refreshes.

<HeroTextImageFiftyFifty
  fields={{
    variant: 'variant-1',
    eyebrow: 'Real-Time Change Data Capture',
    heading_tag: 'h1',
    heading: 'Continuous sync for accelerated workloads',
    paragraph:
      'Automatically capture and apply changes from databases, event logs, and other data sources directly into accelerated datasets, delivering up-to-date data without streaming pipelines. ',
    cta: [
      {
        type: 'filled',
        cta: {
          title: 'Get a demo',
          url: 'https://meetings.hubspot.com/vladi-semenov',
          target: '',
        },
      },
      {
        type: 'bordered',
        cta: {
          title: 'View the docs',
          url: 'https://spiceai.org/docs/features/cdc',
          target: '',
        },
      },
    ],
    media_type: 'image',
    media_image: {
      ID: 1572,
      id: 1572,
      title: 'feature_cdc_header',
      filename: 'feature_cdc_header.png',
      filesize: 216664,
      url: '/website-assets/media/2025/12/feature_cdc_header.png',
      link: '/feature/real-time-change-data-capture/attachment/feature_cdc_header/',
      alt: 'Diagram of Spice.ai OSS capturing Debezium change data from source systems and dispatching changes to downstream services',
      author: '6',
      description: '',
      caption: '',
      name: 'feature_cdc_header',
      status: 'inherit',
      uploaded_to: 549,
      date: '2025-12-02 00:43:14',
      modified: '2025-12-02 00:43:14',
      menu_order: 0,
      mime_type: 'image/png',
      type: 'image',
      subtype: 'png',
      icon: '/website-assets/media/default.png',
      width: 1360,
      height: 740,
      sizes: {
        thumbnail: '/website-assets/media/2025/12/feature_cdc_header.png',
        'thumbnail-width': 150,
        'thumbnail-height': 150,
        medium: '/website-assets/media/2025/12/feature_cdc_header.png',
        'medium-width': 300,
        'medium-height': 163,
        medium_large: '/website-assets/media/2025/12/feature_cdc_header.png',
        'medium_large-width': 768,
        'medium_large-height': 418,
        large: '/website-assets/media/2025/12/feature_cdc_header.png',
        'large-width': 1024,
        'large-height': 557,
        '1536x1536': '/website-assets/media/2025/12/feature_cdc_header.png',
        '1536x1536-width': 1360,
        '1536x1536-height': 740,
        '2048x2048': '/website-assets/media/2025/12/feature_cdc_header.png',
        '2048x2048-width': 1360,
        '2048x2048-height': 740,
      },
    },
    media_video: '',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<ContentTwoUpGridStats
  fields={{
    layout: 'tabs-carousel',
    heading: 'Do more with your data',
    heading_tag: 'h2',
    paragraph:
      'Consolidate operational, analytical, and object store data into a governed and accelerated SQL query engine.',
    stats: [
      {
        amount: '100',
        suffix: 'x',
        after_text: 'up to 100x faster queries',
      },
      {
        amount: '80',
        suffix: '%',
        after_text: 'up to 80% cost savings on data lakehouse spend',
      },
      {
        amount: '2',
        suffix: 'x',
        after_text: 'increase in data reliability for critical workloads',
      },
    ],
    items: [
      {
        title: 'Real-time dataset updates',
        description:
          'Stream changes from distributed data sources directly into Spice in real time. Only modified data is transferred, keeping accelerated datasets like DuckDB and SQLite synchronized.',
        image: {
          ID: 1532,
          id: 1532,
          title: 'feature_cdc_dataset_updates',
          filename: 'feature_cdc_dataset_updates.png',
          filesize: 140904,
          url: '/website-assets/media/2025/12/feature_cdc_dataset_updates.png',
          link: '/feature/real-time-change-data-capture/attachment/feature_cdc_dataset_updates/',
          alt: 'Diagram of data sources and streams pushing create, update, and delete changes into Spice.ai acceleration',
          author: '6',
          description: '',
          caption: '',
          name: 'feature_cdc_dataset_updates',
          status: 'inherit',
          uploaded_to: 549,
          date: '2025-12-01 18:29:45',
          modified: '2025-12-01 18:29:45',
          menu_order: 0,
          mime_type: 'image/png',
          type: 'image',
          subtype: 'png',
          icon: '/website-assets/media/default.png',
          width: 1388,
          height: 748,
          sizes: {
            thumbnail:
              '/website-assets/media/2025/12/feature_cdc_dataset_updates.png',
            'thumbnail-width': 150,
            'thumbnail-height': 150,
            medium:
              '/website-assets/media/2025/12/feature_cdc_dataset_updates.png',
            'medium-width': 300,
            'medium-height': 162,
            medium_large:
              '/website-assets/media/2025/12/feature_cdc_dataset_updates.png',
            'medium_large-width': 768,
            'medium_large-height': 414,
            large:
              '/website-assets/media/2025/12/feature_cdc_dataset_updates.png',
            'large-width': 1024,
            'large-height': 552,
            '1536x1536':
              '/website-assets/media/2025/12/feature_cdc_dataset_updates.png',
            '1536x1536-width': 1388,
            '1536x1536-height': 748,
            '2048x2048':
              '/website-assets/media/2025/12/feature_cdc_dataset_updates.png',
            '2048x2048-width': 1388,
            '2048x2048-height': 748,
          },
        },
      },
      {
        title: 'Optimized for acceleration',
        description:
          'Combine CDC with persistent acceleration engines for sub-second queries on live data. Spice resumes from the last known state after restart, avoiding full reloads while maintaining strong consistency and performance.',
        image: {
          ID: 1534,
          id: 1534,
          title: 'feature_cdc_optimized_for_acceleration',
          filename: 'feature_cdc_optimized_for_acceleration.png',
          filesize: 160308,
          url: '/website-assets/media/2025/12/feature_cdc_optimized_for_acceleration.png',
          link: '/feature/real-time-change-data-capture/attachment/feature_cdc_optimized_for_acceleration/',
          alt: 'Diagram of Spice.ai acceleration combining pull-based refresh from Kafka with push-on-change updates from PostgreSQL and Spice AI',
          author: '6',
          description: '',
          caption: '',
          name: 'feature_cdc_optimized_for_acceleration',
          status: 'inherit',
          uploaded_to: 549,
          date: '2025-12-01 18:29:49',
          modified: '2025-12-01 18:29:49',
          menu_order: 0,
          mime_type: 'image/png',
          type: 'image',
          subtype: 'png',
          icon: '/website-assets/media/default.png',
          width: 1388,
          height: 696,
          sizes: {
            thumbnail:
              '/website-assets/media/2025/12/feature_cdc_optimized_for_acceleration.png',
            'thumbnail-width': 150,
            'thumbnail-height': 150,
            medium:
              '/website-assets/media/2025/12/feature_cdc_optimized_for_acceleration.png',
            'medium-width': 300,
            'medium-height': 150,
            medium_large:
              '/website-assets/media/2025/12/feature_cdc_optimized_for_acceleration.png',
            'medium_large-width': 768,
            'medium_large-height': 385,
            large:
              '/website-assets/media/2025/12/feature_cdc_optimized_for_acceleration.png',
            'large-width': 1024,
            'large-height': 513,
            '1536x1536':
              '/website-assets/media/2025/12/feature_cdc_optimized_for_acceleration.png',
            '1536x1536-width': 1388,
            '1536x1536-height': 696,
            '2048x2048':
              '/website-assets/media/2025/12/feature_cdc_optimized_for_acceleration.png',
            '2048x2048-width': 1388,
            '2048x2048-height': 696,
          },
        },
      },
      {
        title: 'Built for event-driven workloads',
        description:
          'Spice CDC powers real-time AI and analytics for use cases like fraud detection, personalization, and IoT-so applications always work with the freshest data.',
        image: {
          ID: 1533,
          id: 1533,
          title: 'feature_cdc_event_driven_workloads',
          filename: 'feature_cdc_event_driven_workloads.png',
          filesize: 70647,
          url: '/website-assets/media/2025/12/feature_cdc_event_driven_workloads.png',
          link: '/feature/real-time-change-data-capture/attachment/feature_cdc_event_driven_workloads/',
          alt: 'Diagram of an event-driven flow where publishers move event data through an event data store to databases, files, and apps',
          author: '6',
          description: '',
          caption: '',
          name: 'feature_cdc_event_driven_workloads',
          status: 'inherit',
          uploaded_to: 549,
          date: '2025-12-01 18:29:47',
          modified: '2025-12-01 18:29:47',
          menu_order: 0,
          mime_type: 'image/png',
          type: 'image',
          subtype: 'png',
          icon: '/website-assets/media/default.png',
          width: 1388,
          height: 548,
          sizes: {
            thumbnail:
              '/website-assets/media/2025/12/feature_cdc_event_driven_workloads.png',
            'thumbnail-width': 150,
            'thumbnail-height': 150,
            medium:
              '/website-assets/media/2025/12/feature_cdc_event_driven_workloads.png',
            'medium-width': 300,
            'medium-height': 118,
            medium_large:
              '/website-assets/media/2025/12/feature_cdc_event_driven_workloads.png',
            'medium_large-width': 768,
            'medium_large-height': 303,
            large:
              '/website-assets/media/2025/12/feature_cdc_event_driven_workloads.png',
            'large-width': 1024,
            'large-height': 404,
            '1536x1536':
              '/website-assets/media/2025/12/feature_cdc_event_driven_workloads.png',
            '1536x1536-width': 1388,
            '1536x1536-height': 548,
            '2048x2048':
              '/website-assets/media/2025/12/feature_cdc_event_driven_workloads.png',
            '2048x2048-width': 1388,
            '2048x2048-height': 548,
          },
        },
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<ContentImageVideo
  fields={{
    variant: 'variant-1',
    heading: 'Integrations across your data and observability stack',
    heading_tag: 'h2',
    paragraph:
      'Accelerate your data stack with a library of 40+ prebuilt connectors for the most common databases, warehouses, and object stores-from Databricks and S3 to MySQL and PostgreSQL.',
    cta: [
      {
        type: 'filled',
        cta: {
          title: 'See connectors ',
          url: '/integrations',
          target: '',
        },
      },
    ],
    media_type: 'image',
    media_image: {
      ID: 612,
      id: 612,
      title: 'platform_integrations',
      filename: 'platform_integrations.png',
      filesize: 1330111,
      url: '/website-assets/media/2025/11/platform_integrations.png',
      link: '/platform/sql-federation-acceleration/attachment/platform_integrations/',
      alt: '',
      author: '6',
      description: '',
      caption: '',
      name: 'platform_integrations',
      status: 'inherit',
      uploaded_to: 543,
      date: '2025-11-18 19:42:54',
      modified: '2025-11-18 19:42:54',
      menu_order: 0,
      mime_type: 'image/png',
      type: 'image',
      subtype: 'png',
      icon: '/website-assets/media/default.png',
      width: 1360,
      height: 1034,
      sizes: {
        thumbnail: '/website-assets/media/2025/11/platform_integrations.png',
        'thumbnail-width': 150,
        'thumbnail-height': 150,
        medium: '/website-assets/media/2025/11/platform_integrations.png',
        'medium-width': 300,
        'medium-height': 228,
        medium_large: '/website-assets/media/2025/11/platform_integrations.png',
        'medium_large-width': 768,
        'medium_large-height': 584,
        large: '/website-assets/media/2025/11/platform_integrations.png',
        'large-width': 1024,
        'large-height': 779,
        '1536x1536': '/website-assets/media/2025/11/platform_integrations.png',
        '1536x1536-width': 1360,
        '1536x1536-height': 1034,
        '2048x2048': '/website-assets/media/2025/11/platform_integrations.png',
        '2048x2048-width': 1360,
        '2048x2048-height': 1034,
      },
    },
    graphic_overlay: false,
    media_video: '',
    padding_top: 'st-lg',
    padding_bottom: 'sb-lg',
  }}
/>

<Testimonials
  heading="Do more with your data"
  headingTag="h2"
  paragraph="Run data-intensive workloads on a high-performance data runtime trusted by teams building real-time systems at scale."
  items={['twilio', 'barracuda', 'nrc-dustin']}
/>

<AccordionFaq
  fields={{
    heading: 'FAQs',
    heading_tag: 'h2',
    paragraph: 'Answers to common questions about change data capture in Spice',
    items: [
      {
        title: 'How does change data capture keep datasets in sync?',
        paragraph:
          '<p>Spice captures inserts, updates, and deletes from databases, event logs, and other data sources, and applies them directly to accelerated datasets as they occur. Only modified data is transferred, so datasets stay current without full-table refreshes or separate streaming pipelines.</p>\n',
      },
      {
        title: 'Do I need Kafka or Debezium to use CDC with Spice?',
        paragraph:
          '<p>No. CDC is built into the Spice runtime, so accelerated datasets stay synchronized with source databases without Kafka, Debezium, or separate streaming infrastructure for many use cases. You enable it by configuring a change-based refresh mode on an accelerated dataset.</p>\n',
      },
      {
        title: 'What happens to CDC when Spice restarts?',
        paragraph:
          '<p>Spice resumes from the last known state after a restart, avoiding full reloads while maintaining strong consistency and performance. Combined with persistent acceleration engines, this keeps sub-second queries running on live data.</p>\n',
      },
      {
        title: 'Which acceleration engines can CDC keep updated?',
        paragraph:
          '<p>CDC keeps persistent accelerated datasets such as DuckDB and SQLite synchronized with their sources. This pairs with <a href="/use-case/datalake-accelerator">data lake acceleration</a> to serve fast queries over continuously changing data.</p>\n',
      },
      {
        title: 'What kinds of applications benefit from real-time CDC?',
        paragraph:
          '<p>Event-driven workloads such as fraud detection, personalization, and IoT benefit most because they depend on the freshest data. CDC also keeps datasets current for AI applications like <a href="/use-case/retrieval-augmented-generation">retrieval-augmented generation</a>, where responses are grounded in live data.</p>\n',
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<TalkToAnEngineerCta />

---

## Secure AI Sandboxing
URL: https://spice.ai/feature/secure-ai-sandboxing
Date: 2025-11-14T14:45:12
Description: Safely connect AI to enterprise data. Spice isolates access for agents and models, enforcing least privilege, observability, and compliance across every query.

<HeroTextImageFiftyFifty
  fields={{
    variant: 'variant-1',
    eyebrow: 'Secure AI Sandboxing',
    heading_tag: 'h1',
    heading: 'Safely connect AI to your enterprise data',
    paragraph:
      'Provision temporary, scoped AI sandboxes and ensure AI agents or models receive only the minimum data required, governed by detailed policies with full observability. ',
    cta: [
      {
        type: 'filled',
        cta: {
          title: 'Get a demo',
          url: 'https://meetings.hubspot.com/vladi-semenov',
          target: '',
        },
      },
      {
        type: 'bordered',
        cta: {
          title: 'View the docs',
          url: 'https://spiceai.org/docs',
          target: '',
        },
      },
    ],
    media_type: 'image',
    media_image: {
      ID: 1574,
      id: 1574,
      title: 'feature_ai_sandboxing_header',
      filename: 'feature_ai_sandboxing_header.png',
      filesize: 207988,
      url: '/website-assets/media/2025/12/feature_ai_sandboxing_header.png',
      link: '/feature/secure-ai-sandboxing/attachment/feature_ai_sandboxing_header/',
      alt: 'Diagram of the Spice.ai runtime sandboxing AI memory, tools, embeddings, and evals behind a firewall over Amazon S3, Snowflake, and PostgreSQL',
      author: '6',
      description: '',
      caption: '',
      name: 'feature_ai_sandboxing_header',
      status: 'inherit',
      uploaded_to: 546,
      date: '2025-12-02 00:47:19',
      modified: '2025-12-02 00:47:19',
      menu_order: 0,
      mime_type: 'image/png',
      type: 'image',
      subtype: 'png',
      icon: '/website-assets/media/default.png',
      width: 1360,
      height: 744,
      sizes: {
        thumbnail:
          '/website-assets/media/2025/12/feature_ai_sandboxing_header.png',
        'thumbnail-width': 150,
        'thumbnail-height': 150,
        medium:
          '/website-assets/media/2025/12/feature_ai_sandboxing_header.png',
        'medium-width': 300,
        'medium-height': 164,
        medium_large:
          '/website-assets/media/2025/12/feature_ai_sandboxing_header.png',
        'medium_large-width': 768,
        'medium_large-height': 420,
        large: '/website-assets/media/2025/12/feature_ai_sandboxing_header.png',
        'large-width': 1024,
        'large-height': 560,
        '1536x1536':
          '/website-assets/media/2025/12/feature_ai_sandboxing_header.png',
        '1536x1536-width': 1360,
        '1536x1536-height': 744,
        '2048x2048':
          '/website-assets/media/2025/12/feature_ai_sandboxing_header.png',
        '2048x2048-width': 1360,
        '2048x2048-height': 744,
      },
    },
    media_video: '',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<ContentStats
  fields={{
    heading: 'Do more with your data',
    heading_tag: 'h2',
    paragraph:
      'Spice enforces fine-grained access controls, encryption, and compliance standards to protect your data from ingestion to inference.',
    stats: [
      {
        media_type: 'image',
        image: false,
        lottie: false,
        amount: '100',
        suffix: 'x',
        after_text: 'Up to 100x faster queries',
      },
      {
        media_type: 'image',
        image: false,
        lottie: false,
        amount: '80',
        suffix: '%',
        after_text: 'up to 80x cost savings on data lakehouse spend',
      },
      {
        media_type: 'image',
        image: false,
        lottie: false,
        amount: '2',
        suffix: 'x',
        after_text: 'increase in data reliability for critical workloads',
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<TabsContentImage
  fields={{
    heading_tag: 'h2',
    item: [
      {
        name: 'Data-centric isolation',
        title: 'Data-centric isolation',
        paragraph:
          'Spice provisions temporary, scoped datasets tailored to each model or agent. Access is short-lived, governed by policy, and auditable across the runtime, ensuring AI agents never touch production data directly.',
        cta: {
          title: 'View the docs',
          url: 'https://spiceai.org/docs',
          target: '',
        },
        media_type: 'image',
        media_image: {
          ID: 1515,
          id: 1515,
          title: 'feature_ai_sandboxing_isolation',
          filename: 'feature_ai_sandboxing_isolation.png',
          filesize: 128446,
          url: '/website-assets/media/2025/12/feature_ai_sandboxing_isolation.png',
          link: '/feature/secure-ai-sandboxing/attachment/feature_ai_sandboxing_isolation/',
          alt: 'Diagram of an AI agent in a VM or pod reading Iceberg tables through a Spice.ai accelerator, with fallback reads to the database',
          author: '6',
          description: '',
          caption: '',
          name: 'feature_ai_sandboxing_isolation',
          status: 'inherit',
          uploaded_to: 546,
          date: '2025-12-01 17:16:56',
          modified: '2025-12-01 17:16:56',
          menu_order: 0,
          mime_type: 'image/png',
          type: 'image',
          subtype: 'png',
          icon: '/website-assets/media/default.png',
          width: 1388,
          height: 772,
          sizes: {
            thumbnail:
              '/website-assets/media/2025/12/feature_ai_sandboxing_isolation.png',
            'thumbnail-width': 150,
            'thumbnail-height': 150,
            medium:
              '/website-assets/media/2025/12/feature_ai_sandboxing_isolation.png',
            'medium-width': 300,
            'medium-height': 167,
            medium_large:
              '/website-assets/media/2025/12/feature_ai_sandboxing_isolation.png',
            'medium_large-width': 768,
            'medium_large-height': 427,
            large:
              '/website-assets/media/2025/12/feature_ai_sandboxing_isolation.png',
            'large-width': 1024,
            'large-height': 570,
            '1536x1536':
              '/website-assets/media/2025/12/feature_ai_sandboxing_isolation.png',
            '1536x1536-width': 1388,
            '1536x1536-height': 772,
            '2048x2048':
              '/website-assets/media/2025/12/feature_ai_sandboxing_isolation.png',
            '2048x2048-width': 1388,
            '2048x2048-height': 772,
          },
        },
        media_video: '',
      },
      {
        name: 'Principle of least privilege',
        title: 'Principle of least privilege',
        paragraph:
          'Every query, embedding, or completion call is executed with only the minimum data required.',
        cta: {
          title: 'View the docs',
          url: 'https://spiceai.org/docs',
          target: '',
        },
        media_type: 'image',
        media_image: {
          ID: 1514,
          id: 1514,
          title: 'feature_ai_sandboxing_principle_of_least_privilege',
          filename: 'feature_ai_sandboxing_principle_of_least_privilege.png',
          filesize: 206086,
          url: '/website-assets/media/2025/12/feature_ai_sandboxing_principle_of_least_privilege.png',
          link: '/feature/secure-ai-sandboxing/attachment/feature_ai_sandboxing_principle_of_least_privilege/',
          alt: 'Diagram of per-customer Spice.ai instances scoping queries with WHERE customer filters before reaching shared data sources',
          author: '6',
          description: '',
          caption: '',
          name: 'feature_ai_sandboxing_principle_of_least_privilege',
          status: 'inherit',
          uploaded_to: 546,
          date: '2025-12-01 17:16:53',
          modified: '2025-12-01 17:16:53',
          menu_order: 0,
          mime_type: 'image/png',
          type: 'image',
          subtype: 'png',
          icon: '/website-assets/media/default.png',
          width: 1388,
          height: 772,
          sizes: {
            thumbnail:
              '/website-assets/media/2025/12/feature_ai_sandboxing_principle_of_least_privilege.png',
            'thumbnail-width': 150,
            'thumbnail-height': 150,
            medium:
              '/website-assets/media/2025/12/feature_ai_sandboxing_principle_of_least_privilege.png',
            'medium-width': 300,
            'medium-height': 167,
            medium_large:
              '/website-assets/media/2025/12/feature_ai_sandboxing_principle_of_least_privilege.png',
            'medium_large-width': 768,
            'medium_large-height': 427,
            large:
              '/website-assets/media/2025/12/feature_ai_sandboxing_principle_of_least_privilege.png',
            'large-width': 1024,
            'large-height': 570,
            '1536x1536':
              '/website-assets/media/2025/12/feature_ai_sandboxing_principle_of_least_privilege.png',
            '1536x1536-width': 1388,
            '1536x1536-height': 772,
            '2048x2048':
              '/website-assets/media/2025/12/feature_ai_sandboxing_principle_of_least_privilege.png',
            '2048x2048-width': 1388,
            '2048x2048-height': 772,
          },
        },
        media_video: '',
      },
      {
        name: 'Governed runtime access',
        title: 'Governed runtime access',
        paragraph:
          'All AI interactions run inside a governed runtime. Policies, roles, and encryption are enforced automatically, and every action is logged for compliance and traceability.',
        cta: {
          title: 'View the docs',
          url: 'https://spiceai.org/docs',
          target: '',
        },
        media_type: 'image',
        media_image: {
          ID: 1513,
          id: 1513,
          title: 'feature_ai_sandboxing_governed_runtime',
          filename: 'feature_ai_sandboxing_governed_runtime.png',
          filesize: 160870,
          url: '/website-assets/media/2025/12/feature_ai_sandboxing_governed_runtime.png',
          link: '/feature/secure-ai-sandboxing/attachment/feature_ai_sandboxing_governed_runtime/',
          alt: 'Diagram of agents, models, tools, and embeddings running inside the Spice.ai governed runtime with monitoring, policy, and a firewall',
          author: '6',
          description: '',
          caption: '',
          name: 'feature_ai_sandboxing_governed_runtime',
          status: 'inherit',
          uploaded_to: 546,
          date: '2025-12-01 17:16:51',
          modified: '2025-12-01 17:16:51',
          menu_order: 0,
          mime_type: 'image/png',
          type: 'image',
          subtype: 'png',
          icon: '/website-assets/media/default.png',
          width: 1388,
          height: 772,
          sizes: {
            thumbnail:
              '/website-assets/media/2025/12/feature_ai_sandboxing_governed_runtime.png',
            'thumbnail-width': 150,
            'thumbnail-height': 150,
            medium:
              '/website-assets/media/2025/12/feature_ai_sandboxing_governed_runtime.png',
            'medium-width': 300,
            'medium-height': 167,
            medium_large:
              '/website-assets/media/2025/12/feature_ai_sandboxing_governed_runtime.png',
            'medium_large-width': 768,
            'medium_large-height': 427,
            large:
              '/website-assets/media/2025/12/feature_ai_sandboxing_governed_runtime.png',
            'large-width': 1024,
            'large-height': 570,
            '1536x1536':
              '/website-assets/media/2025/12/feature_ai_sandboxing_governed_runtime.png',
            '1536x1536-width': 1388,
            '1536x1536-height': 772,
            '2048x2048':
              '/website-assets/media/2025/12/feature_ai_sandboxing_governed_runtime.png',
            '2048x2048-width': 1388,
            '2048x2048-height': 772,
          },
        },
        media_video: '',
      },
      {
        name: 'Secure by default',
        title: 'Secure by default',
        paragraph:
          'By deploying Spice alongside your agents, sensitive tables remain behind your firewall while apps interact only with safe, pre-materialized datasets. The result is a smaller attack surface and sub-second access to frequently queried data.',
        cta: {
          title: 'View the docs',
          url: 'https://spiceai.org/docs',
          target: '',
        },
        media_type: 'image',
        media_image: {
          ID: 1512,
          id: 1512,
          title: 'feature_ai_sandboxing_secure_by_default',
          filename: 'feature_ai_sandboxing_secure_by_default.png',
          filesize: 122802,
          url: '/website-assets/media/2025/12/feature_ai_sandboxing_secure_by_default.png',
          link: '/feature/secure-ai-sandboxing/attachment/feature_ai_sandboxing_secure_by_default/',
          alt: 'Before-and-after diagram of an AI agent moving from direct Iceberg reads to accelerated reads through Spice.ai in a VM or pod',
          author: '6',
          description: '',
          caption: '',
          name: 'feature_ai_sandboxing_secure_by_default',
          status: 'inherit',
          uploaded_to: 546,
          date: '2025-12-01 17:16:49',
          modified: '2025-12-01 17:16:49',
          menu_order: 0,
          mime_type: 'image/png',
          type: 'image',
          subtype: 'png',
          icon: '/website-assets/media/default.png',
          width: 1388,
          height: 656,
          sizes: {
            thumbnail:
              '/website-assets/media/2025/12/feature_ai_sandboxing_secure_by_default.png',
            'thumbnail-width': 150,
            'thumbnail-height': 150,
            medium:
              '/website-assets/media/2025/12/feature_ai_sandboxing_secure_by_default.png',
            'medium-width': 300,
            'medium-height': 142,
            medium_large:
              '/website-assets/media/2025/12/feature_ai_sandboxing_secure_by_default.png',
            'medium_large-width': 768,
            'medium_large-height': 363,
            large:
              '/website-assets/media/2025/12/feature_ai_sandboxing_secure_by_default.png',
            'large-width': 1024,
            'large-height': 484,
            '1536x1536':
              '/website-assets/media/2025/12/feature_ai_sandboxing_secure_by_default.png',
            '1536x1536-width': 1388,
            '1536x1536-height': 656,
            '2048x2048':
              '/website-assets/media/2025/12/feature_ai_sandboxing_secure_by_default.png',
            '2048x2048-width': 1388,
            '2048x2048-height': 656,
          },
        },
        media_video: '',
      },
    ],
    padding_top: 'st-none',
    padding_bottom: 'unset',
  }}
/>

<ContentImageVideo
  fields={{
    variant: 'variant-1',
    heading: 'Integrations across all of your data sources',
    heading_tag: 'h2',
    paragraph:
      'Accelerate your data and AI stack with a library of 40+ prebuilt connectors for the most common databases, warehouses, and file stores- - from Databricks and S3 to MySQL and PostgreSQL. Govern AI sandboxes with the same policies as your production data environments.',
    cta: [
      {
        type: 'filled',
        cta: {
          title: 'See connectors',
          url: '/integrations',
          target: '',
        },
      },
    ],
    media_type: 'image',
    media_image: {
      ID: 412,
      id: 412,
      title: 'platform_integrations',
      filename: 'platform_integrations.png',
      filesize: 1330111,
      url: '/website-assets/media/2025/11/platform_integrations.png',
      link: '/feature/secure-ai-sandboxing/attachment/platform_integrations/',
      alt: '',
      author: '5',
      description: '',
      caption: '',
      name: 'platform_integrations',
      status: 'inherit',
      uploaded_to: 406,
      date: '2025-11-03 00:43:41',
      modified: '2025-11-03 00:43:41',
      menu_order: 0,
      mime_type: 'image/png',
      type: 'image',
      subtype: 'png',
      icon: '/website-assets/media/default.png',
      width: 1360,
      height: 1034,
      sizes: {
        thumbnail: '/website-assets/media/2025/11/platform_integrations.png',
        'thumbnail-width': 150,
        'thumbnail-height': 150,
        medium: '/website-assets/media/2025/11/platform_integrations.png',
        'medium-width': 300,
        'medium-height': 228,
        medium_large: '/website-assets/media/2025/11/platform_integrations.png',
        'medium_large-width': 768,
        'medium_large-height': 584,
        large: '/website-assets/media/2025/11/platform_integrations.png',
        'large-width': 1024,
        'large-height': 779,
        '1536x1536': '/website-assets/media/2025/11/platform_integrations.png',
        '1536x1536-width': 1360,
        '1536x1536-height': 1034,
        '2048x2048': '/website-assets/media/2025/11/platform_integrations.png',
        '2048x2048-width': 1360,
        '2048x2048-height': 1034,
      },
    },
    graphic_overlay: false,
    media_video: '',
    padding_top: 'st-lg',
    padding_bottom: 'sb-lg',
  }}
/>

<Testimonials
  heading="Deployed in production"
  headingTag="h2"
  paragraph="Spice enforces access controls, encryption, and compliance standards to protect your data from ingestion to inference."
  items={['twilio', 'barracuda', 'nrc-tim', 'basisset']}
/>

<AccordionFaq
  fields={{
    heading: 'FAQs',
    heading_tag: 'h2',
    paragraph:
      'Answers to common questions about secure AI sandboxing in Spice',
    items: [
      {
        title: 'What is an AI sandbox in Spice?',
        paragraph:
          '<p>An AI sandbox in Spice is a temporary, scoped dataset provisioned for a specific model or agent. Access is short-lived, governed by policy, and auditable across the runtime, so AI agents never touch production data directly.</p>\n',
      },
      {
        title:
          'How does sandboxing protect production databases from AI agents?',
        paragraph:
          '<p>Spice deploys alongside your agents, so sensitive tables remain behind your firewall while applications interact only with safe, pre-materialized datasets. This reduces the attack surface, and agents that access data through tools can be governed with the <a href="/feature/mcp-server-gateway">MCP server gateway</a>, which routes tools to models with fine-grained access controls.</p>\n',
      },
      {
        title: 'Are AI interactions with data logged and auditable?',
        paragraph:
          '<p>Yes. All AI interactions run inside a governed runtime where policies, roles, and encryption are enforced automatically, and every action is logged for compliance and traceability. Each query, embedding, or completion call executes with only the minimum data required.</p>\n',
      },
      {
        title: 'How fast is data access from a sandbox?',
        paragraph:
          '<p>Sandboxed applications interact with pre-materialized datasets, which provide sub-second access to frequently queried data. Serving <a href="/platform/llm-inference">LLM inference in Spice</a> from the same runtime keeps models close to the data they are permitted to use.</p>\n',
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<TalkToAnEngineerCta />

---

## Get a demo
URL: https://spice.ai/get-a-demo
Date: 2026-01-09T02:06:37
Description: Get in touch with the Spice AI team. Whether you're exploring enterprise deployments, pricing, integrations, or technical questions, we're here to help.

<HeroForm
  fields={{
    heading_tag: 'h1',
    heading: 'Get a demo',
    paragraph:
      'See how Spice fits into your architecture and get answers on deployment, performance, security, and integrations.',
    message:
      '"Spice opened the door to take these critical control-plane datasets and move them next to our services in the runtime path."',
    author: 'Peter Janovsky',
    position: 'Software Architect, Twilio',
    logos: [
      {
        logo: {
          ID: 443,
          id: 443,
          title: 'Homepage_Logos_Twilio',
          filename: 'Homepage_Logos_Twilio-1.svg',
          filesize: 4020,
          url: '/website-assets/media/2025/11/Homepage_Logos_Twilio-1.svg',
          link: '/home/homepage_logos_twilio-2/',
          alt: 'Twilio logo',
          author: '6',
          description: '',
          caption: '',
          name: 'homepage_logos_twilio-2',
          status: 'inherit',
          uploaded_to: 2,
          date: '2025-11-05 18:46:45',
          modified: '2025-11-05 18:46:45',
          menu_order: 0,
          mime_type: 'image/svg+xml',
          type: 'image',
          subtype: 'svg+xml',
          icon: '/website-assets/media/default.png',
          width: 0,
          height: 0,
          sizes: {
            thumbnail: '/website-assets/media/2025/11/Homepage_Logos_Twilio-1.svg',
            'thumbnail-width': 1,
            'thumbnail-height': 1,
            medium: '/website-assets/media/2025/11/Homepage_Logos_Twilio-1.svg',
            'medium-width': 1,
            'medium-height': 1,
            medium_large: '/website-assets/media/2025/11/Homepage_Logos_Twilio-1.svg',
            'medium_large-width': 1,
            'medium_large-height': 1,
            large: '/website-assets/media/2025/11/Homepage_Logos_Twilio-1.svg',
            'large-width': 1,
            'large-height': 1,
            '1536x1536': '/website-assets/media/2025/11/Homepage_Logos_Twilio-1.svg',
            '1536x1536-width': 1,
            '1536x1536-height': 1,
            '2048x2048': '/website-assets/media/2025/11/Homepage_Logos_Twilio-1.svg',
            '2048x2048-width': 1,
            '2048x2048-height': 1,
          },
        },
      },
      {
        logo: {
          ID: 442,
          id: 442,
          title: 'Homepage_Logos_NRC',
          filename: 'Homepage_Logos_NRC-1.svg',
          filesize: 1030,
          url: '/website-assets/media/2025/11/Homepage_Logos_NRC-1.svg',
          link: '/home/homepage_logos_nrc-2/',
          alt: 'NRC Health logo',
          author: '6',
          description: '',
          caption: '',
          name: 'homepage_logos_nrc-2',
          status: 'inherit',
          uploaded_to: 2,
          date: '2025-11-05 18:46:45',
          modified: '2025-11-05 18:46:45',
          menu_order: 0,
          mime_type: 'image/svg+xml',
          type: 'image',
          subtype: 'svg+xml',
          icon: '/website-assets/media/default.png',
          width: 0,
          height: 0,
          sizes: {
            thumbnail: '/website-assets/media/2025/11/Homepage_Logos_NRC-1.svg',
            'thumbnail-width': 1,
            'thumbnail-height': 1,
            medium: '/website-assets/media/2025/11/Homepage_Logos_NRC-1.svg',
            'medium-width': 1,
            'medium-height': 1,
            medium_large: '/website-assets/media/2025/11/Homepage_Logos_NRC-1.svg',
            'medium_large-width': 1,
            'medium_large-height': 1,
            large: '/website-assets/media/2025/11/Homepage_Logos_NRC-1.svg',
            'large-width': 1,
            'large-height': 1,
            '1536x1536': '/website-assets/media/2025/11/Homepage_Logos_NRC-1.svg',
            '1536x1536-width': 1,
            '1536x1536-height': 1,
            '2048x2048': '/website-assets/media/2025/11/Homepage_Logos_NRC-1.svg',
            '2048x2048-width': 1,
            '2048x2048-height': 1,
          },
        },
      },
      {
        logo: {
          ID: 441,
          id: 441,
          title: 'Homepage_Logos_BasisSet',
          filename: 'Homepage_Logos_BasisSet-1.svg',
          filesize: 2629,
          url: '/website-assets/media/2025/11/Homepage_Logos_BasisSet-1.svg',
          link: '/home/homepage_logos_basisset-2/',
          alt: 'Basis Set Ventures logo',
          author: '6',
          description: '',
          caption: '',
          name: 'homepage_logos_basisset-2',
          status: 'inherit',
          uploaded_to: 2,
          date: '2025-11-05 18:46:45',
          modified: '2025-11-05 18:46:45',
          menu_order: 0,
          mime_type: 'image/svg+xml',
          type: 'image',
          subtype: 'svg+xml',
          icon: '/website-assets/media/default.png',
          width: 0,
          height: 0,
          sizes: {
            thumbnail: '/website-assets/media/2025/11/Homepage_Logos_BasisSet-1.svg',
            'thumbnail-width': 1,
            'thumbnail-height': 1,
            medium: '/website-assets/media/2025/11/Homepage_Logos_BasisSet-1.svg',
            'medium-width': 1,
            'medium-height': 1,
            medium_large: '/website-assets/media/2025/11/Homepage_Logos_BasisSet-1.svg',
            'medium_large-width': 1,
            'medium_large-height': 1,
            large: '/website-assets/media/2025/11/Homepage_Logos_BasisSet-1.svg',
            'large-width': 1,
            'large-height': 1,
            '1536x1536': '/website-assets/media/2025/11/Homepage_Logos_BasisSet-1.svg',
            '1536x1536-width': 1,
            '1536x1536-height': 1,
            '2048x2048': '/website-assets/media/2025/11/Homepage_Logos_BasisSet-1.svg',
            '2048x2048-width': 1,
            '2048x2048-height': 1,
          },
        },
      },
      {
        logo: {
          ID: 440,
          id: 440,
          title: 'Homepage_Logos_Barracuda',
          filename: 'Homepage_Logos_Barracuda-1.svg',
          filesize: 7450,
          url: '/website-assets/media/2025/11/Homepage_Logos_Barracuda-1.svg',
          link: '/home/homepage_logos_barracuda-2/',
          alt: 'Barracuda Networks logo',
          author: '6',
          description: '',
          caption: '',
          name: 'homepage_logos_barracuda-2',
          status: 'inherit',
          uploaded_to: 2,
          date: '2025-11-05 18:46:45',
          modified: '2025-11-05 18:46:45',
          menu_order: 0,
          mime_type: 'image/svg+xml',
          type: 'image',
          subtype: 'svg+xml',
          icon: '/website-assets/media/default.png',
          width: 0,
          height: 0,
          sizes: {
            thumbnail: '/website-assets/media/2025/11/Homepage_Logos_Barracuda-1.svg',
            'thumbnail-width': 1,
            'thumbnail-height': 1,
            medium: '/website-assets/media/2025/11/Homepage_Logos_Barracuda-1.svg',
            'medium-width': 1,
            'medium-height': 1,
            medium_large: '/website-assets/media/2025/11/Homepage_Logos_Barracuda-1.svg',
            'medium_large-width': 1,
            'medium_large-height': 1,
            large: '/website-assets/media/2025/11/Homepage_Logos_Barracuda-1.svg',
            'large-width': 1,
            'large-height': 1,
            '1536x1536': '/website-assets/media/2025/11/Homepage_Logos_Barracuda-1.svg',
            '1536x1536-width': 1,
            '1536x1536-height': 1,
            '2048x2048': '/website-assets/media/2025/11/Homepage_Logos_Barracuda-1.svg',
            '2048x2048-width': 1,
            '2048x2048-height': 1,
          },
        },
      },
    ],
    form_title: 'Get in touch',
    form: {
      region: 'na1',
      form_id: '',
      portal_id: '',
    },
  }}
/>

---

## Home
URL: https://spice.ai
Date: 2025-10-14T16:53:33
Description: Deploy analytics replicas alongside operational databases to give apps and agents fast, sandboxed access to real-time data. Fully open source.

<HeroHomepage
  fields={{
    heading: 'Real-time analytics<br>in 3 clicks',
    paragraph:
      'Deploy analytics replicas alongside your operational databases to give apps and agents fast, sandboxed access to data. Open source and deployable anywhere.',
    cta: [
      {
        type: 'filled',
        cta: {
          title: 'Talk to an engineer',
          url: 'https://meetings.hubspot.com/vladi-semenov',
          target: '_blank',
        },
      },
      {
        type: 'bordered',
        cta: {
          title: 'Start for free',
          url: '/login',
          target: '_blank',
        },
      },
    ],
    media_type: 'image',
    media_image: {
      ID: 1499,
      id: 1499,
      title: 'analytics_replica_homepage',
      filename: 'analytics-replica-homepage.svg',
      filesize: 750155,
      url: '/website-assets/media/2026/07/analytics-replica-homepage.svg',
      link: '/home/analytics_replica_homepage/',
      alt: 'Spice AI analytics replica architecture for real-time operational data',
      author: '6',
      description: '',
      caption: '',
      name: 'analytics_replica_homepage',
      status: 'inherit',
      uploaded_to: 2,
      date: '2025-11-27 16:59:58',
      modified: '2025-11-27 16:59:58',
      menu_order: 0,
      mime_type: 'image/svg+xml',
      type: 'image',
      subtype: 'svg+xml',
      icon: '/website-assets/media/2025/11/quote_icon.svg',
      width: 628,
      height: 376,
      sizes: {
        thumbnail:
          '/website-assets/media/2026/07/analytics-replica-homepage.svg',
        'thumbnail-width': 150,
        'thumbnail-height': 90,
        medium: '/website-assets/media/2026/07/analytics-replica-homepage.svg',
        'medium-width': 300,
        'medium-height': 180,
        medium_large:
          '/website-assets/media/2026/07/analytics-replica-homepage.svg',
        'medium_large-width': 628,
        'medium_large-height': 376,
        large: '/website-assets/media/2026/07/analytics-replica-homepage.svg',
        'large-width': 628,
        'large-height': 376,
        '1536x1536':
          '/website-assets/media/2026/07/analytics-replica-homepage.svg',
        '1536x1536-width': 628,
        '1536x1536-height': 376,
        '2048x2048':
          '/website-assets/media/2026/07/analytics-replica-homepage.svg',
        '2048x2048-width': 628,
        '2048x2048-height': 376,
      },
    },
    media_video: '',
  }}
/>

<CarouselLogos
  fields={{
    heading: 'Deployed in production by global enterprises',
    logos: [
      {
        logo: {
          ID: 442,
          id: 442,
          title: 'Homepage_Logos_NRC',
          filename: 'Homepage_Logos_NRC-1.svg',
          filesize: 0,
          url: '/website-assets/media/2025/11/Homepage_Logos_NRC-1.svg',
          link: '/home/homepage_logos_nrc-2/',
          alt: 'NRC Health logo',
          author: '6',
          description: '',
          caption: '',
          name: 'homepage_logos_nrc-2',
          status: 'inherit',
          uploaded_to: 2,
          date: '2025-11-05 18:46:45',
          modified: '2025-11-05 18:46:45',
          menu_order: 0,
          mime_type: 'image/svg+xml',
          type: 'image',
          subtype: 'svg+xml',
          icon: '/website-assets/media/2025/11/quote_icon.svg',
          width: 101,
          height: 40,
          sizes: {
            thumbnail: '/website-assets/media/2025/11/Homepage_Logos_NRC-1.svg',
            'thumbnail-width': 101,
            'thumbnail-height': 40,
            medium: '/website-assets/media/2025/11/Homepage_Logos_NRC-1.svg',
            'medium-width': 1,
            'medium-height': 1,
            medium_large:
              '/website-assets/media/2025/11/Homepage_Logos_NRC-1.svg',
            'medium_large-width': 1,
            'medium_large-height': 1,
            large: '/website-assets/media/2025/11/Homepage_Logos_NRC-1.svg',
            'large-width': 1,
            'large-height': 1,
            '1536x1536':
              '/website-assets/media/2025/11/Homepage_Logos_NRC-1.svg',
            '1536x1536-width': 1,
            '1536x1536-height': 1,
            '2048x2048':
              '/website-assets/media/2025/11/Homepage_Logos_NRC-1.svg',
            '2048x2048-width': 1,
            '2048x2048-height': 1,
          },
        },
      },
      {
        logo: {
          ID: 443,
          id: 443,
          title: 'Homepage_Logos_Twilio',
          filename: 'Homepage_Logos_Twilio-1.svg',
          filesize: 0,
          url: '/website-assets/media/2025/11/Homepage_Logos_Twilio-1.svg',
          link: '/home/homepage_logos_twilio-2/',
          alt: 'Twilio logo',
          author: '6',
          description: '',
          caption: '',
          name: 'homepage_logos_twilio-2',
          status: 'inherit',
          uploaded_to: 2,
          date: '2025-11-05 18:46:45',
          modified: '2025-11-05 18:46:45',
          menu_order: 0,
          mime_type: 'image/svg+xml',
          type: 'image',
          subtype: 'svg+xml',
          icon: '/website-assets/media/2025/11/quote_icon.svg',
          width: 118,
          height: 40,
          sizes: {
            thumbnail:
              '/website-assets/media/2025/11/Homepage_Logos_Twilio-1.svg',
            'thumbnail-width': 118,
            'thumbnail-height': 40,
            medium: '/website-assets/media/2025/11/Homepage_Logos_Twilio-1.svg',
            'medium-width': 1,
            'medium-height': 1,
            medium_large:
              '/website-assets/media/2025/11/Homepage_Logos_Twilio-1.svg',
            'medium_large-width': 1,
            'medium_large-height': 1,
            large: '/website-assets/media/2025/11/Homepage_Logos_Twilio-1.svg',
            'large-width': 1,
            'large-height': 1,
            '1536x1536':
              '/website-assets/media/2025/11/Homepage_Logos_Twilio-1.svg',
            '1536x1536-width': 1,
            '1536x1536-height': 1,
            '2048x2048':
              '/website-assets/media/2025/11/Homepage_Logos_Twilio-1.svg',
            '2048x2048-width': 1,
            '2048x2048-height': 1,
          },
        },
      },
      {
        logo: {
          ID: 440,
          id: 440,
          title: 'Homepage_Logos_Barracuda',
          filename: 'Homepage_Logos_Barracuda-1.svg',
          filesize: 0,
          url: '/website-assets/media/2025/11/Homepage_Logos_Barracuda-1.svg',
          link: '/home/homepage_logos_barracuda-2/',
          alt: 'Barracuda Networks logo',
          author: '6',
          description: '',
          caption: '',
          name: 'homepage_logos_barracuda-2',
          status: 'inherit',
          uploaded_to: 2,
          date: '2025-11-05 18:46:45',
          modified: '2025-11-05 18:46:45',
          menu_order: 0,
          mime_type: 'image/svg+xml',
          type: 'image',
          subtype: 'svg+xml',
          icon: '/website-assets/media/2025/11/quote_icon.svg',
          width: 211,
          height: 40,
          sizes: {
            thumbnail:
              '/website-assets/media/2025/11/Homepage_Logos_Barracuda-1.svg',
            'thumbnail-width': 211,
            'thumbnail-height': 40,
            medium:
              '/website-assets/media/2025/11/Homepage_Logos_Barracuda-1.svg',
            'medium-width': 1,
            'medium-height': 1,
            medium_large:
              '/website-assets/media/2025/11/Homepage_Logos_Barracuda-1.svg',
            'medium_large-width': 1,
            'medium_large-height': 1,
            large:
              '/website-assets/media/2025/11/Homepage_Logos_Barracuda-1.svg',
            'large-width': 1,
            'large-height': 1,
            '1536x1536':
              '/website-assets/media/2025/11/Homepage_Logos_Barracuda-1.svg',
            '1536x1536-width': 1,
            '1536x1536-height': 1,
            '2048x2048':
              '/website-assets/media/2025/11/Homepage_Logos_Barracuda-1.svg',
            '2048x2048-width': 1,
            '2048x2048-height': 1,
          },
        },
      },
      {
        logo: {
          ID: 441,
          id: 441,
          title: 'Homepage_Logos_BasisSet',
          filename: 'Homepage_Logos_BasisSet-1.svg',
          filesize: 0,
          url: '/website-assets/media/2025/11/Homepage_Logos_BasisSet-1.svg',
          link: '/home/homepage_logos_basisset-2/',
          alt: 'Basis Set Ventures logo',
          author: '6',
          description: '',
          caption: '',
          name: 'homepage_logos_basisset-2',
          status: 'inherit',
          uploaded_to: 2,
          date: '2025-11-05 18:46:45',
          modified: '2025-11-05 18:46:45',
          menu_order: 0,
          mime_type: 'image/svg+xml',
          type: 'image',
          subtype: 'svg+xml',
          icon: '/website-assets/media/2025/11/quote_icon.svg',
          width: 152,
          height: 40,
          sizes: {
            thumbnail:
              '/website-assets/media/2025/11/Homepage_Logos_BasisSet-1.svg',
            'thumbnail-width': 152,
            'thumbnail-height': 40,
            medium:
              '/website-assets/media/2025/11/Homepage_Logos_BasisSet-1.svg',
            'medium-width': 1,
            'medium-height': 1,
            medium_large:
              '/website-assets/media/2025/11/Homepage_Logos_BasisSet-1.svg',
            'medium_large-width': 1,
            'medium_large-height': 1,
            large:
              '/website-assets/media/2025/11/Homepage_Logos_BasisSet-1.svg',
            'large-width': 1,
            'large-height': 1,
            '1536x1536':
              '/website-assets/media/2025/11/Homepage_Logos_BasisSet-1.svg',
            '1536x1536-width': 1,
            '1536x1536-height': 1,
            '2048x2048':
              '/website-assets/media/2025/11/Homepage_Logos_BasisSet-1.svg',
            '2048x2048-width': 1,
            '2048x2048-height': 1,
          },
        },
      },
      {
        logo: {
          ID: 444,
          id: 444,
          title: 'Homepage_Logos_Summation',
          filename: 'Homepage_Logos_Summation-1.svg',
          filesize: 0,
          url: '/website-assets/media/2025/11/Homepage_Logos_Summation-1.svg',
          link: '/home/homepage_logos_summation-2/',
          alt: 'Summation logo',
          author: '6',
          description: '',
          caption: '',
          name: 'homepage_logos_summation-2',
          status: 'inherit',
          uploaded_to: 2,
          date: '2026-07-08 00:00:00',
          modified: '2026-07-08 00:00:00',
          menu_order: 0,
          mime_type: 'image/svg+xml',
          type: 'image',
          subtype: 'svg+xml',
          icon: '/website-assets/media/2025/11/quote_icon.svg',
          width: 255,
          height: 40,
          sizes: {
            thumbnail:
              '/website-assets/media/2025/11/Homepage_Logos_Summation-1.svg',
            'thumbnail-width': 255,
            'thumbnail-height': 40,
            medium:
              '/website-assets/media/2025/11/Homepage_Logos_Summation-1.svg',
            'medium-width': 1,
            'medium-height': 1,
            medium_large:
              '/website-assets/media/2025/11/Homepage_Logos_Summation-1.svg',
            'medium_large-width': 1,
            'medium_large-height': 1,
            large:
              '/website-assets/media/2025/11/Homepage_Logos_Summation-1.svg',
            'large-width': 1,
            'large-height': 1,
            '1536x1536':
              '/website-assets/media/2025/11/Homepage_Logos_Summation-1.svg',
            '1536x1536-width': 1,
            '1536x1536-height': 1,
            '2048x2048':
              '/website-assets/media/2025/11/Homepage_Logos_Summation-1.svg',
            '2048x2048-width': 1,
            '2048x2048-height': 1,
          },
        },
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<ContentStats
  fields={{
    heading: 'Make your data AI-ready',
    heading_tag: 'h2',
    paragraph:
      'Sub-second query performance across sources, up to 80% lower lakehouse spend, and increased data resiliency.',
    heading_align: 'center',
    stats: [
      {
        top_note: 'Lower is better',
        media_type: 'lottie',
        image: false,
        lottie: '/website-assets/media/2025/12/Graphic-01.json',
        amount: '100',
        suffix: 'x',
        after_text: 'up to 100x faster queries',
      },
      {
        top_note: 'Lower is better',
        media_type: 'lottie',
        image: false,
        lottie: '/website-assets/media/2025/12/Graphic-02.json',
        amount: '80',
        suffix: '%',
        after_text: 'up to 80% lower data lakehouse spend',
      },
      {
        top_note: 'Higher is better',
        media_type: 'lottie',
        image: false,
        lottie: '/website-assets/media/2025/12/Graphic-03.json',
        amount: '2',
        suffix: 'x',
        after_text: '2x increase in data reliability for critical workloads',
      },
    ],
    padding_top: 'st-xl',
    padding_bottom: 'unset',
  }}
/>

<PoweredByCarousel />

<TabsContentImage
  fields={{
    heading: 'Fast, physically isolated access to enterprise data',
    heading_tag: 'h2',
    paragraph:
      'A single SQL endpoint for retrieving, accelerating, searching, and reasoning over operational and analytical data. Incrementally adoptable and built on object storage.',
    item: [
      {
        name: 'Analytics Replica',
        title: 'Real-time analytics without impacting production',
        paragraph:
          'Deploy an analytics replica in minutes for fast, isolated queries on real-time operational data.',
        cta: {
          title: 'Learn more',
          url: '/blog/the-analytics-replica-pattern-shortening-the-path-to-data-based-ai',
          target: '_blank',
        },
        media_type: 'image',
        media_image: {
          ID: 2001,
          id: 2001,
          title: 'analytics_replica_carousel',
          filename: 'analytics-replica-carousel.svg',
          filesize: 550706,
          url: '/website-assets/media/2026/07/analytics-replica-carousel.svg',
          link: '/home/analytics_replica_carousel/',
          alt: 'Spice AI analytics replica architecture overview',
          author: '6',
          description: '',
          caption: '',
          name: 'analytics_replica_carousel',
          status: 'inherit',
          uploaded_to: 2,
          date: '2026-07-29 00:00:00',
          modified: '2026-07-29 00:00:00',
          menu_order: 0,
          mime_type: 'image/svg+xml',
          type: 'image',
          subtype: 'svg+xml',
          icon: '/website-assets/media/2025/11/quote_icon.svg',
          width: 1396,
          height: 944,
          sizes: {
            thumbnail:
              '/website-assets/media/2026/07/analytics-replica-carousel.svg',
            'thumbnail-width': 150,
            'thumbnail-height': 101,
            medium:
              '/website-assets/media/2026/07/analytics-replica-carousel.svg',
            'medium-width': 300,
            'medium-height': 203,
            medium_large:
              '/website-assets/media/2026/07/analytics-replica-carousel.svg',
            'medium_large-width': 768,
            'medium_large-height': 519,
            large:
              '/website-assets/media/2026/07/analytics-replica-carousel.svg',
            'large-width': 1024,
            'large-height': 692,
            '1536x1536':
              '/website-assets/media/2026/07/analytics-replica-carousel.svg',
            '1536x1536-width': 1396,
            '1536x1536-height': 944,
            '2048x2048':
              '/website-assets/media/2026/07/analytics-replica-carousel.svg',
            '2048x2048-width': 1396,
            '2048x2048-height': 944,
          },
        },
        media_video: '',
      },
      {
        name: 'SQL Federation & Acceleration',
        title: 'Fast and federated access to all of your data',
        paragraph:
          'Connect to and query operational databases, data lakes, and warehouses across the enterprise. Materialize and accelerate working sets in-memory or on disk for millisecond access.',
        cta: {
          title: 'Learn more',
          url: '/platform/sql-federation-acceleration',
          target: '_blank',
        },
        media_type: 'image',
        media_image: {
          ID: 1334,
          id: 1334,
          title: 'federation_homepage',
          filename: 'federation-homepage.svg',
          filesize: 151939,
          url: '/website-assets/media/2026/07/federation-homepage.svg',
          link: '/home/spice_federation_homepage/',
          alt: 'Spice AI SQL federation and data acceleration architecture',
          author: '6',
          description: '',
          caption: '',
          name: 'federation_homepage',
          status: 'inherit',
          uploaded_to: 2,
          date: '2025-11-25 17:54:33',
          modified: '2025-11-25 17:54:33',
          menu_order: 0,
          mime_type: 'image/svg+xml',
          type: 'image',
          subtype: 'svg+xml',
          icon: '/website-assets/media/2025/11/quote_icon.svg',
          width: 1396,
          height: 944,
          sizes: {
            thumbnail:
              '/website-assets/media/2026/07/federation-homepage.svg',
            'thumbnail-width': 150,
            'thumbnail-height': 101,
            medium:
              '/website-assets/media/2026/07/federation-homepage.svg',
            'medium-width': 300,
            'medium-height': 203,
            medium_large:
              '/website-assets/media/2026/07/federation-homepage.svg',
            'medium_large-width': 768,
            'medium_large-height': 519,
            large:
              '/website-assets/media/2026/07/federation-homepage.svg',
            'large-width': 1024,
            'large-height': 692,
            '1536x1536':
              '/website-assets/media/2026/07/federation-homepage.svg',
            '1536x1536-width': 1396,
            '1536x1536-height': 944,
            '2048x2048':
              '/website-assets/media/2026/07/federation-homepage.svg',
            '2048x2048-width': 1396,
            '2048x2048-height': 944,
          },
        },
        media_video: '',
      },
      {
        name: 'Hybrid Search',
        title: 'Combine keyword, vector, and full-text search in SQL',
        paragraph:
          '‍Use standard SQL to power hybrid search pipelines and deliver fast and context-aware results for search-driven apps. Rank structured filters, semantic similarity, and keyword matches to optimize relevance and robustness in your search results.',
        cta: {
          title: 'Learn more',
          url: '/platform/hybrid-sql-search',
          target: '_blank',
        },
        media_type: 'image',
        media_image: {
          ID: 1335,
          id: 1335,
          title: 'hybrid_search_homepage',
          filename: 'hybrid-search-homepage.svg',
          filesize: 497554,
          url: '/website-assets/media/2026/07/hybrid-search-homepage.svg',
          link: '/home/spice_hybrid_search_homepage/',
          alt: 'Spice AI hybrid SQL search combining keyword, vector, and full-text search',
          author: '6',
          description: '',
          caption: '',
          name: 'hybrid_search_homepage',
          status: 'inherit',
          uploaded_to: 2,
          date: '2025-11-25 17:54:36',
          modified: '2025-11-25 17:54:36',
          menu_order: 0,
          mime_type: 'image/svg+xml',
          type: 'image',
          subtype: 'svg+xml',
          icon: '/website-assets/media/2025/11/quote_icon.svg',
          width: 1396,
          height: 944,
          sizes: {
            thumbnail:
              '/website-assets/media/2026/07/hybrid-search-homepage.svg',
            'thumbnail-width': 150,
            'thumbnail-height': 101,
            medium:
              '/website-assets/media/2026/07/hybrid-search-homepage.svg',
            'medium-width': 300,
            'medium-height': 203,
            medium_large:
              '/website-assets/media/2026/07/hybrid-search-homepage.svg',
            'medium_large-width': 768,
            'medium_large-height': 519,
            large:
              '/website-assets/media/2026/07/hybrid-search-homepage.svg',
            'large-width': 1024,
            'large-height': 692,
            '1536x1536':
              '/website-assets/media/2026/07/hybrid-search-homepage.svg',
            '1536x1536-width': 1396,
            '1536x1536-height': 944,
            '2048x2048':
              '/website-assets/media/2026/07/hybrid-search-homepage.svg',
            '2048x2048-width': 1396,
            '2048x2048-height': 944,
          },
        },
        media_video: '',
      },
      {
        name: 'Embedded AI Inference',
        title: 'Call LLMs directly from the query layer',
        paragraph:
          'Call hosted or local LLMs inline using SQL UDFs or natural language. Translate text, generate summaries, classify entities, and augment query results on your enterprise data without leaving the Spice runtime.',
        cta: {
          title: 'Learn more',
          url: '/platform/llm-inference',
          target: '_blank',
        },
        media_type: 'image',
        media_image: {
          ID: 1333,
          id: 1333,
          title: 'llm_inference_homepage',
          filename: 'llm-inference-homepage.svg',
          filesize: 460357,
          url: '/website-assets/media/2026/07/llm-inference-homepage.svg',
          link: '/home/embedded_ai_inference_homepage/',
          alt: 'Spice AI embedded AI inference with LLM calls from SQL',
          author: '6',
          description: '',
          caption: '',
          name: 'llm_inference_homepage',
          status: 'inherit',
          uploaded_to: 2,
          date: '2025-11-25 17:54:30',
          modified: '2025-11-25 17:54:30',
          menu_order: 0,
          mime_type: 'image/svg+xml',
          type: 'image',
          subtype: 'svg+xml',
          icon: '/website-assets/media/2025/11/quote_icon.svg',
          width: 1396,
          height: 944,
          sizes: {
            thumbnail:
              '/website-assets/media/2026/07/llm-inference-homepage.svg',
            'thumbnail-width': 150,
            'thumbnail-height': 101,
            medium:
              '/website-assets/media/2026/07/llm-inference-homepage.svg',
            'medium-width': 300,
            'medium-height': 203,
            medium_large:
              '/website-assets/media/2026/07/llm-inference-homepage.svg',
            'medium_large-width': 768,
            'medium_large-height': 519,
            large:
              '/website-assets/media/2026/07/llm-inference-homepage.svg',
            'large-width': 1024,
            'large-height': 692,
            '1536x1536':
              '/website-assets/media/2026/07/llm-inference-homepage.svg',
            '1536x1536-width': 1396,
            '1536x1536-height': 944,
            '2048x2048':
              '/website-assets/media/2026/07/llm-inference-homepage.svg',
            '2048x2048-width': 1396,
            '2048x2048-height': 944,
          },
        },
        media_video: '',
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<Testimonials
  heading="Proven in production"
  headingTag="h2"
  paragraph="From messaging platforms to security systems, companies like Twilio and Barracuda rely on Spice to deliver low-latency apps & AI agents at scale."
  items={['twilio', 'barracuda', 'nrc-tim', 'summation', 'basisset']}
/>

<HeroCenteredTextFullWidth
  fields={{
    heading: 'The data plane for enterprise AI',
    paragraph:
      'Query, combine vector and keyword search, and call models inline. The primitives agents demand from one interface.',
    cta: null,
    media_type: 'image',
    image_priority: false,
    media_image: {
      ID: 1499,
      id: 1499,
      title: 'spice_cloud_dashboard_homepage',
      filename: 'spice-cloud-dashboard-homepage.png',
      filesize: 310155,
      url: '/website-assets/media/2025/11/spice-cloud-dashboard-homepage.png',
      link: '/home/spice_cloud_dashboard_homepage/',
      alt: 'Spice Cloud dashboard showing a query result',
      author: '6',
      description: '',
      caption: '',
      name: 'spice_cloud_dashboard_homepage',
      status: 'inherit',
      uploaded_to: 2,
      date: '2025-11-27 16:59:58',
      modified: '2025-11-27 16:59:58',
      menu_order: 0,
      mime_type: 'image/png',
      type: 'image',
      subtype: 'png',
      icon: '/website-assets/media/2025/11/quote_icon.svg',
      width: 1614,
      height: 1028,
      sizes: {
        thumbnail:
          '/website-assets/media/2025/11/spice-cloud-dashboard-homepage.png',
        'thumbnail-width': 150,
        'thumbnail-height': 96,
        medium:
          '/website-assets/media/2025/11/spice-cloud-dashboard-homepage.png',
        'medium-width': 300,
        'medium-height': 191,
        medium_large:
          '/website-assets/media/2025/11/spice-cloud-dashboard-homepage.png',
        'medium_large-width': 768,
        'medium_large-height': 489,
        large:
          '/website-assets/media/2025/11/spice-cloud-dashboard-homepage.png',
        'large-width': 1024,
        'large-height': 652,
        '1536x1536':
          '/website-assets/media/2025/11/spice-cloud-dashboard-homepage.png',
        '1536x1536-width': 1536,
        '1536x1536-height': 978,
        '2048x2048':
          '/website-assets/media/2025/11/spice-cloud-dashboard-homepage.png',
        '2048x2048-width': 1614,
        '2048x2048-height': 1028,
      },
    },
    media_video: '',
  }}
/>

<ContentThreeAcrossIconTiles
  fields={{
    heading: 'Control and optionality at every layer',
    heading_tag: 'h2',
    paragraph:
      'Enable real-time, AI-driven apps on top of your existing data with the trust and scalability enterprises demand.',
    item: [
      {
        icon: {
          ID: 447,
          id: 447,
          title: 'homepage_deploy_anywhere',
          filename: 'homepage_deploy_anywhere.svg',
          filesize: 0,
          url: '/website-assets/media/2025/11/homepage_deploy_anywhere.svg',
          link: '/home/homepage_deploy_anywhere/',
          alt: 'Deploy anywhere icon',
          author: '6',
          description: '',
          caption: '',
          name: 'homepage_deploy_anywhere',
          status: 'inherit',
          uploaded_to: 2,
          date: '2025-11-05 18:51:03',
          modified: '2025-11-05 18:51:03',
          menu_order: 0,
          mime_type: 'image/svg+xml',
          type: 'image',
          subtype: 'svg+xml',
          icon: '/website-assets/media/2025/11/quote_icon.svg',
          width: 58,
          height: 48,
          sizes: {
            thumbnail:
              '/website-assets/media/2025/11/homepage_deploy_anywhere.svg',
            'thumbnail-width': 58,
            'thumbnail-height': 48,
            medium:
              '/website-assets/media/2025/11/homepage_deploy_anywhere.svg',
            'medium-width': 1,
            'medium-height': 1,
            medium_large:
              '/website-assets/media/2025/11/homepage_deploy_anywhere.svg',
            'medium_large-width': 1,
            'medium_large-height': 1,
            large: '/website-assets/media/2025/11/homepage_deploy_anywhere.svg',
            'large-width': 1,
            'large-height': 1,
            '1536x1536':
              '/website-assets/media/2025/11/homepage_deploy_anywhere.svg',
            '1536x1536-width': 1,
            '1536x1536-height': 1,
            '2048x2048':
              '/website-assets/media/2025/11/homepage_deploy_anywhere.svg',
            '2048x2048-width': 1,
            '2048x2048-height': 1,
          },
        },
        title: 'Deploy <br>anywhere',
        description:
          'Run Spice.ai Open Source locally, at the edge, or on the fully managed Spice.ai Cloud Platform. Lightweight, portable, and designed for scale.',
        cta: {
          title: 'Learn more',
          url: '/feature/edge-to-cloud-deployments',
          target: '_blank',
        },
      },
      {
        icon: {
          ID: 453,
          id: 453,
          title: 'homepage_ai_sandboxing',
          filename: 'homepage_ai_sandboxing.svg',
          filesize: 0,
          url: '/website-assets/media/2025/11/homepage_ai_sandboxing.svg',
          link: '/home/homepage_ai_sandboxing/',
          alt: 'AI sandboxing and security icon',
          author: '6',
          description: '',
          caption: '',
          name: 'homepage_ai_sandboxing',
          status: 'inherit',
          uploaded_to: 2,
          date: '2025-11-05 20:14:15',
          modified: '2025-11-05 20:14:15',
          menu_order: 0,
          mime_type: 'image/svg+xml',
          type: 'image',
          subtype: 'svg+xml',
          icon: '/website-assets/media/2025/11/quote_icon.svg',
          width: 48,
          height: 48,
          sizes: {
            thumbnail:
              '/website-assets/media/2025/11/homepage_ai_sandboxing.svg',
            'thumbnail-width': 48,
            'thumbnail-height': 48,
            medium: '/website-assets/media/2025/11/homepage_ai_sandboxing.svg',
            'medium-width': 1,
            'medium-height': 1,
            medium_large:
              '/website-assets/media/2025/11/homepage_ai_sandboxing.svg',
            'medium_large-width': 1,
            'medium_large-height': 1,
            large: '/website-assets/media/2025/11/homepage_ai_sandboxing.svg',
            'large-width': 1,
            'large-height': 1,
            '1536x1536':
              '/website-assets/media/2025/11/homepage_ai_sandboxing.svg',
            '1536x1536-width': 1,
            '1536x1536-height': 1,
            '2048x2048':
              '/website-assets/media/2025/11/homepage_ai_sandboxing.svg',
            '2048x2048-width': 1,
            '2048x2048-height': 1,
          },
        },
        title: 'AI sandboxing <br>& security',
        description:
          'Provision isolated, least-privilege datasets for apps and agents with zero direct database access. Keep governance intact while enabling RAG, agents, and AI workflows.',
        cta: {
          title: 'Learn more',
          url: '/feature/secure-ai-sandboxing',
          target: '_blank',
        },
      },
      {
        icon: {
          ID: 1041,
          id: 1041,
          title: 'homepage_distributed_observability',
          filename: 'homepage_distributed_observability.svg',
          filesize: 0,
          url: '/website-assets/media/2025/11/homepage_distributed_observability.svg',
          link: '/home/homepage_distributed_observability/',
          alt: 'Distributed observability icon',
          author: '6',
          description: '',
          caption: '',
          name: 'homepage_distributed_observability',
          status: 'inherit',
          uploaded_to: 2,
          date: '2025-11-21 15:43:03',
          modified: '2025-11-21 15:43:03',
          menu_order: 0,
          mime_type: 'image/svg+xml',
          type: 'image',
          subtype: 'svg+xml',
          icon: '/website-assets/media/2025/11/quote_icon.svg',
          width: 65,
          height: 48,
          sizes: {
            thumbnail:
              '/website-assets/media/2025/11/homepage_distributed_observability.svg',
            'thumbnail-width': 65,
            'thumbnail-height': 48,
            medium:
              '/website-assets/media/2025/11/homepage_distributed_observability.svg',
            'medium-width': 1,
            'medium-height': 1,
            medium_large:
              '/website-assets/media/2025/11/homepage_distributed_observability.svg',
            'medium_large-width': 1,
            'medium_large-height': 1,
            large:
              '/website-assets/media/2025/11/homepage_distributed_observability.svg',
            'large-width': 1,
            'large-height': 1,
            '1536x1536':
              '/website-assets/media/2025/11/homepage_distributed_observability.svg',
            '1536x1536-width': 1,
            '1536x1536-height': 1,
            '2048x2048':
              '/website-assets/media/2025/11/homepage_distributed_observability.svg',
            '2048x2048-width': 1,
            '2048x2048-height': 1,
          },
        },
        title: 'Distributed <br>observability',
        description:
          'Perform end-to-end tracing across SQL, embeddings, search, and LLM calls. Debug, measure latency, and prove ROI from a single view.',
        cta: {
          title: 'Learn more',
          url: 'https://docs.spice.ai/features/observability',
          target: '_blank',
        },
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<HomepageVideoTabs />

<ContentResourceFeatured
  fields={{
    heading: 'Get started with Spice',
    heading_tag: 'h2',
    paragraph:
      'Explore guides and examples that show how to query data, build apps, and integrate AI in minutes.',
    mode: 'default',
    resources: [
      {
        source: 'manual',
        resource: null,
        resource_manual: {
          eyebrow: 'Docs',
          title: {
            title: 'Spice.ai OSS Documentation',
            url: 'https://spiceai.org/docs',
            target: '_blank',
          },
          description:
            'Visit the Spice open-source docs to learn how Spice works under the hood.',
          image: {
            ID: 1661,
            id: 1661,
            title: 'spice_docs',
            filename: 'spice_docs.svg',
            filesize: 0,
            url: '/website-assets/media/2025/11/spice_docs.svg',
            link: '/home/spice_docs/',
            alt: 'Spice.ai OSS documentation',
            author: '9',
            description: '',
            caption: '',
            name: 'spice_docs',
            status: 'inherit',
            uploaded_to: 0,
            date: '2025-12-05 04:13:53',
            modified: '2025-12-05 04:13:53',
            menu_order: 0,
            mime_type: 'image/svg+xml',
            type: 'image',
            subtype: 'svg+xml',
            icon: '/website-assets/media/2025/11/quote_icon.svg',
            width: 374,
            height: 210,
            sizes: {
              thumbnail: '/website-assets/media/2025/11/spice_docs.svg',
              'thumbnail-width': 374,
              'thumbnail-height': 210,
              medium: '/website-assets/media/2025/11/spice_docs.svg',
              'medium-width': 1,
              'medium-height': 1,
              medium_large: '/website-assets/media/2025/11/spice_docs.svg',
              'medium_large-width': 1,
              'medium_large-height': 1,
              large: '/website-assets/media/2025/11/spice_docs.svg',
              'large-width': 1,
              'large-height': 1,
              '1536x1536': '/website-assets/media/2025/11/spice_docs.svg',
              '1536x1536-width': 1,
              '1536x1536-height': 1,
              '2048x2048': '/website-assets/media/2025/11/spice_docs.svg',
              '2048x2048-width': 1,
              '2048x2048-height': 1,
            },
          },
        },
      },
      {
        source: 'manual',
        resource: null,
        resource_manual: {
          eyebrow: 'Recipes',
          title: {
            title: 'Spice.ai OSS Cookbook',
            url: '/cookbook',
            target: '_blank',
          },
          description:
            'Over 80 guides and samples to help you build data-grounded AI apps and agents with Spice.',
          image: {
            ID: 1659,
            id: 1659,
            title: 'spice_cookbook',
            filename: 'spice_cookbook.svg',
            filesize: 0,
            url: '/website-assets/media/2025/11/spice_cookbook.svg',
            link: '/home/spice_cookbook/',
            alt: 'Spice.ai OSS cookbook and recipes',
            author: '9',
            description: '',
            caption: '',
            name: 'spice_cookbook',
            status: 'inherit',
            uploaded_to: 0,
            date: '2025-12-05 04:13:34',
            modified: '2025-12-05 04:13:34',
            menu_order: 0,
            mime_type: 'image/svg+xml',
            type: 'image',
            subtype: 'svg+xml',
            icon: '/website-assets/media/2025/11/quote_icon.svg',
            width: 374,
            height: 210,
            sizes: {
              thumbnail: '/website-assets/media/2025/11/spice_cookbook.svg',
              'thumbnail-width': 374,
              'thumbnail-height': 210,
              medium: '/website-assets/media/2025/11/spice_cookbook.svg',
              'medium-width': 1,
              'medium-height': 1,
              medium_large: '/website-assets/media/2025/11/spice_cookbook.svg',
              'medium_large-width': 1,
              'medium_large-height': 1,
              large: '/website-assets/media/2025/11/spice_cookbook.svg',
              'large-width': 1,
              'large-height': 1,
              '1536x1536': '/website-assets/media/2025/11/spice_cookbook.svg',
              '1536x1536-width': 1,
              '1536x1536-height': 1,
              '2048x2048': '/website-assets/media/2025/11/spice_cookbook.svg',
              '2048x2048-width': 1,
              '2048x2048-height': 1,
            },
          },
        },
      },
      {
        source: 'manual',
        resource: null,
        resource_manual: {
          eyebrow: 'Demos',
          title: {
            title: 'Product Demos',
            url: 'https://www.youtube.com/playlist?list=PLesJrUXEx3U-dQul0PqLV3TGTdUmr3B6e',
            target: '_blank',
          },
          description:
            'Hands-on product demos to accelerate your learning with Spice.',
          image: {
            ID: 1660,
            id: 1660,
            title: 'spice_demos',
            filename: 'spice_demos.svg',
            filesize: 0,
            url: '/website-assets/media/2025/11/spice_demos.svg',
            link: '/home/spice_demos/',
            alt: 'Spice.ai product demos',
            author: '9',
            description: '',
            caption: '',
            name: 'spice_demos',
            status: 'inherit',
            uploaded_to: 0,
            date: '2025-12-05 04:13:51',
            modified: '2025-12-05 04:13:51',
            menu_order: 0,
            mime_type: 'image/svg+xml',
            type: 'image',
            subtype: 'svg+xml',
            icon: '/website-assets/media/2025/11/quote_icon.svg',
            width: 374,
            height: 210,
            sizes: {
              thumbnail: '/website-assets/media/2025/11/spice_demos.svg',
              'thumbnail-width': 374,
              'thumbnail-height': 210,
              medium: '/website-assets/media/2025/11/spice_demos.svg',
              'medium-width': 1,
              'medium-height': 1,
              medium_large: '/website-assets/media/2025/11/spice_demos.svg',
              'medium_large-width': 1,
              'medium_large-height': 1,
              large: '/website-assets/media/2025/11/spice_demos.svg',
              'large-width': 1,
              'large-height': 1,
              '1536x1536': '/website-assets/media/2025/11/spice_demos.svg',
              '1536x1536-width': 1,
              '1536x1536-height': 1,
              '2048x2048': '/website-assets/media/2025/11/spice_demos.svg',
              '2048x2048-width': 1,
              '2048x2048-height': 1,
            },
          },
        },
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<TalkToAnEngineerCta />

---

## Cybersecurity
URL: https://spice.ai/industry/cybersecurity
Date: 2025-11-21T22:02:05
Description: Build fast, reliable, and intelligent cybersecurity applications. Spice delivers unified data access, real-time performance, and embedded AI integration across any environment.

<HeroTextImageFiftyFifty
  fields={{
    variant: 'variant-1',
    eyebrow: 'Cybersecurity',
    heading_tag: 'h1',
    heading: 'Build high-performance cybersecurity applications',
    paragraph:
      'Spice provides the data and AI foundation for modern security solutions-combining federated access, acceleration, and resilience for low-latency, high-trust systems.',
    cta: [
      {
        type: 'filled',
        cta: {
          title: 'Get a demo',
          url: 'https://meetings.hubspot.com/vladi-semenov',
          target: '_blank',
        },
      },
      {
        type: 'bordered',
        cta: {
          title: 'View the docs',
          url: 'https://spiceai.org/docs',
          target: '_blank',
        },
      },
    ],
    media_type: 'image',
    media_image: {
      ID: 1629,
      id: 1629,
      title: 'industry_cybersecurity_header',
      filename: 'industry_cybersecurity_header.png',
      filesize: 165552,
      url: '/website-assets/media/2025/12/industry_cybersecurity_header.png',
      link: '/industry/cybersecurity/attachment/industry_cybersecurity_header/',
      alt: '',
      author: '6',
      description: '',
      caption: '',
      name: 'industry_cybersecurity_header',
      status: 'inherit',
      uploaded_to: 1113,
      date: '2025-12-03 00:23:53',
      modified: '2025-12-03 00:23:53',
      menu_order: 0,
      mime_type: 'image/png',
      type: 'image',
      subtype: 'png',
      icon: '/website-assets/media/default.png',
      width: 1360,
      height: 656,
      sizes: {
        thumbnail:
          '/website-assets/media/2025/12/industry_cybersecurity_header.png',
        'thumbnail-width': 150,
        'thumbnail-height': 150,
        medium:
          '/website-assets/media/2025/12/industry_cybersecurity_header.png',
        'medium-width': 300,
        'medium-height': 145,
        medium_large:
          '/website-assets/media/2025/12/industry_cybersecurity_header.png',
        'medium_large-width': 768,
        'medium_large-height': 370,
        large:
          '/website-assets/media/2025/12/industry_cybersecurity_header.png',
        'large-width': 1024,
        'large-height': 494,
        '1536x1536':
          '/website-assets/media/2025/12/industry_cybersecurity_header.png',
        '1536x1536-width': 1360,
        '1536x1536-height': 656,
        '2048x2048':
          '/website-assets/media/2025/12/industry_cybersecurity_header.png',
        '2048x2048-width': 1360,
        '2048x2048-height': 656,
      },
    },
    media_video: '',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<ContentStats
  fields={{
    heading: 'Do more with your data',
    heading_tag: 'h2',
    stats: [
      {
        media_type: 'image',
        image: false,
        lottie: false,
        amount: '100',
        suffix: 'x',
        after_text: 'up to 100x faster queries',
      },
      {
        media_type: 'image',
        image: false,
        lottie: false,
        amount: '80',
        suffix: '%',
        after_text: 'up to 80% cost savings on data lakehouse spend',
      },
      {
        media_type: 'image',
        image: false,
        lottie: false,
        amount: '2',
        suffix: 'x',
        after_text: 'increase in data reliability for critical workloads',
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<ContentImageVideo
  fields={{
    variant: 'variant-2',
    heading: 'Security apps demand more from their data layer',
    heading_tag: 'h2',
    paragraph:
      'Security platforms rely on constant streams of telemetry, logs, and threat data. Traditional databases and pipelines introduce latency, complexity, and cost. These systems struggle to maintain performance under heavy workloads or network failures. Developers need a unified, resilient data runtime to power AI-driven insights and real-time analysis without operational friction.',
    cta: false,
    media_type: 'image',
    media_image: {
      ID: 1048,
      id: 1048,
      title: 'use_case_challenge',
      filename: 'use_case_challenge.png',
      filesize: 4349638,
      url: '/website-assets/media/2025/11/use_case_challenge.png',
      link: '/industry/cybersecurity/attachment/use_case_challenge/',
      alt: '',
      author: '6',
      description: '',
      caption: '',
      name: 'use_case_challenge',
      status: 'inherit',
      uploaded_to: 1113,
      date: '2025-11-21 16:21:07',
      modified: '2025-11-21 16:21:07',
      menu_order: 0,
      mime_type: 'image/png',
      type: 'image',
      subtype: 'png',
      icon: '/website-assets/media/default.png',
      width: 2720,
      height: 1824,
      sizes: {
        thumbnail: '/website-assets/media/2025/11/use_case_challenge.png',
        'thumbnail-width': 150,
        'thumbnail-height': 150,
        medium: '/website-assets/media/2025/11/use_case_challenge.png',
        'medium-width': 300,
        'medium-height': 201,
        medium_large: '/website-assets/media/2025/11/use_case_challenge.png',
        'medium_large-width': 768,
        'medium_large-height': 515,
        large: '/website-assets/media/2025/11/use_case_challenge.png',
        'large-width': 1024,
        'large-height': 687,
        '1536x1536': '/website-assets/media/2025/11/use_case_challenge.png',
        '1536x1536-width': 1536,
        '1536x1536-height': 1030,
        '2048x2048': '/website-assets/media/2025/11/use_case_challenge.png',
        '2048x2048-width': 2048,
        '2048x2048-height': 1373,
      },
    },
    graphic_overlay: false,
    media_video: '',
    padding_top: 'st-lg',
    padding_bottom: 'sb-lg',
  }}
/>

<AccordionImageCopy
  fields={{
    heading: 'A query engine built for secure, high-scale workloads',
    heading_tag: 'h2',
    paragraph:
      'Unify, accelerate, and govern your data for reliable, low-latency operations.',
    is_single_image: true,
    feature_image: {
      ID: 1630,
      id: 1630,
      title: 'industry_cybersecurity_built_for_scale_2',
      filename: 'industry_cybersecurity_built_for_scale_2.png',
      filesize: 237262,
      url: '/website-assets/media/2025/12/industry_cybersecurity_built_for_scale_2.png',
      link: '/industry/cybersecurity/attachment/industry_cybersecurity_built_for_scale_2/',
      alt: '',
      author: '6',
      description: '',
      caption: '',
      name: 'industry_cybersecurity_built_for_scale_2',
      status: 'inherit',
      uploaded_to: 1113,
      date: '2025-12-03 00:23:55',
      modified: '2025-12-03 00:23:55',
      menu_order: 0,
      mime_type: 'image/png',
      type: 'image',
      subtype: 'png',
      icon: '/website-assets/media/default.png',
      width: 1388,
      height: 1404,
      sizes: {
        thumbnail:
          '/website-assets/media/2025/12/industry_cybersecurity_built_for_scale_2.png',
        'thumbnail-width': 150,
        'thumbnail-height': 150,
        medium:
          '/website-assets/media/2025/12/industry_cybersecurity_built_for_scale_2.png',
        'medium-width': 300,
        'medium-height': 303,
        medium_large:
          '/website-assets/media/2025/12/industry_cybersecurity_built_for_scale_2.png',
        'medium_large-width': 768,
        'medium_large-height': 777,
        large:
          '/website-assets/media/2025/12/industry_cybersecurity_built_for_scale_2.png',
        'large-width': 1024,
        'large-height': 1036,
        '1536x1536':
          '/website-assets/media/2025/12/industry_cybersecurity_built_for_scale_2.png',
        '1536x1536-width': 1388,
        '1536x1536-height': 1404,
        '2048x2048':
          '/website-assets/media/2025/12/industry_cybersecurity_built_for_scale_2.png',
        '2048x2048-width': 1388,
        '2048x2048-height': 1404,
      },
    },
    items: [
      {
        title: 'Low-latency data acceleration',
        description:
          'Spice materializes frequently accessed data close to your application for instant reads, faster analytics, and predictable performance.',
        image: false,
      },
      {
        title: 'Resilient and distributed',
        description:
          'Run Spice at the edge, in the cloud, or in hybrid deployments to maintain continuous access even during network disruptions or provider outages.',
        image: false,
      },
      {
        title: 'Unified data access',
        description:
          'Query data across logs, object storage, and analytical systems in real time. Simplify architecture and remove complex ingestion and transformation pipelines.',
        image: false,
      },
      {
        title: 'AI-ready and auditable',
        description:
          'Integrate LLMs and vector search directly within the runtime for intelligent detection, triage, or reporting. Every query and inference is traceable and governed.',
        image: false,
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<ContentThreeAcrossIconText
  fields={{
    heading: 'The data and AI runtime for modern security applications.',
    heading_tag: 'h2',
    paragraph:
      'Spice powers fast, resilient, and intelligent security applications with unified access, built-in acceleration, and enterprise-grade governance.',
    items: [
      {
        icon: {
          ID: 1119,
          id: 1119,
          title: 'Industry_Cybersecurity_Enterprise-Grade Performance',
          filename: 'Industry_Cybersecurity_Enterprise-Grade-Performance.svg',
          filesize: 7423,
          url: '/website-assets/media/2025/11/Industry_Cybersecurity_Enterprise-Grade-Performance.svg',
          link: '/industry/cybersecurity/attachment/industry_cybersecurity_enterprise-grade-performance/',
          alt: '',
          author: '6',
          description: '',
          caption: '',
          name: 'industry_cybersecurity_enterprise-grade-performance',
          status: 'inherit',
          uploaded_to: 1113,
          date: '2025-11-21 22:06:22',
          modified: '2025-11-21 22:06:22',
          menu_order: 0,
          mime_type: 'image/svg+xml',
          type: 'image',
          subtype: 'svg+xml',
          icon: '/website-assets/media/default.png',
          width: 0,
          height: 0,
          sizes: {
            thumbnail:
              '/website-assets/media/2025/11/Industry_Cybersecurity_Enterprise-Grade-Performance.svg',
            'thumbnail-width': 1,
            'thumbnail-height': 1,
            medium:
              '/website-assets/media/2025/11/Industry_Cybersecurity_Enterprise-Grade-Performance.svg',
            'medium-width': 1,
            'medium-height': 1,
            medium_large:
              '/website-assets/media/2025/11/Industry_Cybersecurity_Enterprise-Grade-Performance.svg',
            'medium_large-width': 1,
            'medium_large-height': 1,
            large:
              '/website-assets/media/2025/11/Industry_Cybersecurity_Enterprise-Grade-Performance.svg',
            'large-width': 1,
            'large-height': 1,
            '1536x1536':
              '/website-assets/media/2025/11/Industry_Cybersecurity_Enterprise-Grade-Performance.svg',
            '1536x1536-width': 1,
            '1536x1536-height': 1,
            '2048x2048':
              '/website-assets/media/2025/11/Industry_Cybersecurity_Enterprise-Grade-Performance.svg',
            '2048x2048-width': 1,
            '2048x2048-height': 1,
          },
        },
        title: 'Enterprise-Grade Performance',
        description:
          'Query and serve results in milliseconds for real-time detection and response.',
      },
      {
        icon: {
          ID: 1121,
          id: 1121,
          title: 'Industry_Cybersecurity_Resilience at Scale-1',
          filename: 'Industry_Cybersecurity_Resilience-at-Scale-1.svg',
          filesize: 7759,
          url: '/website-assets/media/2025/11/Industry_Cybersecurity_Resilience-at-Scale-1.svg',
          link: '/industry/cybersecurity/attachment/industry_cybersecurity_resilience-at-scale-1/',
          alt: '',
          author: '6',
          description: '',
          caption: '',
          name: 'industry_cybersecurity_resilience-at-scale-1',
          status: 'inherit',
          uploaded_to: 1113,
          date: '2025-11-21 22:06:23',
          modified: '2025-11-21 22:06:23',
          menu_order: 0,
          mime_type: 'image/svg+xml',
          type: 'image',
          subtype: 'svg+xml',
          icon: '/website-assets/media/default.png',
          width: 0,
          height: 0,
          sizes: {
            thumbnail:
              '/website-assets/media/2025/11/Industry_Cybersecurity_Resilience-at-Scale-1.svg',
            'thumbnail-width': 1,
            'thumbnail-height': 1,
            medium:
              '/website-assets/media/2025/11/Industry_Cybersecurity_Resilience-at-Scale-1.svg',
            'medium-width': 1,
            'medium-height': 1,
            medium_large:
              '/website-assets/media/2025/11/Industry_Cybersecurity_Resilience-at-Scale-1.svg',
            'medium_large-width': 1,
            'medium_large-height': 1,
            large:
              '/website-assets/media/2025/11/Industry_Cybersecurity_Resilience-at-Scale-1.svg',
            'large-width': 1,
            'large-height': 1,
            '1536x1536':
              '/website-assets/media/2025/11/Industry_Cybersecurity_Resilience-at-Scale-1.svg',
            '1536x1536-width': 1,
            '1536x1536-height': 1,
            '2048x2048':
              '/website-assets/media/2025/11/Industry_Cybersecurity_Resilience-at-Scale-1.svg',
            '2048x2048-width': 1,
            '2048x2048-height': 1,
          },
        },
        title: 'Resilience at Scale',
        description:
          'Edge and distributed deployments ensure uptime even under adverse conditions.',
      },
      {
        icon: {
          ID: 1122,
          id: 1122,
          title: 'Industry_Cybersecurity_Resilience at Scale',
          filename: 'Industry_Cybersecurity_Resilience-at-Scale.svg',
          filesize: 3027,
          url: '/website-assets/media/2025/11/Industry_Cybersecurity_Resilience-at-Scale.svg',
          link: '/industry/cybersecurity/attachment/industry_cybersecurity_resilience-at-scale/',
          alt: '',
          author: '6',
          description: '',
          caption: '',
          name: 'industry_cybersecurity_resilience-at-scale',
          status: 'inherit',
          uploaded_to: 1113,
          date: '2025-11-21 22:06:24',
          modified: '2025-11-21 22:06:24',
          menu_order: 0,
          mime_type: 'image/svg+xml',
          type: 'image',
          subtype: 'svg+xml',
          icon: '/website-assets/media/default.png',
          width: 0,
          height: 0,
          sizes: {
            thumbnail:
              '/website-assets/media/2025/11/Industry_Cybersecurity_Resilience-at-Scale.svg',
            'thumbnail-width': 1,
            'thumbnail-height': 1,
            medium:
              '/website-assets/media/2025/11/Industry_Cybersecurity_Resilience-at-Scale.svg',
            'medium-width': 1,
            'medium-height': 1,
            medium_large:
              '/website-assets/media/2025/11/Industry_Cybersecurity_Resilience-at-Scale.svg',
            'medium_large-width': 1,
            'medium_large-height': 1,
            large:
              '/website-assets/media/2025/11/Industry_Cybersecurity_Resilience-at-Scale.svg',
            'large-width': 1,
            'large-height': 1,
            '1536x1536':
              '/website-assets/media/2025/11/Industry_Cybersecurity_Resilience-at-Scale.svg',
            '1536x1536-width': 1,
            '1536x1536-height': 1,
            '2048x2048':
              '/website-assets/media/2025/11/Industry_Cybersecurity_Resilience-at-Scale.svg',
            '2048x2048-width': 1,
            '2048x2048-height': 1,
          },
        },
        title: 'Modern SQL Federation',
        description:
          'Federate data from object stores, warehouses, and databases with zero ETL.',
      },
      {
        icon: {
          ID: 1120,
          id: 1120,
          title: 'Industry_Cybersecurity_Governed and Secure',
          filename: 'Industry_Cybersecurity_Governed-and-Secure.svg',
          filesize: 5573,
          url: '/website-assets/media/2025/11/Industry_Cybersecurity_Governed-and-Secure.svg',
          link: '/industry/cybersecurity/attachment/industry_cybersecurity_governed-and-secure/',
          alt: '',
          author: '6',
          description: '',
          caption: '',
          name: 'industry_cybersecurity_governed-and-secure',
          status: 'inherit',
          uploaded_to: 1113,
          date: '2025-11-21 22:06:22',
          modified: '2025-11-21 22:06:22',
          menu_order: 0,
          mime_type: 'image/svg+xml',
          type: 'image',
          subtype: 'svg+xml',
          icon: '/website-assets/media/default.png',
          width: 0,
          height: 0,
          sizes: {
            thumbnail:
              '/website-assets/media/2025/11/Industry_Cybersecurity_Governed-and-Secure.svg',
            'thumbnail-width': 1,
            'thumbnail-height': 1,
            medium:
              '/website-assets/media/2025/11/Industry_Cybersecurity_Governed-and-Secure.svg',
            'medium-width': 1,
            'medium-height': 1,
            medium_large:
              '/website-assets/media/2025/11/Industry_Cybersecurity_Governed-and-Secure.svg',
            'medium_large-width': 1,
            'medium_large-height': 1,
            large:
              '/website-assets/media/2025/11/Industry_Cybersecurity_Governed-and-Secure.svg',
            'large-width': 1,
            'large-height': 1,
            '1536x1536':
              '/website-assets/media/2025/11/Industry_Cybersecurity_Governed-and-Secure.svg',
            '1536x1536-width': 1,
            '1536x1536-height': 1,
            '2048x2048':
              '/website-assets/media/2025/11/Industry_Cybersecurity_Governed-and-Secure.svg',
            '2048x2048-width': 1,
            '2048x2048-height': 1,
          },
        },
        title: 'Governed and Secure',
        description:
          'Native authentication, encryption, and audit logging built into every query.',
      },
      {
        icon: {
          ID: 1117,
          id: 1117,
          title: 'Industry_Cybersecurity_AI-Enabled Insights',
          filename: 'Industry_Cybersecurity_AI-Enabled-Insights.svg',
          filesize: 20773,
          url: '/website-assets/media/2025/11/Industry_Cybersecurity_AI-Enabled-Insights.svg',
          link: '/industry/cybersecurity/attachment/industry_cybersecurity_ai-enabled-insights/',
          alt: '',
          author: '6',
          description: '',
          caption: '',
          name: 'industry_cybersecurity_ai-enabled-insights',
          status: 'inherit',
          uploaded_to: 1113,
          date: '2025-11-21 22:06:20',
          modified: '2025-11-21 22:06:20',
          menu_order: 0,
          mime_type: 'image/svg+xml',
          type: 'image',
          subtype: 'svg+xml',
          icon: '/website-assets/media/default.png',
          width: 0,
          height: 0,
          sizes: {
            thumbnail:
              '/website-assets/media/2025/11/Industry_Cybersecurity_AI-Enabled-Insights.svg',
            'thumbnail-width': 1,
            'thumbnail-height': 1,
            medium:
              '/website-assets/media/2025/11/Industry_Cybersecurity_AI-Enabled-Insights.svg',
            'medium-width': 1,
            'medium-height': 1,
            medium_large:
              '/website-assets/media/2025/11/Industry_Cybersecurity_AI-Enabled-Insights.svg',
            'medium_large-width': 1,
            'medium_large-height': 1,
            large:
              '/website-assets/media/2025/11/Industry_Cybersecurity_AI-Enabled-Insights.svg',
            'large-width': 1,
            'large-height': 1,
            '1536x1536':
              '/website-assets/media/2025/11/Industry_Cybersecurity_AI-Enabled-Insights.svg',
            '1536x1536-width': 1,
            '1536x1536-height': 1,
            '2048x2048':
              '/website-assets/media/2025/11/Industry_Cybersecurity_AI-Enabled-Insights.svg',
            '2048x2048-width': 1,
            '2048x2048-height': 1,
          },
        },
        title: 'AI-Enabled Insights',
        description:
          'Built-in hybrid search and inference capabilities for contextual analysis.',
      },
      {
        icon: {
          ID: 1118,
          id: 1118,
          title: 'Industry_Cybersecurity_Developer-First Design',
          filename: 'Industry_Cybersecurity_Developer-First-Design.svg',
          filesize: 5090,
          url: '/website-assets/media/2025/11/Industry_Cybersecurity_Developer-First-Design.svg',
          link: '/industry/cybersecurity/attachment/industry_cybersecurity_developer-first-design/',
          alt: '',
          author: '6',
          description: '',
          caption: '',
          name: 'industry_cybersecurity_developer-first-design',
          status: 'inherit',
          uploaded_to: 1113,
          date: '2025-11-21 22:06:21',
          modified: '2025-11-21 22:06:21',
          menu_order: 0,
          mime_type: 'image/svg+xml',
          type: 'image',
          subtype: 'svg+xml',
          icon: '/website-assets/media/default.png',
          width: 0,
          height: 0,
          sizes: {
            thumbnail:
              '/website-assets/media/2025/11/Industry_Cybersecurity_Developer-First-Design.svg',
            'thumbnail-width': 1,
            'thumbnail-height': 1,
            medium:
              '/website-assets/media/2025/11/Industry_Cybersecurity_Developer-First-Design.svg',
            'medium-width': 1,
            'medium-height': 1,
            medium_large:
              '/website-assets/media/2025/11/Industry_Cybersecurity_Developer-First-Design.svg',
            'medium_large-width': 1,
            'medium_large-height': 1,
            large:
              '/website-assets/media/2025/11/Industry_Cybersecurity_Developer-First-Design.svg',
            'large-width': 1,
            'large-height': 1,
            '1536x1536':
              '/website-assets/media/2025/11/Industry_Cybersecurity_Developer-First-Design.svg',
            '1536x1536-width': 1,
            '1536x1536-height': 1,
            '2048x2048':
              '/website-assets/media/2025/11/Industry_Cybersecurity_Developer-First-Design.svg',
            '2048x2048-width': 1,
            '2048x2048-height': 1,
          },
        },
        title: 'Deployment Flexibility',
        description:
          'Deploy Spice as a sidecar, cluster, or managed service, wherever your app runs. ',
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<Testimonials
  heading="Deployed in production"
  headingTag="h2"
  paragraph="Run data-intensive workloads on a high-performance engine trusted by teams building real-time systems at scale."
  items={['barracuda', 'twilio', 'nrc-tim']}
/>

<CarouselLogos
  fields={{
    heading: 'Trusted by global enterprises',
    logos: [
      {
        logo: {
          ID: 443,
          id: 443,
          title: 'Homepage_Logos_Twilio',
          filename: 'Homepage_Logos_Twilio-1.svg',
          filesize: 4020,
          url: '/website-assets/media/2025/11/Homepage_Logos_Twilio-1.svg',
          link: '/home/homepage_logos_twilio-2/',
          alt: 'Twilio logo',
          author: '6',
          description: '',
          caption: '',
          name: 'homepage_logos_twilio-2',
          status: 'inherit',
          uploaded_to: 2,
          date: '2025-11-05 18:46:45',
          modified: '2025-11-05 18:46:45',
          menu_order: 0,
          mime_type: 'image/svg+xml',
          type: 'image',
          subtype: 'svg+xml',
          icon: '/website-assets/media/default.png',
          width: 0,
          height: 0,
          sizes: {
            thumbnail:
              '/website-assets/media/2025/11/Homepage_Logos_Twilio-1.svg',
            'thumbnail-width': 1,
            'thumbnail-height': 1,
            medium: '/website-assets/media/2025/11/Homepage_Logos_Twilio-1.svg',
            'medium-width': 1,
            'medium-height': 1,
            medium_large:
              '/website-assets/media/2025/11/Homepage_Logos_Twilio-1.svg',
            'medium_large-width': 1,
            'medium_large-height': 1,
            large: '/website-assets/media/2025/11/Homepage_Logos_Twilio-1.svg',
            'large-width': 1,
            'large-height': 1,
            '1536x1536':
              '/website-assets/media/2025/11/Homepage_Logos_Twilio-1.svg',
            '1536x1536-width': 1,
            '1536x1536-height': 1,
            '2048x2048':
              '/website-assets/media/2025/11/Homepage_Logos_Twilio-1.svg',
            '2048x2048-width': 1,
            '2048x2048-height': 1,
          },
        },
      },
      {
        logo: {
          ID: 442,
          id: 442,
          title: 'Homepage_Logos_NRC',
          filename: 'Homepage_Logos_NRC-1.svg',
          filesize: 1030,
          url: '/website-assets/media/2025/11/Homepage_Logos_NRC-1.svg',
          link: '/home/homepage_logos_nrc-2/',
          alt: 'NRC Health logo',
          author: '6',
          description: '',
          caption: '',
          name: 'homepage_logos_nrc-2',
          status: 'inherit',
          uploaded_to: 2,
          date: '2025-11-05 18:46:45',
          modified: '2025-11-05 18:46:45',
          menu_order: 0,
          mime_type: 'image/svg+xml',
          type: 'image',
          subtype: 'svg+xml',
          icon: '/website-assets/media/default.png',
          width: 0,
          height: 0,
          sizes: {
            thumbnail: '/website-assets/media/2025/11/Homepage_Logos_NRC-1.svg',
            'thumbnail-width': 1,
            'thumbnail-height': 1,
            medium: '/website-assets/media/2025/11/Homepage_Logos_NRC-1.svg',
            'medium-width': 1,
            'medium-height': 1,
            medium_large:
              '/website-assets/media/2025/11/Homepage_Logos_NRC-1.svg',
            'medium_large-width': 1,
            'medium_large-height': 1,
            large: '/website-assets/media/2025/11/Homepage_Logos_NRC-1.svg',
            'large-width': 1,
            'large-height': 1,
            '1536x1536':
              '/website-assets/media/2025/11/Homepage_Logos_NRC-1.svg',
            '1536x1536-width': 1,
            '1536x1536-height': 1,
            '2048x2048':
              '/website-assets/media/2025/11/Homepage_Logos_NRC-1.svg',
            '2048x2048-width': 1,
            '2048x2048-height': 1,
          },
        },
      },
      {
        logo: {
          ID: 441,
          id: 441,
          title: 'Homepage_Logos_BasisSet',
          filename: 'Homepage_Logos_BasisSet-1.svg',
          filesize: 2629,
          url: '/website-assets/media/2025/11/Homepage_Logos_BasisSet-1.svg',
          link: '/home/homepage_logos_basisset-2/',
          alt: 'Basis Set Ventures logo',
          author: '6',
          description: '',
          caption: '',
          name: 'homepage_logos_basisset-2',
          status: 'inherit',
          uploaded_to: 2,
          date: '2025-11-05 18:46:45',
          modified: '2025-11-05 18:46:45',
          menu_order: 0,
          mime_type: 'image/svg+xml',
          type: 'image',
          subtype: 'svg+xml',
          icon: '/website-assets/media/default.png',
          width: 0,
          height: 0,
          sizes: {
            thumbnail:
              '/website-assets/media/2025/11/Homepage_Logos_BasisSet-1.svg',
            'thumbnail-width': 1,
            'thumbnail-height': 1,
            medium:
              '/website-assets/media/2025/11/Homepage_Logos_BasisSet-1.svg',
            'medium-width': 1,
            'medium-height': 1,
            medium_large:
              '/website-assets/media/2025/11/Homepage_Logos_BasisSet-1.svg',
            'medium_large-width': 1,
            'medium_large-height': 1,
            large:
              '/website-assets/media/2025/11/Homepage_Logos_BasisSet-1.svg',
            'large-width': 1,
            'large-height': 1,
            '1536x1536':
              '/website-assets/media/2025/11/Homepage_Logos_BasisSet-1.svg',
            '1536x1536-width': 1,
            '1536x1536-height': 1,
            '2048x2048':
              '/website-assets/media/2025/11/Homepage_Logos_BasisSet-1.svg',
            '2048x2048-width': 1,
            '2048x2048-height': 1,
          },
        },
      },
      {
        logo: {
          ID: 440,
          id: 440,
          title: 'Homepage_Logos_Barracuda',
          filename: 'Homepage_Logos_Barracuda-1.svg',
          filesize: 7450,
          url: '/website-assets/media/2025/11/Homepage_Logos_Barracuda-1.svg',
          link: '/home/homepage_logos_barracuda-2/',
          alt: 'Barracuda Networks logo',
          author: '6',
          description: '',
          caption: '',
          name: 'homepage_logos_barracuda-2',
          status: 'inherit',
          uploaded_to: 2,
          date: '2025-11-05 18:46:45',
          modified: '2025-11-05 18:46:45',
          menu_order: 0,
          mime_type: 'image/svg+xml',
          type: 'image',
          subtype: 'svg+xml',
          icon: '/website-assets/media/default.png',
          width: 0,
          height: 0,
          sizes: {
            thumbnail:
              '/website-assets/media/2025/11/Homepage_Logos_Barracuda-1.svg',
            'thumbnail-width': 1,
            'thumbnail-height': 1,
            medium:
              '/website-assets/media/2025/11/Homepage_Logos_Barracuda-1.svg',
            'medium-width': 1,
            'medium-height': 1,
            medium_large:
              '/website-assets/media/2025/11/Homepage_Logos_Barracuda-1.svg',
            'medium_large-width': 1,
            'medium_large-height': 1,
            large:
              '/website-assets/media/2025/11/Homepage_Logos_Barracuda-1.svg',
            'large-width': 1,
            'large-height': 1,
            '1536x1536':
              '/website-assets/media/2025/11/Homepage_Logos_Barracuda-1.svg',
            '1536x1536-width': 1,
            '1536x1536-height': 1,
            '2048x2048':
              '/website-assets/media/2025/11/Homepage_Logos_Barracuda-1.svg',
            '2048x2048-width': 1,
            '2048x2048-height': 1,
          },
        },
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<ContentResourceFeatured
  fields={{
    heading: 'Build more scalable security apps',
    heading_tag: 'h2',
    paragraph: 'Guides and examples to learn more about building with Spice.',
    mode: 'default',
    resources: [
      {
        source: 'manual',
        resource: null,
        resource_manual: {
          eyebrow: 'Recipe',
          title: {
            title: 'Intelligent Security Copilot Cookbook',
            url: 'https://github.com/spiceai/cookbook/blob/trunk/guides/security-analyzer/README.md',
            target: '_blank',
          },
          description:
            'Follow this step-by-step recipe to stream query logs into Spice, apply AI-driven pattern analysis, and surface alerts for suspicious database activity.',
          image: {
            ID: 1659,
            id: 1659,
            title: 'cookbooks jpeg',
            filename: 'cookbooks-jpeg.png',
            filesize: 2171698,
            url: '/website-assets/media/2025/12/cookbooks-jpeg.png',
            link: '/cookbooks-jpeg/',
            alt: '',
            author: '9',
            description: '',
            caption: '',
            name: 'cookbooks-jpeg',
            status: 'inherit',
            uploaded_to: 0,
            date: '2025-12-05 04:13:34',
            modified: '2025-12-05 04:13:34',
            menu_order: 0,
            mime_type: 'image/png',
            type: 'image',
            subtype: 'png',
            icon: '/website-assets/media/default.png',
            width: 1832,
            height: 1036,
            sizes: {
              thumbnail:
                '/website-assets/media/2025/12/cookbooks-jpeg-150x150.png',
              'thumbnail-width': 150,
              'thumbnail-height': 150,
              medium:
                '/website-assets/media/2025/12/cookbooks-jpeg-300x170.png',
              'medium-width': 300,
              'medium-height': 170,
              medium_large:
                '/website-assets/media/2025/12/cookbooks-jpeg-768x434.png',
              'medium_large-width': 768,
              'medium_large-height': 434,
              large:
                '/website-assets/media/2025/12/cookbooks-jpeg-1024x579.png',
              'large-width': 1024,
              'large-height': 579,
              '1536x1536':
                '/website-assets/media/2025/12/cookbooks-jpeg-1536x869.png',
              '1536x1536-width': 1536,
              '1536x1536-height': 869,
              '2048x2048': '/website-assets/media/2025/12/cookbooks-jpeg.png',
              '2048x2048-width': 1832,
              '2048x2048-height': 1036,
            },
          },
        },
      },
      {
        source: 'manual',
        resource: null,
        resource_manual: {
          eyebrow: 'Recipe',
          title: {
            title: 'Data Retention Policy Cookbook',
            url: 'https://github.com/spiceai/cookbook/blob/trunk/retention/README.md',
            target: '_blank',
          },
          description:
            'This recipe shows how to set up a retention policy for an accelerated dataset to evict data older than a specified duration.',
          image: {
            ID: 1659,
            id: 1659,
            title: 'cookbooks jpeg',
            filename: 'cookbooks-jpeg.png',
            filesize: 2171698,
            url: '/website-assets/media/2025/12/cookbooks-jpeg.png',
            link: '/cookbooks-jpeg/',
            alt: '',
            author: '9',
            description: '',
            caption: '',
            name: 'cookbooks-jpeg',
            status: 'inherit',
            uploaded_to: 0,
            date: '2025-12-05 04:13:34',
            modified: '2025-12-05 04:13:34',
            menu_order: 0,
            mime_type: 'image/png',
            type: 'image',
            subtype: 'png',
            icon: '/website-assets/media/default.png',
            width: 1832,
            height: 1036,
            sizes: {
              thumbnail:
                '/website-assets/media/2025/12/cookbooks-jpeg-150x150.png',
              'thumbnail-width': 150,
              'thumbnail-height': 150,
              medium:
                '/website-assets/media/2025/12/cookbooks-jpeg-300x170.png',
              'medium-width': 300,
              'medium-height': 170,
              medium_large:
                '/website-assets/media/2025/12/cookbooks-jpeg-768x434.png',
              'medium_large-width': 768,
              'medium_large-height': 434,
              large:
                '/website-assets/media/2025/12/cookbooks-jpeg-1024x579.png',
              'large-width': 1024,
              'large-height': 579,
              '1536x1536':
                '/website-assets/media/2025/12/cookbooks-jpeg-1536x869.png',
              '1536x1536-width': 1536,
              '1536x1536-height': 869,
              '2048x2048': '/website-assets/media/2025/12/cookbooks-jpeg.png',
              '2048x2048-width': 1832,
              '2048x2048-height': 1036,
            },
          },
        },
      },
      {
        source: 'manual',
        resource: null,
        resource_manual: {
          eyebrow: 'Docs',
          title: {
            title: 'Documentation',
            url: 'https://spiceai.org/docs',
            target: '',
          },
          description:
            'Explore the docs for examples, additional cookbooks, starting templates, and more. ',
          image: {
            ID: 1661,
            id: 1661,
            title: 'Docs jpeg',
            filename: 'Docs-jpeg.jpeg',
            filesize: 103192,
            url: '/website-assets/media/2025/12/Docs-jpeg.jpeg',
            link: '/docs-jpeg/',
            alt: '',
            author: '9',
            description: '',
            caption: '',
            name: 'docs-jpeg',
            status: 'inherit',
            uploaded_to: 0,
            date: '2025-12-05 04:13:53',
            modified: '2025-12-05 04:13:53',
            menu_order: 0,
            mime_type: 'image/jpeg',
            type: 'image',
            subtype: 'jpeg',
            icon: '/website-assets/media/default.png',
            width: 1832,
            height: 1036,
            sizes: {
              thumbnail: '/website-assets/media/2025/12/Docs-jpeg-150x150.jpeg',
              'thumbnail-width': 150,
              'thumbnail-height': 150,
              medium: '/website-assets/media/2025/12/Docs-jpeg-300x170.jpeg',
              'medium-width': 300,
              'medium-height': 170,
              medium_large:
                '/website-assets/media/2025/12/Docs-jpeg-768x434.jpeg',
              'medium_large-width': 768,
              'medium_large-height': 434,
              large: '/website-assets/media/2025/12/Docs-jpeg-1024x579.jpeg',
              'large-width': 1024,
              'large-height': 579,
              '1536x1536':
                '/website-assets/media/2025/12/Docs-jpeg-1536x869.jpeg',
              '1536x1536-width': 1536,
              '1536x1536-height': 869,
              '2048x2048': '/website-assets/media/2025/12/Docs-jpeg.jpeg',
              '2048x2048-width': 1832,
              '2048x2048-height': 1036,
            },
          },
        },
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<AccordionFaq
  fields={{
    heading: 'FAQs',
    heading_tag: 'h2',
    paragraph:
      'Common questions about using Spice.ai in cybersecurity applications',
    items: [
      {
        title: 'How do cybersecurity companies use Spice.ai?',
        paragraph:
          '<p>Cybersecurity companies use Spice.ai to unify telemetry, logs, and threat data behind a single query engine and serve it to detection and response applications at low latency. The runtime federates data from object stores, warehouses, and databases with zero ETL, and materializes frequently accessed data close to the application for predictable performance under heavy workloads.</p>\n',
      },
      {
        title: 'Can Spice.ai query security logs stored in object storage?',
        paragraph:
          '<p>Yes. Spice.ai queries logs and events in object storage with standard SQL and joins them with data in warehouses and databases in real time. With <a href="/use-case/datalake-accelerator">data lake acceleration</a>, frequently accessed datasets are materialized locally for instant reads and faster analytics, without complex ingestion or transformation pipelines.</p>\n',
      },
      {
        title:
          'How does Spice.ai keep security applications available during outages?',
        paragraph:
          '<p>Spice.ai runs at the edge, in the cloud, or in hybrid deployments, so security applications maintain continuous data access during network disruptions or provider outages. Locally accelerated copies of critical datasets keep reads fast and available even when upstream systems are unreachable.</p>\n',
      },
      {
        title: 'Does Spice.ai support AI-assisted threat detection and triage?',
        paragraph:
          '<p>Yes. LLMs and vector search run directly within the Spice runtime, so security applications can add intelligent detection, triage, and reporting without operating a separate AI stack. Every query and inference is traceable and governed, which supports audit requirements for automated analysis.</p>\n',
      },
      {
        title: 'What security controls does Spice.ai itself provide?',
        paragraph:
          '<p>Spice.ai builds native authentication, encryption, and audit logging into every query, and Spice AI maintains SOC 2 Type II compliance. See the <a href="/security">Spice AI security and compliance practices</a> for details on access controls, encryption, and secure development.</p>\n',
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<TalkToAnEngineerCta />

---

## Financial Services
URL: https://spice.ai/industry/financial-services
Date: 2025-11-21T21:57:14
Description: Unify, govern, and accelerate sensitive financial data. Spice delivers federation, hybrid search, and integrated AI for regulated workloads.

<HeroTextImageFiftyFifty
  fields={{
    variant: 'variant-1',
    eyebrow: 'Financial Services',
    heading_tag: 'h1',
    heading: 'Unify real-time, governed data for financial services',
    paragraph:
      'Combine data from analytical warehouse, operational databases, and object storage with compliant federation. Accelerate queries to millisecond latency and deliver AI features with full visibility and audit.',
    cta: [
      {
        type: 'filled',
        cta: {
          title: 'Get a demo',
          url: 'https://meetings.hubspot.com/vladi-semenov',
          target: '_blank',
        },
      },
      {
        type: 'bordered',
        cta: {
          title: 'View the docs',
          url: 'https://spiceai.org/docs',
          target: '_blank',
        },
      },
    ],
    media_type: 'image',
    media_image: {
      ID: 1632,
      id: 1632,
      title: 'industry_financial_services_header',
      filename: 'industry_financial_services_header.png',
      filesize: 150862,
      url: '/website-assets/media/2025/12/industry_financial_services_header.png',
      link: '/industry/financial-services/attachment/industry_financial_services_header/',
      alt: '',
      author: '6',
      description: '',
      caption: '',
      name: 'industry_financial_services_header',
      status: 'inherit',
      uploaded_to: 1105,
      date: '2025-12-03 00:24:06',
      modified: '2025-12-03 00:24:06',
      menu_order: 0,
      mime_type: 'image/png',
      type: 'image',
      subtype: 'png',
      icon: '/website-assets/media/default.png',
      width: 1388,
      height: 644,
      sizes: {
        thumbnail:
          '/website-assets/media/2025/12/industry_financial_services_header.png',
        'thumbnail-width': 150,
        'thumbnail-height': 150,
        medium:
          '/website-assets/media/2025/12/industry_financial_services_header.png',
        'medium-width': 300,
        'medium-height': 139,
        medium_large:
          '/website-assets/media/2025/12/industry_financial_services_header.png',
        'medium_large-width': 768,
        'medium_large-height': 356,
        large:
          '/website-assets/media/2025/12/industry_financial_services_header.png',
        'large-width': 1024,
        'large-height': 475,
        '1536x1536':
          '/website-assets/media/2025/12/industry_financial_services_header.png',
        '1536x1536-width': 1388,
        '1536x1536-height': 644,
        '2048x2048':
          '/website-assets/media/2025/12/industry_financial_services_header.png',
        '2048x2048-width': 1388,
        '2048x2048-height': 644,
      },
    },
    media_video: '',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<ContentStats
  fields={{
    heading: 'Do more with your data',
    heading_tag: 'h2',
    stats: [
      {
        media_type: 'image',
        image: false,
        lottie: false,
        amount: '100',
        suffix: 'x',
        after_text: 'up to 100x faster queries',
      },
      {
        media_type: 'image',
        image: false,
        lottie: false,
        amount: '80',
        suffix: '%',
        after_text: 'up to 80% cost savings on data lakehouse spend',
      },
      {
        media_type: 'image',
        image: false,
        lottie: false,
        amount: '2',
        suffix: 'x',
        after_text: 'increase in data reliability for critical workloads',
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<ContentImageVideo
  fields={{
    variant: 'variant-2',
    heading: 'Data fragmentation slows modern finance',
    heading_tag: 'h2',
    paragraph:
      'Financial institutions depend on real-time data for trading, fraud prevention, and customer insights, but legacy ETL, disconnected search, and siloed analytics create delays and compliance risk. Financial services need governed, low-latency access across systems, and AI that operates transparently within those guardrails.',
    cta: false,
    media_type: 'image',
    media_image: {
      ID: 1048,
      id: 1048,
      title: 'use_case_challenge',
      filename: 'use_case_challenge.png',
      filesize: 4349638,
      url: '/website-assets/media/2025/11/use_case_challenge.png',
      link: '/industry/financial-services/attachment/use_case_challenge/',
      alt: '',
      author: '6',
      description: '',
      caption: '',
      name: 'use_case_challenge',
      status: 'inherit',
      uploaded_to: 1105,
      date: '2025-11-21 16:21:07',
      modified: '2025-11-21 16:21:07',
      menu_order: 0,
      mime_type: 'image/png',
      type: 'image',
      subtype: 'png',
      icon: '/website-assets/media/default.png',
      width: 2720,
      height: 1824,
      sizes: {
        thumbnail: '/website-assets/media/2025/11/use_case_challenge.png',
        'thumbnail-width': 150,
        'thumbnail-height': 150,
        medium: '/website-assets/media/2025/11/use_case_challenge.png',
        'medium-width': 300,
        'medium-height': 201,
        medium_large: '/website-assets/media/2025/11/use_case_challenge.png',
        'medium_large-width': 768,
        'medium_large-height': 515,
        large: '/website-assets/media/2025/11/use_case_challenge.png',
        'large-width': 1024,
        'large-height': 687,
        '1536x1536': '/website-assets/media/2025/11/use_case_challenge.png',
        '1536x1536-width': 1536,
        '1536x1536-height': 1030,
        '2048x2048': '/website-assets/media/2025/11/use_case_challenge.png',
        '2048x2048-width': 2048,
        '2048x2048-height': 1373,
      },
    },
    graphic_overlay: false,
    media_video: '',
    padding_top: 'st-lg',
    padding_bottom: 'sb-lg',
  }}
/>

<AccordionImageCopy
  fields={{
    heading: 'Governed data. Real-time performance.',
    heading_tag: 'h2',
    paragraph:
      'Federate, accelerate, search, and manage data and AI for every workflow.',
    is_single_image: true,
    feature_image: {
      ID: 1631,
      id: 1631,
      title: 'industry_financial_services_governed_data',
      filename: 'industry_financial_services_governed_data.png',
      filesize: 219347,
      url: '/website-assets/media/2025/12/industry_financial_services_governed_data.png',
      link: '/industry/financial-services/attachment/industry_financial_services_governed_data/',
      alt: '',
      author: '6',
      description: '',
      caption: '',
      name: 'industry_financial_services_governed_data',
      status: 'inherit',
      uploaded_to: 1105,
      date: '2025-12-03 00:23:59',
      modified: '2025-12-03 00:23:59',
      menu_order: 0,
      mime_type: 'image/png',
      type: 'image',
      subtype: 'png',
      icon: '/website-assets/media/default.png',
      width: 1388,
      height: 1212,
      sizes: {
        thumbnail:
          '/website-assets/media/2025/12/industry_financial_services_governed_data.png',
        'thumbnail-width': 150,
        'thumbnail-height': 150,
        medium:
          '/website-assets/media/2025/12/industry_financial_services_governed_data.png',
        'medium-width': 300,
        'medium-height': 262,
        medium_large:
          '/website-assets/media/2025/12/industry_financial_services_governed_data.png',
        'medium_large-width': 768,
        'medium_large-height': 671,
        large:
          '/website-assets/media/2025/12/industry_financial_services_governed_data.png',
        'large-width': 1024,
        'large-height': 894,
        '1536x1536':
          '/website-assets/media/2025/12/industry_financial_services_governed_data.png',
        '1536x1536-width': 1388,
        '1536x1536-height': 1212,
        '2048x2048':
          '/website-assets/media/2025/12/industry_financial_services_governed_data.png',
        '2048x2048-width': 1388,
        '2048x2048-height': 1212,
      },
    },
    items: [
      {
        title: 'Federate and accelerate SQL across sources',
        description:
          'Query disparate data sources in one SQL statement. Push down and materialize frequently accessed data locally for sub-second reads.',
        image: false,
      },
      {
        title: 'Real-time fraud detection',
        description:
          'Detect emerging fraud patterns in-flight with low-latency access to the most recent transactions. CDC-driven updates keep local tables synced, enabling analytics on live financial data.',
        image: false,
      },
      {
        title: 'Intelligent document and record search',
        description:
          'Combine vector semantics with keyword search across unstructured and structured data. Retrieve precise and semantically similar results in a single call.',
        image: false,
      },
      {
        title: 'AI gateway with policy guardrails',
        description:
          'Route to hosted or local LLMs, with per-task sandboxes, masking, and full traces. Generate summaries, alerts, and recommendations grounded in governed data.',
        image: false,
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<ContentThreeAcrossIconText
  fields={{
    heading: 'Built for regulated, low-latency financial workloads',
    heading_tag: 'h2',
    paragraph:
      'Spice unifies federated access, acceleration, hybrid search, and AI for faster and more secure financial apps. Deployable anywhere with enterprise governance.',
    items: [
      {
        icon: {
          ID: 1109,
          id: 1109,
          title: 'Industry_FinServ_Enterprise-Grade Performance',
          filename: 'Industry_FinServ_Enterprise-Grade-Performance.svg',
          filesize: 7429,
          url: '/website-assets/media/2025/11/Industry_FinServ_Enterprise-Grade-Performance.svg',
          link: '/industry/financial-services/attachment/industry_finserv_enterprise-grade-performance/',
          alt: '',
          author: '6',
          description: '',
          caption: '',
          name: 'industry_finserv_enterprise-grade-performance',
          status: 'inherit',
          uploaded_to: 1105,
          date: '2025-11-21 21:55:11',
          modified: '2025-11-21 21:55:11',
          menu_order: 0,
          mime_type: 'image/svg+xml',
          type: 'image',
          subtype: 'svg+xml',
          icon: '/website-assets/media/default.png',
          width: 0,
          height: 0,
          sizes: {
            thumbnail:
              '/website-assets/media/2025/11/Industry_FinServ_Enterprise-Grade-Performance.svg',
            'thumbnail-width': 1,
            'thumbnail-height': 1,
            medium:
              '/website-assets/media/2025/11/Industry_FinServ_Enterprise-Grade-Performance.svg',
            'medium-width': 1,
            'medium-height': 1,
            medium_large:
              '/website-assets/media/2025/11/Industry_FinServ_Enterprise-Grade-Performance.svg',
            'medium_large-width': 1,
            'medium_large-height': 1,
            large:
              '/website-assets/media/2025/11/Industry_FinServ_Enterprise-Grade-Performance.svg',
            'large-width': 1,
            'large-height': 1,
            '1536x1536':
              '/website-assets/media/2025/11/Industry_FinServ_Enterprise-Grade-Performance.svg',
            '1536x1536-width': 1,
            '1536x1536-height': 1,
            '2048x2048':
              '/website-assets/media/2025/11/Industry_FinServ_Enterprise-Grade-Performance.svg',
            '2048x2048-width': 1,
            '2048x2048-height': 1,
          },
        },
        title: 'Enterprise-Grade Performance',
        description:
          'Materialize hot data locally for real-time apps or fraud detection.',
      },
      {
        icon: {
          ID: 1110,
          id: 1110,
          title: 'Industry_FinServ_ETL-Free Syncs',
          filename: 'Industry_FinServ_ETL-Free-Syncs.svg',
          filesize: 5436,
          url: '/website-assets/media/2025/11/Industry_FinServ_ETL-Free-Syncs.svg',
          link: '/industry/financial-services/attachment/industry_finserv_etl-free-syncs/',
          alt: '',
          author: '6',
          description: '',
          caption: '',
          name: 'industry_finserv_etl-free-syncs',
          status: 'inherit',
          uploaded_to: 1105,
          date: '2025-11-21 21:55:11',
          modified: '2025-11-21 21:55:11',
          menu_order: 0,
          mime_type: 'image/svg+xml',
          type: 'image',
          subtype: 'svg+xml',
          icon: '/website-assets/media/default.png',
          width: 0,
          height: 0,
          sizes: {
            thumbnail:
              '/website-assets/media/2025/11/Industry_FinServ_ETL-Free-Syncs.svg',
            'thumbnail-width': 1,
            'thumbnail-height': 1,
            medium:
              '/website-assets/media/2025/11/Industry_FinServ_ETL-Free-Syncs.svg',
            'medium-width': 1,
            'medium-height': 1,
            medium_large:
              '/website-assets/media/2025/11/Industry_FinServ_ETL-Free-Syncs.svg',
            'medium_large-width': 1,
            'medium_large-height': 1,
            large:
              '/website-assets/media/2025/11/Industry_FinServ_ETL-Free-Syncs.svg',
            'large-width': 1,
            'large-height': 1,
            '1536x1536':
              '/website-assets/media/2025/11/Industry_FinServ_ETL-Free-Syncs.svg',
            '1536x1536-width': 1,
            '1536x1536-height': 1,
            '2048x2048':
              '/website-assets/media/2025/11/Industry_FinServ_ETL-Free-Syncs.svg',
            '2048x2048-width': 1,
            '2048x2048-height': 1,
          },
        },
        title: 'ETL-Free Syncs',
        description:
          'CDC keeps apps and downstream systems up to date without batch jobs.',
      },
      {
        icon: {
          ID: 1111,
          id: 1111,
          title: 'Industry_FinServ_Hybrid Search',
          filename: 'Industry_FinServ_Hybrid-Search.svg',
          filesize: 3616,
          url: '/website-assets/media/2025/11/Industry_FinServ_Hybrid-Search.svg',
          link: '/industry/financial-services/attachment/industry_finserv_hybrid-search/',
          alt: '',
          author: '6',
          description: '',
          caption: '',
          name: 'industry_finserv_hybrid-search',
          status: 'inherit',
          uploaded_to: 1105,
          date: '2025-11-21 21:55:12',
          modified: '2025-11-21 21:55:12',
          menu_order: 0,
          mime_type: 'image/svg+xml',
          type: 'image',
          subtype: 'svg+xml',
          icon: '/website-assets/media/default.png',
          width: 0,
          height: 0,
          sizes: {
            thumbnail:
              '/website-assets/media/2025/11/Industry_FinServ_Hybrid-Search.svg',
            'thumbnail-width': 1,
            'thumbnail-height': 1,
            medium:
              '/website-assets/media/2025/11/Industry_FinServ_Hybrid-Search.svg',
            'medium-width': 1,
            'medium-height': 1,
            medium_large:
              '/website-assets/media/2025/11/Industry_FinServ_Hybrid-Search.svg',
            'medium_large-width': 1,
            'medium_large-height': 1,
            large:
              '/website-assets/media/2025/11/Industry_FinServ_Hybrid-Search.svg',
            'large-width': 1,
            'large-height': 1,
            '1536x1536':
              '/website-assets/media/2025/11/Industry_FinServ_Hybrid-Search.svg',
            '1536x1536-width': 1,
            '1536x1536-height': 1,
            '2048x2048':
              '/website-assets/media/2025/11/Industry_FinServ_Hybrid-Search.svg',
            '2048x2048-width': 1,
            '2048x2048-height': 1,
          },
        },
        title: 'Hybrid Search',
        description:
          'Vector and BM25 keyword search across research, contracts, and records.',
      },
      {
        icon: {
          ID: 1107,
          id: 1107,
          title: 'Industry_FinServ_Audit and Observability',
          filename: 'Industry_FinServ_Audit-and-Observability.svg',
          filesize: 4124,
          url: '/website-assets/media/2025/11/Industry_FinServ_Audit-and-Observability.svg',
          link: '/industry/financial-services/attachment/industry_finserv_audit-and-observability/',
          alt: '',
          author: '6',
          description: '',
          caption: '',
          name: 'industry_finserv_audit-and-observability',
          status: 'inherit',
          uploaded_to: 1105,
          date: '2025-11-21 21:55:09',
          modified: '2025-11-21 21:55:09',
          menu_order: 0,
          mime_type: 'image/svg+xml',
          type: 'image',
          subtype: 'svg+xml',
          icon: '/website-assets/media/default.png',
          width: 0,
          height: 0,
          sizes: {
            thumbnail:
              '/website-assets/media/2025/11/Industry_FinServ_Audit-and-Observability.svg',
            'thumbnail-width': 1,
            'thumbnail-height': 1,
            medium:
              '/website-assets/media/2025/11/Industry_FinServ_Audit-and-Observability.svg',
            'medium-width': 1,
            'medium-height': 1,
            medium_large:
              '/website-assets/media/2025/11/Industry_FinServ_Audit-and-Observability.svg',
            'medium_large-width': 1,
            'medium_large-height': 1,
            large:
              '/website-assets/media/2025/11/Industry_FinServ_Audit-and-Observability.svg',
            'large-width': 1,
            'large-height': 1,
            '1536x1536':
              '/website-assets/media/2025/11/Industry_FinServ_Audit-and-Observability.svg',
            '1536x1536-width': 1,
            '1536x1536-height': 1,
            '2048x2048':
              '/website-assets/media/2025/11/Industry_FinServ_Audit-and-Observability.svg',
            '2048x2048-width': 1,
            '2048x2048-height': 1,
          },
        },
        title: 'Audit and Observability',
        description: 'Trace queries, prompts, and writebacks end-to-end.',
      },
      {
        icon: {
          ID: 1112,
          id: 1112,
          title: 'Industry_FinServ_MCP Server and Gateway',
          filename: 'Industry_FinServ_MCP-Server-and-Gateway.svg',
          filesize: 4598,
          url: '/website-assets/media/2025/11/Industry_FinServ_MCP-Server-and-Gateway.svg',
          link: '/industry/financial-services/attachment/industry_finserv_mcp-server-and-gateway/',
          alt: '',
          author: '6',
          description: '',
          caption: '',
          name: 'industry_finserv_mcp-server-and-gateway',
          status: 'inherit',
          uploaded_to: 1105,
          date: '2025-11-21 21:55:13',
          modified: '2025-11-21 21:55:13',
          menu_order: 0,
          mime_type: 'image/svg+xml',
          type: 'image',
          subtype: 'svg+xml',
          icon: '/website-assets/media/default.png',
          width: 0,
          height: 0,
          sizes: {
            thumbnail:
              '/website-assets/media/2025/11/Industry_FinServ_MCP-Server-and-Gateway.svg',
            'thumbnail-width': 1,
            'thumbnail-height': 1,
            medium:
              '/website-assets/media/2025/11/Industry_FinServ_MCP-Server-and-Gateway.svg',
            'medium-width': 1,
            'medium-height': 1,
            medium_large:
              '/website-assets/media/2025/11/Industry_FinServ_MCP-Server-and-Gateway.svg',
            'medium_large-width': 1,
            'medium_large-height': 1,
            large:
              '/website-assets/media/2025/11/Industry_FinServ_MCP-Server-and-Gateway.svg',
            'large-width': 1,
            'large-height': 1,
            '1536x1536':
              '/website-assets/media/2025/11/Industry_FinServ_MCP-Server-and-Gateway.svg',
            '1536x1536-width': 1,
            '1536x1536-height': 1,
            '2048x2048':
              '/website-assets/media/2025/11/Industry_FinServ_MCP-Server-and-Gateway.svg',
            '2048x2048-width': 1,
            '2048x2048-height': 1,
          },
        },
        title: 'MCP Server and Gateway',
        description:
          'Securely extend AI with internal tools such as risk models or fraud APIs executed inside the runtime for compliant, low-latency decisions.',
      },
      {
        icon: {
          ID: 1108,
          id: 1108,
          title: 'Industry_FinServ_Developer-First Design',
          filename: 'Industry_FinServ_Developer-First-Design.svg',
          filesize: 5090,
          url: '/website-assets/media/2025/11/Industry_FinServ_Developer-First-Design.svg',
          link: '/industry/financial-services/attachment/industry_finserv_developer-first-design/',
          alt: '',
          author: '6',
          description: '',
          caption: '',
          name: 'industry_finserv_developer-first-design',
          status: 'inherit',
          uploaded_to: 1105,
          date: '2025-11-21 21:55:09',
          modified: '2025-11-21 21:55:09',
          menu_order: 0,
          mime_type: 'image/svg+xml',
          type: 'image',
          subtype: 'svg+xml',
          icon: '/website-assets/media/default.png',
          width: 0,
          height: 0,
          sizes: {
            thumbnail:
              '/website-assets/media/2025/11/Industry_FinServ_Developer-First-Design.svg',
            'thumbnail-width': 1,
            'thumbnail-height': 1,
            medium:
              '/website-assets/media/2025/11/Industry_FinServ_Developer-First-Design.svg',
            'medium-width': 1,
            'medium-height': 1,
            medium_large:
              '/website-assets/media/2025/11/Industry_FinServ_Developer-First-Design.svg',
            'medium_large-width': 1,
            'medium_large-height': 1,
            large:
              '/website-assets/media/2025/11/Industry_FinServ_Developer-First-Design.svg',
            'large-width': 1,
            'large-height': 1,
            '1536x1536':
              '/website-assets/media/2025/11/Industry_FinServ_Developer-First-Design.svg',
            '1536x1536-width': 1,
            '1536x1536-height': 1,
            '2048x2048':
              '/website-assets/media/2025/11/Industry_FinServ_Developer-First-Design.svg',
            '2048x2048-width': 1,
            '2048x2048-height': 1,
          },
        },
        title: 'Deployment Flexibility',
        description:
          'Run Spice anywhere: as a sidecar, microservice, cluster, or on the managed Spice Cloud Platform.',
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<Testimonials
  heading="Deployed in production"
  headingTag="h2"
  paragraph="Run data-intensive workloads on a high-performance engine trusted by teams building real-time systems at scale."
  items={['twilio', 'barracuda', 'nrc-tim', 'basisset']}
/>

<CarouselLogos
  fields={{
    heading: 'Trusted by global enterprises',
    logos: [
      {
        logo: {
          ID: 443,
          id: 443,
          title: 'Homepage_Logos_Twilio',
          filename: 'Homepage_Logos_Twilio-1.svg',
          filesize: 4020,
          url: '/website-assets/media/2025/11/Homepage_Logos_Twilio-1.svg',
          link: '/home/homepage_logos_twilio-2/',
          alt: 'Twilio logo',
          author: '6',
          description: '',
          caption: '',
          name: 'homepage_logos_twilio-2',
          status: 'inherit',
          uploaded_to: 2,
          date: '2025-11-05 18:46:45',
          modified: '2025-11-05 18:46:45',
          menu_order: 0,
          mime_type: 'image/svg+xml',
          type: 'image',
          subtype: 'svg+xml',
          icon: '/website-assets/media/default.png',
          width: 0,
          height: 0,
          sizes: {
            thumbnail:
              '/website-assets/media/2025/11/Homepage_Logos_Twilio-1.svg',
            'thumbnail-width': 1,
            'thumbnail-height': 1,
            medium: '/website-assets/media/2025/11/Homepage_Logos_Twilio-1.svg',
            'medium-width': 1,
            'medium-height': 1,
            medium_large:
              '/website-assets/media/2025/11/Homepage_Logos_Twilio-1.svg',
            'medium_large-width': 1,
            'medium_large-height': 1,
            large: '/website-assets/media/2025/11/Homepage_Logos_Twilio-1.svg',
            'large-width': 1,
            'large-height': 1,
            '1536x1536':
              '/website-assets/media/2025/11/Homepage_Logos_Twilio-1.svg',
            '1536x1536-width': 1,
            '1536x1536-height': 1,
            '2048x2048':
              '/website-assets/media/2025/11/Homepage_Logos_Twilio-1.svg',
            '2048x2048-width': 1,
            '2048x2048-height': 1,
          },
        },
      },
      {
        logo: {
          ID: 442,
          id: 442,
          title: 'Homepage_Logos_NRC',
          filename: 'Homepage_Logos_NRC-1.svg',
          filesize: 1030,
          url: '/website-assets/media/2025/11/Homepage_Logos_NRC-1.svg',
          link: '/home/homepage_logos_nrc-2/',
          alt: 'NRC Health logo',
          author: '6',
          description: '',
          caption: '',
          name: 'homepage_logos_nrc-2',
          status: 'inherit',
          uploaded_to: 2,
          date: '2025-11-05 18:46:45',
          modified: '2025-11-05 18:46:45',
          menu_order: 0,
          mime_type: 'image/svg+xml',
          type: 'image',
          subtype: 'svg+xml',
          icon: '/website-assets/media/default.png',
          width: 0,
          height: 0,
          sizes: {
            thumbnail: '/website-assets/media/2025/11/Homepage_Logos_NRC-1.svg',
            'thumbnail-width': 1,
            'thumbnail-height': 1,
            medium: '/website-assets/media/2025/11/Homepage_Logos_NRC-1.svg',
            'medium-width': 1,
            'medium-height': 1,
            medium_large:
              '/website-assets/media/2025/11/Homepage_Logos_NRC-1.svg',
            'medium_large-width': 1,
            'medium_large-height': 1,
            large: '/website-assets/media/2025/11/Homepage_Logos_NRC-1.svg',
            'large-width': 1,
            'large-height': 1,
            '1536x1536':
              '/website-assets/media/2025/11/Homepage_Logos_NRC-1.svg',
            '1536x1536-width': 1,
            '1536x1536-height': 1,
            '2048x2048':
              '/website-assets/media/2025/11/Homepage_Logos_NRC-1.svg',
            '2048x2048-width': 1,
            '2048x2048-height': 1,
          },
        },
      },
      {
        logo: {
          ID: 441,
          id: 441,
          title: 'Homepage_Logos_BasisSet',
          filename: 'Homepage_Logos_BasisSet-1.svg',
          filesize: 2629,
          url: '/website-assets/media/2025/11/Homepage_Logos_BasisSet-1.svg',
          link: '/home/homepage_logos_basisset-2/',
          alt: 'Basis Set Ventures logo',
          author: '6',
          description: '',
          caption: '',
          name: 'homepage_logos_basisset-2',
          status: 'inherit',
          uploaded_to: 2,
          date: '2025-11-05 18:46:45',
          modified: '2025-11-05 18:46:45',
          menu_order: 0,
          mime_type: 'image/svg+xml',
          type: 'image',
          subtype: 'svg+xml',
          icon: '/website-assets/media/default.png',
          width: 0,
          height: 0,
          sizes: {
            thumbnail:
              '/website-assets/media/2025/11/Homepage_Logos_BasisSet-1.svg',
            'thumbnail-width': 1,
            'thumbnail-height': 1,
            medium:
              '/website-assets/media/2025/11/Homepage_Logos_BasisSet-1.svg',
            'medium-width': 1,
            'medium-height': 1,
            medium_large:
              '/website-assets/media/2025/11/Homepage_Logos_BasisSet-1.svg',
            'medium_large-width': 1,
            'medium_large-height': 1,
            large:
              '/website-assets/media/2025/11/Homepage_Logos_BasisSet-1.svg',
            'large-width': 1,
            'large-height': 1,
            '1536x1536':
              '/website-assets/media/2025/11/Homepage_Logos_BasisSet-1.svg',
            '1536x1536-width': 1,
            '1536x1536-height': 1,
            '2048x2048':
              '/website-assets/media/2025/11/Homepage_Logos_BasisSet-1.svg',
            '2048x2048-width': 1,
            '2048x2048-height': 1,
          },
        },
      },
      {
        logo: {
          ID: 440,
          id: 440,
          title: 'Homepage_Logos_Barracuda',
          filename: 'Homepage_Logos_Barracuda-1.svg',
          filesize: 7450,
          url: '/website-assets/media/2025/11/Homepage_Logos_Barracuda-1.svg',
          link: '/home/homepage_logos_barracuda-2/',
          alt: 'Barracuda Networks logo',
          author: '6',
          description: '',
          caption: '',
          name: 'homepage_logos_barracuda-2',
          status: 'inherit',
          uploaded_to: 2,
          date: '2025-11-05 18:46:45',
          modified: '2025-11-05 18:46:45',
          menu_order: 0,
          mime_type: 'image/svg+xml',
          type: 'image',
          subtype: 'svg+xml',
          icon: '/website-assets/media/default.png',
          width: 0,
          height: 0,
          sizes: {
            thumbnail:
              '/website-assets/media/2025/11/Homepage_Logos_Barracuda-1.svg',
            'thumbnail-width': 1,
            'thumbnail-height': 1,
            medium:
              '/website-assets/media/2025/11/Homepage_Logos_Barracuda-1.svg',
            'medium-width': 1,
            'medium-height': 1,
            medium_large:
              '/website-assets/media/2025/11/Homepage_Logos_Barracuda-1.svg',
            'medium_large-width': 1,
            'medium_large-height': 1,
            large:
              '/website-assets/media/2025/11/Homepage_Logos_Barracuda-1.svg',
            'large-width': 1,
            'large-height': 1,
            '1536x1536':
              '/website-assets/media/2025/11/Homepage_Logos_Barracuda-1.svg',
            '1536x1536-width': 1,
            '1536x1536-height': 1,
            '2048x2048':
              '/website-assets/media/2025/11/Homepage_Logos_Barracuda-1.svg',
            '2048x2048-width': 1,
            '2048x2048-height': 1,
          },
        },
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<ContentResourceFeatured
  fields={{
    heading: 'Build more robust financial applications',
    heading_tag: 'h2',
    paragraph:
      'Guides and examples to learn more about building secure, performant applications with Spice. ',
    mode: 'default',
    resources: [
      {
        source: 'manual',
        resource: null,
        resource_manual: {
          eyebrow: 'Docs',
          title: {
            title: 'Hybrid Search Docs',
            url: 'https://spiceai.org/docs/features/search',
            target: '_blank',
          },
          description:
            "Learn how to combine semantic, full-text, and keyword search with Spice's hybrid search capabilities",
          image: {
            ID: 1661,
            id: 1661,
            title: 'Docs jpeg',
            filename: 'Docs-jpeg.jpeg',
            filesize: 103192,
            url: '/website-assets/media/2025/12/Docs-jpeg.jpeg',
            link: '/docs-jpeg/',
            alt: '',
            author: '9',
            description: '',
            caption: '',
            name: 'docs-jpeg',
            status: 'inherit',
            uploaded_to: 0,
            date: '2025-12-05 04:13:53',
            modified: '2025-12-05 04:13:53',
            menu_order: 0,
            mime_type: 'image/jpeg',
            type: 'image',
            subtype: 'jpeg',
            icon: '/website-assets/media/default.png',
            width: 1832,
            height: 1036,
            sizes: {
              thumbnail: '/website-assets/media/2025/12/Docs-jpeg-150x150.jpeg',
              'thumbnail-width': 150,
              'thumbnail-height': 150,
              medium: '/website-assets/media/2025/12/Docs-jpeg-300x170.jpeg',
              'medium-width': 300,
              'medium-height': 170,
              medium_large:
                '/website-assets/media/2025/12/Docs-jpeg-768x434.jpeg',
              'medium_large-width': 768,
              'medium_large-height': 434,
              large: '/website-assets/media/2025/12/Docs-jpeg-1024x579.jpeg',
              'large-width': 1024,
              'large-height': 579,
              '1536x1536':
                '/website-assets/media/2025/12/Docs-jpeg-1536x869.jpeg',
              '1536x1536-width': 1536,
              '1536x1536-height': 869,
              '2048x2048': '/website-assets/media/2025/12/Docs-jpeg.jpeg',
              '2048x2048-width': 1832,
              '2048x2048-height': 1036,
            },
          },
        },
      },
      {
        source: 'manual',
        resource: null,
        resource_manual: {
          eyebrow: 'Docs',
          title: {
            title: 'Federation and Acceleration Docs',
            url: 'https://spiceai.org/docs/features/data-acceleration',
            target: '_blank',
          },
          description:
            'Learn how to get started with Spice federation and acceleration. Query, join, and accelerate data using SQL from multiple sources, including databases, data warehouses, and data lakes',
          image: {
            ID: 1661,
            id: 1661,
            title: 'Docs jpeg',
            filename: 'Docs-jpeg.jpeg',
            filesize: 103192,
            url: '/website-assets/media/2025/12/Docs-jpeg.jpeg',
            link: '/docs-jpeg/',
            alt: '',
            author: '9',
            description: '',
            caption: '',
            name: 'docs-jpeg',
            status: 'inherit',
            uploaded_to: 0,
            date: '2025-12-05 04:13:53',
            modified: '2025-12-05 04:13:53',
            menu_order: 0,
            mime_type: 'image/jpeg',
            type: 'image',
            subtype: 'jpeg',
            icon: '/website-assets/media/default.png',
            width: 1832,
            height: 1036,
            sizes: {
              thumbnail: '/website-assets/media/2025/12/Docs-jpeg-150x150.jpeg',
              'thumbnail-width': 150,
              'thumbnail-height': 150,
              medium: '/website-assets/media/2025/12/Docs-jpeg-300x170.jpeg',
              'medium-width': 300,
              'medium-height': 170,
              medium_large:
                '/website-assets/media/2025/12/Docs-jpeg-768x434.jpeg',
              'medium_large-width': 768,
              'medium_large-height': 434,
              large: '/website-assets/media/2025/12/Docs-jpeg-1024x579.jpeg',
              'large-width': 1024,
              'large-height': 579,
              '1536x1536':
                '/website-assets/media/2025/12/Docs-jpeg-1536x869.jpeg',
              '1536x1536-width': 1536,
              '1536x1536-height': 869,
              '2048x2048': '/website-assets/media/2025/12/Docs-jpeg.jpeg',
              '2048x2048-width': 1832,
              '2048x2048-height': 1036,
            },
          },
        },
      },
      {
        source: 'picker',
        resource: [
          {
            title:
              'Making Object Storage Operational for Real-Time and AI Workloads',
            slug: '/blog/making-object-storage-operational',
            excerpt:
              'TLDR Introduction Although legacy systems and workflows remain common, many enterprises are re-evaluating their architectures to meet new demands&nbsp; &#8211; driven in part, but not exclusively, by AI &#8211; that require support for more data-intensive and real-time applications. The underlying storage needs for these novel workloads are generally outside the bounds of a traditional operational [&hellip;]',
            image:
              '/website-assets/media/2025/11/68e42f8a5daa71c139c95512_Version-2.png',
            type: 'Blog',
            taxonomy: [],
          },
        ],
        resource_manual: {
          eyebrow: '',
          title: null,
          description: '',
          image: false,
        },
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<AccordionFaq
  fields={{
    heading: 'FAQs',
    heading_tag: 'h2',
    paragraph: 'Common questions about using Spice.ai in financial services',
    items: [
      {
        title: 'How do financial services companies use Spice.ai?',
        paragraph:
          '<p>Financial services companies use Spice.ai to combine data from analytical warehouses, operational databases, and object storage into one governed, low-latency query layer. Common workloads include fraud detection on live transactions, document and record search, and AI features that operate with full visibility and audit.</p>\n',
      },
      {
        title: 'Can Spice.ai detect fraud on live transaction data?',
        paragraph:
          '<p>Yes. <a href="/feature/real-time-change-data-capture">Real-time change data capture</a> keeps locally accelerated tables synced with the most recent transactions, so analytics run against live financial data instead of stale batch extracts. This low-latency access to recent transactions supports detecting emerging fraud patterns in-flight.</p>\n',
      },
      {
        title: 'How does Spice.ai search financial documents and records?',
        paragraph:
          '<p>Spice.ai combines vector semantics with BM25 keyword search using <a href="/platform/hybrid-sql-search">hybrid SQL search</a>, returning precise and semantically similar results in a single call. It searches across unstructured and structured data, such as research, contracts, and records.</p>\n',
      },
      {
        title:
          'How does Spice.ai keep AI usage compliant in regulated environments?',
        paragraph:
          '<p>Spice.ai routes AI requests through a gateway with policy guardrails, supporting hosted or local LLMs with per-task sandboxes, data masking, and full traces. Queries, prompts, and writebacks are traceable end-to-end, so AI-generated summaries, alerts, and recommendations stay grounded in governed data.</p>\n',
      },
      {
        title: 'Can AI agents use internal financial tools through Spice.ai?',
        paragraph:
          '<p>Yes. The Spice.ai MCP server and gateway lets AI agents securely call internal tools, such as risk models or fraud APIs, executed inside the runtime. This keeps agent-driven decisions low-latency and within existing governance controls.</p>\n',
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<TalkToAnEngineerCta />

---

## SaaS
URL: https://spice.ai/industry/saas
Date: 2025-11-21T22:11:12
Description: Power SaaS with live, governed data. Federate across warehouses and DBs, accelerate to millisecond latency, and add AI-all on one portable runtime.

<HeroTextImageFiftyFifty
  fields={{
    variant: 'variant-1',
    eyebrow: 'SaaS',
    heading_tag: 'h1',
    heading: 'Power real-time, intelligent SaaS',
    paragraph:
      'Deliver responsive, personalized, and always-available applications with unified data, accelerated performance, and native AI integration. ',
    cta: [
      {
        type: 'filled',
        cta: {
          title: 'Get a demo',
          url: 'https://meetings.hubspot.com/vladi-semenov',
          target: '_blank',
        },
      },
      {
        type: 'bordered',
        cta: {
          title: 'View the docs',
          url: 'https://spiceai.org/docs',
          target: '_blank',
        },
      },
    ],
    media_type: 'image',
    media_image: {
      ID: 1633,
      id: 1633,
      title: 'industry_saas_header',
      filename: 'industry_saas_header.png',
      filesize: 150376,
      url: '/website-assets/media/2025/12/industry_saas_header.png',
      link: '/industry/saas/attachment/industry_saas_header/',
      alt: '',
      author: '6',
      description: '',
      caption: '',
      name: 'industry_saas_header',
      status: 'inherit',
      uploaded_to: 1124,
      date: '2025-12-03 00:24:08',
      modified: '2025-12-03 00:24:08',
      menu_order: 0,
      mime_type: 'image/png',
      type: 'image',
      subtype: 'png',
      icon: '/website-assets/media/default.png',
      width: 1360,
      height: 752,
      sizes: {
        thumbnail: '/website-assets/media/2025/12/industry_saas_header.png',
        'thumbnail-width': 150,
        'thumbnail-height': 150,
        medium: '/website-assets/media/2025/12/industry_saas_header.png',
        'medium-width': 300,
        'medium-height': 166,
        medium_large: '/website-assets/media/2025/12/industry_saas_header.png',
        'medium_large-width': 768,
        'medium_large-height': 425,
        large: '/website-assets/media/2025/12/industry_saas_header.png',
        'large-width': 1024,
        'large-height': 566,
        '1536x1536': '/website-assets/media/2025/12/industry_saas_header.png',
        '1536x1536-width': 1360,
        '1536x1536-height': 752,
        '2048x2048': '/website-assets/media/2025/12/industry_saas_header.png',
        '2048x2048-width': 1360,
        '2048x2048-height': 752,
      },
    },
    media_video: '',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<ContentStats
  fields={{
    heading: 'Do more with your data',
    heading_tag: 'h2',
    stats: [
      {
        media_type: 'image',
        image: false,
        lottie: false,
        amount: '100',
        suffix: 'x',
        after_text: 'up to 100x faster queries',
      },
      {
        media_type: 'image',
        image: false,
        lottie: false,
        amount: '80',
        suffix: '%',
        after_text: 'up to 80% cost savings on data lakehouse spend',
      },
      {
        media_type: 'image',
        image: false,
        lottie: false,
        amount: '2',
        suffix: 'x',
        after_text: 'increase in data reliability for critical workloads',
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<ContentImageVideo
  fields={{
    variant: 'variant-2',
    heading: 'Software development teams face a data bottleneck',
    heading_tag: 'h2',
    paragraph:
      'Modern SaaS apps depend on enterprise data to power dynamic user experiences. But brittle ETL, disconnected analytics stacks, and latency from remote databases slow down feature delivery and responsiveness. Teams need governed, low-latency access to all their data-without adding new systems or operational drag.',
    cta: false,
    media_type: 'image',
    media_image: {
      ID: 1048,
      id: 1048,
      title: 'use_case_challenge',
      filename: 'use_case_challenge.png',
      filesize: 4349638,
      url: '/website-assets/media/2025/11/use_case_challenge.png',
      link: '/industry/saas/attachment/use_case_challenge/',
      alt: '',
      author: '6',
      description: '',
      caption: '',
      name: 'use_case_challenge',
      status: 'inherit',
      uploaded_to: 1124,
      date: '2025-11-21 16:21:07',
      modified: '2025-11-21 16:21:07',
      menu_order: 0,
      mime_type: 'image/png',
      type: 'image',
      subtype: 'png',
      icon: '/website-assets/media/default.png',
      width: 2720,
      height: 1824,
      sizes: {
        thumbnail: '/website-assets/media/2025/11/use_case_challenge.png',
        'thumbnail-width': 150,
        'thumbnail-height': 150,
        medium: '/website-assets/media/2025/11/use_case_challenge.png',
        'medium-width': 300,
        'medium-height': 201,
        medium_large: '/website-assets/media/2025/11/use_case_challenge.png',
        'medium_large-width': 768,
        'medium_large-height': 515,
        large: '/website-assets/media/2025/11/use_case_challenge.png',
        'large-width': 1024,
        'large-height': 687,
        '1536x1536': '/website-assets/media/2025/11/use_case_challenge.png',
        '1536x1536-width': 1536,
        '1536x1536-height': 1030,
        '2048x2048': '/website-assets/media/2025/11/use_case_challenge.png',
        '2048x2048-width': 2048,
        '2048x2048-height': 1373,
      },
    },
    graphic_overlay: false,
    media_video: '',
    padding_top: 'st-lg',
    padding_bottom: 'sb-lg',
  }}
/>

<AccordionImageCopy
  fields={{
    heading: 'Deliver faster and more resilient software',
    heading_tag: 'h2',
    paragraph:
      'Unify data, accelerate performance, and embed AI directly into your app workflows.',
    is_single_image: true,
    feature_image: {
      ID: 1634,
      id: 1634,
      title: 'industry_saas_speed_2',
      filename: 'industry_saas_speed_2.png',
      filesize: 237262,
      url: '/website-assets/media/2025/12/industry_saas_speed_2.png',
      link: '/industry/saas/attachment/industry_saas_speed_2/',
      alt: '',
      author: '6',
      description: '',
      caption: '',
      name: 'industry_saas_speed_2',
      status: 'inherit',
      uploaded_to: 1124,
      date: '2025-12-03 00:24:10',
      modified: '2025-12-03 00:24:10',
      menu_order: 0,
      mime_type: 'image/png',
      type: 'image',
      subtype: 'png',
      icon: '/website-assets/media/default.png',
      width: 1388,
      height: 1404,
      sizes: {
        thumbnail: '/website-assets/media/2025/12/industry_saas_speed_2.png',
        'thumbnail-width': 150,
        'thumbnail-height': 150,
        medium: '/website-assets/media/2025/12/industry_saas_speed_2.png',
        'medium-width': 300,
        'medium-height': 303,
        medium_large: '/website-assets/media/2025/12/industry_saas_speed_2.png',
        'medium_large-width': 768,
        'medium_large-height': 777,
        large: '/website-assets/media/2025/12/industry_saas_speed_2.png',
        'large-width': 1024,
        'large-height': 1036,
        '1536x1536': '/website-assets/media/2025/12/industry_saas_speed_2.png',
        '1536x1536-width': 1388,
        '1536x1536-height': 1404,
        '2048x2048': '/website-assets/media/2025/12/industry_saas_speed_2.png',
        '2048x2048-width': 1388,
        '2048x2048-height': 1404,
      },
    },
    items: [
      {
        title: 'Unified query and search layer',
        description:
          'Access data across your warehouse, database, and storage systems from a single runtime. Simplify application logic and remove fragile integration layers.',
        image: false,
      },
      {
        title: 'Sharded deployment for secure multi-tenancy',
        description:
          'Run multiple Spice Runtime instances, sharded by customer, region, or workload. Provide each tenant with dedicated resources and tailored configurations for performance, security, and resiliency.',
        image: false,
      },
      {
        title: 'CDN-like performance',
        description:
          'Co-locate active datasets near your application for instant reads and resilience during high traffic or provider downtime.',
        image: false,
      },
      {
        title: 'Built-in AI and automation',
        description:
          'Add LLM-powered features and intelligent agents directly within the Spice runtime. Deliver personalized recommendations, summaries, and automation with full governance.',
        image: false,
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<ContentThreeAcrossIconText
  fields={{
    heading: 'Purpose-built for SaaS speed and scale',
    heading_tag: 'h2',
    paragraph:
      'Spice eliminates data friction. Federate, accelerate, and serve AI from one governed runtime designed for always-on, high-traffic SaaS environments.',
    items: [
      {
        icon: {
          ID: 1128,
          id: 1128,
          title: 'Industry_SaaS_Accelerated Performance',
          filename: 'Industry_SaaS_Accelerated-Performance.svg',
          filesize: 12567,
          url: '/website-assets/media/2025/11/Industry_SaaS_Accelerated-Performance.svg',
          link: '/industry/saas/attachment/industry_saas_accelerated-performance/',
          alt: '',
          author: '6',
          description: '',
          caption: '',
          name: 'industry_saas_accelerated-performance',
          status: 'inherit',
          uploaded_to: 1124,
          date: '2025-11-21 22:14:46',
          modified: '2025-11-21 22:14:46',
          menu_order: 0,
          mime_type: 'image/svg+xml',
          type: 'image',
          subtype: 'svg+xml',
          icon: '/website-assets/media/default.png',
          width: 0,
          height: 0,
          sizes: {
            thumbnail:
              '/website-assets/media/2025/11/Industry_SaaS_Accelerated-Performance.svg',
            'thumbnail-width': 1,
            'thumbnail-height': 1,
            medium:
              '/website-assets/media/2025/11/Industry_SaaS_Accelerated-Performance.svg',
            'medium-width': 1,
            'medium-height': 1,
            medium_large:
              '/website-assets/media/2025/11/Industry_SaaS_Accelerated-Performance.svg',
            'medium_large-width': 1,
            'medium_large-height': 1,
            large:
              '/website-assets/media/2025/11/Industry_SaaS_Accelerated-Performance.svg',
            'large-width': 1,
            'large-height': 1,
            '1536x1536':
              '/website-assets/media/2025/11/Industry_SaaS_Accelerated-Performance.svg',
            '1536x1536-width': 1,
            '1536x1536-height': 1,
            '2048x2048':
              '/website-assets/media/2025/11/Industry_SaaS_Accelerated-Performance.svg',
            '2048x2048-width': 1,
            '2048x2048-height': 1,
          },
        },
        title: 'Accelerated Performance',
        description:
          'Local materialization via DuckDB, SQLite, and Arrow for millisecond latency',
      },
      {
        icon: {
          ID: 1133,
          id: 1133,
          title: 'Industry_SaaS_Real-Time Data Sync',
          filename: 'Industry_SaaS_Real-Time-Data-Sync.svg',
          filesize: 5436,
          url: '/website-assets/media/2025/11/Industry_SaaS_Real-Time-Data-Sync.svg',
          link: '/industry/saas/attachment/industry_saas_real-time-data-sync/',
          alt: '',
          author: '6',
          description: '',
          caption: '',
          name: 'industry_saas_real-time-data-sync',
          status: 'inherit',
          uploaded_to: 1124,
          date: '2025-11-21 22:14:49',
          modified: '2025-11-21 22:14:49',
          menu_order: 0,
          mime_type: 'image/svg+xml',
          type: 'image',
          subtype: 'svg+xml',
          icon: '/website-assets/media/default.png',
          width: 0,
          height: 0,
          sizes: {
            thumbnail:
              '/website-assets/media/2025/11/Industry_SaaS_Real-Time-Data-Sync.svg',
            'thumbnail-width': 1,
            'thumbnail-height': 1,
            medium:
              '/website-assets/media/2025/11/Industry_SaaS_Real-Time-Data-Sync.svg',
            'medium-width': 1,
            'medium-height': 1,
            medium_large:
              '/website-assets/media/2025/11/Industry_SaaS_Real-Time-Data-Sync.svg',
            'medium_large-width': 1,
            'medium_large-height': 1,
            large:
              '/website-assets/media/2025/11/Industry_SaaS_Real-Time-Data-Sync.svg',
            'large-width': 1,
            'large-height': 1,
            '1536x1536':
              '/website-assets/media/2025/11/Industry_SaaS_Real-Time-Data-Sync.svg',
            '1536x1536-width': 1,
            '1536x1536-height': 1,
            '2048x2048':
              '/website-assets/media/2025/11/Industry_SaaS_Real-Time-Data-Sync.svg',
            '2048x2048-width': 1,
            '2048x2048-height': 1,
          },
        },
        title: 'Real-Time Data Sync',
        description:
          'CDC-based updates keep CRMs and app data continuously fresh.',
      },
      {
        icon: {
          ID: 1131,
          id: 1131,
          title: 'Industry_SaaS_Embedded AI',
          filename: 'Industry_SaaS_Embedded-AI.svg',
          filesize: 20773,
          url: '/website-assets/media/2025/11/Industry_SaaS_Embedded-AI.svg',
          link: '/industry/saas/attachment/industry_saas_embedded-ai/',
          alt: '',
          author: '6',
          description: '',
          caption: '',
          name: 'industry_saas_embedded-ai',
          status: 'inherit',
          uploaded_to: 1124,
          date: '2025-11-21 22:14:48',
          modified: '2025-11-21 22:14:48',
          menu_order: 0,
          mime_type: 'image/svg+xml',
          type: 'image',
          subtype: 'svg+xml',
          icon: '/website-assets/media/default.png',
          width: 0,
          height: 0,
          sizes: {
            thumbnail:
              '/website-assets/media/2025/11/Industry_SaaS_Embedded-AI.svg',
            'thumbnail-width': 1,
            'thumbnail-height': 1,
            medium:
              '/website-assets/media/2025/11/Industry_SaaS_Embedded-AI.svg',
            'medium-width': 1,
            'medium-height': 1,
            medium_large:
              '/website-assets/media/2025/11/Industry_SaaS_Embedded-AI.svg',
            'medium_large-width': 1,
            'medium_large-height': 1,
            large:
              '/website-assets/media/2025/11/Industry_SaaS_Embedded-AI.svg',
            'large-width': 1,
            'large-height': 1,
            '1536x1536':
              '/website-assets/media/2025/11/Industry_SaaS_Embedded-AI.svg',
            '1536x1536-width': 1,
            '1536x1536-height': 1,
            '2048x2048':
              '/website-assets/media/2025/11/Industry_SaaS_Embedded-AI.svg',
            '2048x2048-width': 1,
            '2048x2048-height': 1,
          },
        },
        title: 'Embedded AI',
        description:
          'Run LLMs and hybrid search inside the runtime for intelligent workflows.',
      },
      {
        icon: {
          ID: 1132,
          id: 1132,
          title: 'Industry_SaaS_Observability & Governance',
          filename: 'Industry_SaaS_Observability-Governance.svg',
          filesize: 4748,
          url: '/website-assets/media/2025/11/Industry_SaaS_Observability-Governance.svg',
          link: '/industry/saas/attachment/industry_saas_observability-governance/',
          alt: '',
          author: '6',
          description: '',
          caption: '',
          name: 'industry_saas_observability-governance',
          status: 'inherit',
          uploaded_to: 1124,
          date: '2025-11-21 22:14:49',
          modified: '2025-11-21 22:14:49',
          menu_order: 0,
          mime_type: 'image/svg+xml',
          type: 'image',
          subtype: 'svg+xml',
          icon: '/website-assets/media/default.png',
          width: 0,
          height: 0,
          sizes: {
            thumbnail:
              '/website-assets/media/2025/11/Industry_SaaS_Observability-Governance.svg',
            'thumbnail-width': 1,
            'thumbnail-height': 1,
            medium:
              '/website-assets/media/2025/11/Industry_SaaS_Observability-Governance.svg',
            'medium-width': 1,
            'medium-height': 1,
            medium_large:
              '/website-assets/media/2025/11/Industry_SaaS_Observability-Governance.svg',
            'medium_large-width': 1,
            'medium_large-height': 1,
            large:
              '/website-assets/media/2025/11/Industry_SaaS_Observability-Governance.svg',
            'large-width': 1,
            'large-height': 1,
            '1536x1536':
              '/website-assets/media/2025/11/Industry_SaaS_Observability-Governance.svg',
            '1536x1536-width': 1,
            '1536x1536-height': 1,
            '2048x2048':
              '/website-assets/media/2025/11/Industry_SaaS_Observability-Governance.svg',
            '2048x2048-width': 1,
            '2048x2048-height': 1,
          },
        },
        title: 'Observability & Governance',
        description:
          'Trace data, queries, and inference outputs for compliance and trust.',
      },
      {
        icon: {
          ID: 1129,
          id: 1129,
          title: 'Industry_SaaS_Deployment Flexibility',
          filename: 'Industry_SaaS_Deployment-Flexibility.svg',
          filesize: 5090,
          url: '/website-assets/media/2025/11/Industry_SaaS_Deployment-Flexibility.svg',
          link: '/industry/saas/attachment/industry_saas_deployment-flexibility/',
          alt: '',
          author: '6',
          description: '',
          caption: '',
          name: 'industry_saas_deployment-flexibility',
          status: 'inherit',
          uploaded_to: 1124,
          date: '2025-11-21 22:14:46',
          modified: '2025-11-21 22:14:46',
          menu_order: 0,
          mime_type: 'image/svg+xml',
          type: 'image',
          subtype: 'svg+xml',
          icon: '/website-assets/media/default.png',
          width: 0,
          height: 0,
          sizes: {
            thumbnail:
              '/website-assets/media/2025/11/Industry_SaaS_Deployment-Flexibility.svg',
            'thumbnail-width': 1,
            'thumbnail-height': 1,
            medium:
              '/website-assets/media/2025/11/Industry_SaaS_Deployment-Flexibility.svg',
            'medium-width': 1,
            'medium-height': 1,
            medium_large:
              '/website-assets/media/2025/11/Industry_SaaS_Deployment-Flexibility.svg',
            'medium_large-width': 1,
            'medium_large-height': 1,
            large:
              '/website-assets/media/2025/11/Industry_SaaS_Deployment-Flexibility.svg',
            'large-width': 1,
            'large-height': 1,
            '1536x1536':
              '/website-assets/media/2025/11/Industry_SaaS_Deployment-Flexibility.svg',
            '1536x1536-width': 1,
            '1536x1536-height': 1,
            '2048x2048':
              '/website-assets/media/2025/11/Industry_SaaS_Deployment-Flexibility.svg',
            '2048x2048-width': 1,
            '2048x2048-height': 1,
          },
        },
        title: 'Deployment Flexibility',
        description:
          'Run Spice anywhere: as a sidecar, microservice, cluster, or on the managed Spice Cloud Platform.',
      },
      {
        icon: {
          ID: 1130,
          id: 1130,
          title: 'Industry_SaaS_Developer-First Design',
          filename: 'Industry_SaaS_Developer-First-Design.svg',
          filesize: 5164,
          url: '/website-assets/media/2025/11/Industry_SaaS_Developer-First-Design.svg',
          link: '/industry/saas/attachment/industry_saas_developer-first-design/',
          alt: '',
          author: '6',
          description: '',
          caption: '',
          name: 'industry_saas_developer-first-design',
          status: 'inherit',
          uploaded_to: 1124,
          date: '2025-11-21 22:14:47',
          modified: '2025-11-21 22:14:47',
          menu_order: 0,
          mime_type: 'image/svg+xml',
          type: 'image',
          subtype: 'svg+xml',
          icon: '/website-assets/media/default.png',
          width: 0,
          height: 0,
          sizes: {
            thumbnail:
              '/website-assets/media/2025/11/Industry_SaaS_Developer-First-Design.svg',
            'thumbnail-width': 1,
            'thumbnail-height': 1,
            medium:
              '/website-assets/media/2025/11/Industry_SaaS_Developer-First-Design.svg',
            'medium-width': 1,
            'medium-height': 1,
            medium_large:
              '/website-assets/media/2025/11/Industry_SaaS_Developer-First-Design.svg',
            'medium_large-width': 1,
            'medium_large-height': 1,
            large:
              '/website-assets/media/2025/11/Industry_SaaS_Developer-First-Design.svg',
            'large-width': 1,
            'large-height': 1,
            '1536x1536':
              '/website-assets/media/2025/11/Industry_SaaS_Developer-First-Design.svg',
            '1536x1536-width': 1,
            '1536x1536-height': 1,
            '2048x2048':
              '/website-assets/media/2025/11/Industry_SaaS_Developer-First-Design.svg',
            '2048x2048-width': 1,
            '2048x2048-height': 1,
          },
        },
        title: 'Developer-First Design',
        description:
          'Deploy and query with SQL or REST. No orchestration tools or data ops needed.',
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<Testimonials
  heading="Deployed in production"
  headingTag="h2"
  paragraph="Run data-intensive workloads on a high-performance engine trusted by teams building real-time systems at scale."
  items={['twilio', 'barracuda', 'nrc-tim']}
/>

<CarouselLogos
  fields={{
    heading: 'Trusted by global enterprises',
    logos: [
      {
        logo: {
          ID: 443,
          id: 443,
          title: 'Homepage_Logos_Twilio',
          filename: 'Homepage_Logos_Twilio-1.svg',
          filesize: 4020,
          url: '/website-assets/media/2025/11/Homepage_Logos_Twilio-1.svg',
          link: '/home/homepage_logos_twilio-2/',
          alt: 'Twilio logo',
          author: '6',
          description: '',
          caption: '',
          name: 'homepage_logos_twilio-2',
          status: 'inherit',
          uploaded_to: 2,
          date: '2025-11-05 18:46:45',
          modified: '2025-11-05 18:46:45',
          menu_order: 0,
          mime_type: 'image/svg+xml',
          type: 'image',
          subtype: 'svg+xml',
          icon: '/website-assets/media/default.png',
          width: 0,
          height: 0,
          sizes: {
            thumbnail:
              '/website-assets/media/2025/11/Homepage_Logos_Twilio-1.svg',
            'thumbnail-width': 1,
            'thumbnail-height': 1,
            medium: '/website-assets/media/2025/11/Homepage_Logos_Twilio-1.svg',
            'medium-width': 1,
            'medium-height': 1,
            medium_large:
              '/website-assets/media/2025/11/Homepage_Logos_Twilio-1.svg',
            'medium_large-width': 1,
            'medium_large-height': 1,
            large: '/website-assets/media/2025/11/Homepage_Logos_Twilio-1.svg',
            'large-width': 1,
            'large-height': 1,
            '1536x1536':
              '/website-assets/media/2025/11/Homepage_Logos_Twilio-1.svg',
            '1536x1536-width': 1,
            '1536x1536-height': 1,
            '2048x2048':
              '/website-assets/media/2025/11/Homepage_Logos_Twilio-1.svg',
            '2048x2048-width': 1,
            '2048x2048-height': 1,
          },
        },
      },
      {
        logo: {
          ID: 442,
          id: 442,
          title: 'Homepage_Logos_NRC',
          filename: 'Homepage_Logos_NRC-1.svg',
          filesize: 1030,
          url: '/website-assets/media/2025/11/Homepage_Logos_NRC-1.svg',
          link: '/home/homepage_logos_nrc-2/',
          alt: 'NRC Health logo',
          author: '6',
          description: '',
          caption: '',
          name: 'homepage_logos_nrc-2',
          status: 'inherit',
          uploaded_to: 2,
          date: '2025-11-05 18:46:45',
          modified: '2025-11-05 18:46:45',
          menu_order: 0,
          mime_type: 'image/svg+xml',
          type: 'image',
          subtype: 'svg+xml',
          icon: '/website-assets/media/default.png',
          width: 0,
          height: 0,
          sizes: {
            thumbnail: '/website-assets/media/2025/11/Homepage_Logos_NRC-1.svg',
            'thumbnail-width': 1,
            'thumbnail-height': 1,
            medium: '/website-assets/media/2025/11/Homepage_Logos_NRC-1.svg',
            'medium-width': 1,
            'medium-height': 1,
            medium_large:
              '/website-assets/media/2025/11/Homepage_Logos_NRC-1.svg',
            'medium_large-width': 1,
            'medium_large-height': 1,
            large: '/website-assets/media/2025/11/Homepage_Logos_NRC-1.svg',
            'large-width': 1,
            'large-height': 1,
            '1536x1536':
              '/website-assets/media/2025/11/Homepage_Logos_NRC-1.svg',
            '1536x1536-width': 1,
            '1536x1536-height': 1,
            '2048x2048':
              '/website-assets/media/2025/11/Homepage_Logos_NRC-1.svg',
            '2048x2048-width': 1,
            '2048x2048-height': 1,
          },
        },
      },
      {
        logo: {
          ID: 441,
          id: 441,
          title: 'Homepage_Logos_BasisSet',
          filename: 'Homepage_Logos_BasisSet-1.svg',
          filesize: 2629,
          url: '/website-assets/media/2025/11/Homepage_Logos_BasisSet-1.svg',
          link: '/home/homepage_logos_basisset-2/',
          alt: 'Basis Set Ventures logo',
          author: '6',
          description: '',
          caption: '',
          name: 'homepage_logos_basisset-2',
          status: 'inherit',
          uploaded_to: 2,
          date: '2025-11-05 18:46:45',
          modified: '2025-11-05 18:46:45',
          menu_order: 0,
          mime_type: 'image/svg+xml',
          type: 'image',
          subtype: 'svg+xml',
          icon: '/website-assets/media/default.png',
          width: 0,
          height: 0,
          sizes: {
            thumbnail:
              '/website-assets/media/2025/11/Homepage_Logos_BasisSet-1.svg',
            'thumbnail-width': 1,
            'thumbnail-height': 1,
            medium:
              '/website-assets/media/2025/11/Homepage_Logos_BasisSet-1.svg',
            'medium-width': 1,
            'medium-height': 1,
            medium_large:
              '/website-assets/media/2025/11/Homepage_Logos_BasisSet-1.svg',
            'medium_large-width': 1,
            'medium_large-height': 1,
            large:
              '/website-assets/media/2025/11/Homepage_Logos_BasisSet-1.svg',
            'large-width': 1,
            'large-height': 1,
            '1536x1536':
              '/website-assets/media/2025/11/Homepage_Logos_BasisSet-1.svg',
            '1536x1536-width': 1,
            '1536x1536-height': 1,
            '2048x2048':
              '/website-assets/media/2025/11/Homepage_Logos_BasisSet-1.svg',
            '2048x2048-width': 1,
            '2048x2048-height': 1,
          },
        },
      },
      {
        logo: {
          ID: 440,
          id: 440,
          title: 'Homepage_Logos_Barracuda',
          filename: 'Homepage_Logos_Barracuda-1.svg',
          filesize: 7450,
          url: '/website-assets/media/2025/11/Homepage_Logos_Barracuda-1.svg',
          link: '/home/homepage_logos_barracuda-2/',
          alt: 'Barracuda Networks logo',
          author: '6',
          description: '',
          caption: '',
          name: 'homepage_logos_barracuda-2',
          status: 'inherit',
          uploaded_to: 2,
          date: '2025-11-05 18:46:45',
          modified: '2025-11-05 18:46:45',
          menu_order: 0,
          mime_type: 'image/svg+xml',
          type: 'image',
          subtype: 'svg+xml',
          icon: '/website-assets/media/default.png',
          width: 0,
          height: 0,
          sizes: {
            thumbnail:
              '/website-assets/media/2025/11/Homepage_Logos_Barracuda-1.svg',
            'thumbnail-width': 1,
            'thumbnail-height': 1,
            medium:
              '/website-assets/media/2025/11/Homepage_Logos_Barracuda-1.svg',
            'medium-width': 1,
            'medium-height': 1,
            medium_large:
              '/website-assets/media/2025/11/Homepage_Logos_Barracuda-1.svg',
            'medium_large-width': 1,
            'medium_large-height': 1,
            large:
              '/website-assets/media/2025/11/Homepage_Logos_Barracuda-1.svg',
            'large-width': 1,
            'large-height': 1,
            '1536x1536':
              '/website-assets/media/2025/11/Homepage_Logos_Barracuda-1.svg',
            '1536x1536-width': 1,
            '1536x1536-height': 1,
            '2048x2048':
              '/website-assets/media/2025/11/Homepage_Logos_Barracuda-1.svg',
            '2048x2048-width': 1,
            '2048x2048-height': 1,
          },
        },
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<ContentResourceFeatured
  fields={{
    heading: 'Power real-time SaaS at scale',
    heading_tag: 'h2',
    paragraph:
      'Guides and examples to learn more about querying data, building apps, and integrating AI with Spice.',
    mode: 'default',
    resources: [
      {
        source: 'manual',
        resource: null,
        resource_manual: {
          eyebrow: 'Recipe',
          title: {
            title: 'Data Acceleration with DuckDB Cookbook ',
            url: 'https://github.com/spiceai/cookbook/blob/trunk/duckdb/accelerator/README.md',
            target: '_blank',
          },
          description:
            'This recipe will walkthrough how to accelerate a local copy of the taxi trips dataset stored in S3 using DuckDB as the data accelerator engine.',
          image: {
            ID: 1659,
            id: 1659,
            title: 'cookbooks jpeg',
            filename: 'cookbooks-jpeg.png',
            filesize: 2171698,
            url: '/website-assets/media/2025/12/cookbooks-jpeg.png',
            link: '/cookbooks-jpeg/',
            alt: '',
            author: '9',
            description: '',
            caption: '',
            name: 'cookbooks-jpeg',
            status: 'inherit',
            uploaded_to: 0,
            date: '2025-12-05 04:13:34',
            modified: '2025-12-05 04:13:34',
            menu_order: 0,
            mime_type: 'image/png',
            type: 'image',
            subtype: 'png',
            icon: '/website-assets/media/default.png',
            width: 1832,
            height: 1036,
            sizes: {
              thumbnail:
                '/website-assets/media/2025/12/cookbooks-jpeg-150x150.png',
              'thumbnail-width': 150,
              'thumbnail-height': 150,
              medium:
                '/website-assets/media/2025/12/cookbooks-jpeg-300x170.png',
              'medium-width': 300,
              'medium-height': 170,
              medium_large:
                '/website-assets/media/2025/12/cookbooks-jpeg-768x434.png',
              'medium_large-width': 768,
              'medium_large-height': 434,
              large:
                '/website-assets/media/2025/12/cookbooks-jpeg-1024x579.png',
              'large-width': 1024,
              'large-height': 579,
              '1536x1536':
                '/website-assets/media/2025/12/cookbooks-jpeg-1536x869.png',
              '1536x1536-width': 1536,
              '1536x1536-height': 869,
              '2048x2048': '/website-assets/media/2025/12/cookbooks-jpeg.png',
              '2048x2048-width': 1832,
              '2048x2048-height': 1036,
            },
          },
        },
      },
      {
        source: 'manual',
        resource: null,
        resource_manual: {
          eyebrow: 'Docs',
          title: {
            title: 'Spice Federation and Acceleration Docs',
            url: 'https://spiceai.org/docs/features/data-acceleration',
            target: '_blank',
          },
          description:
            'Learn how to get started with Spice federation and acceleration. Query, join, and accelerate data using SQL from multiple sources, including databases, data warehouses, and data lakes',
          image: {
            ID: 1661,
            id: 1661,
            title: 'Docs jpeg',
            filename: 'Docs-jpeg.jpeg',
            filesize: 103192,
            url: '/website-assets/media/2025/12/Docs-jpeg.jpeg',
            link: '/docs-jpeg/',
            alt: '',
            author: '9',
            description: '',
            caption: '',
            name: 'docs-jpeg',
            status: 'inherit',
            uploaded_to: 0,
            date: '2025-12-05 04:13:53',
            modified: '2025-12-05 04:13:53',
            menu_order: 0,
            mime_type: 'image/jpeg',
            type: 'image',
            subtype: 'jpeg',
            icon: '/website-assets/media/default.png',
            width: 1832,
            height: 1036,
            sizes: {
              thumbnail: '/website-assets/media/2025/12/Docs-jpeg-150x150.jpeg',
              'thumbnail-width': 150,
              'thumbnail-height': 150,
              medium: '/website-assets/media/2025/12/Docs-jpeg-300x170.jpeg',
              'medium-width': 300,
              'medium-height': 170,
              medium_large:
                '/website-assets/media/2025/12/Docs-jpeg-768x434.jpeg',
              'medium_large-width': 768,
              'medium_large-height': 434,
              large: '/website-assets/media/2025/12/Docs-jpeg-1024x579.jpeg',
              'large-width': 1024,
              'large-height': 579,
              '1536x1536':
                '/website-assets/media/2025/12/Docs-jpeg-1536x869.jpeg',
              '1536x1536-width': 1536,
              '1536x1536-height': 869,
              '2048x2048': '/website-assets/media/2025/12/Docs-jpeg.jpeg',
              '2048x2048-width': 1832,
              '2048x2048-height': 1036,
            },
          },
        },
      },
      {
        source: 'picker',
        resource: [
          {
            title:
              'Making Object Storage Operational for Real-Time and AI Workloads',
            slug: '/blog/making-object-storage-operational',
            excerpt:
              'TLDR Introduction Although legacy systems and workflows remain common, many enterprises are re-evaluating their architectures to meet new demands&nbsp; &#8211; driven in part, but not exclusively, by AI &#8211; that require support for more data-intensive and real-time applications. The underlying storage needs for these novel workloads are generally outside the bounds of a traditional operational [&hellip;]',
            image:
              '/website-assets/media/2025/11/68e42f8a5daa71c139c95512_Version-2.png',
            type: 'Blog',
            taxonomy: [],
          },
        ],
        resource_manual: {
          eyebrow: '',
          title: null,
          description: '',
          image: false,
        },
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<AccordionFaq
  fields={{
    heading: 'FAQs',
    heading_tag: 'h2',
    paragraph: 'Common questions about using Spice.ai in SaaS applications',
    items: [
      {
        title: 'How do SaaS companies use Spice.ai?',
        paragraph:
          '<p>SaaS companies use Spice.ai as a data and AI runtime that serves live, governed data to their applications. It federates queries across warehouses, databases, and object storage using <a href="/platform/sql-federation-acceleration">SQL federation and acceleration</a>, and materializes active datasets near the application for millisecond reads. This replaces brittle ETL pipelines and separate caching layers with a single runtime.</p>\n',
      },
      {
        title: 'How does Spice.ai support multi-tenant SaaS architectures?',
        paragraph:
          '<p>Spice.ai supports multi-tenancy through sharded deployments, where teams run multiple Spice Runtime instances split by customer, region, or workload. Each tenant gets dedicated resources and a tailored configuration for performance, security, and resiliency. The runtime runs as a sidecar, microservice, or cluster, or on the managed Spice Cloud Platform.</p>\n',
      },
      {
        title: 'How does Spice.ai keep SaaS application data fresh?',
        paragraph:
          '<p>Spice.ai keeps application data fresh using <a href="/feature/real-time-change-data-capture">real-time change data capture</a>, which streams updates from source systems into locally accelerated tables. Data such as CRM records stays continuously synced without batch jobs. Applications read from the local copy, so freshness does not come at the cost of latency.</p>\n',
      },
      {
        title: 'What does CDN-like performance mean for SaaS data?',
        paragraph:
          '<p>It means Spice.ai co-locates active datasets next to the application, the way a CDN places content near users. Reads are served from local materializations built on DuckDB, SQLite, and Arrow, keeping latency in milliseconds. Because the data lives with the application, it stays available during high traffic or upstream provider downtime.</p>\n',
      },
      {
        title: 'Can Spice.ai add AI features to an existing SaaS product?',
        paragraph:
          '<p>Yes. Spice.ai runs LLMs and hybrid search inside the same runtime that serves application data, so teams can add personalized recommendations, summaries, and automation without deploying a separate AI stack. Queries and inference outputs are traceable for compliance and governance.</p>\n',
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<TalkToAnEngineerCta />

---

## Integrations
URL: https://spice.ai/integrations
Date: 2025-11-21T00:46:47
Description: Spice offers 40+ integrations with leading databases, warehouses, data lakes, streaming systems, and more.

<HeroCenteredText
  fields={{
    graphic_position: 'no-graphic',
    heading_tag: 'h1',
    heading: 'Connect your data to Spice',
    paragraph:
      'Our data connectors enable you to query data where it already lives using standard SQL, accelerate working sets locally, and integrate operational and analytical datasets into one unified runtime.',
    cta: [
      {
        type: 'filled',
        cta: {
          title: 'View the docs',
          url: 'https://spiceai.org/docs/components/data-connectors',
          target: '',
        },
      },
      {
        type: 'bordered',
        cta: {
          title: 'Get a demo',
          url: 'https://meetings.hubspot.com/vladi-semenov',
          target: '',
        },
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<TabsIntegrationsGrid
  fields={{
    heading: 'Integrations with 40+ data sources',
    heading_tag: 'h2',
    paragraph:
      'Spice connects to the leading databases, warehouses, data lakes, streaming systems, and more.',
    enable_filters: false,
    source: 'integration',
    padding_top: 'unset',
    padding_bottom: 'unset',
    posts: [
      {
        title: 'AWS Glue',
        type: {
          term_id: 17,
          name: 'Data Connector',
          slug: 'data-connector',
          term_group: 0,
          term_taxonomy_id: 17,
          taxonomy: 'integration-type',
          description: '',
          parent: 0,
          count: 22,
          filter: 'raw',
        },
        icon: {
          ID: 1740,
          id: 1740,
          title: 'AWS Glue',
          filename: 'AWS-Glue.png',
          filesize: 881,
          url: '/website-assets/media/2025/12/AWS-Glue.png',
          link: '/?attachment_id=1740',
          alt: '',
          author: '9',
          description: '',
          caption: '',
          name: 'aws-glue',
          status: 'inherit',
          uploaded_to: 1739,
          date: '2025-12-20 00:54:14',
          modified: '2025-12-20 00:54:14',
          menu_order: 0,
          mime_type: 'image/png',
          type: 'image',
          subtype: 'png',
          icon: '/website-assets/media/default.png',
          width: 32,
          height: 32,
          sizes: {
            thumbnail: '/website-assets/media/2025/12/AWS-Glue.png',
            'thumbnail-width': 32,
            'thumbnail-height': 32,
            medium: '/website-assets/media/2025/12/AWS-Glue.png',
            'medium-width': 32,
            'medium-height': 32,
            medium_large: '/website-assets/media/2025/12/AWS-Glue.png',
            'medium_large-width': 32,
            'medium_large-height': 32,
            large: '/website-assets/media/2025/12/AWS-Glue.png',
            'large-width': 32,
            'large-height': 32,
            '1536x1536': '/website-assets/media/2025/12/AWS-Glue.png',
            '1536x1536-width': 32,
            '1536x1536-height': 32,
            '2048x2048': '/website-assets/media/2025/12/AWS-Glue.png',
            '2048x2048-width': 32,
            '2048x2048-height': 32,
          },
        },
        description:
          'AWS Glue is a serverless data integration service that simplifies the process of discovering, preparing, moving, and integrating data from multiple sources. The Glue Data Connector enables federated SQL querying on tables in an AWS Glue Data Catalog.',
        cta: {
          title: 'Learn more',
          url: 'https://spiceai.org/docs/components/data-connectors/glue',
          target: '_blank',
        },
      },
      {
        title: 'Amazon S3',
        type: {
          term_id: 17,
          name: 'Data Connector',
          slug: 'data-connector',
          term_group: 0,
          term_taxonomy_id: 17,
          taxonomy: 'integration-type',
          description: '',
          parent: 0,
          count: 22,
          filter: 'raw',
        },
        icon: {
          ID: 1736,
          id: 1736,
          title: 'Amazon S3 Logo',
          filename: 'Amazon-S3-Logo.png',
          filesize: 1054,
          url: '/website-assets/media/2025/12/Amazon-S3-Logo.png',
          link: '/?attachment_id=1736',
          alt: '',
          author: '9',
          description: '',
          caption: '',
          name: 'amazon-s3-logo',
          status: 'inherit',
          uploaded_to: 1734,
          date: '2025-12-20 00:46:24',
          modified: '2025-12-20 00:46:24',
          menu_order: 0,
          mime_type: 'image/png',
          type: 'image',
          subtype: 'png',
          icon: '/website-assets/media/default.png',
          width: 53,
          height: 64,
          sizes: {
            thumbnail: '/website-assets/media/2025/12/Amazon-S3-Logo.png',
            'thumbnail-width': 53,
            'thumbnail-height': 64,
            medium: '/website-assets/media/2025/12/Amazon-S3-Logo.png',
            'medium-width': 53,
            'medium-height': 64,
            medium_large: '/website-assets/media/2025/12/Amazon-S3-Logo.png',
            'medium_large-width': 53,
            'medium_large-height': 64,
            large: '/website-assets/media/2025/12/Amazon-S3-Logo.png',
            'large-width': 53,
            'large-height': 64,
            '1536x1536': '/website-assets/media/2025/12/Amazon-S3-Logo.png',
            '1536x1536-width': 53,
            '1536x1536-height': 64,
            '2048x2048': '/website-assets/media/2025/12/Amazon-S3-Logo.png',
            '2048x2048-width': 53,
            '2048x2048-height': 64,
          },
        },
        description:
          'Amazon Simple Storage Service (S3) is a service offered by Amazon Web Services (AWS) that provides object storage. The S3 Data Connector enables federated SQL querying on files stored in S3 or S3-compatible systems (e.g., MinIO, Cloudflare R2, NetApp OnTap).',
        cta: {
          title: 'Learn more',
          url: 'https://spiceai.org/docs/components/data-connectors/s3',
          target: '_blank',
        },
      },
      {
        title: 'Amazon DynamoDB',
        type: {
          term_id: 17,
          name: 'Data Connector',
          slug: 'data-connector',
          term_group: 0,
          term_taxonomy_id: 17,
          taxonomy: 'integration-type',
          description: '',
          parent: 0,
          count: 22,
          filter: 'raw',
        },
        icon: {
          ID: 1324,
          id: 1324,
          title: 'download__3_-removebg-preview (1)',
          filename: 'download__3_-removebg-preview-1.png',
          filesize: 37255,
          url: '/website-assets/media/2025/11/download__3_-removebg-preview-1.png',
          link: '/?attachment_id=1324',
          alt: '',
          author: '7',
          description: '',
          caption: '',
          name: 'download__3_-removebg-preview-1',
          status: 'inherit',
          uploaded_to: 1242,
          date: '2025-11-24 23:31:04',
          modified: '2025-11-24 23:31:04',
          menu_order: 0,
          mime_type: 'image/png',
          type: 'image',
          subtype: 'png',
          icon: '/website-assets/media/default.png',
          width: 236,
          height: 214,
          sizes: {
            thumbnail:
              '/website-assets/media/2025/11/download__3_-removebg-preview-1-150x150.png',
            'thumbnail-width': 150,
            'thumbnail-height': 150,
            medium: '/website-assets/media/2025/11/download__3_-removebg-preview-1.png',
            'medium-width': 236,
            'medium-height': 214,
            medium_large: '/website-assets/media/2025/11/download__3_-removebg-preview-1.png',
            'medium_large-width': 236,
            'medium_large-height': 214,
            large: '/website-assets/media/2025/11/download__3_-removebg-preview-1.png',
            'large-width': 236,
            'large-height': 214,
            '1536x1536': '/website-assets/media/2025/11/download__3_-removebg-preview-1.png',
            '1536x1536-width': 236,
            '1536x1536-height': 214,
            '2048x2048': '/website-assets/media/2025/11/download__3_-removebg-preview-1.png',
            '2048x2048-width': 236,
            '2048x2048-height': 214,
          },
        },
        description:
          'Amazon DynamoDB is a fully managed NoSQL database service that provides fast and predictable performance with seamless scalability. This connector enables using DynamoDB tables as data sources for federated SQL queries in Spice.',
        cta: {
          title: 'Learn more',
          url: 'https://spiceai.org/docs/components/data-connectors/dynamodb',
          target: '_blank',
        },
      },
      {
        title: 'Amazon Redshift',
        type: {
          term_id: 17,
          name: 'Data Connector',
          slug: 'data-connector',
          term_group: 0,
          term_taxonomy_id: 17,
          taxonomy: 'integration-type',
          description: '',
          parent: 0,
          count: 22,
          filter: 'raw',
        },
        icon: {
          url: '/website-assets/media/2025/11/Redshift.svg',
          alt: 'Amazon Redshift logo',
          width: 72,
          height: 72,
        },
        description:
          'Amazon Redshift is a columnar OLAP database compatible with PostgreSQL. In Spice, Redshift is connected via the PostgreSQL data connector using Redshift cluster connection parameters.',
        cta: {
          title: 'Learn more',
          url: 'https://spiceai.org/docs/components/data-connectors/redshift',
          target: '_blank',
        },
      },
      {
        title: 'Apache Kafka',
        type: {
          term_id: 17,
          name: 'Data Connector',
          slug: 'data-connector',
          term_group: 0,
          term_taxonomy_id: 17,
          taxonomy: 'integration-type',
          description: '',
          parent: 0,
          count: 22,
          filter: 'raw',
        },
        icon: {
          ID: 1323,
          id: 1323,
          title: 'download__22_-removebg-preview',
          filename: 'download__22_-removebg-preview.png',
          filesize: 36900,
          url: '/website-assets/media/2025/11/download__22_-removebg-preview.png',
          link: '/?attachment_id=1323',
          alt: '',
          author: '7',
          description: '',
          caption: '',
          name: 'download__22_-removebg-preview',
          status: 'inherit',
          uploaded_to: 1240,
          date: '2025-11-24 23:30:51',
          modified: '2025-11-24 23:30:51',
          menu_order: 0,
          mime_type: 'image/png',
          type: 'image',
          subtype: 'png',
          icon: '/website-assets/media/default.png',
          width: 176,
          height: 286,
          sizes: {
            thumbnail:
              '/website-assets/media/2025/11/download__22_-removebg-preview-150x150.png',
            'thumbnail-width': 150,
            'thumbnail-height': 150,
            medium: '/website-assets/media/2025/11/download__22_-removebg-preview.png',
            'medium-width': 176,
            'medium-height': 286,
            medium_large: '/website-assets/media/2025/11/download__22_-removebg-preview.png',
            'medium_large-width': 176,
            'medium_large-height': 286,
            large: '/website-assets/media/2025/11/download__22_-removebg-preview.png',
            'large-width': 176,
            'large-height': 286,
            '1536x1536': '/website-assets/media/2025/11/download__22_-removebg-preview.png',
            '1536x1536-width': 176,
            '1536x1536-height': 286,
            '2048x2048': '/website-assets/media/2025/11/download__22_-removebg-preview.png',
            '2048x2048-width': 176,
            '2048x2048-height': 286,
          },
        },
        description:
          'Kafka is an open-source distributed event streaming platform used for high-performance data pipelines, streaming analytics, and data integration. The Kafka Data Connector enables direct acceleration of data from Apache Kafka topics.',
        cta: {
          title: 'Learn more',
          url: 'https://spiceai.org/docs/components/data-connectors/kafka',
          target: '_blank',
        },
      },
      {
        title: 'Debezium',
        type: {
          term_id: 17,
          name: 'Data Connector',
          slug: 'data-connector',
          term_group: 0,
          term_taxonomy_id: 17,
          taxonomy: 'integration-type',
          description: '',
          parent: 0,
          count: 22,
          filter: 'raw',
        },
        icon: {
          ID: 1239,
          id: 1239,
          title: 'download (2)',
          filename: 'download-2.jpeg',
          filesize: 6132,
          url: '/website-assets/media/2025/11/download-2.jpeg',
          link: '/?attachment_id=1239',
          alt: '',
          author: '7',
          description: '',
          caption: '',
          name: 'download-2-2',
          status: 'inherit',
          uploaded_to: 1238,
          date: '2025-11-24 19:45:22',
          modified: '2025-11-24 19:45:22',
          menu_order: 0,
          mime_type: 'image/jpeg',
          type: 'image',
          subtype: 'jpeg',
          icon: '/website-assets/media/default.png',
          width: 224,
          height: 224,
          sizes: {
            thumbnail: '/website-assets/media/2025/11/download-2-150x150.jpeg',
            'thumbnail-width': 150,
            'thumbnail-height': 150,
            medium: '/website-assets/media/2025/11/download-2.jpeg',
            'medium-width': 224,
            'medium-height': 224,
            medium_large: '/website-assets/media/2025/11/download-2.jpeg',
            'medium_large-width': 224,
            'medium_large-height': 224,
            large: '/website-assets/media/2025/11/download-2.jpeg',
            'large-width': 224,
            'large-height': 224,
            '1536x1536': '/website-assets/media/2025/11/download-2.jpeg',
            '1536x1536-width': 224,
            '1536x1536-height': 224,
            '2048x2048': '/website-assets/media/2025/11/download-2.jpeg',
            '2048x2048-width': 224,
            '2048x2048-height': 224,
          },
        },
        description:
          'Debezium is an open-source platform that enables Change Data Capture (CDC) for efficient real-time updates of locally accelerated datasets. Spice supports connecting to a Kafka topic managed by Debezium to keep datasets up-to-date with source data.',
        cta: {
          title: 'Learn more',
          url: 'https://spiceai.org/docs/components/data-connectors/debezium',
          target: '_blank',
        },
      },
      {
        title: 'Clickhouse',
        type: {
          term_id: 17,
          name: 'Data Connector',
          slug: 'data-connector',
          term_group: 0,
          term_taxonomy_id: 17,
          taxonomy: 'integration-type',
          description: '',
          parent: 0,
          count: 22,
          filter: 'raw',
        },
        icon: {
          ID: 1237,
          id: 1237,
          title: 'download (21)',
          filename: 'download-21.png',
          filesize: 556,
          url: '/website-assets/media/2025/11/download-21.png',
          link: '/?attachment_id=1237',
          alt: '',
          author: '7',
          description: '',
          caption: '',
          name: 'download-21',
          status: 'inherit',
          uploaded_to: 1236,
          date: '2025-11-24 19:43:39',
          modified: '2025-11-24 19:43:39',
          menu_order: 0,
          mime_type: 'image/png',
          type: 'image',
          subtype: 'png',
          icon: '/website-assets/media/default.png',
          width: 225,
          height: 225,
          sizes: {
            thumbnail: '/website-assets/media/2025/11/download-21-150x150.png',
            'thumbnail-width': 150,
            'thumbnail-height': 150,
            medium: '/website-assets/media/2025/11/download-21.png',
            'medium-width': 225,
            'medium-height': 225,
            medium_large: '/website-assets/media/2025/11/download-21.png',
            'medium_large-width': 225,
            'medium_large-height': 225,
            large: '/website-assets/media/2025/11/download-21.png',
            'large-width': 225,
            'large-height': 225,
            '1536x1536': '/website-assets/media/2025/11/download-21.png',
            '1536x1536-width': 225,
            '1536x1536-height': 225,
            '2048x2048': '/website-assets/media/2025/11/download-21.png',
            '2048x2048-width': 225,
            '2048x2048-height': 225,
          },
        },
        description:
          'ClickHouse is a fast, open-source columnar database management system designed for online analytical processing (OLAP) and real-time analytics. This connector enables federated SQL queries from a ClickHouse server.',
        cta: {
          title: 'Learn more',
          url: 'https://spiceai.org/docs/components/data-connectors/clickhouse',
          target: '_blank',
        },
      },
      {
        title: 'Oracle',
        type: {
          term_id: 17,
          name: 'Data Connector',
          slug: 'data-connector',
          term_group: 0,
          term_taxonomy_id: 17,
          taxonomy: 'integration-type',
          description: '',
          parent: 0,
          count: 22,
          filter: 'raw',
        },
        icon: {
          ID: 1321,
          id: 1321,
          title: 'download__20_-removebg-preview',
          filename: 'download__20_-removebg-preview.png',
          filesize: 22250,
          url: '/website-assets/media/2025/11/download__20_-removebg-preview.png',
          link: '/?attachment_id=1321',
          alt: '',
          author: '7',
          description: '',
          caption: '',
          name: 'download__20_-removebg-preview',
          status: 'inherit',
          uploaded_to: 1232,
          date: '2025-11-24 23:29:26',
          modified: '2025-11-24 23:29:26',
          menu_order: 0,
          mime_type: 'image/png',
          type: 'image',
          subtype: 'png',
          icon: '/website-assets/media/default.png',
          width: 318,
          height: 159,
          sizes: {
            thumbnail:
              '/website-assets/media/2025/11/download__20_-removebg-preview-150x150.png',
            'thumbnail-width': 150,
            'thumbnail-height': 150,
            medium: '/website-assets/media/2025/11/download__20_-removebg-preview-300x150.png',
            'medium-width': 300,
            'medium-height': 150,
            medium_large: '/website-assets/media/2025/11/download__20_-removebg-preview.png',
            'medium_large-width': 318,
            'medium_large-height': 159,
            large: '/website-assets/media/2025/11/download__20_-removebg-preview.png',
            'large-width': 318,
            'large-height': 159,
            '1536x1536': '/website-assets/media/2025/11/download__20_-removebg-preview.png',
            '1536x1536-width': 318,
            '1536x1536-height': 159,
            '2048x2048': '/website-assets/media/2025/11/download__20_-removebg-preview.png',
            '2048x2048-width': 318,
            '2048x2048-height': 159,
          },
        },
        description:
          'Oracle offers a comprehensive and fully integrated cloud platform service. The Oracle Data Connector enables SQL queries on data stored in Oracle databases, including on-premises instances, Oracle Cloud User-Managed Databases, and Oracle Cloud Autonomous Databases (ADB).',
        cta: {
          title: 'Learn more',
          url: 'https://spiceai.org/docs/components/data-connectors/oracle',
          target: '_blank',
        },
      },
      {
        title: 'Apache Iceberg',
        type: {
          term_id: 17,
          name: 'Data Connector',
          slug: 'data-connector',
          term_group: 0,
          term_taxonomy_id: 17,
          taxonomy: 'integration-type',
          description: '',
          parent: 0,
          count: 22,
          filter: 'raw',
        },
        icon: {
          ID: 1319,
          id: 1319,
          title: 'download__18_-removebg-preview',
          filename: 'download__18_-removebg-preview.png',
          filesize: 43325,
          url: '/website-assets/media/2025/11/download__18_-removebg-preview.png',
          link: '/?attachment_id=1319',
          alt: '',
          author: '7',
          description: '',
          caption: '',
          name: 'download__18_-removebg-preview',
          status: 'inherit',
          uploaded_to: 1228,
          date: '2025-11-24 23:27:54',
          modified: '2025-11-24 23:27:54',
          menu_order: 0,
          mime_type: 'image/png',
          type: 'image',
          subtype: 'png',
          icon: '/website-assets/media/default.png',
          width: 225,
          height: 225,
          sizes: {
            thumbnail:
              '/website-assets/media/2025/11/download__18_-removebg-preview-150x150.png',
            'thumbnail-width': 150,
            'thumbnail-height': 150,
            medium: '/website-assets/media/2025/11/download__18_-removebg-preview.png',
            'medium-width': 225,
            'medium-height': 225,
            medium_large: '/website-assets/media/2025/11/download__18_-removebg-preview.png',
            'medium_large-width': 225,
            'medium_large-height': 225,
            large: '/website-assets/media/2025/11/download__18_-removebg-preview.png',
            'large-width': 225,
            'large-height': 225,
            '1536x1536': '/website-assets/media/2025/11/download__18_-removebg-preview.png',
            '1536x1536-width': 225,
            '1536x1536-height': 225,
            '2048x2048': '/website-assets/media/2025/11/download__18_-removebg-preview.png',
            '2048x2048-width': 225,
            '2048x2048-height': 225,
          },
        },
        description:
          'Apache Iceberg is a high-performance format for huge analytic tables. The Iceberg Data Connector helps query Apache Iceberg tables using federated SQL.',
        cta: {
          title: 'Learn more',
          url: 'https://spiceai.org/docs/components/data-connectors/iceberg',
          target: '_blank',
        },
      },
      {
        title: 'Apache Spark',
        type: {
          term_id: 17,
          name: 'Data Connector',
          slug: 'data-connector',
          term_group: 0,
          term_taxonomy_id: 17,
          taxonomy: 'integration-type',
          description: '',
          parent: 0,
          count: 22,
          filter: 'raw',
        },
        icon: {
          ID: 1318,
          id: 1318,
          title: 'images-removebg-preview',
          filename: 'images-removebg-preview.png',
          filesize: 39405,
          url: '/website-assets/media/2025/11/images-removebg-preview.png',
          link: '/?attachment_id=1318',
          alt: '',
          author: '7',
          description: '',
          caption: '',
          name: 'images-removebg-preview',
          status: 'inherit',
          uploaded_to: 1226,
          date: '2025-11-24 23:27:36',
          modified: '2025-11-24 23:27:36',
          menu_order: 0,
          mime_type: 'image/png',
          type: 'image',
          subtype: 'png',
          icon: '/website-assets/media/default.png',
          width: 225,
          height: 225,
          sizes: {
            thumbnail: '/website-assets/media/2025/11/images-removebg-preview-150x150.png',
            'thumbnail-width': 150,
            'thumbnail-height': 150,
            medium: '/website-assets/media/2025/11/images-removebg-preview.png',
            'medium-width': 225,
            'medium-height': 225,
            medium_large: '/website-assets/media/2025/11/images-removebg-preview.png',
            'medium_large-width': 225,
            'medium_large-height': 225,
            large: '/website-assets/media/2025/11/images-removebg-preview.png',
            'large-width': 225,
            'large-height': 225,
            '1536x1536': '/website-assets/media/2025/11/images-removebg-preview.png',
            '1536x1536-width': 225,
            '1536x1536-height': 225,
            '2048x2048': '/website-assets/media/2025/11/images-removebg-preview.png',
            '2048x2048-width': 225,
            '2048x2048-height': 225,
          },
        },
        description:
          'Apache Spark is a multi-language engine for executing data engineering, data science, and machine learning. Use the connector for federated SQL queries against a Spark Cluster using Spark Connect',
        cta: {
          title: 'Learn more',
          url: 'https://spiceai.org/docs/components/data-connectors/spark',
          target: '_blank',
        },
      },
      {
        title: 'ADBC',
        type: {
          term_id: 17,
          name: 'Data Connector',
          slug: 'data-connector',
          term_group: 0,
          term_taxonomy_id: 17,
          taxonomy: 'integration-type',
          description: '',
          parent: 0,
          count: 22,
          filter: 'raw',
        },
        icon: {
          url: '/website-assets/media/2025/11/adbc-icon.svg',
          alt: 'ADBC logo',
        },
        description:
          'ADBC (Arrow Database Connectivity) is a columnar alternative to JDBC/ODBC for analytical data access using Apache Arrow. The ADBC connector supports federated SQL through runtime-loaded drivers and a managed connection pool.',
        cta: {
          title: 'Learn more',
          url: 'https://spiceai.org/docs/components/data-connectors/adbc',
          target: '_blank',
        },
      },
      {
        title: 'ODBC',
        type: {
          term_id: 17,
          name: 'Data Connector',
          slug: 'data-connector',
          term_group: 0,
          term_taxonomy_id: 17,
          taxonomy: 'integration-type',
          description: '',
          parent: 0,
          count: 22,
          filter: 'raw',
        },
        icon: {
          ID: 1317,
          id: 1317,
          title: 'download__17_-removebg-preview',
          filename: 'download__17_-removebg-preview.png',
          filesize: 24065,
          url: '/website-assets/media/2025/11/download__17_-removebg-preview.png',
          link: '/?attachment_id=1317',
          alt: '',
          author: '7',
          description: '',
          caption: '',
          name: 'download__17_-removebg-preview',
          status: 'inherit',
          uploaded_to: 1224,
          date: '2025-11-24 23:27:20',
          modified: '2025-11-24 23:27:20',
          menu_order: 0,
          mime_type: 'image/png',
          type: 'image',
          subtype: 'png',
          icon: '/website-assets/media/default.png',
          width: 225,
          height: 225,
          sizes: {
            thumbnail:
              '/website-assets/media/2025/11/download__17_-removebg-preview-150x150.png',
            'thumbnail-width': 150,
            'thumbnail-height': 150,
            medium: '/website-assets/media/2025/11/download__17_-removebg-preview.png',
            'medium-width': 225,
            'medium-height': 225,
            medium_large: '/website-assets/media/2025/11/download__17_-removebg-preview.png',
            'medium_large-width': 225,
            'medium_large-height': 225,
            large: '/website-assets/media/2025/11/download__17_-removebg-preview.png',
            'large-width': 225,
            'large-height': 225,
            '1536x1536': '/website-assets/media/2025/11/download__17_-removebg-preview.png',
            '1536x1536-width': 225,
            '1536x1536-height': 225,
            '2048x2048': '/website-assets/media/2025/11/download__17_-removebg-preview.png',
            '2048x2048-width': 225,
            '2048x2048-height': 225,
          },
        },
        description:
          'ODBC (Open Database Connectivity) is a standard API that allows applications to connect to and interact with various database management systems using a common interface.  Connect to any ODBC database for federated/accelerated SQL queries with the Spice ODBC Connector.',
        cta: {
          title: 'Learn more',
          url: 'https://spiceai.org/docs/components/data-connectors/odbc',
          target: '_blank',
        },
      },
      {
        title: 'Microsoft SQL Server',
        type: {
          term_id: 17,
          name: 'Data Connector',
          slug: 'data-connector',
          term_group: 0,
          term_taxonomy_id: 17,
          taxonomy: 'integration-type',
          description: '',
          parent: 0,
          count: 22,
          filter: 'raw',
        },
        icon: {
          ID: 1315,
          id: 1315,
          title: 'download__16_-removebg-preview',
          filename: 'download__16_-removebg-preview.png',
          filesize: 39040,
          url: '/website-assets/media/2025/11/download__16_-removebg-preview.png',
          link: '/?attachment_id=1315',
          alt: '',
          author: '7',
          description: '',
          caption: '',
          name: 'download__16_-removebg-preview',
          status: 'inherit',
          uploaded_to: 1222,
          date: '2025-11-24 23:27:02',
          modified: '2025-11-24 23:27:02',
          menu_order: 0,
          mime_type: 'image/png',
          type: 'image',
          subtype: 'png',
          icon: '/website-assets/media/default.png',
          width: 225,
          height: 225,
          sizes: {
            thumbnail:
              '/website-assets/media/2025/11/download__16_-removebg-preview-150x150.png',
            'thumbnail-width': 150,
            'thumbnail-height': 150,
            medium: '/website-assets/media/2025/11/download__16_-removebg-preview.png',
            'medium-width': 225,
            'medium-height': 225,
            medium_large: '/website-assets/media/2025/11/download__16_-removebg-preview.png',
            'medium_large-width': 225,
            'medium_large-height': 225,
            large: '/website-assets/media/2025/11/download__16_-removebg-preview.png',
            'large-width': 225,
            'large-height': 225,
            '1536x1536': '/website-assets/media/2025/11/download__16_-removebg-preview.png',
            '1536x1536-width': 225,
            '1536x1536-height': 225,
            '2048x2048': '/website-assets/media/2025/11/download__16_-removebg-preview.png',
            '2048x2048-width': 225,
            '2048x2048-height': 225,
          },
        },
        description:
          'Microsoft SQL Server (MSSQL) is a proprietary relational database management system (RDBMS). The Microsoft SQL Server Data Connector enables federated/accelerated SQL queries on data stored in MSSQL databases.',
        cta: {
          title: 'Learn more',
          url: 'https://spiceai.org/docs/components/data-connectors/mssql',
          target: '_blank',
        },
      },
      {
        title: 'FlightSQL',
        type: {
          term_id: 17,
          name: 'Data Connector',
          slug: 'data-connector',
          term_group: 0,
          term_taxonomy_id: 17,
          taxonomy: 'integration-type',
          description: '',
          parent: 0,
          count: 22,
          filter: 'raw',
        },
        icon: {
          ID: 1314,
          id: 1314,
          title: 'download__15_-removebg-preview',
          filename: 'download__15_-removebg-preview.png',
          filesize: 18631,
          url: '/website-assets/media/2025/11/download__15_-removebg-preview.png',
          link: '/?attachment_id=1314',
          alt: '',
          author: '7',
          description: '',
          caption: '',
          name: 'download__15_-removebg-preview',
          status: 'inherit',
          uploaded_to: 1219,
          date: '2025-11-24 23:26:46',
          modified: '2025-11-24 23:26:46',
          menu_order: 0,
          mime_type: 'image/png',
          type: 'image',
          subtype: 'png',
          icon: '/website-assets/media/default.png',
          width: 225,
          height: 225,
          sizes: {
            thumbnail:
              '/website-assets/media/2025/11/download__15_-removebg-preview-150x150.png',
            'thumbnail-width': 150,
            'thumbnail-height': 150,
            medium: '/website-assets/media/2025/11/download__15_-removebg-preview.png',
            'medium-width': 225,
            'medium-height': 225,
            medium_large: '/website-assets/media/2025/11/download__15_-removebg-preview.png',
            'medium_large-width': 225,
            'medium_large-height': 225,
            large: '/website-assets/media/2025/11/download__15_-removebg-preview.png',
            'large-width': 225,
            'large-height': 225,
            '1536x1536': '/website-assets/media/2025/11/download__15_-removebg-preview.png',
            '1536x1536-width': 225,
            '1536x1536-height': 225,
            '2048x2048': '/website-assets/media/2025/11/download__15_-removebg-preview.png',
            '2048x2048-width': 225,
            '2048x2048-height': 225,
          },
        },
        description:
          'FlightSQL is an open-source protocol built on Apache Arrow Flight for high-performance, columnar data transfer between SQL databases and clients. Use the connector for federated SQL queries across any Flight SQL compatible server.',
        cta: {
          title: 'Learn more',
          url: 'https://spiceai.org/docs/components/data-connectors/flightsql',
          target: '_blank',
        },
      },
      {
        title: 'GraphQL',
        type: {
          term_id: 17,
          name: 'Data Connector',
          slug: 'data-connector',
          term_group: 0,
          term_taxonomy_id: 17,
          taxonomy: 'integration-type',
          description: '',
          parent: 0,
          count: 22,
          filter: 'raw',
        },
        icon: {
          ID: 1313,
          id: 1313,
          title: 'download__13_-removebg-preview',
          filename: 'download__13_-removebg-preview.png',
          filesize: 39266,
          url: '/website-assets/media/2025/11/download__13_-removebg-preview.png',
          link: '/?attachment_id=1313',
          alt: '',
          author: '7',
          description: '',
          caption: '',
          name: 'download__13_-removebg-preview',
          status: 'inherit',
          uploaded_to: 1217,
          date: '2025-11-24 23:26:29',
          modified: '2025-11-24 23:26:29',
          menu_order: 0,
          mime_type: 'image/png',
          type: 'image',
          subtype: 'png',
          icon: '/website-assets/media/default.png',
          width: 225,
          height: 225,
          sizes: {
            thumbnail:
              '/website-assets/media/2025/11/download__13_-removebg-preview-150x150.png',
            'thumbnail-width': 150,
            'thumbnail-height': 150,
            medium: '/website-assets/media/2025/11/download__13_-removebg-preview.png',
            'medium-width': 225,
            'medium-height': 225,
            medium_large: '/website-assets/media/2025/11/download__13_-removebg-preview.png',
            'medium_large-width': 225,
            'medium_large-height': 225,
            large: '/website-assets/media/2025/11/download__13_-removebg-preview.png',
            'large-width': 225,
            'large-height': 225,
            '1536x1536': '/website-assets/media/2025/11/download__13_-removebg-preview.png',
            '1536x1536-width': 225,
            '1536x1536-height': 225,
            '2048x2048': '/website-assets/media/2025/11/download__13_-removebg-preview.png',
            '2048x2048-width': 225,
            '2048x2048-height': 225,
          },
        },
        description:
          'GraphQL is an open‑source query language for APIs and a server‑side runtime. The GraphQL Data Connector enables federated SQL queries on any GraphQL endpoint ',
        cta: {
          title: 'Learn more',
          url: 'https://spiceai.org/docs/components/data-connectors/graphql',
          target: '_blank',
        },
      },
      {
        title: 'Delta Lake',
        type: {
          term_id: 17,
          name: 'Data Connector',
          slug: 'data-connector',
          term_group: 0,
          term_taxonomy_id: 17,
          taxonomy: 'integration-type',
          description: '',
          parent: 0,
          count: 22,
          filter: 'raw',
        },
        icon: {
          ID: 1312,
          id: 1312,
          title: 'download__12_-removebg-preview',
          filename: 'download__12_-removebg-preview.png',
          filesize: 36533,
          url: '/website-assets/media/2025/11/download__12_-removebg-preview.png',
          link: '/?attachment_id=1312',
          alt: '',
          author: '7',
          description: '',
          caption: '',
          name: 'download__12_-removebg-preview',
          status: 'inherit',
          uploaded_to: 1215,
          date: '2025-11-24 23:26:14',
          modified: '2025-11-24 23:26:14',
          menu_order: 0,
          mime_type: 'image/png',
          type: 'image',
          subtype: 'png',
          icon: '/website-assets/media/default.png',
          width: 228,
          height: 221,
          sizes: {
            thumbnail:
              '/website-assets/media/2025/11/download__12_-removebg-preview-150x150.png',
            'thumbnail-width': 150,
            'thumbnail-height': 150,
            medium: '/website-assets/media/2025/11/download__12_-removebg-preview.png',
            'medium-width': 228,
            'medium-height': 221,
            medium_large: '/website-assets/media/2025/11/download__12_-removebg-preview.png',
            'medium_large-width': 228,
            'medium_large-height': 221,
            large: '/website-assets/media/2025/11/download__12_-removebg-preview.png',
            'large-width': 228,
            'large-height': 221,
            '1536x1536': '/website-assets/media/2025/11/download__12_-removebg-preview.png',
            '1536x1536-width': 228,
            '1536x1536-height': 221,
            '2048x2048': '/website-assets/media/2025/11/download__12_-removebg-preview.png',
            '2048x2048-width': 228,
            '2048x2048-height': 221,
          },
        },
        description:
          'An open-source storage layer that improves the reliability and performance of data lakes by bringing database-like features such as ACID transactions and schema enforcement. The Delta Lake data connector enables SQL queries from Delta Lake tables.',
        cta: {
          title: 'Learn more',
          url: 'https://spiceai.org/docs/components/data-connectors/delta-lake',
          target: '_blank',
        },
      },
      {
        title: 'Dremio',
        type: {
          term_id: 17,
          name: 'Data Connector',
          slug: 'data-connector',
          term_group: 0,
          term_taxonomy_id: 17,
          taxonomy: 'integration-type',
          description: '',
          parent: 0,
          count: 22,
          filter: 'raw',
        },
        icon: {
          ID: 1311,
          id: 1311,
          title: 'download__11_-removebg-preview',
          filename: 'download__11_-removebg-preview.png',
          filesize: 40314,
          url: '/website-assets/media/2025/11/download__11_-removebg-preview.png',
          link: '/?attachment_id=1311',
          alt: '',
          author: '7',
          description: '',
          caption: '',
          name: 'download__11_-removebg-preview',
          status: 'inherit',
          uploaded_to: 1211,
          date: '2025-11-24 23:25:47',
          modified: '2025-11-24 23:25:47',
          menu_order: 0,
          mime_type: 'image/png',
          type: 'image',
          subtype: 'png',
          icon: '/website-assets/media/default.png',
          width: 225,
          height: 225,
          sizes: {
            thumbnail:
              '/website-assets/media/2025/11/download__11_-removebg-preview-150x150.png',
            'thumbnail-width': 150,
            'thumbnail-height': 150,
            medium: '/website-assets/media/2025/11/download__11_-removebg-preview.png',
            'medium-width': 225,
            'medium-height': 225,
            medium_large: '/website-assets/media/2025/11/download__11_-removebg-preview.png',
            'medium_large-width': 225,
            'medium_large-height': 225,
            large: '/website-assets/media/2025/11/download__11_-removebg-preview.png',
            'large-width': 225,
            'large-height': 225,
            '1536x1536': '/website-assets/media/2025/11/download__11_-removebg-preview.png',
            '1536x1536-width': 225,
            '1536x1536-height': 225,
            '2048x2048': '/website-assets/media/2025/11/download__11_-removebg-preview.png',
            '2048x2048-width': 225,
            '2048x2048-height': 225,
          },
        },
        description:
          'Dremio is a data lake engine that enables high-performance SQL queries directly on data lake storage. This connector enables using Dremio as a data source for federated SQL queries, including running Spice side-by-side during a <a href="/blog/migrating-off-dremio-phased-guide">phased migration off Dremio</a>.',
        cta: {
          title: 'Learn more',
          url: 'https://spiceai.org/docs/components/data-connectors/dremio',
          target: '_blank',
        },
      },
      {
        title: 'DuckDB',
        type: {
          term_id: 17,
          name: 'Data Connector',
          slug: 'data-connector',
          term_group: 0,
          term_taxonomy_id: 17,
          taxonomy: 'integration-type',
          description: '',
          parent: 0,
          count: 22,
          filter: 'raw',
        },
        icon: {
          ID: 1310,
          id: 1310,
          title: 'download__10_-removebg-preview',
          filename: 'download__10_-removebg-preview.png',
          filesize: 24573,
          url: '/website-assets/media/2025/11/download__10_-removebg-preview.png',
          link: '/?attachment_id=1310',
          alt: '',
          author: '7',
          description: '',
          caption: '',
          name: 'download__10_-removebg-preview',
          status: 'inherit',
          uploaded_to: 1209,
          date: '2025-11-24 23:24:58',
          modified: '2025-11-24 23:24:58',
          menu_order: 0,
          mime_type: 'image/png',
          type: 'image',
          subtype: 'png',
          icon: '/website-assets/media/default.png',
          width: 225,
          height: 225,
          sizes: {
            thumbnail:
              '/website-assets/media/2025/11/download__10_-removebg-preview-150x150.png',
            'thumbnail-width': 150,
            'thumbnail-height': 150,
            medium: '/website-assets/media/2025/11/download__10_-removebg-preview.png',
            'medium-width': 225,
            'medium-height': 225,
            medium_large: '/website-assets/media/2025/11/download__10_-removebg-preview.png',
            'medium_large-width': 225,
            'medium_large-height': 225,
            large: '/website-assets/media/2025/11/download__10_-removebg-preview.png',
            'large-width': 225,
            'large-height': 225,
            '1536x1536': '/website-assets/media/2025/11/download__10_-removebg-preview.png',
            '1536x1536-width': 225,
            '1536x1536-height': 225,
            '2048x2048': '/website-assets/media/2025/11/download__10_-removebg-preview.png',
            '2048x2048-width': 225,
            '2048x2048-height': 225,
          },
        },
        description:
          'DuckDB is an in-process SQL OLAP (Online Analytical Processing) database management system designed for analytical query workloads. This connector supports DuckDB persistent databases as a data source for federated SQL queries.',
        cta: {
          title: 'Learn more',
          url: 'https://spiceai.org/docs/components/data-connectors/duckdb',
          target: '_blank',
        },
      },
      {
        title: 'DuckLake',
        type: {
          term_id: 17,
          name: 'Data Connector',
          slug: 'data-connector',
          term_group: 0,
          term_taxonomy_id: 17,
          taxonomy: 'integration-type',
          description: '',
          parent: 0,
          count: 22,
          filter: 'raw',
        },
        icon: {
          url: '/website-assets/media/2025/11/DuckLake_icon-lightmode.svg',
          alt: 'DuckLake logo',
        },
        description:
          'DuckLake is an open lakehouse format that stores metadata in a SQLite-compatible database (or PostgreSQL) and data in Parquet files. The DuckLake Data Connector enables querying individual DuckLake tables as datasets in Spice.',
        cta: {
          title: 'Learn more',
          url: 'https://spiceai.org/docs/components/data-connectors/ducklake',
          target: '_blank',
        },
      },
      {
        title: 'MySQL',
        type: {
          term_id: 17,
          name: 'Data Connector',
          slug: 'data-connector',
          term_group: 0,
          term_taxonomy_id: 17,
          taxonomy: 'integration-type',
          description: '',
          parent: 0,
          count: 22,
          filter: 'raw',
        },
        icon: {
          ID: 1309,
          id: 1309,
          title: 'download__9_-removebg-preview',
          filename: 'download__9_-removebg-preview.png',
          filesize: 22812,
          url: '/website-assets/media/2025/11/download__9_-removebg-preview.png',
          link: '/?attachment_id=1309',
          alt: '',
          author: '7',
          description: '',
          caption: '',
          name: 'download__9_-removebg-preview',
          status: 'inherit',
          uploaded_to: 1207,
          date: '2025-11-24 23:24:03',
          modified: '2025-11-24 23:24:03',
          menu_order: 0,
          mime_type: 'image/png',
          type: 'image',
          subtype: 'png',
          icon: '/website-assets/media/default.png',
          width: 225,
          height: 225,
          sizes: {
            thumbnail:
              '/website-assets/media/2025/11/download__9_-removebg-preview-150x150.png',
            'thumbnail-width': 150,
            'thumbnail-height': 150,
            medium: '/website-assets/media/2025/11/download__9_-removebg-preview.png',
            'medium-width': 225,
            'medium-height': 225,
            medium_large: '/website-assets/media/2025/11/download__9_-removebg-preview.png',
            'medium_large-width': 225,
            'medium_large-height': 225,
            large: '/website-assets/media/2025/11/download__9_-removebg-preview.png',
            'large-width': 225,
            'large-height': 225,
            '1536x1536': '/website-assets/media/2025/11/download__9_-removebg-preview.png',
            '1536x1536-width': 225,
            '1536x1536-height': 225,
            '2048x2048': '/website-assets/media/2025/11/download__9_-removebg-preview.png',
            '2048x2048-width': 225,
            '2048x2048-height': 225,
          },
        },
        description:
          'MySQL is an open-source relational database management system that uses structured query language (SQL) for managing and manipulating databases. The MySQL Data Connector enables federated/accelerated SQL queries on data stored in MySQL databases.',
        cta: {
          title: 'Learn more',
          url: 'https://spiceai.org/docs/components/data-connectors/mysql',
          target: '_blank',
        },
      },
      {
        title: 'PostgreSQL',
        type: {
          term_id: 17,
          name: 'Data Connector',
          slug: 'data-connector',
          term_group: 0,
          term_taxonomy_id: 17,
          taxonomy: 'integration-type',
          description: '',
          parent: 0,
          count: 22,
          filter: 'raw',
        },
        icon: {
          ID: 1308,
          id: 1308,
          title: 'download__8_-removebg-preview',
          filename: 'download__8_-removebg-preview.png',
          filesize: 52622,
          url: '/website-assets/media/2025/11/download__8_-removebg-preview.png',
          link: '/?attachment_id=1308',
          alt: '',
          author: '7',
          description: '',
          caption: '',
          name: 'download__8_-removebg-preview',
          status: 'inherit',
          uploaded_to: 1205,
          date: '2025-11-24 23:23:45',
          modified: '2025-11-24 23:23:45',
          menu_order: 0,
          mime_type: 'image/png',
          type: 'image',
          subtype: 'png',
          icon: '/website-assets/media/default.png',
          width: 221,
          height: 228,
          sizes: {
            thumbnail:
              '/website-assets/media/2025/11/download__8_-removebg-preview-150x150.png',
            'thumbnail-width': 150,
            'thumbnail-height': 150,
            medium: '/website-assets/media/2025/11/download__8_-removebg-preview.png',
            'medium-width': 221,
            'medium-height': 228,
            medium_large: '/website-assets/media/2025/11/download__8_-removebg-preview.png',
            'medium_large-width': 221,
            'medium_large-height': 228,
            large: '/website-assets/media/2025/11/download__8_-removebg-preview.png',
            'large-width': 221,
            'large-height': 228,
            '1536x1536': '/website-assets/media/2025/11/download__8_-removebg-preview.png',
            '1536x1536-width': 221,
            '1536x1536-height': 228,
            '2048x2048': '/website-assets/media/2025/11/download__8_-removebg-preview.png',
            '2048x2048-width': 221,
            '2048x2048-height': 228,
          },
        },
        description:
          'PostgreSQL is an advanced open-source relational database management system known for its robustness, extensibility, and support for SQL compliance. The PostgreSQL Server Data Connector enables federated/accelerated SQL queries on data stored in PostgreSQL databases.\r\n\r\n',
        cta: {
          title: 'Learn more',
          url: 'https://spiceai.org/docs/components/data-connectors/postgres',
          target: '_blank',
        },
      },
      {
        title: 'GitHub',
        type: {
          term_id: 18,
          name: 'Model Provider',
          slug: 'model-provider',
          term_group: 0,
          term_taxonomy_id: 18,
          taxonomy: 'integration-type',
          description: '',
          parent: 0,
          count: 1,
          filter: 'raw',
        },
        icon: {
          ID: 1304,
          id: 1304,
          title: 'download__4_-removebg-preview',
          filename: 'download__4_-removebg-preview.png',
          filesize: 15632,
          url: '/website-assets/media/2025/11/download__4_-removebg-preview.png',
          link: '/?attachment_id=1304',
          alt: '',
          author: '7',
          description: '',
          caption: '',
          name: 'download__4_-removebg-preview',
          status: 'inherit',
          uploaded_to: 1197,
          date: '2025-11-24 23:22:24',
          modified: '2025-11-24 23:22:24',
          menu_order: 0,
          mime_type: 'image/png',
          type: 'image',
          subtype: 'png',
          icon: '/website-assets/media/default.png',
          width: 224,
          height: 224,
          sizes: {
            thumbnail:
              '/website-assets/media/2025/11/download__4_-removebg-preview-150x150.png',
            'thumbnail-width': 150,
            'thumbnail-height': 150,
            medium: '/website-assets/media/2025/11/download__4_-removebg-preview.png',
            'medium-width': 224,
            'medium-height': 224,
            medium_large: '/website-assets/media/2025/11/download__4_-removebg-preview.png',
            'medium_large-width': 224,
            'medium_large-height': 224,
            large: '/website-assets/media/2025/11/download__4_-removebg-preview.png',
            'large-width': 224,
            'large-height': 224,
            '1536x1536': '/website-assets/media/2025/11/download__4_-removebg-preview.png',
            '1536x1536-width': 224,
            '1536x1536-height': 224,
            '2048x2048': '/website-assets/media/2025/11/download__4_-removebg-preview.png',
            '2048x2048-width': 224,
            '2048x2048-height': 224,
          },
        },
        description:
          'GitHub is a developer platform that allows developers to create, store, manage, and share their code. The GitHub Data Connector enables federated SQL queries on various GitHub resources such as files, issues, pull requests, and commits.',
        cta: {
          title: 'Learn more',
          url: 'https://spiceai.org/docs/components/data-connectors/github',
          target: '_blank',
        },
      },
      {
        title: 'MongoDB',
        type: {
          term_id: 17,
          name: 'Data Connector',
          slug: 'data-connector',
          term_group: 0,
          term_taxonomy_id: 17,
          taxonomy: 'integration-type',
          description: '',
          parent: 0,
          count: 22,
          filter: 'raw',
        },
        icon: {
          ID: 1303,
          id: 1303,
          title: 'download__3_-removebg-preview',
          filename: 'download__3_-removebg-preview.png',
          filesize: 26504,
          url: '/website-assets/media/2025/11/download__3_-removebg-preview.png',
          link: '/?attachment_id=1303',
          alt: '',
          author: '7',
          description: '',
          caption: '',
          name: 'download__3_-removebg-preview',
          status: 'inherit',
          uploaded_to: 1195,
          date: '2025-11-24 23:22:02',
          modified: '2025-11-24 23:22:02',
          menu_order: 0,
          mime_type: 'image/png',
          type: 'image',
          subtype: 'png',
          icon: '/website-assets/media/default.png',
          width: 225,
          height: 225,
          sizes: {
            thumbnail:
              '/website-assets/media/2025/11/download__3_-removebg-preview-150x150.png',
            'thumbnail-width': 150,
            'thumbnail-height': 150,
            medium: '/website-assets/media/2025/11/download__3_-removebg-preview.png',
            'medium-width': 225,
            'medium-height': 225,
            medium_large: '/website-assets/media/2025/11/download__3_-removebg-preview.png',
            'medium_large-width': 225,
            'medium_large-height': 225,
            large: '/website-assets/media/2025/11/download__3_-removebg-preview.png',
            'large-width': 225,
            'large-height': 225,
            '1536x1536': '/website-assets/media/2025/11/download__3_-removebg-preview.png',
            '1536x1536-width': 225,
            '1536x1536-height': 225,
            '2048x2048': '/website-assets/media/2025/11/download__3_-removebg-preview.png',
            '2048x2048-width': 225,
            '2048x2048-height': 225,
          },
        },
        description:
          'MongoDB is an open-source NoSQL database that stores data in flexible, JSON-like documents, allowing for dynamic schemas and easy scalability. The MongoDB Data Connector enables federated/accelerated SQL queries on data stored in MongoDB databases.',
        cta: {
          title: 'Learn more',
          url: 'https://spiceai.org/docs/components/data-connectors/mongodb',
          target: '_blank',
        },
      },
      {
        title: 'Snowflake',
        type: {
          term_id: 17,
          name: 'Data Connector',
          slug: 'data-connector',
          term_group: 0,
          term_taxonomy_id: 17,
          taxonomy: 'integration-type',
          description: '',
          parent: 0,
          count: 22,
          filter: 'raw',
        },
        icon: {
          ID: 1302,
          id: 1302,
          title: 'download__2_-removebg-preview',
          filename: 'download__2_-removebg-preview.png',
          filesize: 46141,
          url: '/website-assets/media/2025/11/download__2_-removebg-preview.png',
          link: '/?attachment_id=1302',
          alt: '',
          author: '7',
          description: '',
          caption: '',
          name: 'download__2_-removebg-preview',
          status: 'inherit',
          uploaded_to: 1192,
          date: '2025-11-24 23:21:42',
          modified: '2025-11-24 23:21:42',
          menu_order: 0,
          mime_type: 'image/png',
          type: 'image',
          subtype: 'png',
          icon: '/website-assets/media/default.png',
          width: 225,
          height: 225,
          sizes: {
            thumbnail:
              '/website-assets/media/2025/11/download__2_-removebg-preview-150x150.png',
            'thumbnail-width': 150,
            'thumbnail-height': 150,
            medium: '/website-assets/media/2025/11/download__2_-removebg-preview.png',
            'medium-width': 225,
            'medium-height': 225,
            medium_large: '/website-assets/media/2025/11/download__2_-removebg-preview.png',
            'medium_large-width': 225,
            'medium_large-height': 225,
            large: '/website-assets/media/2025/11/download__2_-removebg-preview.png',
            'large-width': 225,
            'large-height': 225,
            '1536x1536': '/website-assets/media/2025/11/download__2_-removebg-preview.png',
            '1536x1536-width': 225,
            '1536x1536-height': 225,
            '2048x2048': '/website-assets/media/2025/11/download__2_-removebg-preview.png',
            '2048x2048-width': 225,
            '2048x2048-height': 225,
          },
        },
        description:
          'Snowflake is a cloud data platform that allows for data analysis and simultaneous access of data sets with minimal latency. The Snowflake Data Connector enables federated SQL queries across datasets in the Snowflake Cloud Data Warehouse.',
        cta: {
          title: 'Learn more',
          url: 'https://spiceai.org/docs/components/data-connectors/snowflake',
          target: '_blank',
        },
      },
      {
        title: 'Databricks',
        type: {
          term_id: 17,
          name: 'Data Connector',
          slug: 'data-connector',
          term_group: 0,
          term_taxonomy_id: 17,
          taxonomy: 'integration-type',
          description: '',
          parent: 0,
          count: 22,
          filter: 'raw',
        },
        icon: {
          ID: 1300,
          id: 1300,
          title: 'download__1_-removebg-preview',
          filename: 'download__1_-removebg-preview-1.png',
          filesize: 40707,
          url: '/website-assets/media/2025/11/download__1_-removebg-preview-1.png',
          link: '/?attachment_id=1300',
          alt: '',
          author: '7',
          description: '',
          caption: '',
          name: 'download__1_-removebg-preview-2',
          status: 'inherit',
          uploaded_to: 1027,
          date: '2025-11-24 23:21:07',
          modified: '2025-11-24 23:21:07',
          menu_order: 0,
          mime_type: 'image/png',
          type: 'image',
          subtype: 'png',
          icon: '/website-assets/media/default.png',
          width: 242,
          height: 208,
          sizes: {
            thumbnail:
              '/website-assets/media/2025/11/download__1_-removebg-preview-1-150x150.png',
            'thumbnail-width': 150,
            'thumbnail-height': 150,
            medium: '/website-assets/media/2025/11/download__1_-removebg-preview-1.png',
            'medium-width': 242,
            'medium-height': 208,
            medium_large: '/website-assets/media/2025/11/download__1_-removebg-preview-1.png',
            'medium_large-width': 242,
            'medium_large-height': 208,
            large: '/website-assets/media/2025/11/download__1_-removebg-preview-1.png',
            'large-width': 242,
            'large-height': 208,
            '1536x1536': '/website-assets/media/2025/11/download__1_-removebg-preview-1.png',
            '1536x1536-width': 242,
            '1536x1536-height': 208,
            '2048x2048': '/website-assets/media/2025/11/download__1_-removebg-preview-1.png',
            '2048x2048-width': 242,
            '2048x2048-height': 208,
          },
        },
        description:
          'Databricks is a cloud-based platform for data analytics and artificial intelligence. Use the connector for federated SQL queries against Databricks using Spark Connect, directly from Delta Lake tables, or using the SQL Statement Execution API.',
        cta: {
          title: 'Learn more',
          url: 'https://spiceai.org/docs/components/data-connectors/databricks',
          target: '_blank',
        },
      },
      {
        title: 'ABFS',
        type: {
          term_id: 17,
          name: 'Data Connector',
          slug: 'data-connector',
          term_group: 0,
          term_taxonomy_id: 17,
          taxonomy: 'integration-type',
          description: '',
          parent: 0,
          count: 22,
          filter: 'raw',
        },
        icon: {
          ID: 1023,
          id: 1023,
          title: 'integrations (2)',
          filename: 'integrations-2.png',
          filesize: 5147,
          url: '/website-assets/media/2025/11/integrations-2.png',
          link: '/?attachment_id=1023',
          alt: '',
          author: '4',
          description: '',
          caption: '',
          name: 'integrations-2',
          status: 'inherit',
          uploaded_to: 1021,
          date: '2025-11-21 00:40:12',
          modified: '2025-11-21 00:40:12',
          menu_order: 0,
          mime_type: 'image/png',
          type: 'image',
          subtype: 'png',
          icon: '/website-assets/media/default.png',
          width: 96,
          height: 96,
          sizes: {
            thumbnail: '/website-assets/media/2025/11/integrations-2.png',
            'thumbnail-width': 96,
            'thumbnail-height': 96,
            medium: '/website-assets/media/2025/11/integrations-2.png',
            'medium-width': 96,
            'medium-height': 96,
            medium_large: '/website-assets/media/2025/11/integrations-2.png',
            'medium_large-width': 96,
            'medium_large-height': 96,
            large: '/website-assets/media/2025/11/integrations-2.png',
            'large-width': 96,
            'large-height': 96,
            '1536x1536': '/website-assets/media/2025/11/integrations-2.png',
            '1536x1536-width': 96,
            '1536x1536-height': 96,
            '2048x2048': '/website-assets/media/2025/11/integrations-2.png',
            '2048x2048-width': 96,
            '2048x2048-height': 96,
          },
        },
        description:
          'The Azure Blob Filesystem driver (ABFS) is a dedicated Azure Storage driver for Hadoop. The Azure BlobFS (ABFS) Data Connector enables federated SQL queries on files stored in Azure Blob-compatible endpoints.',
        cta: {
          title: 'Learn more',
          url: 'https://spiceai.org/docs/components/data-connectors/abfs',
          target: '_blank',
        },
      },
      {
        title: 'Elasticsearch',
        type: {
          term_id: 17,
          name: 'Data Connector',
          slug: 'data-connector',
          term_group: 0,
          term_taxonomy_id: 17,
          taxonomy: 'integration-type',
          description: '',
          parent: 0,
          count: 22,
          filter: 'raw',
        },
        icon: {
          url: '/website-assets/media/2025/11/elasticsearch-icon.svg',
          alt: 'Elasticsearch logo',
        },
        description:
          'The Elasticsearch Data Connector exposes Elasticsearch indexes as SQL tables in Spice. Index mappings are translated to Arrow schemas so documents can be queried with federated SQL.',
        cta: {
          title: 'Learn more',
          url: 'https://spiceai.org/docs/components/data-connectors/elasticsearch',
          target: '_blank',
        },
      },
      {
        title: 'GCS',
        type: {
          term_id: 17,
          name: 'Data Connector',
          slug: 'data-connector',
          term_group: 0,
          term_taxonomy_id: 17,
          taxonomy: 'integration-type',
          description: '',
          parent: 0,
          count: 22,
          filter: 'raw',
        },
        icon: {
          url: '/website-assets/media/2025/11/GCS-icon.svg',
          alt: 'Google Cloud Storage logo',
        },
        description:
          'The GCS Data Connector enables federated SQL queries on files stored in Google Cloud Storage. Both gcs:// and gs:// URI schemes are supported.',
        cta: {
          title: 'Learn more',
          url: 'https://spiceai.org/docs/components/data-connectors/gcs',
          target: '_blank',
        },
      },
      {
        title: 'HTTP',
        type: {
          term_id: 17,
          name: 'Data Connector',
          slug: 'data-connector',
          term_group: 0,
          term_taxonomy_id: 17,
          taxonomy: 'integration-type',
          description: '',
          parent: 0,
          count: 22,
          filter: 'raw',
        },
        icon: {
          url: '/website-assets/media/2025/11/http.svg',
          alt: 'HTTP connector icon',
        },
        description:
          'The HTTP(s) Data Connector enables federated SQL queries across supported file formats stored at HTTP(s) endpoints, with dynamic querying and refresh via SQL-based filtering.',
        cta: {
          title: 'Learn more',
          url: 'https://spiceai.org/docs/components/data-connectors/https',
          target: '_blank',
        },
      },
      {
        title: 'Azure Cosmos DB',
        type: {
          term_id: 17,
          name: 'Data Connector',
          slug: 'data-connector',
          term_group: 0,
          term_taxonomy_id: 17,
          taxonomy: 'integration-type',
          description: '',
          parent: 0,
          count: 22,
          filter: 'raw',
        },
        icon: {
          url: '/website-assets/media/2025/11/azure-cosmos-db.svg',
          alt: 'Azure Cosmos DB logo',
        },
        description:
          'The Azure Cosmos DB Data Connector exposes Cosmos DB containers as SQL tables in Spice by inferring Arrow schemas from sampled documents and streaming results into DataFusion for federated SQL.',
        cta: {
          title: 'Learn more',
          url: 'https://spiceai.org/docs/components/data-connectors/cosmosdb',
          target: '_blank',
        },
      },
      {
        title: 'SharePoint',
        type: {
          term_id: 17,
          name: 'Data Connector',
          slug: 'data-connector',
          term_group: 0,
          term_taxonomy_id: 17,
          taxonomy: 'integration-type',
          description: '',
          parent: 0,
          count: 22,
          filter: 'raw',
        },
        icon: {
          url: '/website-assets/connectors/sharepoint-logo.svg',
          alt: 'SharePoint logo',
          className: 'h-9 w-auto max-w-12',
        },
        description:
          'The SharePoint Data Connector enables federated SQL queries on documents and tabular data stored in SharePoint or OneDrive.',
        cta: {
          title: 'Learn more',
          url: 'https://spiceai.org/docs/components/data-connectors/sharepoint',
          target: '_blank',
        },
      },
      {
        title: 'ScyllaDB',
        type: {
          term_id: 17,
          name: 'Data Connector',
          slug: 'data-connector',
          term_group: 0,
          term_taxonomy_id: 17,
          taxonomy: 'integration-type',
          description: '',
          parent: 0,
          count: 22,
          filter: 'raw',
        },
        icon: {
          url: '/website-assets/media/2025/11/scylladb-logo-vertical-white.svg',
          alt: 'ScyllaDB logo',
          className: 'h-full w-full scale-125',
        },
        description:
          'The ScyllaDB Data Connector enables federated SQL queries on data stored in ScyllaDB clusters using CQL (Cassandra Query Language).',
        cta: {
          title: 'Learn more',
          url: 'https://spiceai.org/docs/components/data-connectors/scylladb',
          target: '_blank',
        },
      },
    ],
    categories: [
      {
        label: 'Data Connector',
        value: 'data-connector',
      },
      {
        label: 'Model Provider',
        value: 'model-provider',
      },
    ],
  }}
/>

<Testimonials
  heading="Deployed in production"
  headingTag="h2"
  paragraph="Teams trust Spice to bring inference closer to their data, enabling low-latency, enterprise-grade AI across industries."
  items={["nrc-tim","basisset"]}
/>

<ContentImageVideo
  fields={{
    variant: 'variant-1',
    heading: 'Integrations across all of your data sources',
    heading_tag: 'h2',
    paragraph:
      'Accelerate your data and AI stack with a library of 40+ prebuilt connectors for the most common databases, warehouses, and file stores- - from Databricks and S3 to MySQL and PostgreSQL. Govern AI sandboxes with the same policies as your production data environments.',
    cta: [
      {
        type: 'filled',
        cta: {
          title: 'See connectors',
          url: 'https://docs.spice.ai/building-blocks/data-connectors',
          target: '',
        },
      },
    ],
    media_type: 'image',
    media_image: {
      ID: 412,
      id: 412,
      title: 'platform_integrations',
      filename: 'platform_integrations.png',
      filesize: 1330111,
      url: '/website-assets/media/2025/11/platform_integrations.png',
      link: '/integrations/attachment/platform_integrations/',
      alt: '',
      author: '5',
      description: '',
      caption: '',
      name: 'platform_integrations',
      status: 'inherit',
      uploaded_to: 406,
      date: '2025-11-03 00:43:41',
      modified: '2025-11-03 00:43:41',
      menu_order: 0,
      mime_type: 'image/png',
      type: 'image',
      subtype: 'png',
      icon: '/website-assets/media/default.png',
      width: 1360,
      height: 1034,
      sizes: {
        thumbnail: '/website-assets/media/2025/11/platform_integrations.png',
        'thumbnail-width': 150,
        'thumbnail-height': 150,
        medium: '/website-assets/media/2025/11/platform_integrations.png',
        'medium-width': 300,
        'medium-height': 228,
        medium_large: '/website-assets/media/2025/11/platform_integrations.png',
        'medium_large-width': 768,
        'medium_large-height': 584,
        large: '/website-assets/media/2025/11/platform_integrations.png',
        'large-width': 1024,
        'large-height': 779,
        '1536x1536': '/website-assets/media/2025/11/platform_integrations.png',
        '1536x1536-width': 1360,
        '1536x1536-height': 1034,
        '2048x2048': '/website-assets/media/2025/11/platform_integrations.png',
        '2048x2048-width': 1360,
        '2048x2048-height': 1034,
      },
    },
    graphic_overlay: false,
    media_video: '',
    padding_top: 'st-lg',
    padding_bottom: 'sb-lg',
  }}
/>

<TalkToAnEngineerCta />

---

## Everything You Need to Know About AI Agent Data Access
URL: https://spice.ai/learn/ai-agent-data-access
Date: 2026-09-02T00:00:00
Description: Complete guide to AI agent data access, covering connectivity, low-latency serving, governance, isolation, and how to choose an access pattern.

<HeroCenteredText
  fields={{
    graphic_position: 'no-graphic',
    heading_tag: 'h1',
    heading: 'Everything You Need to Know About AI Agent Data Access',
    paragraph:
      'AI agents read data differently than applications do. This guide covers the four layers of agent data access, the tradeoffs in each, and how to choose a pattern that meets your latency and governance requirements.',
    cta: [
      {
        type: 'filled',
        cta: {
          title: 'Explore the MCP server gateway',
          url: '/feature/mcp-server-gateway',
          target: '',
        },
      },
      {
        type: 'bordered',
        cta: {
          title: 'Read the MCP docs',
          url: 'https://spiceai.org/docs/components/tools/mcp',
          target: '_blank',
        },
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<ContentRichText
  fields={{
    coverage: 'rc-start',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

AI agent data access describes how an autonomous system reads, joins, and acts on data across the systems an organization already runs. It covers four concerns. The first is reaching each source. The second is serving reads fast enough. The third is scoping what the agent sees and recording what it did. The fourth is keeping one agent's failures away from another.

Traditional application data access solves a narrower problem. An application ships with a fixed set of queries, a known schema, and a credential that a developer reviewed before release. An agent has none of those guarantees. It writes its own queries at runtime and discovers schema as it works. It also acts for a user whose permissions differ from the last user.

This guide explains why that difference matters, breaks agent data access into four layers, and gives a framework for choosing between the common patterns.

## Why Agent Data Access Differs from Application Data Access

### Query shapes are generated, not predefined

A dashboard runs a small number of query templates. A team tunes indexes and materialized views against those templates and the system stays predictable.

An agent generates SQL from context. It joins tables no one anticipated, filters on unindexed columns, and occasionally scans far more data than the task needed. Capacity planning based on historical query shapes does not hold.

### Latency budgets compound across tool calls

An agent often runs five to fifteen reads before it answers. Each read sits inside the user's total wait time.

A 400 ms query looks acceptable in isolation. Ten of them in sequence produce a four-second response. Agent data access must target the p99 of the whole chain, not the average of one query. For background on where that time goes, see [database query latency at scale](/learn/database-query-latency-at-scale).

### Trust boundaries move to runtime

An application enforces authorization in code that a reviewer read. An agent decides at runtime which data it needs, so the boundary must sit below the model rather than inside the prompt.

Prompt instructions are guidance. They are not an access control. An agent that can reach a table can read that table, whatever the system prompt says.

## The Four Layers of Agent Data Access

Every production design answers the same four questions, in this order.

```mermaid
flowchart LR
    A[AI agent] --> B[Gateway]
    B --> C[Policy check]
    C --> D[Query engine]
    D --> E[Accelerated cache]
    D --> F[Operational database]
    D --> G[Object storage]
```

1. **Connectivity.** Which systems can the agent reach, and through what interface?
2. **Serving.** How fast do reads return, and how much load do they place on production systems?
3. **Governance.** What can this specific agent see, who authorized it, and what was recorded?
4. **Isolation.** When one agent misbehaves, how far does the damage reach?

The layers interact. A governance model that adds 200 ms per call breaks the serving budget. A serving design that copies whole tables into a shared cache defeats the governance model. Design them together.

## Connectivity: Reaching Every System an Agent Needs

Enterprise data does not sit in one place. Customer records live in PostgreSQL, events in a warehouse, documents in object storage, and business state in SaaS APIs. An agent that answers real questions needs several of these in one task.

Three connectivity patterns dominate.

**One tool per system.** The agent gets a separate tool for each database and API. This is simple to start and it degrades quickly. Tool count grows with system count, the model must pick correctly among twenty options, and cross-system joins fall to the model to perform in context.

**A service layer in front of the sources.** Teams wrap sources in scoped services that the agent calls. Domain logic stays where it already lives. Cross-domain joins get harder, and each new question often needs a new endpoint.

**A federated query layer.** One SQL interface reaches every source, and the engine pushes work down to each system. The agent learns one interface. Cross-source joins become ordinary SQL. See [SQL federation](/learn/sql-federation) for how the planner splits and pushes down work, and [how to connect AI agents to multiple databases](/learn/how-to-connect-ai-agents-to-multiple-databases) for the implementation detail.

The [Model Context Protocol](/learn/model-context-protocol) is the emerging standard for exposing any of these to an agent. MCP standardizes tool discovery and invocation. It does not decide what sits behind the tool, so the connectivity choice above still matters.

## Serving: Meeting Agent Latency Budgets

Querying sources live is the simplest serving model and the first to break. Production databases absorb agent read load that no one sized for, and cross-region calls add latency the agent multiplies.

Two techniques address this.

**Acceleration.** A local copy of the working set answers reads from memory or local disk, so queries never touch the source. [Data acceleration](/learn/data-acceleration) explains the refresh modes and the freshness tradeoff each one carries.

**Change data capture.** CDC streams row-level changes from the source into that local copy. Freshness stays within a bounded window without repeated polling. [Change data capture](/learn/change-data-capture) covers the log-based mechanism.

Together these invert the load pattern. The source pays for one change stream rather than for every agent read. Adding agents then costs local compute rather than production database capacity.

Not every dataset needs acceleration. Accelerate the hot working set that agents read repeatedly, and federate live to the rest.

## Governance: Scoping What an Agent Can See

Governance for agents rests on three controls that operate below the model.

**Scoped credentials.** The agent holds a token for the data layer, never credentials for PostgreSQL or object storage. Rotating one token then revokes the agent, and no secret reaches the model context.

**Row and column policy.** The data layer applies filters and column masks before results return. Because the policy runs below the model, a prompt injection cannot remove it.

**Query guardrails.** Limits on scanned bytes, row count, and execution time bound the cost of a generated query that goes wrong.

[How to sandbox data access for AI agents](/learn/how-to-sandbox-data-access-for-ai-agents) covers these controls in depth, including output redaction.

## Isolation: Giving Each Agent Its Own Boundary

Multi-agent systems raise a question that single-agent designs avoid. If ten agents share one data layer, one misbehaving agent affects the other nine.

A shared layer is efficient and cheap to operate. It also widens the blast radius of any incident, and it makes per-agent attribution harder.

A per-agent boundary reverses both properties. Each agent gets its own runtime, its own credentials, and its own working set. Failures stay local and attribution is exact. The cost is more runtimes to operate. [How to give each AI agent its own isolated data environment](/learn/how-to-give-each-ai-agent-its-own-isolated-data-environment) walks through that tradeoff. The [sidecar pattern](/learn/sidecar-pattern) describes the deployment shape most teams land on.

## Comparing Access Patterns

| Pattern | Freshness | Latency | Source load | Isolation | Best fit |
| --- | --- | --- | --- | --- | --- |
| Direct source queries | Highest | Source dependent | High | Weak | Prototypes and low traffic |
| Federated queries | High | Medium | Medium | Medium | Cross-source questions |
| Federation with acceleration | Bounded window | Low | Low | Medium | Production agent serving |
| Per-agent sidecars | Bounded window | Lowest | Low | Strong | Multi-tenant and regulated |
| Warehouse-first ETL | Low | Medium | Low | Medium | Historical analysis |

## How to Choose an Access Pattern

### 1. What is the freshness requirement?

Measure it in the units the task cares about. If an agent reasons about order state, minutes of staleness produce wrong answers. If it summarizes last quarter, a nightly pipeline is correct and cheaper.

### 2. What is the end-to-end latency budget?

Multiply the per-query target by the expected number of tool calls. If the product is over your budget, the fix is acceleration rather than a faster model.

### 3. How much read load can the sources absorb?

Ask what happens when agent traffic grows tenfold. If the answer threatens a production database, put an acceleration layer between the agent and the source before that traffic arrives.

### 4. How many agents share a boundary?

One agent per team tolerates a shared layer. Per-customer or per-user agents need isolation, because an incident in one tenant must not reach another.

### 5. What must you prove to an auditor?

Decide early which queries you log, how long you keep them, and whether denied requests are recorded. Retrofitting an audit trail is harder than building one.

## Advanced Topics

### Freshness metadata in the retrieval path

Return the age of the data alongside the data. When the agent knows a result is nine minutes old, it can say so, and downstream logic can refuse to act on stale state. Silent staleness produces confident wrong answers, which is the failure mode hardest to detect in review.

Implement this as a field on the response rather than as a separate call. A timestamp the agent must ask for is a timestamp the agent will skip. Where a dataset has a declared refresh interval, expose both the interval and the actual last refresh, because the two diverge when a refresh fails. A monitor on that gap catches a stalled pipeline before a user does.

### Read amplification from retries

Agents retry. A failed tool call, a reformulated query, and a verification pass turn one logical read into four physical ones. Measure read amplification directly rather than inferring it from agent task counts, because the ratio moves whenever the prompt changes.

The practical measurement is physical queries divided by completed agent tasks, recorded per agent version. Track it as a time series. A prompt change that doubles the ratio looks like a capacity problem in every other metric. The source stays invisible unless this number is already watched.

### Schema exposure and the semantic layer

An agent that sees 4,000 columns writes worse SQL than one that sees 40 curated views. Exposing a semantic layer improves accuracy and shrinks the attack surface at the same time. Curate the views the agent can discover, and treat that curation as part of the access design rather than as documentation.

Column and table names carry meaning to a model, so naming is a functional decision here. A view named `active_subscriptions` produces better generated SQL than one named `tbl_sub_a`. Descriptions attached to columns help further, because they reach the model through schema discovery.

### Caching correctness under policy

A shared result cache and a row-level policy conflict. If two agents with different permissions can hit the same cache entry, the cache leaks. Key cache entries by policy context, or scope the cache per agent.

The failure is silent, which makes it worse. A leaking cache returns correct-looking data to the wrong caller, and no error appears in any log. Test it directly: issue the same query as two agents with different permissions, and confirm the second result is not the first.

## AI Agent Data Access with Spice

[Spice](/platform/sql-federation-acceleration) implements these four layers in one runtime. It federates SQL across [40+ connectors](/integrations), accelerates the working set locally, and serves the result to agents over SQL or MCP.

The [MCP server gateway](/feature/mcp-server-gateway) exposes federated data to agent runtimes as standard tools, so an agent learns one interface rather than one per system. [Real-time change data capture](/feature/real-time-change-data-capture) keeps the accelerated copy inside a bounded freshness window without polling the source.

For per-agent boundaries, Spice deploys as a sidecar beside each agent. Each sidecar holds its own scoped working set and its own credentials, which keeps failures and permissions local to one agent. [Secure AI agents](/use-case/secure-ai-agents) covers the governance model in full.

<ContentRichText
  fields={{
    coverage: 'rc-end',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<AccordionFaq
  fields={{
    heading: 'AI Agent Data Access FAQ',
    heading_tag: 'h2',
    paragraph: '',
    items: [
      {
        title: 'What is AI agent data access?',
        paragraph:
          '<p>AI agent data access is how an autonomous system reads and joins data across the systems an organization runs. It covers four layers: connectivity to each source, low-latency serving, governance over what the agent can see and what gets logged, and isolation between agents.</p>',
      },
      {
        title: 'How is agent data access different from application data access?',
        paragraph:
          '<p>An application ships with fixed queries and a reviewed credential. An agent generates queries at runtime and discovers schema as it works. That means capacity and authorization must be enforced below the model rather than in application code.</p>',
      },
      {
        title: 'Can prompt instructions control what data an agent reads?',
        paragraph:
          '<p>No. Prompt instructions are guidance, not access control. An agent that can reach a table can read it, whatever the system prompt says. Enforce row filters, column masks, and query limits in the data layer below the model.</p>',
      },
      {
        title: 'How do you keep agent traffic from overloading production databases?',
        paragraph:
          '<p>Put an acceleration layer between the agent and the source. Change data capture streams updates into a local copy, so the source pays for one change stream rather than for every agent read. Adding agents then costs local compute instead of database capacity.</p>',
      },
      {
        title: 'Should each AI agent get its own data environment?',
        paragraph:
          '<p>It depends on the blast radius you accept. A shared layer is cheaper to operate but lets one agent affect the others. Per-agent isolation keeps failures and credentials local, which matters most for per-customer agents and regulated workloads.</p>',
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<ContentResourceFeatured
  fields={{
    heading: 'Learn more about agent data access',
    heading_tag: 'h2',
    paragraph:
      'Documentation and technical resources for connecting agents to governed, low-latency data.',
    mode: 'default',
    resources: [
      {
        source: 'manual',
        resource: null,
        resource_manual: {
          eyebrow: 'Docs',
          title: {
            title: 'MCP Server and Client Docs',
            url: 'https://spiceai.org/docs/components/tools/mcp',
            target: '_blank',
          },
          description:
            'Learn how to expose federated data to agent runtimes as standard MCP tools.',
          image: {
            ID: 1661,
            id: 1661,
            title: 'Docs jpeg',
            filename: 'Docs-jpeg.jpeg',
            filesize: 103192,
            url: '/website-assets/media/2025/12/Docs-jpeg.jpeg',
            link: '/docs-jpeg/',
            alt: '',
            author: '9',
            description: '',
            caption: '',
            name: 'docs-jpeg',
            status: 'inherit',
            uploaded_to: 0,
            date: '2025-12-05 04:13:53',
            modified: '2025-12-05 04:13:53',
            menu_order: 0,
            mime_type: 'image/jpeg',
            type: 'image',
            subtype: 'jpeg',
            icon: '/website-assets/media/default.png',
            width: 1832,
            height: 1036,
            sizes: {
              thumbnail: '/website-assets/media/2025/12/Docs-jpeg-150x150.jpeg',
              'thumbnail-width': 150,
              'thumbnail-height': 150,
              medium: '/website-assets/media/2025/12/Docs-jpeg-300x170.jpeg',
              'medium-width': 300,
              'medium-height': 170,
              medium_large:
                '/website-assets/media/2025/12/Docs-jpeg-768x434.jpeg',
              'medium_large-width': 768,
              'medium_large-height': 434,
              large: '/website-assets/media/2025/12/Docs-jpeg-1024x579.jpeg',
              'large-width': 1024,
              'large-height': 579,
              '1536x1536':
                '/website-assets/media/2025/12/Docs-jpeg-1536x869.jpeg',
              '1536x1536-width': 1536,
              '1536x1536-height': 869,
              '2048x2048': '/website-assets/media/2025/12/Docs-jpeg.jpeg',
              '2048x2048-width': 1832,
              '2048x2048-height': 1036,
            },
          },
        },
      },
      {
        source: 'picker',
        resource: [
          {
            title: 'OpenClaw and Spice: Governed Access to Production Data for Enterprise Agents',
            slug: '/blog/openclaw-and-spice-governed-access-to-production-data-for-enterprise-agents',
            excerpt:
              'How enterprise teams implement governed access controls and policy enforcement for AI agent production workloads.',
            image: '/website-assets/media/default.png',
            type: 'Blog',
            taxonomy: ['Spice AI', 'Engineering', 'Security'],
          },
        ],
        resource_manual: {
          eyebrow: '',
          title: null,
          description: '',
          image: false,
        },
      },
      {
        source: 'picker',
        resource: [
          {
            title: 'Multi-Tenancy for AI Agents Without Pipelines',
            slug: '/blog/multi-tenancy-for-ai-agents-without-pipelines',
            excerpt:
              'A practical guide to building multi-tenant agent data architectures with policy boundaries and low-latency retrieval.',
            image: '/website-assets/media/default.png',
            type: 'Blog',
            taxonomy: ['Spice AI', 'Engineering'],
          },
        ],
        resource_manual: {
          eyebrow: '',
          title: null,
          description: '',
          image: false,
        },
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<ContentCta
  fields={{
    override_global_setting: false,
    custom_content: { heading: '', paragraph: '', cta: null },
    padding_top: 'unset',
    padding_bottom: 'unset',
    gcta_heading: 'See Spice in action',
    gcta_paragraph:
      'Get a guided walkthrough of how development teams use Spice to query, accelerate, and integrate AI for mission-critical workloads.',
    gcta_cta: {
      title: 'Get a demo',
      url: 'https://meetings.hubspot.com/lukekim/talk-to-sales',
      target: '_blank',
    },
  }}
/>

---

## What is Apache Arrow?
URL: https://spice.ai/learn/apache-arrow
Date: 2026-03-12T00:00:00
Description: Apache Arrow is a cross-language development platform for in-memory columnar data. Learn how Arrow works, its columnar memory format, Arrow Flight, Arrow IPC, and how it compares to Parquet, Protocol Buffers, and CSV.

<HeroCenteredText
  fields={{
    graphic_position: 'no-graphic',
    heading_tag: 'h1',
    heading: 'What is Apache Arrow?',
    paragraph:
      'Apache Arrow is a cross-language development platform for in-memory columnar data. It defines a standardized memory format, libraries for zero-copy reads, and protocols for high-speed data transport, providing the foundation that modern analytical systems build on.',
    cta: [
      {
        type: 'filled',
        cta: {
          title: 'See Spice SQL federation',
          url: '/platform/sql-federation-acceleration',
          target: '',
        },
      },
      {
        type: 'bordered',
        cta: {
          title: 'Read the docs',
          url: 'https://spiceai.org/docs',
          target: '',
        },
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<ContentRichText
  fields={{
    coverage: 'rc-start',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

Moving data between systems is one of the most expensive operations in modern data architectures. Every time data crosses a boundary (between a database and an application, between Python and Java, between a query engine and a visualization layer), it is typically serialized into a wire format, transmitted, and deserialized on the other side. This serialization-deserialization cycle can consume more time and compute than the actual analytical work.

Apache Arrow eliminates this overhead by defining a language-independent columnar memory format. When two systems both use Arrow, they share the same in-memory representation. Data moves between them with zero serialization: a pointer handoff, a shared memory region, or a network transfer of raw memory buffers. No parsing, no schema inference, no row-to-column conversion.

This is why Arrow has become the de facto standard for in-memory analytical data. It is used by query engines ([Apache DataFusion](/learn/apache-datafusion), DuckDB, Velox), data science libraries (pandas, polars, R Arrow), data formats ([Vortex](/learn/vortex), Parquet readers), and data transport layers (Flight SQL, ADBC), all sharing the same memory layout and able to exchange data without conversion.

## The Columnar Memory Format

Arrow's core contribution is a specification for how columnar data is laid out in memory. This specification is precise enough that any implementation (in any language) produces byte-identical memory layouts for the same data.

### Why Columnar?

In a row-oriented layout, each record's fields are stored contiguously: `[name1, age1, score1, name2, age2, score2, ...]`. This is efficient for transactional workloads that read or write entire records at a time.

In a columnar layout, each field is stored contiguously across all records: `[name1, name2, ...], [age1, age2, ...], [score1, score2, ...]`. This layout is efficient for analytical workloads that scan a subset of columns across many records: the common pattern in aggregations, filters, and joins.

Arrow uses a columnar layout because analytical workloads dominate its use cases. Scanning a single column means reading a contiguous block of memory, which maximizes CPU cache utilization and enables SIMD (Single Instruction, Multiple Data) vectorized operations.

### Memory Layout Specification

The Arrow format defines how each data type is represented in memory:

- **Primitive types** (integers, floats, booleans) are stored as contiguous, aligned arrays of fixed-width values. An `int64` column of 1,000 rows is exactly 8,000 bytes of contiguous memory.
- **Variable-length types** (strings, binary) use an offsets buffer and a values buffer. The offsets buffer stores the start position of each value in the values buffer. This enables O(1) random access to any value.
- **Nested types** (structs, lists, maps) are composed from child arrays. A `List<Int32>` column has an offsets array (marking where each list starts and ends) and a child `Int32` array (containing all values from all lists, concatenated).
- **Null handling** uses a separate validity bitmap: one bit per value indicating whether it is null. This avoids sentinel values and keeps the data arrays dense.

All buffers are aligned to 64-byte boundaries, enabling efficient SIMD operations without alignment checks.

### Record Batches

Arrow organizes data into record batches: collections of equal-length arrays with a shared schema. A record batch is the fundamental unit of data exchange in the Arrow ecosystem. It contains the column arrays, their lengths, and the schema (column names and types).

Record batches are immutable once created. This immutability enables safe zero-copy sharing between threads and between systems. Multiple consumers can read the same record batch concurrently without locking.

## Zero-Copy Reads

Zero-copy is Arrow's defining performance characteristic. When two components share data through Arrow, the receiver reads directly from the sender's memory buffers. No bytes are copied, no data is transformed, and no intermediate buffers are allocated.

This works because the Arrow format is self-describing and canonical. A consumer does not need to parse the data to understand its layout: it reads the schema metadata and then accesses the raw buffers directly. The alignment guarantees mean the data is immediately usable for SIMD operations without realignment.

Zero-copy exchange happens at multiple levels:

- **Within a process:** Different libraries (a query engine and a data science library) share Arrow arrays through shared pointers with reference counting.
- **Between processes on the same machine:** Arrow arrays can be placed in shared memory regions accessible to multiple processes.
- **Between machines:** Arrow Flight transmits Arrow record batches as raw memory buffers over the network, avoiding serialization at both ends.

## Language Bindings

Arrow provides native implementations in multiple languages. These are not bindings to a single canonical implementation: each language has its own implementation that produces the same memory format.

### C++ and Rust

The C++ and Rust implementations are the most mature and performant. They provide the full Arrow specification including compute kernels (vectorized functions for arithmetic, comparison, aggregation, and string operations), IPC readers/writers, and Flight client/server libraries.

The Rust implementation (`arrow-rs`) is the foundation for systems like [Apache DataFusion](/learn/apache-datafusion) and Spice. It provides memory-safe Arrow array manipulation with performance comparable to the C++ implementation.

### Python (PyArrow)

PyArrow wraps the C++ implementation and integrates with the Python data science ecosystem. It provides zero-copy interop with pandas DataFrames (via `to_pandas()` and `from_pandas()`), NumPy arrays, and other Python libraries. PyArrow is the most widely used entry point to the Arrow ecosystem.

### Java

The Java implementation provides Arrow arrays on the JVM. It is used by Apache Spark, Apache Flink, and other JVM-based data processing frameworks. The Java implementation manages off-heap memory to avoid garbage collection pauses on large datasets.

### Go, JavaScript, C#, Ruby, Julia

Arrow implementations exist for each of these languages, ensuring that data produced in one language can be consumed in another without any conversion. A Go service can produce Arrow record batches that a Python application reads with zero overhead.

## Arrow Flight: High-Speed Data Transport

Arrow Flight is a protocol built on gRPC that transmits Arrow record batches over the network. Traditional data transfer protocols serialize data into a wire format (JSON, CSV, Protocol Buffers) at the sender and deserialize it at the receiver. Flight skips this step: it sends Arrow memory buffers directly.

### How Flight Works

A Flight server exposes one or more data streams, each identified by a descriptor. A client requests a stream, and the server sends back Arrow record batches as raw bytes over gRPC. The client receives the bytes and maps them directly into Arrow arrays: no deserialization step.

Flight uses gRPC's HTTP/2 transport, which provides multiplexing, flow control, and TLS encryption. But unlike typical gRPC services that use Protocol Buffers for message encoding, Flight uses Arrow IPC format for the data payload. The result is a protocol that has the operational benefits of gRPC (load balancing, authentication, observability) with the performance benefits of zero-copy Arrow data exchange.

### Flight SQL

Flight SQL extends the Flight protocol with SQL semantics. A Flight SQL server accepts SQL queries, executes them, and returns results as Arrow record batches. This provides a standardized, high-performance interface for SQL query engines, including [federated query engines](/learn/sql-federation) that need to return large result sets with minimal latency.

Flight SQL is replacing JDBC and ODBC as the preferred interface for analytical query engines because it avoids the row-by-row serialization overhead inherent in those older protocols.

## Arrow IPC: Inter-Process Communication

Arrow IPC (Inter-Process Communication) is a serialization format for Arrow record batches. It defines how to write Arrow arrays to a byte stream (either a file or a socket) so they can be read back with minimal overhead.

The IPC format has two modes:

- **Streaming format:** Record batches are written sequentially to a stream. The reader processes batches as they arrive. This is used for network transport and piped communication between processes.
- **File format (Feather):** Record batches are written to a file with a footer that indexes their positions. The reader can seek to any batch without reading the entire file. This is used for temporary storage and data exchange through the filesystem.

Both modes preserve the Arrow memory layout, so reading an IPC message produces Arrow arrays that are ready for computation without any transformation. When combined with memory mapping, reading from an Arrow IPC file can be a true zero-copy operation: the kernel maps the file into memory and the application reads directly from the mapped pages.

## Apache Arrow vs. Other Formats

### Arrow vs. Apache Parquet

Arrow and Parquet serve complementary purposes. Arrow is an in-memory format optimized for computation: fast scans, vectorized operations, zero-copy sharing. Parquet is an on-disk format optimized for storage: compression, column pruning, predicate pushdown.

In practice, data often flows from Parquet (at rest) to Arrow (in memory). A query engine reads a Parquet file, decodes the compressed column chunks into Arrow arrays, processes the query, and returns Arrow record batches to the client. Arrow and Parquet are designed to work together: the Parquet reader in every major language produces Arrow arrays directly.

The key distinction: Arrow is not compressed. It prioritizes access speed and zero-copy sharing over storage efficiency. Parquet trades access speed for compression. Use Arrow for in-memory computation and data exchange; use Parquet (or [Vortex](/learn/vortex)) for persistent storage.

### Arrow vs. Protocol Buffers

Protocol Buffers (protobuf) is a row-oriented serialization format designed for RPC messages. It encodes individual records into variable-length byte sequences, which must be deserialized field-by-field by the receiver.

Arrow is a columnar format designed for bulk data. Serialization and deserialization are not needed when both sides use Arrow: the in-memory and wire formats are the same.

For single-record RPC messages, protobuf is simpler and more efficient. For bulk analytical data (thousands to millions of rows), Arrow provides orders-of-magnitude better throughput because it avoids per-row serialization overhead and enables vectorized processing.

### Arrow vs. CSV and JSON

CSV and JSON are text-based, schema-less formats. Parsing them requires type inference, escape handling, and string-to-native-type conversion. These operations are CPU-intensive and unpredictable.

Arrow is a binary, schema-explicit format. No parsing is needed: the data is ready for computation as soon as it is read into memory. For analytical workloads, Arrow is typically 100-1000x faster to process than the same data in CSV or JSON.

CSV and JSON remain valuable for human-readable configuration, small data interchange, and systems that require text-based protocols. Arrow is designed for machine-to-machine analytical data exchange where performance matters.

## How Spice Uses Apache Arrow

[Spice](/platform/sql-federation-acceleration) is built natively on Apache Arrow. Every layer of the Spice architecture (from query parsing to result delivery) operates on Arrow arrays. This is not an integration or a compatibility layer; Arrow is the native data representation throughout.

### Native Arrow Query Execution

Spice's query engine, [Apache DataFusion](/learn/apache-datafusion), operates on Arrow arrays throughout the entire query pipeline. SQL queries are parsed into logical plans, optimized, converted to physical plans, and executed, all producing and consuming Arrow record batches. There is zero serialization overhead between query operators because every operator reads and writes the same Arrow format.

This means a filter operator produces Arrow arrays that a join operator consumes directly. An aggregation operator outputs Arrow arrays that a sort operator reads without copying. The entire pipeline is a sequence of zero-copy transformations on Arrow buffers.

### Zero-Copy Data Exchange with Arrow Flight

Spice exposes query results to clients via Arrow Flight. When a client application (Python, Go, Rust, Java) submits a SQL query, Spice executes it and streams the result as Arrow record batches over Flight. The client receives native Arrow arrays: no deserialization, no row-by-row parsing, no schema inference.

This is particularly impactful for [SQL federation](/learn/sql-federation) workloads that return large result sets. A federated query that joins data from PostgreSQL, Databricks, and Amazon S3 produces its result as Arrow record batches that a Python application can consume with PyArrow and immediately use with pandas, polars, or DuckDB, all without any data conversion.

### Compatibility with the Arrow Ecosystem

Because Spice uses Arrow natively, it is immediately compatible with any tool that speaks Arrow:

- **PyArrow and pandas:** Query results are consumed directly as PyArrow tables or pandas DataFrames with zero overhead.
- **polars:** polars operates on Arrow arrays natively, making it a zero-copy consumer of Spice query results.
- **DuckDB:** DuckDB can consume Arrow record batches, enabling it to query Spice-accelerated data without any conversion step.
- **R Arrow:** R users access Spice query results through the Arrow R package.

This ecosystem compatibility is a direct consequence of building on Arrow rather than a proprietary in-memory format.

### Acceleration with Arrow-Native Storage

When data is accelerated in Spice for use cases like [data lake acceleration](/use-case/datalake-accelerator) (cached locally from remote sources), it is stored in [Vortex](/learn/vortex) format, which decodes to Arrow arrays. The acceleration layer produces Arrow record batches that the DataFusion query engine consumes directly. There is no impedance mismatch between the storage format and the execution format, which is why accelerated queries in Spice achieve sub-second latency.

## The Arrow Ecosystem

Arrow's standardized format has led to a broad ecosystem of projects built on top of it:

- **Apache DataFusion:** [Extensible SQL query engine](/learn/apache-datafusion) written in Rust, operating natively on Arrow arrays
- **Apache Parquet:** Columnar storage format with Arrow-native readers in every major language
- **polars:** High-performance DataFrame library built on Arrow, written in Rust
- **DuckDB:** Embedded analytical database with native Arrow import/export
- **ADBC (Arrow Database Connectivity):** Database client API that returns Arrow arrays instead of row-by-row results
- **Vortex:** [Compressed columnar file format](/learn/vortex) that decodes to Arrow arrays
- **Apache Spark:** Uses Arrow for Python UDF exchange (via PyArrow) and Spark Connect

This ecosystem demonstrates Arrow's value proposition: instead of each system defining its own in-memory format and writing conversion code for every other system, they all share Arrow. Any pair of Arrow-based systems can exchange data with zero overhead.

## Advanced Topics

### The Type System

Arrow defines a comprehensive type system that covers the data types needed for analytical workloads. The primitive types include signed and unsigned integers (8, 16, 32, 64-bit), floating-point numbers (16, 32, 64-bit), booleans, and fixed-width binary. Temporal types include dates (32-bit day count), times (32 or 64-bit with configurable resolution), timestamps (64-bit with timezone and configurable resolution from seconds to nanoseconds), and intervals (year-month or day-time).

Variable-length types include UTF-8 strings and binary blobs, each available in regular (32-bit offsets, up to 2 GB per array) and large (64-bit offsets, up to exabytes per array) variants. Nested types include structs (fixed set of named, typed fields), lists (variable-length sequences of a single type), maps (variable-length key-value pairs), and dense/sparse unions (tagged variants of multiple types).

The type system also includes dictionary-encoded types, where values are represented as indices into a separate dictionary array. Dictionary encoding is transparent: consumers can treat dictionary-encoded arrays as regular arrays, and computation kernels operate on them efficiently by applying operations to the dictionary and mapping results through the indices.

### Memory Management and Buffers

Arrow arrays are backed by contiguous memory buffers that are reference-counted and immutable. When an Arrow array is sliced (e.g., taking rows 100-200 of a 1,000-row array), no data is copied. Instead, the slice shares the underlying buffer and records an offset and length. Multiple slices of the same buffer share the same physical memory.

Buffer allocation in Arrow is pluggable. Applications can provide custom allocators that draw memory from specific regions (e.g., GPU memory, shared memory segments, memory-mapped files) or that enforce allocation limits. The default allocator aligns all buffers to 64-byte boundaries for SIMD compatibility.

This memory model is what enables zero-copy exchange. Because buffers are immutable and reference-counted, they can be safely shared across threads, processes, and even machines (via shared memory or Flight) without locks or copies.

### Compute Kernels

The Arrow libraries include a set of compute kernels: vectorized functions that operate on Arrow arrays. These kernels cover arithmetic (add, subtract, multiply, divide), comparison (equal, less than, greater than), string operations (substring, trim, case conversion), aggregation (sum, min, max, count), and casting (type conversion).

Compute kernels are implemented with SIMD intrinsics where possible, operating on multiple values per CPU instruction. Because Arrow arrays are contiguous and aligned, SIMD operations work efficiently without gather/scatter overhead.

The kernel library is the foundation for query engines built on Arrow. Rather than implementing basic operations from scratch, engines like [Apache DataFusion](/learn/apache-datafusion) call Arrow compute kernels for expression evaluation, enabling consistent performance across different query engines.

### Dictionary Encoding and Performance

Dictionary encoding is a first-class concept in Arrow, not just a storage optimization. A dictionary-encoded array stores an integer indices array and a separate dictionary array of unique values. This is particularly effective for string columns with repeated values: a column of country names, for example, stores each unique country name once and uses small integer indices for each row.

Arrow compute kernels are dictionary-aware. Operations like filtering and grouping can operate on the integer indices rather than the full string values, which is significantly faster. A GROUP BY on a dictionary-encoded string column can hash 4-byte integers instead of variable-length strings, reducing both memory bandwidth and CPU cycles.

Dictionary encoding also reduces memory consumption proportionally to the ratio of unique values to total values. A 10-million-row column with 200 unique strings stores 200 strings plus 10 million 2-byte indices, rather than 10 million full string values.

<ContentRichText
  fields={{
    coverage: 'rc-end',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<AccordionFaq
  fields={{
    heading: 'Apache Arrow FAQ',
    paragraph: '',
    items: [
      {
        title:
          'What is the difference between Apache Arrow and Apache Parquet?',
        paragraph:
          '<p>Arrow is an in-memory columnar format optimized for fast computation and zero-copy data exchange. Parquet is an on-disk columnar format optimized for compressed storage. In practice, they work together: data is stored as Parquet on disk and loaded into Arrow arrays in memory for processing. Arrow prioritizes access speed; Parquet prioritizes storage efficiency.</p>',
      },
      {
        title: 'Is Apache Arrow a database?',
        paragraph:
          '<p>No. Apache Arrow is a data format specification and a set of libraries. It defines how columnar data is represented in memory and provides implementations in multiple languages (C++, Rust, Python, Java, Go, and others). Arrow is used by databases, query engines, and data science libraries as their underlying data representation, but it does not include storage, indexing, or query processing on its own.</p>',
      },
      {
        title: 'What does zero-copy mean in the context of Arrow?',
        paragraph:
          '<p>Zero-copy means that when data is exchanged between two systems or libraries that both use Arrow, no bytes are copied or transformed. The receiver reads directly from the sender memory buffers. This works because Arrow defines a canonical, language-independent memory layout, so data produced by one system is immediately usable by another without serialization or deserialization.</p>',
      },
      {
        title: 'How does Arrow Flight compare to JDBC and ODBC?',
        paragraph:
          '<p>JDBC and ODBC transmit query results row-by-row in a serialized format. Arrow Flight transmits entire record batches as raw Arrow memory buffers over gRPC. For analytical queries that return thousands or millions of rows, Flight provides dramatically higher throughput because it avoids per-row serialization overhead and delivers data in a format that is immediately ready for vectorized computation.</p>',
      },
      {
        title: 'Which programming languages support Apache Arrow?',
        paragraph:
          '<p>Apache Arrow has native implementations in C++, Rust, Python (PyArrow), Java, Go, JavaScript, C#, Ruby, and Julia. Each implementation produces the same standardized memory layout, so data created in one language can be consumed by any other language without conversion. The C++ and Rust implementations are the most mature and provide the broadest feature sets.</p>',
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<ContentResourceFeatured
  fields={{
    heading: 'Learn more about Arrow and Spice',
    paragraph:
      'Technical resources on how Spice leverages Apache Arrow for zero-copy query execution and high-speed data transport.',
    mode: 'default',
    resources: [
      {
        source: 'manual',
        resource: null,
        resource_manual: {
          eyebrow: 'Docs',
          title: {
            title: 'Spice.ai OSS Documentation',
            url: 'https://spiceai.org/docs',
            target: '_blank',
          },
          description:
            'Learn how Spice uses Apache Arrow as its native data format for zero-copy query execution and high-speed data transport.',
          image: {
            ID: 1661,
            id: 1661,
            title: 'Docs jpeg',
            filename: 'Docs-jpeg.jpeg',
            filesize: 103192,
            url: '/website-assets/media/2025/12/Docs-jpeg.jpeg',
            link: '/docs-jpeg/',
            alt: '',
            author: '9',
            description: '',
            caption: '',
            name: 'docs-jpeg',
            status: 'inherit',
            uploaded_to: 0,
            date: '2025-12-05 04:13:53',
            modified: '2025-12-05 04:13:53',
            menu_order: 0,
            mime_type: 'image/jpeg',
            type: 'image',
            subtype: 'jpeg',
            icon: '/website-assets/media/default.png',
            width: 1832,
            height: 1036,
            sizes: {
              thumbnail: '/website-assets/media/2025/12/Docs-jpeg-150x150.jpeg',
              'thumbnail-width': 150,
              'thumbnail-height': 150,
              medium: '/website-assets/media/2025/12/Docs-jpeg-300x170.jpeg',
              'medium-width': 300,
              'medium-height': 170,
              medium_large:
                '/website-assets/media/2025/12/Docs-jpeg-768x434.jpeg',
              'medium_large-width': 768,
              'medium_large-height': 434,
              large: '/website-assets/media/2025/12/Docs-jpeg-1024x579.jpeg',
              'large-width': 1024,
              'large-height': 579,
              '1536x1536':
                '/website-assets/media/2025/12/Docs-jpeg-1536x869.jpeg',
              '1536x1536-width': 1536,
              '1536x1536-height': 869,
              '2048x2048': '/website-assets/media/2025/12/Docs-jpeg.jpeg',
              '2048x2048-width': 1832,
              '2048x2048-height': 1036,
            },
          },
        },
      },
      {
        source: 'picker',
        resource: [
          {
            title: 'How we use Apache DataFusion at Spice AI',
            slug: '/blog/how-we-use-apache-datafusion-at-spice-ai',
            excerpt:
              'A technical overview of how Spice extends Apache DataFusion with custom table providers, optimizer rules, and UDFs.',
            image:
              '/website-assets/media/2026/01/Engineering-at-Spice-AI-Apache-DataFusion.png',
            type: 'Blog',
            taxonomy: ['SQL Federation', 'Engineering'],
          },
        ],
        resource_manual: {
          eyebrow: '',
          title: null,
          description: '',
          image: false,
        },
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<TalkToAnEngineerCta />

---

## What is Apache Ballista?
URL: https://spice.ai/learn/apache-ballista
Date: 2026-02-14T00:00:00
Description: Apache Ballista is a distributed SQL query engine that extends Apache DataFusion across multiple nodes. Learn how Ballista works, its architecture, and how it compares to Spark and Trino.

<HeroCenteredText
  fields={{
    graphic_position: 'no-graphic',
    heading_tag: 'h1',
    heading: 'What is Apache Ballista?',
    paragraph:
      'Apache Ballista is a distributed SQL query engine that extends Apache DataFusion across multiple nodes for horizontal scaling. It adds distributed scheduling, shuffle, and exchange operators on top of DataFusion, enabling analytical queries over datasets that exceed the capacity of a single machine.',
    cta: [
      {
        type: 'filled',
        cta: {
          title: 'See Spice distributed queries',
          url: '/feature/distributed-query',
          target: '',
        },
      },
      {
        type: 'bordered',
        cta: {
          title: 'Read the docs',
          url: 'https://spiceai.org/docs',
          target: '',
        },
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<ContentRichText
  fields={{
    coverage: 'rc-start',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

[Apache DataFusion](/learn/apache-datafusion) is a powerful single-node SQL query engine, but some workloads exceed what a single machine can handle. A dataset might be too large to fit in memory, a query might need to scan terabytes of data within a latency budget, or the computational cost of a complex join might benefit from parallelism across multiple cores on multiple nodes.

Apache Ballista solves this by extending DataFusion's query engine across a cluster of machines. It takes DataFusion's SQL parsing, logical planning, and optimization capabilities and adds the distributed execution layer needed to partition work, shuffle data between nodes, and merge results. Each node in a Ballista cluster runs DataFusion as its local query engine, and Ballista coordinates them.

## Architecture

Ballista uses a scheduler-executor architecture, similar in concept to Spark's driver-executor model but implemented in Rust with Apache Arrow as the native data format.

### Scheduler

The scheduler is the coordinator of a Ballista cluster. When a SQL query arrives, the scheduler:

1. **Parses and optimizes** the query using DataFusion's standard SQL parser and optimizer
2. **Creates a distributed execution plan** by analyzing the logical plan and inserting exchange operators where data needs to move between nodes (e.g., for joins and aggregations that require data from multiple partitions)
3. **Partitions the work** into stages and tasks. A stage is a sequence of operations that can execute on a single partition without data exchange. Tasks are individual units of work assigned to executor nodes.
4. **Assigns tasks to executors** based on data locality, executor capacity, and load balancing
5. **Tracks progress** and handles retries if an executor fails or a task times out

The scheduler maintains a global view of the cluster state, including which executors are available, which tasks are running, and which stages are complete.

### Executors

Executors are the worker nodes that perform the actual computation. Each executor:

1. **Receives task assignments** from the scheduler
2. **Executes tasks** using its local DataFusion engine. The executor reads data from its assigned partitions, applies the operators in the physical plan (scan, filter, project, aggregate, etc.), and produces Arrow record batches as output.
3. **Writes intermediate results** to local storage (or exchanges them with other executors) for downstream stages
4. **Reports status** back to the scheduler, including completion, failure, and performance metrics

Because each executor runs a full DataFusion engine, all of DataFusion's single-node optimizations (predicate pushdown, projection pruning, vectorized execution on Arrow arrays) apply at the per-node level. Ballista adds the coordination and data exchange layer on top.

## How Distributed Query Execution Works

Distributed query execution introduces several concepts that don't exist in single-node engines. Understanding these is key to understanding how Ballista (and distributed query engines in general) operate.

### Partitioning

Data is divided into partitions, subsets of the full dataset that can be processed independently. Partitioning can be based on:

- **Hash partitioning:** Rows are assigned to partitions based on a hash of one or more columns. This ensures that all rows with the same key end up in the same partition, which is necessary for hash joins and group-by aggregations.
- **Range partitioning:** Rows are assigned to partitions based on value ranges. This is useful for ordered scans and range queries.
- **Round-robin partitioning:** Rows are distributed evenly across partitions without regard to content. This maximizes parallelism for operations that don't require co-located keys.

The choice of partitioning strategy affects both performance and correctness. A hash join, for example, requires that both sides of the join are hash-partitioned on the join key so that matching rows are co-located on the same executor.

### Shuffles and Exchanges

When a query requires data to be repartitioned (for example, when a hash join needs data partitioned by the join key, but the data is currently range-partitioned), a shuffle (or exchange) occurs. During a shuffle:

1. Each executor reads its local partitions and computes the target partition for each row based on the new partitioning scheme
2. Rows are serialized as Arrow record batches and sent over the network to the appropriate executor
3. The receiving executor collects incoming batches and makes them available for the next stage of execution

Shuffles are the most expensive operation in distributed query execution because they involve network I/O and serialization. Minimizing unnecessary shuffles is a key optimization goal for distributed query planners.

### Stages

Ballista breaks a distributed query plan into stages separated by exchange boundaries. Within a stage, all operations can execute on a single partition without data exchange. Between stages, shuffles repartition the data as needed.

For example, a query that joins two tables and then aggregates the result might be broken into three stages:

1. **Stage 1:** Scan and filter table A, hash-partition by join key
2. **Stage 2:** Scan and filter table B, hash-partition by join key
3. **Stage 3:** Perform the hash join on co-located partitions, then aggregate

Stages 1 and 2 can execute in parallel across different executors. Stage 3 depends on both Stage 1 and Stage 2 completing, because it needs the shuffled output from both.

## Ballista vs. Other Distributed Query Engines

### Ballista vs. Apache Spark

Spark is the most widely deployed distributed data processing framework. It runs on the JVM, supports multiple languages (Scala, Python, Java, R), and has a mature ecosystem of libraries for batch processing, streaming, machine learning, and graph processing.

Ballista differs in several ways:

- **Language and runtime:** Ballista is written in Rust with no JVM dependency. This means lower memory overhead, more predictable performance (no garbage collection pauses), and faster startup times.
- **Data format:** Ballista uses Apache Arrow as its native in-memory format. Spark uses its own internal row format for many operations and converts to/from Arrow when interfacing with external systems. Ballista's native Arrow integration eliminates this conversion overhead.
- **Footprint:** Ballista is a lightweight distributed query engine. Spark is a comprehensive data processing framework that includes batch, streaming, ML, and graph libraries. Ballista is smaller and more focused.
- **Extensibility:** Both are extensible, but Ballista inherits DataFusion's Rust trait-based extension model, while Spark uses JVM-based plugin interfaces.

Choose Spark when you need a mature, full-featured distributed data processing platform with a large ecosystem. Choose Ballista when you need a lightweight, Rust-native distributed SQL engine with native Arrow integration and lower operational overhead.

### Ballista vs. Trino

Trino (formerly Presto) is a distributed SQL query engine designed for interactive analytics and [SQL federation](/learn/sql-federation) across heterogeneous data sources. Trino has a mature production track record and a rich connector ecosystem.

Ballista and Trino share the same high-level architecture (scheduler + workers), but differ in implementation:

- **Language:** Trino is written in Java. Ballista is written in Rust.
- **Data format:** Trino uses its own internal page format. Ballista uses Apache Arrow natively.
- **Embeddability:** Trino is designed to be deployed as a standalone cluster. Ballista, like DataFusion, is designed to be embeddable: it can be integrated into a larger application rather than requiring standalone deployment.
- **Maturity:** Trino has years of production deployment at major companies. Ballista is newer and under active development.

Choose Trino when you need a production-proven distributed SQL engine with a broad connector ecosystem. Choose Ballista when you need a Rust-native, Arrow-native distributed engine that can be embedded into a custom system.

## Ballista and DataFusion: The Relationship

Ballista is built directly on top of DataFusion. This relationship is fundamental to understanding both projects:

- **DataFusion** provides SQL parsing, logical planning, query optimization, and single-node physical execution. It is a library that runs in a single process.
- **Ballista** adds distributed scheduling, partitioning, shuffles, and inter-node coordination. It uses DataFusion as the per-node execution engine.

When Ballista executes a query, each executor node runs DataFusion locally. DataFusion handles all the per-partition computation: scanning, filtering, projecting, joining, aggregating. Ballista handles the coordination between nodes: deciding which executor processes which partition, managing shuffles, and collecting final results.

This separation means that improvements to DataFusion's optimizer or execution engine automatically benefit Ballista deployments. And DataFusion extensions (custom table providers, UDFs, optimizer rules) work in Ballista without modification.

## Current Status and Development

Ballista is an incubating project within the Apache Arrow ecosystem. It is under active development, with contributions from multiple organizations. Key areas of ongoing work include:

- **Fault tolerance:** Improving task retry logic and executor failure recovery
- **Resource management:** Better scheduling based on executor memory and CPU availability
- **Performance:** Reducing shuffle overhead and improving exchange operator efficiency
- **Integration:** Expanding the set of data sources and file formats supported in distributed mode

Ballista is suitable for experimental and early production workloads. For mission-critical production deployments that require mature fault tolerance and operations tooling, teams should evaluate Ballista alongside established alternatives like Trino and Spark.

## How Spice Uses Distributed Query Concepts

Spice builds on the distributed query concepts pioneered by Ballista and other distributed engines. Spice's [distributed query execution](/feature/distributed-query) architecture enables [SQL federation](/learn/sql-federation) and [data acceleration](/learn/data-acceleration) across multiple nodes:

- **Distributed federation:** Queries are federated across data sources from any node in a Spice cluster. The query planner determines the optimal execution strategy, including which sources to query from which nodes.
- **Distributed acceleration:** Accelerated datasets can be partitioned across nodes, with each node caching a subset of the data. Queries are routed to the nodes that hold the relevant partitions.
- **Arrow-native transport:** Like Ballista, Spice uses Apache Arrow as its native data format for inter-node communication, eliminating serialization overhead.

By combining DataFusion's single-node query engine with distributed execution capabilities, Spice delivers [sub-second federated queries](/platform/sql-federation-acceleration) across distributed data sources and acceleration caches.

## Advanced Topics

### Scheduler-Executor Architecture in Depth

The scheduler and executors communicate through a combination of gRPC services and Arrow Flight endpoints. The scheduler exposes a planning API that accepts SQL or pre-built logical plans and returns a job identifier. It then decomposes the job into a directed acyclic graph (DAG) of stages and tasks.

```mermaid
flowchart TD
    Client["Client"] -->|"SQL / Logical Plan"| Scheduler["Scheduler"]
    Scheduler -->|"Task Assignment"| E1["Executor 1"]
    Scheduler -->|"Task Assignment"| E2["Executor 2"]
    Scheduler -->|"Task Assignment"| E3["Executor 3"]
    E1 -->|"Shuffle Data"| E2
    E1 -->|"Shuffle Data"| E3
    E2 -->|"Shuffle Data"| E1
    E2 -->|"Shuffle Data"| E3
    E3 -->|"Shuffle Data"| E1
    E3 -->|"Shuffle Data"| E2
    E1 -->|"Status / Results"| Scheduler
    E2 -->|"Status / Results"| Scheduler
    E3 -->|"Status / Results"| Scheduler
    Scheduler -->|"Final Results"| Client
```

Each executor registers with the scheduler at startup, reporting its available resources (CPU cores, memory). The scheduler uses this information to make placement decisions. When a task completes, the executor reports back with metrics (execution time, rows processed, bytes shuffled), which the scheduler uses to refine future scheduling decisions within the same job.

### Shuffle Strategies

Shuffles are the most performance-critical aspect of distributed query execution. Ballista supports several shuffle strategies, each suited to different workload patterns:

**Hash shuffle** is the default for joins and group-by aggregations. Each executor hashes each row's partition key and writes it to one of N output partitions. The receiving executors pull their assigned partitions. This ensures co-location of matching keys but can create hot partitions if the key distribution is skewed.

**Sort-merge shuffle** is used when the downstream stage requires sorted input: for example, a sort-merge join or a global ORDER BY. Each executor sorts its local partition and writes sorted runs. The downstream stage merges these sorted runs without needing to buffer the full dataset.

**Broadcast shuffle** is an optimization for small tables. When one side of a join is small enough to fit in executor memory, the scheduler broadcasts the entire small table to all executors rather than hash-partitioning both sides. This eliminates one full shuffle and is a significant performance win for star-schema queries with small dimension tables.

The query planner selects shuffle strategies based on the physical plan operators, available statistics, and configurable thresholds (e.g., the broadcast size limit).

### Fault Tolerance

Distributed query execution must handle executor failures gracefully. Ballista's fault tolerance model operates at the task level:

- **Heartbeat monitoring:** The scheduler expects periodic heartbeats from each executor. If an executor misses consecutive heartbeats, the scheduler marks it as lost and reassigns its in-flight tasks to other executors.
- **Task retries:** When a task fails (whether due to executor failure, out-of-memory errors, or data source errors), the scheduler retries the task on a different executor up to a configurable retry limit. If the task depends on intermediate shuffle data that was stored on the failed executor, the scheduler re-executes the upstream stage that produced that data.
- **Stage-level recovery:** If a shuffle output is lost because the executor that stored it has failed, the scheduler must re-execute the entire upstream stage to regenerate the shuffle data. This is the most expensive failure mode and is the primary motivation for persisting shuffle data to durable storage in production deployments.

### Resource Scheduling

Resource-aware scheduling is essential for stable cluster operation. Ballista's scheduler tracks each executor's resource utilization and enforces constraints:

- **Memory-based admission control:** The scheduler estimates the memory requirements of each task based on the physical plan operators (e.g., hash joins require memory proportional to the build side). Tasks are assigned to executors that have sufficient free memory.
- **Slot-based concurrency:** Each executor advertises a fixed number of task slots (typically equal to the number of CPU cores). The scheduler does not assign more tasks than an executor has slots, preventing CPU oversubscription.
- **Data locality preferences:** When a task reads data from a specific storage location, the scheduler prefers executors that are co-located with that data. This reduces network I/O for the initial scan stage. If no co-located executor has available capacity, the scheduler falls back to a remote executor.

These mechanisms work together to keep executor utilization high while avoiding overload conditions that would cause task failures or performance degradation.

<ContentRichText
  fields={{
    coverage: 'rc-end',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<AccordionFaq
  fields={{
    heading: 'Apache Ballista FAQ',
    paragraph: '',
    items: [
      {
        title: 'How does Ballista compare to Apache Spark?',
        paragraph:
          '<p>Spark is a comprehensive, JVM-based distributed data processing framework with mature libraries for batch, streaming, ML, and graph processing. Ballista is a focused, Rust-native distributed SQL query engine built on Apache DataFusion and Arrow. Ballista has lower memory overhead, faster startup, and native Arrow integration, but Spark has a larger ecosystem, broader language support, and years of production hardening at scale.</p>',
      },
      {
        title: 'How does Ballista compare to Trino?',
        paragraph:
          '<p>Both are distributed SQL query engines with scheduler-worker architectures. Trino is written in Java, uses its own internal data format, and is designed for standalone cluster deployment with a mature connector ecosystem. Ballista is written in Rust, uses Apache Arrow natively, and is designed to be embeddable. Trino is more production-proven; Ballista offers Rust-native performance and tighter Arrow integration.</p>',
      },
      {
        title: 'Is Ballista production ready?',
        paragraph:
          '<p>Ballista is under active development as an incubating Apache project. It is suitable for experimental and early production workloads. For mission-critical production deployments that require mature fault tolerance, operational tooling, and SLA guarantees, teams should evaluate Ballista alongside established alternatives like Trino and Spark, considering their specific requirements for maturity versus native Arrow and Rust integration.</p>',
      },
      {
        title: 'What is the relationship between Ballista and DataFusion?',
        paragraph:
          '<p>Ballista is built on top of DataFusion. DataFusion provides the single-node SQL query engine: parsing, planning, optimization, and execution. Ballista adds the distributed layer: scheduling, partitioning, shuffles, and inter-node coordination. Each executor node in a Ballista cluster runs DataFusion locally. DataFusion extensions (custom table providers, UDFs, optimizer rules) work in Ballista without modification.</p>',
      },
      {
        title: 'What are common use cases for distributed SQL query engines?',
        paragraph:
          '<p>Distributed query engines are used when single-node capacity is insufficient: scanning terabytes of data within latency budgets, running complex joins across very large tables, parallelizing expensive aggregations, and serving concurrent analytical queries that exceed single-machine throughput. They are also used for federated queries across geographically distributed data sources where pushing computation to the data is more efficient than centralizing it.</p>',
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<ContentResourceFeatured
  fields={{
    heading: 'Learn more about distributed queries and Spice',
    paragraph:
      'Technical resources on distributed SQL execution, DataFusion, and how Spice handles distributed workloads.',
    mode: 'default',
    resources: [
      {
        source: 'manual',
        resource: null,
        resource_manual: {
          eyebrow: 'Docs',
          title: {
            title: 'Spice.ai OSS Documentation',
            url: 'https://spiceai.org/docs',
            target: '_blank',
          },
          description:
            'Learn how Spice uses distributed query execution to federate and accelerate SQL across multiple nodes and data sources.',
          image: {
            ID: 1661,
            id: 1661,
            title: 'Docs jpeg',
            filename: 'Docs-jpeg.jpeg',
            filesize: 103192,
            url: '/website-assets/media/2025/12/Docs-jpeg.jpeg',
            link: '/docs-jpeg/',
            alt: '',
            author: '9',
            description: '',
            caption: '',
            name: 'docs-jpeg',
            status: 'inherit',
            uploaded_to: 0,
            date: '2025-12-05 04:13:53',
            modified: '2025-12-05 04:13:53',
            menu_order: 0,
            mime_type: 'image/jpeg',
            type: 'image',
            subtype: 'jpeg',
            icon: '/website-assets/media/default.png',
            width: 1832,
            height: 1036,
            sizes: {
              thumbnail: '/website-assets/media/2025/12/Docs-jpeg-150x150.jpeg',
              'thumbnail-width': 150,
              'thumbnail-height': 150,
              medium: '/website-assets/media/2025/12/Docs-jpeg-300x170.jpeg',
              'medium-width': 300,
              'medium-height': 170,
              medium_large:
                '/website-assets/media/2025/12/Docs-jpeg-768x434.jpeg',
              'medium_large-width': 768,
              'medium_large-height': 434,
              large: '/website-assets/media/2025/12/Docs-jpeg-1024x579.jpeg',
              'large-width': 1024,
              'large-height': 579,
              '1536x1536':
                '/website-assets/media/2025/12/Docs-jpeg-1536x869.jpeg',
              '1536x1536-width': 1536,
              '1536x1536-height': 869,
              '2048x2048': '/website-assets/media/2025/12/Docs-jpeg.jpeg',
              '2048x2048-width': 1832,
              '2048x2048-height': 1036,
            },
          },
        },
      },
      {
        source: 'picker',
        resource: [
          {
            title: 'How we use Apache DataFusion at Spice AI',
            slug: '/blog/how-we-use-apache-datafusion-at-spice-ai',
            excerpt:
              'A technical overview of how Spice extends Apache DataFusion with custom table providers, optimizer rules, and UDFs.',
            image:
              '/website-assets/media/2026/01/Engineering-at-Spice-AI-Apache-DataFusion.png',
            type: 'Blog',
            taxonomy: ['SQL Federation', 'Engineering'],
          },
        ],
        resource_manual: {
          eyebrow: '',
          title: null,
          description: '',
          image: false,
        },
      },
      {
        source: 'picker',
        resource: [
          {
            title: "A Developer's Guide to Understanding Spice.ai",
            slug: '/blog/a-developers-guide-to-understanding-spice-ai',
            excerpt:
              'Learn what Spice.ai is, when to use it, and how it solves enterprise data challenges.',
            image:
              '/website-assets/media/2026/02/A-developers-guide-to-understanding-Spice.ai_.png',
            type: 'Blog',
            taxonomy: ['Spice AI'],
          },
        ],
        resource_manual: {
          eyebrow: '',
          title: null,
          description: '',
          image: false,
        },
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<TalkToAnEngineerCta />

---

## Apache DataFusion vs DuckDB: How to Choose
URL: https://spice.ai/learn/apache-datafusion-vs-duckdb
Date: 2026-04-03T00:00:00
Description: Apache DataFusion and DuckDB are both fast analytical query engines built for in-process use. Learn the key differences in architecture, extensibility, and when to use each.

<HeroCenteredText
  fields={{
    graphic_position: 'no-graphic',
    heading_tag: 'h1',
    heading: 'Apache DataFusion vs DuckDB',
    paragraph:
      'Apache DataFusion and DuckDB are both fast, in-process analytical query engines. DataFusion is an embeddable Rust library designed to be extended. DuckDB is a self-contained database designed to be used as-is. Choosing between them comes down to whether you are building a data system or querying data.',
    cta: [
      {
        type: 'filled',
        cta: {
          title: 'See Spice SQL federation',
          url: '/platform/sql-federation-acceleration',
          target: '',
        },
      },
      {
        type: 'bordered',
        cta: {
          title: 'Read the docs',
          url: 'https://spiceai.org/docs',
          target: '_blank',
        },
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<ContentRichText
  fields={{
    coverage: 'rc-start',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

In-process analytical databases have changed how teams think about query performance. Instead of sending queries over the network to a remote warehouse, teams can embed a fast columnar engine directly in their application or data pipeline and query data at memory bandwidth speeds. [Apache DataFusion](/learn/apache-datafusion) and [DuckDB](/learn/duckdb) are the two most prominent options in this space, and they are frequently compared by engineers making real architectural decisions.

They are not the same tool. DataFusion is a query engine framework written in Rust that teams embed into larger systems and extend with custom logic. DuckDB is a complete analytical database system with its own storage engine and transaction manager. Both are capable of fast analytical queries, but they answer different questions. For how each compares against the wider field, see [the best query engines for real-time AI analytics](/learn/best-query-engines-for-real-time-ai-analytics).

## What Apache DataFusion Is

[Apache DataFusion](/learn/apache-datafusion) is an open-source SQL query engine framework within the Apache Arrow ecosystem. It provides parsing, logical planning, optimization, and vectorized execution as a Rust library. DataFusion does not include a storage engine (it relies on external table providers) and it does not manage transactions or data persistence independently.

The distinguishing characteristic of DataFusion is extensibility. Every major component is designed to be replaced or augmented: table providers can connect to any data source, optimizer rules can be added without modifying DataFusion's source code, user-defined functions (UDFs) can extend SQL with custom operations, and custom physical plan nodes can implement new execution strategies. Systems built on DataFusion include [Spice](/platform/sql-federation-acceleration), InfluxDB 3.0, Apache Ballista, and Delta-rs.

DataFusion produces results as Apache Arrow record batches throughout its pipeline. There is zero serialization overhead between operators, and results integrate directly with the broader Arrow ecosystem (PyArrow, Arrow Flight, Parquet readers, etc.).

## What DuckDB Is

[DuckDB](/learn/duckdb) is an open-source, embedded analytical database management system written in C++. It includes a columnar storage engine, a vectorized query executor, full ACID transaction support, and a PostgreSQL-compatible SQL dialect. DuckDB is designed to be used directly, not extended into a platform.

The distinguishing characteristic of DuckDB is completeness. It is a full database that works out of the box. A developer installs it, opens a connection, and starts querying, no custom code required. DuckDB handles data storage, schema management, transactions, and compression automatically.

DuckDB can query Parquet, CSV, and JSON files directly without loading them into a database. It runs in-process with no external dependencies, with bindings available for Python, R, Go, Rust, Java, Node.js, and others.

## Architecture Comparison

The core architectural difference is that DataFusion is a query engine without storage, while DuckDB is a complete database that includes storage.

```mermaid
flowchart LR
    subgraph DataFusion["Apache DataFusion"]
        DFQuery["SQL Query"] --> DFPlan["Logical Plan"]
        DFPlan --> DFOpt["Optimizer"]
        DFOpt --> DFExec["Vectorized Execution"]
        DFExec --> DFArrow["Arrow Record Batches"]
        DFTP["Custom Table Providers\n(any data source)"] --> DFOpt
    end

    subgraph DuckDB["DuckDB"]
        DQQuery["SQL Query"] --> DQParse["Parse & Plan"]
        DQParse --> DQOpt["Optimizer"]
        DQOpt --> DQExec["Vectorized Execution"]
        DQExec --> DQResult["Result Set"]
        DQStorage["Built-in Columnar Storage\n(DuckDB files, Parquet, CSV)"] --> DQOpt
    end
```

### Storage model

DataFusion has no built-in storage. It reads data through `TableProvider` implementations, which can point to anything: local Parquet files, remote databases, in-memory Arrow buffers, or custom storage formats. Building a DataFusion-based system requires implementing or choosing table providers.

DuckDB has a full native storage engine. Data is persisted in DuckDB's columnar format on disk, and the storage layer handles compression, indexing, and crash recovery automatically. DuckDB also reads Parquet, CSV, and JSON files directly, without loading them into its native format.

### Extensibility model

DataFusion is designed for extension first. The extension surface covers custom table providers, logical optimizer rules, physical execution plans, scalar and aggregate UDFs, and custom analyzers. These extension points are typed Rust traits; implementing them is straightforward and does not require forking DataFusion.

DuckDB supports extension through a loadable extension API (for adding file format readers, custom functions, and data types) but is fundamentally a closed system. You use DuckDB's capabilities; you do not rebuild DuckDB's internals.

### Language and integration

DataFusion is a pure Rust library. Rust crates directly depend on it via Cargo. Python, Java, and other language bindings exist but are thinner wrappers around the Rust core. Systems built on DataFusion are typically written primarily in Rust.

DuckDB is written in C++ with first-class bindings across Python, R, Go, Rust, Java, Node.js, and others. The Python API in particular is mature and widely used for interactive analysis and data pipelines.

## Feature Comparison

| Feature                 | Apache DataFusion                                               | DuckDB                                             |
| ----------------------- | --------------------------------------------------------------- | -------------------------------------------------- |
| **Execution model**     | Vectorized (Arrow-native)                                       | Vectorized (columnar)                              |
| **Storage**             | None (external table providers)                                 | Full native columnar storage                       |
| **Persistence**         | Via table provider                                              | Full (WAL, crash recovery)                         |
| **Transactions**        | None (stateless query engine)                                   | Full ACID                                          |
| **Full SQL support**    | Comprehensive (extensible)                                      | Comprehensive (PostgreSQL-compatible)              |
| **File format support** | Via providers: Parquet, CSV, JSON, Arrow                        | Native: Parquet, CSV, JSON; extensible             |
| **Parallelism**         | Multi-threaded, partition-aware                                 | Automatic multi-core                               |
| **Primary language**    | Rust                                                            | C++ (bindings for many languages)                  |
| **Extensibility**       | Deep (table providers, optimizer rules, UDFs, custom operators) | Limited (extension API for discrete additions)     |
| **Startup overhead**    | Milliseconds (library init)                                     | Milliseconds (in-process)                          |
| **Ecosystem**           | Apache Arrow ecosystem                                          | Standalone; integrates with Parquet, Arrow, Python |
| **Primary use case**    | Building data systems                                           | Analyzing data                                     |

## Performance

Both DataFusion and DuckDB deliver excellent analytical query performance relative to row-oriented databases and remote query engines. On standard benchmarks like TPC-H, they perform within a similar range, though results vary by query type and hardware.

The practical performance difference comes from the workload pattern:

**DataFusion** excels when queries are distributed across custom sources or when the execution pipeline is extended with domain-specific operators. Because DataFusion operates natively on Arrow throughout, there is zero serialization cost when data is already in Arrow format (from Arrow Flight, from in-memory caches, or from a connected streaming system).

**DuckDB** excels at single-node analytical queries over files and when the full Parquet reader with zone maps, dictionary pushdown, and late materialization is needed. DuckDB's C++ implementation and extensive query optimizer tuning give it an edge on pure file-scanning workloads.

For Spice's [data acceleration](/learn/data-acceleration) use case, DuckDB is one of several available accelerator engines. The recommended option for production workloads is Spice Cayenne, which uses the [Vortex](/learn/vortex) columnar format and outperforms DuckDB on TPC-H benchmarks for accelerated datasets.

## When to Choose DataFusion

Choose Apache DataFusion when:

- **You are building a data system**, not just querying data. If you need to connect to 10+ data sources, add custom SQL functions, or implement a proprietary execution strategy, DataFusion's extension model is the right foundation.
- **Your application is written in Rust** and you need deep embedding with zero cross-language overhead.
- **You need Federation**. DataFusion's custom table provider API makes it straightforward to add connectors to remote databases, object stores, and streaming systems, the approach used by [SQL federation](/learn/sql-federation) engines like Spice.
- **You are building on the Arrow ecosystem**. DataFusion's native Arrow output integrates directly with Arrow Flight, Parquet writers, and notebook environments without conversion.
- **Long-term extensibility matters**. DataFusion's architecture is designed to evolve with domain requirements; DuckDB's extension API covers common additions but not deep architectural changes.

## When to Choose DuckDB

Choose DuckDB when:

- **You want a database, not a framework**. DuckDB works out of the box for analytical queries without writing any Rust code or configuring table providers.
- **You need persistence and transactions**. If you need to write data back to a durable store and query it later, DuckDB's native storage engine handles this. DataFusion has no built-in storage.
- **Your team works in Python, R, or another non-Rust language**. DuckDB's Python API is mature, widely adopted, and well-documented. It integrates naturally with pandas, PyArrow, and dbt.
- **Interactive and exploratory analysis**. DuckDB in a Jupyter notebook or a DuckDB CLI is an excellent tool for ad hoc exploration of Parquet files and structured data.
- **You need SQL-level compatibility with PostgreSQL**. DuckDB's SQL dialect is closely aligned with PostgreSQL, which simplifies porting queries.

## Advanced Topics

### DataFusion's Physical Planning and Extensibility Depth

DataFusion separates logical planning (what to compute) from physical planning (how to compute it). This separation allows developers to inject custom physical operators: for example, a custom join that routes one side of a join to a remote database and the other to a local buffer, merging results in the DataFusion execution thread.

This is not possible with DuckDB. DuckDB's execution engine is a closed system. You can add custom scalar functions and file format readers, but you cannot replace or inject into its execution operators.

For [SQL federation](/learn/sql-federation) use cases (where different tables come from different sources and the query planner must make pushdown decisions for each source type), DataFusion's extensibility is essential.

### DuckDB's Parquet Zone Maps and Late Materialization

DuckDB's Parquet reader is one of the most optimized in the industry. It uses zone maps (min/max statistics stored in Parquet row group metadata) to skip row groups that cannot contain matching rows before reading any data. It also uses late materialization: columns not needed by a filter are not decoded until after the filter has been applied, further reducing I/O.

DataFusion also implements these optimizations, but DuckDB's C++ implementation and years of tuning give it consistent performance on raw Parquet scan workloads.

### Memory Management

DataFusion uses a `MemoryPool` abstraction that tracks and limits memory usage during query execution. Operators that accumulate state (hash joins, sorts, hash aggregations) register reservations and can spill to disk when the pool budget is exceeded.

DuckDB uses a similar buffer pool model with automatic spilling. Both handle out-of-core execution, but the behavior under memory pressure differs. DataFusion's memory pool is configurable and replaceable: a system builder can implement custom memory management strategies. DuckDB's memory management is internal and not externally extensible.

## DataFusion and DuckDB in the Spice Ecosystem

[Spice](/platform/sql-federation-acceleration) uses both engines:

- **Apache DataFusion** is Spice's core query engine. All federated queries across [40+ connected data sources](/integrations) are planned and executed through DataFusion. Spice registers custom table providers for each connector, adds optimizer rules for pushdown, and extends DataFusion with UDFs for [hybrid search](/learn/hybrid-search) and LLM inference.
- **DuckDB** is available as a [data acceleration](/learn/data-acceleration) engine. When datasets are accelerated locally in Spice, users can choose DuckDB as the backing store for the local cache. DuckDB's columnar storage and analytical performance make it well-suited for scan-heavy accelerated queries.

For production [data lake acceleration](/use-case/datalake-accelerator) workloads, the recommended option is Spice Cayenne, which uses the [Vortex](/learn/vortex) columnar format and delivers faster queries at lower memory usage than DuckDB for large accelerated datasets.

<ContentRichText
  fields={{
    coverage: 'rc-end',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<AccordionFaq
  fields={{
    heading: 'Apache DataFusion vs DuckDB FAQ',
    paragraph: '',
    items: [
      {
        title:
          'What is the main difference between Apache DataFusion and DuckDB?',
        paragraph:
          '<p>DataFusion is a query engine framework: a Rust library that provides SQL parsing, planning, optimization, and execution that developers embed into larger systems. DuckDB is a complete embedded analytical database with its own storage engine, transaction support, and persistence. DataFusion is for building data systems. DuckDB is for querying data.</p>',
      },
      {
        title: 'Which is faster: DataFusion or DuckDB?',
        paragraph:
          '<p>Performance depends on the workload. Both deliver fast analytical query execution through vectorized, columnar processing. DuckDB has an edge on raw Parquet file scanning due to its highly optimized C++ implementation. DataFusion has an advantage when queries are distributed across custom data sources (via table providers) or when data is already in Arrow format and zero-copy integration matters. For most analytical workloads, the difference is within a small factor.</p>',
      },
      {
        title: 'Can I use both DataFusion and DuckDB in the same system?',
        paragraph:
          '<p>Yes. Spice does exactly this: Apache DataFusion is the federation and query planning layer, while DuckDB is available as a local acceleration engine for cached datasets. Queries are planned through DataFusion and can be routed to the local DuckDB-backed cache for accelerated datasets, or pushed to remote sources for federated datasets.</p>',
      },
      {
        title: 'Are DataFusion and DuckDB both production ready?',
        paragraph:
          '<p>Yes, both are production ready; they differ in role, not maturity. Apache DataFusion runs in production inside Spice AI, InfluxDB 3.0, and Apache Comet (Spark accelerator). DuckDB is a complete embedded analytical database that is widely deployed for interactive analysis and data pipelines. Choose between them by architecture: embed and extend DataFusion, or use DuckDB as-is.</p>',
      },
      {
        title: 'Does DuckDB support SQL federation across multiple databases?',
        paragraph:
          '<p>DuckDB has limited federation capabilities through its extension system (e.g., the postgres_scanner extension can query PostgreSQL). However, DuckDB is not designed as a multi-source federation engine; it lacks the custom optimizer rules and connector architecture needed for production multi-source federation with predicate pushdown across heterogeneous systems. Apache DataFusion with custom table providers is the appropriate foundation for production SQL federation.</p>',
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<ContentResourceFeatured
  fields={{
    heading: 'Learn more about DataFusion, DuckDB, and Spice',
    paragraph:
      'Technical guides on how Spice extends Apache DataFusion and uses DuckDB as a data accelerator engine.',
    mode: 'default',
    resources: [
      {
        source: 'manual',
        resource: null,
        resource_manual: {
          eyebrow: 'Docs',
          title: {
            title: 'Spice.ai OSS Documentation',
            url: 'https://spiceai.org/docs',
            target: '_blank',
          },
          description:
            'Learn how Spice uses Apache DataFusion as its core query engine and DuckDB as a data accelerator engine.',
          image: {
            ID: 1661,
            id: 1661,
            title: 'Docs jpeg',
            filename: 'Docs-jpeg.jpeg',
            filesize: 103192,
            url: '/website-assets/media/2025/12/Docs-jpeg.jpeg',
            link: '/docs-jpeg/',
            alt: '',
            author: '9',
            description: '',
            caption: '',
            name: 'docs-jpeg',
            status: 'inherit',
            uploaded_to: 0,
            date: '2025-12-05 04:13:53',
            modified: '2025-12-05 04:13:53',
            menu_order: 0,
            mime_type: 'image/jpeg',
            type: 'image',
            subtype: 'jpeg',
            icon: '/website-assets/media/default.png',
            width: 1832,
            height: 1036,
            sizes: {
              thumbnail: '/website-assets/media/2025/12/Docs-jpeg-150x150.jpeg',
              'thumbnail-width': 150,
              'thumbnail-height': 150,
              medium: '/website-assets/media/2025/12/Docs-jpeg-300x170.jpeg',
              'medium-width': 300,
              'medium-height': 170,
              medium_large:
                '/website-assets/media/2025/12/Docs-jpeg-768x434.jpeg',
              'medium_large-width': 768,
              'medium_large-height': 434,
              large: '/website-assets/media/2025/12/Docs-jpeg-1024x579.jpeg',
              'large-width': 1024,
              'large-height': 579,
              '1536x1536':
                '/website-assets/media/2025/12/Docs-jpeg-1536x869.jpeg',
              '1536x1536-width': 1536,
              '1536x1536-height': 869,
              '2048x2048': '/website-assets/media/2025/12/Docs-jpeg.jpeg',
              '2048x2048-width': 1832,
              '2048x2048-height': 1036,
            },
          },
        },
      },
      {
        source: 'picker',
        resource: [
          {
            title: 'How we use Apache DataFusion at Spice AI',
            slug: '/blog/how-we-use-apache-datafusion-at-spice-ai',
            excerpt:
              'A technical overview of how Spice extends Apache DataFusion with custom table providers, optimizer rules, and UDFs.',
            image:
              '/website-assets/media/2026/01/Engineering-at-Spice-AI-Apache-DataFusion.png',
            type: 'Blog',
            taxonomy: ['SQL Federation', 'Engineering'],
          },
        ],
        resource_manual: {
          eyebrow: '',
          title: null,
          description: '',
          image: false,
        },
      },
      {
        source: 'picker',
        resource: [
          {
            title:
              'Getting Started with Spice.ai SQL Query Federation & Acceleration',
            slug: '/blog/spice-sql-query-federation-acceleration',
            excerpt:
              'Learn how to use Spice.ai to federate and accelerate queries across operational and analytical systems.',
            image:
              '/website-assets/media/2025/11/68ee96eb08a0dfcb609c1969_Version-7-1.png',
            type: 'Blog',
            taxonomy: ['Spice AI'],
          },
        ],
        resource_manual: {
          eyebrow: '',
          title: null,
          description: '',
          image: false,
        },
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<ContentCta
  fields={{
    override_global_setting: false,
    custom_content: { heading: '', paragraph: '', cta: null },
    padding_top: 'unset',
    padding_bottom: 'unset',
    gcta_heading: 'See Spice in action',
    gcta_paragraph:
      'Get a guided walkthrough of how development teams use Spice to query, accelerate, and integrate AI for mission-critical workloads.',
    gcta_cta: {
      title: 'Get a demo',
      url: 'https://meetings.hubspot.com/vladi-semenov',
      target: '_blank',
    },
  }}
/>

---

## What is Apache DataFusion?
URL: https://spice.ai/learn/apache-datafusion
Date: 2026-01-22T00:00:00
Description: Apache DataFusion is an open-source, extensible SQL query engine written in Rust. Learn how DataFusion works, its architecture, how it compares to Trino and DuckDB, and how teams extend it for production use cases.

<HeroCenteredText
  fields={{
    graphic_position: 'no-graphic',
    heading_tag: 'h1',
    heading: 'What is Apache DataFusion?',
    paragraph:
      'Apache DataFusion is an open-source, extensible SQL query engine written in Rust. Part of the Apache Arrow ecosystem, DataFusion is designed to be embedded as a library rather than deployed as a standalone server, making it the foundation for a growing number of data systems.',
    cta: [
      {
        type: 'filled',
        cta: {
          title: 'See Spice SQL federation',
          url: '/platform/sql-federation-acceleration',
          target: '',
        },
      },
      {
        type: 'bordered',
        cta: {
          title: 'Read the docs',
          url: 'https://spiceai.org/docs',
          target: '',
        },
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<ContentRichText
  fields={{
    coverage: 'rc-start',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

Building a SQL query engine from scratch is a multi-year effort. Parsing SQL, generating logical plans, optimizing query execution, managing memory, and parallelizing work across cores are all hard problems individually. Combining them into a reliable, performant system is harder still.

Apache DataFusion provides a production-quality implementation of all of these components as an embeddable Rust library. Instead of building a query engine from zero, developers embed DataFusion and extend it with custom table providers, user-defined functions, and optimizer rules specific to their use case. The result is a fully featured SQL engine tailored to a particular domain, built in weeks instead of years. DataFusion is governed by the Apache Software Foundation, which matters when [choosing an open-source data and AI platform](/learn/open-source-ai-data-platforms).

## Core Architecture

DataFusion processes a SQL query through a well-defined pipeline: parsing, planning, optimization, and execution. Each stage is modular and extensible.

### SQL Parsing and Logical Planning

When a SQL query arrives, DataFusion parses it into an abstract syntax tree (AST) and then converts the AST into a logical plan. The logical plan is a tree of relational algebra operations (scans, filters, projections, joins, aggregations, sorts) that describe what the query computes without specifying how to compute it.

For example, the query:

```sql
SELECT customer_name, SUM(amount)
FROM orders
WHERE created_at > '2026-01-01'
GROUP BY customer_name
ORDER BY SUM(amount) DESC
LIMIT 10
```

Produces a logical plan roughly equivalent to:

```
Limit (10)
  Sort (SUM(amount) DESC)
    Aggregate (GROUP BY customer_name, SUM(amount))
      Filter (created_at > '2026-01-01')
        Scan (orders)
```

### Query Optimization

DataFusion applies a series of optimization passes to the logical plan. These include:

- **Predicate pushdown:** Moving filter expressions closer to the data source so less data is read
- **Projection pushdown:** Eliminating columns that are not needed by downstream operators
- **Constant folding:** Evaluating constant expressions at planning time rather than execution time
- **Join reordering:** Selecting the most efficient join order based on available statistics
- **Common subexpression elimination:** Computing repeated expressions once and reusing the result

The optimizer is rule-based and extensible. Developers can register custom optimization rules that apply domain-specific transformations. For example, a [federation engine](/learn/sql-federation) can add rules that push certain operations down to remote data sources.

### Physical Planning and Execution

After optimization, the logical plan is converted to a physical plan that specifies the actual execution strategy: which join algorithm to use (hash join, sort-merge join, nested loop), how to partition work across threads, and how to manage memory.

Execution produces a stream of Apache Arrow record batches. Arrow is a columnar in-memory format that enables zero-copy data exchange between operators and between systems. Because DataFusion is built natively on Arrow, there is no serialization or deserialization overhead between planning and execution: the data stays in Arrow format throughout.

## Key Features

### Full SQL Support

DataFusion supports a comprehensive subset of SQL, including:

- Standard `SELECT`, `INSERT`, `UPDATE`, `DELETE` statements
- `JOIN` (inner, left, right, full outer, cross, semi, anti)
- Window functions (`ROW_NUMBER`, `RANK`, `LAG`, `LEAD`, etc.)
- Common table expressions (CTEs) with `WITH` clauses
- Subqueries and correlated subqueries
- `UNION`, `INTERSECT`, `EXCEPT` set operations
- `GROUP BY`, `HAVING`, `ORDER BY`, `LIMIT`, `OFFSET`

### Extensibility

DataFusion's primary design goal is extensibility. The key extension points are:

**Custom table providers** allow DataFusion to query any data source. A table provider implements the `TableProvider` trait, telling DataFusion how to scan data from a specific source. Out of the box, DataFusion includes providers for Parquet, CSV, JSON, and Arrow IPC files. Custom providers can connect to databases, APIs, object stores, or any other data source.

**User-defined functions (UDFs)** extend DataFusion's expression language. Scalar UDFs operate on individual rows, aggregate UDFs operate on groups of rows, and window UDFs operate over window frames. UDFs are registered with the session context and can be used in SQL queries like built-in functions.

**Custom optimizer rules** allow developers to add domain-specific optimizations. For example, a federated query engine can add rules that detect when a filter or aggregation can be pushed down to a remote source and rewrite the plan accordingly.

**Custom physical plan operators** allow developers to implement new execution strategies. For example, a distributed query engine can replace DataFusion's local join operator with a distributed shuffle-join that partitions data across multiple nodes.

### Native Arrow Integration

DataFusion operates on Apache Arrow arrays throughout the entire pipeline. This means:

- No serialization overhead between operators
- Zero-copy data exchange with other Arrow-based systems
- Compatibility with the broader Arrow ecosystem (PyArrow, Arrow Flight, etc.)
- Efficient SIMD operations on columnar data

## DataFusion vs. Other Query Engines

### DataFusion vs. DuckDB

DuckDB is an embedded analytical database: a "SQLite for analytics." Like DataFusion, it is designed for in-process analytical queries. The key difference is in extensibility and architecture.

DuckDB is a complete, self-contained database with its own storage engine, transaction manager, and query executor. It is written in C++ and provides a SQL interface with minimal configuration.

DataFusion is a query engine library, not a database. It does not include a storage engine or transaction manager. Instead, it provides the query planning and execution components that developers embed into their own systems. DataFusion is written in Rust and designed to be extended with custom table providers, UDFs, and optimizer rules.

Choose DuckDB when you need a self-contained analytical database. Choose DataFusion when you are building a custom data system and need an embeddable, extensible query engine as a foundation. For a detailed side-by-side comparison, see [Apache DataFusion vs. DuckDB](/learn/apache-datafusion-vs-duckdb).

### DataFusion vs. Trino (Presto)

Trino (formerly Presto) is a distributed SQL query engine designed for federated queries across data warehouses and data lakes. It is deployed as a standalone cluster of coordinator and worker nodes.

DataFusion is a single-node, embeddable library. It does not include built-in distributed execution (though [Apache Ballista](/learn/apache-ballista) adds distributed capabilities on top of DataFusion). Trino is a production-ready distributed system with its own cluster management, fault tolerance, and resource scheduling.

Choose Trino when you need a standalone, distributed federated query engine with its own cluster infrastructure. Choose DataFusion when you need an embeddable query engine that you control and extend within your own application.

### DataFusion vs. Apache Spark SQL

Spark SQL is the SQL interface to Apache Spark, a distributed data processing framework. Spark is designed for large-scale batch processing and runs on JVM-based cluster infrastructure (YARN, Mesos, Kubernetes).

DataFusion is a lightweight, Rust-native library with no JVM dependency. It is designed for low-latency, in-process query execution rather than large-scale distributed batch processing. DataFusion's startup time is measured in milliseconds; Spark's is measured in seconds to minutes.

Choose Spark when you need large-scale distributed batch processing with a mature ecosystem. Choose DataFusion when you need a lightweight, low-latency query engine embedded in a Rust or Python application.

## How Spice Extends DataFusion

[Spice](/platform/sql-federation-acceleration) uses DataFusion as its core query engine, scales it across nodes with [distributed query execution](/feature/distributed-query) built on Apache Ballista, and extends it with several capabilities:

### Custom Table Providers for Federated Data

Spice registers custom DataFusion table providers for each connected data source: PostgreSQL, MySQL, Databricks, Amazon S3, Snowflake, and [40+ others](/integrations). When a query references a table backed by a remote source, the corresponding table provider handles connectivity, dialect translation, and data retrieval.

### Custom Optimizer Rules for Pushdown

Spice adds optimizer rules that analyze the query plan and determine which operations can be pushed down to each source. For example, a filter on a PostgreSQL-backed table is rewritten into a `WHERE` clause in the generated PostgreSQL query, so only matching rows are transferred. This minimizes data movement and maximizes source-side performance.

### UDFs for Search and AI Inference

Spice extends DataFusion's function library with UDFs that enable [hybrid search](/learn/hybrid-search) (full-text and vector search within SQL), AI model inference, and embedding generation. These functions are available in standard SQL queries:

```sql
SELECT id, content, search_score
FROM documents
WHERE search(content, 'deployment strategies', 'hybrid')
ORDER BY search_score DESC
LIMIT 10
```

### Integration with the Acceleration Layer

When query acceleration is enabled, Spice stores cached data in [Vortex](/learn/vortex) format and exposes it through custom DataFusion table providers. The query optimizer can push filters and projections directly into the Vortex storage layer, enabling sub-second query performance over locally cached data, the pattern that powers [data lake acceleration](/use-case/datalake-accelerator) in Spice.

## The DataFusion Ecosystem

DataFusion's embeddable design has led to a growing ecosystem of projects built on top of it:

- **Spice:** [SQL federation](/learn/sql-federation), acceleration, and AI inference engine
- **Apache Ballista:** [Distributed query execution](/learn/apache-ballista) layer for DataFusion
- **InfluxDB 3.0:** Time-series database rebuilt on DataFusion and Arrow
- **Apache Comet:** Spark-compatible query accelerator using DataFusion
- **Delta-rs:** Delta Lake implementation in Rust with DataFusion integration
- **GlareDB:** SQL interface for querying across databases and data lakes

This ecosystem demonstrates DataFusion's value proposition: rather than each project building its own SQL parser, optimizer, and execution engine, they share a common, well-tested foundation and focus on their differentiating features.

## Advanced Topics

### The Query Pipeline in Detail

A SQL query passes through a series of well-defined stages before producing results. Understanding this pipeline is essential for developers who need to extend or debug DataFusion behavior.

```mermaid
flowchart LR
    SQL["SQL String"] --> Parse["Parse"]
    Parse --> LP["Logical Plan"]
    LP --> Optimize["Optimize"]
    Optimize --> OLP["Optimized\nLogical Plan"]
    OLP --> Physical["Physical\nPlanning"]
    Physical --> PP["Physical Plan"]
    PP --> Execute["Execute"]
    Execute --> Arrow["Arrow\nRecord Batches"]
```

The parser converts a SQL string into a logical plan tree. The optimizer applies a sequence of rule-based passes (predicate pushdown, projection pruning, join reordering, and others) to produce an optimized logical plan. The physical planner then selects concrete execution strategies (e.g., hash join vs. sort-merge join) and generates a physical plan. Finally, the execution engine evaluates the physical plan and streams results as Apache Arrow record batches.

Each stage is independently extensible. Developers can register custom analyzer rules (which run before optimization), custom optimizer rules (which transform the logical plan), and custom physical plan nodes (which implement new execution strategies).

### The Catalog System

DataFusion organizes data through a three-level naming hierarchy: catalog, schema, and table. A `SessionContext` holds a default catalog that contains one or more schemas, each of which contains tables. When a query references `orders`, DataFusion resolves it through this hierarchy: by default, `datafusion.public.orders`.

The catalog system is trait-based and fully replaceable. Developers implement the `CatalogProvider`, `SchemaProvider`, and `TableProvider` traits to integrate their own metadata stores. For example, a [SQL federation](/learn/sql-federation) engine can register a catalog provider that discovers schemas and tables dynamically from a remote database's information schema, making remote tables queryable as if they were local.

The `TableProvider` trait is the most commonly extended interface. It defines how DataFusion scans data from a source, what statistics are available for the optimizer, what filters can be pushed down to the source, and what the schema of the data is.

### Custom Execution Plans

When the built-in physical plan operators are not sufficient, developers create custom `ExecutionPlan` implementations. A custom execution plan node participates in the standard pipeline: it receives input partitions, applies its logic, and produces output partitions as Arrow record batch streams.

Common use cases for custom execution plans include remote execution (sending part of a query to an external system and reading results back as Arrow), custom caching (materializing intermediate results for reuse across queries), and specialized operators (e.g., a graph traversal operator or a time-series interpolation operator that has no SQL equivalent).

Custom execution plans integrate with DataFusion's partition-aware execution model. They declare how many output partitions they produce, whether they require a specific input partitioning, and how they distribute work across threads.

### Memory Management and Spilling

DataFusion uses a `MemoryPool` abstraction to track and limit memory consumption during query execution. Operators that accumulate state (hash joins, hash aggregations, sorts) register their memory usage with the pool. When an operator's allocation request would exceed the configured memory limit, DataFusion triggers spilling: the operator writes its in-memory state to temporary files on disk and continues processing with reduced memory.

The spilling mechanism is critical for handling queries that process more data than available memory. Hash joins spill their build-side partitions, sorts spill sorted runs, and aggregations spill partial aggregate state. When the spilled data is needed, it is read back from disk and merged. This enables DataFusion to process arbitrarily large datasets within a fixed memory budget, albeit with the performance trade-off of disk I/O.

Developers can implement custom `MemoryPool` strategies to match their deployment constraints: for example, a pool that reserves memory for concurrent queries or one that integrates with an external resource manager.

<ContentRichText
  fields={{
    coverage: 'rc-end',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<AccordionFaq
  fields={{
    heading: 'Apache DataFusion FAQ',
    paragraph: '',
    items: [
      {
        title: 'What is the difference between DataFusion and DuckDB?',
        paragraph:
          '<p>DuckDB is a self-contained embedded analytical database with its own storage engine and transaction manager. DataFusion is a query engine library without built-in storage: it provides SQL parsing, planning, optimization, and execution that developers embed into their own systems. DuckDB is designed for end users who want a ready-to-use analytical database. DataFusion is designed for developers building custom data systems who need an extensible query engine as a foundation.</p>',
      },
      {
        title: 'Is Apache DataFusion production ready?',
        paragraph:
          '<p>Yes. DataFusion is used in production by multiple companies and projects, including Spice, InfluxDB 3.0, and Apache Comet. It is an Apache Software Foundation project with an active contributor community, regular releases, and comprehensive test coverage. Its Rust implementation provides memory safety and predictable performance characteristics suited for production workloads.</p>',
      },
      {
        title: 'How does DataFusion compare to Trino?',
        paragraph:
          '<p>Trino is a standalone, distributed SQL query engine deployed as a cluster of coordinator and worker nodes. DataFusion is a single-node, embeddable library. Trino includes built-in cluster management, fault tolerance, and resource scheduling. DataFusion provides query planning and execution components that developers embed and extend within their own applications. Trino is designed for standalone deployment; DataFusion is designed for embedding.</p>',
      },
      {
        title: 'How do you extend DataFusion with custom functionality?',
        paragraph:
          '<p>DataFusion provides several extension points: custom table providers (to query any data source), user-defined functions (scalar, aggregate, and window), custom optimizer rules (to add domain-specific plan transformations), and custom physical plan operators (to implement new execution strategies). Extensions are implemented as Rust traits and registered with the DataFusion session context.</p>',
      },
      {
        title: 'What is the relationship between DataFusion and Apache Arrow?',
        paragraph:
          '<p>DataFusion is part of the Apache Arrow ecosystem and operates on Arrow arrays throughout its entire query pipeline. Arrow provides the columnar in-memory data format; DataFusion provides the SQL query engine that operates on that format. This native integration means zero serialization overhead between operators and zero-copy data exchange with other Arrow-based systems like PyArrow, Arrow Flight, and Ballista.</p>',
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<ContentResourceFeatured
  fields={{
    heading: 'Learn more about DataFusion and Spice',
    paragraph:
      'Technical deep dives on how Spice extends Apache DataFusion for federated SQL, search, and AI inference.',
    mode: 'default',
    resources: [
      {
        source: 'manual',
        resource: null,
        resource_manual: {
          eyebrow: 'Docs',
          title: {
            title: 'Spice.ai OSS Documentation',
            url: 'https://spiceai.org/docs',
            target: '_blank',
          },
          description:
            'Learn how Spice uses Apache DataFusion as its core query engine with custom table providers, optimizer rules, and UDFs.',
          image: {
            ID: 1661,
            id: 1661,
            title: 'Docs jpeg',
            filename: 'Docs-jpeg.jpeg',
            filesize: 103192,
            url: '/website-assets/media/2025/12/Docs-jpeg.jpeg',
            link: '/docs-jpeg/',
            alt: '',
            author: '9',
            description: '',
            caption: '',
            name: 'docs-jpeg',
            status: 'inherit',
            uploaded_to: 0,
            date: '2025-12-05 04:13:53',
            modified: '2025-12-05 04:13:53',
            menu_order: 0,
            mime_type: 'image/jpeg',
            type: 'image',
            subtype: 'jpeg',
            icon: '/website-assets/media/default.png',
            width: 1832,
            height: 1036,
            sizes: {
              thumbnail: '/website-assets/media/2025/12/Docs-jpeg-150x150.jpeg',
              'thumbnail-width': 150,
              'thumbnail-height': 150,
              medium: '/website-assets/media/2025/12/Docs-jpeg-300x170.jpeg',
              'medium-width': 300,
              'medium-height': 170,
              medium_large:
                '/website-assets/media/2025/12/Docs-jpeg-768x434.jpeg',
              'medium_large-width': 768,
              'medium_large-height': 434,
              large: '/website-assets/media/2025/12/Docs-jpeg-1024x579.jpeg',
              'large-width': 1024,
              'large-height': 579,
              '1536x1536':
                '/website-assets/media/2025/12/Docs-jpeg-1536x869.jpeg',
              '1536x1536-width': 1536,
              '1536x1536-height': 869,
              '2048x2048': '/website-assets/media/2025/12/Docs-jpeg.jpeg',
              '2048x2048-width': 1832,
              '2048x2048-height': 1036,
            },
          },
        },
      },
      {
        source: 'picker',
        resource: [
          {
            title: 'How we use Apache DataFusion at Spice AI',
            slug: '/blog/how-we-use-apache-datafusion-at-spice-ai',
            excerpt:
              'A technical overview of how Spice extends Apache DataFusion with custom table providers, optimizer rules, and UDFs.',
            image:
              '/website-assets/media/2026/01/Engineering-at-Spice-AI-Apache-DataFusion.png',
            type: 'Blog',
            taxonomy: ['SQL Federation', 'Engineering'],
          },
        ],
        resource_manual: {
          eyebrow: '',
          title: null,
          description: '',
          image: false,
        },
      },
      {
        source: 'picker',
        resource: [
          {
            title: 'Contribution of TableProviders to DataFusion',
            slug: '/blog/contribution-of-tableproviders-to-datafusion',
            excerpt:
              'How Spice contributes table providers to Apache DataFusion.',
            image: '/website-assets/media/2025/11/ExternalLinkImage.png',
            type: 'Blog',
            taxonomy: ['Engineering'],
          },
        ],
        resource_manual: {
          eyebrow: '',
          title: null,
          description: '',
          image: false,
        },
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<TalkToAnEngineerCta />

---

## Apache Iceberg vs Delta Lake: How to Choose
URL: https://spice.ai/learn/apache-iceberg-vs-delta-lake
Date: 2026-04-03T00:00:00
Description: Apache Iceberg and Delta Lake are both open table formats that bring transactions, schema evolution, and time travel to data lakes. Learn the key architectural differences and when to use each.

<HeroCenteredText
  fields={{
    graphic_position: 'no-graphic',
    heading_tag: 'h1',
    heading: 'Apache Iceberg vs Delta Lake',
    paragraph:
      'Apache Iceberg and Delta Lake are open table formats that bring ACID transactions, schema evolution, and time travel to data lakes. Both are production-ready and actively developed. The right choice depends on your primary compute engine, ecosystem preferences, and partition evolution requirements.',
    cta: [
      {
        type: 'filled',
        cta: {
          title: 'See Spice SQL federation',
          url: '/platform/sql-federation-acceleration',
          target: '',
        },
      },
      {
        type: 'bordered',
        cta: {
          title: 'Read the docs',
          url: 'https://spiceai.org/docs',
          target: '_blank',
        },
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<ContentRichText
  fields={{
    coverage: 'rc-start',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

Data lakes on object storage (S3, GCS, Azure Blob) have a fundamental limitation: raw files on disk have no inherent concept of a "table." There is no built-in support for atomic writes, schema consistency, concurrent readers and writers, or querying data as it existed at a point in the past.

Both [Apache Iceberg](/learn/apache-iceberg) and [Delta Lake](/learn/delta-lake) solve this by adding a metadata layer on top of Parquet files stored in object storage. They track which files belong to the current version of a table, manage schema changes, record an auditable history of every modification, and provide the isolation guarantees that analytics and data pipelines depend on.

Both formats are production-ready and widely adopted. Choosing between them requires understanding their architectural differences (particularly around metadata design, partition evolution, and engine compatibility) rather than asking which one is "better."

## How Each Format Works

### Apache Iceberg Metadata Architecture

[Apache Iceberg](/learn/apache-iceberg) uses a three-level metadata hierarchy:

1. **Metadata files**: one per snapshot, recording the table schema, partition spec, and a reference to the snapshot's manifest list
2. **Manifest lists**: one per snapshot, listing all manifest files with partition-level statistics
3. **Manifest files**: listing individual data files with column-level min/max statistics and null counts

This hierarchy is self-contained in the storage system. The Iceberg catalog (Hive Metastore, AWS Glue, REST catalog, or others) stores only a pointer to the current metadata file. Reading the table means following the pointer chain: catalog → metadata file → manifest list → manifest files → data files.

The design separates the catalog from the metadata. Changing the catalog implementation (e.g., from Hive Metastore to a REST catalog) does not require migrating table metadata.

### Delta Lake Metadata Architecture

[Delta Lake](/learn/delta-lake) uses a transaction log (the `_delta_log` directory) consisting of ordered JSON commit files:

```
_delta_log/
  000000000000000000000.json  # Version 0
  000000000000000000001.json  # Version 1
  000000000000000000010.json  # Version 10
  000000000000000000010.checkpoint.parquet  # Checkpoint at version 10
```

Each JSON commit file records the actions for that version: which files were added, which were removed, and any metadata changes. To read the current state, a reader replays the log from the last checkpoint forward. Periodic Parquet checkpoints (every 10 commits by default) prevent full log replay from the beginning.

Delta Lake's catalog integration is through the metastore (typically the Hive Metastore or Unity Catalog) which registers the table's storage location. The transaction log is stored alongside the data files.

## Feature Comparison

| Feature | Apache Iceberg | Delta Lake |
|---|---|---|
| **Metadata model** | Three-level hierarchy (metadata files, manifest lists, manifest files) | Sequential JSON transaction log with Parquet checkpoints |
| **Catalog independence** | High: catalog stores only a pointer; metadata is self-contained in storage | Lower: transaction log is independent, but Unity Catalog integration is first-class |
| **Partition evolution** | Native support: change partition spec without rewriting data | Supported via partition transforms (added later through Delta Kernel) |
| **Hidden partitioning** | Yes: users write unpartitioned queries; engine handles pruning | Partial: partition pruning requires explicit filter expressions matching partition columns |
| **Schema evolution** | Add, drop, rename, reorder, widen types (metadata-only) | Add, rename, widen types (metadata-only) |
| **ACID transactions** | Optimistic concurrency via catalog atomic swap | Optimistic concurrency via sequential commit ordering |
| **Time travel** | By timestamp or snapshot ID | By timestamp or version number |
| **Row-level deletes** | Position deletes and equality deletes (v2 spec) | Deletion vectors (recent addition); previously file rewrites |
| **Engine support** | Spark, Trino, Flink, Dremio, Snowflake, Athena, BigQuery (via manifest), Spice | Spark (deepest), Trino, Flink, Athena, BigQuery; growing via Delta Kernel |
| **Primary ecosystem** | Engine-agnostic | Databricks / Spark |
| **Compaction** | `REWRITE DATA FILES` + `EXPIRE SNAPSHOTS` | `OPTIMIZE` + `VACUUM` |
| **Streaming support** | Iceberg streaming API (Flink, Spark Structured Streaming) | Change Data Feed, Structured Streaming |

## Key Differences

### Partition Evolution

This is one of the most meaningful practical differences between the two formats.

**Iceberg** supports partition evolution natively. A table can start with monthly partitioning, be re-partitioned to daily without rewriting existing data, and queries spanning both old and new partitions work correctly. Iceberg tracks which partition spec applies to each data file in the manifest. Changing the partition scheme is a metadata operation.

**Delta Lake** added partition transforms (liquid clustering) as a later feature. Traditional Hive-style partitioning in Delta Lake requires specifying partition columns at table creation and changing them requires data rewriting. Liquid clustering (Delta Lake's replacement for static partitioning) addresses this by organizing data with space-filling curves that can be re-keyed without data rewrites, but it is a different mechanism than Iceberg's partition evolution.

### Hidden Partitioning

**Iceberg** decouples the logical query from the physical partition layout. A filter like `WHERE event_date > '2026-03-01'` automatically benefits from partition pruning even if the table is partitioned by `month(event_date)`. Users do not need to know or reference the partition column names. This prevents a common class of performance bugs where users write queries without matching partition expressions and accidentally trigger full table scans.

**Delta Lake** (with Hive-style partitioning) requires that filter expressions match the physical partition column. A filter on `event_date` benefits from pruning only if the table is partitioned on `event_date` directly (or if liquid clustering is used). Liquid clustering provides some automatic pruning through its zone map statistics, but the user experience is closer to DuckDB's min/max zone maps than Iceberg's hidden partitioning.

### Engine Compatibility

**Iceberg** was designed from the start to be engine-agnostic. It defines an open specification that any engine can implement. Native read and write support exists in Spark, Trino, Flink, Dremio, Snowflake External Tables, Google BigQuery (via manifest export), Amazon Athena, and federated query engines like [Spice](/platform/sql-federation-acceleration).

**Delta Lake** originated in the Databricks ecosystem and has its deepest integration with Apache Spark. The Delta Kernel project provides a standalone library for reading Delta tables outside Spark, which has expanded engine support (Trino, Flink, Athena, BigQuery). For teams already using Databricks, Delta Lake's Unity Catalog and Databricks platform integrations offer first-class governance, lineage, and access control features that Iceberg does not match in the Databricks context.

### Metadata Scalability

At tables with millions of data files (common in large-scale production data lakes), metadata performance becomes a critical concern.

**Iceberg** avoids directory listing entirely. The manifest list for a snapshot immediately enumerates all manifest files, and each manifest file enumerates its data files. Planning time is proportional to the number of manifest files read, and manifest-level partition statistics allow the planner to skip entire manifests without reading them. This scales well to tables with tens of millions of files.

**Delta Lake** must replay the transaction log from the last checkpoint. At high write frequencies, the number of JSON files accumulating between checkpoints can grow large, and the checkpoint frequency may need tuning. The recent move toward Parquet and Avro checkpoints with more granular metadata improves scalability, but log replay is still the core access pattern.

## Decision Framework

### Choose Apache Iceberg when:

- **Multi-engine access is required.** If you query the same tables from Spark, Trino, Flink, and a federated SQL engine, Iceberg's broad native support is a significant advantage.
- **Partition evolution is important.** If partition schemes will change over time without full data rewrites, Iceberg's native partition evolution is the right design choice.
- **You value catalog independence.** Iceberg's self-contained metadata design makes it straightforward to switch catalog implementations without migrating table data.
- **Tables have many files (10M+).** Iceberg's manifest-based planning avoids the log replay scalability limitations that can affect Delta Lake at extreme scale.
- **You are not primarily on Databricks.** If your stack includes Trino, Dremio, Starburst, or open-source Spark on non-Databricks infrastructure, Iceberg's engine-agnostic design fits more naturally.

### Choose Delta Lake when:

- **Databricks is your primary platform.** Delta Lake has the deepest Databricks integration, including Unity Catalog governance, Delta Live Tables pipelines, and Databricks-managed compaction and optimization.
- **Your team is primarily on Apache Spark.** Delta Lake's Spark integration is the most mature and best-maintained. Spark's `DeltaTable` API provides a rich set of operational commands beyond what Iceberg's Spark integration offers.
- **You need the Change Data Feed.** Delta Lake's CDF exposes row-level changes between versions as a structured stream, which is useful for incremental processing pipelines. Iceberg has similar capabilities through its streaming API, but Delta Lake's CDF has broader tooling support.
- **Liquid clustering meets your partitioning needs.** For tables where dynamic clustering is more important than partition evolution, liquid clustering simplifies operations.

## Iceberg and Delta Lake in Spice

[Spice](/platform/sql-federation-acceleration) connects to both Apache Iceberg and Delta Lake tables as federated data sources through its [SQL federation](/learn/sql-federation) layer.

For Iceberg tables in Amazon S3, GCS, or Azure Blob Storage, Spice reads the Iceberg metadata to identify relevant data files, applies partition pruning based on the partition spec, and uses file-level statistics from manifest files for predicate pushdown. This allows [SQL federation](/learn/sql-federation) over Iceberg tables with efficient scans.

For Delta Lake tables, Spice connects through the delta-rs Rust library, which implements the Delta Lake protocol without requiring Spark or the JVM. It reads the transaction log to identify the current set of active files, applies predicate pushdown through [Apache DataFusion](/learn/apache-datafusion)'s optimizer, and supports optional local acceleration.

Both formats can be joined in a single federated query:

```sql
SELECT i.customer_id, d.event_type, COUNT(*) AS count
FROM iceberg.orders i
JOIN delta.events d ON i.customer_id = d.customer_id
WHERE i.order_date > '2026-01-01'
GROUP BY i.customer_id, d.event_type
```

For workloads requiring sub-second query performance, Spice supports [accelerating](/learn/data-acceleration) both Iceberg and Delta Lake tables locally, with incremental refresh using each format's native change detection mechanism. Teams evaluating the two formats can use Spice as a [data lake accelerator](/use-case/datalake-accelerator) without standardizing on one format first.

## Advanced Topics

### Iceberg REST Catalog and Delta Lake Unity Catalog

The catalog layer determines how table metadata is discovered and how concurrent writes are coordinated.

**Iceberg REST catalog** is a standardized HTTP API that any catalog provider can implement. It decouples table discovery from the backend store, enabling catalog providers to add authorization, caching, multi-tenancy, and access control logic behind the standard API. The REST catalog uses optimistic concurrency: clients send the current metadata location alongside the new metadata, and the server rejects commits where another writer has intervened.

**Delta Lake Unity Catalog** (Databricks) provides a centralized metadata, governance, and access control layer for Delta tables. It integrates with Databricks' RBAC, column-level masking, row-level security, and lineage tracking. Outside Databricks, the open-source Unity Catalog project provides a standalone implementation, though with fewer integrations.

### Compaction and Maintenance

Both formats accumulate small files over time (from streaming ingestion or frequent small writes) and require periodic compaction.

**Iceberg compaction** rewrites small files into larger ones using the `REWRITE DATA FILES` procedure. It can be run in-engine (via Spark) or via the Iceberg API. Snapshot expiration removes old snapshots and their unreferenced data files.

**Delta Lake compaction** uses the `OPTIMIZE` command, which rewrites small files into larger target sizes (default 1 GB). `VACUUM` removes files that are no longer referenced by any table version within the retention window.

Both approaches are equivalent operationally; the syntax and scheduling differ by engine.

### Row-Level Operations Performance

Row-level deletes and updates are an area where both formats have evolved significantly.

**Iceberg v2** introduced position deletes and equality deletes, which avoid full file rewrites for small delete operations. Position deletes specify exact file path and row offset. Equality deletes specify column values that identify rows to delete. Over time, accumulated delete files degrade read performance, and compaction merges them with data files.

**Delta Lake deletion vectors** serve the same purpose: recording logically deleted rows as a compact bitmap without rewriting data files. Deletion vectors are applied during scan, and compaction eventually produces clean files without deleted rows.

<ContentRichText
  fields={{
    coverage: 'rc-end',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<AccordionFaq
  fields={{
    heading: 'Apache Iceberg vs Delta Lake FAQ',
    paragraph: '',
    items: [
      {
        title: 'What is the main difference between Apache Iceberg and Delta Lake?',
        paragraph:
          '<p>Both are open table formats providing ACID transactions, schema evolution, and time travel for data lakes. Iceberg uses a three-level metadata hierarchy (metadata files, manifest lists, manifest files) and was designed to be engine-agnostic from the start. Delta Lake uses a sequential JSON transaction log and originated in the Databricks/Spark ecosystem. The practical difference: Iceberg has broader multi-engine support; Delta Lake has deeper Databricks integration.</p>',
      },
      {
        title: 'Can I query both Iceberg and Delta Lake tables in one system?',
        paragraph:
          '<p>Yes. Federated SQL engines like Spice can query both formats (and join them in a single SQL statement) without requiring you to standardize on one format. Spice connects to Iceberg and Delta Lake tables in S3, GCS, or Azure Blob Storage through its SQL federation layer.</p>',
      },
      {
        title: 'Which format has better multi-engine support?',
        paragraph:
          '<p>Apache Iceberg has broader native multi-engine support. It is natively integrated with Spark, Trino, Flink, Dremio, Snowflake, Amazon Athena, and others. Delta Lake has the deepest Spark and Databricks integration, with growing support from other engines through the Delta Kernel project. Both formats are widely supported, but Iceberg is the safer choice for truly multi-engine environments.</p>',
      },
      {
        title: 'Does Delta Lake require Databricks?',
        paragraph:
          '<p>No. Delta Lake is an open specification, and the delta-rs project provides a standalone Rust implementation that works without Spark or the JVM. Engines like Trino, Flink, Athena, and federated query tools like Spice read and write Delta tables independently. However, Unity Catalog and Databricks-managed optimization features do require Databricks.</p>',
      },
      {
        title: 'Which format is better for streaming ingestion?',
        paragraph:
          '<p>Both support streaming ingestion. Delta Lake has an advantage in the Spark Structured Streaming ecosystem and with its Change Data Feed for incremental processing. Apache Iceberg has strong support through Flink and the Iceberg Streaming API. The better choice depends on your streaming compute engine: if you use Spark, Delta Lake is more natural; if you use Flink or a multi-engine environment, Iceberg is a stronger fit.</p>',
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<ContentResourceFeatured
  fields={{
    heading: 'Learn more about open table formats and Spice',
    paragraph:
      'Guides and documentation on querying Apache Iceberg and Delta Lake tables through federated SQL.',
    mode: 'default',
    resources: [
      {
        source: 'manual',
        resource: null,
        resource_manual: {
          eyebrow: 'Docs',
          title: {
            title: 'Spice.ai OSS Documentation',
            url: 'https://spiceai.org/docs',
            target: '_blank',
          },
          description:
            'Learn how Spice connects to Apache Iceberg and Delta Lake tables for federated SQL queries with predicate pushdown and local acceleration.',
          image: {
            ID: 1661,
            id: 1661,
            title: 'Docs jpeg',
            filename: 'Docs-jpeg.jpeg',
            filesize: 103192,
            url: '/website-assets/media/2025/12/Docs-jpeg.jpeg',
            link: '/docs-jpeg/',
            alt: '',
            author: '9',
            description: '',
            caption: '',
            name: 'docs-jpeg',
            status: 'inherit',
            uploaded_to: 0,
            date: '2025-12-05 04:13:53',
            modified: '2025-12-05 04:13:53',
            menu_order: 0,
            mime_type: 'image/jpeg',
            type: 'image',
            subtype: 'jpeg',
            icon: '/website-assets/media/default.png',
            width: 1832,
            height: 1036,
            sizes: {
              thumbnail: '/website-assets/media/2025/12/Docs-jpeg-150x150.jpeg',
              'thumbnail-width': 150,
              'thumbnail-height': 150,
              medium: '/website-assets/media/2025/12/Docs-jpeg-300x170.jpeg',
              'medium-width': 300,
              'medium-height': 170,
              medium_large:
                '/website-assets/media/2025/12/Docs-jpeg-768x434.jpeg',
              'medium_large-width': 768,
              'medium_large-height': 434,
              large: '/website-assets/media/2025/12/Docs-jpeg-1024x579.jpeg',
              'large-width': 1024,
              'large-height': 579,
              '1536x1536':
                '/website-assets/media/2025/12/Docs-jpeg-1536x869.jpeg',
              '1536x1536-width': 1536,
              '1536x1536-height': 869,
              '2048x2048': '/website-assets/media/2025/12/Docs-jpeg.jpeg',
              '2048x2048-width': 1832,
              '2048x2048-height': 1036,
            },
          },
        },
      },
      {
        source: 'picker',
        resource: [
          {
            title: 'Write to Apache Iceberg Tables with SQL',
            slug: '/blog/write-to-apache-iceberg-tables-with-sql',
            excerpt:
              'How Spice enables writing to Apache Iceberg tables through the SQL federation layer.',
            image:
              '/website-assets/media/2025/11/ExternalLinkImage.png',
            type: 'Blog',
            taxonomy: ['Engineering'],
          },
        ],
        resource_manual: {
          eyebrow: '',
          title: null,
          description: '',
          image: false,
        },
      },
      {
        source: 'picker',
        resource: [
          {
            title:
              'Getting Started with Spice.ai SQL Query Federation & Acceleration',
            slug: '/blog/spice-sql-query-federation-acceleration',
            excerpt:
              'Learn how to use Spice.ai to federate and accelerate queries across operational and analytical systems.',
            image:
              '/website-assets/media/2025/11/68ee96eb08a0dfcb609c1969_Version-7-1.png',
            type: 'Blog',
            taxonomy: ['Spice AI'],
          },
        ],
        resource_manual: {
          eyebrow: '',
          title: null,
          description: '',
          image: false,
        },
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<ContentCta
  fields={{
    override_global_setting: false,
    custom_content: { heading: '', paragraph: '', cta: null },
    padding_top: 'unset',
    padding_bottom: 'unset',
    gcta_heading: 'See Spice in action',
    gcta_paragraph:
      'Get a guided walkthrough of how development teams use Spice to query, accelerate, and integrate AI for mission-critical workloads.',
    gcta_cta: {
      title: 'Get a demo',
      url: 'https://meetings.hubspot.com/vladi-semenov',
      target: '_blank',
    },
  }}
/>

---

## What is Apache Iceberg?
URL: https://spice.ai/learn/apache-iceberg
Date: 2026-03-12T00:00:00
Description: Apache Iceberg is an open table format for large analytic datasets. Learn how Iceberg works, its architecture, key features like schema evolution and time travel, and how it compares to Delta Lake and Hive tables.

<HeroCenteredText
  fields={{
    graphic_position: 'no-graphic',
    heading_tag: 'h1',
    heading: 'What is Apache Iceberg?',
    paragraph:
      'Apache Iceberg is an open table format designed for large analytic datasets. Originally developed at Netflix to address the limitations of Hive tables, Iceberg provides reliable, performant table semantics on top of data lakes, enabling schema evolution, hidden partitioning, time travel, and ACID transactions at petabyte scale.',
    cta: [
      {
        type: 'filled',
        cta: {
          title: 'See Spice SQL federation',
          url: '/platform/sql-federation-acceleration',
          target: '',
        },
      },
      {
        type: 'bordered',
        cta: {
          title: 'Read the docs',
          url: 'https://spiceai.org/docs',
          target: '',
        },
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<ContentRichText
  fields={{
    coverage: 'rc-start',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

Data lakes store vast amounts of data in open file formats like Parquet and ORC on object storage systems such as Amazon S3, Google Cloud Storage, and Azure Blob Storage. But file formats alone do not define a table. Without a table format layer, there is no reliable way to track which files belong to a table, handle concurrent writes, evolve schemas, or query consistent snapshots of the data. Closing that gap is what turns a raw data lake into a [data lakehouse](/learn/data-lakehouse-vs-data-warehouse).

Apache Iceberg fills this gap. It sits between the query engine and the underlying data files, providing the metadata management, consistency guarantees, and optimization capabilities that turn a collection of files into a proper table. Iceberg is engine-agnostic; it works with Spark, Trino, Flink, Dremio, Snowflake, and other query engines, including federated SQL engines like [Spice](/platform/sql-federation-acceleration).

## How Table Formats Work

A table format defines the contract between a query engine and the data stored on disk. It answers fundamental questions: which files make up the current version of a table, what the schema is, how the data is partitioned, and how to read a consistent snapshot while writes are in progress.

Without a table format, a query engine scanning a directory of Parquet files has no way to distinguish between files that are part of a completed write and files that are partially written. It cannot track schema changes over time, and it cannot read a consistent snapshot of the data if another process is writing simultaneously.

Iceberg solves these problems through a layered metadata architecture that tracks every file, every schema version, and every change to the table as an immutable snapshot.

## Iceberg Architecture

Iceberg's architecture consists of three layers: the catalog, the metadata layer, and the data layer.

### The Catalog

The Iceberg catalog is the entry point for table discovery. It maps table names to the location of the table's current metadata pointer. When a query engine opens an Iceberg table, it first consults the catalog to find the path to the current metadata file.

Iceberg supports multiple catalog implementations including the Hive Metastore, AWS Glue, a REST catalog, and JDBC-based catalogs. The catalog's role is intentionally minimal: it stores only a pointer to the current metadata file, not the metadata itself. This design allows the metadata layer to be fully self-contained in the storage system.

### The Metadata Layer

The metadata layer is the core of Iceberg's design. It consists of three types of files stored alongside the data:

**Metadata files** contain the table's schema, partition spec, sort order, properties, and a reference to the current snapshot. Each write operation creates a new metadata file. The catalog pointer is then updated atomically to reference the new metadata file.

**Manifest lists** (also called snapshot manifests) enumerate all the manifest files that make up a particular snapshot of the table. Each snapshot has exactly one manifest list. The manifest list tracks which manifests were added, which were removed, and summary statistics like row counts and partition boundaries.

**Manifest files** contain the actual file-level metadata: the path to each data file, the file format, the partition values, column-level statistics (min/max values, null counts, value counts), and the file size. Manifest files are the key to Iceberg's query planning performance: the engine can prune entire files from a scan based on the statistics without opening the files themselves.

This three-level hierarchy (metadata file, manifest list, manifest file) enables efficient planning even for tables with millions of data files. The engine can skip entire manifests based on partition boundaries and skip individual files based on column statistics.

### The Data Layer

The data layer consists of the actual data files stored in formats like Apache Parquet, Apache ORC, or Apache Avro. Iceberg does not prescribe a single file format; it works with any format that supports its required features (schema projection, predicate pushdown).

In practice, Parquet is the most common format used with Iceberg because of its efficient columnar compression and broad engine support.

## Key Features

### Schema Evolution

Iceberg supports full schema evolution without rewriting data files. You can add columns, drop columns, rename columns, reorder columns, and widen types (e.g., `int` to `long`), all as metadata-only operations. The existing data files are not modified.

This is possible because Iceberg assigns a unique ID to each column and tracks the mapping between column IDs and names across schema versions. When a query reads data files written with an older schema, Iceberg uses the column ID mapping to resolve the correct columns, filling in `null` for columns that did not exist when the file was written.

### Hidden Partitioning

Traditional Hive-style partitioning requires users to know the partition scheme and include partition columns in every query. If data is partitioned by `year(event_date)`, the user must add `WHERE year(event_date) = 2026` to benefit from partition pruning. If they write `WHERE event_date > '2026-01-01'`, the Hive table performs a full scan.

Iceberg decouples the logical query from the physical partitioning. Partition transforms (year, month, day, hour, truncate, bucket) are defined at the table level and applied automatically. A query with `WHERE event_date > '2026-01-01'` automatically benefits from partition pruning because Iceberg's planner evaluates the filter against the partition metadata. Users do not need to know or reference the partition scheme.

Iceberg also supports partition evolution: changing the partition scheme without rewriting existing data. New data is written with the new partition spec, and queries that span both old and new partitions work correctly because the manifest files track which partition spec applies to each data file.

### Time Travel

Every write to an Iceberg table creates a new snapshot. Snapshots are immutable and retained according to the table's expiration policy. This enables time travel queries: reading the table as it existed at a specific point in time or a specific snapshot ID.

Time travel is useful for reproducible analytics, debugging data pipeline issues, and auditing. An analyst can compare the current state of a table with its state from last week to understand what changed. A data engineer can roll back a table to a previous snapshot if a bad write corrupts the data.

```sql
-- Query the table as of a specific timestamp
SELECT * FROM orders TIMESTAMP AS OF '2026-03-01 00:00:00';

-- Query a specific snapshot
SELECT * FROM orders VERSION AS OF 12345678;
```

### ACID Transactions

Iceberg provides serializable isolation for write operations through optimistic concurrency control. Each write operation reads the current metadata, computes the new metadata, and then attempts to atomically swap the catalog pointer from the old metadata file to the new one. If another writer has modified the table in the meantime, the operation detects the conflict and retries.

This approach enables concurrent readers and writers without locking. Readers always see a consistent snapshot: they follow the metadata pointer that was current when they started their scan. Writers produce new snapshots that become visible atomically when the catalog pointer is updated.

### File-Level Statistics and Pruning

Each manifest file in Iceberg records column-level statistics for every data file: minimum values, maximum values, null counts, and value counts. The query planner uses these statistics to skip files that cannot contain matching rows.

For a query like `WHERE amount > 1000`, the planner checks the `max(amount)` statistic for each file. If a file's maximum amount is 500, the file is pruned from the scan. This file-level pruning can eliminate the majority of I/O for selective queries on large tables, without requiring the files to be partitioned on the filter column.

## Iceberg vs. Other Table Formats

### Iceberg vs. Hive Tables

Hive tables were the original table format for data lakes. A Hive table is essentially a directory of files registered in the Hive Metastore, with partitions mapped to subdirectories (e.g., `year=2026/month=03/`).

Hive's limitations motivated Iceberg's creation:

- **Partition discovery is directory-based.** The metastore tracks partitions, but file-level metadata is not maintained. Listing all files in a partition requires expensive cloud storage listing operations.
- **No file-level statistics.** Hive cannot prune individual files within a partition. All files in a matching partition must be scanned.
- **No schema evolution safety.** Schema changes in Hive can break existing data files because there is no column ID mapping.
- **No snapshot isolation.** Concurrent reads and writes can produce inconsistent results because there is no atomic metadata update mechanism.
- **Partition changes require data rewriting.** Changing the partition scheme of a Hive table requires rewriting all the data.

Iceberg addresses every one of these limitations. It tracks individual files with column-level statistics, supports safe schema evolution through column IDs, provides snapshot isolation through immutable metadata, and allows partition evolution without data rewrites.

### Iceberg vs. Delta Lake

[Delta Lake](/learn/delta-lake) is another open table format, originally developed at Databricks. Both Iceberg and Delta Lake solve the same core problems (ACID transactions, schema evolution, and time travel on data lakes), but they differ in architecture and ecosystem alignment.

Delta Lake uses a transaction log (the `_delta_log` directory) consisting of JSON and Parquet checkpoint files. Iceberg uses its three-level metadata hierarchy (metadata files, manifest lists, manifest files). Delta Lake's log-based approach can require compaction of the transaction log for large tables, while Iceberg's manifest-based approach provides consistent planning performance regardless of write history.

Iceberg has broader engine support; it is natively integrated with Spark, Trino, Flink, Dremio, Snowflake, and others. Delta Lake has the deepest integration with Databricks and Spark, with growing support in other engines through the Delta Kernel project.

Both formats are actively developed and production-ready. The choice often depends on the primary query engine and cloud platform in use. For a detailed comparison, see [Apache Iceberg vs. Delta Lake](/learn/apache-iceberg-vs-delta-lake).

### Iceberg vs. Apache Hudi

Apache Hudi (Hadoop Upserts Deletes and Incrementals) was designed primarily for streaming ingestion with upsert and incremental processing capabilities. Hudi provides two storage types: Copy-on-Write (CoW), which rewrites files on each update, and Merge-on-Read (MoR), which writes deltas and merges them at read time.

Iceberg and Hudi overlap in providing ACID transactions and time travel, but they emphasize different workloads. Hudi excels at high-frequency streaming upserts, particularly on Spark. Iceberg's design prioritizes read performance, engine-agnostic compatibility, and metadata scalability for tables with millions of files. Iceberg's position-delete and equality-delete mechanisms handle updates without the tight coupling to a specific write engine that Hudi's architecture requires.

## How Spice Uses Apache Iceberg

[Spice](/platform/sql-federation-acceleration) connects to Iceberg tables as a federated data source through its [SQL federation](/learn/sql-federation) layer. Users can query Iceberg tables stored in Amazon S3, Google Cloud Storage, or Azure Blob Storage through Spice's unified SQL interface, alongside data from PostgreSQL, MySQL, Databricks, Snowflake, and [40+ other sources](/integrations).

When Spice queries an Iceberg table, it reads the Iceberg metadata to identify the relevant data files, applies partition pruning and file-level statistics pruning based on the query's predicates, and uses predicate pushdown to minimize the amount of data read from object storage. This means a query with a `WHERE` clause on a partitioned or statistics-rich column reads only the files that could contain matching rows.

For workloads that require sub-second query performance, Spice can [accelerate](/learn/data-acceleration) Iceberg tables by caching them locally. The acceleration layer stores a local copy of the data that can be queried without round-trips to object storage. Combined with [change data capture](/learn/change-data-capture), the local cache stays synchronized with the source Iceberg table.

This approach lets development teams build an [operational data lakehouse](/use-case/operational-data-lakehouse): Iceberg remains the primary data lake table format while Spice queries it alongside operational databases and other analytical stores, all through a single SQL interface powered by [Apache DataFusion](/learn/apache-datafusion).

```sql
-- Query an Iceberg table in S3 alongside a PostgreSQL table through Spice
SELECT o.order_id, o.amount, c.name
FROM iceberg.orders o
JOIN postgres.customers c ON o.customer_id = c.id
WHERE o.created_at > '2026-01-01'
ORDER BY o.amount DESC
LIMIT 100;
```

## Advanced Topics

### Metadata Scalability and Planning Performance

One of Iceberg's key design goals is planning performance at scale. Tables in production data lakes can contain millions of data files across thousands of partitions. Listing files through directory-based approaches (as Hive does) becomes prohibitively slow at this scale: cloud storage listing operations have high latency and limited throughput.

Iceberg's manifest-based approach eliminates directory listing entirely. The manifest list for a snapshot enumerates all manifest files, and each manifest file enumerates its data files with full statistics. The planner reads these metadata files (which are typically small and can be cached) and builds the file scan plan without any directory listing. This makes planning time proportional to the number of manifest files, not the number of data files.

For extremely large tables, Iceberg supports manifest pruning based on partition bounds stored in the manifest list. If a query filters on a partitioned column, the planner can skip entire manifests that contain no matching partitions, further reducing planning overhead.

### Row-Level Operations: Deletes and Updates

Iceberg supports row-level deletes and updates through two mechanisms: position deletes and equality deletes.

**Position deletes** specify the file path and row position of each deleted row. They are efficient for targeted deletes where the engine already knows which rows to remove (e.g., after a join-based deduplication). Position deletes are fast to apply because the reader can skip specific row positions during file scans.

**Equality deletes** specify the column values that identify deleted rows. They are useful when the exact file and row position are not known, such as when deleting all rows where `user_id = 123`. Equality deletes are more flexible but slower to apply because the reader must evaluate the delete predicate against every row.

In Iceberg v2, both delete mechanisms produce delete files that are tracked in the manifest alongside data files. Over time, accumulating delete files degrades read performance. Table maintenance operations (compaction) merge delete files with data files to produce new, clean data files.

### Table Maintenance: Compaction and Expiration

Iceberg tables require periodic maintenance to ensure optimal read performance:

**Compaction** rewrites small data files into larger ones and merges delete files with data files. Without compaction, a table that receives many small writes accumulates thousands of small files, each adding overhead to the scan plan. Compaction reduces file count, eliminates delete files, and improves compression efficiency.

**Snapshot expiration** removes old snapshots and their associated metadata and data files. While time travel requires retaining historical snapshots, indefinite retention increases storage costs and metadata size. Expiration policies define how long snapshots are retained (e.g., 7 days) before they are eligible for garbage collection.

**Orphan file cleanup** removes data files that are not referenced by any snapshot. Orphan files can result from failed write operations that produced data files but did not successfully commit the metadata update. Periodic cleanup prevents these files from accumulating and consuming storage.

### Iceberg REST Catalog Protocol

The Iceberg REST catalog protocol defines a standard HTTP API for catalog operations: listing namespaces and tables, loading table metadata, and committing metadata updates. The REST catalog is becoming the preferred catalog implementation because it decouples the catalog from a specific backend (Hive Metastore, AWS Glue) and allows catalog providers to implement custom authorization, caching, and multi-tenancy logic behind the standard API.

The protocol uses optimistic concurrency for commits: the client sends the current metadata location along with the new metadata, and the server rejects the commit if the current metadata has changed since the client read it. This enables safe concurrent writes through any REST-compatible catalog without requiring distributed locking.

<ContentRichText
  fields={{
    coverage: 'rc-end',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<AccordionFaq
  fields={{
    heading: 'Apache Iceberg FAQ',
    paragraph: '',
    items: [
      {
        title: 'What is the difference between Apache Iceberg and Delta Lake?',
        paragraph:
          '<p>Both are open table formats that provide ACID transactions, schema evolution, and time travel on data lakes. Iceberg uses a three-level metadata hierarchy (metadata files, manifest lists, manifest files) while Delta Lake uses a JSON/Parquet transaction log. Iceberg has broader native engine support across Spark, Trino, Flink, and Snowflake. Delta Lake has the deepest integration with Databricks and Spark. The choice often depends on your primary query engine and ecosystem.</p>',
      },
      {
        title: 'What is hidden partitioning in Apache Iceberg?',
        paragraph:
          '<p>Hidden partitioning decouples the physical partition scheme from user queries. Partition transforms (year, month, day, hour, truncate, bucket) are defined at the table level and applied automatically during query planning. Users write standard filter expressions like WHERE event_date > 2026-01-01, and Iceberg automatically prunes partitions without the user needing to know or reference the partition columns. This eliminates a common source of user errors and full-table scans in Hive-partitioned tables.</p>',
      },
      {
        title: 'How does time travel work in Apache Iceberg?',
        paragraph:
          '<p>Every write to an Iceberg table creates an immutable snapshot. Iceberg retains historical snapshots according to a configurable expiration policy. Time travel queries reference a specific timestamp or snapshot ID to read the table as it existed at that point. This enables reproducible analytics, data pipeline debugging, and rollback to a known good state if a write introduces incorrect data.</p>',
      },
      {
        title: 'Can I query Apache Iceberg tables with Spice?',
        paragraph:
          '<p>Yes. Spice connects to Iceberg tables as a federated data source. You can query Iceberg tables in S3, GCS, or Azure Blob Storage through Spice unified SQL interface alongside data from PostgreSQL, MySQL, Databricks, and 40+ other sources. Spice applies partition pruning and predicate pushdown when reading Iceberg metadata, and supports optional local acceleration for sub-second query performance.</p>',
      },
      {
        title: 'Does Apache Iceberg support schema evolution?',
        paragraph:
          '<p>Yes. Iceberg supports adding, dropping, renaming, and reordering columns, as well as widening types, all as metadata-only operations. Existing data files are not rewritten. Iceberg assigns a unique ID to each column and uses these IDs to resolve schemas across file versions, so queries against files written with older schemas return correct results with null values for columns that did not exist at write time.</p>',
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<ContentResourceFeatured
  fields={{
    heading: 'Learn more about Iceberg and Spice',
    paragraph:
      'Technical resources on how Spice connects to Apache Iceberg tables for federated SQL queries.',
    mode: 'default',
    resources: [
      {
        source: 'manual',
        resource: null,
        resource_manual: {
          eyebrow: 'Docs',
          title: {
            title: 'Spice.ai OSS Documentation',
            url: 'https://spiceai.org/docs',
            target: '_blank',
          },
          description:
            'Learn how Spice connects to Apache Iceberg tables for federated SQL queries with predicate pushdown and local acceleration.',
          image: {
            ID: 1661,
            id: 1661,
            title: 'Docs jpeg',
            filename: 'Docs-jpeg.jpeg',
            filesize: 103192,
            url: '/website-assets/media/2025/12/Docs-jpeg.jpeg',
            link: '/docs-jpeg/',
            alt: '',
            author: '9',
            description: '',
            caption: '',
            name: 'docs-jpeg',
            status: 'inherit',
            uploaded_to: 0,
            date: '2025-12-05 04:13:53',
            modified: '2025-12-05 04:13:53',
            menu_order: 0,
            mime_type: 'image/jpeg',
            type: 'image',
            subtype: 'jpeg',
            icon: '/website-assets/media/default.png',
            width: 1832,
            height: 1036,
            sizes: {
              thumbnail: '/website-assets/media/2025/12/Docs-jpeg-150x150.jpeg',
              'thumbnail-width': 150,
              'thumbnail-height': 150,
              medium: '/website-assets/media/2025/12/Docs-jpeg-300x170.jpeg',
              'medium-width': 300,
              'medium-height': 170,
              medium_large:
                '/website-assets/media/2025/12/Docs-jpeg-768x434.jpeg',
              'medium_large-width': 768,
              'medium_large-height': 434,
              large: '/website-assets/media/2025/12/Docs-jpeg-1024x579.jpeg',
              'large-width': 1024,
              'large-height': 579,
              '1536x1536':
                '/website-assets/media/2025/12/Docs-jpeg-1536x869.jpeg',
              '1536x1536-width': 1536,
              '1536x1536-height': 869,
              '2048x2048': '/website-assets/media/2025/12/Docs-jpeg.jpeg',
              '2048x2048-width': 1832,
              '2048x2048-height': 1036,
            },
          },
        },
      },
      {
        source: 'picker',
        resource: [
          {
            title: 'How we use Apache DataFusion at Spice AI',
            slug: '/blog/how-we-use-apache-datafusion-at-spice-ai',
            excerpt:
              'A technical overview of how Spice extends Apache DataFusion with custom table providers, optimizer rules, and UDFs.',
            image:
              '/website-assets/media/2026/01/Engineering-at-Spice-AI-Apache-DataFusion.png',
            type: 'Blog',
            taxonomy: ['SQL Federation', 'Engineering'],
          },
        ],
        resource_manual: {
          eyebrow: '',
          title: null,
          description: '',
          image: false,
        },
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<TalkToAnEngineerCta />

---

## Best Alternatives to ETL Pipelines for AI Agents
URL: https://spice.ai/learn/best-alternatives-to-etl-pipelines-for-ai-agents
Date: 2026-06-03T00:00:00
Description: Objective guide to alternatives to ETL pipelines for AI agents, including federation, CDC, event streaming, and hybrid data architecture patterns.

<HeroCenteredText
  fields={{
    graphic_position: 'no-graphic',
    heading_tag: 'h1',
    heading: 'Best Alternatives to ETL Pipelines for AI Agents',
    paragraph:
      'ETL remains useful for batch analytics, but AI agents often need fresher data and lower-latency access paths. This guide compares objective alternatives and when to use each.',
    cta: [
      {
        type: 'filled',
        cta: {
          title: 'See SQL federation and acceleration',
          url: '/platform/sql-federation-acceleration',
          target: '',
        },
      },
      {
        type: 'bordered',
        cta: {
          title: 'Read federation docs',
          url: 'https://spiceai.org/docs/features/query-federation',
          target: '_blank',
        },
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<ContentRichText
  fields={{
    coverage: 'rc-start',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

ETL pipelines are effective for scheduled analytics and historical reporting. However, AI agents introduce a different access pattern. They need low-latency reads, frequent updates, and the ability to combine data from APIs, operational databases, and analytical stores in the same request flow.

For these workloads, classic nightly or hourly ETL can become a bottleneck. This does not mean ETL is obsolete. It means teams need additional patterns for agent-facing paths.

This guide compares practical alternatives to ETL pipelines for AI agents and explains where each approach fits.

## Why ETL Alone Is Often Not Enough for Agents

### Freshness requirements are tighter

Many agent tasks depend on recent operational state: order updates, support ticket changes, inventory levels, and user activity. Batch ETL introduces a staleness window by design.

### Latency compounds across tool calls

Agents often execute multiple reads per answer. If each read depends on a warehouse pipeline or cross-region query, response times can degrade quickly.

### Query shapes are less predictable

Dashboards usually run known query templates. Agents issue dynamic requests based on context. Static ETL models can struggle when access patterns shift frequently.

## Alternative 1: SQL Federation

[SQL federation](/learn/sql-federation) queries data in place across multiple systems through one SQL interface. Instead of copying everything into a warehouse first, the query engine pushes work to source systems and merges results.

When to use it:

- You need cross-source joins quickly
- Data freshness needs are near real-time
- You want fast time-to-first-query with minimal pipeline setup

Key tradeoffs:

- Performance depends on source latency and pushdown quality
- Source systems must tolerate query load
- Governance and access controls must be designed carefully for agent access

## Alternative 2: CDC + Local Acceleration

Change data capture (CDC) streams row-level changes from source systems into a local acceleration layer. Agents query the accelerated copy while it stays synchronized with upstream changes.

When to use it:

- Agent latency SLOs are strict
- Source systems are sensitive to repeated read load
- You need a bounded freshness window that is shorter than ETL batch intervals

Key tradeoffs:

- Requires CDC setup and monitoring
- Refresh intervals and consistency expectations must be explicit
- Storage and compute costs move from warehouse ETL to acceleration runtime

For implementation patterns, see [real-time change data capture](/feature/real-time-change-data-capture) and [data acceleration](/learn/data-acceleration).

## Alternative 3: Event-Driven Streaming Pipelines

Streaming platforms move from batch-oriented ETL toward event-driven propagation. Instead of waiting for scheduled jobs, changes flow continuously to downstream systems.

When to use it:

- You already operate a stream processing platform
- Teams need event-level workflows in addition to point-in-time querying
- Multiple consumers require the same change stream

Key tradeoffs:

- Operational complexity can be high
- Schema evolution and replay strategies need clear ownership
- Agents still need a queryable serving layer, not only an event bus

## Alternative 4: API-Native Retrieval Layers

Some teams avoid warehouse-first ETL for agent paths by building API-native retrieval layers. Agents call scoped services that aggregate and normalize data from backend APIs in real time.

When to use it:

- Business logic is already encapsulated in service APIs
- Strong domain boundaries exist per team
- You need strict control over which fields agents can retrieve

Key tradeoffs:

- Maintenance burden grows as API count increases
- Cross-domain joins are harder without a unifying query layer
- Data access logic can become duplicated across services

## Alternative 5: Hybrid Architecture (Most Common in Practice)

Most production systems combine ETL with one or more alternatives above. A common pattern is:

- ETL for long-horizon analytics and compliance reporting
- Federation for cross-source, on-demand reads
- CDC-based acceleration for hot agent-serving datasets
- Streaming for event-driven workflows

This hybrid approach lets teams optimize each path for its own latency, freshness, and cost constraints.

## Comparison Table

| Approach | Freshness | Latency profile | Operational complexity | Best fit |
|---|---|---|---|---|
| ETL only | Low to medium | Medium to high for agent paths | Medium | Historical analytics and reporting |
| SQL federation | High | Medium, source dependent | Low to medium | Real-time cross-source querying |
| CDC + acceleration | High | Low to medium | Medium | Low-latency agent retrieval |
| Streaming pipelines | High | Medium | High | Event-driven architectures |
| API-native retrieval | High | Medium | Medium to high | Domain-scoped service access |
| Hybrid model | High where needed | Tunable | Medium to high | Mixed workloads at scale |

## Decision Framework

Use these questions to pick an approach objectively.

### 1. What is the required freshness window?

If agent tasks require seconds-to-minutes freshness, ETL alone is usually insufficient. Favor federation, CDC acceleration, or streaming-assisted architectures.

### 2. What is the acceptable tail latency?

Define p95 and p99 budgets for end-to-end agent responses. If multiple reads must complete within tight budgets, prioritize local acceleration and pushdown efficiency.

### 3. How much source load can systems absorb?

If production systems are read-constrained, avoid direct live querying for all agent requests. Add acceleration layers or event-fed serving stores.

### 4. How strict are policy boundaries?

Agent systems need clear credential scoping, auditability, and tenant isolation. Include these requirements in architecture selection from day one.

### 5. What can your platform team operate reliably?

A technically strong design can still fail if operational burden is too high. Choose the simplest pattern that meets your SLOs.

## Advanced Topics

### Designing for Blast Radius

Shared data layers are efficient but can increase incident scope. Sidecar or microservice deployment models can isolate faults and credentials to smaller boundaries. The right choice depends on reliability requirements, team ownership model, and deployment footprint.

### Freshness Contracts and Prompt Safety

Agents should know how fresh their context is. Expose freshness metadata to the retrieval path so prompts and downstream logic can reason about staleness explicitly. This reduces silent correctness issues.

### Observability for Agent Data Paths

Track source query latency, acceleration hit rate, freshness lag, and policy-denied events. For agent workloads, these metrics are often more predictive of user experience than model-level metrics alone.

## How Spice Supports ETL Alternatives for Agents

[Spice](/platform/sql-federation-acceleration) supports a hybrid model by combining federated SQL access with local acceleration. Teams can query across [integrations](/integrations), set refresh behavior for accelerated datasets, and expose controlled access for agent runtimes through [MCP server gateway patterns](/feature/mcp-server-gateway).

This lets teams keep ETL where it adds value while using lower-latency alternatives for agent-serving paths. For teams planning rollout and cost controls, review [Spice Cloud pricing](/pricing).

<ContentRichText
  fields={{
    coverage: 'rc-end',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<AccordionFaq
  fields={{
    heading: 'ETL Alternatives for AI Agents FAQ',
    paragraph: '',
    items: [
      {
        title: 'Should we replace ETL entirely for AI agents?',
        paragraph:
          '<p>Usually no. ETL remains useful for historical analytics and compliance reporting. Most teams adopt a hybrid architecture where ETL coexists with federation, CDC acceleration, or streaming for agent-facing paths.</p>',
      },
      {
        title: 'What is the fastest path to reduce ETL dependence for agents?',
        paragraph:
          '<p>Federation is often the fastest starting point because teams can query sources in place without building full pipelines first. Then they add acceleration for datasets that need lower latency or reduced source load.</p>',
      },
      {
        title: 'How do we keep source systems from being overloaded?',
        paragraph:
          '<p>Use pushdown-aware federation, add local acceleration for hot datasets, and set refresh intervals based on source capacity. Monitor read amplification and tune policies before traffic scales.</p>',
      },
      {
        title: 'Where does streaming fit compared with federation?',
        paragraph:
          '<p>Streaming is strong for continuous change propagation and event workflows. Federation is strong for ad-hoc cross-source queries. Many teams use both: streams for updates, federation or acceleration for query serving.</p>',
      },
      {
        title: 'What should we test in a proof of concept?',
        paragraph:
          '<p>Benchmark realistic agent query traces, not only synthetic SQL queries. Measure p95 latency, freshness lag, source impact, error handling, and policy enforcement under concurrent load.</p>',
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<ContentResourceFeatured
  fields={{
    heading: 'Learn more about agent-ready data access',
    paragraph:
      'Documentation and technical resources for federation, acceleration, and hybrid architectures.',
    mode: 'default',
    resources: [
      {
        source: 'manual',
        resource: null,
        resource_manual: {
          eyebrow: 'Docs',
          title: {
            title: 'Query Federation Docs',
            url: 'https://spiceai.org/docs/features/query-federation',
            target: '_blank',
          },
          description:
            'Learn how to query across multiple systems with SQL federation and local acceleration.',
          image: {
            ID: 1661,
            id: 1661,
            title: 'Docs jpeg',
            filename: 'Docs-jpeg.jpeg',
            filesize: 103192,
            url: '/website-assets/media/2025/12/Docs-jpeg.jpeg',
            link: '/docs-jpeg/',
            alt: '',
            author: '9',
            description: '',
            caption: '',
            name: 'docs-jpeg',
            status: 'inherit',
            uploaded_to: 0,
            date: '2025-12-05 04:13:53',
            modified: '2025-12-05 04:13:53',
            menu_order: 0,
            mime_type: 'image/jpeg',
            type: 'image',
            subtype: 'jpeg',
            icon: '/website-assets/media/default.png',
            width: 1832,
            height: 1036,
            sizes: {
              thumbnail: '/website-assets/media/2025/12/Docs-jpeg-150x150.jpeg',
              'thumbnail-width': 150,
              'thumbnail-height': 150,
              medium: '/website-assets/media/2025/12/Docs-jpeg-300x170.jpeg',
              'medium-width': 300,
              'medium-height': 170,
              medium_large:
                '/website-assets/media/2025/12/Docs-jpeg-768x434.jpeg',
              'medium_large-width': 768,
              'medium_large-height': 434,
              large: '/website-assets/media/2025/12/Docs-jpeg-1024x579.jpeg',
              'large-width': 1024,
              'large-height': 579,
              '1536x1536':
                '/website-assets/media/2025/12/Docs-jpeg-1536x869.jpeg',
              '1536x1536-width': 1536,
              '1536x1536-height': 869,
              '2048x2048': '/website-assets/media/2025/12/Docs-jpeg.jpeg',
              '2048x2048-width': 1832,
              '2048x2048-height': 1036,
            },
          },
        },
      },
      {
        source: 'picker',
        resource: [
          {
            title: 'Getting Started with Spice.ai SQL Query Federation & Acceleration',
            slug: '/blog/spice-sql-query-federation-acceleration',
            excerpt:
              'Learn how to use Spice.ai to federate and accelerate queries across operational and analytical systems with zero ETL.',
            image:
              '/website-assets/media/2025/11/68ee96eb08a0dfcb609c1969_Version-7-1.png',
            type: 'Blog',
            taxonomy: ['Spice AI'],
          },
        ],
        resource_manual: {
          eyebrow: '',
          title: null,
          description: '',
          image: false,
        },
      },
      {
        source: 'picker',
        resource: [
          {
            title: 'Building an Enterprise SRE Agent with OpenClaw and Spice',
            slug: '/blog/openclaw-and-spice-governed-access-to-production-data-for-enterprise-agents',
            excerpt:
              'How to build an OpenClaw SRE with Spice for safe, unified, and observable access to production data, demonstrated with real-world incident workflows.',
            image:
              '/website-assets/media/2026/05/openclaw-blog-header.svg',
            type: 'Blog',
            taxonomy: ['Spice AI', 'Engineering'],
          },
        ],
        resource_manual: {
          eyebrow: '',
          title: null,
          description: '',
          image: false,
        },
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<TalkToAnEngineerCta />

---

## Best Query Engines for Real-Time AI Analytics
URL: https://spice.ai/learn/best-query-engines-for-real-time-ai-analytics
Date: 2026-09-02T00:00:00
Description: Objective comparison of query engines for real-time AI analytics, covering DataFusion, DuckDB, ClickHouse, Trino, Druid, Pinot, and Spark against AI workload requirements.

<HeroCenteredText
  fields={{
    graphic_position: 'no-graphic',
    heading_tag: 'h1',
    heading: 'Best Query Engines for Real-Time AI Analytics',
    paragraph:
      'AI workloads ask different things of a query engine than dashboards do. This guide compares the major engines against those requirements: generated SQL, retrieval inside the query, and concurrency from agent loops.',
    cta: [
      {
        type: 'filled',
        cta: {
          title: 'See hybrid SQL search',
          url: '/platform/hybrid-sql-search',
          target: '',
        },
      },
      {
        type: 'bordered',
        cta: {
          title: 'Read the search docs',
          url: 'https://spiceai.org/docs/features/search',
          target: '_blank',
        },
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<ContentRichText
  fields={{
    coverage: 'rc-start',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

A query engine is the software that plans and executes a query. For twenty years the benchmark for choosing one was analytical throughput: how fast it scans, joins, and aggregates large tables. AI analytics keeps that requirement and adds several more.

The additions come from how AI systems query. A model writes the SQL. A single task mixes structured filters with text and vector retrieval. Results feed another model rather than a chart. These change which engine properties matter.

This guide sets out what AI analytics asks of an engine, compares the major options against those requirements, and gives a framework for choosing. It covers engines, not architectures. For the architectural question of what serves a real-time workload, see [Snowflake alternatives for real-time SQL](/learn/snowflake-alternatives-for-real-time-sql). For license and governance questions, see [open-source AI data platforms](/learn/open-source-ai-data-platforms).

## What AI Analytics Asks of a Query Engine

### The SQL is generated, not tuned

A human writes a query once and tunes it. A model writes a new query for every task. The engine sees unexpected joins, filters on unindexed columns, and occasional queries that scan far more than the task needed.

This makes two properties matter more than raw speed. The first is a good optimizer that rescues a poorly written query. The second is resource limits that stop a bad one. See [text-to-SQL](/learn/text-to-sql) for how generation quality affects this.

### Retrieval and analytics belong in one query

An AI task often needs keyword matching, vector similarity, and a structured filter together. When the engine handles only the structured part, the application merges results from a separate search system, and filters apply unevenly across the halves.

An engine that runs [hybrid search](/learn/hybrid-search) natively keeps one filter, one plan, and one set of permissions.

### Inference may sit in the query path

Classification, extraction, and summarization over query results are common steps. An engine with extensible functions can run them inside the plan. An engine without them pushes the work to orchestration code and a round trip.

### Results go to models, not dashboards

Query output usually lands in Python, a dataframe library, or a model context rather than in a chart. An engine that returns [Apache Arrow](/learn/apache-arrow) buffers hands results over without serialization cost. An engine that returns rows over a text protocol pays a conversion on every read.

### Concurrency comes from loops, not people

Ten analysts produce ten concurrent queries. Ten agents in retry loops produce hundreds of small ones. Concurrency behavior, not single-query latency, is what usually separates engines under an AI workload.

## Evaluation Criteria

| Criterion | Why it matters for AI analytics |
| --- | --- |
| Arrow-native output | Results reach Python and models without conversion |
| Extensibility | Custom functions put inference and scoring in the plan |
| Search in the engine | Keyword and vector retrieval share a filter with SQL |
| Embeddability | Running in-process removes a network hop per read |
| Federation | One query reaches operational and analytical sources |
| Resource limits | Bounds the cost of a badly generated query |
| Small-query concurrency | Matches how agents actually read |

## Apache DataFusion

[Apache DataFusion](/learn/apache-datafusion) is an extensible query engine written in Rust and built on Arrow. It is a library rather than a database, so it ships inside another system.

**Strengths for AI analytics:** Arrow-native throughout, so there is no conversion between execution and output. Extension points for custom functions, table providers, and optimizer rules make in-query inference and federation practical. Embeddable, so it runs in-process.

**Limits:** A library, not a product. Storage, ingestion, governance, and coordination come from whatever embeds it. [Apache Ballista](/learn/apache-ballista) adds distribution and is less mature than established distributed engines.

**Fits when:** You are building a data platform rather than buying one, or you want an engine you can extend. See [managed Apache DataFusion](/learn/managed-apache-datafusion) for the operated alternative.

## DuckDB

[DuckDB](/learn/duckdb) is an embedded analytical database. It runs in-process, needs no server, and is fast on a single node.

**Strengths for AI analytics:** Very low latency with no network hop. Excellent developer experience and a mature SQL surface. Reads Parquet and Arrow directly, so it fits analytical Python workflows.

**Limits:** Single-node and single-writer by design. Concurrency across processes is constrained. Extending it means C++ extensions rather than composing a library.

**Fits when:** The working set fits on one node and the workload is analytical rather than multi-tenant serving. [DataFusion versus DuckDB](/learn/apache-datafusion-vs-duckdb) compares the two in detail.

## ClickHouse

ClickHouse is a columnar database built for high-volume aggregate queries over event data, with continuous ingestion.

**Strengths for AI analytics:** Among the fastest engines for aggregates at high concurrency. Continuous ingestion rather than batch loading. Mature operationally.

**Limits:** Joins are more constrained than in a general SQL engine, which matters when a model generates them freely. Data must be ingested, so it is a destination rather than a way to reach existing systems.

**Fits when:** The workload is high-volume aggregates over events and the query shapes are broadly predictable.

## Trino

Trino is a distributed SQL engine designed to query many sources in place through one interface.

**Strengths for AI analytics:** Broad connector coverage and mature [SQL federation](/learn/sql-federation). Strong for large analytical queries spanning systems.

**Limits:** Built for analytical throughput rather than millisecond serving. Per-agent isolation requires architecture around it. Operating a cluster is a real cost for a small platform team.

**Fits when:** A central data team already runs it and the workload is cross-source analysis rather than interactive serving.

## Apache Druid and Apache Pinot

Both are real-time OLAP databases designed for sub-second aggregates over streaming data at high concurrency.

**Strengths for AI analytics:** The lowest latency in this list for their target query shape. Built for continuous ingestion and many concurrent readers.

**Limits:** Narrow query surface compared with a general SQL engine, which suits generated SQL poorly. Each is a substantial system to operate.

**Fits when:** A known, high-volume aggregate workload justifies a dedicated system.

## Apache Spark

Spark is a distributed processing engine with a mature SQL layer, widely used for large batch transformation.

**Strengths for AI analytics:** Handles the largest datasets and the most complex transformation. Deep ecosystem and library support.

**Limits:** Job startup and scheduling overhead make it a poor fit for interactive serving. It is a batch engine that also does SQL, rather than a serving engine.

**Fits when:** The work is preparation and transformation feeding a serving engine, not the serving itself.

## Comparison

| Engine | Arrow-native | Embeddable | Search in engine | Federation | Small-query concurrency | Primary fit |
| --- | --- | --- | --- | --- | --- | --- |
| DataFusion | Yes | Yes | Through extensions | Through extensions | Good | Building a platform |
| DuckDB | Yes | Yes | Extensions | Limited | Constrained | Single-node analytics |
| ClickHouse | Partial | No | Limited | Limited | Excellent | Event aggregates |
| Trino | Partial | No | No | Yes | Medium | Cross-source analysis |
| Druid | No | No | Text only | No | Excellent | Fixed aggregate workloads |
| Pinot | No | No | Text and vector | No | Excellent | Fixed aggregate workloads |
| Spark | Partial | No | No | Through connectors | Poor | Batch transformation |

Treat the table as a starting point. Every row depends on version, configuration, and workload.

## How to Choose

### 1. Decide whether you are buying an engine or building on one

DataFusion and DuckDB are libraries. ClickHouse, Druid, Pinot, Trino, and Spark are systems to operate. That distinction usually narrows the list faster than any benchmark.

### 2. Check whether retrieval must share the query

Some tasks need keyword matching, vector similarity, and a structured filter together. An engine without native search then means a second system and a merge in application code.

### 3. Count the concurrent small queries

Estimate queries per agent task, then multiply by expected tasks. Benchmark at that concurrency. Single-query numbers rarely predict what happens at a hundred.

### 4. Confirm the output format

If results feed Python or a model, check whether the engine returns Arrow. Serialization cost on every read is easy to miss in a prototype and hard to remove later.

### 5. Test with generated queries

Collect real queries from a model rather than writing them by hand. Generated SQL exposes optimizer weaknesses that a tuned benchmark hides.

## Advanced Topics

### Optimizer quality matters more with generated SQL

A human rewrites a slow query. A model writes another one that is slow differently. Predicate pushdown, join reordering, and projection pruning carry more weight when nobody tunes the input. Inspect the plans an engine produces for awkward generated queries, not for the queries in its own benchmark.

Three patterns are worth testing specifically, because models produce them often. The first is a filter expressed against a computed column, which blocks pushdown in many engines. The second is a join written in an order no human would choose. The third is `SELECT *` where two columns were needed. An optimizer that handles all three keeps generated SQL affordable.

### Resource limits are a correctness feature

An unbounded generated query is an availability risk. Limits on scanned bytes, rows, and execution time turn a bad query into a failed query rather than an incident. Check that the engine enforces them per session, not only globally.

A global limit protects the cluster and does not protect tenants from each other. Per-session or per-identity limits are what stop one agent consuming the budget of the rest. Check also what happens at the limit. An engine that returns a clear error lets the agent adapt, and one that returns truncated results silently produces wrong answers.

### Composability over completeness

The engines with the most AI-facing momentum are libraries rather than products. Building on a library means supplying storage, governance, and coordination, and it means the parts that are specific to the workload can be specific. This is why several data platforms are built on DataFusion rather than on a finished database.

The tradeoff is real. A library gives extension points and gives no operational defaults, so a team adopting one is committing to build the surrounding system. Estimate that work before choosing, because it is usually larger than the query layer itself.

### Benchmarks and what they omit

Published analytical benchmarks measure scan and join performance on fixed queries. They do not measure concurrency under small reads, plan quality on generated SQL, or the cost of converting results. Those three usually decide an AI workload.

Build a replacement benchmark from captured traffic. Log the queries a model generated during a pilot, replay them at target concurrency, and measure p99 with result conversion included. This takes a day and predicts production behavior far better than any published chart.

## Real-Time AI Analytics with Spice

[Spice](/platform/sql-federation-acceleration) is built on Apache DataFusion and Apache Arrow. That supplies the Arrow-native execution and extension points described above. Spice adds the parts a library does not include.

Retrieval runs in the engine through [hybrid SQL search](/platform/hybrid-sql-search), so keyword matching, vector similarity, and structured filters share one plan and one policy. Model calls run as SQL functions through [LLM inference](/platform/llm-inference), which keeps classification and extraction inside the query rather than in orchestration code.

The same runtime federates across [40+ connectors](/integrations) and accelerates the working set locally, so agent read volume does not reach source systems. For deployment planning, review [Spice Cloud pricing](/pricing).

<ContentRichText
  fields={{
    coverage: 'rc-end',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<AccordionFaq
  fields={{
    heading: 'Query Engines for AI Analytics FAQ',
    heading_tag: 'h2',
    paragraph: '',
    items: [
      {
        title: 'What is the best query engine for real-time AI analytics?',
        paragraph:
          '<p>No single engine wins across the requirements. ClickHouse, Druid, and Pinot lead on aggregate latency at concurrency. DataFusion and DuckDB lead on Arrow-native output and embeddability. Choose by whether you are building a platform or operating a finished system.</p>',
      },
      {
        title: 'How is choosing an engine for AI different from choosing one for BI?',
        paragraph:
          '<p>BI queries are written once and tuned. AI queries are generated for every task, so optimizer quality and resource limits matter more than tuned performance. AI workloads also mix retrieval with SQL and send results to models rather than charts.</p>',
      },
      {
        title: 'Why does Arrow-native output matter?',
        paragraph:
          '<p>Results from an AI query usually land in Python, a dataframe library, or a model context. An engine that returns Apache Arrow buffers hands them over without serialization. An engine that returns rows over a text protocol pays a conversion cost on every read.</p>',
      },
      {
        title: 'Should search run in the query engine or in a separate system?',
        paragraph:
          '<p>In the engine, when a task needs keyword matching, vector similarity, and structured filters together. Separate systems force the application to merge results, and filters then apply to one half rather than both. That is where relevance quietly breaks.</p>',
      },
      {
        title: 'What should a benchmark measure for an AI workload?',
        paragraph:
          '<p>Measure p99 latency at the concurrency agents will produce. Measure plan quality on queries a model actually generated. Also measure the cost to convert results into the format the application consumes. Published scan benchmarks measure none of these.</p>',
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<ContentResourceFeatured
  fields={{
    heading: 'Learn more about query execution',
    heading_tag: 'h2',
    paragraph:
      'Documentation and technical resources for query engines, search, and inference.',
    mode: 'default',
    resources: [
      {
        source: 'manual',
        resource: null,
        resource_manual: {
          eyebrow: 'Docs',
          title: {
            title: 'Search and Retrieval Docs',
            url: 'https://spiceai.org/docs/features/search',
            target: '_blank',
          },
          description:
            'Learn how keyword matching, vector similarity, and SQL filters run in a single query plan.',
          image: {
            ID: 1661,
            id: 1661,
            title: 'Docs jpeg',
            filename: 'Docs-jpeg.jpeg',
            filesize: 103192,
            url: '/website-assets/media/2025/12/Docs-jpeg.jpeg',
            link: '/docs-jpeg/',
            alt: '',
            author: '9',
            description: '',
            caption: '',
            name: 'docs-jpeg',
            status: 'inherit',
            uploaded_to: 0,
            date: '2025-12-05 04:13:53',
            modified: '2025-12-05 04:13:53',
            menu_order: 0,
            mime_type: 'image/jpeg',
            type: 'image',
            subtype: 'jpeg',
            icon: '/website-assets/media/default.png',
            width: 1832,
            height: 1036,
            sizes: {
              thumbnail: '/website-assets/media/2025/12/Docs-jpeg-150x150.jpeg',
              'thumbnail-width': 150,
              'thumbnail-height': 150,
              medium: '/website-assets/media/2025/12/Docs-jpeg-300x170.jpeg',
              'medium-width': 300,
              'medium-height': 170,
              medium_large:
                '/website-assets/media/2025/12/Docs-jpeg-768x434.jpeg',
              'medium_large-width': 768,
              'medium_large-height': 434,
              large: '/website-assets/media/2025/12/Docs-jpeg-1024x579.jpeg',
              'large-width': 1024,
              'large-height': 579,
              '1536x1536':
                '/website-assets/media/2025/12/Docs-jpeg-1536x869.jpeg',
              '1536x1536-width': 1536,
              '1536x1536-height': 869,
              '2048x2048': '/website-assets/media/2025/12/Docs-jpeg.jpeg',
              '2048x2048-width': 1832,
              '2048x2048-height': 1036,
            },
          },
        },
      },
      {
        source: 'picker',
        resource: [
          {
            title: 'How We Use Apache DataFusion at Spice AI',
            slug: '/blog/how-we-use-apache-datafusion-at-spice-ai',
            excerpt:
              'How Spice extends DataFusion with table providers, federation analyzers, and custom optimizer rules.',
            image: '/website-assets/media/default.png',
            type: 'Blog',
            taxonomy: ['Spice AI', 'Engineering'],
          },
        ],
        resource_manual: {
          eyebrow: '',
          title: null,
          description: '',
          image: false,
        },
      },
      {
        source: 'picker',
        resource: [
          {
            title: 'Introducing Spice Cayenne: The Next-Generation Data Accelerator Built on Vortex for Performance and Scale',
            slug: '/blog/introducing-spice-cayenne-data-accelerator',
            excerpt:
              'A data accelerator built for multi-terabyte, low-latency workloads using the Vortex columnar format.',
            image: '/website-assets/media/default.png',
            type: 'Blog',
            taxonomy: ['Spice AI', 'Engineering'],
          },
        ],
        resource_manual: {
          eyebrow: '',
          title: null,
          description: '',
          image: false,
        },
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<ContentCta
  fields={{
    override_global_setting: false,
    custom_content: { heading: '', paragraph: '', cta: null },
    padding_top: 'unset',
    padding_bottom: 'unset',
    gcta_heading: 'See Spice in action',
    gcta_paragraph:
      'Get a guided walkthrough of how development teams use Spice to query, accelerate, and integrate AI for mission-critical workloads.',
    gcta_cta: {
      title: 'Get a demo',
      url: 'https://meetings.hubspot.com/lukekim/talk-to-sales',
      target: '_blank',
    },
  }}
/>

---

## What is BM25 Full-Text Search?
URL: https://spice.ai/learn/bm25-full-text-search
Date: 2026-03-05T00:00:00
Description: BM25 (Best Match 25) is the standard ranking function for full-text search. Learn how BM25 scores documents using term frequency, inverse document frequency, and document length normalization, and how it compares to TF-IDF.

<HeroCenteredText
  fields={{
    graphic_position: 'no-graphic',
    heading_tag: 'h1',
    heading: 'What is BM25 Full-Text Search?',
    paragraph:
      'BM25 (Best Match 25) is the standard ranking function used by full-text search engines to score and rank documents by relevance to a query.',
    cta: [
      {
        type: 'filled',
        cta: {
          title: 'See Spice hybrid search',
          url: '/platform/hybrid-sql-search',
          target: '',
        },
      },
      {
        type: 'bordered',
        cta: {
          title: 'Read the docs',
          url: 'https://spiceai.org/docs/features/search',
          target: '',
        },
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<ContentRichText
  fields={{
    coverage: 'rc-start',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

Full-text search is the foundation of information retrieval. When a user types a query, the search system must quickly find the most relevant documents from potentially millions of candidates and rank them in order of relevance. BM25 (Best Match 25) is the ranking function that powers this process in virtually every modern search engine, from Elasticsearch and Apache Lucene to PostgreSQL's full-text search.

BM25 works by scoring each document based on three factors: how often query terms appear in the document (term frequency), how rare those terms are across the entire corpus (inverse document frequency), and how long the document is relative to the average (document length normalization). These three signals combine to produce a relevance score that is remarkably effective across a wide range of search tasks.

## How BM25 Scores Documents

### Term Frequency (TF)

The simplest relevance signal is how many times a query term appears in a document. A document mentioning "kubernetes" ten times is probably more relevant to a query about Kubernetes than one mentioning it once.

But raw term frequency has a problem: the tenth occurrence of a term adds less relevance than the first. BM25 addresses this with a saturation function: term frequency contributes to the score with diminishing returns, controlled by the parameter **k1** (typically set to 1.2). Higher k1 values allow term frequency to keep contributing longer before saturating.

### Inverse Document Frequency (IDF)

Not all terms are equally informative. A search for "kubernetes deployment error" should weight "kubernetes" and "deployment" more heavily than "error," because "error" appears in many more documents and is less discriminating.

IDF measures term rarity across the corpus. Terms that appear in few documents get high IDF scores; terms that appear everywhere get low scores. BM25 uses a logarithmic IDF formula:

```
IDF(t) = log((N - df(t) + 0.5) / (df(t) + 0.5) + 1)
```

Where **N** is the total number of documents and **df(t)** is the number of documents containing term **t**.

### Document Length Normalization

Longer documents naturally contain more term occurrences, but that doesn't make them more relevant. A 10,000-word document mentioning "kubernetes" five times is likely less focused on the topic than a 500-word document with the same count.

BM25 normalizes for document length using the parameter **b** (typically set to 0.75, range 0 to 1). When b = 1, full length normalization is applied: longer documents are penalized proportionally. When b = 0, no normalization is applied. The normalization compares each document's length to the average document length in the corpus.

### The BM25 Formula

Putting it together, the BM25 score for a document **D** given a query **Q** with terms **q1, q2, ..., qn** is:

```
BM25(D, Q) = sum(IDF(qi) * (tf(qi, D) * (k1 + 1)) / (tf(qi, D) + k1 * (1 - b + b * (|D| / avgdl))))
```

Where:

- **tf(qi, D)** is the frequency of term qi in document D
- **|D|** is the document length
- **avgdl** is the average document length across the corpus
- **k1** controls term frequency saturation (default: 1.2)
- **b** controls document length normalization (default: 0.75)

## How Inverted Indexes Power Full-Text Search

BM25 scoring is only half the story. The other half is the data structure that makes it possible to score documents quickly: the **inverted index**.

### Tokenization

Before indexing, raw text is broken into tokens. The sentence "BM25 handles full-text search" might tokenize into: `["bm25", "handles", "full", "text", "search"]`. Tokenization typically includes lowercasing, punctuation removal, and often stemming (reducing words to their root form: "searching" becomes "search").

### Posting Lists

The inverted index maps each unique token to a **posting list**, a sorted list of document IDs where that token appears, along with term frequency and position information:

```
"kubernetes" → [(doc_3, tf=5), (doc_17, tf=2), (doc_42, tf=8), ...]
"deployment" → [(doc_3, tf=3), (doc_8, tf=1), (doc_17, tf=6), ...]
```

### Query Execution

When a query arrives, the search engine:

1. Tokenizes the query into terms
2. Looks up the posting list for each term
3. Intersects or unions the posting lists (depending on AND/OR semantics)
4. Computes BM25 scores for candidate documents
5. Returns the top-k documents sorted by score

This process is fast because posting lists are pre-computed at index time. A multi-term query only needs to scan the posting lists for its specific terms rather than every document in the corpus.

```mermaid
flowchart LR
    A[Query] --> B[Tokenize]
    B --> C[Lookup Inverted Index]
    C --> D[BM25 Score]
    D --> E[Rank]
    E --> F[Results]
```

## BM25 vs. TF-IDF

TF-IDF (Term Frequency-Inverse Document Frequency) is the predecessor to BM25. Both use term frequency and inverse document frequency, but BM25 improves on TF-IDF in two important ways:

1. **Term frequency saturation:** TF-IDF uses raw or log-scaled term frequency, which continues to grow with more occurrences. BM25's saturation function ensures that additional occurrences of a term contribute diminishing marginal relevance, which better reflects how humans judge relevance.

2. **Document length normalization:** TF-IDF has no built-in mechanism for adjusting scores based on document length. BM25's b parameter provides a tunable normalization that penalizes longer documents appropriately.

These differences make BM25 consistently more effective in benchmarks and real-world search applications. TF-IDF is still used in some contexts (notably, as a feature in machine learning pipelines), but BM25 is the default choice for document ranking.

## Full-Text Search in SQL Databases vs. Dedicated Search Engines

Full-text search is available in both SQL databases and dedicated search engines, with different tradeoffs:

**SQL databases** (PostgreSQL, MySQL) provide built-in full-text search using `tsvector` / `tsquery` (PostgreSQL) or `MATCH ... AGAINST` (MySQL). This is convenient (no additional infrastructure) but limited. SQL full-text search typically offers basic BM25-like scoring, limited tokenization options, and slower performance at scale compared to dedicated engines.

**Dedicated search engines** (Elasticsearch, Apache Solr, Meilisearch) are purpose-built for search. They provide advanced tokenization and analyzers, configurable BM25 parameters, faceting, highlighting, suggestions, and horizontal scaling through index sharding. The tradeoff is operational complexity: another system to deploy, monitor, and keep in sync with your primary data store.

## When BM25 Falls Short

BM25 is powerful but limited to lexical matching: it can only find documents that contain the exact terms in the query. This creates a fundamental problem called **vocabulary mismatch**:

- "How do I cancel my subscription?" won't match a document titled "Account termination guide"
- "Fix slow database" won't match "Query performance optimization"
- "ML model serving" won't match "Machine learning inference deployment"

When vocabulary mismatch is a significant problem, consider [hybrid search](/learn/hybrid-search), which combines BM25 full-text search with [vector search](/learn/vector-search) to capture both exact term matches and semantic similarity. Hybrid search uses [embeddings](/learn/embeddings) to understand meaning, while BM25 handles the precise keyword matching that vector search misses.

## BM25 Full-Text Search with Spice

[Spice](/platform/hybrid-sql-search) integrates BM25 full-text search alongside [vector search](/learn/vector-search) and [SQL federation](/learn/sql-federation) in a single unified runtime. Rather than deploying a separate search engine and keeping it synchronized with your data sources, Spice provides full-text search as a native query capability for [application search](/use-case/application-search) workloads.

This means you can:

- Run BM25 full-text search across federated data from [40+ connected sources](/integrations) without maintaining separate search infrastructure
- Combine full-text search with vector similarity in [hybrid search](/learn/hybrid-search) queries using built-in RRF fusion
- Use [real-time CDC](/learn/change-data-capture) to keep search indexes fresh as source data changes
- Express search queries in standard SQL alongside your existing analytical and operational queries

```sql
-- Full-text search in Spice
SELECT * FROM search(
  'knowledge_base',
  'kubernetes deployment error',
  mode => 'fts',
  limit => 10
)
```

The unified approach eliminates the data synchronization problem: when source data changes, both full-text and vector indexes update through the same [change data capture](/learn/change-data-capture) pipeline. This is especially valuable for [RAG applications](/learn/retrieval-augmented-generation) where stale search indexes lead to outdated or incorrect answers.

## Advanced Topics

### Stemming and Analyzers

Tokenization is more nuanced than splitting on whitespace. **Analyzers** are configurable pipelines that process text before indexing and at query time. A typical analyzer includes:

1. **Character filters:** Normalize Unicode, strip HTML tags, or replace patterns
2. **Tokenizer:** Split text into tokens (by whitespace, word boundaries, or n-grams)
3. **Token filters:** Lowercase, remove stop words, apply stemming or lemmatization

**Stemming** reduces words to their root form so that "running," "runs," and "ran" all match the stem "run." Common stemmers include the Porter Stemmer (aggressive, fast) and the Snowball Stemmer (language-aware, more accurate). Stemming improves recall but can reduce precision: "university" and "universe" might stem to the same root.

### Index Sharding

For large corpora, a single inverted index becomes a bottleneck. **Sharding** splits the index across multiple nodes, where each shard holds a subset of documents. A query is broadcast to all shards, each returns its local top-k results, and a coordinator merges the results.

Sharding strategies include document-based sharding (each shard holds a random subset of documents) and term-based sharding (each shard holds posting lists for a subset of terms). Document-based sharding is more common because it distributes load evenly and allows each shard to compute local BM25 scores independently.

### BM25F for Multi-Field Scoring

Documents often have multiple fields: title, body, URL, metadata. A match in the title is typically more relevant than a match in the body. **BM25F** (BM25 with field weights) extends BM25 to handle multi-field documents by computing a weighted combination of term frequencies across fields before applying the BM25 formula.

For example, you might weight title matches 3x higher than body matches and URL matches 2x higher. BM25F computes an effective term frequency as `tf_effective = w_title * tf_title + w_body * tf_body + w_url * tf_url`, then applies the standard BM25 formula using this combined frequency. This produces better rankings than scoring each field independently and combining scores, because the saturation function is applied to the combined frequency rather than to each field separately.

<ContentRichText
  fields={{
    coverage: 'rc-end',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<AccordionFaq
  fields={{
    heading: 'BM25 Full-Text Search FAQ',
    paragraph: '',
    items: [
      {
        title: 'What does BM25 stand for?',
        paragraph:
          '<p>BM25 stands for Best Match 25. It is the 25th iteration of a series of ranking functions developed by Stephen Robertson and Karen Sparck Jones as part of the Okapi information retrieval system in the 1990s. It has become the de facto standard ranking function for full-text search.</p>',
      },
      {
        title: 'What are the default BM25 parameters?',
        paragraph:
          '<p>The two main BM25 parameters are k1 and b. The typical defaults are k1 = 1.2 (controls term frequency saturation; higher values allow term frequency to contribute more) and b = 0.75 (controls document length normalization; higher values penalize longer documents more). These defaults work well for most use cases, but tuning them on your specific data can improve results.</p>',
      },
      {
        title: 'How does BM25 differ from TF-IDF?',
        paragraph:
          '<p>BM25 improves on TF-IDF in two key ways: it applies a saturation function to term frequency (so the 10th occurrence of a term adds less relevance than the first), and it normalizes for document length (so longer documents are not unfairly favored). These improvements make BM25 consistently more effective for document ranking in practice.</p>',
      },
      {
        title: 'When should I use BM25 vs. vector search?',
        paragraph:
          '<p>Use BM25 when queries involve exact terms, identifiers, error codes, or technical terminology that must be matched precisely. Use vector search when queries are conceptual and vocabulary mismatch is likely. For most production systems, hybrid search (combining BM25 and vector search) delivers the best results by capturing both exact matches and semantic similarity.</p>',
      },
      {
        title: 'Can BM25 handle multi-language search?',
        paragraph:
          '<p>Yes, but it requires language-specific configuration. Each language needs appropriate tokenization rules, stop word lists, and stemming algorithms. Most search engines support multiple language analyzers that can be applied per-field or per-index. For multilingual corpora, you can either maintain separate indexes per language or use a language-detection step to route queries to the correct analyzer.</p>',
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<ContentResourceFeatured
  fields={{
    heading: 'Learn more about full-text search',
    paragraph:
      'Technical guides on building full-text and hybrid search with BM25, vector similarity, and SQL in a single runtime.',
    mode: 'default',
    resources: [
      {
        source: 'manual',
        resource: null,
        resource_manual: {
          eyebrow: 'Docs',
          title: {
            title: 'Search Docs',
            url: 'https://spiceai.org/docs/features/search',
            target: '_blank',
          },
          description:
            'Learn how Spice provides full-text, semantic, and hybrid search capabilities in a single SQL-native runtime.',
          image: {
            ID: 1661,
            id: 1661,
            title: 'Docs jpeg',
            filename: 'Docs-jpeg.jpeg',
            filesize: 103192,
            url: '/website-assets/media/2025/12/Docs-jpeg.jpeg',
            link: '/docs-jpeg/',
            alt: '',
            author: '9',
            description: '',
            caption: '',
            name: 'docs-jpeg',
            status: 'inherit',
            uploaded_to: 0,
            date: '2025-12-05 04:13:53',
            modified: '2025-12-05 04:13:53',
            menu_order: 0,
            mime_type: 'image/jpeg',
            type: 'image',
            subtype: 'jpeg',
            icon: '/website-assets/media/default.png',
            width: 1832,
            height: 1036,
            sizes: {
              thumbnail: '/website-assets/media/2025/12/Docs-jpeg-150x150.jpeg',
              'thumbnail-width': 150,
              'thumbnail-height': 150,
              medium: '/website-assets/media/2025/12/Docs-jpeg-300x170.jpeg',
              'medium-width': 300,
              'medium-height': 170,
              medium_large:
                '/website-assets/media/2025/12/Docs-jpeg-768x434.jpeg',
              'medium_large-width': 768,
              'medium_large-height': 434,
              large: '/website-assets/media/2025/12/Docs-jpeg-1024x579.jpeg',
              'large-width': 1024,
              'large-height': 579,
              '1536x1536':
                '/website-assets/media/2025/12/Docs-jpeg-1536x869.jpeg',
              '1536x1536-width': 1536,
              '1536x1536-height': 869,
              '2048x2048': '/website-assets/media/2025/12/Docs-jpeg.jpeg',
              '2048x2048-width': 1832,
              '2048x2048-height': 1036,
            },
          },
        },
      },
      {
        source: 'picker',
        resource: [
          {
            title:
              'True Hybrid Search: Vector, Full-Text, and SQL in One Runtime',
            slug: '/blog/true-hybrid-search',
            excerpt:
              'Build hybrid search without managing multiple systems. Query vectors, run full-text search, and execute SQL in one unified runtime.',
            image: '/website-assets/media/2025/09/image-33.png',
            type: 'Blog',
            taxonomy: ['Spice AI'],
          },
        ],
        resource_manual: {
          eyebrow: '',
          title: null,
          description: '',
          image: false,
        },
      },
      {
        source: 'picker',
        resource: [
          {
            title:
              'Real-Time Hybrid Search Using RRF: A Hands-On Guide with Spice',
            slug: '/blog/real-time-hybrid-search-using-rrf',
            excerpt:
              'Learn how to build hybrid search with RRF directly in SQL using Spice, combining text, vector, and time-based relevance in one query.',
            image:
              '/website-assets/media/2025/11/68fa4fdfded26b3b6472a172_image-8.png',
            type: 'Blog',
            taxonomy: ['Search', 'Spice AI'],
          },
        ],
        resource_manual: {
          eyebrow: '',
          title: null,
          description: '',
          image: false,
        },
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<TalkToAnEngineerCta />

---

## Cache Invalidation at Scale: Why Manual Strategies Break
URL: https://spice.ai/learn/cache-invalidation-at-scale
Date: 2026-08-05T00:00:00
Description: Learn why TTLs, purge-on-write, and event-driven cache invalidation break down as systems scale, and how declarative refresh policies replace hand-written invalidation logic.

<HeroCenteredText
  fields={{
    graphic_position: 'no-graphic',
    heading_tag: 'h1',
    heading: 'Cache Invalidation at Scale: Why Manual Strategies Break',
    paragraph:
      'Every cache invalidation strategy is an answer to the same question: how does the cache find out the source data changed? At scale, the manual answers (TTLs, purges, events) each break in a characteristic way.',
    cta: [
      {
        type: 'filled',
        cta: {
          title: 'See the Spice data platform',
          url: '/platform/sql-federation-acceleration',
          target: '',
        },
      },
      {
        type: 'bordered',
        cta: {
          title: 'Read the data refresh docs',
          url: 'https://spiceai.org/docs/features/data-acceleration/data-refresh',
          target: '_blank',
        },
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<ContentRichText
  fields={{
    coverage: 'rc-start',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

"There are only two hard things in Computer Science: cache invalidation and naming things," as Phil Karlton put it. The joke endures because the first half keeps proving itself in production. Invalidation is hard for a structural reason: a cache stores answers, and nothing in its design tells it when the source data behind those answers changed. Every invalidation strategy is a workaround for that missing signal, and every workaround makes assumptions that stop holding as a system grows.

This guide covers the five manual invalidation strategies, the specific way each one breaks at scale, and an alternative model (declarative refresh) that removes invalidation logic from application code entirely.

## Why Invalidation Is the Hard Half of Caching

Adding a cache is easy: check the cache, on a miss fetch from the source and store the result. The hard part arrives with the first write. From that moment, two copies of the truth exist, and the cache serves its copy without knowing whether it is still true.

Invalidation is the mechanism that reconciles the copies, and it faces an unavoidable tension. Invalidate too eagerly and the cache stops paying for itself: hit rates fall and load returns to the source. Invalidate too lazily and the application serves stale data, with consequences ranging from a cosmetic wrong count to a customer seeing another tenant's pricing. Every strategy below picks a different point on that spectrum, and every one of them requires the application to correctly predict when staleness matters.

## The Five Manual Invalidation Strategies

### Time-to-live (TTL)

Each cache entry expires after a fixed interval. TTL is the default strategy because it requires no coordination: no write path needs to know the cache exists. Its correctness depends entirely on choosing the right interval, which is a prediction about how often data changes and how much staleness readers tolerate.

### Stale-while-revalidate (serve stale, refresh behind)

A refinement of TTL rather than a new signal: past the TTL, the cache keeps serving the expired entry for an additional window while it refreshes that entry in the background. Readers never wait for the refresh, so the latency cliff at every expiry disappears and the source sees one refresh per key instead of a burst from every request that arrived at the moment of expiry.

Two parameters define the contract: `max-age` (how long an entry is considered fresh) and `stale-while-revalidate` (how much longer a stale entry may still be served). Past the sum of the two, the entry is a miss and the request waits. The same directives are standard in HTTP `Cache-Control`, which is why CDNs and browsers implement the pattern natively.

Stale-while-revalidate is the strategy to reach for when the cost of a miss is high and bounded staleness is acceptable, because it decouples those two questions that a single TTL has to answer at once. What it does not do is tell the cache that the data changed, so it inherits every correctness property of the TTL it extends.

### Purge on write (explicit invalidation)

Code that modifies data also deletes or updates the affected cache entries. This keeps the cache fresh at the cost of coupling: every writer must know every cache key its writes affect, and every new cache adds work to every existing write path.

### Event-driven invalidation

Writers publish change events to a message bus, and a consumer translates events into cache deletions. This decouples writers from caches (writers only know about the bus), at the cost of new infrastructure and a new failure domain: the pipeline that delivers events now sits between the source of truth and cache correctness.

### Versioned keys

Cache keys embed a version or generation number, and writes increment the version, making all old entries unreachable rather than deleted. Versioning avoids explicit deletion and makes invalidation atomic, but it requires a fast, consistent lookup of the current version on every read, and orphaned entries occupy memory until eviction reclaims them.

## Where Each Strategy Breaks at Scale

At small scale, all five strategies work well enough that teams rarely think about them. Scale changes that in predictable ways.

**TTLs become a fleet-wide guess.** One service with one cache can tune a TTL by observation. Fifty services with caches over hundreds of datasets cannot: change rates differ per dataset and per tenant, and the safe-everywhere TTL is short enough that hit rates collapse. Teams end up with TTLs that are simultaneously too long for correctness-sensitive data and too short for expensive queries, because a single number is answering two unrelated questions (how fresh must this be, and how costly is a miss).

**Stale-while-revalidate widens the staleness bound it was meant to manage.** It is the most effective of the manual strategies at the problem it targets (miss latency and expiry stampedes), and it is routinely mistaken for a freshness improvement. It is the opposite: the worst-case age of a served answer rises from `max-age` to `max-age + stale-while-revalidate`, and the entry that a reader receives during revalidation is, by construction, known to be expired. The benefit is also asymmetric across a workload, because a key that is read once per hour is revalidated by that read and served stale every time, while a hot key is effectively always fresh. Deployments that skip single-in-flight revalidation get the worst outcome available: every request past expiry starts its own refresh, turning the stampede the pattern exists to prevent into a stampede against the source.

**Purge-on-write accumulates until writes are afraid to change.** Coupling grows quadratically in practice: each new cache multiplies the invalidation code in each write path, and each new write path must learn about every existing cache. Miss one site and the bug is silent staleness, found weeks later. The invalidation logic also becomes the reason schema and query changes are risky, because renaming a field means auditing every key-construction site that references it.

**Event pipelines reorder and drop.** At scale, the event bus delivers invalidation messages late, out of order, or (during incidents) not at all. An invalidation that arrives before its write commits deletes a valid entry and then caches the pre-write value on the next read, pinning stale data until the next event. Because the failure mode is an absence (a deletion that never happened), it produces no error, only wrong answers.

**Races defeat even correct-looking code.** The classic sequence: request A misses the cache and reads from the source; a write commits and purges the cache; request A, holding the older value, populates the cache. The stale value now persists indefinitely under a strategy that "purges on every write." Preventing this requires compare-and-set operations, lease tokens, or ordering guarantees that most cache deployments do not provide, and the race window widens as read traffic and source latency grow.

**Layers compound staleness.** Production systems rarely have one cache: a CDN, an application-level cache, and a database buffer sit in series, each with its own policy. Effective staleness is the sum along the path, and invalidating one layer while another still holds the old value produces the inconsistency users actually see. Reasoning about freshness now requires reasoning about the composition of every layer's strategy.

```mermaid
flowchart TD
    W[Write commits] --> B{How does the cache find out?}
    B -->|TTL| T[Nothing happens until expiry]
    B -->|Stale-while-revalidate| S[Stale answer served while a refresh runs]
    B -->|Purge on write| P[Writer must know every affected key]
    B -->|Event-driven| E[Bus may deliver late, reordered, or never]
    B -->|Versioned keys| V[Version lookup on every read]
    W2[Write commits] -->|CDC stream| R[Replica applies change within seconds]
    R --> Q[All queries see the update]
```

## Declarative Refresh: Freshness as Configuration

The alternative to smarter invalidation is to remove the question invalidation answers. Instead of caching query results and guessing when they died, [data acceleration](/learn/data-acceleration) maintains a queryable replica of the dataset itself and updates it through a declared policy:

- **Scheduled refresh:** the replica reloads on an interval. Staleness is bounded by the interval, explicitly and per dataset, rather than emergently by TTL interactions.
- **Append refresh:** for time-series and event data, only new rows are fetched, keeping refresh cheap for datasets that grow rather than mutate.
- **Change data capture:** the replica subscribes to the source's change stream and applies every insert, update, and delete within seconds. [Change data capture](/learn/change-data-capture) gives near-real-time freshness with no per-key logic, because the signal invalidation always lacked (the source announcing its own changes) is the input.

The structural difference from invalidation is where the logic lives. Refresh policy is configuration on the data layer: one declaration per dataset, enforced by infrastructure. Invalidation is code in the application: one decision per cache key per write path, enforced by review and testing. As the number of services and datasets grows, one declaration per dataset scales; one decision per write path does not.

Refresh-based replicas also change what a "miss" means. A result cache misses whenever a query has not been seen before, so varied workloads pay source latency constantly. A replica serves any query over the dataset, including ones never run before, at local latency. The comparison between the two models is covered in depth in [caching vs data acceleration](/learn/caching-vs-data-acceleration).

## Choosing Between Invalidation and Refresh

Manual invalidation remains the right tool in specific shapes: session tokens, rendered page fragments, and computed values that have no underlying queryable dataset, where reads repeat on identical keys and a small hot set covers most traffic. A key-value cache with a sensible TTL is simpler than any replica, and staleness in a session cache is rarely a correctness bug.

The balance tips toward declarative refresh when the cached data is relational or queryable, when query shapes vary, when several services need the same fresh view (fan-out invalidation is where coupling grows fastest), when staleness bounds must be explicit and auditable, or when invalidation bugs have already caused production incidents. A useful heuristic: if the team maintains a document explaining which caches to purge when a given table changes, the system has outgrown manual invalidation.

## Advanced Topics

### Bounded staleness as a contract

Refresh-based systems make staleness a number: a dataset refreshed every 60 seconds, or a CDC stream with observed lag under 2 seconds, gives every consumer the same explicit freshness bound. This turns a vague quality ("the cache is usually pretty fresh") into a contract that can be monitored and alerted on, the same way latency SLOs are. Invalidation-based systems have no equivalent single number, because effective staleness depends on TTL choices, event delivery, and race timing across every key.

### Invalidation in multi-region topologies

Cross-region replication makes purge-based strategies strictly harder: a purge issued in one region must propagate to caches in every region, racing against both the data replication stream and concurrent reads that can re-populate a remote cache with pre-replication data. Most teams fall back to short TTLs as a safety net, which surrenders the hit-rate benefits that justified the cache. CDC-fed replicas sidestep the coordination because each region's replica subscribes to the same ordered change stream and converges independently.

### Negative caching and deletions

Caching the absence of data ("no such user") is often necessary to stop repeated misses from hammering the source, but negative entries are the easiest to leave stale: creation events must invalidate them, and few invalidation designs remember to. Deletions are the mirror problem for replicas: append-only refresh never observes a delete, which is why mutable datasets need either full refresh or CDC, where deletes arrive as explicit events in the stream.

## Replacing Invalidation with Spice

[Spice](/platform/sql-federation-acceleration) implements declarative refresh as a property of every accelerated dataset: a spicepod declares the dataset, the engine that materializes it (in-memory Apache Arrow, embedded DuckDB or SQLite, or Cayenne), and the refresh policy (full, append, or continuous via [real-time change data capture](/feature/real-time-change-data-capture)). No invalidation code exists in the application; services query the runtime with plain SQL and every query reflects the current replica.

Where a workload genuinely wants stale-while-revalidate rather than a replica, the runtime implements it directly, so it stays configuration rather than application code. The query results cache takes a `stale_while_revalidate_ttl` alongside its `item_ttl`: a result past its TTL but inside that window is returned immediately while the query is re-run in the background, responses carry the matching `Cache-Control: max-age=…, stale-while-revalidate=…` directives so CDNs and browsers extend the same policy outward, and a client can widen its own tolerance per request with `Cache-Control: max-stale=<seconds>`. Revalidation is single-in-flight per cache key, which is the property that separates the pattern from a stampede. Accelerated datasets have the equivalent controls at the dataset level (`caching_ttl`, `caching_stale_while_revalidate_ttl`, and `caching_stale_if_error`, which serves the expired copy when the source errors rather than failing the read).

Both layers still make the trade explicit: past `ttl + stale_while_revalidate_ttl` an entry is a miss, not a slightly older answer. That is the difference from a refresh policy, which has no expiry to fall off, and it is why the two compose well: stale-while-revalidate absorbs the latency of the queries you can predict, and a refreshed replica answers the ones you cannot.

The same mechanism powers the [analytics replica pattern](/platform/analytics): a continuously synchronized, queryable copy of an operational database that absorbs read traffic (dashboards, APIs, AI agents) without invalidation logic or load on the source. Twilio runs this architecture in its messaging control plane at P99 query times under 5 milliseconds, with datasets kept current from sources across [40+ connectors](/integrations) rather than by hand-written purge paths.

<ContentRichText
  fields={{
    coverage: 'rc-end',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<AccordionFaq
  fields={{
    heading: 'Cache Invalidation at Scale FAQ',
    paragraph: '',
    items: [
      {
        title: 'Why is cache invalidation considered so hard?',
        paragraph:
          '<p>A cache stores answers to past requests, and nothing in its design tells it when the source data behind those answers changed. Every invalidation strategy (TTLs, purge-on-write, events, versioned keys) is a workaround for that missing signal, and each one embeds a prediction about change rates, write paths, or event delivery that stops holding as the system grows.</p>',
      },
      {
        title: 'What is the difference between TTL and event-driven invalidation?',
        paragraph:
          '<p>TTL expires each cache entry after a fixed interval, requiring no coordination but guaranteeing a staleness window up to that interval. Event-driven invalidation deletes entries when writers publish change events to a message bus, which shortens the staleness window but adds infrastructure and a new failure mode: late, reordered, or dropped events silently pin stale data in the cache.</p>',
      },
      {
        title: 'What is declarative refresh?',
        paragraph:
          '<p>Declarative refresh replaces per-key invalidation logic with a policy declared on the dataset itself: reload on a schedule, append new rows for time-series data, or apply changes continuously from a change data capture stream. The data layer enforces the policy, so freshness becomes explicit, per-dataset configuration instead of code scattered through application write paths.</p>',
      },
      {
        title: 'How does change data capture eliminate invalidation logic?',
        paragraph:
          '<p>Change data capture (CDC) streams every committed insert, update, and delete from the source database to the replica, typically within seconds. The replica applies changes in order, so queries always see a recent, consistent view without any application code deciding what to purge. CDC supplies the signal manual invalidation always lacked: the source announcing its own changes.</p>',
      },
      {
        title: 'When is manual invalidation still the right choice?',
        paragraph:
          '<p>When the cached values have no underlying queryable dataset and reads repeat on identical keys: session tokens, rendered page fragments, feature flags, and computed one-off values. In those shapes a key-value cache with a TTL is simpler than any replica, staleness is rarely a correctness bug, and a small hot set keeps hit rates high.</p>',
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<ContentResourceFeatured
  fields={{
    heading: 'Learn more about refresh-based architectures',
    paragraph:
      'Guides and blog posts on keeping data fresh without hand-written invalidation.',
    mode: 'default',
    resources: [
      {
        source: 'manual',
        resource: null,
        resource_manual: {
          eyebrow: 'Docs',
          title: {
            title: 'Data Refresh Docs',
            url: 'https://spiceai.org/docs/features/data-acceleration/data-refresh',
            target: '_blank',
          },
          description:
            'Learn how Spice keeps accelerated datasets current with full, append, and CDC-driven refresh policies declared per dataset.',
          image: {
            ID: 1661,
            id: 1661,
            title: 'Docs jpeg',
            filename: 'Docs-jpeg.jpeg',
            filesize: 103192,
            url: '/website-assets/media/2025/12/Docs-jpeg.jpeg',
            link: '/docs-jpeg/',
            alt: '',
            author: '9',
            description: '',
            caption: '',
            name: 'docs-jpeg',
            status: 'inherit',
            uploaded_to: 0,
            date: '2025-12-05 04:13:53',
            modified: '2025-12-05 04:13:53',
            menu_order: 0,
            mime_type: 'image/jpeg',
            type: 'image',
            subtype: 'jpeg',
            icon: '/website-assets/media/default.png',
            width: 1832,
            height: 1036,
            sizes: {
              thumbnail: '/website-assets/media/2025/12/Docs-jpeg-150x150.jpeg',
              'thumbnail-width': 150,
              'thumbnail-height': 150,
              medium: '/website-assets/media/2025/12/Docs-jpeg-300x170.jpeg',
              'medium-width': 300,
              'medium-height': 170,
              medium_large:
                '/website-assets/media/2025/12/Docs-jpeg-768x434.jpeg',
              'medium_large-width': 768,
              'medium_large-height': 434,
              large: '/website-assets/media/2025/12/Docs-jpeg-1024x579.jpeg',
              'large-width': 1024,
              'large-height': 579,
              '1536x1536':
                '/website-assets/media/2025/12/Docs-jpeg-1536x869.jpeg',
              '1536x1536-width': 1536,
              '1536x1536-height': 869,
              '2048x2048': '/website-assets/media/2025/12/Docs-jpeg.jpeg',
              '2048x2048-width': 1832,
              '2048x2048-height': 1036,
            },
          },
        },
      },
      {
        source: 'picker',
        resource: [
          {
            title: 'Real-Time Control Plane Acceleration with DynamoDB Streams',
            slug: '/blog/real-time-acceleration-with-dynamodb-streams',
            excerpt:
              'How to sync DynamoDB data to thousands of nodes with sub-second latency using a two-tier architecture with DynamoDB Streams and Spice acceleration.',
            image: '/website-assets/media/2026/01/image-33.png',
            type: 'Blog',
            taxonomy: ['Data Acceleration', 'Engineering'],
          },
        ],
        resource_manual: {
          eyebrow: '',
          title: null,
          description: '',
          image: false,
        },
      },
      {
        source: 'picker',
        resource: [
          {
            title:
              'The Analytics Replica Pattern: The Shortest Path to Data-Grounded AI',
            slug: '/blog/the-analytics-replica-pattern-shortening-the-path-to-data-based-ai',
            excerpt:
              'The analytics replica pattern keeps operational systems isolated while delivering real-time analytical queries for AI agents and dashboards, without ETL or operational risk.',
            image:
              '/website-assets/media/2026/07/spice-analytics-replica-blog-header.svg',
            type: 'Blog',
            taxonomy: ['Spice AI', 'Engineering'],
          },
        ],
        resource_manual: {
          eyebrow: '',
          title: null,
          description: '',
          image: false,
        },
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<ContentCta
  fields={{
    override_global_setting: false,
    custom_content: { heading: '', paragraph: '', cta: null },
    padding_top: 'unset',
    padding_bottom: 'unset',
    gcta_heading: 'See Spice in action',
    gcta_paragraph:
      'Get a guided walkthrough of how development teams use Spice to query, accelerate, and integrate AI for mission-critical workloads.',
    gcta_cta: {
      title: 'Get a demo',
      url: 'https://meetings.hubspot.com/lukekim/talk-to-sales',
      target: '_blank',
    },
  }}
/>

---

## Caching vs Data Acceleration: How to Choose
URL: https://spice.ai/learn/caching-vs-data-acceleration
Date: 2026-08-05T00:00:00
Description: Compare caching and data acceleration: two approaches to making data access faster. Learn the key differences in invalidation, freshness, query flexibility, and operational cost, and when each approach fits.

<HeroCenteredText
  fields={{
    graphic_position: 'no-graphic',
    heading_tag: 'h1',
    heading: 'Caching vs Data Acceleration',
    paragraph:
      'Caching stores the results of previous work for reuse, while data acceleration maintains a queryable, automatically refreshed copy of the data itself. The two approaches differ in invalidation, freshness, and query flexibility, and the right choice depends on the access pattern.',
    cta: [
      {
        type: 'filled',
        cta: {
          title: 'See Spice data platform',
          url: '/platform/sql-federation-acceleration',
          target: '',
        },
      },
      {
        type: 'bordered',
        cta: {
          title: 'Read the docs',
          url: 'https://spiceai.org/docs/features/data-acceleration',
          target: '_blank',
        },
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<ContentRichText
  fields={{
    coverage: 'rc-start',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

When queries against a database, warehouse, or data lake are too slow or too expensive to run on every request, engineering teams reach for one of two patterns: cache the results, or accelerate the data.

Caching stores the output of previous work (a query result, a rendered page, a computed value) in a fast lookup store such as Redis or Memcached. The next request for the same key skips the expensive work entirely. The cache holds answers, not data: it can only return what was already asked.

[Data acceleration](/learn/data-acceleration) takes a different approach. Instead of storing results, it materializes the underlying dataset into a local query engine and keeps that copy current automatically. Any query against the dataset (including ones never run before) executes locally at low latency, because the data itself is close to the application.

The two patterns are often conflated because both make reads faster. They behave very differently in production. This guide explains how each works, compares them across the dimensions that matter, and provides a decision framework for choosing between them.

## How Caching Works

A cache is a fast key-value store that sits between the application and the system of record. The most common pattern is cache-aside: the application checks the cache first, and on a miss it queries the source, stores the result under a key, and serves the response. Subsequent requests for the same key are served from memory in microseconds to low milliseconds.

Key characteristics of caching:

- **Result-oriented:** The cache stores answers to specific requests. A cached result for one query says nothing about a slightly different query, which must go back to the source.
- **Manual invalidation:** The application decides when cached entries are stale. Time-to-live (TTL) values, explicit invalidation on write, and versioned keys are all strategies for the same underlying problem: the cache does not know when the source data changed.
- **Cold-miss latency:** Every miss pays full source latency plus the cost of populating the cache. Latency is bimodal: fast on hits, slow on misses.
- **Low operational footprint per entry:** Caches store only what was requested, so memory usage tracks the working set of hot keys rather than the size of the source dataset.

Caching excels when the same requests repeat frequently, when slightly stale results are acceptable, and when the application can tolerate the occasional slow miss. It struggles when queries are varied or ad hoc, and [cache invalidation](/learn/cache-invalidation-at-scale) logic is a well-known source of production bugs: choosing TTLs is a guess, and explicit invalidation couples every write path to the cache.

## How Data Acceleration Works

Data acceleration materializes source data into a local, query-optimized engine co-located with the application. Rather than remembering past answers, the acceleration layer holds the data itself (a table, a filtered subset, or a set of columns) and answers arbitrary queries against it with the full expressiveness of SQL.

```mermaid
flowchart LR
    A[Application query] --> B{Cache or accelerator?}
    B -->|Cache| C[Key lookup]
    C -->|Hit| D[Cached result]
    C -->|Miss| E[Query source, store result]
    B -->|Accelerator| F[Local SQL engine]
    F --> G[Fresh local data]
    G -->|Refreshed by CDC or schedule| H[(Source system)]
```

Key characteristics of data acceleration:

- **Data-oriented:** The accelerated copy serves any query over the dataset: new filters, joins, and aggregations all run locally without ever having been asked before.
- **Declarative refresh:** Freshness is a configuration, not application logic. The acceleration layer keeps the copy current on a schedule or continuously through [change data capture](/learn/change-data-capture), so there is no invalidation code to write or get wrong.
- **Consistent latency:** Because the whole dataset is local, there are no cold misses. Every query runs at local-engine speed, which makes latency predictable rather than bimodal.
- **Storage proportional to data:** The accelerator stores the materialized dataset (or the configured subset), so its footprint tracks data volume rather than request volume.

Acceleration excels when query shapes vary, when predictable low latency matters more than per-entry memory efficiency, and when teams want freshness handled by infrastructure rather than by hand-written invalidation logic.

## Key Differences: Side-by-Side Comparison

The following table summarizes how the two approaches differ across the dimensions that matter most in production.

| Dimension                | Caching                                                               | Data Acceleration                                                          |
| ------------------------ | --------------------------------------------------------------------- | -------------------------------------------------------------------------- |
| **What is stored**       | Results of previous requests, keyed by request identity               | The dataset itself, materialized into a local query engine                 |
| **Query flexibility**    | Exact-match lookups only; new queries always miss                     | Arbitrary SQL: filters, joins, and aggregations never seen before          |
| **Freshness model**      | TTLs and explicit invalidation written into application code          | Declarative refresh: scheduled or continuous via change data capture       |
| **Miss behavior**        | Bimodal latency; misses pay full source latency plus cache population | No misses; every query runs against local data                             |
| **Consistency risk**     | Stale entries served until TTL expiry or invalidation fires           | Bounded staleness set by the refresh interval or CDC lag                   |
| **Memory/storage cost**  | Proportional to the hot working set of requests                       | Proportional to the materialized dataset size                              |
| **Application coupling** | Cache checks and invalidation logic live in application code          | Applications issue plain SQL; the acceleration layer is transparent        |
| **Best for**             | Repeated identical reads, session data, rendered fragments            | Varied query workloads, dashboards, APIs, and AI agents over changing data |

Neither column wins outright. A cache is hard to beat for repeated identical lookups against a small hot set, while acceleration is built for workloads where the next query is not predictable from the last one.

## Decision Framework

Choosing between caching and data acceleration comes down to four questions about the workload.

### 1. How repetitive are the reads?

If the same keys are requested over and over (user sessions, feature flags, a product page rendered thousands of times), a cache converts that repetition directly into hit rate, and hit rate is the whole value of a cache. If queries vary (different filters per user, ad-hoc analytics, AI agents composing their own SQL), hit rates collapse and most requests pay source latency anyway. Varied workloads point to acceleration.

### 2. How should freshness be managed?

With a cache, freshness is the application's job: pick TTLs, wire invalidation into write paths, and accept that both will sometimes be wrong. With acceleration, freshness is declared once (a refresh interval, or continuous [change data capture](/learn/change-data-capture)) and enforced by the data layer. Teams that have been burned by invalidation bugs, or that need many services to see the same fresh view without coordinating invalidation across them, should weight this factor heavily.

### 3. Does the workload need query flexibility?

A cache returns exactly what was stored. If the application needs to slice data differently per request (filter by tenant, join against reference data, aggregate over a time window), those operations need a query engine, not a lookup table. Acceleration keeps full SQL available at local latency. If every read is a point lookup by primary key, that flexibility is unnecessary and a cache is simpler.

### 4. What latency profile is acceptable?

Caches deliver excellent average latency but bimodal tail latency: hits are fast, misses are as slow as the source. If P99 latency matters (request paths with strict budgets, user-facing APIs), the misses dominate the experience. Acceleration trades a larger storage footprint for flat, predictable latency across every query.

### Quick Reference

- **Choose caching** when reads repeat on identical keys, the hot set is small relative to the data, occasional slow misses are tolerable, and the team can own invalidation logic.
- **Choose data acceleration** when query shapes vary, tail latency must be predictable, freshness should be declarative rather than hand-coded, or many consumers need the same current view of the data.
- **Use both** when an application has both patterns: a cache in front of rendered responses, and an accelerated dataset underneath for the queries that build them.

## Advanced Topics

### Cache Stampede and Thundering Herds

When a popular cache entry expires, every concurrent request misses at once and hammers the source with identical queries. This stampede can take down the system the cache was protecting. Mitigations include request coalescing (one loader per key, other requests wait), probabilistic early refresh (entries refresh slightly before expiry with randomized jitter), and stale-while-revalidate serving. All add complexity to what began as a simple lookup. Acceleration sidesteps the problem structurally: there is no per-entry expiry, so there is no synchronized miss. The refresh process runs independently of request traffic, and query load never transfers to the source.

### Write Strategies: Cache-Aside, Write-Through, and Refresh-Ahead

Cache architectures differ in how data enters the cache. Cache-aside populates on read misses and is the default because it is simple and lazy. Write-through updates the cache synchronously on every write, keeping it current at the cost of write latency and wasted work for entries never read. Refresh-ahead predicts which entries will be requested and refreshes them before expiry, which works only when access patterns are predictable. Each strategy is a different answer to the same question acceleration answers declaratively: how does new data reach the fast copy? With CDC-based acceleration, source writes stream to the local copy within seconds, independent of the application's read and write paths.

### Partial Materialization in Acceleration Layers

Accelerating an entire table is unnecessary when the workload touches a predictable subset. Acceleration layers reduce footprint through refresh filters (materialize only rows matching a predicate, such as the last 90 days), column projection (materialize only the columns queries actually read), and per-dataset engine selection (in-memory formats for small hot datasets, disk-backed engines for larger ones). These controls put the storage cost of acceleration on a dial: the trade is between local coverage and footprint, with queries outside the materialized subset federating back to the source. This is the same working-set thinking that sizes a cache, applied at the dataset level instead of the key level.

## Data Acceleration with Spice

[Spice](/platform/sql-federation-acceleration) implements data acceleration as a core primitive of its SQL federation runtime. Datasets from any of its [40+ connectors](/integrations) can be accelerated into in-memory Apache Arrow, embedded DuckDB or SQLite, or the purpose-built Cayenne engine, selected per dataset in configuration. Refresh is declarative: full reloads on a schedule, append-only refresh for time-series data, or continuous updates through [real-time change data capture](/feature/real-time-change-data-capture).

Queries route transparently. Applications send SQL to a single endpoint, and Spice serves accelerated datasets locally while federating everything else to its source. A dataset can move from federated to accelerated with a configuration change and no application changes, which makes the caching-versus-acceleration decision reversible: start federated, observe the query patterns, and accelerate the datasets that need it.

This pattern runs in production at scale. Twilio uses Spice to accelerate control-plane datasets in its messaging runtime, reaching P99 query times under 5 milliseconds with automatic failover to object storage, and Barracuda cut email archive queries from a P99 of 2 minutes to 100-200 milliseconds using the [data lake accelerator](/use-case/datalake-accelerator) pattern. For teams weighing a cache in front of an operational database, the [analytics replica](/platform/analytics) approach offers a third option: a continuously synchronized, queryable copy that offloads read traffic without invalidation logic.

<ContentRichText
  fields={{
    coverage: 'rc-end',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<AccordionFaq
  fields={{
    heading: 'Caching vs Data Acceleration FAQ',
    paragraph: '',
    items: [
      {
        title: 'Is data acceleration the same as caching?',
        paragraph:
          '<p>No. A cache stores the results of previous requests and can only return what was already asked, while data acceleration materializes the dataset itself into a local query engine. An accelerated dataset answers arbitrary SQL queries, including ones never run before, and stays current through declarative refresh rather than hand-written invalidation logic.</p>',
      },
      {
        title: 'Can data acceleration replace a Redis cache?',
        paragraph:
          '<p>It depends on the workload. For repeated exact-key lookups over a small hot set, a key-value cache remains simpler and more memory-efficient. Data acceleration is the better fit when queries vary, when tail latency must be predictable, or when invalidation logic has become a source of bugs. Many production systems use both for different layers of the stack.</p>',
      },
      {
        title: 'How does data acceleration stay fresh without invalidation?',
        paragraph:
          '<p>The acceleration layer refreshes the materialized copy automatically: on a configured schedule, through append-only refresh for time-series data, or continuously via change data capture (CDC), which streams source changes to the local copy within seconds. Freshness becomes a declared property of the dataset instead of logic scattered through application write paths.</p>',
      },
      {
        title: 'When is a cache still the right choice?',
        paragraph:
          '<p>Caching wins when the same requests repeat frequently on identical keys: session data, feature flags, rendered pages, and computed fragments. In these cases hit rates are high, memory usage tracks only the hot set, and the complexity of invalidation is manageable. The case for a cache weakens as query variety grows, because varied requests rarely hit.</p>',
      },
      {
        title: 'How does Spice implement data acceleration?',
        paragraph:
          '<p>Spice materializes datasets from connected sources into a local engine (in-memory Apache Arrow, embedded DuckDB or SQLite, or the Cayenne accelerator) selected per dataset. Refresh is configured declaratively, including continuous <a href="/feature/real-time-change-data-capture">change data capture</a>, and queries route transparently between accelerated and federated paths through a single SQL endpoint.</p>',
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<ContentResourceFeatured
  fields={{
    heading: 'Learn more about data acceleration',
    paragraph:
      'Guides and blog posts on accelerating data for low-latency applications and AI workloads.',
    mode: 'default',
    resources: [
      {
        source: 'manual',
        resource: null,
        resource_manual: {
          eyebrow: 'Docs',
          title: {
            title: 'Data Acceleration Docs',
            url: 'https://spiceai.org/docs/features/data-acceleration',
            target: '_blank',
          },
          description:
            'Learn how Spice materializes and refreshes datasets locally for sub-second queries across in-memory and embedded engines.',
          image: {
            ID: 1661,
            id: 1661,
            title: 'Docs jpeg',
            filename: 'Docs-jpeg.jpeg',
            filesize: 103192,
            url: '/website-assets/media/2025/12/Docs-jpeg.jpeg',
            link: '/docs-jpeg/',
            alt: '',
            author: '9',
            description: '',
            caption: '',
            name: 'docs-jpeg',
            status: 'inherit',
            uploaded_to: 0,
            date: '2025-12-05 04:13:53',
            modified: '2025-12-05 04:13:53',
            menu_order: 0,
            mime_type: 'image/jpeg',
            type: 'image',
            subtype: 'jpeg',
            icon: '/website-assets/media/default.png',
            width: 1832,
            height: 1036,
            sizes: {
              thumbnail: '/website-assets/media/2025/12/Docs-jpeg-150x150.jpeg',
              'thumbnail-width': 150,
              'thumbnail-height': 150,
              medium: '/website-assets/media/2025/12/Docs-jpeg-300x170.jpeg',
              'medium-width': 300,
              'medium-height': 170,
              medium_large:
                '/website-assets/media/2025/12/Docs-jpeg-768x434.jpeg',
              'medium_large-width': 768,
              'medium_large-height': 434,
              large: '/website-assets/media/2025/12/Docs-jpeg-1024x579.jpeg',
              'large-width': 1024,
              'large-height': 579,
              '1536x1536':
                '/website-assets/media/2025/12/Docs-jpeg-1536x869.jpeg',
              '1536x1536-width': 1536,
              '1536x1536-height': 869,
              '2048x2048': '/website-assets/media/2025/12/Docs-jpeg.jpeg',
              '2048x2048-width': 1832,
              '2048x2048-height': 1036,
            },
          },
        },
      },
      {
        source: 'picker',
        resource: [
          {
            title:
              'Introducing Spice Cayenne: The Next-Generation Data Accelerator',
            slug: '/blog/introducing-spice-cayenne-data-accelerator',
            excerpt:
              'Spice Cayenne is the next-gen data accelerator for high-scale workloads.',
            image:
              '/website-assets/media/2025/12/Spice-Cayenne-Blog-Header.png',
            type: 'Blog',
            taxonomy: ['Spice AI'],
          },
        ],
        resource_manual: {
          eyebrow: '',
          title: null,
          description: '',
          image: false,
        },
      },
      {
        source: 'picker',
        resource: [
          {
            title: 'Real-Time Control Plane Acceleration with DynamoDB Streams',
            slug: '/blog/real-time-acceleration-with-dynamodb-streams',
            excerpt:
              'How to sync DynamoDB data to thousands of nodes with sub-second latency using a two-tier architecture with DynamoDB Streams and Spice acceleration.',
            image: '/website-assets/media/2026/01/image-33.png',
            type: 'Blog',
            taxonomy: ['Data Acceleration', 'Engineering'],
          },
        ],
        resource_manual: {
          eyebrow: '',
          title: null,
          description: '',
          image: false,
        },
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<ContentCta
  fields={{
    override_global_setting: false,
    custom_content: { heading: '', paragraph: '', cta: null },
    padding_top: 'unset',
    padding_bottom: 'unset',
    gcta_heading: 'See Spice in action',
    gcta_paragraph:
      'Get a guided walkthrough of how development teams use Spice to query, accelerate, and integrate AI for mission-critical workloads.',
    gcta_cta: {
      title: 'Get a demo',
      url: 'https://meetings.hubspot.com/lukekim/talk-to-sales',
      target: '_blank',
    },
  }}
/>

---

## How to Implement Change Data Capture (CDC)
URL: https://spice.ai/learn/change-data-capture
Date: 2025-12-19T00:00:00
Description: Change data capture (CDC) tracks row-level changes in databases and streams them in real time. Learn how to implement CDC with log-based, trigger-based, and polling patterns for real-time data pipelines.

<HeroCenteredText
  fields={{
    graphic_position: 'no-graphic',
    heading_tag: 'h1',
    heading: 'How to Implement Change Data Capture',
    paragraph:
      'Change data capture (CDC) is a data integration pattern that identifies and tracks row-level changes (inserts, updates, and deletes) in a database and delivers them to downstream systems in real time.',
    cta: [
      {
        type: 'filled',
        cta: {
          title: 'See Spice real-time CDC',
          url: '/feature/real-time-change-data-capture',
          target: '',
        },
      },
      {
        type: 'bordered',
        cta: {
          title: 'Read the docs',
          url: 'https://spiceai.org/docs',
          target: '',
        },
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<ContentRichText
  fields={{
    coverage: 'rc-start',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

Keeping data synchronized across systems is one of the hardest problems in distributed architectures. A customer updates their shipping address in the transactional database, but the analytics dashboard still shows the old one. A product price changes, but the search index serves stale results for hours. An AI model generates answers based on yesterday's data because the vector index hasn't been refreshed.

The traditional solution is batch ETL: extract all data on a schedule, transform it, and load it into downstream systems. This works, but it introduces latency (minutes to hours), wastes resources (re-extracting unchanged data), and adds fragile pipeline infrastructure to maintain.

Change data capture (CDC) solves this by streaming only the rows that changed, as they change. Instead of periodic bulk extracts, CDC monitors the database's internal change log and delivers a continuous stream of insert, update, and delete events to downstream consumers. The result is near-real-time data synchronization with minimal impact on the source database. When combined with [SQL federation](/learn/sql-federation), CDC-backed acceleration is the foundation of a [zero-ETL data architecture](/learn/zero-etl): one where applications query live, fresh data without centralized ingestion pipelines.

## How CDC Works: Three Implementation Patterns

CDC can be implemented at different levels of the database stack. Each approach makes different tradeoffs between reliability, latency, and source impact.

### Log-Based CDC

Log-based CDC reads the database's transaction log: the internal record of every committed change. In PostgreSQL, this is the Write-Ahead Log (WAL). In MySQL, it's the binary log (binlog). In SQL Server, it's the transaction log.

This is the preferred approach for production workloads because:

- **Zero application changes:** The transaction log already exists. CDC reads it asynchronously without modifying queries, adding triggers, or changing schemas.
- **Complete capture:** Every committed change is captured, including deletes. Nothing is missed.
- **Minimal source impact:** Reading the log is an asynchronous, read-only operation. It adds negligible overhead to the source database.
- **Ordering guarantees:** Changes are read in commit order, preserving transactional consistency.

The main limitation is that transaction log formats are database-specific. Each database requires its own CDC connector, and log retention policies must be configured to keep logs available long enough for the CDC process to read them.

### Trigger-Based CDC

Database triggers fire on insert, update, or delete operations and write change records to a separate tracking table. An external process then reads the tracking table and forwards changes to downstream systems.

Trigger-based CDC works on databases that don't expose their transaction logs (some older or proprietary systems), but it has significant drawbacks:

- **Write overhead:** Every write operation on the source table triggers an additional write to the tracking table, increasing latency and I/O
- **Schema maintenance:** The tracking table must be maintained alongside the source schema
- **Performance impact:** Under high write loads, triggers can become a bottleneck

### Polling-Based CDC

A process periodically queries the source table using a timestamp column (`updated_at`) or incrementing sequence number to detect new or changed rows. This is the simplest approach to implement but the least reliable:

- **Misses deletes:** Without a soft-delete pattern, there's no way to detect that a row was removed
- **Latency proportional to poll interval:** A 5-minute polling interval means changes are at least 5 minutes stale
- **Source load:** Frequent polling adds query load to the source database

Polling-based CDC is useful for prototyping or for sources that support no other mechanism, but it's generally not suitable for production real-time workloads.

## CDC Pipeline Architecture

A production CDC pipeline has three components: the change capture mechanism, a transport layer, and downstream consumers.

### Capture

The CDC connector monitors the source database and emits a stream of change events. Each event includes:

- **Operation type:** INSERT, UPDATE, or DELETE
- **Before state:** The row values before the change (for updates and deletes)
- **After state:** The row values after the change (for inserts and updates)
- **Metadata:** Timestamp, transaction ID, source table, and schema information

### Transport

Change events are typically published to a message broker or streaming platform; Kafka is the most common choice. The transport layer provides durability (events aren't lost if a consumer is temporarily offline), ordering (events from the same table are delivered in commit order), and fan-out (multiple consumers can independently read the same stream).

For simpler architectures, CDC can also be consumed directly without a message broker. Some systems, like Spice, provide built-in CDC consumption that eliminates the need for a separate streaming layer.

### Consumers

Downstream systems consume change events and update their local state. Common consumers include:

- **Analytics databases:** Keep analytical copies synchronized with transactional sources
- **Search indexes:** Update Elasticsearch or OpenSearch indexes as data changes
- **Cache layers:** Invalidate or refresh Redis or Memcached entries when source data changes
- **Vector indexes:** Re-embed and re-index documents for [RAG systems](/learn/retrieval-augmented-generation) as content is updated
- **Acceleration layers:** Refresh local query caches used by [SQL federation](/learn/sql-federation) engines

## CDC Use Cases

### Real-Time Analytics and Dashboards

Stream changes from transactional databases into analytical systems so dashboards and reports reflect the current state of the business. Instead of waiting for the next ETL batch, every change is visible within seconds.

This is particularly important for operational dashboards (monitoring inventory levels, tracking order fulfillment, or observing system health) where stale data leads to wrong decisions.

### Cache and Search Index Synchronization

Application caches (Redis, Memcached) and search indexes (Elasticsearch, OpenSearch) go stale when source data changes. Without CDC, teams resort to time-based expiration (which causes periodic staleness) or manual invalidation logic (which is error-prone and hard to maintain).

CDC automates this entirely: when a row changes in the source database, the corresponding cache entry or search index document is updated within seconds. No manual invalidation, no stale reads.

### AI and RAG Pipeline Freshness

[Retrieval-augmented generation](/learn/retrieval-augmented-generation) systems depend on vector indexes that represent the current state of source data. If the vector index is rebuilt nightly, every answer is at least a day stale.

CDC enables incremental index updates: when a document changes in the source database, only that document is re-embedded and re-indexed. This keeps RAG retrieval fresh without the cost of full re-indexing.

### Event-Driven Microservices

CDC turns database changes into a stream of events that microservices can react to. Instead of services polling each other for updates, changes propagate automatically through the event stream. This pattern (sometimes called the "outbox pattern") decouples services while ensuring they stay synchronized.

### Data Lake Ingestion

Continuously stream changes from operational databases into data lakes (S3, GCS, Azure Blob) in formats like Apache Parquet or Apache Iceberg. This replaces batch export jobs and ensures the data lake reflects the current state of operational systems.

## CDC Best Practices

### Schema Evolution Handling

Source database schemas change over time: columns are added, data types are modified, tables are renamed. A robust CDC pipeline must handle these changes gracefully. The most common approaches are:

- **Schema registries** that track schema versions and ensure consumers can handle multiple versions
- **Automatic schema migration** where the CDC pipeline detects changes and applies them downstream
- **Backward-compatible changes** enforced by policy, so consumers always handle the latest schema

### Monitoring and Alerting

CDC pipelines should be monitored for:

- **Lag:** The time between when a change is committed at the source and when it's applied downstream. Increasing lag indicates the pipeline is falling behind.
- **Error rates:** Failed events that couldn't be applied downstream
- **Log retention:** If the source database's transaction log is truncated before CDC reads it, changes are lost permanently

### Initial Load

When a CDC pipeline is first set up, the downstream system needs a full snapshot of the current source data. This "initial load" or "snapshot" must be coordinated with the CDC stream to avoid duplicates or gaps. Most production CDC tools handle this automatically.

## How to Set Up CDC with Spice

[Spice](/feature/real-time-change-data-capture) has built-in CDC that keeps accelerated datasets synchronized with source databases: no Kafka, no Debezium, no separate streaming infrastructure required for many use cases.

### Step 1: Configure CDC Refresh on Accelerated Datasets

In the `spicepod.yaml`, set `refresh_mode: changes` on any dataset that should track source changes in real time:

```yaml
version: v1
kind: Spicepod
name: realtime_analytics

datasets:
  # CDC-backed acceleration from PostgreSQL
  - from: postgres:public.orders
    name: orders
    params:
      pg_host: db.example.com
      pg_port: '5432'
      pg_db: production
      pg_user: ${secrets:PG_USER}
      pg_pass: ${secrets:PG_PASS}
    acceleration:
      engine: arrow # In-memory for sub-ms queries
      refresh_mode: changes # CDC-based incremental refresh
      refresh_check_interval: 1s

  # CDC-backed acceleration from MySQL
  - from: mysql:inventory.products
    name: products
    params:
      mysql_host: mysql.example.com
      mysql_user: ${secrets:MYSQL_USER}
      mysql_pass: ${secrets:MYSQL_PASS}
    acceleration:
      engine: arrow
      refresh_mode: changes
      refresh_check_interval: 1s
```

When Spice starts, it performs an initial full snapshot of each dataset, then switches to incremental CDC. For PostgreSQL, Spice creates a logical replication slot and reads the WAL. For MySQL, it reads the binlog. Inserts, updates, and deletes in the source database appear in the local acceleration cache within seconds.

### Step 2: Prepare the Source Database

For PostgreSQL log-based CDC, the source database needs logical replication enabled:

```sql
-- In postgresql.conf (or set via ALTER SYSTEM)
-- wal_level = logical
-- max_replication_slots = 4

-- Grant replication privileges to the Spice user
ALTER ROLE spice_user WITH REPLICATION;

-- Ensure tables have full replica identity for UPDATE/DELETE capture
ALTER TABLE orders REPLICA IDENTITY FULL;
```

Spice manages the replication slot lifecycle automatically, creating it on first connection and advancing it as changes are consumed. If Spice restarts, it resumes from the last confirmed position without missing or duplicating events.

### Step 3: Query Accelerated, CDC-Fresh Data

With CDC acceleration configured, [federated SQL queries](/learn/sql-federation) hit the local acceleration cache and return in single-digit milliseconds, while the underlying data stays fresh:

```sql
-- This query hits the local Arrow acceleration cache, not PostgreSQL
-- Results reflect changes from the source within ~1 second
SELECT customer_id, COUNT(*) AS order_count, SUM(amount) AS total_spend
FROM orders
WHERE created_at > NOW() - INTERVAL '7 days'
GROUP BY customer_id
ORDER BY total_spend DESC
LIMIT 100
```

The same query against the source PostgreSQL database might take hundreds of milliseconds due to network latency and concurrent transactional load. Against the CDC-refreshed acceleration cache, it returns in under 5 milliseconds.

### Step 4: Combine CDC with Federation

CDC acceleration and [SQL federation](/learn/sql-federation) work together. Some datasets are accelerated locally with CDC for performance; others are federated in real time for freshness on rarely queried data:

```yaml
datasets:
  # Hot data: accelerated with CDC (sub-ms queries)
  - from: postgres:public.orders
    name: orders
    acceleration:
      engine: arrow
      refresh_mode: changes
      refresh_check_interval: 1s

  # Cold data: federated in real time (no local storage)
  - from: s3://data-lake/historical_orders/
    name: historical_orders
```

Queries can join accelerated and federated datasets transparently. Spice routes each table scan to the appropriate source (the local cache for accelerated datasets, the remote source for federated ones) and merges results. This hot/cold split, with CDC keeping the hot tier current, is the foundation of an [operational data lakehouse](/use-case/operational-data-lakehouse).

### Refresh Modes Compared

Spice supports multiple refresh strategies, with CDC being the most powerful:

- **`refresh_mode: changes`**: Log-based CDC. Captures every insert, update, and delete. Near-real-time. Minimal source impact. Recommended for production.
- **`refresh_mode: full`**: Periodic full refresh. Re-reads the entire dataset on a schedule. Simple but resource-intensive for large datasets.
- **`refresh_mode: append`**: Append-only. Checks for new rows since the last refresh using a time column. Efficient for event logs and immutable data.

For most production workloads, `refresh_mode: changes` is the right choice. It provides the best combination of freshness, efficiency, and source impact. The same CDC mechanism powers the Spice [analytics replica](/platform/analytics), which pairs continuous replication from PostgreSQL, MySQL, or MongoDB with a dedicated analytical query engine.

## Advanced Topics

### WAL Internals and Logical Replication

Log-based CDC in PostgreSQL reads from the Write-Ahead Log (WAL), which is the database's crash-recovery mechanism. Every committed transaction is first written to the WAL before being applied to the actual data files. CDC leverages this by attaching a logical replication slot to the WAL, which tells PostgreSQL to retain log segments until the CDC consumer has acknowledged them.

A logical replication slot decodes the raw WAL bytes into structured change events using an output plugin (e.g., `pgoutput` or `wal2json`). The output plugin determines the format of change events: whether they include full row images, old values for updated columns, or just the changed fields. Configuring `REPLICA IDENTITY FULL` on a table ensures that UPDATE and DELETE events include the complete before-state of the row, which is critical for consumers that need to maintain materialized views or detect specific field-level changes.

The key operational concern with WAL-based CDC is slot management. If a CDC consumer goes offline for an extended period, the replication slot prevents PostgreSQL from reclaiming WAL segments. This can cause disk usage to grow unbounded, eventually filling the disk and crashing the database. Production CDC deployments must monitor replication slot lag and set maximum retention policies to prevent this failure mode.

```mermaid
sequenceDiagram
    participant App as Application
    participant DB as PostgreSQL
    participant WAL as Write-Ahead Log
    participant Slot as Replication Slot
    participant CDC as CDC Consumer
    participant Target as Downstream Target

    App->>DB: INSERT / UPDATE / DELETE
    DB->>WAL: Write transaction record
    DB-->>App: Acknowledge commit
    Slot->>WAL: Read from last confirmed LSN
    WAL-->>Slot: Raw WAL bytes
    Slot->>CDC: Decoded change event
    CDC->>Target: Apply change
    CDC->>Slot: Confirm LSN processed
```

### Exactly-Once Delivery Semantics

Distributed systems offer three delivery guarantees: at-most-once (changes may be lost), at-least-once (changes may be duplicated), and exactly-once (each change is applied precisely once). CDC pipelines must handle the gap between at-least-once delivery (which most transport layers provide) and exactly-once semantics (which consumers require).

The standard approach is idempotent consumers. Instead of trying to guarantee that each change event is delivered exactly once (which is impractical in distributed systems), the consumer is designed so that applying the same event multiple times produces the same result. For database targets, this means using `UPSERT` (INSERT ... ON CONFLICT UPDATE) instead of plain INSERT. For search indexes, it means writing documents with deterministic IDs so that re-applying an update overwrites the previous version.

When idempotency is insufficient (for example, when the consumer maintains counters or running aggregates), the consumer must track its position in the change stream (the Log Sequence Number, or LSN, in PostgreSQL terms) and store it transactionally alongside the applied changes. On recovery, the consumer resumes from its last committed LSN, ensuring no events are processed twice.

### CDC at Scale

Scaling CDC introduces challenges that don't exist in single-source deployments. When dozens or hundreds of tables must be captured simultaneously, the CDC system must manage connection limits, replication slot resources, and downstream throughput.

Partitioning the change stream by table or by key range allows parallel processing. Events for independent tables can be consumed by separate workers without coordination. Events within a single table can be partitioned by primary key, enabling parallel consumers that each handle a subset of rows, as long as ordering is maintained within each partition.

Backpressure management is critical at scale. If a downstream consumer slows down (due to indexing lag, network congestion, or resource contention), the CDC pipeline must buffer events without dropping them and without allowing unbounded memory growth. Production systems use bounded buffers with overflow to persistent storage: writing excess events to disk when in-memory buffers fill, then draining the disk buffer when the consumer catches up.

Monitoring at scale requires tracking per-table lag (the delay between source commit and downstream application), throughput (events per second per table), and error rates. Alerting on lag growth is the most important signal, because increasing lag indicates that the pipeline is falling behind and may eventually lose data if WAL retention is exceeded.

<ContentRichText
  fields={{
    coverage: 'rc-end',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<AccordionFaq
  fields={{
    heading: 'CDC FAQ',
    paragraph: '',
    items: [
      {
        title: 'What is the difference between CDC and ETL?',
        paragraph:
          '<p>ETL extracts data in bulk on a schedule, transforms it, and loads it into a target system. CDC captures only the changes (inserts, updates, deletes) as they happen and streams them continuously. ETL is batch-oriented and introduces latency; CDC is event-driven and near-real-time. Many modern architectures use CDC to replace the "extract" step of traditional ETL.</p>',
      },
      {
        title: 'Which databases support log-based CDC?',
        paragraph:
          '<p>Most modern relational databases support log-based CDC: PostgreSQL (via logical replication and WAL), MySQL (via binlog), SQL Server (via its built-in CDC feature), Oracle (via LogMiner or GoldenGate), and MongoDB (via change streams). The specific configuration varies by database.</p>',
      },
      {
        title: 'Does CDC add overhead to the source database?',
        paragraph:
          '<p>Log-based CDC adds minimal overhead because it reads the transaction log asynchronously; it does not modify queries or add triggers. The primary cost is slightly increased disk I/O for log retention. Trigger-based and polling-based CDC add more overhead because they execute additional queries or triggers during write operations.</p>',
      },
      {
        title: 'How does CDC handle schema changes?',
        paragraph:
          '<p>Schema changes (adding columns, changing data types) are one of the most challenging aspects of CDC. Log-based CDC systems typically detect schema changes in the transaction log and propagate them downstream. The downstream consumer must handle schema evolution (for example, by using a schema registry or applying migrations automatically).</p>',
      },
      {
        title: 'Can CDC be used with data federation?',
        paragraph:
          '<p>Yes. CDC and data federation are complementary patterns. Federation queries data across sources in real time; CDC keeps local acceleration caches synchronized with those sources. Together, they enable sub-second federated queries backed by always-fresh local data. Spice uses this combination to deliver real-time performance across distributed data sources.</p>',
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<ContentResourceFeatured
  fields={{
    heading: 'Learn more about CDC and data acceleration',
    paragraph:
      'Guides and blog posts on real-time data synchronization and acceleration with Spice.',
    mode: 'default',
    resources: [
      {
        source: 'manual',
        resource: null,
        resource_manual: {
          eyebrow: 'Docs',
          title: {
            title: 'Spice.ai OSS Documentation',
            url: 'https://spiceai.org/docs',
            target: '_blank',
          },
          description:
            'Learn how Spice uses CDC to keep accelerated datasets fresh and synchronized with source databases in real time.',
          image: {
            ID: 1661,
            id: 1661,
            title: 'Docs jpeg',
            filename: 'Docs-jpeg.jpeg',
            filesize: 103192,
            url: '/website-assets/media/2025/12/Docs-jpeg.jpeg',
            link: '/docs-jpeg/',
            alt: '',
            author: '9',
            description: '',
            caption: '',
            name: 'docs-jpeg',
            status: 'inherit',
            uploaded_to: 0,
            date: '2025-12-05 04:13:53',
            modified: '2025-12-05 04:13:53',
            menu_order: 0,
            mime_type: 'image/jpeg',
            type: 'image',
            subtype: 'jpeg',
            icon: '/website-assets/media/default.png',
            width: 1832,
            height: 1036,
            sizes: {
              thumbnail: '/website-assets/media/2025/12/Docs-jpeg-150x150.jpeg',
              'thumbnail-width': 150,
              'thumbnail-height': 150,
              medium: '/website-assets/media/2025/12/Docs-jpeg-300x170.jpeg',
              'medium-width': 300,
              'medium-height': 170,
              medium_large:
                '/website-assets/media/2025/12/Docs-jpeg-768x434.jpeg',
              'medium_large-width': 768,
              'medium_large-height': 434,
              large: '/website-assets/media/2025/12/Docs-jpeg-1024x579.jpeg',
              'large-width': 1024,
              'large-height': 579,
              '1536x1536':
                '/website-assets/media/2025/12/Docs-jpeg-1536x869.jpeg',
              '1536x1536-width': 1536,
              '1536x1536-height': 869,
              '2048x2048': '/website-assets/media/2025/12/Docs-jpeg.jpeg',
              '2048x2048-width': 1832,
              '2048x2048-height': 1036,
            },
          },
        },
      },
      {
        source: 'picker',
        resource: [
          {
            title: 'Real-Time Control Plane Acceleration with DynamoDB Streams',
            slug: '/blog/real-time-acceleration-with-dynamodb-streams',
            excerpt:
              'How to sync DynamoDB data to thousands of nodes with sub-second latency using a two-tier architecture with DynamoDB Streams and Spice acceleration.',
            image: '/website-assets/media/2026/01/image-33.png',
            type: 'Blog',
            taxonomy: ['Data Acceleration', 'Engineering'],
          },
        ],
        resource_manual: {
          eyebrow: '',
          title: null,
          description: '',
          image: false,
        },
      },
      {
        source: 'picker',
        resource: [
          {
            title:
              'Introducing Spice Cayenne: The Next-Generation Data Accelerator Built on Vortex for Performance and Scale',
            slug: '/blog/introducing-spice-cayenne-data-accelerator',
            excerpt:
              'Spice Cayenne is the next-generation Spice.ai data accelerator built for high-scale and low latency data lake workloads.',
            image:
              '/website-assets/media/2025/12/Spice-Cayenne-Blog-Header.png',
            type: 'Blog',
            taxonomy: ['Spice AI'],
          },
        ],
        resource_manual: {
          eyebrow: '',
          title: null,
          description: '',
          image: false,
        },
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<TalkToAnEngineerCta />

---

## Comparing Data Federation Tools for AI Agents: How to Choose
URL: https://spice.ai/learn/comparing-data-federation-tools-for-ai-agents
Date: 2026-06-03T00:00:00
Description: Compare data federation tool categories for AI agents across latency, freshness, governance, and operational overhead. Learn which approach fits your architecture.

<HeroCenteredText
  fields={{
    graphic_position: 'no-graphic',
    heading_tag: 'h1',
    heading: 'Comparing Data Federation Tools for AI Agents',
    paragraph:
      'AI agents need fresh, governed access to data across APIs, databases, and warehouses. This guide compares data federation tool categories and helps you choose based on workload requirements.',
    cta: [
      {
        type: 'filled',
        cta: {
          title: 'See SQL federation and acceleration',
          url: '/platform/sql-federation-acceleration',
          target: '',
        },
      },
      {
        type: 'bordered',
        cta: {
          title: 'Read federation docs',
          url: 'https://spiceai.org/docs/features/query-federation',
          target: '_blank',
        },
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<ContentRichText
  fields={{
    coverage: 'rc-start',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

AI agents are creating a new access pattern for enterprise data. Instead of a dashboard issuing one predictable query every few minutes, agents run many small reads, branch into follow-up queries, and combine data from multiple systems inside one reasoning loop. That shift changes how teams evaluate federation tools.

This page compares major data federation tool categories used with AI agents, then provides a decision framework for selecting an approach. The goal is not to declare a universal winner. Different architectures optimize for different constraints.

## Why AI Agents Change Federation Requirements

Traditional data integration decisions focused on BI reporting. AI agent workloads add requirements that are less common in dashboard-centric systems.

### High query fan-out per user request

A single user prompt can trigger several tool calls. One agent response may need customer context from PostgreSQL, entitlement data from a SaaS API, and historical trends from a warehouse. Federation tools for agents need predictable multi-source behavior under bursty loads.

### Tighter latency budgets

Agent response quality drops when retrieval is slow. A delay of even one or two seconds per tool call can cascade into poor interactive performance. This makes query planning efficiency, local acceleration, and source pushdown more important than in batch analytics.

### Policy and tenancy boundaries

Many teams now run multiple agents with different scopes, roles, and trust levels. Federation layers must enforce row-level and source-level controls so one misconfigured agent cannot access another team's data. If you deploy through an [MCP server gateway](/feature/mcp-server-gateway), this policy boundary becomes part of the runtime control plane.

### Freshness over snapshot consistency

For many agent tasks, current operational state matters more than strict historical consistency. For example, support and operations agents care about what changed in the last minute, not only what landed in an hourly ETL batch.

## Evaluation Criteria

Use the following dimensions to evaluate federation tools for AI agent workloads.

### 1. Source coverage and protocol flexibility

Check whether the tool can query your required source mix: OLTP databases, analytical warehouses, object storage, and HTTP APIs. AI agents often need all four. Broad connector support reduces custom adapter code and lowers long-term maintenance.

### 2. Pushdown and execution model

The best federation systems push filters and aggregations to source systems, then merge only reduced result sets. Poor pushdown behavior increases network transfer and latency. Ask for concrete evidence: explain plans, query traces, and benchmark methodology.

### 3. Freshness and acceleration options

Some tools focus on in-place query execution only. Others support local acceleration layers refreshed on a schedule or via [change data capture](/feature/real-time-change-data-capture). For agent workloads, acceleration is often the difference between acceptable and unacceptable latency.

### 4. Governance and access controls

Review authentication, authorization, and audit capabilities. Agent architectures usually need service identities, scoped credentials, and tenant-aware policies. Fine-grained controls are important when multiple agent services share the same federation layer.

### 5. Operational overhead

Compare deployment complexity, scaling model, failure domains, and observability. A tool with strong query performance but high operational burden may not fit small platform teams.

### 6. Cost model

Federation cost is not just license price. It includes duplicated storage, source query egress, cache refresh cost, and operational labor. Evaluate total cost of ownership over 12 to 24 months.

## Tool Categories and Tradeoffs

Rather than comparing individual vendors in isolation, start with tool categories. This keeps the decision objective and maps better to architecture requirements.

### Distributed SQL engines

Examples include open engines commonly used for federated querying across data lakes and warehouses.

Strengths:
- Mature SQL support for analytical workloads
- Strong ecosystem integration in data engineering teams
- Good fit for large scans and scheduled analytics

Limitations for agents:
- Can require substantial platform engineering to enforce per-agent isolation
- API and operational integration for agent workflows may need additional layers
- Interactive latency depends heavily on tuning and source behavior

### Data virtualization platforms

These tools typically provide semantic layers, governance features, and broad enterprise connector coverage.

Strengths:
- Strong governance and policy administration
- Centralized metadata management
- Useful in organizations with strict cross-domain data controls

Limitations for agents:
- Can add complexity and licensing cost
- Performance characteristics vary by workload and pushdown quality
- Developer workflows may feel heavier for rapid AI iteration

### API gateway plus query orchestration stacks

Some teams combine API gateways, custom service layers, and query orchestration components to provide agent-facing data access.

Strengths:
- Precise control over endpoint behavior
- Can align with existing service architecture patterns
- Easier to embed business-specific policies in code

Limitations for agents:
- High custom development and maintenance burden
- Harder to maintain consistent SQL semantics across sources
- Risk of duplicated logic across teams

### Embedded or sidecar federation runtimes

These runtimes are deployed close to the application or agent service as a sidecar or lightweight microservice.

Strengths:
- Low network latency due to local execution path
- Natural isolation boundary per agent or per service
- Faster onboarding for new sources in application teams

Limitations for agents:
- Requires clear multi-instance operations model
- Fleet-wide observability and policy consistency need deliberate design
- Resource planning is important at higher scale

## Comparison Table for AI Agent Use Cases

The table below summarizes typical behavior by category. Actual results depend on implementation and tuning.

| Dimension | Distributed SQL engines | Data virtualization platforms | API gateway plus orchestration | Embedded or sidecar federation |
|---|---|---|---|---|
| Primary design center | Analytical federation | Governed enterprise access | Service-level composition | App-local low-latency access |
| Typical latency profile | Medium to high without acceleration | Medium, depends on pushdown | Variable, depends on custom code | Low to medium with local acceleration |
| Source and API flexibility | High for SQL sources | High across enterprise connectors | High, but mostly custom | High when connector coverage is broad |
| Governance depth | Medium, often add-ons | High | Medium to high, code-driven | Medium to high, runtime-dependent |
| Per-agent isolation model | Needs extra architecture | Usually centralized | Custom by design | Natural fit with per-agent deployment |
| Operational complexity | Medium to high | Medium to high | High | Low to medium |
| Time to first production use | Medium | Medium | Slow for new teams | Fast to medium |
| Best fit | Centralized analytics teams | Large regulated organizations | Teams with strong platform engineering | Product teams building agentic apps |

## Decision Framework

Use this sequence to select the right approach for your environment.

### Step 1: Define latency and freshness SLOs

If your target is sub-second retrieval with minute-level freshness, prioritize architectures with local acceleration and efficient pushdown. If your target is minute-level latency for internal analysis, centralized federation may be sufficient.

### Step 2: Define isolation boundaries

If each agent needs independent failure and permission boundaries, sidecar or per-service federation patterns are easier to reason about. If central governance is the top priority, virtualization platforms can simplify policy administration.

### Step 3: Measure source load tolerance

Estimate incremental query pressure on source systems from agent traffic. If sources are sensitive to read amplification, favor solutions that support refreshable local acceleration to reduce repeated source hits.

### Step 4: Score operational capacity

Be realistic about team size and on-call ownership. Highly customized orchestration stacks offer flexibility but increase maintenance load. Standardized federation runtimes can lower operational cost.

### Step 5: Validate with production-like tests

Run a representative benchmark with real schemas, realistic prompt-driven query patterns, and policy checks. Include failover cases and degraded source behavior. Treat synthetic benchmarks as directional only.

## Additional Requirements for Enterprise Deployments

Large organizations apply the criteria above and add four more. These rarely decide a prototype and often decide a rollout.

### Residency and regional execution

Data that cannot leave a region constrains where queries run. Confirm the platform executes within a region rather than pulling rows to a central engine first. Pushdown reduces how much data crosses a regional boundary, and it cannot remove the crossing for a join whose inputs sit in different regions. One side still reaches the join executor. Where a policy forbids that crossing entirely, the query must be split or the data must be co-located.

### Identity integration

Agent and application identities must map to the identity provider the organization already runs. A platform with its own separate user directory creates a second place to deprovision an employee, which audits find.

### Chargeback and cost attribution

When many teams share a federation layer, someone must attribute cost. Look for per-workload query accounting. Without it, the platform bill arrives as one number that no team accepts.

### Vendor and license risk

Assess what happens if the vendor changes direction. Open-source cores, open table formats, and standard interfaces such as SQL and Arrow Flight limit the exposure. This is a procurement question, and it usually arrives late in an evaluation.

## Zero-ETL Platform Categories Compared

Many federation platforms market themselves as zero-ETL. The label covers three different mechanisms, and they behave differently. Any of them can be self-operated or bought as a managed service, so the operating model is a separate question from the mechanism. See [zero-ETL](/learn/zero-etl) for the underlying definitions.

| Mechanism | What it does | Data movement | Freshness | Main tradeoff |
| --- | --- | --- | --- | --- |
| Query in place | Reads every source at query time | None | Live | Source systems absorb the read load |
| Snapshot plus change stream | Loads once, then applies committed changes | Incremental after the first load | Seconds | A copy to store and operate |
| Scheduled copy | Reloads tables on an interval | Full or partitioned tables | The interval | A pipeline to own and monitor |

Only the first mechanism moves no data. The second bounds the staleness without a scheduled job, and it still keeps a copy. Managed zero-ETL services usually implement the second mechanism, so judge them on freshness and copy location rather than on the label.

## Advanced Topics

### Per-agent blast radius design

Shared federation clusters can be efficient, but they also couple unrelated agent workloads. Per-agent or per-service deployment reduces blast radius by isolating faults and policy mistakes. This matters for enterprise environments where one agent may handle sensitive workloads while another runs lower-risk automation.

### Hybrid acceleration strategies

Not every dataset needs the same acceleration policy. A practical approach is tiered acceleration: keep fast-changing operational tables on short refresh intervals, while less volatile reference datasets use longer intervals. This balances source load, freshness, and compute cost.

### Observability for agent retrieval loops

Agent retrieval should be observable end to end. Useful signals include query latency percentiles, source pushdown ratios, cache hit rate, source error distribution, and policy-denied access attempts. Without this telemetry, teams struggle to distinguish model issues from data access bottlenecks.

## Data Federation for AI Agents with Spice

[Spice](/platform/sql-federation-acceleration) combines federated SQL querying with local acceleration so teams can serve agent workloads with lower latency and controlled freshness windows. It connects to databases, warehouses, object stores, and APIs across [integrations](/integrations), then executes through a unified SQL surface.

For teams adopting an agent architecture, Spice can run as a lightweight service near agent runtimes and expose governed access paths through an [MCP server gateway](/feature/mcp-server-gateway). This model supports tighter isolation and more predictable operational boundaries while preserving broad source access.

The practical outcome is a hybrid path: query in place where needed, accelerate where latency matters, and keep central ETL only for workloads that require long-horizon historical processing.

For deployment planning and budget alignment, review [Spice Cloud pricing](/pricing).

<ContentRichText
  fields={{
    coverage: 'rc-end',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<AccordionFaq
  fields={{
    heading: 'Data Federation Tools for AI Agents FAQ',
    paragraph: '',
    items: [
      {
        title: 'What are the most important considerations when choosing a federation tool for agents?',
        paragraph:
          '<p>Start with latency and freshness requirements. Agent response quality depends on retrieval speed and current data. After that, evaluate governance, source coverage, and operational overhead. Teams often over-index on connector count and under-index on execution behavior under real load.</p>',
      },
      {
        title: 'Can one federation tool serve both BI and AI agent workloads?',
        paragraph:
          '<p>Yes, but workload profiles differ. BI workloads are often heavier and scheduled. Agent workloads are usually bursty and interactive. A single platform can serve both when it supports efficient pushdown, acceleration, and policy controls tuned per workload class.</p>',
      },
      {
        title: 'Do we always need per-agent deployment for federation?',
        paragraph:
          '<p>No. Per-agent deployment is useful when strict isolation and blast-radius control are priorities. Shared deployments can work when governance is strong and workloads are compatible. The right model depends on your risk profile, team structure, and multi-tenant requirements.</p>',
      },
      {
        title: 'How should we benchmark federation tools for AI agents?',
        paragraph:
          '<p>Use production-like query traces driven by realistic prompts, not only synthetic SQL benchmarks. Include cross-source joins, policy checks, source timeouts, and retry behavior. Measure tail latency, cache hit rates, and source load impact in addition to average response time.</p>',
      },
      {
        title: 'Is federation enough, or do we still need ETL?',
        paragraph:
          '<p>Most teams need both. Federation is strong for real-time, cross-source access. ETL remains useful for heavy historical analytics, compliance archives, and long-range reporting. A hybrid architecture usually provides the best balance of freshness, performance, and cost.</p>',
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<ContentResourceFeatured
  fields={{
    heading: 'Learn more about federation and agent data access',
    paragraph:
      'Documentation and technical guides for evaluating federation architectures and operating them in production.',
    mode: 'default',
    resources: [
      {
        source: 'manual',
        resource: null,
        resource_manual: {
          eyebrow: 'Docs',
          title: {
            title: 'Query Federation Docs',
            url: 'https://spiceai.org/docs/features/query-federation',
            target: '_blank',
          },
          description:
            'Learn how federated SQL query planning, pushdown, and acceleration work in Spice.',
          image: {
            ID: 1661,
            id: 1661,
            title: 'Docs jpeg',
            filename: 'Docs-jpeg.jpeg',
            filesize: 103192,
            url: '/website-assets/media/2025/12/Docs-jpeg.jpeg',
            link: '/docs-jpeg/',
            alt: '',
            author: '9',
            description: '',
            caption: '',
            name: 'docs-jpeg',
            status: 'inherit',
            uploaded_to: 0,
            date: '2025-12-05 04:13:53',
            modified: '2025-12-05 04:13:53',
            menu_order: 0,
            mime_type: 'image/jpeg',
            type: 'image',
            subtype: 'jpeg',
            icon: '/website-assets/media/default.png',
            width: 1832,
            height: 1036,
            sizes: {
              thumbnail: '/website-assets/media/2025/12/Docs-jpeg-150x150.jpeg',
              'thumbnail-width': 150,
              'thumbnail-height': 150,
              medium: '/website-assets/media/2025/12/Docs-jpeg-300x170.jpeg',
              'medium-width': 300,
              'medium-height': 170,
              medium_large:
                '/website-assets/media/2025/12/Docs-jpeg-768x434.jpeg',
              'medium_large-width': 768,
              'medium_large-height': 434,
              large: '/website-assets/media/2025/12/Docs-jpeg-1024x579.jpeg',
              'large-width': 1024,
              'large-height': 579,
              '1536x1536':
                '/website-assets/media/2025/12/Docs-jpeg-1536x869.jpeg',
              '1536x1536-width': 1536,
              '1536x1536-height': 869,
              '2048x2048': '/website-assets/media/2025/12/Docs-jpeg.jpeg',
              '2048x2048-width': 1832,
              '2048x2048-height': 1036,
            },
          },
        },
      },
      {
        source: 'picker',
        resource: [
          {
            title:
              'Getting Started with Spice.ai SQL Query Federation & Acceleration',
            slug: '/blog/spice-sql-query-federation-acceleration',
            excerpt:
              'Learn how to use Spice.ai to federate and accelerate queries across operational and analytical systems with zero ETL.',
            image:
              '/website-assets/media/2025/11/68ee96eb08a0dfcb609c1969_Version-7-1.png',
            type: 'Blog',
            taxonomy: ['Spice AI'],
          },
        ],
        resource_manual: {
          eyebrow: '',
          title: null,
          description: '',
          image: false,
        },
      },
      {
        source: 'picker',
        resource: [
          {
            title: 'How we use Apache DataFusion at Spice AI',
            slug: '/blog/how-we-use-apache-datafusion-at-spice-ai',
            excerpt:
              'A technical overview of how Spice extends Apache DataFusion with custom table providers, optimizer rules, and UDFs to power federated SQL, search, and AI inference.',
            image:
              '/website-assets/media/2026/01/Engineering-at-Spice-AI-Apache-DataFusion.png',
            type: 'Blog',
            taxonomy: ['SQL Federation', 'Engineering'],
          },
        ],
        resource_manual: {
          eyebrow: '',
          title: null,
          description: '',
          image: false,
        },
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<TalkToAnEngineerCta />

---

## What is Data Acceleration?
URL: https://spice.ai/learn/data-acceleration
Date: 2026-01-08T00:00:00
Description: Data acceleration caches frequently accessed data locally for sub-second query performance without moving data permanently. Learn how it works, acceleration strategies, and when to use it.

<HeroCenteredText
  fields={{
    graphic_position: 'no-graphic',
    heading_tag: 'h1',
    heading: 'What is Data Acceleration?',
    paragraph:
      'Data acceleration is a technique that caches frequently accessed data in a fast, local engine, enabling sub-second query performance without permanently moving data away from its source systems.',
    cta: [
      {
        type: 'filled',
        cta: {
          title: 'See Spice acceleration',
          url: '/platform/sql-federation-acceleration',
          target: '',
        },
      },
      {
        type: 'bordered',
        cta: {
          title: 'Read the docs',
          url: 'https://spiceai.org/docs',
          target: '',
        },
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<ContentRichText
  fields={{
    coverage: 'rc-start',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

Querying data where it lives (across data warehouses, object stores, and transactional databases) is the promise of [SQL federation](/learn/sql-federation). But federation alone has a performance ceiling: every query must travel over the network to the source system, wait for that system to process it, and transfer results back. For [latency-sensitive applications](/learn/database-query-latency-at-scale), dashboards, and AI workloads, that round-trip can be too slow.

Data acceleration solves this by maintaining a local, queryable copy of frequently accessed datasets in a fast engine close to the application. The source system remains the system of record. The acceleration layer handles reads, serving queries in milliseconds instead of seconds or minutes. When source data changes, the acceleration layer is refreshed (often via [change data capture](/learn/change-data-capture)) so it stays current.

This is not a new concept. Database caching, materialized views, and read replicas all address the same fundamental problem. What distinguishes modern data acceleration is that it works across heterogeneous sources (not just within a single database), integrates with federation engines for transparent query routing, and supports real-time refresh mechanisms that keep cached data fresh. For a detailed comparison with application-level caching, see [caching vs data acceleration](/learn/caching-vs-data-acceleration).

## How Data Acceleration Works with Federation

Data acceleration and SQL federation are complementary patterns that address different parts of the query lifecycle.

**Federation** provides unified access. A single SQL query can reach PostgreSQL, S3, Databricks, and 40+ other sources through [Spice's connector ecosystem](/integrations). The federation engine handles connection management, dialect translation, and predicate pushdown.

**Acceleration** provides speed. Datasets that are queried frequently or require low latency are cached locally in a fast engine. When a query arrives for an accelerated dataset, the federation engine serves it from the local cache instead of routing it to the remote source.

The two patterns work together in a query router:

1. A query arrives at the federation engine
2. The engine checks whether the requested datasets are accelerated locally
3. If yes, the query is served from the local acceleration engine (milliseconds)
4. If no, the query is federated to the remote source (seconds to minutes, depending on the source)

This means applications get a single SQL endpoint that transparently handles both accelerated and federated queries. Developers don't need to manage separate connections or caching logic.

## Acceleration Strategies

Not all acceleration is the same. The choice of engine, storage medium, and materialization scope determines the performance characteristics and resource requirements.

### In-Memory vs. On-Disk Acceleration

**In-memory acceleration** stores data in RAM using columnar formats like Apache Arrow. This delivers the fastest query performance (sub-millisecond scans on datasets that fit in memory) but is limited by available RAM and volatile (data is lost on restart unless backed by a persistent store).

**On-disk acceleration** stores data on local SSD using embedded engines like DuckDB or SQLite. Performance is slower than in-memory (milliseconds instead of microseconds) but can handle much larger datasets and survives restarts without re-loading from the source.

The right choice depends on the workload:

- **In-memory:** Real-time dashboards, AI inference pipelines, embedding lookups, and any workload where single-digit-millisecond latency matters
- **On-disk:** Analytical queries over large datasets, batch processing, and workloads where durability matters more than raw speed

### Full vs. Partial Materialization

**Full materialization** caches the entire dataset locally. Every row from the source table is replicated in the acceleration engine. This approach is simple and ensures every query can be served locally, but it requires enough storage to hold the full dataset and enough bandwidth to keep it synchronized.

**Partial materialization** caches only a subset of the data, typically filtered by time range, partition, or access frequency. For example, an acceleration layer might cache only the last 90 days of order data, while queries for older data are federated to the source warehouse.

Partial materialization reduces storage and refresh costs but requires the query router to determine whether a given query can be served from the local cache or must be routed to the source.

## Keeping Accelerated Data Fresh

Acceleration is only useful if the cached data is reasonably current. Stale acceleration caches can be worse than no acceleration, because queries return outdated results with no indication that the data is behind.

### Change Data Capture (CDC) Refresh

The most effective refresh strategy uses [change data capture](/learn/change-data-capture) to stream row-level changes from the source database to the acceleration layer. When a row is inserted, updated, or deleted at the source, the change event is applied to the local cache within seconds.

CDC refresh provides near-real-time freshness with minimal source impact. It works particularly well with transactional databases (PostgreSQL, MySQL) that expose write-ahead logs.

### Scheduled Refresh

For sources that don't support CDC (object stores like S3, REST APIs, or some SaaS platforms), the acceleration layer refreshes on a schedule. The refresh interval can range from seconds to hours depending on freshness requirements.

Scheduled refresh is simpler to implement but introduces a staleness window equal to the refresh interval. A 5-minute schedule means cached data can be up to 5 minutes behind.

### Append-Only Refresh

For time-series and event data that is never updated (only new rows are appended), the acceleration layer can use append-only refresh. It tracks the latest timestamp or sequence number and fetches only new rows on each refresh cycle. This is efficient because it avoids re-scanning unchanged data.

## Acceleration Engines

The choice of acceleration engine determines query performance, supported SQL features, and resource requirements.

### Apache Arrow

Apache Arrow is an in-memory columnar data format designed for analytical processing. It enables zero-copy reads and SIMD-optimized computation, making it one of the fastest options for scan-heavy analytical queries. Arrow is the default in-memory acceleration engine in Spice.

Arrow's main limitation is memory: the entire accelerated dataset must fit in RAM. For datasets that exceed available memory, on-disk engines are a better fit.

### DuckDB

DuckDB is an embedded analytical database that stores data on disk in a columnar format. It supports a rich SQL dialect (including window functions, CTEs, and complex aggregations) and performs well on analytical workloads over datasets that are too large for in-memory processing.

Spice supports DuckDB as an on-disk acceleration engine, making it suitable for multi-gigabyte datasets where in-memory caching is not practical.

### Choosing the Right Engine

The decision framework is straightforward:

- **Dataset fits in memory + lowest possible latency required:** Use Arrow (in-memory)
- **Dataset too large for memory + complex analytical queries:** Use DuckDB (on-disk)
- **Mixed workloads:** Use both: accelerate hot, frequently accessed datasets with Arrow and larger, less latency-sensitive datasets with DuckDB

## When to Accelerate vs. When to Federate

Not every dataset benefits from acceleration. The decision depends on query patterns, freshness requirements, and data volume.

**Accelerate when:**

- The dataset is queried frequently (dashboard queries, API endpoints, AI pipelines)
- Low latency is required (sub-second response times)
- The source system is slow or expensive to query (data warehouses billed per query, remote object stores)
- The dataset is small enough to cache cost-effectively

**Federate without acceleration when:**

- The dataset is queried infrequently (ad-hoc exploration, one-off reports)
- The source system is already fast enough for the use case
- Data freshness requirements are strict and CDC is not available
- The dataset is too large to cache practically

In practice, most production deployments use a mix: hot datasets are accelerated for performance, while the long tail of less-frequently-accessed data is queried via federation on demand.

## Acceleration for AI Workloads

AI applications place unique demands on data infrastructure. Models need fast access to embeddings, features, and context data, often with strict latency budgets measured in milliseconds.

### Embedding Caches

[Retrieval-augmented generation](/learn/retrieval-augmented-generation) systems search vector indexes to find relevant context for LLM prompts. Accelerating the embedding store locally eliminates the network round-trip to a remote vector database, reducing retrieval latency from hundreds of milliseconds to single-digit milliseconds.

### Feature Stores

Machine learning models consume feature vectors at inference time. Accelerating feature data in an in-memory engine ensures that model serving pipelines can retrieve features without blocking on slow source queries.

### RAG Index Acceleration

RAG systems combine vector search with structured data retrieval. Accelerating both the vector index and the associated metadata tables ensures that the full RAG pipeline (retrieval, context assembly, and LLM prompt construction) runs within tight latency budgets.

## The Spice Acceleration Architecture

[Spice](/platform/sql-federation-acceleration) combines SQL federation and data acceleration in a single runtime. The architecture works as follows:

1. **Define datasets** in a Spicepod configuration file, specifying the source connector and acceleration settings (engine, refresh mode, refresh interval)
2. **Initial load:** Spice reads the full dataset from the source and loads it into the local acceleration engine
3. **Query routing:** Incoming SQL queries are routed to the local acceleration engine for accelerated datasets, or federated to the source for non-accelerated datasets
4. **Refresh:** CDC streams or scheduled refresh cycles keep the acceleration cache synchronized with the source

A Spicepod dataset configuration looks like:

```yaml
datasets:
  - from: postgres:orders
    name: orders
    acceleration:
      engine: arrow
      refresh_mode: changes
      refresh_check_interval: 1s
```

This configuration connects to a PostgreSQL `orders` table, accelerates it in-memory using Arrow, and refreshes via CDC with a 1-second check interval. Queries against this dataset return in milliseconds, backed by data that is at most seconds behind the source. That latency profile is why [high-performance cybersecurity applications](/industry/cybersecurity) put acceleration in front of their log and event stores.

For workloads that need to scale beyond a single node, [Spice Cayenne](/blog/introducing-spice-cayenne-data-accelerator) provides a next-generation acceleration engine built for high-throughput [data lake](/use-case/datalake-accelerator) workloads.

## Advanced Topics

### Cache Eviction Strategies

When the acceleration layer has finite memory or disk capacity, it must decide which data to evict when new data arrives. The eviction strategy directly affects cache hit rates and query performance.

**LRU (Least Recently Used)** evicts the data that has not been accessed for the longest time. This works well when query patterns follow temporal locality: recently accessed datasets are likely to be accessed again soon. LRU is simple to implement but can be defeated by sequential scans: a single large query that touches every cached dataset can flush the entire cache.

**LFU (Least Frequently Used)** evicts the data accessed the fewest times. This protects frequently accessed datasets from being evicted by one-off queries, but it can be slow to adapt when access patterns shift: a dataset that was popular last week keeps its high frequency count even if it is no longer relevant.

**TTL (Time-To-Live)** evicts data based on age rather than access patterns. Each cached dataset has a configured TTL, and data is evicted (or marked for refresh) when the TTL expires. TTL-based eviction is common in acceleration layers because it directly controls freshness: a 5-minute TTL guarantees that cached data is never more than 5 minutes stale. TTL works well in combination with [CDC-based refresh](/learn/change-data-capture), where TTL serves as a fallback eviction mechanism when CDC streams are unavailable.

In practice, most acceleration engines combine strategies. For example, Spice's acceleration layer uses CDC or scheduled refresh to keep data current (effectively a freshness-driven policy) and relies on the configured engine's memory management for capacity-based eviction.

### Tiered Storage

A single acceleration engine is often not sufficient for diverse workloads. Tiered storage addresses this by placing data in different engines based on access patterns and performance requirements.

The typical tiers are:

- **Hot tier (in-memory, Arrow):** Datasets queried hundreds or thousands of times per minute: embedding lookups, real-time dashboard queries, feature store reads. Sub-millisecond latency, limited by RAM.
- **Warm tier (on-disk, DuckDB):** Datasets queried regularly but without sub-millisecond requirements: hourly reports, batch analytics, ad-hoc exploration over moderate-sized datasets. Millisecond-range latency, limited by SSD capacity.
- **Cold tier (federated, no acceleration):** Datasets queried infrequently or too large to cache. Queries are federated to the source system on demand. Latency depends on source performance.

Tiered storage can be configured statically (the operator assigns each dataset to a tier) or dynamically (the engine promotes and demotes datasets between tiers based on observed access patterns). Static assignment is simpler and more predictable. Dynamic tiering optimizes resource utilization but adds complexity in monitoring and debugging.

### Consistency Models

Acceleration introduces a fundamental tradeoff between performance and consistency. The cached copy may lag behind the source, so queries against the acceleration layer may return slightly stale data.

**Eventual consistency** is the default model for most acceleration deployments. The acceleration layer is updated asynchronously (via CDC or scheduled refresh), and queries may return data that is seconds to minutes behind the source. This model is acceptable for dashboards, analytics, and most AI workloads where slight staleness does not affect correctness.

**Read-your-writes consistency** guarantees that if an application writes to the source and then reads from the acceleration layer, it sees its own write. Achieving this requires either synchronous refresh (the acceleration layer is updated before the write is acknowledged, which adds latency) or write-awareness (the application marks certain reads as requiring the latest data, and the acceleration layer routes those reads to the source instead of the cache).

**Strong consistency** guarantees that the acceleration layer always reflects the current source state. This is impractical for most acceleration deployments because it requires synchronous coordination between the source and the cache, negating the latency benefits of acceleration. When strong consistency is required, the better approach is to query the source directly via [SQL federation](/learn/sql-federation) and reserve acceleration for workloads that tolerate eventual consistency.

<ContentRichText
  fields={{
    coverage: 'rc-end',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<AccordionFaq
  fields={{
    heading: 'Data Acceleration FAQ',
    paragraph: '',
    items: [
      {
        title: 'What is the difference between data acceleration and caching?',
        paragraph:
          '<p>Traditional caching (Redis, Memcached) stores key-value pairs and requires application logic to manage <a href="/learn/cache-invalidation-at-scale">cache invalidation</a>. Data acceleration caches entire datasets in a queryable SQL engine and supports automatic refresh via CDC or scheduled sync. Acceleration preserves the full SQL interface, so applications query the acceleration layer with standard SQL rather than key-based lookups.</p>',
      },
      {
        title: 'How fresh is accelerated data?',
        paragraph:
          '<p>Freshness depends on the refresh strategy. CDC-based refresh keeps accelerated data within seconds of the source. Scheduled refresh introduces a staleness window equal to the refresh interval (e.g., a 1-minute schedule means data can be up to 1 minute behind). Append-only refresh for event data is typically near-real-time for new data.</p>',
      },
      {
        title: 'When should I accelerate data vs. query the source directly?',
        paragraph:
          '<p>Accelerate when datasets are queried frequently, low latency is critical, or the source system is slow or expensive to query. Query the source directly (via federation) when access is infrequent, the source is already fast enough, or the dataset is too large to cache cost-effectively. Most production deployments accelerate hot datasets and federate the rest.</p>',
      },
      {
        title: 'How does data acceleration differ from materialized views?',
        paragraph:
          '<p>Materialized views are a database-internal feature that precomputes and stores query results within the same database. Data acceleration caches data from external sources in a local engine, often a different engine than the source. Acceleration works across heterogeneous data sources (PostgreSQL, S3, Databricks), while materialized views are limited to a single database.</p>',
      },
      {
        title: 'What are the cost implications of data acceleration?',
        paragraph:
          '<p>Data acceleration trades compute and storage resources at the edge or application layer for reduced load and cost at the source. In-memory acceleration (Arrow) requires RAM proportional to dataset size. On-disk acceleration (DuckDB) requires local SSD storage. The cost savings come from reduced source query volume, lower data warehouse bills (for usage-based pricing), and eliminated ETL pipeline infrastructure.</p>',
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<ContentResourceFeatured
  fields={{
    heading: 'Learn more about data acceleration',
    paragraph:
      'Guides, blog posts, and documentation on accelerating queries and keeping data fresh.',
    mode: 'default',
    resources: [
      {
        source: 'manual',
        resource: null,
        resource_manual: {
          eyebrow: 'Docs',
          title: {
            title: 'Spice.ai OSS Documentation',
            url: 'https://spiceai.org/docs',
            target: '_blank',
          },
          description:
            'Learn how Spice accelerates datasets locally with Arrow and DuckDB, kept fresh via CDC and scheduled refresh.',
          image: {
            ID: 1661,
            id: 1661,
            title: 'Docs jpeg',
            filename: 'Docs-jpeg.jpeg',
            filesize: 103192,
            url: '/website-assets/media/2025/12/Docs-jpeg.jpeg',
            link: '/docs-jpeg/',
            alt: '',
            author: '9',
            description: '',
            caption: '',
            name: 'docs-jpeg',
            status: 'inherit',
            uploaded_to: 0,
            date: '2025-12-05 04:13:53',
            modified: '2025-12-05 04:13:53',
            menu_order: 0,
            mime_type: 'image/jpeg',
            type: 'image',
            subtype: 'jpeg',
            icon: '/website-assets/media/default.png',
            width: 1832,
            height: 1036,
            sizes: {
              thumbnail: '/website-assets/media/2025/12/Docs-jpeg-150x150.jpeg',
              'thumbnail-width': 150,
              'thumbnail-height': 150,
              medium: '/website-assets/media/2025/12/Docs-jpeg-300x170.jpeg',
              'medium-width': 300,
              'medium-height': 170,
              medium_large:
                '/website-assets/media/2025/12/Docs-jpeg-768x434.jpeg',
              'medium_large-width': 768,
              'medium_large-height': 434,
              large: '/website-assets/media/2025/12/Docs-jpeg-1024x579.jpeg',
              'large-width': 1024,
              'large-height': 579,
              '1536x1536':
                '/website-assets/media/2025/12/Docs-jpeg-1536x869.jpeg',
              '1536x1536-width': 1536,
              '1536x1536-height': 869,
              '2048x2048': '/website-assets/media/2025/12/Docs-jpeg.jpeg',
              '2048x2048-width': 1832,
              '2048x2048-height': 1036,
            },
          },
        },
      },
      {
        source: 'picker',
        resource: [
          {
            title:
              'Introducing Spice Cayenne: The Next-Generation Data Accelerator',
            slug: '/blog/introducing-spice-cayenne-data-accelerator',
            excerpt:
              'Spice Cayenne is the next-gen data accelerator for high-scale workloads.',
            image:
              '/website-assets/media/2025/12/Spice-Cayenne-Blog-Header.png',
            type: 'Blog',
            taxonomy: ['Spice AI'],
          },
        ],
        resource_manual: {
          eyebrow: '',
          title: null,
          description: '',
          image: false,
        },
      },
      {
        source: 'picker',
        resource: [
          {
            title:
              'Getting Started with Spice.ai SQL Query Federation & Acceleration',
            slug: '/blog/spice-sql-query-federation-acceleration',
            excerpt:
              'Learn how to use Spice.ai to federate and accelerate queries.',
            image:
              '/website-assets/media/2025/11/68ee96eb08a0dfcb609c1969_Version-7-1.png',
            type: 'Blog',
            taxonomy: ['Spice AI'],
          },
        ],
        resource_manual: {
          eyebrow: '',
          title: null,
          description: '',
          image: false,
        },
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<TalkToAnEngineerCta />

---

## Data Lakehouse vs Data Warehouse: How to Choose
URL: https://spice.ai/learn/data-lakehouse-vs-data-warehouse
Date: 2026-08-05T00:00:00
Description: Compare data lakehouses and data warehouses: two architectures for analytical data. Learn the key differences in storage formats, cost, workload fit, and application-serving latency, and when each is appropriate.

<HeroCenteredText
  fields={{
    graphic_position: 'no-graphic',
    heading_tag: 'h1',
    heading: 'Data Lakehouse vs Data Warehouse',
    paragraph:
      'A data warehouse stores structured data in a proprietary, tightly integrated system optimized for BI, while a data lakehouse layers warehouse capabilities over open table formats on object storage. The two differ in openness, cost model, workload breadth, and how they serve applications.',
    cta: [
      {
        type: 'filled',
        cta: {
          title: 'See Spice analytics',
          url: '/platform/analytics',
          target: '',
        },
      },
      {
        type: 'bordered',
        cta: {
          title: 'Read the docs',
          url: 'https://spiceai.org/docs',
          target: '_blank',
        },
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<ContentRichText
  fields={{
    coverage: 'rc-start',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

For decades, the data warehouse was the default destination for analytical data: load structured data in, run SQL, feed dashboards. The data lakehouse emerged as an alternative that keeps data in open file formats on cheap object storage while adding the transactional guarantees and SQL performance that warehouses pioneered. For workloads where freshness and query latency drive the decision instead, see [Snowflake alternatives for real-time SQL](/learn/snowflake-alternatives-for-real-time-sql).

A data warehouse is a tightly integrated system: storage layout, query engine, and catalog are designed together, usually by a single vendor. Data must be loaded into the warehouse's internal format before it can be queried, a step known as schema-on-write, and everything from access control to compute scaling happens inside the platform.

A data lakehouse decomposes that stack. Data lives in open columnar files (typically Parquet) on object storage such as S3, organized by an open table format like [Apache Iceberg](/learn/apache-iceberg) or [Delta Lake](/learn/delta-lake) that adds ACID transactions, schema evolution, and time travel. Any compatible engine can then query the same tables, so compute and storage are owned and scaled independently.

Most published comparisons stop at analytics: which architecture runs BI queries faster or cheaper. This guide covers that ground, and adds a dimension those comparisons usually skip: what happens when applications and AI agents, not analysts, need to query the data.

## How a Data Warehouse Works

A data warehouse ingests data through ETL or ELT pipelines that validate and reshape it into the warehouse's internal storage format at load time. Because the engine controls the physical layout (compression, sort order, statistics, indexing), it can optimize aggressively for the query patterns warehouses serve: large scans, joins, and aggregations over structured tables.

Key characteristics of a data warehouse:

- **Schema-on-write:** Data is validated and structured at load time, so queries always run against clean, well-typed tables. The cost is up-front modeling work and pipeline maintenance for every source.
- **Integrated engine and storage:** One system owns the data end to end, which enables strong performance out of the box, fine-grained governance, and mature workload management.
- **Proprietary format:** The internal representation is not directly readable by other tools. Getting data out for another engine, an ML framework, or an application means exporting it.
- **Consumption-based pricing:** Managed warehouses typically bill by compute time or scanned data, which is convenient at small scale and a budget line item that grows with query volume.

Warehouses remain the strongest choice for governed BI on structured data: reliable dashboards, financial reporting, and SQL analytics where the schema is known and the audience is analysts.

## How a Data Lakehouse Works

A data lakehouse stores tables as open files on object storage and layers a table format over them. The table format maintains a metadata tree (snapshots, manifests, and file statistics) that gives engines a transactional view of which files constitute the table at any point in time. That metadata is what turns a directory of Parquet files into a table with ACID commits, safe concurrent writers, schema evolution, and time travel.

Key characteristics of a data lakehouse:

- **Open storage:** Data sits in standard formats (Parquet files, Iceberg or Delta metadata) that any compatible engine can read. There is no export step and no single-vendor gate on access.
- **Decoupled compute:** Multiple engines (batch, streaming, interactive SQL, ML) operate on the same tables. Teams pick the engine per workload and scale it independently of storage.
- **Storage economics:** Object storage costs a fraction of warehouse-managed storage, which makes it practical to keep raw history, semi-structured data, and ML training sets in one place.
- **Assembly required:** The flexibility comes from composing parts: a catalog, one or more engines, ingestion, and governance tooling. Operating that stack is more engineering-intensive than adopting a single integrated platform.

Lakehouses fit organizations with diverse workloads (SQL analytics plus data science plus streaming), large or semi-structured datasets, and a preference for open formats over vendor-managed storage.

## Key Differences: Side-by-Side Comparison

The following table summarizes the core tradeoffs across the dimensions that matter most when choosing between the two architectures.

| Dimension               | Data Warehouse                                                     | Data Lakehouse                                                                    |
| ----------------------- | ------------------------------------------------------------------ | --------------------------------------------------------------------------------- |
| **Storage format**      | Proprietary internal format, readable only by the warehouse engine | Open files (Parquet) plus open table metadata (Iceberg, Delta Lake)               |
| **Schema handling**     | Schema-on-write; modeled and validated at load time                | Schema enforced by the table format, with flexible evolution and partial loads    |
| **Compute and storage** | Integrated; scaled and billed through one vendor                   | Decoupled; any compatible engine queries the same storage                         |
| **Workload breadth**    | SQL analytics and BI                                               | SQL analytics, streaming, data science, and ML on one copy of the data            |
| **Storage cost**        | Premium, warehouse-managed                                         | Object storage rates; economical for large volumes and long history               |
| **Operational model**   | One integrated platform to run and govern                          | Composed stack: catalog, engines, ingestion, and governance assembled by the team |
| **Lock-in profile**     | Data and workloads coupled to the vendor's format and engine       | Data portable across engines; individual engines replaceable                      |
| **Application serving** | Not designed for it: per-query cost and concurrency limits         | Not by default: object storage latency needs an acceleration or serving layer     |

The last row deserves emphasis because it applies to both columns: neither architecture serves high-concurrency, low-latency application queries by default. Warehouses meter and queue queries designed for analysts, and raw lakehouse scans pay object storage latency on every read. Application serving is a separate design decision in either architecture.

## Decision Framework

Four questions separate the architectures in practice.

### 1. How diverse are the workloads?

If the workload is governed BI over structured data, a warehouse delivers the most capability per unit of engineering effort. If the same data must also feed ML training, streaming jobs, and ad-hoc data science, the lakehouse's one-copy, many-engines model avoids maintaining parallel copies in warehouse and lake.

### 2. How much does openness matter?

Open table formats keep the data layer independent of any single vendor: engines can be swapped or added without rewriting storage. Teams that have absorbed a painful warehouse migration, or that negotiate contracts with data gravity working against them, tend to weight this heavily. Teams standardized on one vendor's ecosystem may reasonably value integration over portability.

### 3. What does the cost curve look like at scale?

Warehouse pricing concentrates cost in compute and managed storage, which is efficient for moderate, predictable analytics and expensive for large raw history or exploratory scanning. Lakehouse storage is cheap, but engineering time to operate the composed stack is real and should be counted. The honest comparison is total cost including the pipelines and platform team, not the storage bill alone.

### 4. Who queries the data: analysts, or applications?

This is the question analytics-focused comparisons skip. Dashboards tolerate seconds of latency and dozens of concurrent users; applications and AI agents need milliseconds and thousands of concurrent queries. Neither a warehouse nor a raw lakehouse meets that profile economically: warehouse per-query pricing punishes chatty applications, and object storage round trips put a floor on lakehouse latency. If applications are in scope, plan for a serving or [data acceleration](/learn/data-acceleration) layer in front of either architecture from the start.

### Quick Reference

- **Choose a data warehouse** for governed BI on structured data, when one integrated platform fits the team's operating model and data volumes are moderate.
- **Choose a data lakehouse** for diverse workloads over large or semi-structured data, when open formats and engine flexibility justify operating a composed stack.
- **Plan a serving layer either way** when applications or AI agents query the data, because neither architecture serves low-latency, high-concurrency reads by default.

## Advanced Topics

### How Open Table Formats Provide ACID on Object Storage

Object stores offer no multi-file transactions, so table formats build them in metadata. Each commit writes new data files plus a new metadata snapshot listing exactly which files constitute the table version; readers resolve the current snapshot from the catalog and see a consistent table, never a half-written state. Optimistic concurrency handles simultaneous writers: both prepare commits, one wins the atomic catalog swap, the loser retries against the new snapshot. Old snapshots remain addressable, which is what enables time travel and incremental reads between versions. [Apache Iceberg and Delta Lake](/learn/apache-iceberg-vs-delta-lake) implement this differently (Iceberg through manifest trees, Delta through a JSON transaction log), with consequences for metadata scalability on very large tables.

### The Medallion Pattern and Its Cost

Lakehouse deployments commonly layer tables into bronze (raw), silver (cleaned), and gold (aggregated) zones. The pattern brings order to schema-on-read chaos, but each layer is a materialized copy with its own pipeline, storage, and freshness lag, and gold tables often reimplement the modeling work a warehouse would have required up front. When evaluating lakehouse cost against a warehouse, count the medallion pipelines: schema-on-write did not disappear, it moved into transformation jobs.

### Closing the Application-Serving Gap

Both architectures resolve the serving problem the same way: place a fast, application-local query layer in front of the analytical store. The serving layer materializes the hot subset of tables (recent partitions, specific columns, pre-filtered rows) into an engine designed for millisecond point and range queries, refreshing continuously as the underlying tables commit. Queries from applications hit the local copy; the lakehouse or warehouse remains the durable system of record and the target for heavy analytics. This is the same separation of concerns as a read replica in operational databases, applied to analytical storage, and it changes the economics: application traffic stops consuming metered warehouse compute or repeated object storage reads.

## The Operational Data Lakehouse with Spice

Spice extends the lakehouse pattern to application and AI workloads: what the [operational data lakehouse](/use-case/operational-data-lakehouse) use case describes. Spice federates SQL across warehouses, lakehouse tables (Iceberg, Delta Lake, and Parquet on object storage), and operational databases through its [40+ connectors](/integrations), so both architectures in this comparison are queryable from one endpoint rather than competing destinations.

For the application-serving gap specifically, Spice acts as the serving layer described above. Hot datasets are accelerated from the lakehouse into local engines as a [data lake accelerator](/use-case/datalake-accelerator), turning object-storage-latency tables into millisecond queries; Barracuda uses this pattern to serve email archive queries from S3 Parquet at a P99 of 100-200 milliseconds. For operational databases, Spice maintains [analytics replicas](/platform/analytics) synchronized through change data capture, so applications and AI agents query fresh analytical copies without loading the source systems. Teams keep the warehouse or lakehouse as the system of record and add the serving tier where applications need it.

<ContentRichText
  fields={{
    coverage: 'rc-end',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<AccordionFaq
  fields={{
    heading: 'Data Lakehouse vs Data Warehouse FAQ',
    paragraph: '',
    items: [
      {
        title: 'Can a data lakehouse replace a data warehouse?',
        paragraph:
          '<p>For many workloads, yes: modern table formats and SQL engines deliver warehouse-grade reliability and performance on open storage. Organizations with mature governed BI often keep a warehouse for that workload while building new analytics, streaming, and ML on the lakehouse, so full replacement is a migration decision rather than a technical necessity.</p>',
      },
      {
        title: 'Is a data lakehouse cheaper than a data warehouse?',
        paragraph:
          '<p>Storage is significantly cheaper because data sits in Parquet on object storage rather than premium warehouse-managed storage. Total cost depends on more than storage: lakehouses shift spend toward the engineering effort of operating a composed stack, while warehouses concentrate it in metered compute. Large data volumes and diverse engines favor the lakehouse; small, predictable BI workloads often do not.</p>',
      },
      {
        title:
          'What is the difference between a data lake and a data lakehouse?',
        paragraph:
          '<p>A data lake is raw file storage with no transactional guarantees: writers can conflict, partial writes are visible, and schema is whatever each file contains. A lakehouse adds an open table format (such as Apache Iceberg or Delta Lake) over those files, providing ACID transactions, schema enforcement and evolution, and time travel, which makes the lake reliable enough for warehouse-style workloads.</p>',
      },
      {
        title: 'Can applications query a data lakehouse directly?',
        paragraph:
          '<p>They can, but object storage round trips put a floor of hundreds of milliseconds on cold queries, and high-concurrency application traffic multiplies that cost. Production architectures place an acceleration or serving layer in front of the lakehouse that materializes hot data locally and serves it in milliseconds, while the lakehouse remains the system of record.</p>',
      },
      {
        title: 'How does Spice work with data lakehouses and warehouses?',
        paragraph:
          '<p>Spice federates SQL queries across lakehouse tables (Apache Iceberg, Delta Lake, Parquet on object storage), cloud warehouses, and operational databases through a single endpoint. Hot datasets can be accelerated into local engines for millisecond application and AI queries, using scheduled refresh or <a href="/feature/real-time-change-data-capture">real-time change data capture</a>, so the lakehouse or warehouse stays the system of record while Spice serves the application tier.</p>',
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<ContentResourceFeatured
  fields={{
    heading: 'Learn more about lakehouse architectures',
    paragraph:
      'Guides and blog posts on querying, accelerating, and operationalizing data lakehouse and warehouse data.',
    mode: 'default',
    resources: [
      {
        source: 'manual',
        resource: null,
        resource_manual: {
          eyebrow: 'Docs',
          title: {
            title: 'Spice Documentation',
            url: 'https://spiceai.org/docs',
            target: '_blank',
          },
          description:
            'Learn how Spice federates and accelerates queries across data lakehouses, warehouses, and operational databases.',
          image: {
            ID: 1661,
            id: 1661,
            title: 'Docs jpeg',
            filename: 'Docs-jpeg.jpeg',
            filesize: 103192,
            url: '/website-assets/media/2025/12/Docs-jpeg.jpeg',
            link: '/docs-jpeg/',
            alt: '',
            author: '9',
            description: '',
            caption: '',
            name: 'docs-jpeg',
            status: 'inherit',
            uploaded_to: 0,
            date: '2025-12-05 04:13:53',
            modified: '2025-12-05 04:13:53',
            menu_order: 0,
            mime_type: 'image/jpeg',
            type: 'image',
            subtype: 'jpeg',
            icon: '/website-assets/media/default.png',
            width: 1832,
            height: 1036,
            sizes: {
              thumbnail: '/website-assets/media/2025/12/Docs-jpeg-150x150.jpeg',
              'thumbnail-width': 150,
              'thumbnail-height': 150,
              medium: '/website-assets/media/2025/12/Docs-jpeg-300x170.jpeg',
              'medium-width': 300,
              'medium-height': 170,
              medium_large:
                '/website-assets/media/2025/12/Docs-jpeg-768x434.jpeg',
              'medium_large-width': 768,
              'medium_large-height': 434,
              large: '/website-assets/media/2025/12/Docs-jpeg-1024x579.jpeg',
              'large-width': 1024,
              'large-height': 579,
              '1536x1536':
                '/website-assets/media/2025/12/Docs-jpeg-1536x869.jpeg',
              '1536x1536-width': 1536,
              '1536x1536-height': 869,
              '2048x2048': '/website-assets/media/2025/12/Docs-jpeg.jpeg',
              '2048x2048-width': 1832,
              '2048x2048-height': 1036,
            },
          },
        },
      },
      {
        source: 'picker',
        resource: [
          {
            title:
              'Making Object Storage Operational for Real-Time and AI Workloads',
            slug: '/blog/making-object-storage-operational',
            excerpt:
              'Transform object stores into real-time AI platforms. Spice adds federation, acceleration, hybrid search, and inference capabilities.',
            image:
              '/website-assets/media/2025/11/68e42f8a5daa71c139c95512_Version-2.png',
            type: 'Blog',
            taxonomy: ['Spice AI'],
          },
        ],
        resource_manual: {
          eyebrow: '',
          title: null,
          description: '',
          image: false,
        },
      },
      {
        source: 'picker',
        resource: [
          {
            title:
              'The Analytics Replica Pattern: The Shortest Path to Data-Grounded AI',
            slug: '/blog/the-analytics-replica-pattern-shortening-the-path-to-data-based-ai',
            excerpt:
              'The analytics replica pattern keeps operational systems isolated while delivering real-time analytical queries for AI agents and dashboards, without ETL or operational risk.',
            image:
              '/website-assets/media/2026/07/spice-analytics-replica-blog-header.svg',
            type: 'Blog',
            taxonomy: ['Spice AI', 'Engineering'],
          },
        ],
        resource_manual: {
          eyebrow: '',
          title: null,
          description: '',
          image: false,
        },
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<ContentCta
  fields={{
    override_global_setting: false,
    custom_content: { heading: '', paragraph: '', cta: null },
    padding_top: 'unset',
    padding_bottom: 'unset',
    gcta_heading: 'See Spice in action',
    gcta_paragraph:
      'Get a guided walkthrough of how development teams use Spice to query, accelerate, and integrate AI for mission-critical workloads.',
    gcta_cta: {
      title: 'Get a demo',
      url: 'https://meetings.hubspot.com/lukekim/talk-to-sales',
      target: '_blank',
    },
  }}
/>

---

## What is a Data Substrate?
URL: https://spice.ai/learn/data-substrate
Date: 2026-04-03T00:00:00
Description: A data substrate is a co-located data and AI layer that provides applications with sub-millisecond access to any data source. Learn how it differs from a data warehouse, lake, or lakehouse, and why it is an architectural primitive rather than a destination.

<HeroCenteredText
  fields={{
    graphic_position: 'no-graphic',
    heading_tag: 'h1',
    heading: 'What is a Data Substrate?',
    paragraph:
      'A data substrate is the persistent, co-located data and AI layer that sits alongside your application and provides sub-millisecond access to any data source, whether that source is a cloud warehouse, a relational database, a streaming system, or a file store. Unlike a data warehouse or lakehouse, a data substrate is not a destination where data is moved and stored permanently. It is infrastructure: a live, queryable surface that federates, accelerates, and serves data where the application runs.',
    cta: [
      {
        type: 'filled',
        cta: {
          title: 'See Spice in action',
          url: '/platform/sql-federation-acceleration',
          target: '',
        },
      },
      {
        type: 'bordered',
        cta: {
          title: 'Read the docs',
          url: 'https://spiceai.org/docs',
          target: '_blank',
        },
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<ContentRichText
  fields={{
    coverage: 'rc-start',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

Data infrastructure evolved through several architectural paradigms: the relational data warehouse (centralized, structured), the data lake (decentralized, schema-on-read), and the lakehouse (ACID semantics over lake storage). Each paradigm answers the question: *where should data be stored and how should it be organized?*

A data substrate answers a different question: *how should applications access data at the performance and freshness levels modern workloads require?* It plays a key role when teams evaluate [how to simplify data and AI application architectures](/learn/how-to-simplify-data-and-ai-application-architectures).

The substrate does not replace warehouses, lakes, or lakehouses. It federates them. It connects to every data source in the environment, serves data to applications through a unified SQL interface, and optionally accelerates hot data locally to eliminate round-trip latency. It is infrastructure that spans between application code and the data layer below.

## The Substrate vs. the Destination

The distinction between a substrate and a destination is fundamental:

**A data destination** (warehouse, lake, database) is where data *lives*. Data is moved into it via ETL pipelines, DBT transformations, or streaming ingestion. It stores data at rest and answers questions about historical state at whatever freshness the ingestion pipeline provides.

**A data substrate** is where data *is served*. It does not store data permanently; it maintains connectivity to the sources where data lives and provides applications with a queryable interface to all of them. When acceleration is configured, a local copy of a frequently accessed dataset is cached at the edge (co-located with the application) for sub-millisecond access. That cache is a projection of source data, not a canonical copy.

This distinction has practical consequences:

- **No data ownership problem.** Because the substrate federates rather than ingests, data governance remains at the source. Security, access control, and retention policies are enforced at the originating system.
- **No stale pipeline problem.** Data in a substrate is fresh by construction. Federation queries read directly from sources; acceleration caches are refreshed on a defined schedule or via [change data capture](/learn/change-data-capture). There is no ETL job that runs overnight and leaves applications querying yesterday's data.
- **No proliferation problem.** A data warehouse tends to accumulate copies: staging tables, marts, reporting tables, API cache tables. A substrate does not accumulate copies. It accelerates specific datasets on request and purges acceleration caches when datasets are retired.

## Why "Substrate"?

The terminology is intentional. A substrate, in ecology and biology, is the underlying surface on which an organism lives, not the organism itself. The substrate supports life; it does not direct it.

A data substrate in software architecture plays the same role. It is the foundational layer on which application logic depends for data access. Applications do not need to know whether a query is served from a local acceleration cache, a federated remote database, or a query fan-out across multiple sources. They issue SQL. The substrate handles routing, caching, and result delivery.

This abstraction is what makes a data substrate an infrastructure primitive rather than a product category. It is comparable to how a load balancer is infrastructure for HTTP traffic, or how a service mesh is infrastructure for service-to-service communication. The data substrate is infrastructure for data access.

## Key Properties of a Data Substrate

### 1. Federation Over Multiple Sources

A data substrate connects to any data source (cloud warehouses, relational databases, document stores, vector databases, object storage, streaming systems) and presents them through a unified SQL interface. Applications do not need separate drivers, ORMs, or API integrations for each source. The substrate handles connection pooling, protocol translation, and query routing.

[SQL federation](/platform/sql-federation-acceleration) is the mechanism that makes this possible. The substrate's query planner accepts SQL queries that reference any configured source, rewrites them into source-native queries, executes them in parallel where possible, and merges the results. Query fans out transparently; applications see a single result.

### 2. Co-located Data Acceleration

Latency-sensitive workloads (realtime dashboards, recommendation systems, feature stores, AI inference pipelines) cannot tolerate the 50-500 ms round-trip to a remote database on every query. A data substrate solves this by maintaining a local acceleration cache of frequently accessed datasets, co-located with the application (in the same pod, on the same host, or in the same data center tier).

The acceleration layer ([Spice Cayenne](/platform/sql-federation-acceleration)) stores data in a columnar format optimized for analytical queries (Vortex) and answers queries from local memory or disk with sub-millisecond latency. The cache is kept fresh via scheduled refresh or CDC-based real-time sync from the source.

This is the [sidecar pattern](/learn/sidecar-pattern) applied to data: the acceleration cache runs as a co-located service that intercepts all data queries, serves cached data instantly, and falls back to federation for uncached queries.

### 3. SQL + Embeddings in a Single Interface

Modern applications do not only run SQL queries. They also perform semantic search: finding documents, products, or records based on similarity to an embedding vector rather than exact values. A data substrate that only handles structured SQL leaves applications to manage a separate vector database with a separate query API, separate connection management, and separate result merging.

A complete data substrate serves both SQL and vector queries through the same interface. The application issues a [hybrid search](/platform/hybrid-sql-search) query (combining keyword filters with semantic similarity) and the substrate handles both execution paths and merges the results using [reciprocal rank fusion](/learn/reciprocal-rank-fusion) or weighted scoring.

### 4. Live Connectivity Without ETL

In a traditional architecture, fresh data requires an ETL pipeline that extracts from the source, transforms to a common schema, and loads into the destination. A data substrate eliminates this pipeline for most access patterns. Direct federation reads the source in real time; CDC-backed acceleration keeps the local cache synchronized to the source as changes land.

This is what architects describe as a [zero-ETL architecture](/learn/zero-etl): one where applications access fresh data without the latency, cost, and fragility of ETL pipelines.

## How a Data Substrate Differs From Other Architectures

| Architecture | Primary Purpose | Data Ownership | Freshness Model | Query Latency |
|---|---|---|---|---|
| Data warehouse | Analytical reporting | Centralized ingestion | Batch ETL (hours to days) | Seconds to minutes |
| Data lake | Cost-effective storage at scale | Source-adjacent files | Pipeline-dependent | Seconds to minutes via engine |
| Lakehouse | ACID transactions + open file format | Open files (Iceberg/Delta) | Streaming or batch ingestion | Seconds (engine-dependent) |
| Data mart | Business-unit-specific reporting | Derived from warehouse | Warehouse refresh cycle | Seconds |
| **Data substrate** | **Application data serving** | **Federated at source** | **Real-time (federation) or CDC-refreshed (acceleration)** | **Sub-millisecond (accelerated), seconds (federated)** |

The substrate is not a replacement for the warehouse or lakehouse. It is complementary. The warehouse stores historical analytical data; the substrate federates the warehouse alongside operational databases, streaming systems, and other sources, and serves the combined view to applications at latency levels the warehouse alone cannot provide.

## Data Substrate as a [Hybrid Data Architecture](/learn/hybrid-data-architecture) Component

The data substrate occupies the serving tier in a [hybrid data architecture](/learn/hybrid-data-architecture). In this model:

- **Storage tier:** Data lakes with [Apache Iceberg](/learn/apache-iceberg) or [Delta Lake](/learn/delta-lake) tables store historical and operational data at scale.
- **Processing tier:** Batch and stream processors (Spark, Flink, dbt) transform data and write results back to the storage tier or operational databases.
- **Serving tier:** The data substrate connects to all storage and processing outputs, federates them into a unified query surface, and accelerates frequently accessed datasets locally for low-latency access.

Applications interact exclusively with the serving tier. They do not need to know that the user profile is in PostgreSQL, the product catalog is in DynamoDB, and the purchase history is in Snowflake. The substrate knows, and it routes queries accordingly.

## Implementation with Spice

Spice implements the data substrate pattern:

- **Spicelets** define connected data sources, their schemas, and their acceleration configuration.
- **Federation queries** are executed by Apache DataFusion, which rewrites SQL across all configured sources and executes them in parallel.
- **Acceleration caches** are managed by Spice Cayenne (Vortex-backed) for columnar datasets and DuckDB or in-memory Arrow for smaller working sets.
- **CDC sync** uses change data capture connectors to keep acceleration caches synchronized to source data in real time.
- **Embeddings and hybrid search** are handled in the same query plane: applications can issue hybrid SQL + vector queries through the same endpoint.

Spice runs as a sidecar container alongside application code, or as a shared service for an application cluster. Either deployment model fits the co-location principle that makes the substrate pattern effective.

## Advanced Topics

### The Substrate as a Feature Store

Machine learning pipelines require a feature store: a system that serves pre-computed feature values to models at inference time with low latency. Traditional feature stores are purpose-built systems with separate data ingestion pipelines, specialized storage, and custom serving APIs.

A data substrate can serve as the feature store for many ML inference workloads. Accelerated datasets contain feature values computed by upstream pipelines; the substrate serves them to the inference layer at sub-millisecond latency through SQL. Because the substrate is also the source for operational queries, feature values stay in sync with the data the application acts on; there is no separate pipeline maintaining a parallel feature store.

### Substrate-Level Query Caching vs. Application-Level Caching

Application caches (Redis, Memcached) store the results of specific API calls as opaque byte blobs. They answer exact-match lookups and cannot handle any query variation without a cache miss. They also have no awareness of data changes: invalidation requires either short TTLs (stale data) or explicit cache keys tied to data mutation events (complex invalidation logic).

A data substrate's acceleration layer is query-aware. It stores data in structured columnar form and executes arbitrary SQL queries over the accelerated data. It handles query variations (different filters, aggregations, projections) over the cached dataset without requiring a full remote round-trip. Invalidation is data-driven: CDC events trigger cache updates at the row level, keeping the acceleration cache fresh without TTL-based staleness.

This structural difference makes substrate-level caching more powerful than application-level caching for data workloads: it handles ad-hoc queries, stays fresh via data sync rather than TTLs, and requires no cache key management in application code.

### Data Substrate at the Edge

As inference workloads move to the edge (mobile devices, embedded systems, edge servers), the data substrate pattern follows. An edge node running an AI inference model needs access to context data (user preferences, local sensor readings, recently seen items) without a round-trip to a central data store. A local substrate instance accelerates the relevant context data on the edge device and federates to central sources when connectivity allows.

This is a direct extension of the sidecar co-location principle: the substrate runs on the device, near the inference process, and provides the same SQL interface regardless of connectivity state.

<ContentRichText
  fields={{
    coverage: 'rc-end',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<AccordionFaq
  fields={{
    heading: 'Data Substrate FAQ',
    paragraph: '',
    items: [
      {
        title: 'What is a data substrate?',
        paragraph:
          '<p>A data substrate is a co-located data and AI infrastructure layer that provides applications with sub-millisecond access to any data source via SQL. It federates multiple sources (warehouses, databases, streaming systems) through a unified query interface and optionally accelerates hot datasets locally to eliminate round-trip latency. Unlike a data warehouse, the substrate does not store data permanently; it serves data where the application runs.</p>',
      },
      {
        title: 'How is a data substrate different from a data warehouse?',
        paragraph:
          '<p>A data warehouse is a destination where data is ingested via ETL and stored for historical analysis. A data substrate is serving infrastructure: it federates live data from warehouses, databases, and other sources and serves that data to applications at sub-millisecond speed. The two are complementary: the warehouse stores historical data; the substrate federates and serves it alongside operational data sources.</p>',
      },
      {
        title: 'How is a data substrate different from a data lake or lakehouse?',
        paragraph:
          "<p>A data lake or lakehouse is storage infrastructure for large-scale data organized in open formats like Apache Iceberg or Delta Lake. A data substrate is a serving layer that connects to the lake or lakehouse (and other sources) and serves data to applications at low latency. The substrate reads from the lake via federation and may accelerate the most-accessed tables locally, but the lake remains the authoritative storage layer.</p>",
      },
      {
        title: 'What is the relationship between a data substrate and zero-ETL?',
        paragraph:
          '<p>Zero-ETL architectures eliminate the ETL pipeline between source systems and the consuming application. A data substrate is the enabling infrastructure for zero-ETL: it federates source data in real time (no extraction and loading required) and keeps acceleration caches synchronized via CDC (no transformation pipeline required). The substrate is the layer that makes zero-ETL practical for production workloads.</p>',
      },
      {
        title: 'Does Spice implement the data substrate?',
        paragraph:
          '<p>Yes. Spice is designed as a data substrate: it connects to any data source, federates queries across all sources through a unified SQL interface, accelerates hot datasets locally using Spice Cayenne (Vortex-backed columnar storage), and supports hybrid SQL + vector search in the same query plane. Spice runs as a sidecar co-located with application code, which is the canonical deployment model for a data substrate.</p>',
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<ContentResourceFeatured
  fields={{
    heading: 'Learn more about the data substrate',
    paragraph:
      'Architecture guides on data substrate design and implementation with Spice.',
    mode: 'default',
    resources: [
      {
        source: 'manual',
        resource: null,
        resource_manual: {
          eyebrow: 'Docs',
          title: {
            title: 'Spice.ai OSS Documentation',
            url: 'https://spiceai.org/docs',
            target: '_blank',
          },
          description:
            'Get started with Spice as a data substrate: connect data sources, configure acceleration, and query federated data through a unified SQL interface.',
          image: {
            ID: 1661,
            id: 1661,
            title: 'Docs jpeg',
            filename: 'Docs-jpeg.jpeg',
            filesize: 103192,
            url: '/website-assets/media/2025/12/Docs-jpeg.jpeg',
            link: '/docs-jpeg/',
            alt: '',
            author: '9',
            description: '',
            caption: '',
            name: 'docs-jpeg',
            status: 'inherit',
            uploaded_to: 0,
            date: '2025-12-05 04:13:53',
            modified: '2025-12-05 04:13:53',
            menu_order: 0,
            mime_type: 'image/jpeg',
            type: 'image',
            subtype: 'jpeg',
            icon: '/website-assets/media/default.png',
            width: 1832,
            height: 1036,
            sizes: {
              thumbnail: '/website-assets/media/2025/12/Docs-jpeg-150x150.jpeg',
              'thumbnail-width': 150,
              'thumbnail-height': 150,
              medium: '/website-assets/media/2025/12/Docs-jpeg-300x170.jpeg',
              'medium-width': 300,
              'medium-height': 170,
              medium_large:
                '/website-assets/media/2025/12/Docs-jpeg-768x434.jpeg',
              'medium_large-width': 768,
              'medium_large-height': 434,
              large: '/website-assets/media/2025/12/Docs-jpeg-1024x579.jpeg',
              'large-width': 1024,
              'large-height': 579,
              '1536x1536':
                '/website-assets/media/2025/12/Docs-jpeg-1536x869.jpeg',
              '1536x1536-width': 1536,
              '1536x1536-height': 869,
              '2048x2048': '/website-assets/media/2025/12/Docs-jpeg.jpeg',
              '2048x2048-width': 1832,
              '2048x2048-height': 1036,
            },
          },
        },
      },
      {
        source: 'picker',
        resource: [
          {
            title: 'Building an Enterprise SRE Agent with OpenClaw and Spice',
            slug: '/blog/openclaw-and-spice-governed-access-to-production-data-for-enterprise-agents',
            excerpt:
              'How to build an OpenClaw SRE with Spice for safe, unified, and observable access to production data, demonstrated with real-world incident workflows.',
            image:
              '/website-assets/media/2026/05/openclaw-blog-header.svg',
            type: 'Blog',
            taxonomy: ['Spice AI', 'Engineering'],
          },
        ],
        resource_manual: {
          eyebrow: '',
          title: null,
          description: '',
          image: false,
        },
      },
      {
        source: 'picker',
        resource: [
          {
            title: 'How we use Apache DataFusion at Spice AI',
            slug: '/blog/how-we-use-apache-datafusion-at-spice-ai',
            excerpt:
              'A technical overview of how Spice extends Apache DataFusion with custom table providers, optimizer rules, and UDFs to power federated SQL, search, and AI inference.',
            image:
              '/website-assets/media/2026/01/Engineering-at-Spice-AI-Apache-DataFusion.png',
            type: 'Blog',
            taxonomy: [
              'Spice AI',
              'Spice Cloud Platform',
              'Spice OSS',
              'SQL Federation',
            ],
          },
        ],
        resource_manual: {
          eyebrow: '',
          title: null,
          description: '',
          image: false,
        },
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<ContentCta
  fields={{
    override_global_setting: false,
    custom_content: { heading: '', paragraph: '', cta: null },
    padding_top: 'unset',
    padding_bottom: 'unset',
    gcta_heading: 'See Spice in action',
    gcta_paragraph:
      'Get a guided walkthrough of how development teams use Spice to query, accelerate, and integrate AI for mission-critical workloads.',
    gcta_cta: {
      title: 'Get a demo',
      url: 'https://meetings.hubspot.com/vladi-semenov',
      target: '_blank',
    },
  }}
/>

---

## Data Virtualization vs Data Replication: How to Choose
URL: https://spice.ai/learn/data-virtualization-vs-replication
Date: 2026-01-15T00:00:00
Description: Compare data virtualization and data replication: two foundational approaches to data integration. Learn the key differences, tradeoffs, and when each approach is appropriate for your workloads.

<HeroCenteredText
  fields={{
    graphic_position: 'no-graphic',
    heading_tag: 'h1',
    heading: 'Data Virtualization vs Data Replication',
    paragraph:
      'Data virtualization and data replication are two foundational approaches to making data available across systems. Each involves distinct tradeoffs in freshness, performance, cost, and operational complexity, and most production architectures benefit from combining both.',
    cta: [
      {
        type: 'filled',
        cta: {
          title: 'See Spice data platform',
          url: '/platform/sql-federation-acceleration',
          target: '',
        },
      },
      {
        type: 'bordered',
        cta: {
          title: 'Read the docs',
          url: 'https://spiceai.org/docs/features/query-federation',
          target: '',
        },
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<ContentRichText
  fields={{
    coverage: 'rc-start',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

When an application, dashboard, or AI model needs data from multiple systems (transactional databases, cloud warehouses, object stores, SaaS APIs), engineering teams face a fundamental design decision: query the data where it lives, or copy it somewhere faster and closer.

[Data virtualization](/learn/data-virtualization) takes the first approach. A virtualization layer presents a unified SQL interface across sources, translating and routing queries to each system at runtime. The data never moves: only the query results are returned to the consumer.

Data replication takes the second approach. Data is physically copied from source systems into a target system: a data warehouse, a data lake, or a local acceleration engine. Consumers query the replica, which is optimized for their specific access patterns.

Neither approach is inherently better. Each excels in different scenarios, and most production data architectures use both in combination. This guide explains the key differences, walks through a decision framework, and shows how modern platforms unify both patterns.

## How Data Virtualization Works

Data virtualization provides a query abstraction layer over distributed data sources. Instead of moving data, it moves queries. The virtualization engine connects to each source system, translates the incoming SQL into the native dialect of each source, executes queries in parallel, and merges results before returning them to the application.

Key characteristics of virtualization:

- **No data movement:** Data stays in its source systems. There is no duplication, no storage cost for copies, and no synchronization to maintain.
- **Always fresh:** Every query reads from the live source, so results always reflect the current state of each system.
- **Rapid onboarding:** New data sources become queryable immediately after connecting; no schema design, migration scripts, or pipeline orchestration required.
- **Source-dependent performance:** Query latency depends on source system performance, network distance, and query complexity. Remote sources and complex cross-source joins can be slow.

Virtualization engines optimize performance through predicate pushdown (pushing filters to the source so only matching rows are transferred), aggregation pushdown (computing sums and counts at the source), and query parallelization (executing requests to independent sources concurrently). These optimizations narrow the performance gap with co-located data, but they cannot eliminate the network round-trip entirely.

## How Data Replication Works

Data replication physically copies data from source systems into a target system optimized for the consumer's workload. The replication process can be batch-oriented (traditional ETL that runs on a schedule) or continuous (streaming pipelines powered by [change data capture](/learn/change-data-capture)).

Key characteristics of replication:

- **Co-located data:** Queries run against local, pre-optimized copies. Cross-table joins, aggregations, and scans are fast because all data is in one place.
- **Predictable performance:** Latency is determined by the target system, not the source. Query times are consistent regardless of source load or network conditions.
- **Storage and pipeline costs:** Maintaining replicas requires storage for the copies and engineering effort to keep them synchronized. Schema changes at the source can break pipelines.
- **Staleness window:** Unless replication is continuous, the replica always lags behind the source by at least the replication interval.

Modern replication approaches have narrowed the freshness gap significantly. CDC-based replication can keep replicas within seconds of the source, and [data acceleration](/learn/data-acceleration) engines maintain queryable local copies that refresh automatically, eliminating much of the traditional ETL burden.

## Key Differences: Side-by-Side Comparison

The following table summarizes the core tradeoffs between virtualization and replication across the dimensions that matter most in production.

| Dimension | Data Virtualization | Data Replication |
|---|---|---|
| **Data freshness** | Real-time: always reads live source data | Depends on replication method: batch ETL (minutes to hours), CDC (seconds) |
| **Query performance** | Source-dependent; network round-trip for every query | Fast and predictable; queries run against local, optimized copies |
| **Storage cost** | No additional storage: data stays at source | Requires storage for each replica; cost scales with data volume |
| **Operational complexity** | Low setup; no pipelines to maintain | Pipelines must be built, monitored, and maintained over time |
| **Schema change handling** | Transparent: connector reads current schema at query time | Pipeline breakage risk; schema changes must be propagated |
| **Cross-source joins** | Handled at query time; performance depends on data volume | Fast if all data is co-located in the target system |
| **Source system load** | Every consumer query hits the source system | Source is queried only during replication; consumer queries don't touch it |
| **Offline resilience** | Queries fail if a source is unavailable | Queries succeed against the replica even if the source is down |
| **Best for** | Real-time access, ad-hoc exploration, rapid prototyping | High-throughput analytics, latency-sensitive applications, offline access |

Neither column is uniformly better. The right choice depends on the specific workload, freshness requirements, and performance constraints.

## Decision Framework

Choosing between virtualization and replication (or determining the right mix of both) requires evaluating four key factors.

### 1. Freshness Requirements

If the workload requires data that is always current (real-time dashboards, fraud detection, operational monitoring), virtualization provides guaranteed freshness without pipeline delays. If the workload tolerates minutes or hours of staleness (historical analytics, monthly reporting, compliance archives), replication with batch ETL is simpler and more cost-effective.

For workloads that need both freshness and speed (sub-second queries on near-real-time data), the answer is often CDC-based replication, where a local acceleration cache is kept current through continuous change streaming.

### 2. Query Performance Needs

If queries must return in milliseconds and the source systems are remote, slow, or expensive to query, replication is the right pattern. Pre-computing and co-locating data ensures consistent, fast query times regardless of source conditions.

If query latency in the hundreds-of-milliseconds-to-seconds range is acceptable, virtualization avoids the overhead of maintaining replicas. Query pushdown optimizations can make virtualized queries surprisingly fast, especially for simple lookups and filtered reads.

### 3. Data Volume and Breadth

For workloads that access a small number of well-defined datasets repeatedly, replication is efficient: the cost of maintaining copies is justified by the performance benefit. For workloads that need broad, ad-hoc access across many datasets (some of which may be queried only once), virtualization avoids the waste of replicating data that may never be read.

In practice, most organizations have a mix: a small set of "hot" datasets that are queried constantly, and a long tail of datasets accessed infrequently. The hot datasets are candidates for replication; the long tail is best served by virtualization.

### 4. Operational Capacity

Replication requires ongoing engineering investment: pipeline monitoring, failure handling, schema evolution, storage management, and cost optimization. Teams with mature data engineering practices and existing pipeline infrastructure can absorb this cost. Teams that are small, moving fast, or focused on application development rather than data infrastructure may prefer the operational simplicity of virtualization.

### Quick Reference

- **Choose virtualization** when freshness is non-negotiable, the dataset count is high, queries are infrequent or ad-hoc, and operational simplicity matters.
- **Choose replication** when query performance is critical, the workload is high-throughput, the dataset set is stable and well-defined, and offline resilience is needed.
- **Choose both** when different workloads have different requirements, which is the case for nearly every production data platform.

## Advanced Topics

### Consistency Models in Hybrid Architectures

When virtualization and replication coexist in the same platform, consistency becomes a design challenge. A query might touch both a virtualized dataset (live from the source) and a replicated dataset (potentially seconds behind). The results reflect two different points in time, which can produce subtle inconsistencies.

For example, an application joins a virtualized `orders` table with a replicated `customers` table. If a new customer places an order, the virtualized `orders` table shows the order immediately, but the replicated `customers` table might not yet contain the new customer record. The join produces a row with a null customer name, a temporal inconsistency.

Handling this requires either accepting eventual consistency (appropriate for most analytical and AI workloads), designing queries to tolerate missing joins (using LEFT JOINs instead of INNER JOINs for cross-boundary queries), or ensuring that related datasets use the same access pattern (both virtualized or both replicated). Production platforms that support transparent query routing (automatically choosing between virtualized and accelerated paths) must document their consistency guarantees so application developers can make informed decisions.

### Materialization Strategies for Cost Optimization

The cost profile of replication depends heavily on what is replicated, how often, and where. Full-table replication of a multi-terabyte fact table is expensive in both storage and refresh compute. Partial materialization strategies reduce this cost without sacrificing query coverage.

**Time-windowed materialization** replicates only recent data: for example, the last 90 days of transactions. Queries within the window are served from the fast local copy; queries for older data are federated to the source warehouse or data lake. This pattern works well for [operational data lakehouse](/use-case/operational-data-lakehouse) architectures where recent data drives operational decisions and historical data supports periodic analysis.

**Aggregation-based materialization** replicates pre-computed aggregates rather than raw rows. Instead of replicating 100 million order line items, the acceleration layer materializes daily revenue by product category, a tiny fraction of the storage cost. This approach trades query flexibility for efficiency: only queries that match the pre-computed aggregations can be served from the replica.

**Access-pattern-driven materialization** monitors query logs to identify which datasets and columns are actually accessed, then replicates only that subset. If an application queries 5 columns out of a 200-column table, replicating only those 5 columns reduces storage by 97%. This strategy requires a feedback loop between the query engine and the replication layer, a capability found in modern [data lake acceleration](/use-case/datalake-accelerator) platforms.

### Federation Pushdown Optimization

The performance gap between virtualization and replication narrows significantly when the virtualization engine can push more computation to the source. Beyond simple predicate pushdown, advanced engines support join pushdown (executing joins between two tables in the same source rather than fetching both and joining locally), limit pushdown (stopping source scans after enough rows are collected), and projection pushdown (requesting only the columns needed rather than full rows).

The effectiveness of pushdown depends on the source system's capabilities. A PostgreSQL source can handle complex pushed-down predicates, joins, and aggregations. An S3 source with Parquet files can handle predicate pushdown and projection pushdown but not joins. A REST API source may support no pushdown at all: every request returns full results that must be filtered locally. Understanding each [connector's](/integrations) pushdown capabilities is essential for predicting virtualized query performance and deciding which datasets to replicate for better results.

## How Spice Combines Both Approaches

Most comparisons of virtualization and replication present them as either/or choices. In practice, the strongest data architectures use both, and the challenge is combining them in a single, coherent platform rather than operating two separate systems.

[Spice](/platform/sql-federation-acceleration) unifies data virtualization and replication in one runtime. The platform provides [SQL federation](/learn/sql-federation) across [40+ data connectors](/integrations) (databases, warehouses, object stores, and streaming systems) so any dataset is queryable immediately through a single SQL endpoint. This is the virtualization layer: no data movement, always-fresh results, instant onboarding.

For datasets that require faster performance, Spice adds [data acceleration](/learn/data-acceleration): local replication into in-memory (Apache Arrow) or on-disk (DuckDB) engines that serve queries in milliseconds. Acceleration is configured per dataset, so teams can selectively replicate only the datasets that benefit from it. The acceleration cache is kept fresh through [change data capture](/learn/change-data-capture) or scheduled refresh, depending on the source.

The query router handles this transparently. When a query arrives, Spice checks whether the requested datasets are accelerated locally. If so, the query is served from the local engine. If not, it is federated to the remote source. Applications interact with a single SQL endpoint and do not need to know which datasets are virtualized and which are replicated.

This hybrid approach gives teams the operational simplicity of virtualization (no pipelines to build for initial access) with the performance of replication where it matters. A team can start by federating all data sources for immediate unified access, identify the hot datasets through query patterns, and then selectively accelerate those datasets without changing application queries. The [operational data lakehouse](/use-case/operational-data-lakehouse), [data lake accelerator](/use-case/datalake-accelerator), and [real-time analytics](/use-case/analytics) use cases demonstrate this pattern in production, where Spice federates across the full data estate and accelerates the datasets that drive latency-sensitive applications and AI workloads.

<ContentRichText
  fields={{
    coverage: 'rc-end',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<AccordionFaq
  fields={{
    heading: 'Data Virtualization vs Data Replication FAQ',
    paragraph: '',
    items: [
      {
        title: 'Can data virtualization and data replication be used together?',
        paragraph:
          '<p>Yes. Most production data architectures use both. Virtualization provides broad, real-time access across all data sources, while replication (or acceleration) delivers fast performance for frequently accessed datasets. Modern platforms like Spice unify both patterns in a single runtime with transparent query routing.</p>',
      },
      {
        title:
          'When should I choose data virtualization over data replication?',
        paragraph:
          '<p>Choose virtualization when data freshness is critical, when you need ad-hoc access across many sources, when operational simplicity matters, or when you are prototyping and want to avoid building ETL pipelines. Virtualization is also preferred when storage costs for replicas would be prohibitive.</p>',
      },
      {
        title:
          'When should I choose data replication over data virtualization?',
        paragraph:
          '<p>Choose replication when sub-second query latency is required, when workloads are high-throughput and predictable, when offline resilience is needed (queries must succeed even if a source is down), or when the source system cannot handle the additional query load from virtualized access.</p>',
      },
      {
        title: 'Does data replication always mean stale data?',
        paragraph:
          '<p>Not necessarily. Traditional batch ETL introduces hours of staleness, but modern replication using change data capture (CDC) keeps replicas within seconds of the source. CDC-based acceleration combines the performance benefits of replication with near-real-time freshness, effectively eliminating the staleness tradeoff for most workloads.</p>',
      },
      {
        title:
          'How does Spice handle the choice between virtualization and replication?',
        paragraph:
          '<p>Spice provides both patterns in a single platform. All connected data sources are queryable immediately via SQL federation (virtualization). Teams can then selectively accelerate specific datasets into local in-memory or on-disk engines (replication) for faster performance. For operational databases, Spice can also maintain a full <a href="/platform/analytics">analytics replica</a> kept fresh via change data capture. The query router transparently serves each query from the optimal path: no application changes required.</p>',
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<ContentResourceFeatured
  fields={{
    heading: 'Learn more about data virtualization and replication',
    paragraph:
      'Guides and blog posts on querying, accelerating, and integrating data across distributed sources.',
    mode: 'default',
    resources: [
      {
        source: 'manual',
        resource: null,
        resource_manual: {
          eyebrow: 'Docs',
          title: {
            title: 'Query Federation Docs',
            url: 'https://spiceai.org/docs/features/query-federation',
            target: '_blank',
          },
          description:
            'Learn how Spice federates SQL queries across 40+ data sources and accelerates datasets locally for sub-second performance.',
          image: {
            ID: 1661,
            id: 1661,
            title: 'Docs jpeg',
            filename: 'Docs-jpeg.jpeg',
            filesize: 103192,
            url: '/website-assets/media/2025/12/Docs-jpeg.jpeg',
            link: '/docs-jpeg/',
            alt: '',
            author: '9',
            description: '',
            caption: '',
            name: 'docs-jpeg',
            status: 'inherit',
            uploaded_to: 0,
            date: '2025-12-05 04:13:53',
            modified: '2025-12-05 04:13:53',
            menu_order: 0,
            mime_type: 'image/jpeg',
            type: 'image',
            subtype: 'jpeg',
            icon: '/website-assets/media/default.png',
            width: 1832,
            height: 1036,
            sizes: {
              thumbnail: '/website-assets/media/2025/12/Docs-jpeg-150x150.jpeg',
              'thumbnail-width': 150,
              'thumbnail-height': 150,
              medium: '/website-assets/media/2025/12/Docs-jpeg-300x170.jpeg',
              'medium-width': 300,
              'medium-height': 170,
              medium_large:
                '/website-assets/media/2025/12/Docs-jpeg-768x434.jpeg',
              'medium_large-width': 768,
              'medium_large-height': 434,
              large: '/website-assets/media/2025/12/Docs-jpeg-1024x579.jpeg',
              'large-width': 1024,
              'large-height': 579,
              '1536x1536':
                '/website-assets/media/2025/12/Docs-jpeg-1536x869.jpeg',
              '1536x1536-width': 1536,
              '1536x1536-height': 869,
              '2048x2048': '/website-assets/media/2025/12/Docs-jpeg.jpeg',
              '2048x2048-width': 1832,
              '2048x2048-height': 1036,
            },
          },
        },
      },
      {
        source: 'picker',
        resource: [
          {
            title:
              'Getting Started with Spice.ai SQL Query Federation & Acceleration',
            slug: '/blog/spice-sql-query-federation-acceleration',
            excerpt:
              'Learn how to use Spice.ai to federate and accelerate queries across operational and analytical systems with zero ETL.',
            image:
              '/website-assets/media/2025/11/68ee96eb08a0dfcb609c1969_Version-7-1.png',
            type: 'Blog',
            taxonomy: ['Spice AI'],
          },
        ],
        resource_manual: {
          eyebrow: '',
          title: null,
          description: '',
          image: false,
        },
      },
      {
        source: 'picker',
        resource: [
          {
            title: 'How we use Apache DataFusion at Spice AI',
            slug: '/blog/how-we-use-apache-datafusion-at-spice-ai',
            excerpt:
              'A technical overview of how Spice extends Apache DataFusion with custom table providers, optimizer rules, and UDFs to power federated SQL, search, and AI inference.',
            image:
              '/website-assets/media/2026/01/Engineering-at-Spice-AI-Apache-DataFusion.png',
            type: 'Blog',
            taxonomy: ['SQL Federation', 'Engineering'],
          },
        ],
        resource_manual: {
          eyebrow: '',
          title: null,
          description: '',
          image: false,
        },
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<TalkToAnEngineerCta />

---

## What is Data Virtualization?
URL: https://spice.ai/learn/data-virtualization
Date: 2026-01-03T00:00:00
Description: Data virtualization provides a unified view of data across multiple sources without physical replication. Learn how it works, how it compares to ETL, and when to use it.

<HeroCenteredText
  fields={{
    graphic_position: 'no-graphic',
    heading_tag: 'h1',
    heading: 'What is Data Virtualization?',
    paragraph:
      'Data virtualization is an integration approach that lets applications query and combine data from multiple sources (databases, APIs, files, and cloud services) without physically moving or replicating it.',
    cta: [
      {
        type: 'filled',
        cta: {
          title: 'See Spice data virtualization',
          url: '/platform/sql-federation-acceleration',
          target: '',
        },
      },
      {
        type: 'bordered',
        cta: {
          title: 'Read the docs',
          url: 'https://spiceai.org/docs/features/query-federation',
          target: '',
        },
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<ContentRichText
  fields={{
    coverage: 'rc-start',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

Enterprise data is distributed by nature. Customer records live in PostgreSQL, analytics events in Snowflake, product catalogs in a data lake on S3, and business metrics in a SaaS tool like Salesforce or HubSpot. When an application, dashboard, or AI model needs to combine data from several of these systems, teams traditionally build ETL pipelines to replicate everything into a central warehouse.

Data virtualization eliminates this replication step. A virtualization layer sits between data consumers (applications, BI tools, AI models) and data sources, presenting a single unified interface while the data remains in its original system. Queries are translated and routed to each source at runtime, and results are merged and returned as if they came from a single database.

## How Data Virtualization Works

A data virtualization platform operates in three layers: connectivity, abstraction, and optimization.

### The Connectivity Layer

Connectors maintain live links to each data source. A production virtualization platform supports dozens of connector types: relational databases (PostgreSQL, MySQL, SQL Server), cloud warehouses (Databricks, Snowflake, BigQuery), object stores (Amazon S3, Azure Blob Storage, Google Cloud Storage), streaming systems (Kafka), and SaaS APIs.

Each connector handles authentication, connection pooling, and protocol translation. The application never interacts with source databases directly; it only communicates with the virtualization layer.

### The Abstraction Layer

The virtualization engine presents a unified schema to consumers. Tables from different sources appear as if they belong to the same database. Applications query a single endpoint using standard SQL, unaware of where or how the underlying data is stored.

This abstraction is powerful because it decouples applications from infrastructure. If the team migrates a dataset from PostgreSQL to Databricks, the application query doesn't change; only the connector configuration in the virtualization layer needs to be updated.

### The Optimization Layer

Raw virtualization would be slow: every query would require a network round-trip to each source, and all joins and aggregations would happen in the virtualization layer. Production platforms optimize this with several techniques:

- **Predicate pushdown:** Filters are pushed to source databases so only matching rows are transferred
- **Aggregation pushdown:** Operations like `COUNT`, `SUM`, and `AVG` are computed at the source when possible
- **Query parallelization:** Requests to independent sources execute concurrently
- **Local acceleration:** Frequently accessed datasets are cached locally for sub-second performance

The combination of these optimizations means that virtualized queries can approach (and sometimes match) the performance of queries against a co-located warehouse.

## Data Virtualization vs. ETL

Data virtualization and ETL solve the same problem, but they approach it from opposite directions. Understanding the tradeoffs helps teams choose the right pattern for each workload.

### Data Movement and Storage

ETL physically copies data from sources into a central warehouse. This means duplicate storage costs, ongoing pipeline maintenance, and the engineering effort to keep copies synchronized. When source schemas change (a column is added, a data type is modified), ETL pipelines break and require manual intervention.

Data virtualization queries data in place. There is no duplication, no pipeline to break, and no synchronization to maintain. New data sources become queryable as soon as a connector is configured.

### Data Freshness

This is often the deciding factor. ETL pipelines run on schedules: hourly, daily, or (at best) every few minutes. The warehouse always contains a stale snapshot. For batch analytics on historical data, this staleness is acceptable.

For real-time use cases (operational dashboards, AI models that need current data, [retrieval-augmented generation (RAG)](/learn/retrieval-augmented-generation) systems, fraud detection), staleness is not acceptable. Data virtualization queries live sources, so results always reflect the current state of each system.

### Performance

Here the tradeoff is more nuanced. ETL pre-computes and co-locates data, so warehouse queries are fast. Virtualization depends on source performance and network latency, which can vary.

The best approach for production workloads is a hybrid: virtualize for real-time access, and accelerate performance-critical datasets with local caching kept fresh by [change data capture (CDC)](/learn/change-data-capture). This gives you the freshness of virtualization with the speed of co-located data.

### When to Use Each

**ETL works well for:**

- Stable, high-volume analytical workloads with known query patterns
- Historical data analysis where freshness doesn't matter
- Compliance archives that require a durable copy of data

**Data virtualization works well for:**

- Real-time operational dashboards and monitoring
- AI and machine learning workloads that need fresh data
- Ad-hoc exploration across multiple sources
- Rapid prototyping where pipeline setup time is prohibitive
- Data mesh architectures where domain teams own their data

## Key Benefits

### Faster Time to Value

New data sources become queryable immediately after connecting: no schema design, migration scripts, or pipeline orchestration required. Teams go from data source to query results in minutes, not weeks.

### Reduced Infrastructure Costs

Without a centralized warehouse to store duplicate copies, teams save on storage, compute, and the engineering effort to keep pipelines running. For organizations with petabytes of data across dozens of sources, this cost reduction is substantial.

### Simplified Governance

A virtualization layer provides a single point of access control, audit logging, and policy enforcement across all connected sources. Instead of managing permissions on each database individually, security teams define policies once. This is particularly important in regulated industries like [financial services](/industry/financial-services) where data access must be auditable.

### Application Decoupling

Applications query the virtualization layer, not individual databases. This means infrastructure changes (migrating a database, scaling a warehouse, switching cloud providers) don't require application changes. The virtualization layer absorbs the complexity.

## Common Use Cases

### Unified Data Access for AI

AI models and [RAG systems](/use-case/retrieval-augmented-generation) require data from multiple operational and analytical sources. Building ETL pipelines for each model is slow and fragile. A virtualization layer provides a single query interface to all data sources, so AI teams can focus on model quality instead of data plumbing.

### Real-Time Operational Dashboards

Business intelligence dashboards that need current data from transactional databases, CRMs, and event streams can query a virtualization layer directly. The results are always fresh, and adding a new data source to a dashboard takes minutes instead of days.

### Data Mesh and Domain-Oriented Architectures

In a data mesh, each domain team owns its data products. A virtualization layer enables governed, cross-domain queries without centralizing data into a monolithic warehouse. Each team maintains autonomy while the organization gets a unified view.

## Data Virtualization with Spice

[Spice](/platform/sql-federation-acceleration) provides data virtualization through [SQL federation](/learn/sql-federation) with [40+ prebuilt connectors](/integrations) for databases, warehouses, object stores, and streaming systems. Queries are automatically optimized with predicate pushdown and parallelization.

For performance-critical workloads, Spice adds local acceleration (caching frequently accessed datasets in-memory or on-disk) with [CDC-based refresh](/feature/real-time-change-data-capture) to keep cached data current. This hybrid approach delivers the freshness of virtualization with sub-second query performance.

## Advanced Topics

### Schema Mapping and Reconciliation

A core challenge in data virtualization is presenting a coherent schema across sources that model the same concepts differently. A customer table in PostgreSQL might use `customer_id` as the primary key, while the same customer data in Salesforce uses `account_id`, and an S3-based data lake stores it as `cust_id` in a Parquet file.

Schema mapping resolves these differences by defining explicit relationships between source-specific schemas and the unified virtual schema. The virtualization layer maintains a mapping catalog that records which virtual column corresponds to which source column, along with any type conversions required. When a query references `customers.id` in the virtual schema, the engine translates it to the correct source-specific column name and type for each underlying system.

Production virtualization platforms support several mapping patterns: direct mapping (one-to-one column correspondence), computed mapping (a virtual column derived from an expression over source columns), and conditional mapping (different sources provide the same virtual column, with a priority order for conflict resolution).

```mermaid
flowchart TB
    subgraph Virtual Schema
        V1[customers.id]
        V2[customers.name]
        V3[customers.revenue]
    end
    subgraph PostgreSQL
        P1[customer_id]
        P2[full_name]
    end
    subgraph Salesforce
        S1[account_id]
        S2[account_name]
        S3[annual_revenue]
    end
    subgraph S3 Data Lake
        L1[cust_id]
        L2[name]
        L3[total_rev]
    end
    V1 --- P1
    V1 --- S1
    V1 --- L1
    V2 --- P2
    V2 --- S2
    V2 --- L2
    V3 --- S3
    V3 --- L3
```

### Semantic Layer Design

Beyond raw schema mapping, production virtualization systems benefit from a semantic layer: a set of business-oriented definitions that sit on top of the virtual schema. The semantic layer defines metrics (e.g., "monthly recurring revenue" = `SUM(amount) WHERE type = 'recurring' AND status = 'active'`), dimensions (e.g., "region" mapped from different geographic fields across sources), and relationships (e.g., customers have many orders, orders belong to one product).

The semantic layer serves two purposes. First, it provides consistent metric definitions that all consumers (BI tools, AI models, application queries) use identically. Without it, different teams may calculate "revenue" differently depending on which source they query. Second, it enables [text-to-SQL](/learn/text-to-sql) systems to generate more accurate queries, because the LLM can reference well-defined business concepts rather than raw column names.

Designing an effective semantic layer requires collaboration between data engineers (who understand the source schemas), domain experts (who define business metrics), and platform teams (who configure the virtualization layer). The key tradeoff is between expressiveness and maintenance cost: a comprehensive semantic layer improves query accuracy but requires ongoing updates as business logic evolves.

### Write-Back Patterns

Most data virtualization deployments are read-only: applications query the virtual layer, and writes go directly to source systems. However, some use cases require write-back: the ability to write through the virtualization layer back to a source system.

Write-back adds complexity because the virtualization layer must determine which source to target, validate that the write operation is permitted by governance policies, and handle conflicts when multiple sources contain overlapping data. Common write-back patterns include single-source routing (writes are always directed to one designated source), source-aware routing (the write target is determined by the virtual table's primary source mapping), and two-phase writes (the virtualization layer coordinates writes to multiple sources transactionally).

Write-back is most commonly used for operational applications that need to update records visible across the virtual schema: for example, updating a customer status that must be reflected in both the transactional database and the CRM. For analytical workloads, write-back is rarely needed because the virtualization layer serves as a read-optimized access point.

<ContentRichText
  fields={{
    coverage: 'rc-end',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<AccordionFaq
  fields={{
    heading: 'Data Virtualization FAQ',
    paragraph: '',
    items: [
      {
        title:
          'What is the difference between data virtualization and data federation?',
        paragraph:
          '<p>Data federation is a specific implementation of data virtualization that uses SQL as the query interface. Data virtualization is the broader concept, encompassing SQL federation, REST API abstraction, GraphQL layers, and other query paradigms. In practice, the terms are often used interchangeably when the interface is SQL.</p>',
      },
      {
        title: 'Does data virtualization replace a data warehouse?',
        paragraph:
          "<p>Not necessarily. Data virtualization complements a warehouse by providing real-time access to operational data that hasn't been loaded yet. Many organizations use both: a warehouse for historical analytics and heavy aggregations, and a virtualization layer for real-time queries, AI workloads, and ad-hoc exploration.</p>",
      },
      {
        title: 'How does data virtualization handle performance?',
        paragraph:
          '<p>Raw virtualization depends on source performance, which can be slow for remote or overloaded systems. Production platforms add query acceleration (local caching of frequently accessed data) to deliver sub-second performance. Spice combines virtualization with in-memory and on-disk acceleration for latency-sensitive workloads.</p>',
      },
      {
        title: 'Is data virtualization secure?',
        paragraph:
          '<p>A virtualization layer centralizes access control, providing a single point for authentication, authorization, and audit logging across all connected sources. This simplifies compliance because policies are enforced in one place rather than across each individual data source.</p>',
      },
      {
        title: 'What data sources can be virtualized?',
        paragraph:
          '<p>Most platforms support relational databases (PostgreSQL, MySQL, SQL Server), cloud warehouses (Databricks, Snowflake, BigQuery), object stores (S3, Azure Blob, GCS), streaming systems (Kafka, Kinesis), and SaaS APIs. Spice provides 40+ prebuilt connectors covering the most common enterprise data sources.</p>',
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<ContentResourceFeatured
  fields={{
    heading: 'Learn more about data virtualization',
    paragraph:
      'Guides and blog posts exploring how to query, accelerate, and operationalize data across sources.',
    mode: 'default',
    resources: [
      {
        source: 'manual',
        resource: null,
        resource_manual: {
          eyebrow: 'Docs',
          title: {
            title: 'Data Connectors Docs',
            url: 'https://spiceai.org/docs/components/data-connectors',
            target: '_blank',
          },
          description:
            'Explore the 40+ prebuilt connectors for databases, warehouses, data lakes, and streaming systems supported by Spice.',
          image: {
            ID: 1661,
            id: 1661,
            title: 'Docs jpeg',
            filename: 'Docs-jpeg.jpeg',
            filesize: 103192,
            url: '/website-assets/media/2025/12/Docs-jpeg.jpeg',
            link: '/docs-jpeg/',
            alt: '',
            author: '9',
            description: '',
            caption: '',
            name: 'docs-jpeg',
            status: 'inherit',
            uploaded_to: 0,
            date: '2025-12-05 04:13:53',
            modified: '2025-12-05 04:13:53',
            menu_order: 0,
            mime_type: 'image/jpeg',
            type: 'image',
            subtype: 'jpeg',
            icon: '/website-assets/media/default.png',
            width: 1832,
            height: 1036,
            sizes: {
              thumbnail: '/website-assets/media/2025/12/Docs-jpeg-150x150.jpeg',
              'thumbnail-width': 150,
              'thumbnail-height': 150,
              medium: '/website-assets/media/2025/12/Docs-jpeg-300x170.jpeg',
              'medium-width': 300,
              'medium-height': 170,
              medium_large:
                '/website-assets/media/2025/12/Docs-jpeg-768x434.jpeg',
              'medium_large-width': 768,
              'medium_large-height': 434,
              large: '/website-assets/media/2025/12/Docs-jpeg-1024x579.jpeg',
              'large-width': 1024,
              'large-height': 579,
              '1536x1536':
                '/website-assets/media/2025/12/Docs-jpeg-1536x869.jpeg',
              '1536x1536-width': 1536,
              '1536x1536-height': 869,
              '2048x2048': '/website-assets/media/2025/12/Docs-jpeg.jpeg',
              '2048x2048-width': 1832,
              '2048x2048-height': 1036,
            },
          },
        },
      },
      {
        source: 'picker',
        resource: [
          {
            title:
              'Making Object Storage Operational for Real-Time and AI Workloads',
            slug: '/blog/making-object-storage-operational',
            excerpt:
              'Transform object stores into real-time AI platforms. Spice adds federation, acceleration, hybrid search, and inference capabilities.',
            image:
              '/website-assets/media/2025/11/68e42f8a5daa71c139c95512_Version-2.png',
            type: 'Blog',
            taxonomy: ['Spice AI'],
          },
        ],
        resource_manual: {
          eyebrow: '',
          title: null,
          description: '',
          image: false,
        },
      },
      {
        source: 'picker',
        resource: [
          {
            title:
              'Getting Started with Spice.ai SQL Query Federation & Acceleration',
            slug: '/blog/spice-sql-query-federation-acceleration',
            excerpt:
              'Learn how to use Spice.ai to federate and accelerate queries across operational and analytical systems with zero ETL.',
            image:
              '/website-assets/media/2025/11/68ee96eb08a0dfcb609c1969_Version-7-1.png',
            type: 'Blog',
            taxonomy: ['Spice AI'],
          },
        ],
        resource_manual: {
          eyebrow: '',
          title: null,
          description: '',
          image: false,
        },
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<TalkToAnEngineerCta />

---

## Why Query Latency Gets Worse as Your Application Scales
URL: https://spice.ai/learn/database-query-latency-at-scale
Date: 2026-08-05T00:00:00
Description: Learn why database query latency degrades as applications scale: rising concurrency, growing data volume, and the distance between where data lives and where applications run.

<HeroCenteredText
  fields={{
    graphic_position: 'no-graphic',
    heading_tag: 'h1',
    heading: 'Why Query Latency Gets Worse as Your Application Scales',
    paragraph:
      'Query latency rarely degrades because of one slow query. It degrades because concurrency, data volume, and the distance between where data lives and where applications run all grow at the same time.',
    cta: [
      {
        type: 'filled',
        cta: {
          title: 'See the Spice data platform',
          url: '/platform/sql-federation-acceleration',
          target: '',
        },
      },
      {
        type: 'bordered',
        cta: {
          title: 'Read the docs',
          url: 'https://spiceai.org/docs/features/data-acceleration',
          target: '_blank',
        },
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<ContentRichText
  fields={{
    coverage: 'rc-start',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

A query that returns in 20 milliseconds in staging can take 800 milliseconds in production a year later, with the same schema and the same indexes. Teams usually respond by tuning the query, and tuning sometimes helps. But when latency degrades gradually as an application grows, the cause is usually not a bad query plan. It is the architecture: the request path between the application and its data has changed shape, and the query is paying for it.

This guide explains the three forces that push query latency up as applications scale, why the standard fixes (indexes, read replicas, caching, bigger instances) each plateau, how to diagnose which force dominates a given workload, and the architectural patterns that keep latency flat instead of merely postponing the problem.

## The Three Forces That Drive Latency Up

Query latency at scale is the sum of three mostly independent factors. Each grows for a different reason, which is why a fix aimed at one rarely moves the others.

### Concurrency and queueing

Databases serve queries from a finite pool of workers, connections, and I/O bandwidth. At low utilization, a new query starts immediately. As utilization rises, queries increasingly wait for a worker or a lock before they execute at all. This queueing delay is invisible in `EXPLAIN` output because it happens before execution starts, yet it often dominates production latency. Doubling traffic on a database at 40% utilization may add little latency; doubling it again can multiply tail latency several times over, because wait time grows non-linearly as a system approaches saturation.

### Data volume and scan cost

Queries that were fast at one million rows behave differently at one billion. Index depth grows, working sets stop fitting in memory, and the buffer cache hit rate falls, so reads that used to be served from RAM now touch disk. Aggregations and analytical scans degrade fastest, because their cost is proportional to the data scanned rather than to the result size. Data growth also erodes fixes silently: an index that once covered the hot path stops fitting in memory, and latency creeps up without any change to the query.

### Distance between data and application

As applications scale, they spread out: more services, more regions, more availability zones. The data usually does not spread with them. A query from a service in one region to a database in another pays tens of milliseconds of network round trip before the database does any work, and a request that issues five sequential queries pays that cost five times. This is the architecture gap: applications scale horizontally and geographically, while the data stays centralized, so the average distance between a query and the data it needs keeps growing.

## Why the Usual Fixes Plateau

Each standard remedy addresses one of the three forces, partially, and leaves the others untouched.

**Indexing and query tuning** reduce per-query execution cost, and they are the right first step. But tuning does nothing about queueing delay or network distance, and its gains erode as data grows. A team that has already tuned its top queries usually finds that the remaining latency lives outside query execution entirely.

**Read replicas** add capacity for concurrent reads, which relieves queueing. They do not reduce scan cost (each replica runs the same expensive query against the same data volume), and unless a replica is placed in every region an application runs in, cross-region requests still pay the distance penalty. Replication lag also introduces staleness that application logic has to tolerate.

**Result caching** removes repeated work for repeated requests. Its weakness is coverage: a cache only accelerates queries it has seen before, so hit rates fall as query shapes become more varied (per-tenant filters, ad hoc analytics, AI agents composing their own SQL). It also introduces [cache invalidation](/learn/cache-invalidation-at-scale), which becomes its own scaling problem. The trade-offs between result caching and dataset-level approaches are covered in [caching vs data acceleration](/learn/caching-vs-data-acceleration).

**Vertical scaling** (a bigger instance) buys headroom on concurrency and memory at once, which is why it works, temporarily. It is also the fix that most clearly postpones rather than solves: cost grows faster than capacity at the high end, and a single larger box does nothing about network distance to far-away services.

None of these are wrong. The pattern to notice is that they all optimize the existing request path, while the underlying trend (more consumers, more data, more distance) keeps pushing in the other direction.

## How to Diagnose Which Force Dominates

Before changing architecture, measure where the time actually goes. Three practices separate the signal from the noise.

**Measure latency percentiles at the application, not averages at the database.** Database-side metrics miss network time and connection acquisition, and averages hide the tail. A database reporting a healthy 15 ms mean can coexist with an application experiencing 500 ms at P99, and it is the P99 that users and dependent services experience. Track P50, P95, and P99 separately at the client.

**Decompose a slow request into its segments.** A query's end-to-end time is queueing (waiting for a connection or worker) plus network (round trips between service and database) plus execution (the part `EXPLAIN ANALYZE` shows). Distributed traces or client-side timers around connection checkout and query dispatch reveal the split. Each segment points to a different force: long checkout means concurrency, long round trips mean distance, long execution means data volume.

**Correlate latency with load and data size, not with deploys.** Latency that spikes with traffic peaks indicates queueing. Latency that grows month over month while traffic is flat indicates data growth. Latency that differs by region indicates distance. Plotting P99 against concurrent query count usually makes the dominant force obvious within a day of data.

```mermaid
flowchart LR
    A[Application] -->|Connection checkout| B[Queueing delay]
    B -->|Network round trips| C[Distance delay]
    C -->|Execution: scan, join, sort| D[(Database)]
    D -->|Result transfer| A
```

## Architecture Patterns That Keep Latency Flat

When diagnosis shows queueing, distance, or scan cost growing structurally, the durable fix is to change where queries run rather than to keep tuning how they run.

**Co-locate a queryable copy of hot data with the application.** Instead of every request crossing the network to a central database, a local engine (running as a [sidecar](/learn/sidecar-pattern) or in-process with the service) holds the datasets the application reads most, and serves them at local latency. Distance drops to microseconds, and read concurrency stops competing for the central database's worker pool because reads never reach it.

**Keep the local copy fresh with replication, not request-time fetches.** [Data acceleration](/learn/data-acceleration) materializes datasets into the local engine and refreshes them on a schedule or continuously through [change data capture](/learn/change-data-capture). Freshness becomes a declared property (a refresh interval or CDC stream) rather than per-request work, so serving latency stays flat regardless of how slow or busy the source is.

**Scale the read path independently of the source.** Because each application instance carries its own accelerated working set, adding instances adds read capacity linearly, without adding load to the system of record. The source database sizes for writes and the long tail of cold queries instead of for peak read traffic.

**Federate the long tail instead of replicating everything.** Not every dataset earns a local copy. A federated query layer serves rare or ad hoc queries directly from the source while hot paths stay local, which keeps the memory footprint of acceleration proportional to the working set rather than to the whole database.

Together these patterns invert the scaling relationship: instead of latency rising as consumers multiply, each new consumer brings its own serving capacity with it.

## Advanced Topics

### Tail latency amplification in fan-out requests

When one user request fans out into parallel queries, the request completes only when the slowest query returns. With 10 parallel queries, the probability that at least one lands in the database's slowest 1% is roughly 10%, so a P99 problem at the database becomes a P90 problem for users. This amplification is why tail latency, not median latency, sets the budget for service-oriented architectures, and why reducing variance (fewer queue waits, no cache misses, local reads) often matters more than reducing the median.

### The utilization knee

Queueing theory predicts, and production systems confirm, that wait time stays low until utilization crosses roughly 70-80% of capacity, then rises steeply: each increment of load adds more wait time than the last. This knee explains why databases feel fine right up until they do not, and why capacity planning based on average utilization underestimates latency risk. Systems that must hold tight tail latency budgets are deliberately run well below the knee, which is another argument for offloading read traffic from shared infrastructure.

### Connection pools and head-of-line blocking

Connection pools cap concurrent queries per service instance. When the pool is exhausted, new queries queue at the client before the database ever sees them, and one slow query holding a connection delays unrelated fast queries behind it. Symptoms are rising client-side latency while database-side metrics look healthy. Mitigations include separating pools for fast and slow query classes, aggressive timeouts on the slow class, and reducing demand on the pool by serving hot reads from a local engine.

## Keeping Query Latency Flat with Spice

[Spice](/platform/sql-federation-acceleration) implements the co-location pattern as a lightweight runtime that deploys next to the application, materializes hot datasets from any of [40+ data sources](/integrations) into a local engine, and keeps them current through scheduled refresh or change data capture. Queries run over the local copy at consistent, single-digit-millisecond latency while anything not accelerated federates transparently to its source, so the [data lake or warehouse behind it](/use-case/datalake-accelerator) stops being on the request path.

The pattern holds at production scale: Twilio runs Spice in its messaging control plane at P99 query times under 5 milliseconds, and Barracuda reduced email archive queries from a P99 of about 2 minutes to 100-200 milliseconds. For [multi-tenant SaaS platforms](/industry/saas), the same architecture shards a runtime per tenant so that one tenant's query load cannot degrade another's latency.

<ContentRichText
  fields={{
    coverage: 'rc-end',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<AccordionFaq
  fields={{
    heading: 'Query Latency at Scale FAQ',
    paragraph: '',
    items: [
      {
        title: 'Why does database query latency increase as an application scales?',
        paragraph:
          '<p>Three forces grow together as applications scale: concurrency (more simultaneous queries competing for finite database workers, which creates queueing delay), data volume (larger tables mean deeper indexes, lower cache hit rates, and more expensive scans), and distance (more services and regions querying a centralized database pay more network round trips). Any one of them can dominate, and the standard fixes each address only one.</p>',
      },
      {
        title: 'What is tail latency and why does it matter more than average latency?',
        paragraph:
          '<p>Tail latency is the slow end of the latency distribution, typically measured as P95 or P99 (the time under which 95% or 99% of queries complete). It matters because users and dependent services experience the tail, not the average, and because requests that fan out into parallel queries are as slow as their slowest query. A healthy average can hide a tail that violates every latency budget in the system.</p>',
      },
      {
        title: 'Do read replicas fix query latency at scale?',
        paragraph:
          '<p>Partially. Read replicas add capacity for concurrent reads, which relieves queueing delay. They do not reduce the cost of scanning large tables (each replica runs the same query against the same data volume), and they only reduce network distance if a replica is deployed in every region the application runs in. Replication lag also introduces staleness the application must tolerate.</p>',
      },
      {
        title: 'How does data locality reduce query latency?',
        paragraph:
          '<p>Data locality places a queryable copy of frequently read datasets next to the application (in the same process, pod, or host), so reads complete without crossing the network or competing for the central database\'s capacity. Network round trips drop from tens of milliseconds to microseconds, and latency stays predictable because local reads do not queue behind other consumers\' traffic.</p>',
      },
      {
        title: 'How does Spice keep query latency low as applications scale?',
        paragraph:
          '<p>Spice deploys as a lightweight runtime co-located with the application, accelerates hot datasets into a local engine (in-memory Apache Arrow, embedded DuckDB or SQLite, or Cayenne), and keeps them fresh through scheduled refresh or <a href="/feature/real-time-change-data-capture">change data capture</a>. Each application instance serves reads locally, so adding instances adds read capacity without adding load to the source database.</p>',
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<ContentResourceFeatured
  fields={{
    heading: 'Learn more about low-latency data access',
    paragraph:
      'Guides and blog posts on keeping query latency flat as applications and data grow.',
    mode: 'default',
    resources: [
      {
        source: 'manual',
        resource: null,
        resource_manual: {
          eyebrow: 'Docs',
          title: {
            title: 'Data Acceleration Docs',
            url: 'https://spiceai.org/docs/features/data-acceleration',
            target: '_blank',
          },
          description:
            'Learn how Spice materializes and refreshes datasets locally for sub-second queries across in-memory and embedded engines.',
          image: {
            ID: 1661,
            id: 1661,
            title: 'Docs jpeg',
            filename: 'Docs-jpeg.jpeg',
            filesize: 103192,
            url: '/website-assets/media/2025/12/Docs-jpeg.jpeg',
            link: '/docs-jpeg/',
            alt: '',
            author: '9',
            description: '',
            caption: '',
            name: 'docs-jpeg',
            status: 'inherit',
            uploaded_to: 0,
            date: '2025-12-05 04:13:53',
            modified: '2025-12-05 04:13:53',
            menu_order: 0,
            mime_type: 'image/jpeg',
            type: 'image',
            subtype: 'jpeg',
            icon: '/website-assets/media/default.png',
            width: 1832,
            height: 1036,
            sizes: {
              thumbnail: '/website-assets/media/2025/12/Docs-jpeg-150x150.jpeg',
              'thumbnail-width': 150,
              'thumbnail-height': 150,
              medium: '/website-assets/media/2025/12/Docs-jpeg-300x170.jpeg',
              'medium-width': 300,
              'medium-height': 170,
              medium_large:
                '/website-assets/media/2025/12/Docs-jpeg-768x434.jpeg',
              'medium_large-width': 768,
              'medium_large-height': 434,
              large: '/website-assets/media/2025/12/Docs-jpeg-1024x579.jpeg',
              'large-width': 1024,
              'large-height': 579,
              '1536x1536':
                '/website-assets/media/2025/12/Docs-jpeg-1536x869.jpeg',
              '1536x1536-width': 1536,
              '1536x1536-height': 869,
              '2048x2048': '/website-assets/media/2025/12/Docs-jpeg.jpeg',
              '2048x2048-width': 1832,
              '2048x2048-height': 1036,
            },
          },
        },
      },
      {
        source: 'picker',
        resource: [
          {
            title:
              'Making Object Storage Operational for Real-Time and AI Workloads',
            slug: '/blog/making-object-storage-operational',
            excerpt:
              'Transform object stores into real-time AI platforms. Spice adds federation, acceleration, hybrid search, and inference capabilities.',
            image:
              '/website-assets/media/2025/11/68e42f8a5daa71c139c95512_Version-2.png',
            type: 'Blog',
            taxonomy: ['Spice AI'],
          },
        ],
        resource_manual: {
          eyebrow: '',
          title: null,
          description: '',
          image: false,
        },
      },
      {
        source: 'picker',
        resource: [
          {
            title:
              'Getting Started with Spice.ai SQL Query Federation & Acceleration',
            slug: '/blog/spice-sql-query-federation-acceleration',
            excerpt:
              'Learn how to use Spice.ai to federate and accelerate queries across operational and analytical systems with zero ETL.',
            image:
              '/website-assets/media/2025/11/68ee96eb08a0dfcb609c1969_Version-7-1.png',
            type: 'Blog',
            taxonomy: ['Spice AI'],
          },
        ],
        resource_manual: {
          eyebrow: '',
          title: null,
          description: '',
          image: false,
        },
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<ContentCta
  fields={{
    override_global_setting: false,
    custom_content: { heading: '', paragraph: '', cta: null },
    padding_top: 'unset',
    padding_bottom: 'unset',
    gcta_heading: 'See Spice in action',
    gcta_paragraph:
      'Get a guided walkthrough of how development teams use Spice to query, accelerate, and integrate AI for mission-critical workloads.',
    gcta_cta: {
      title: 'Get a demo',
      url: 'https://meetings.hubspot.com/lukekim/talk-to-sales',
      target: '_blank',
    },
  }}
/>

---

## What is Delta Lake?
URL: https://spice.ai/learn/delta-lake
Date: 2026-03-12T00:00:00
Description: Delta Lake is an open-source storage layer that brings ACID transactions, schema enforcement, and time travel to data lakes. Learn how Delta Lake works, its architecture, how it compares to Apache Iceberg and Hudi, and how Spice connects to Delta tables for federated queries.

<HeroCenteredText
  fields={{
    graphic_position: 'no-graphic',
    heading_tag: 'h1',
    heading: 'What is Delta Lake?',
    paragraph:
      'Delta Lake is an open-source storage layer that brings ACID transactions to Apache Spark and big data workloads. Built on top of Apache Parquet, Delta Lake adds a transaction log that enables reliable reads and writes, schema enforcement, time travel, and incremental processing on data stored in cloud object stores like S3, Azure Blob Storage, and GCS.',
    cta: [
      {
        type: 'filled',
        cta: {
          title: 'See Spice SQL federation',
          url: '/platform/sql-federation-acceleration',
          target: '',
        },
      },
      {
        type: 'bordered',
        cta: {
          title: 'Read the docs',
          url: 'https://spiceai.org/docs',
          target: '',
        },
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<ContentRichText
  fields={{
    coverage: 'rc-start',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

Data lakes promised a single, low-cost repository for all of an organization's data. In practice, they introduced a new class of problems. Without transactions, concurrent reads and writes produce corrupted or inconsistent results. Without schema enforcement, tables drift as upstream producers change their output format. Without audit history, there is no way to reproduce a query result from last week or roll back a bad write.

Delta Lake solves these problems by adding a transaction log (the Delta log) on top of standard Parquet files stored in a data lake. Every operation (write, delete, merge, schema change) is recorded as an atomic, ordered entry in the log. This turns an unstructured collection of files into a reliable, versioned table with database-grade guarantees, the foundation of the [data lakehouse](/learn/data-lakehouse-vs-data-warehouse) architecture.

Originally developed at Databricks, Delta Lake was open-sourced under the Apache 2.0 license in 2019. It is now a Linux Foundation project with implementations in Scala/Spark (the original) and Rust ([delta-rs](https://github.com/delta-io/delta-rs)), making it accessible outside the Spark ecosystem.

## Core Architecture

A Delta Lake table is a directory in a file system or object store that contains two types of content: data files in Apache Parquet format and a transaction log directory called `_delta_log`.

### Data Files

The actual data is stored as standard Parquet files. Parquet is a columnar storage format that supports efficient compression and encoding schemes. Because the data files are plain Parquet, they can be read by any tool that supports the Parquet format, though without the transaction log, readers would see all files (including those that have been logically deleted) rather than the current table state.

### The Transaction Log (Delta Log)

The `_delta_log` directory is the core innovation of Delta Lake. It contains a sequence of JSON files, each representing an atomic commit to the table. These commit files are named sequentially: `000000000000000000000.json`, `000000000000000000001.json`, and so on.

Each commit file contains one or more actions:

- **Add file:** Records that a new Parquet data file is part of the table
- **Remove file:** Records that a Parquet data file is no longer part of the current table version (the physical file is retained for time travel)
- **Metadata:** Records schema changes, partition column changes, or configuration updates
- **Protocol:** Records the minimum reader and writer protocol versions required to interact with the table
- **Transaction identifiers:** Records application-level transaction IDs for idempotent writes

To read the current state of a Delta table, a reader replays the log from the beginning (or from the latest checkpoint) and computes the set of active files by applying all add and remove actions.

### Checkpoint Files

Replaying the entire log for every read would be expensive for tables with long histories. Delta Lake solves this with periodic checkpoint files: Parquet files in the `_delta_log` directory that contain a snapshot of the cumulative state at a given version. Readers start from the most recent checkpoint and only replay subsequent commits.

Checkpoint files are created automatically at configurable intervals (by default, every 10 commits). A special `_last_checkpoint` file in the `_delta_log` directory records the version of the most recent checkpoint, so readers can locate it without scanning the entire log directory.

## Key Features

### ACID Transactions

Delta Lake provides serializable isolation for writes and snapshot isolation for reads. This means:

- **Atomicity:** Each write operation either fully succeeds or fully fails. There are no partial writes visible to readers.
- **Consistency:** Schema enforcement ensures that every row conforms to the table's defined schema.
- **Isolation:** Concurrent readers and writers do not interfere with each other. Readers see a consistent snapshot; writers use optimistic concurrency control to detect conflicts.
- **Durability:** Once a commit is written to the log, it is durable in the underlying storage system.

Optimistic concurrency control works by having each writer read the current table version, compute its changes, and attempt to write its commit file at the next sequential version number. If another writer has already committed at that version, the write fails and the writer must retry, rereading the current state and recomputing its changes.

### Schema Enforcement and Evolution

Delta Lake validates every write against the table's schema. If a write includes a column that does not exist in the schema, or if a column's data type does not match, the write is rejected before any data is written. This prevents the silent data corruption that is common in unmanaged data lakes.

Schema evolution is supported through explicit operations. New columns can be added, existing columns can be widened (e.g., `INT` to `LONG`), and columns can be renamed or reordered. Each schema change is recorded as a metadata action in the transaction log, preserving a complete history of how the schema has changed over time.

### Time Travel

Because the transaction log records every version of the table, Delta Lake supports querying any historical version by specifying a version number or a timestamp:

```sql
-- Query the table as of version 42
SELECT * FROM events VERSION AS OF 42

-- Query the table as of a specific timestamp
SELECT * FROM events TIMESTAMP AS OF '2026-03-01T00:00:00'
```

Time travel is useful for auditing (reproducing a previous query result), debugging (comparing current data against a known-good historical state), and rollback (restoring a table to a previous version after a bad write).

Historical data is retained as long as the underlying Parquet files have not been physically deleted. The `VACUUM` command removes data files that are no longer referenced by any version within the retention period (default 7 days), reclaiming storage at the cost of losing time travel access to older versions.

### Z-Ordering and Data Skipping

Delta Lake supports Z-ordering, a technique that co-locates related data in the same set of files to improve query performance. When data is Z-ordered on a column (e.g., `event_date`), rows with similar values for that column are stored in the same Parquet files. Combined with per-file min/max statistics stored in the transaction log, the query engine can skip entire files that do not contain relevant data.

```sql
OPTIMIZE events ZORDER BY (event_date, user_id)
```

Data skipping uses the per-file column statistics (min, max, null count) recorded in the Delta log. When a query includes a filter like `WHERE event_date = '2026-03-01'`, the engine reads the statistics, identifies which files could possibly contain matching rows, and reads only those files. For well-organized tables, this can reduce I/O by orders of magnitude.

### Merge (Upsert) Operations

Delta Lake supports `MERGE INTO` for complex upsert logic, matching source rows against target rows and applying inserts, updates, or deletes based on match conditions:

```sql
MERGE INTO customers AS target
USING updates AS source
ON target.customer_id = source.customer_id
WHEN MATCHED THEN UPDATE SET *
WHEN NOT MATCHED THEN INSERT *
```

Unlike appending new files (which is the only write pattern available in raw Parquet data lakes), `MERGE` operations read existing data, compute the changes, and write new files that reflect the merged result. The transaction log records the old files as removed and the new files as added, maintaining a complete audit trail.

## Delta Lake vs. Other Table Formats

### Delta Lake vs. Apache Iceberg

[Apache Iceberg](/learn/apache-iceberg) is another open-source table format that brings transactional guarantees to data lakes. Both provide ACID transactions, schema evolution, time travel, and partition evolution. The key differences are in design philosophy and ecosystem.

Delta Lake originated in the Databricks ecosystem and has the deepest integration with Apache Spark. Its transaction log is a sequence of JSON files (with Parquet checkpoints), and its concurrency model uses optimistic concurrency control based on file-level conflict detection.

Apache Iceberg was designed from the start to be engine-agnostic. Its metadata layer uses a tree of manifest files that enable fine-grained tracking of individual data files. Iceberg's partition evolution allows changing partition schemes without rewriting data, a capability that Delta Lake added later through partition transforms.

In practice, teams using Databricks tend to use Delta Lake; teams using multi-engine environments (Spark, Trino, Flink, Dremio) often choose Iceberg for its broader engine compatibility. For a detailed comparison, see [Apache Iceberg vs. Delta Lake](/learn/apache-iceberg-vs-delta-lake).

### Delta Lake vs. Apache Hudi

Apache Hudi (Hadoop Upserts Deletes and Incrementals) focuses on incremental data processing and near-real-time ingestion. Hudi's distinguishing feature is its record-level indexing, which enables efficient upserts without full-table scans.

Hudi supports two table types: Copy-on-Write (CoW), which rewrites entire files on update, and Merge-on-Read (MoR), which writes changes to a separate log and merges them at read time. Delta Lake uses a Copy-on-Write approach for all operations.

Delta Lake's transaction log model is simpler than Hudi's dual-table architecture, which can make it easier to operate and debug. Hudi's record-level index is more efficient for workloads dominated by single-record upserts, while Delta Lake's file-level approach is more efficient for batch upserts.

### Delta Lake vs. Raw Parquet in Data Lakes

Storing raw Parquet files in a data lake provides no transactional guarantees. Without a transaction log:

- **No atomic writes:** A failed write can leave partial files that corrupt subsequent reads
- **No schema enforcement:** Any file with any schema can be written to the same directory
- **No time travel:** There is no way to query historical versions of the data
- **No concurrent safety:** Multiple writers can produce conflicting files that readers cannot reconcile
- **No efficient deletes or updates:** Removing or updating specific rows requires rewriting entire files manually

Delta Lake adds all of these capabilities while keeping the underlying data in standard Parquet format. The overhead is the transaction log directory, which is typically a negligible fraction of total storage.

## How Spice Uses Delta Lake

[Spice](/platform/sql-federation-acceleration) connects to Delta Lake tables as a federated data source through the [delta-rs](https://github.com/delta-io/delta-rs) Rust library. This enables teams to query Delta tables using standard SQL without requiring a Spark cluster or Databricks runtime.

### Federated Query Access

Spice registers Delta Lake tables stored in S3, Azure Blob Storage, or GCS as federated data sources. Users query these tables through Spice's unified SQL interface alongside data from PostgreSQL, MySQL, Snowflake, and [40+ other connectors](/integrations). The query engine handles credential management, object store access, and Parquet decoding transparently.

```yaml
datasets:
  - from: delta_lake:s3://data-lake/events/
    name: events
    params:
      delta_lake_aws_access_key_id: ${AWS_ACCESS_KEY_ID}
      delta_lake_aws_secret_access_key: ${AWS_SECRET_ACCESS_KEY}
```

Because Spice uses [Apache DataFusion](/learn/apache-datafusion) as its query engine, it applies predicate pushdown to Delta Lake scans. Filters, projections, and partition pruning are pushed down through DataFusion's optimizer into the Delta table provider, minimizing the amount of data read from object storage.

### Local Acceleration

For workloads that require sub-second query performance, Spice supports [accelerating](/learn/data-acceleration) Delta Lake tables locally. The acceleration layer materializes the Delta table data into a local store, enabling fast queries without round-trips to cloud object storage.

```yaml
datasets:
  - from: delta_lake:s3://data-lake/events/
    name: events
    acceleration:
      enabled: true
      refresh_mode: changes
      refresh_check_interval: 10s
```

When `refresh_mode` is set to `changes`, Spice uses [change data capture](/learn/change-data-capture) techniques to detect new commits in the Delta log and apply only the incremental changes to the local cache. This keeps the local acceleration layer fresh without performing full reloads, which is critical for large tables where a full refresh would be prohibitively slow. The combination of Delta tables, local acceleration, and change-based refresh underpins the [operational data lakehouse](/use-case/operational-data-lakehouse) pattern, where applications query lakehouse data at operational latencies.

### Cross-Format Federation

Because Spice is format-agnostic, teams can join Delta Lake tables with data from other sources in a single query:

```sql
SELECT c.customer_name, SUM(e.amount)
FROM delta_events e
JOIN postgres_customers c ON e.customer_id = c.id
WHERE e.event_date > '2026-03-01'
GROUP BY c.customer_name
```

This enables [SQL federation](/learn/sql-federation) across Delta Lake, relational databases, and other table formats like [Apache Iceberg](/learn/apache-iceberg) without moving data into a centralized warehouse.

## Advanced Topics

### The Delta Log Protocol

The Delta Lake protocol defines two protocol versions: a reader protocol version and a writer protocol version. These versions control which features a reader or writer must support to interact with the table. When a new feature is introduced (e.g., column mapping, deletion vectors), the protocol version is incremented. Readers or writers that do not support the required version must refuse to operate on the table rather than producing incorrect results.

This protocol versioning enables forward compatibility: new features can be added to the format without breaking existing readers, as long as those readers check the protocol version before proceeding.

### Deletion Vectors

Traditional Delta Lake deletes work by rewriting entire Parquet files with the deleted rows removed. For tables with large files, deleting a small number of rows requires rewriting gigabytes of data. Deletion vectors solve this by recording which rows in a file have been logically deleted, using a compact bitmap stored alongside the file metadata in the transaction log.

Readers check the deletion vector for each file and skip the marked rows during scanning. The physical data remains in the original Parquet files until a subsequent `OPTIMIZE` or `VACUUM` operation rewrites the files without the deleted rows. This trades a small read-time cost (checking the bitmap) for a large write-time saving (avoiding file rewrites).

### Change Data Feed

Delta Lake's Change Data Feed (CDF) exposes a stream of row-level changes (inserts, updates, deletes) between table versions. This enables downstream consumers to process only the changes since their last read, rather than re-scanning the entire table.

```sql
-- Read changes between versions 10 and 20
SELECT * FROM table_changes('events', 10, 20)
```

CDF records are stored in separate `_change_data` files alongside the regular data files. Each change record includes the row data, the operation type (`insert`, `update_preimage`, `update_postimage`, or `delete`), and the commit version. This is the mechanism that enables efficient incremental processing pipelines and is the foundation for how tools like Spice detect and apply changes when refreshing locally accelerated Delta tables.

### Liquid Clustering

Liquid clustering is Delta Lake's replacement for traditional Hive-style partitioning. Instead of writing data into static partition directories (e.g., `event_date=2026-03-01/`), liquid clustering uses a space-filling curve to organize data dynamically. The clustering key can be changed at any time without rewriting existing data; new data is clustered according to the new key, and background optimization gradually reorganizes historical data.

This addresses a fundamental limitation of static partitioning: once a partition scheme is chosen, changing it requires a full table rewrite. Liquid clustering makes the organization scheme a tunable parameter rather than a permanent architectural decision.

<ContentRichText
  fields={{
    coverage: 'rc-end',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<AccordionFaq
  fields={{
    heading: 'Delta Lake FAQ',
    paragraph: '',
    items: [
      {
        title: 'What is the difference between Delta Lake and Apache Iceberg?',
        paragraph:
          '<p>Both are open-source table formats that add ACID transactions, schema evolution, and time travel to data lakes. Delta Lake originated in the Databricks ecosystem and has the deepest Spark integration. Apache Iceberg was designed to be engine-agnostic from the start and has broader multi-engine support (Spark, Trino, Flink, Dremio). Both store data in Parquet format. The choice often depends on the primary compute engine and ecosystem preferences.</p>',
      },
      {
        title: 'Does Delta Lake require Apache Spark?',
        paragraph:
          '<p>No. While Delta Lake was originally built for Spark, the delta-rs project provides a standalone Rust implementation with Python bindings that works without Spark. Tools like Spice, Trino, Flink, and others can read and write Delta tables directly. The core Delta Lake protocol is an open specification that any engine can implement.</p>',
      },
      {
        title: 'How does time travel work in Delta Lake?',
        paragraph:
          '<p>Every write to a Delta table creates a new version in the transaction log. Time travel allows querying any historical version by specifying a version number or timestamp. The underlying Parquet files for previous versions are retained until a VACUUM operation removes files older than the retention period (default 7 days). This enables auditing, debugging, and rollback without maintaining separate backups.</p>',
      },
      {
        title: 'What is the Delta Lake transaction log?',
        paragraph:
          '<p>The transaction log (Delta log) is a directory of ordered JSON files that records every atomic change to a Delta table. Each commit file contains actions like adding or removing data files, schema changes, and protocol updates. Readers replay the log from the latest checkpoint to determine the current set of active files. The log provides the foundation for ACID transactions, time travel, and audit history.</p>',
      },
      {
        title: 'Can Spice query Delta Lake tables without Spark?',
        paragraph:
          '<p>Yes. Spice connects to Delta Lake tables through the delta-rs Rust library, which implements the Delta Lake protocol natively without any JVM or Spark dependency. Spice can read Delta tables from S3, Azure Blob Storage, and GCS, apply predicate pushdown for efficient scans, and optionally accelerate tables locally for sub-second query performance.</p>',
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<ContentResourceFeatured
  fields={{
    heading: 'Learn more about Delta Lake and Spice',
    paragraph:
      'Documentation and technical deep dives on querying Delta Lake tables with federated SQL and local acceleration.',
    mode: 'default',
    resources: [
      {
        source: 'manual',
        resource: null,
        resource_manual: {
          eyebrow: 'Docs',
          title: {
            title: 'Spice.ai OSS Documentation',
            url: 'https://spiceai.org/docs',
            target: '_blank',
          },
          description:
            'Learn how Spice connects to Delta Lake tables for federated SQL queries with local acceleration and change data capture.',
          image: {
            ID: 1661,
            id: 1661,
            title: 'Docs jpeg',
            filename: 'Docs-jpeg.jpeg',
            filesize: 103192,
            url: '/website-assets/media/2025/12/Docs-jpeg.jpeg',
            link: '/docs-jpeg/',
            alt: '',
            author: '9',
            description: '',
            caption: '',
            name: 'docs-jpeg',
            status: 'inherit',
            uploaded_to: 0,
            date: '2025-12-05 04:13:53',
            modified: '2025-12-05 04:13:53',
            menu_order: 0,
            mime_type: 'image/jpeg',
            type: 'image',
            subtype: 'jpeg',
            icon: '/website-assets/media/default.png',
            width: 1832,
            height: 1036,
            sizes: {
              thumbnail: '/website-assets/media/2025/12/Docs-jpeg-150x150.jpeg',
              'thumbnail-width': 150,
              'thumbnail-height': 150,
              medium: '/website-assets/media/2025/12/Docs-jpeg-300x170.jpeg',
              'medium-width': 300,
              'medium-height': 170,
              medium_large:
                '/website-assets/media/2025/12/Docs-jpeg-768x434.jpeg',
              'medium_large-width': 768,
              'medium_large-height': 434,
              large: '/website-assets/media/2025/12/Docs-jpeg-1024x579.jpeg',
              'large-width': 1024,
              'large-height': 579,
              '1536x1536':
                '/website-assets/media/2025/12/Docs-jpeg-1536x869.jpeg',
              '1536x1536-width': 1536,
              '1536x1536-height': 869,
              '2048x2048': '/website-assets/media/2025/12/Docs-jpeg.jpeg',
              '2048x2048-width': 1832,
              '2048x2048-height': 1036,
            },
          },
        },
      },
      {
        source: 'picker',
        resource: [
          {
            title: 'How we use Apache DataFusion at Spice AI',
            slug: '/blog/how-we-use-apache-datafusion-at-spice-ai',
            excerpt:
              'A technical overview of how Spice extends Apache DataFusion with custom table providers, optimizer rules, and UDFs.',
            image:
              '/website-assets/media/2026/01/Engineering-at-Spice-AI-Apache-DataFusion.png',
            type: 'Blog',
            taxonomy: ['SQL Federation', 'Engineering'],
          },
        ],
        resource_manual: {
          eyebrow: '',
          title: null,
          description: '',
          image: false,
        },
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<TalkToAnEngineerCta />

---

## What is DuckDB?
URL: https://spice.ai/learn/duckdb
Date: 2026-03-12T00:00:00
Description: DuckDB is an open-source, in-process analytical database designed for fast OLAP queries. Learn how DuckDB works, its columnar architecture, and how Spice uses DuckDB as a data accelerator engine.

<HeroCenteredText
  fields={{
    graphic_position: 'no-graphic',
    heading_tag: 'h1',
    heading: 'What is DuckDB?',
    paragraph:
      'DuckDB is an open-source, in-process analytical database management system designed for fast OLAP queries. Often described as "SQLite for analytics," DuckDB runs embedded within a host application with zero external dependencies, making it ideal for analytical workloads that need to run close to the application.',
    cta: [
      {
        type: 'filled',
        cta: {
          title: 'See Spice acceleration',
          url: '/platform/sql-federation-acceleration',
          target: '',
        },
      },
      {
        type: 'bordered',
        cta: {
          title: 'Read the docs',
          url: 'https://spiceai.org/docs',
          target: '',
        },
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<ContentRichText
  fields={{
    coverage: 'rc-start',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

Analytical workloads (dashboards, data pipelines, federated queries, and AI applications) require fast reads over large datasets. Traditional database architectures force a choice: use a heavyweight server-based database like PostgreSQL for full SQL support, or use a lightweight embedded database like SQLite that lacks analytical performance. DuckDB fills the gap between these two options.

DuckDB is an open-source, in-process SQL OLAP database management system. It runs inside the host process with no external server, no dependencies, and no configuration. Despite this simplicity, it delivers analytical query performance that rivals dedicated data warehouse engines, thanks to a columnar storage engine and vectorized query execution.

## How DuckDB Works

DuckDB is designed from the ground up for analytical (OLAP) workloads. Its architecture reflects this focus at every level, from storage format to query execution.

### Columnar Storage

Unlike row-oriented databases (PostgreSQL, SQLite, MySQL), DuckDB stores data in a columnar format. Each column is stored independently and contiguously in memory. This layout is fundamental to analytical performance because analytical queries typically access a small number of columns across many rows.

When a query reads three columns out of a table with fifty, a columnar engine reads only the data for those three columns. A row-oriented engine must read entire rows, including all fifty columns, and discard the forty-seven it does not need. For scan-heavy analytical workloads, this difference translates to significantly less I/O and better cache utilization.

DuckDB organizes columnar data into compressed segments. Each segment stores a contiguous range of values for a single column and applies lightweight compression (dictionary encoding, bit-packing, run-length encoding, frame-of-reference encoding) based on the data distribution. Compression reduces memory usage and improves scan throughput by fitting more data into CPU caches.

### Vectorized Execution

DuckDB processes data in vectors (batches of values from a single column) rather than one row at a time. This vectorized execution model is the key to DuckDB's analytical performance.

Traditional row-at-a-time engines (like SQLite) process each row through the entire query pipeline before moving to the next row. This incurs high per-row overhead from function calls, type dispatching, and branch mispredictions. Vectorized execution amortizes these costs across thousands of values at once:

- **Reduced function call overhead:** A single function call processes an entire vector of values instead of one value at a time.
- **Better CPU cache utilization:** Processing a contiguous vector of values from a single column keeps the data in L1/L2 caches.
- **SIMD opportunities:** Operating on vectors of homogeneous values enables the compiler and CPU to use SIMD (Single Instruction, Multiple Data) instructions for operations like filtering and aggregation.

The combination of columnar storage and vectorized execution gives DuckDB performance characteristics closer to purpose-built analytical engines like ClickHouse or Apache DataFusion than to general-purpose embedded databases.

### Zero-Dependency Embedding

DuckDB is designed to be embedded directly into applications. It compiles to a single library with no external dependencies: no separate server process, no configuration files, no network setup. Applications link against the DuckDB library and interact with it through a C/C++ API, or through bindings available for Python, R, Java, Node.js, Rust, Go, and other languages.

This embedding model means DuckDB runs in the same process and address space as the host application. There is no serialization overhead for passing data between the application and the database, no network round-trips, and no separate process to manage. For analytical workloads that need to run close to the application (inside a data pipeline, a notebook, an API server, or an edge device), this architecture eliminates an entire class of operational complexity.

## Key Features

### Full SQL Support

DuckDB implements a comprehensive SQL dialect that includes:

- Window functions, CTEs (Common Table Expressions), and subqueries
- Complex joins including lateral joins and asof joins
- Nested types: structs, arrays, maps, and unions
- Regular expressions, string functions, and date/time operations
- User-defined functions and macros
- Prepared statements and parameterized queries

The SQL dialect is PostgreSQL-compatible in many areas, making it familiar to developers who work with PostgreSQL.

### Direct File Querying

DuckDB can query data files directly without first loading them into a database. It supports reading from:

- **Parquet files**: with predicate pushdown and column pruning for efficient scans
- **CSV and TSV files**: with automatic schema detection and parallel reading
- **JSON files**: including newline-delimited JSON (NDJSON)
- **Apache Arrow**: zero-copy integration with Arrow-based data pipelines

This capability makes DuckDB useful as an ad hoc query tool for data exploration. A developer can point DuckDB at a directory of Parquet files and run SQL queries immediately, without any ETL step or schema definition.

### Parallel Query Execution

DuckDB automatically parallelizes query execution across available CPU cores. The query planner identifies opportunities for parallelism (parallel scans, parallel hash joins, parallel aggregations) and distributes work across threads. This happens transparently, without any configuration or query hints.

For analytical workloads that process large datasets, parallel execution provides near-linear speedups on multi-core machines. Combined with vectorized execution, this means DuckDB can process billions of rows per second on commodity hardware.

### Transactions and Persistence

Despite being an embedded database, DuckDB supports full ACID transactions with serializable isolation. Data can be persisted to disk in DuckDB's native format, or DuckDB can operate entirely in-memory for transient analytical workloads.

The persistence layer uses a write-ahead log (WAL) for crash recovery and supports concurrent readers with a single writer. This makes DuckDB suitable for applications that need durable analytical storage without the operational overhead of a separate database server.

## DuckDB vs. Other Engines

### DuckDB vs. Apache DataFusion

[Apache DataFusion](/learn/apache-datafusion) is a Rust-native query engine built on Apache Arrow. Both DuckDB and DataFusion target analytical workloads with columnar processing, but they serve different roles:

- **DuckDB** is a complete database with its own storage engine, transaction support, and persistence layer. It is designed to be used as a self-contained analytical database.
- **DataFusion** is a query engine framework designed to be embedded into larger systems. It provides a query planner, optimizer, and execution engine, but relies on external systems for storage and data management.

DataFusion is more composable: it is designed to be extended with custom table providers, optimizer rules, and execution strategies. DuckDB is more turnkey: it provides a complete database experience out of the box. In the Spice ecosystem, both engines are available: DataFusion serves as the core [SQL federation](/learn/sql-federation) engine, while DuckDB is available as a data accelerator engine. For a detailed side-by-side comparison, see [Apache DataFusion vs. DuckDB](/learn/apache-datafusion-vs-duckdb).

### DuckDB vs. PostgreSQL

PostgreSQL is a server-based relational database designed for transactional (OLTP) workloads. DuckDB is an embedded database designed for analytical (OLAP) workloads. The key differences are:

- **Architecture:** PostgreSQL runs as a separate server process; DuckDB runs in-process with no server.
- **Storage:** PostgreSQL uses row-oriented storage; DuckDB uses columnar storage.
- **Query execution:** PostgreSQL processes rows one at a time (with some recent vectorization work); DuckDB uses fully vectorized execution.
- **Concurrency:** PostgreSQL supports many concurrent readers and writers with MVCC; DuckDB supports concurrent readers with a single writer.

For analytical queries that scan and aggregate large volumes of data, DuckDB is typically 10-100x faster than PostgreSQL. For transactional workloads with many concurrent writes, PostgreSQL is the appropriate choice.

### DuckDB vs. SQLite

SQLite and DuckDB share the same deployment model: both are embedded, zero-dependency databases. The differences are in their target workloads:

- **Storage:** SQLite uses row-oriented storage; DuckDB uses columnar storage.
- **Execution:** SQLite processes one row at a time through a virtual machine; DuckDB uses vectorized execution on column vectors.
- **Analytical performance:** DuckDB is orders of magnitude faster than SQLite for analytical queries (scans, aggregations, joins over large datasets).
- **Transactional performance:** SQLite is faster for simple point lookups and small transactional operations.

SQLite is the right choice for transactional embedded workloads (mobile apps, configuration storage, small-scale data). DuckDB is the right choice for analytical embedded workloads (data pipelines, dashboards, local query acceleration).

## How Spice Uses DuckDB

Spice supports DuckDB as a [data acceleration](/learn/data-acceleration) engine in its [SQL federation and acceleration platform](/platform/sql-federation-acceleration). When data is accelerated in Spice (cached locally from remote sources like PostgreSQL, Databricks, Snowflake, or Amazon S3), users can choose DuckDB as the engine that stores and queries the accelerated data.

This means that [federated queries](/learn/sql-federation) that hit the acceleration layer can leverage DuckDB's columnar storage and vectorized execution for fast local analytical queries. The accelerated data is kept synchronized with source systems, so queries against the DuckDB-backed acceleration layer always reflect the current state of the source data.

### DuckDB as a Data Accelerator

When configured as a data accelerator engine in Spice, DuckDB provides:

- **Fast local queries:** Accelerated data is stored in DuckDB's columnar format, enabling sub-second analytical queries over datasets that would otherwise require round-trips to remote sources.
- **Reduced load on source systems:** By caching data locally in DuckDB, Spice reduces the query load on production databases and data warehouses.
- **Flexible deployment:** DuckDB's zero-dependency architecture means the acceleration layer adds no operational complexity. There is no separate database server to manage: DuckDB runs embedded within the Spice runtime.
- **SQL compatibility:** DuckDB's comprehensive SQL support means accelerated queries can use the full range of analytical SQL features, including window functions, CTEs, and complex joins.

### Choosing an Accelerator Engine

Spice supports multiple data accelerator engines, and the right choice depends on the workload:

- **[Spice Cayenne](/blog/introducing-spice-cayenne-data-accelerator)** is the premier accelerator for multi-terabyte, low-latency workloads. It combines the [Vortex columnar format](/learn/vortex) with an embedded metadata engine to deliver faster queries and lower memory usage than DuckDB or Arrow alternatives.
- **DuckDB** is a strong default for analytical acceleration workloads. Its columnar storage and vectorized execution make it well-suited for scan-heavy queries, aggregations, and joins over moderate-to-large datasets.
- **Arrow** (in-memory) provides the fastest possible query performance for datasets that fit entirely in memory.
- **SQLite** is appropriate for acceleration of transactional-style access patterns with simple lookups and small result sets.

For large-scale workloads like [accelerating data lake queries](/use-case/datalake-accelerator), Spice Cayenne is the recommended choice. DuckDB occupies a practical middle ground for teams that need a familiar SQL engine with disk-based persistence for datasets larger than available memory.

## Advanced Topics

### Adaptive Compression in DuckDB

DuckDB's storage engine applies compression at the column segment level, choosing the most effective encoding for each segment based on the data distribution. The available compression schemes include:

- **Constant encoding** for segments where every value is identical
- **Dictionary encoding** for segments with low cardinality
- **Bit-packing** for integer segments with a narrow value range
- **Frame-of-reference (FOR)** encoding for segments with values clustered around a base
- **Delta encoding** for monotonically increasing sequences
- **FSST (Fast Static Symbol Table)** for string compression

The compression selection is automatic and per-segment, so different segments of the same column can use different encodings. This adaptive approach achieves good compression ratios without manual tuning, and the encodings are designed to be fast to decompress during vectorized scans.

### Parallel Pipeline Execution

DuckDB's query execution model is built around parallel pipelines. The query planner decomposes a query into a series of pipelines, where each pipeline is a sequence of operators that can process data in a streaming fashion. Pipelines are separated by pipeline breakers: operators like hash joins and sorts that must consume their entire input before producing output.

Within each pipeline, DuckDB parallelizes execution by partitioning the input data across threads. Each thread processes its partition independently through the pipeline's operators, producing partial results that are merged at the pipeline breaker. This morsel-driven parallelism approach provides good load balancing across cores without the overhead of fine-grained synchronization.

For complex queries with multiple pipeline stages, DuckDB can execute independent pipelines concurrently. The scheduler manages thread allocation across active pipelines to maximize hardware utilization while respecting memory budgets.

### Extension System

DuckDB supports a modular extension system that adds capabilities without bloating the core database. Extensions can add new data types, functions, file format readers, and storage backends. Notable extensions include:

- **httpfs**: enables reading Parquet and CSV files directly from HTTP/S3 endpoints
- **spatial**: adds geometry types and spatial functions
- **json**: provides JSON parsing and querying functions
- **icu**: adds Unicode collation and time zone support
- **fts**: enables full-text search with inverted indexes

Extensions are loaded on demand and can be installed from DuckDB's extension repository. This modular architecture keeps the core database small and dependency-free while allowing users to add functionality as needed.

<ContentRichText
  fields={{
    coverage: 'rc-end',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<AccordionFaq
  fields={{
    heading: 'DuckDB FAQ',
    paragraph: '',
    items: [
      {
        title: 'How does DuckDB compare to SQLite?',
        paragraph:
          '<p>DuckDB and SQLite are both embedded, zero-dependency databases, but they target different workloads. SQLite uses row-oriented storage and processes one row at a time, making it well-suited for transactional workloads like mobile apps and configuration storage. DuckDB uses columnar storage and vectorized execution, making it orders of magnitude faster for analytical queries that scan, aggregate, and join large datasets. Choose SQLite for transactional embedded workloads; choose DuckDB for analytical embedded workloads.</p>',
      },
      {
        title: 'Is DuckDB open source?',
        paragraph:
          '<p>Yes. DuckDB is released under the MIT License and is developed by DuckDB Labs, a company founded by the original creators of the project at Centrum Wiskunde &amp; Informatica (CWI) in the Netherlands. The source code, documentation, and issue tracker are publicly available on GitHub.</p>',
      },
      {
        title: 'Can DuckDB handle large datasets that exceed available memory?',
        paragraph:
          '<p>Yes. DuckDB supports out-of-core execution, meaning it can spill intermediate results to disk when available memory is insufficient. This allows DuckDB to process datasets larger than RAM, though performance is best when the working set fits in memory. DuckDB also supports persistent databases stored on disk, so the full dataset does not need to be loaded into memory at once.</p>',
      },
      {
        title: 'How does Spice use DuckDB?',
        paragraph:
          '<p>Spice supports DuckDB as a data accelerator engine. When data is federated from remote sources like PostgreSQL, Databricks, or Amazon S3, Spice can cache the results locally in DuckDB for fast analytical queries. This reduces query latency and offloads work from source systems. DuckDB runs embedded within the Spice runtime with no separate server to manage.</p>',
      },
      {
        title: 'What file formats can DuckDB read directly?',
        paragraph:
          '<p>DuckDB can query Parquet, CSV, TSV, and JSON files directly without first loading them into a database table. For Parquet files, DuckDB supports predicate pushdown and column pruning for efficient scans. DuckDB also integrates with Apache Arrow for zero-copy data exchange with Arrow-based data pipelines and applications.</p>',
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<ContentResourceFeatured
  fields={{
    heading: 'Learn more about DuckDB and data acceleration',
    paragraph:
      'Guides and blog posts on analytical databases, data acceleration, and query performance with Spice.',
    mode: 'default',
    resources: [
      {
        source: 'manual',
        resource: null,
        resource_manual: {
          eyebrow: 'Docs',
          title: {
            title: 'Spice.ai OSS Documentation',
            url: 'https://spiceai.org/docs',
            target: '_blank',
          },
          description:
            'Learn how Spice supports DuckDB as a data accelerator engine for fast local analytical queries.',
          image: {
            ID: 1661,
            id: 1661,
            title: 'Docs jpeg',
            filename: 'Docs-jpeg.jpeg',
            filesize: 103192,
            url: '/website-assets/media/2025/12/Docs-jpeg.jpeg',
            link: '/docs-jpeg/',
            alt: '',
            author: '9',
            description: '',
            caption: '',
            name: 'docs-jpeg',
            status: 'inherit',
            uploaded_to: 0,
            date: '2025-12-05 04:13:53',
            modified: '2025-12-05 04:13:53',
            menu_order: 0,
            mime_type: 'image/jpeg',
            type: 'image',
            subtype: 'jpeg',
            icon: '/website-assets/media/default.png',
            width: 1832,
            height: 1036,
            sizes: {
              thumbnail: '/website-assets/media/2025/12/Docs-jpeg-150x150.jpeg',
              'thumbnail-width': 150,
              'thumbnail-height': 150,
              medium: '/website-assets/media/2025/12/Docs-jpeg-300x170.jpeg',
              'medium-width': 300,
              'medium-height': 170,
              medium_large:
                '/website-assets/media/2025/12/Docs-jpeg-768x434.jpeg',
              'medium_large-width': 768,
              'medium_large-height': 434,
              large: '/website-assets/media/2025/12/Docs-jpeg-1024x579.jpeg',
              'large-width': 1024,
              'large-height': 579,
              '1536x1536':
                '/website-assets/media/2025/12/Docs-jpeg-1536x869.jpeg',
              '1536x1536-width': 1536,
              '1536x1536-height': 869,
              '2048x2048': '/website-assets/media/2025/12/Docs-jpeg.jpeg',
              '2048x2048-width': 1832,
              '2048x2048-height': 1036,
            },
          },
        },
      },
      {
        source: 'picker',
        resource: [
          {
            title: 'How we use Apache DataFusion at Spice AI',
            slug: '/blog/how-we-use-apache-datafusion-at-spice-ai',
            excerpt:
              'A technical overview of how Spice extends Apache DataFusion with custom table providers, optimizer rules, and UDFs.',
            image:
              '/website-assets/media/2026/01/Engineering-at-Spice-AI-Apache-DataFusion.png',
            type: 'Blog',
            taxonomy: ['SQL Federation', 'Engineering'],
          },
        ],
        resource_manual: {
          eyebrow: '',
          title: null,
          description: '',
          image: false,
        },
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<TalkToAnEngineerCta />

---

## What are Embeddings?
URL: https://spice.ai/learn/embeddings
Date: 2026-03-02T00:00:00
Description: Embeddings are dense vector representations of text, images, or code that capture semantic meaning. Learn how embedding models work, what dimensions represent, and how embeddings enable semantic search, RAG, and classification.

<HeroCenteredText
  fields={{
    graphic_position: 'no-graphic',
    heading_tag: 'h1',
    heading: 'What are Embeddings?',
    paragraph:
      'Embeddings are dense vector representations that map text, images, or code into high-dimensional space where semantic similarity corresponds to geometric proximity.',
    cta: [
      {
        type: 'filled',
        cta: {
          title: 'See Spice hybrid search',
          url: '/platform/hybrid-sql-search',
          target: '',
        },
      },
      {
        type: 'bordered',
        cta: {
          title: 'Read the docs',
          url: 'https://spiceai.org/docs',
          target: '',
        },
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<ContentRichText
  fields={{
    coverage: 'rc-start',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

Modern AI and search systems work with meaning, not just words. When a user searches for "cancel my subscription," the system should also find documents about "account termination," even though the two phrases share no words. Embeddings make this possible by converting text (or images, code, or any data) into numerical vectors where similar meanings are close together in vector space.

An embedding is a list of numbers (typically 384 to 3072 floating-point values) that represents the semantic content of a piece of text. These vectors are produced by embedding models trained on large text corpora, where the training objective ensures that semantically similar inputs produce vectors that are geometrically close (as measured by cosine similarity or dot product) in high-dimensional space.

## What Embeddings Represent

Each dimension in an embedding vector captures some aspect of meaning, but unlike hand-crafted features, these dimensions are learned automatically and don't correspond to human-interpretable concepts. The key property is that the geometric relationships between vectors reflect semantic relationships between inputs:

- "king" - "man" + "woman" produces a vector close to "queen"
- "Python" and "JavaScript" are closer together than "Python" and "photosynthesis"
- "How do I reset my password?" and "I forgot my login credentials" produce similar vectors

This property emerges from training. Embedding models learn to compress the statistical patterns of language into dense vectors such that inputs appearing in similar contexts (and thus having similar meanings) end up near each other in vector space.

## How Embedding Models Work

### Transformer Encoders

Most modern embedding models are based on **encoder-only transformers** derived from the BERT architecture. The process works as follows:

1. **Tokenization:** Input text is split into subword tokens using a vocabulary (e.g., WordPiece, BPE). "Kubernetes deployment" might become `["kubernetes", "deploy", "##ment"]`.
2. **Token encoding:** Each token is mapped to a learned vector, and positional encodings are added.
3. **Self-attention layers:** Multiple transformer layers process the token vectors, with each layer's self-attention mechanism allowing every token to attend to every other token. This builds contextual representations: the vector for "bank" differs depending on whether the surrounding context is about finance or rivers.
4. **Pooling:** The final token representations are combined into a single vector representing the entire input. Common pooling strategies include CLS token pooling (using the special classification token's output), mean pooling (averaging all token vectors), and max pooling.

```mermaid
flowchart LR
    A[Text] --> B[Tokenize]
    B --> C[Transformer Encoder]
    C --> D[Pooling]
    D --> E["Vector [768 dims]"]
```

### Sentence Transformers

Raw BERT embeddings are not optimized for semantic similarity: a sentence like "A dog sits on a bench" and "A dog is sitting outside" might produce dissimilar vectors despite having similar meanings. **Sentence transformer** models (like those from the sentence-transformers library) fine-tune BERT-style encoders using contrastive learning objectives.

During training, the model is shown pairs of similar and dissimilar sentences. It learns to produce embeddings where similar pairs have high cosine similarity and dissimilar pairs have low cosine similarity. This training process (often using triplet loss or contrastive loss) transforms a general-purpose language model into one that produces semantically meaningful embeddings.

## Embedding Dimensions

Embedding models produce vectors of a fixed size, called the **embedding dimension**. Common dimensions include:

| Model                         | Dimensions | Context         |
| ----------------------------- | ---------- | --------------- |
| OpenAI text-embedding-3-small | 1536       | General purpose |
| OpenAI text-embedding-3-large | 3072       | Higher quality  |
| Cohere embed-v3               | 1024       | Multilingual    |
| BGE-large-en-v1.5             | 1024       | Open-source     |
| E5-large-v2                   | 1024       | Open-source     |
| all-MiniLM-L6-v2              | 384        | Lightweight     |

Higher dimensions generally capture more nuanced meaning but require more storage and compute for similarity calculations. A 768-dimensional embedding for a single text chunk uses 3,072 bytes (768 x 4 bytes per float32). At scale (millions of documents with multiple chunks each), embedding storage becomes a significant consideration.

## How Embeddings Enable AI Applications

### Semantic Search

The most direct application of embeddings is [vector search](/learn/vector-search). Documents are embedded at index time, queries are embedded at search time, and the nearest vectors in the index are returned as results. This captures meaning rather than keywords: "cancel subscription" matches "account termination" because their embedding vectors are close together.

### Retrieval-Augmented Generation (RAG)

[RAG systems](/learn/retrieval-augmented-generation) use embeddings to retrieve relevant context before generating an answer. The query is embedded, similar document chunks are retrieved via vector search, and the retrieved text is passed to a language model as context. Embedding quality directly determines retrieval quality, which in turn determines answer quality.

### Clustering and Classification

Embeddings enable unsupervised clustering (grouping similar documents without labeled data) and few-shot classification (categorizing documents with only a handful of examples per category). Because embeddings capture meaning, a simple k-nearest-neighbors classifier over embedding space can achieve strong results without task-specific model training.

## Embeddings vs. Keyword Matching

The fundamental difference is that keyword matching operates on surface-level token overlap, while embeddings operate on learned semantic representations:

| Aspect                                          | Keyword Matching (BM25)     | Embeddings                      |
| ----------------------------------------------- | --------------------------- | ------------------------------- |
| Matching basis                                  | Exact token overlap         | Semantic similarity             |
| "cancel subscription" vs. "account termination" | No match                    | High similarity                 |
| Exact identifiers (error codes, IDs)            | Strong match                | Weak match                      |
| Computational cost                              | Low (inverted index lookup) | Higher (vector computation)     |
| Storage                                         | Inverted index              | Dense vectors (KB per document) |
| Interpretability                                | High (which terms matched)  | Low (opaque vector space)       |

In practice, combining both approaches through [hybrid search](/learn/hybrid-search) delivers better results than either alone. [BM25 full-text search](/learn/bm25-full-text-search) handles exact terms and identifiers, while embeddings capture meaning and handle vocabulary mismatch.

## Choosing Embedding Models

Selecting an embedding model involves tradeoffs between quality, cost, latency, and operational complexity:

**Commercial APIs** (OpenAI, Cohere, Google) offer high-quality embeddings with simple API calls. The tradeoffs are per-token cost, network latency, vendor dependency, and sending data to external services. OpenAI's text-embedding-3 models and Cohere's embed-v3 are strong general-purpose choices.

**Open-source models** (BGE, E5, GTE, all-MiniLM) can run locally, eliminating cost and latency concerns. The MTEB (Massive Text Embedding Benchmark) leaderboard is the standard reference for comparing model quality across tasks. Open-source models have closed much of the quality gap with commercial options, especially for English-language tasks.

Key factors to evaluate:

- **Quality on your domain:** General benchmarks don't always predict performance on domain-specific data. Test with your actual queries and documents.
- **Latency requirements:** Smaller models (384 dimensions) embed text faster than larger ones (3072 dimensions), which matters for real-time search.
- **Multilingual support:** If your data spans languages, choose a model trained on multilingual data (e.g., Cohere embed-v3, multilingual-e5-large).
- **Max token length:** Models have a maximum context window (typically 512 tokens). Longer documents must be chunked before embedding.

## Embeddings with Spice

[Spice](/platform/hybrid-sql-search) integrates embedding generation alongside [SQL queries](/learn/sql-federation) and [hybrid search](/learn/hybrid-search) in a single runtime. Rather than managing separate embedding services and vector databases, Spice handles the entire pipeline (generating embeddings, storing vectors, and executing similarity search) within the same system that handles your SQL queries.

This means you can:

- Generate embeddings using configured [LLM models](/learn/llm-inference) alongside your data queries, without external API orchestration
- Store and index embeddings alongside your relational data from [40+ connected sources](/integrations)
- Combine embedding-based [vector search](/learn/vector-search) with [BM25 full-text search](/learn/bm25-full-text-search) in [hybrid search](/learn/hybrid-search) queries
- Keep embeddings fresh as source data changes through [real-time CDC](/learn/change-data-capture)

```sql
-- Generate embeddings and search in Spice
SELECT * FROM search(
  'knowledge_base',
  'how to reset API credentials',
  mode => 'hybrid',
  limit => 10
)
```

The unified approach eliminates the typical architecture where embeddings are generated by one service, stored in a vector database, and queried separately from your relational data. Instead, embedding generation, storage, and search are co-located with your [SQL federation](/learn/sql-federation) layer, giving [retrieval-augmented generation](/use-case/retrieval-augmented-generation) systems a single runtime for the entire retrieval path.

## Advanced Topics

### Fine-Tuning Embeddings

General-purpose embedding models may not perform optimally on domain-specific data. **Fine-tuning** adapts a pre-trained embedding model to your domain using labeled pairs (similar and dissimilar examples from your data).

The most effective approach is **contrastive fine-tuning**: given anchor-positive-negative triplets, the model learns to pull positive pairs closer and push negative pairs apart in embedding space. Even small fine-tuning datasets (a few thousand pairs) can significantly improve retrieval quality on domain-specific queries. Libraries like sentence-transformers provide straightforward fine-tuning APIs.

The risk is overfitting: a model fine-tuned too aggressively on a narrow domain may lose its general-purpose capabilities. Techniques like multi-task training (mixing domain-specific and general pairs) mitigate this.

### Matryoshka Representations

Standard embeddings use a fixed dimension, but not all tasks require the full vector. **Matryoshka Representation Learning (MRL)** trains embedding models such that any prefix of the full embedding is itself a valid, lower-dimensional embedding.

For example, a 768-dimensional Matryoshka embedding can be truncated to 256 or 128 dimensions with graceful quality degradation. This enables adaptive precision: use the full embedding for high-quality search and a truncated version for fast approximate filtering. OpenAI's text-embedding-3 models support this: you can request a 256-dimensional embedding from a model that natively produces 3072 dimensions.

### Quantized Embeddings

Storing millions of float32 embedding vectors requires substantial memory. **Quantization** reduces storage and compute costs by representing each dimension with fewer bits:

- **float32** (default): 4 bytes per dimension, full precision
- **float16**: 2 bytes per dimension, minimal quality loss
- **int8**: 1 byte per dimension, noticeable but often acceptable quality loss
- **binary**: 1 bit per dimension, significant quality loss but 32x compression

Binary quantization is particularly effective as a first-pass filter: use binary similarity to quickly identify candidates, then re-rank using full-precision embeddings.

### Chunking Strategies for Long Documents

Embedding models have a maximum context window (typically 512 tokens), so longer documents must be split into chunks before embedding. Chunking strategy significantly affects retrieval quality:

- **Fixed-size chunks** (e.g., 256 tokens with 50-token overlap): Simple and predictable, but may split sentences or paragraphs mid-thought.
- **Semantic chunking:** Split at paragraph or section boundaries to preserve coherent units of meaning. More complex to implement but produces higher-quality chunks.
- **Recursive chunking:** Start with large chunks and recursively split oversized chunks at the most natural boundary (paragraphs, then sentences, then words).

The overlap between adjacent chunks ensures that information at chunk boundaries is not lost. Typical overlap is 10-20% of the chunk size.

<ContentRichText
  fields={{
    coverage: 'rc-end',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<AccordionFaq
  fields={{
    heading: 'Embeddings FAQ',
    paragraph: '',
    items: [
      {
        title: 'What is the difference between an embedding and a vector?',
        paragraph:
          '<p>A vector is a mathematical object: a list of numbers. An embedding is a specific kind of vector produced by a trained model to represent the semantic meaning of an input. All embeddings are vectors, but not all vectors are embeddings. The term "embedding" implies that the vector was learned to capture meaning in a way that preserves semantic relationships.</p>',
      },
      {
        title: 'How many dimensions should my embeddings have?',
        paragraph:
          '<p>It depends on your quality and performance requirements. Models with 384 dimensions (like all-MiniLM-L6-v2) are fast and memory-efficient, suitable for lightweight applications. Models with 768-1024 dimensions (like BGE-large or E5-large) offer a good balance of quality and efficiency. Models with 1536-3072 dimensions (like OpenAI text-embedding-3) provide the highest quality but require more storage and compute. Start with a mid-range model and evaluate whether higher dimensions improve results on your specific data.</p>',
      },
      {
        title:
          'Do I need to re-embed all my documents if I change embedding models?',
        paragraph:
          '<p>Yes. Embeddings from different models exist in different vector spaces and are not comparable. If you switch from one embedding model to another, all documents must be re-embedded with the new model. This is one reason why embedding model selection is an important upfront decision: migrating between models at scale can be time-consuming and costly.</p>',
      },
      {
        title: 'How do embeddings handle multiple languages?',
        paragraph:
          '<p>Multilingual embedding models (like Cohere embed-v3 or multilingual-e5-large) are trained on text from many languages simultaneously. These models map semantically similar content to nearby vectors regardless of language, so a query in English can match a document in French if the content is semantically similar. The quality of cross-lingual matching varies by language pair and model.</p>',
      },
      {
        title: 'What is the relationship between embeddings and RAG?',
        paragraph:
          '<p>Embeddings are the foundation of the retrieval step in retrieval-augmented generation (RAG). Documents are embedded and stored in a vector index. When a user asks a question, the query is embedded and the most similar document chunks are retrieved. These chunks are then passed as context to a language model, which generates an answer grounded in the retrieved information. Better embeddings lead to better retrieval, which leads to more accurate and relevant generated answers.</p>',
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<ContentResourceFeatured
  fields={{
    heading: 'Learn more about embeddings',
    paragraph:
      'Technical guides on using embeddings for search, RAG, and AI applications in a unified runtime.',
    mode: 'default',
    resources: [
      {
        source: 'manual',
        resource: null,
        resource_manual: {
          eyebrow: 'Docs',
          title: {
            title: 'Spice Docs',
            url: 'https://spiceai.org/docs',
            target: '_blank',
          },
          description:
            'Learn how Spice integrates embedding generation, vector search, and SQL federation in a single runtime.',
          image: {
            ID: 1661,
            id: 1661,
            title: 'Docs jpeg',
            filename: 'Docs-jpeg.jpeg',
            filesize: 103192,
            url: '/website-assets/media/2025/12/Docs-jpeg.jpeg',
            link: '/docs-jpeg/',
            alt: '',
            author: '9',
            description: '',
            caption: '',
            name: 'docs-jpeg',
            status: 'inherit',
            uploaded_to: 0,
            date: '2025-12-05 04:13:53',
            modified: '2025-12-05 04:13:53',
            menu_order: 0,
            mime_type: 'image/jpeg',
            type: 'image',
            subtype: 'jpeg',
            icon: '/website-assets/media/default.png',
            width: 1832,
            height: 1036,
            sizes: {
              thumbnail: '/website-assets/media/2025/12/Docs-jpeg-150x150.jpeg',
              'thumbnail-width': 150,
              'thumbnail-height': 150,
              medium: '/website-assets/media/2025/12/Docs-jpeg-300x170.jpeg',
              'medium-width': 300,
              'medium-height': 170,
              medium_large:
                '/website-assets/media/2025/12/Docs-jpeg-768x434.jpeg',
              'medium_large-width': 768,
              'medium_large-height': 434,
              large: '/website-assets/media/2025/12/Docs-jpeg-1024x579.jpeg',
              'large-width': 1024,
              'large-height': 579,
              '1536x1536':
                '/website-assets/media/2025/12/Docs-jpeg-1536x869.jpeg',
              '1536x1536-width': 1536,
              '1536x1536-height': 869,
              '2048x2048': '/website-assets/media/2025/12/Docs-jpeg.jpeg',
              '2048x2048-width': 1832,
              '2048x2048-height': 1036,
            },
          },
        },
      },
      {
        source: 'picker',
        resource: [
          {
            title: "A Developer's Guide to Understanding Spice.ai",
            slug: '/blog/a-developers-guide-to-understanding-spice-ai',
            excerpt:
              'A comprehensive technical guide to understanding the Spice.ai platform, its architecture, and how it unifies data and AI.',
            image:
              '/website-assets/media/2026/02/A-developers-guide-to-understanding-Spice.ai_.png',
            type: 'Blog',
            taxonomy: ['Engineering', 'Spice AI'],
          },
        ],
        resource_manual: {
          eyebrow: '',
          title: null,
          description: '',
          image: false,
        },
      },
      {
        source: 'picker',
        resource: [
          {
            title:
              'True Hybrid Search: Vector, Full-Text, and SQL in One Runtime',
            slug: '/blog/true-hybrid-search',
            excerpt:
              'Build hybrid search without managing multiple systems. Query vectors, run full-text search, and execute SQL in one unified runtime.',
            image: '/website-assets/media/2025/09/image-33.png',
            type: 'Blog',
            taxonomy: ['Spice AI'],
          },
        ],
        resource_manual: {
          eyebrow: '',
          title: null,
          description: '',
          image: false,
        },
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<TalkToAnEngineerCta />

---

## Full-Text Search vs Vector Search: How to Choose
URL: https://spice.ai/learn/full-text-search-vs-vector-search
Date: 2026-01-25T00:00:00
Description: Full-text search matches exact keywords using BM25 scoring, while vector search finds semantically similar content using embeddings. Learn the key differences, when to use each approach, and how hybrid search combines both for optimal results.

<HeroCenteredText
  fields={{
    graphic_position: 'no-graphic',
    heading_tag: 'h1',
    heading: 'Full-Text Search vs Vector Search',
    paragraph:
      'Full-text search matches exact keywords. Vector search matches meaning. Understanding when to use each (and when to combine them) is critical for building effective search and retrieval systems.',
    cta: [
      {
        type: 'filled',
        cta: {
          title: 'See Spice hybrid search',
          url: '/platform/hybrid-sql-search',
          target: '',
        },
      },
      {
        type: 'bordered',
        cta: {
          title: 'Read the docs',
          url: 'https://spiceai.org/docs/features/search',
          target: '',
        },
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<ContentRichText
  fields={{
    coverage: 'rc-start',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

Full-text search and vector search solve the same fundamental problem (finding relevant information in a collection of documents), but they approach it from opposite directions. Full-text search looks for documents that contain the query's exact terms. Vector search looks for documents whose meaning is closest to the query's meaning, regardless of which words are used.

Neither approach is universally better. Each has strengths that correspond to the other's weaknesses, and understanding these tradeoffs is essential for choosing the right search strategy for your application. In many production systems, the answer is to use both through [hybrid search](/platform/hybrid-sql-search).

## How Full-Text Search Works

[Full-text search](/learn/bm25-full-text-search) uses an inverted index, a data structure that maps every unique term to the list of documents containing it. When a query arrives, the system looks up each query term in the inverted index, finds the documents that match, and scores them using a ranking function.

The standard ranking function is **BM25** (Best Match 25), which scores documents based on three signals:

1. **Term frequency:** How often the query term appears in the document (with diminishing returns for repeated occurrences)
2. **Inverse document frequency:** How rare the term is across the entire corpus (rare terms are more informative)
3. **Document length normalization:** Shorter documents with the same term count are typically more focused

Full-text search is fast, predictable, and interpretable. You can explain why a document ranked highly: it contained specific terms at specific frequencies. The inverted index enables sub-millisecond lookups even across millions of documents.

## How Vector Search Works

[Vector search](/learn/vector-search) converts both documents and queries into numerical vectors called [embeddings](/learn/embeddings): lists of floating-point numbers that encode semantic meaning. These embeddings are generated by machine learning models trained on large text corpora, where the model learns to place semantically similar text close together in high-dimensional space.

At query time, the search query is embedded into a vector using the same model, and the system finds the stored vectors closest to the query vector using a distance metric like cosine similarity. The result is a ranked list of documents ordered by semantic similarity to the query.

Vector search captures meaning rather than keywords. "How do I fix a slow API?" matches documents about "endpoint latency optimization" because both concepts map to nearby regions in the embedding space, even though they share no words.

## Key Differences at a Glance

| Aspect | Full-Text Search (BM25) | Vector Search |
| --- | --- | --- |
| **What it matches** | Exact terms and their variants | Semantic meaning |
| **Index type** | Inverted index (posting lists) | Vector index (HNSW, IVF) |
| **Query "cancel subscription"** | Matches docs containing "cancel" and "subscription" | Matches docs about account termination, ending service, etc. |
| **Exact identifiers** (error codes, product SKUs) | Precise match | Weak: may return generic related content |
| **Synonym handling** | None without manual expansion | Automatic: learned from training data |
| **Scoring transparency** | High: term weights are interpretable | Low: similarity scores are opaque |
| **Storage per document** | Posting list entries (compact) | Dense vector, typically 1-12 KB depending on dimensions |
| **Index build cost** | Low (tokenize and insert into posting lists) | Higher (generate embeddings via ML model, build ANN index) |
| **Query latency** | Sub-millisecond | Sub-millisecond to low milliseconds (ANN lookup) |
| **Cold start** | Works immediately with any text | Requires an embedding model and vector index |

## Where Full-Text Search Excels

Full-text search is the stronger choice when:

- **Queries contain exact identifiers.** Product names, error codes, model numbers, API endpoints, and other precise identifiers need exact matching. Searching for "ERR-4502" should return documents about that specific error, not documents about errors in general.
- **Domain-specific terminology matters.** In legal, medical, or scientific contexts, precise terminology carries specific meaning. "Negligence" and "carelessness" are not interchangeable in a legal search.
- **Users expect keyword behavior.** When users put terms in quotes or use Boolean operators (AND, OR, NOT), they expect keyword-level precision.
- **Interpretability is required.** Full-text search can highlight exactly which terms matched and why a document scored highly. This is valuable for debugging search quality and for user-facing search interfaces that show match highlights.
- **Infrastructure simplicity is a priority.** Full-text search requires no ML models, no embedding generation pipeline, and no GPU infrastructure. An inverted index is fast to build and cheap to maintain.

## Where Vector Search Excels

Vector search is the stronger choice when:

- **Vocabulary mismatch is the primary challenge.** Users describe problems in their own words, which rarely match the terminology in your documentation. "My app is crashing on startup" should find documents about "application initialization failures."
- **Natural language questions drive search.** Conversational queries like "how do I speed up my database queries?" express intent that keyword matching cannot capture.
- **Cross-language or multi-modal search is needed.** Multilingual embedding models can match queries in one language to documents in another. Multi-modal models can match text queries to images or code.
- **Search powers an AI pipeline.** In [retrieval-augmented generation (RAG)](/learn/retrieval-augmented-generation) and [AI agent](/use-case/secure-ai-agents) workflows, semantic retrieval finds the conceptually relevant context that the LLM needs to generate accurate answers.
- **Content is unstructured and varied.** Knowledge bases, support tickets, internal wikis, and Slack archives contain diverse language that benefits from semantic understanding over exact term matching.

## When to Use Each: A Decision Framework

The right search approach depends on your query patterns, data characteristics, and application requirements.

**Start with full-text search if:**

- Your data has structured identifiers that users search for directly
- Query patterns are predictable and keyword-oriented
- You need a simple, low-maintenance search solution
- Match transparency is a requirement

**Start with vector search if:**

- Users ask natural language questions
- Vocabulary mismatch between queries and documents is common
- You are building RAG or AI-powered features
- Your content spans diverse topics and terminology

**Use hybrid search if:**

- Your queries include a mix of exact lookups and conceptual questions
- You cannot predict whether a given query will be keyword-oriented or semantic
- Retrieval accuracy is mission-critical (as in RAG, [application search](/use-case/application-search), or enterprise knowledge bases)
- You want the highest overall retrieval quality without compromising on either precision or recall

In practice, most production [search applications](/use-case/application-search) benefit from hybrid search because real-world query traffic is a mix of all these patterns. A user might search for "ERR-4502 connection timeout", where the error code needs exact matching and "connection timeout" benefits from semantic understanding.

## How Hybrid Search Combines Both

[Hybrid search](/learn/hybrid-search) runs full-text search and vector search in parallel against the same query, then merges the results using a fusion algorithm. The most common fusion method is **Reciprocal Rank Fusion (RRF)**, which scores each document based on its rank position in each result set rather than its raw score.

The process works in three steps:

1. **Parallel retrieval:** The query is simultaneously processed by the BM25 inverted index and the vector index, producing two independent ranked result sets
2. **Score normalization:** Because BM25 scores and cosine similarity scores are on different scales, they must be normalized before combining
3. **Rank fusion:** RRF assigns each document a score of `1 / (k + rank)` for each result set it appears in, sums these scores, and sorts by the combined score

Documents that rank highly in both result sets receive the highest combined scores. Documents that rank highly in only one set still appear in the final results, but lower in the ranking.

```sql
-- Hybrid search combining BM25 and vector search in Spice
SELECT * FROM search(
  'knowledge_base',
  'how to handle connection timeout errors',
  mode => 'hybrid',
  limit => 10
)
```

Hybrid search adds minimal latency over either method alone because the two searches execute concurrently. The fusion step is a lightweight rank-based operation that typically adds only a few milliseconds.

## Advanced Topics

### Embedding Model Selection and Its Impact on Search Quality

The quality of vector search depends heavily on the embedding model. General-purpose models like OpenAI's `text-embedding-3-large` or open-source models like `bge-large-en-v1.5` work well across many domains, but domain-specific fine-tuning can significantly improve results.

Key considerations for embedding model selection:

- **Dimensionality:** Higher dimensions (1024-3072) capture more nuance but require more storage and compute. Lower dimensions (384-768) are faster and cheaper but may lose fine-grained distinctions.
- **Training data:** Models trained on code perform better for code search. Models trained on scientific papers perform better for research retrieval. General models are a reasonable default.
- **Asymmetric vs. symmetric:** Some models are trained for asymmetric search (short query vs. long document), while others are trained for symmetric similarity (similar-length passages). Choose based on your use case.

When vector search underperforms, the embedding model is often the bottleneck. Before adding complexity (re-ranking, query expansion), evaluate whether a better-suited embedding model improves baseline results.

### Query Expansion and Reformulation

Full-text search can be improved without switching to vector search through **query expansion**: automatically adding related terms to the original query. Techniques include:

- **Synonym expansion:** Augmenting "car insurance" with "automobile insurance" and "vehicle coverage" using a synonym dictionary or thesaurus
- **Pseudo-relevance feedback:** Running the initial query, extracting frequent terms from the top results, and re-running the query with those terms added
- **LLM-based reformulation:** Using a language model to generate alternative phrasings of the query, then running all variations and merging results

Query expansion narrows the gap between full-text and vector search by addressing vocabulary mismatch at the query level rather than the index level. However, it increases query latency (multiple queries per search) and can introduce noise if expanded terms are imprecise.

### Evaluation Metrics for Comparing Search Methods

Objectively comparing full-text and vector search requires standardized evaluation metrics:

- **Recall@k:** The fraction of relevant documents that appear in the top-k results. High recall means the system finds most relevant documents. This is critical for RAG, where missing a relevant document means the LLM lacks context.
- **Precision@k:** The fraction of top-k results that are actually relevant. High precision means fewer irrelevant results clutter the output.
- **NDCG (Normalized Discounted Cumulative Gain):** Measures ranking quality: not just whether relevant documents appear, but whether they appear near the top. NDCG penalizes relevant documents that rank lower more heavily.
- **MRR (Mean Reciprocal Rank):** The average of 1/rank for the first relevant result across a set of queries. Useful when users care most about the single best result.

When evaluating hybrid search against individual methods, measure all four metrics across a representative query set. Hybrid search typically improves recall@k significantly (by capturing both keyword and semantic matches) while maintaining or improving precision and NDCG.

## How Spice Combines Both

[Spice](/platform/hybrid-sql-search) provides full-text search, vector search, and hybrid search in a single SQL-native runtime, eliminating the need to deploy and synchronize separate search systems.

With Spice, you can:

- **Run BM25 and vector search in one query** using a single `search()` function with mode selection (`fts`, `vector`, or `hybrid`)
- **Combine search with SQL** to filter results by metadata, join with relational data, and express complex retrieval logic, all in standard SQL
- **Keep indexes fresh** with [real-time change data capture](/learn/change-data-capture) that updates both full-text and vector indexes as source data changes
- **Search across federated sources** using [SQL federation](/learn/sql-federation) to query data from [40+ connected sources](/integrations) without moving it into a separate search system
- **Generate embeddings in the same runtime** using built-in [LLM inference](/learn/llm-inference), so embedding generation and search happen without external API calls

This unified approach is particularly valuable for [application search](/use-case/application-search) and RAG use cases where teams would otherwise need to maintain a vector database, a search engine, and an application layer to combine their results. Spice handles all three in a single system, reducing infrastructure complexity while delivering hybrid search quality.

```sql
-- Full-text, vector, and hybrid search in one runtime
SELECT * FROM search('docs', 'connection timeout error', mode => 'fts', limit => 10);
SELECT * FROM search('docs', 'connection timeout error', mode => 'vector', limit => 10);
SELECT * FROM search('docs', 'connection timeout error', mode => 'hybrid', limit => 10);
```

<ContentRichText
  fields={{
    coverage: 'rc-end',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<AccordionFaq
  fields={{
    heading: 'Full-Text Search vs Vector Search FAQ',
    paragraph: '',
    items: [
      {
        title: 'Is vector search always better than full-text search?',
        paragraph:
          '<p>No. Vector search excels at handling vocabulary mismatch and understanding query intent, but full-text search is more precise for exact identifiers, error codes, product names, and domain-specific terminology. Neither method is universally superior; the best choice depends on your query patterns and data characteristics.</p>',
      },
      {
        title:
          'What is the main advantage of hybrid search over using one method alone?',
        paragraph:
          '<p>Hybrid search captures both exact keyword matches and semantic similarity in a single query. This means it handles mixed queries (like "ERR-4502 connection timeout" where part needs exact matching and part benefits from semantic understanding) without requiring the application to decide which search method to use per query.</p>',
      },
      {
        title: 'Does vector search require a GPU?',
        paragraph:
          '<p>Generating embeddings (at index time and query time) benefits from GPU acceleration, especially for large batches. However, the vector search itself (the ANN index lookup) runs on CPU and is fast without a GPU. Many production systems generate embeddings via API calls to hosted models and run vector search on CPU-only infrastructure.</p>',
      },
      {
        title:
          'How much additional infrastructure does vector search require compared to full-text search?',
        paragraph:
          '<p>Vector search requires an embedding model (hosted or self-managed) to generate vectors, a vector index (HNSW or IVF) that uses more memory than an inverted index, and a pipeline to embed new documents as they arrive. In a unified runtime like Spice, these components are integrated, reducing the infrastructure overhead to a single system.</p>',
      },
      {
        title: 'Can I migrate from full-text search to hybrid search incrementally?',
        paragraph:
          '<p>Yes. A common migration path is to start with full-text search, add vector search alongside it, and use hybrid fusion to combine results. Because hybrid search runs both methods in parallel, you can deploy it without removing your existing full-text search infrastructure. Tune the fusion weights to control how much influence each method has on the final ranking.</p>',
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<ContentResourceFeatured
  fields={{
    heading: 'Learn more about search',
    paragraph:
      'Technical guides on building full-text, vector, and hybrid search in a single SQL-native runtime.',
    mode: 'default',
    resources: [
      {
        source: 'manual',
        resource: null,
        resource_manual: {
          eyebrow: 'Docs',
          title: {
            title: 'Search Docs',
            url: 'https://spiceai.org/docs/features/search',
            target: '_blank',
          },
          description:
            'Learn how Spice provides full-text, semantic, and hybrid search capabilities in a single SQL-native runtime.',
          image: {
            ID: 1661,
            id: 1661,
            title: 'Docs jpeg',
            filename: 'Docs-jpeg.jpeg',
            filesize: 103192,
            url: '/website-assets/media/2025/12/Docs-jpeg.jpeg',
            link: '/docs-jpeg/',
            alt: '',
            author: '9',
            description: '',
            caption: '',
            name: 'docs-jpeg',
            status: 'inherit',
            uploaded_to: 0,
            date: '2025-12-05 04:13:53',
            modified: '2025-12-05 04:13:53',
            menu_order: 0,
            mime_type: 'image/jpeg',
            type: 'image',
            subtype: 'jpeg',
            icon: '/website-assets/media/default.png',
            width: 1832,
            height: 1036,
            sizes: {
              thumbnail: '/website-assets/media/2025/12/Docs-jpeg-150x150.jpeg',
              'thumbnail-width': 150,
              'thumbnail-height': 150,
              medium: '/website-assets/media/2025/12/Docs-jpeg-300x170.jpeg',
              'medium-width': 300,
              'medium-height': 170,
              medium_large:
                '/website-assets/media/2025/12/Docs-jpeg-768x434.jpeg',
              'medium_large-width': 768,
              'medium_large-height': 434,
              large: '/website-assets/media/2025/12/Docs-jpeg-1024x579.jpeg',
              'large-width': 1024,
              'large-height': 579,
              '1536x1536':
                '/website-assets/media/2025/12/Docs-jpeg-1536x869.jpeg',
              '1536x1536-width': 1536,
              '1536x1536-height': 869,
              '2048x2048': '/website-assets/media/2025/12/Docs-jpeg.jpeg',
              '2048x2048-width': 1832,
              '2048x2048-height': 1036,
            },
          },
        },
      },
      {
        source: 'picker',
        resource: [
          {
            title: 'True Hybrid Search: Vector, Full-Text, and SQL in One Runtime',
            slug: '/blog/true-hybrid-search',
            excerpt:
              'Build hybrid search without managing multiple systems. Query vectors, run full-text search, and execute SQL in one unified runtime.',
            image:
              '/website-assets/media/2025/09/image-33.png',
            type: 'Blog',
            taxonomy: ['Spice AI'],
          },
        ],
        resource_manual: {
          eyebrow: '',
          title: null,
          description: '',
          image: false,
        },
      },
      {
        source: 'picker',
        resource: [
          {
            title: 'Real-Time Hybrid Search Using RRF: A Hands-On Guide with Spice',
            slug: '/blog/real-time-hybrid-search-using-rrf',
            excerpt:
              'Learn how to build hybrid search with Reciprocal Rank Fusion directly in SQL, combining text, vector, and time-based relevance in one query.',
            image:
              '/website-assets/media/2025/11/68fa4fdfded26b3b6472a172_image-8.png',
            type: 'Blog',
            taxonomy: ['Search', 'Spice AI'],
          },
        ],
        resource_manual: {
          eyebrow: '',
          title: null,
          description: '',
          image: false,
        },
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<TalkToAnEngineerCta />

---

## How to Connect AI Agents to Live Operational Data Without ETL
URL: https://spice.ai/learn/how-to-connect-ai-agents-to-live-operational-data-without-etl
Date: 2026-06-03T00:00:00
Description: Practical guide to connecting AI agents to live operational data using federation, acceleration, and policy controls instead of batch ETL pipelines.

<HeroCenteredText
  fields={{
    graphic_position: 'no-graphic',
    heading_tag: 'h1',
    heading: 'How to Connect AI Agents to Live Operational Data Without ETL',
    paragraph:
      'AI agents perform best with current operational context. This guide outlines an objective architecture for connecting agents to live data sources without relying on batch ETL pipelines.',
    cta: [
      {
        type: 'filled',
        cta: {
          title: 'See SQL federation and acceleration',
          url: '/platform/sql-federation-acceleration',
          target: '',
        },
      },
      {
        type: 'bordered',
        cta: {
          title: 'Read federation docs',
          url: 'https://spiceai.org/docs/features/query-federation',
          target: '_blank',
        },
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<ContentRichText
  fields={{
    coverage: 'rc-start',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

Many enterprise teams are trying to give AI agents access to operational systems such as ticketing tools, order platforms, user databases, and internal APIs. The common first approach is to route everything through existing ETL pipelines and a central warehouse. That can work for batch analytics, but it is often a poor fit for agent workloads.

Agents need fresher data, lower read latency, and tighter access controls than many dashboard-style workloads. This guide explains how to connect agents to live operational data without relying on batch ETL as the primary path.

## Why Batch ETL Becomes a Bottleneck for Agent Workloads

### ETL introduces staleness windows

By design, ETL runs on a schedule. If your pipeline updates every hour, agent responses can be up to an hour behind operational reality.

### Agent query patterns are dynamic

BI dashboards run known query templates. Agents generate context-dependent tool calls, often with different filters and joins each time.

### Latency compounds across tool calls

One response may trigger several reads. A few slow calls can push end-to-end response time beyond acceptable user-facing thresholds.

### Governance scope changes

Agents carry credentials and can act autonomously. Data access design needs explicit policy boundaries and auditability for each agent path.

## Reference Architecture Without ETL-First Data Access

The most common production pattern has four parts.

### 1. Federated query layer

Use [SQL federation and acceleration](/platform/sql-federation-acceleration) to query across operational databases, APIs, and analytical systems through one interface. When expanding across heterogeneous backends, review patterns for [connecting AI agents to multiple databases](/learn/how-to-connect-ai-agents-to-multiple-databases). This avoids waiting for a central ingestion pipeline before data becomes usable.

### 2. Local acceleration for hot datasets

For high-frequency reads, materialize selected datasets in a local acceleration layer and refresh them continuously or on short intervals. This improves p95 latency and reduces repeated read load on source systems.

### 3. Change-driven refresh

Use [real-time change data capture](/feature/real-time-change-data-capture) or equivalent change streams to keep accelerated datasets synchronized. See the [real-time analytics guide for AI agents](/learn/real-time-analytics-guide-for-ai-agents) for architecture guidance. This gives a bounded freshness window instead of a large batch ETL delay.

### 4. Policy and identity controls

Map each agent to scoped credentials and enforce least-privilege rules in the retrieval layer. If agents are exposed through [MCP server gateway patterns](/feature/mcp-server-gateway), keep policy and audit controls aligned between the gateway and data layer.

```mermaid
flowchart LR
  subgraph R[AI Agent Runtime]
    direction TB
    A[AI Agent]
    G[Local Acceleration]
    A --> G
  end

  G --> C[Federated Query Layer]
  C --> D[(Operational DB)]
  C --> E[(Backend APIs)]
  C --> F[(Warehouse/Lake)]
```

## Step-by-Step Implementation Approach

### Step 1: Inventory source systems and freshness needs

List all systems agents need to query and classify each by required freshness. Some datasets need seconds-level updates, while others can tolerate minutes or hours.

### Step 2: Start with read-only federation

Connect sources and validate read paths first. Measure baseline latency and source query impact before introducing acceleration.

### Step 3: Add acceleration where it changes outcomes

Accelerate only datasets that are high-frequency, latency-sensitive, or expensive to query repeatedly from source systems.

### Step 4: Define freshness contracts

Document refresh intervals and expected lag per dataset. Agent prompts and downstream business logic should rely on explicit freshness contracts, not assumptions.

### Step 5: Harden governance and observability

Add role-based access controls, audit logs, query tracing, and per-agent usage metrics before broad rollout.

## Comparison: ETL-First vs Live Federation Paths

| Dimension | ETL-first access path | Live federation + acceleration path |
|---|---|---|
| Freshness | Batch-dependent | Near real-time with bounded lag |
| Time to first query | Slower (pipeline setup) | Faster (connect and query) |
| Latency for hot reads | Variable, often warehouse dependent | Lower with local acceleration |
| Source read pressure | Lower during serving | Controlled via pushdown and acceleration |
| Operational model | Pipeline-heavy | Query runtime + refresh controls |
| Best fit | Historical reporting | Interactive agent retrieval |

## Common Failure Modes and How to Avoid Them

### Treating all datasets the same

Not every table needs the same refresh or acceleration policy. Use workload-specific classes instead of one global setting.

### Missing source protection limits

Direct live querying can overload fragile systems if limits are not configured. Enforce concurrency controls and use acceleration for heavy paths.

### Split policy ownership

If gateway and data layer policies are managed separately without coordination, access drift appears over time. Keep policy mapping explicit and test it continuously.

### Measuring only average latency

p50 can look good while p95 and timeout rates fail user experience. Track tail latency and error distribution for each source and each agent.

## Advanced Topics

### Per-agent isolation models

Some teams deploy one shared runtime, while others deploy sidecar or microservice instances per agent or per team. Shared models improve utilization. Isolated models reduce blast radius and simplify credential scoping. The right choice depends on risk tolerance and operational capacity.

### Hybrid architecture with selective ETL

This guide focuses on non-ETL primary paths for agent retrieval, but ETL still has a role. Many teams keep ETL for long-horizon analytics and compliance while using live federation plus acceleration for operational agent workflows.

### Cost modeling beyond infrastructure line items

Include engineering labor, incident cost, and source-system impact when comparing architectures. Lower infrastructure cost can be offset by higher operational burden if policy and observability are weak.

## How Spice Fits This Pattern

[Spice](/platform/sql-federation-acceleration) combines federated SQL querying with local acceleration. Teams serve agents from current operational data without waiting for batch ETL cycles. It connects to sources across [integrations](/integrations), supports tuned refresh behavior, and can be deployed in sidecar or microservice patterns for scoped runtime boundaries.

For teams building agent retrieval paths, this approach provides live access where freshness matters. It retains selective ETL where historical materialization adds value. For commercial planning, see [Spice Cloud pricing](/pricing).

<ContentRichText
  fields={{
    coverage: 'rc-end',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<AccordionFaq
  fields={{
    heading: 'Connecting Agents to Live Data Without ETL FAQ',
    paragraph: '',
    items: [
      {
        title: 'How do we protect source systems from agent query load?',
        paragraph:
          '<p>Use predicate pushdown, concurrency limits, and local acceleration for hot datasets. Monitor source load continuously and move high-frequency paths to accelerated reads when needed.</p>',
      },
      {
        title: 'What metrics matter most during rollout?',
        paragraph:
          '<p>Track p95 latency, timeout rate, freshness lag, source error rate, and policy-denied requests. These metrics are more predictive of agent retrieval quality than average latency alone.</p>',
      },
      {
        title: 'Should each agent have its own data runtime?',
        paragraph:
          '<p>It depends on your reliability and security requirements. Per-agent runtimes improve isolation and blast-radius control. Shared runtimes can reduce cost and simplify management. Many teams use a mix by workload tier.</p>',
      },
      {
        title: 'What is the fastest proof-of-concept path?',
        paragraph:
          '<p>Start with one high-value workflow, connect required sources through federation, and measure baseline latency. Then add acceleration only where tail latency or source pressure indicates a bottleneck.</p>',
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<ContentResourceFeatured
  fields={{
    heading: 'Learn more about live agent data access',
    paragraph:
      'Documentation and technical resources on federation, acceleration, and operational patterns for AI agent retrieval.',
    mode: 'default',
    resources: [
      {
        source: 'manual',
        resource: null,
        resource_manual: {
          eyebrow: 'Docs',
          title: {
            title: 'Query Federation Docs',
            url: 'https://spiceai.org/docs/features/query-federation',
            target: '_blank',
          },
          description:
            'Learn how to federate queries across operational and analytical systems with a single SQL layer.',
          image: {
            ID: 1661,
            id: 1661,
            title: 'Docs jpeg',
            filename: 'Docs-jpeg.jpeg',
            filesize: 103192,
            url: '/website-assets/media/2025/12/Docs-jpeg.jpeg',
            link: '/docs-jpeg/',
            alt: '',
            author: '9',
            description: '',
            caption: '',
            name: 'docs-jpeg',
            status: 'inherit',
            uploaded_to: 0,
            date: '2025-12-05 04:13:53',
            modified: '2025-12-05 04:13:53',
            menu_order: 0,
            mime_type: 'image/jpeg',
            type: 'image',
            subtype: 'jpeg',
            icon: '/website-assets/media/default.png',
            width: 1832,
            height: 1036,
            sizes: {
              thumbnail: '/website-assets/media/2025/12/Docs-jpeg-150x150.jpeg',
              'thumbnail-width': 150,
              'thumbnail-height': 150,
              medium: '/website-assets/media/2025/12/Docs-jpeg-300x170.jpeg',
              'medium-width': 300,
              'medium-height': 170,
              medium_large:
                '/website-assets/media/2025/12/Docs-jpeg-768x434.jpeg',
              'medium_large-width': 768,
              'medium_large-height': 434,
              large: '/website-assets/media/2025/12/Docs-jpeg-1024x579.jpeg',
              'large-width': 1024,
              'large-height': 579,
              '1536x1536':
                '/website-assets/media/2025/12/Docs-jpeg-1536x869.jpeg',
              '1536x1536-width': 1536,
              '1536x1536-height': 869,
              '2048x2048': '/website-assets/media/2025/12/Docs-jpeg.jpeg',
              '2048x2048-width': 1832,
              '2048x2048-height': 1036,
            },
          },
        },
      },
      {
        source: 'picker',
        resource: [
          {
            title: 'Building an Enterprise SRE Agent with OpenClaw and Spice',
            slug: '/blog/openclaw-and-spice-governed-access-to-production-data-for-enterprise-agents',
            excerpt:
              'How to build an OpenClaw SRE with Spice for safe, unified, and observable access to production data, demonstrated with real-world incident workflows.',
            image:
              '/website-assets/media/2026/05/openclaw-blog-header.svg',
            type: 'Blog',
            taxonomy: ['Spice AI', 'Engineering'],
          },
        ],
        resource_manual: {
          eyebrow: '',
          title: null,
          description: '',
          image: false,
        },
      },
      {
        source: 'picker',
        resource: [
          {
            title: 'Getting Started with Spice.ai SQL Query Federation & Acceleration',
            slug: '/blog/spice-sql-query-federation-acceleration',
            excerpt:
              'Learn how to use Spice.ai to federate and accelerate queries across operational and analytical systems with zero ETL.',
            image:
              '/website-assets/media/2025/11/68ee96eb08a0dfcb609c1969_Version-7-1.png',
            type: 'Blog',
            taxonomy: ['Spice AI'],
          },
        ],
        resource_manual: {
          eyebrow: '',
          title: null,
          description: '',
          image: false,
        },
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<TalkToAnEngineerCta />

---

## How to Securely Connect AI Agents to Multiple Databases
URL: https://spice.ai/learn/how-to-connect-ai-agents-to-multiple-databases
Date: 2026-08-11T00:00:00
Description: Learn how to securely connect AI agents to multiple databases using SQL query federation, unified policy controls, local acceleration, and MCP gateways.

<HeroCenteredText
  fields={{
    graphic_position: 'no-graphic',
    heading_tag: 'h1',
    heading: 'How to Securely Connect AI Agents to Multiple Databases',
    paragraph:
      'AI agents need a unified way to query many systems. This guide explains how to connect agents to multiple databases with governance, performance, and reliability in mind.',
    cta: [
      {
        type: 'filled',
        cta: {
          title: 'See SQL federation and acceleration',
          url: '/platform/sql-federation-acceleration',
          target: '',
        },
      },
      {
        type: 'bordered',
        cta: {
          title: 'Read federation docs',
          url: 'https://spiceai.org/docs/features/query-federation',
          target: '_blank',
        },
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<ContentRichText
  fields={{
    coverage: 'rc-start',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

Connecting an AI agent to one database is simple. Connecting the same agent to many systems is harder. You need consistent query semantics, stable latency, and strict policy controls across every source.

Most teams start with direct per-database connectors inside agent code. That works for prototypes. It does not scale well for production. Every new source adds separate credentials, separate retry logic, and separate schema handling.

A better model is a unified retrieval layer in front of multiple sources. The agent talks to one interface. The retrieval layer handles federation, pushdown, policy, and observability. For the wider picture around this decision, see the guide to [AI agent data access](/learn/ai-agent-data-access).

## Why Multi-Database Agent Access Is Hard

**Source systems differ.** PostgreSQL, MySQL, Snowflake, and object storage have different dialect behavior, functions, and performance limits.

**Agent query patterns are dynamic.** Agents generate query shapes at runtime. A single workflow can call many datasets with changing filters.

**Governance must be consistent.** Security controls must apply evenly across all sources. Gaps often appear when each connector is managed independently.

**Latency compounds fast.** If one response triggers several database reads, tail latency rises quickly unless retrieval paths are tuned.

## Reference Architecture

The most common production architecture uses four layers.

1. **Unified SQL or tool interface:** Expose one query or tool surface to the agent. This keeps prompting and tool routing simple.
2. **Federated execution layer:** Use [SQL federation](/learn/sql-federation) to route each query segment to the right source with predicate pushdown.
3. **Acceleration for hot paths:** Use [data acceleration](/learn/data-acceleration) for high-frequency reads. Keep source load stable while improving p95 latency.
4. **Policy and audit controls:** Use scoped identities, field restrictions, and end-to-end tracing before broad rollout.

```mermaid
flowchart LR
  A[AI Agent] --> B[Unified Query Layer]
  B --> C[(PostgreSQL)]
  B --> D[(MySQL)]
  B --> E[(Snowflake)]
  B --> F[(Object Storage)]
  B --> G[(Accelerated Cache)]
```

## Step-by-Step Implementation

1. **Inventory databases and use cases:** List each source, required freshness, and expected query volume. Separate read-only retrieval from action workflows.
2. **Normalize schema access:** Create canonical dataset names and data contracts. Agents should not reason over raw source naming conventions.
3. **Connect sources through one retrieval layer:** Use a federation layer that supports your required [integrations](/integrations). Validate pushdown and error behavior per source.
4. **Add access policies early:** Define who can query what, by agent identity. Include table, column, and row filters where needed.
5. **Benchmark and add acceleration:** Measure p95 latency and source pressure. Accelerate only the datasets that are hot and repetitive.
6. **Add observability and rollback paths:** Track query failures, policy denials, and source saturation. Keep fallback behavior explicit.

## Query Design Guidelines for Agents

**Prefer stable semantic views.** Expose business-level views rather than raw operational tables. This reduces prompt complexity and join errors.

**Keep tool contracts narrow.** Small, clear tool contracts are easier for agents to use correctly than broad generic query tools.

**Enforce cost and safety limits.** Set query timeout, row limits, and concurrency limits to prevent accidental overload.

**Handle freshness explicitly.** Document which datasets are real-time and which are delayed. Agent instructions should reference those contracts.

## Securing Access Across Databases

Security controls are part of connection design, not a later add-on. Multi-database retrieval increases blast radius if identity and policy controls are weak.

**Use dedicated identities.** Give each agent its own identity and credentials. Shared service accounts reduce accountability and make incident containment harder.

**Enforce scoped access policies.** Apply table, column, and row filters by agent role. Use deny-by-default rules and explicit allowlists for data contracts.

**Constrain query behavior.** Set limits for execution time, row count, and concurrency. Guardrails reduce source pressure and lower misuse risk.

**Apply output controls.** Redact or filter sensitive fields before data is returned. Query-level authorization alone is not enough for safety.

**Monitor denials and drift.** Track policy denials, unusual query paths, and schema changes that can break safeguards.

## Common Failure Modes

**Direct connector sprawl.** Teams add one connector per need and lose consistency in policy and retry behavior.

**No source protection.** Without pushdown checks and limits, agent traffic can overwhelm transactional systems.

**Missing schema governance.** When schemas drift, agent prompts can become invalid or unsafe.

**Hidden cross-source joins.** Some workloads perform expensive joins across remote systems. These need explicit optimization.

## Advanced Topics

### Source-Aware Query Planning and Pushdown Optimization

Federated query engines analyze inbound SQL queries from AI agents and decompose them into sub-plans for target databases. Source-aware planning evaluates the cost of remote execution versus local processing. The query engine pushes filter predicates, column projections, and aggregation operations down to source databases whenever supported.

Pushdown optimization prevents pulling large unfiltered datasets over the network. For operational databases like PostgreSQL or MySQL, predicate pushdown reduces scanned rows, source CPU utilization, and network payload sizes. When joining data across dissimilar stores, the planner executes local joins in memory using high-performance columnar formats.

### Tiered Hybrid Execution: Live Federation vs. CDC Acceleration

Not every dataset requires live federated queries. Multi-database agent architectures implement a tiered execution model combining live federation with change data capture (CDC) acceleration.

Live federation queries remote systems directly for ad-hoc or low-frequency requests. For high-volume operational tables, background CDC workers tail transaction logs and materialize local columnar caches. The agent queries the local cache with sub-millisecond response times, protecting source databases from query bursts.

### Cross-Database Lineage, Audit Trails, and Policy Enforcement

Production agent platforms require end-to-end observability across all database touchpoints. Query gateways instrument every agent request with unique session identifiers, tracing execution from agent prompting down to individual table reads.

Policy engines evaluate query syntax against role-based access control rules before executing remote requests. If an agent attempts an unauthorized join across restricted schemas, the query gateway blocks execution and logs a policy denial event. Detailed audit logs record which data records contributed to each agent output.

## Connecting Multiple Databases with Spice

[Spice](/platform/sql-federation-acceleration) provides one query layer across operational and analytical systems. Teams can connect many sources, apply scoped policies, and tune acceleration where latency matters. The same runtime supports governed tool access for [MCP gateway workloads](/feature/mcp-server-gateway) and supports secure serving patterns for [AI agents](/use-case/secure-ai-agents).

For deployment planning, see [Spice Cloud pricing](/pricing/cloud).

<ContentRichText
  fields={{
    coverage: 'rc-end',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<AccordionFaq
  fields={{
    heading: 'Connecting AI Agents to Multiple Databases FAQ',
    heading_tag: 'h2',
    paragraph: '',
    items: [
      {
        title: 'Should an AI agent connect directly to each database?',
        paragraph:
          '<p>Direct connections can work for prototypes, but they increase complexity in production. A unified retrieval layer usually improves governance, observability, and reliability.</p>',
      },
      {
        title: 'How many databases can one agent query reliably?',
        paragraph:
          '<p>There is no fixed limit. Reliability depends on query design, source capacity, and policy controls. Most teams start with a small set of high-value sources and expand gradually.</p>',
      },
      {
        title: 'How do we keep source systems safe under agent traffic?',
        paragraph:
          '<p>Use predicate pushdown, query limits, and acceleration for hot paths. Monitor source latency and denial events, then tune policies before scaling traffic.</p>',
      },
      {
        title: 'Do we need ETL for multi-database agent retrieval?',
        paragraph:
          '<p>Not always. Federation can serve many use cases without full ETL. Teams often combine live federation with selective acceleration for performance and cost control.</p>',
      },
      {
        title: 'What should we measure first?',
        paragraph:
          '<p>Track p95 latency, query error rate, source load, and policy denials by agent identity. Those metrics usually reveal bottlenecks faster than average latency alone.</p>',
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<ContentResourceFeatured
  fields={{
    heading: 'Learn more about multi-database agent access',
    paragraph:
      'Docs and technical posts on federation, acceleration, and governed access for AI agent retrieval.',
    mode: 'default',
    resources: [
      {
        source: 'manual',
        resource: null,
        resource_manual: {
          eyebrow: 'Docs',
          title: {
            title: 'Query Federation Docs',
            url: 'https://spiceai.org/docs/features/query-federation',
            target: '_blank',
          },
          description:
            'Learn how to configure federated queries across data sources and tune pushdown behavior.',
          image: {
            ID: 1661,
            id: 1661,
            title: 'Docs jpeg',
            filename: 'Docs-jpeg.jpeg',
            filesize: 103192,
            url: '/website-assets/media/2025/12/Docs-jpeg.jpeg',
            link: '/docs-jpeg/',
            alt: '',
            author: '9',
            description: '',
            caption: '',
            name: 'docs-jpeg',
            status: 'inherit',
            uploaded_to: 0,
            date: '2025-12-05 04:13:53',
            modified: '2025-12-05 04:13:53',
            menu_order: 0,
            mime_type: 'image/jpeg',
            type: 'image',
            subtype: 'jpeg',
            icon: '/website-assets/media/default.png',
            width: 1832,
            height: 1036,
            sizes: {
              thumbnail: '/website-assets/media/2025/12/Docs-jpeg-150x150.jpeg',
              'thumbnail-width': 150,
              'thumbnail-height': 150,
              medium: '/website-assets/media/2025/12/Docs-jpeg-300x170.jpeg',
              'medium-width': 300,
              'medium-height': 170,
              medium_large:
                '/website-assets/media/2025/12/Docs-jpeg-768x434.jpeg',
              'medium_large-width': 768,
              'medium_large-height': 434,
              large: '/website-assets/media/2025/12/Docs-jpeg-1024x579.jpeg',
              'large-width': 1024,
              'large-height': 579,
              '1536x1536':
                '/website-assets/media/2025/12/Docs-jpeg-1536x869.jpeg',
              '1536x1536-width': 1536,
              '1536x1536-height': 869,
              '2048x2048': '/website-assets/media/2025/12/Docs-jpeg.jpeg',
              '2048x2048-width': 1832,
              '2048x2048-height': 1036,
            },
          },
        },
      },
      {
        source: 'picker',
        resource: [
          {
            title: 'Getting Started with Spice.ai SQL Query Federation & Acceleration',
            slug: '/blog/spice-sql-query-federation-acceleration',
            excerpt:
              'Learn how to federate and accelerate queries across operational and analytical systems with one runtime.',
            image:
              '/website-assets/media/2025/11/68ee96eb08a0dfcb609c1969_Version-7-1.png',
            type: 'Blog',
            taxonomy: ['Spice AI'],
          },
        ],
        resource_manual: {
          eyebrow: '',
          title: null,
          description: '',
          image: false,
        },
      },
      {
        source: 'picker',
        resource: [
          {
            title: 'Multi-Tenancy for AI Agents Without Pipelines',
            slug: '/blog/multi-tenancy-for-ai-agents-without-pipelines',
            excerpt:
              'How teams isolate AI agent workloads while keeping real-time access to production data systems.',
            image: '/website-assets/media/default.png',
            type: 'Blog',
            taxonomy: ['Spice AI', 'Engineering'],
          },
        ],
        resource_manual: {
          eyebrow: '',
          title: null,
          description: '',
          image: false,
        },
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<ContentCta
  fields={{
    override_global_setting: false,
    custom_content: { heading: '', paragraph: '', cta: null },
    padding_top: 'unset',
    padding_bottom: 'unset',
    gcta_heading: 'See Spice in action',
    gcta_paragraph:
      'Get a guided walkthrough of how development teams use Spice to query, accelerate, and integrate AI for mission-critical workloads.',
    gcta_cta: {
      title: 'Get a demo',
      url: 'https://meetings.hubspot.com/lukekim/talk-to-sales',
      target: '_blank',
    },
  }}
/>

---

## How to Give Each AI Agent Its Own Isolated Data Environment
URL: https://spice.ai/learn/how-to-give-each-ai-agent-its-own-isolated-data-environment
Date: 2026-06-04T00:00:00
Description: Practical architecture guide for isolating AI agent data environments using scoped credentials, runtime boundaries, and policy enforcement patterns.

<HeroCenteredText
  fields={{
    graphic_position: 'no-graphic',
    heading_tag: 'h1',
    heading: 'How to Give Each AI Agent Its Own Isolated Data Environment',
    paragraph:
      'Per-agent isolation reduces blast radius, simplifies governance, and makes production troubleshooting easier. This guide outlines concrete design patterns for isolated agent data environments.',
    cta: [
      {
        type: 'filled',
        cta: {
          title: 'See secure AI agent deployment patterns',
          url: '/use-case/secure-ai-agents',
          target: '',
        },
      },
      {
        type: 'bordered',
        cta: {
          title: 'Read runtime docs',
          url: 'https://spiceai.org/docs/',
          target: '_blank',
        },
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<ContentRichText
  fields={{
    coverage: 'rc-start',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

Many teams start agent development with a shared data runtime. It is fast to bootstrap, but risk grows quickly once multiple agents serve different teams, tools, and data domains. A broad credential or policy error can expose far more data than intended.

Per-agent isolation addresses that risk directly. Instead of one global retrieval surface, each agent gets its own constrained data boundary: specific identities, specific datasets, specific policy controls, and clear observability.

This guide explains how to design isolated data environments for AI agents without creating unsustainable operational overhead.

## Why Per-Agent Data Isolation Matters

### Blast radius reduction

If one agent fails, is misconfigured, or is prompt-injected, isolation limits impact to that agent's allowed boundary. Shared environments often turn one failure into a multi-domain incident.

### Better governance and auditability

Security teams can review one policy set per agent rather than reverse-engineering implicit shared behavior. Isolation creates clear ownership and cleaner audit trails.

### Predictable performance per workload

Agent workloads vary. A support copilot and a finance analysis agent should not compete blindly for the same runtime resources. Isolation allows right-sized compute, refresh cadence, and source concurrency.

### Easier incident response

When each agent has distinct identity and telemetry, investigators can answer quickly: which agent queried what, when, and under which policy decision.

## Isolation Boundary Model

Think in four boundaries that stack together.

### 1. Identity boundary

Each agent gets a unique service identity and credential scope. Avoid reusing database users, API tokens, or gateway keys across agents.

### 2. Data boundary

Each agent gets explicit access only to approved domains, tables, columns, and API endpoints. Include field-level controls for sensitive attributes.

### 3. Runtime boundary

Each agent runs in its own sidecar or dedicated service process when risk justifies it. This enables stricter quotas, throttles, and failure containment.

### 4. Network boundary

Use allowlisted routes and outbound egress controls so an agent can only reach approved data systems.

## Implementation Checklist for Isolated Agent Environments

### Step 1: Define agent contracts before access

Document each agent's business task, required data domains, and maximum allowed actions. Do this before connector setup. A written contract prevents scope drift.

### Step 2: Assign unique identity per agent

Map every agent to its own principal in your data access layer and in upstream systems where possible. If using [MCP server gateway patterns](/feature/mcp-server-gateway), issue one credential set per agent.

### Step 3: Build policy bundles by domain

Create reusable policy modules for common domains such as orders, support, or billing. Compose per-agent policies from these bundles rather than copying large policy files.

### Step 4: Apply scoped federation and acceleration

Use [SQL federation and acceleration](/platform/sql-federation-acceleration) to centralize query control while keeping source-level permissions strict. Accelerate only datasets required by that agent's latency target.

### Step 5: Enforce runtime quotas

Set per-agent limits for query concurrency, execution time, memory, and result size. Quotas are often more effective than broad rate limits in shared environments.

### Step 6: Instrument policy decisions

Log allow and deny decisions with policy reason codes. Include agent identity, source, table, operation type, and request trace ID.

## Deployment Patterns: Sidecar vs Shared Service

### Sidecar-per-agent

Best for strict isolation, low-latency co-location, and team-level ownership. This pattern aligns well with [sidecar architecture guidance](/learn/sidecar-pattern) when agents are embedded with application services.

Pros:

- Strong fault and credential isolation
- Local acceleration close to the app
- Independent release and rollback per agent

Cons:

- Higher runtime count
- More operational surface area

### Shared gateway with strict tenant boundaries

Best for environments with many low-traffic agents and centralized platform operations.

Pros:

- Lower infrastructure footprint
- Centralized policy updates
- Simpler connector lifecycle management

Cons:

- Larger blast radius if controls fail
- Requires careful multi-tenant guardrails

Most teams use a hybrid model: high-risk or high-volume agents get dedicated runtime boundaries, while lower-risk agents use a shared tier with strict policies.

## Data Modeling and Access Controls

### Prefer domain views over raw table access

Expose domain-specific views to agents instead of granting broad base-table access. Views let teams pre-join business context and hide sensitive fields.

### Use deny-by-default policies

Default deny reduces accidental exposure. Explicitly grant minimal read paths by agent identity.

### Add row-level and column-level constraints

For multi-tenant systems, enforce tenant filters and redact sensitive fields at query time. Avoid relying only on prompt instructions for privacy boundaries.

### Track schema drift risk

A new column can silently widen exposure if policies are not schema-aware. Include schema-change checks in CI for policy bundles.

## Operational Guardrails

### Concurrency and backpressure

Use agent-level concurrency limits and queue depth thresholds. Under load, return controlled fallback responses instead of allowing unbounded source pressure.

### Freshness contracts

Some agents require near real-time data; others can tolerate minutes. Define freshness per dataset and per agent. Use [real-time change data capture](/feature/real-time-change-data-capture) for domains that need tight lag.

### Observability baseline

Track these metrics by agent:

- p95 and p99 query latency
- policy-denied request rate
- source timeout and retry rate
- acceleration hit ratio
- freshness lag

### Runbooks and game days

Simulate policy misconfiguration, source outages, and prompt-injection attempts. Isolation only works if operations teams can detect and respond quickly.

## Advanced Topics

### Isolation by trust tier

A practical pattern is to classify agents into tiers such as trusted-internal, customer-facing, and privileged-ops. Higher-risk tiers get stronger runtime and network isolation plus stricter policy review.

### Ephemeral environments for temporary agents

Short-lived campaign or experiment agents should get temporary data environments with automatic expiry. Ephemeral credentials reduce long-tail risk from abandoned integrations.

### Cross-agent collaboration without policy bypass

If one agent needs outputs from another, pass structured results through a controlled API boundary rather than granting direct access to both domains. This preserves least-privilege controls.

## How Spice Supports Per-Agent Isolation

Spice.ai gives each agent a [sandboxed, scoped data stack](/feature/secure-ai-sandboxing) with its own governed view of backend systems, instead of broad, shared backend access. Teams can map agent identity to scoped datasets, policies, and runtime behavior through a single SQL interface across [any data source or service](/platform/sql-federation-acceleration). The same identity-to-scope mapping applies per tenant in [multi-tenant SaaS applications](/industry/saas), where each customer's agents see only that customer's data.

See it in practice: [OpenClaw and Spice: Governed Access to Production Data for Enterprise Agents](/blog/openclaw-and-spice-governed-access-to-production-data-for-enterprise-agents).

For commercial planning and environment sizing, see [Spice Cloud pricing](/pricing).

<ContentRichText
  fields={{
    coverage: 'rc-end',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<AccordionFaq
  fields={{
    heading: 'Per-Agent Data Isolation FAQ',
    paragraph: '',
    items: [
      {
        title: 'Does every AI agent need a dedicated runtime?',
        paragraph:
          '<p>Not always. Dedicated runtimes are most useful for high-risk or high-volume agents. Lower-risk workloads can run in shared infrastructure if identity, policy, and quota boundaries are enforced rigorously.</p>',
      },
      {
        title: 'What is the minimum isolation model to start with?',
        paragraph:
          '<p>Start with unique identity per agent, deny-by-default policy, and per-agent observability. Then add dedicated runtime and network isolation where threat level or compliance scope requires stronger separation.</p>',
      },
      {
        title: 'How do we prevent policy drift across many agents?',
        paragraph:
          '<p>Use reusable policy bundles, version policies in source control, and run policy tests in CI. Avoid manual policy edits in production without review and rollback plans.</p>',
      },
      {
        title: 'How should we handle multi-tenant data access?',
        paragraph:
          '<p>Apply tenant filters and row-level constraints in the retrieval layer, not only in application code. Log tenant context in audits and verify that policy tests include cross-tenant denial cases.</p>',
      },
      {
        title: 'Which metrics indicate isolation is working?',
        paragraph:
          '<p>Watch policy-denied rates, cross-domain access attempts, per-agent latency, and source error rates. Stable performance with low unauthorized access attempts usually indicates controls are effective.</p>',
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<ContentResourceFeatured
  fields={{
    heading: 'Learn more about secure agent data environments',
    paragraph:
      'Technical resources for implementing policy-scoped retrieval, runtime isolation, and federated access patterns.',
    mode: 'default',
    resources: [
      {
        source: 'manual',
        resource: null,
        resource_manual: {
          eyebrow: 'Docs',
          title: {
            title: 'Spice Runtime Docs',
            url: 'https://spiceai.org/docs/',
            target: '_blank',
          },
          description:
            'Review runtime, connector, and deployment documentation for secure production agent environments.',
          image: {
            ID: 1661,
            id: 1661,
            title: 'Docs jpeg',
            filename: 'Docs-jpeg.jpeg',
            filesize: 103192,
            url: '/website-assets/media/2025/12/Docs-jpeg.jpeg',
            link: '/docs-jpeg/',
            alt: '',
            author: '9',
            description: '',
            caption: '',
            name: 'docs-jpeg',
            status: 'inherit',
            uploaded_to: 0,
            date: '2025-12-05 04:13:53',
            modified: '2025-12-05 04:13:53',
            menu_order: 0,
            mime_type: 'image/jpeg',
            type: 'image',
            subtype: 'jpeg',
            icon: '/website-assets/media/default.png',
            width: 1832,
            height: 1036,
            sizes: {
              thumbnail: '/website-assets/media/2025/12/Docs-jpeg-150x150.jpeg',
              'thumbnail-width': 150,
              'thumbnail-height': 150,
              medium: '/website-assets/media/2025/12/Docs-jpeg-300x170.jpeg',
              'medium-width': 300,
              'medium-height': 170,
              medium_large:
                '/website-assets/media/2025/12/Docs-jpeg-768x434.jpeg',
              'medium_large-width': 768,
              'medium_large-height': 434,
              large: '/website-assets/media/2025/12/Docs-jpeg-1024x579.jpeg',
              'large-width': 1024,
              'large-height': 579,
              '1536x1536':
                '/website-assets/media/2025/12/Docs-jpeg-1536x869.jpeg',
              '1536x1536-width': 1536,
              '1536x1536-height': 869,
              '2048x2048': '/website-assets/media/2025/12/Docs-jpeg.jpeg',
              '2048x2048-width': 1832,
              '2048x2048-height': 1036,
            },
          },
        },
      },
      {
        source: 'picker',
        resource: [
          {
            title:
              'OpenClaw and Spice: Governed Access to Production Data for Enterprise Agents',
            slug: '/blog/openclaw-and-spice-governed-access-to-production-data-for-enterprise-agents',
            excerpt:
              'How OpenClaw and Spice provide governed data access patterns for enterprise AI agents in production.',
            image: '/website-assets/media/default.png',
            type: 'Blog',
            taxonomy: ['Spice AI', 'Engineering', 'Security'],
          },
        ],
        resource_manual: {
          eyebrow: '',
          title: null,
          description: '',
          image: false,
        },
      },
      {
        source: 'picker',
        resource: [
          {
            title: 'Multi-Tenancy for AI Agents without the Pipelines',
            slug: '/blog/multi-tenancy-for-ai-agents-without-pipelines',
            excerpt:
              'Learn how to serve multi-tenant AI agents from disparate enterprise data sources with tenant isolation, federated SQL, and no per-tenant pipelines.',
            image: '/website-assets/media/2026/02/zero-etl-blog-header.png',
            type: 'Blog',
            taxonomy: ['Spice AI', 'Data Federation', 'Engineering'],
          },
        ],
        resource_manual: {
          eyebrow: '',
          title: null,
          description: '',
          image: false,
        },
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<TalkToAnEngineerCta />

---

## How to Reduce Data Lakehouse Costs for Agentic Workloads
URL: https://spice.ai/learn/how-to-reduce-data-lakehouse-costs-for-agentic-workloads
Date: 2026-06-04T00:00:00
Description: Practical framework for reducing data lakehouse costs in agentic workloads by separating serving paths, minimizing expensive query patterns, and optimizing retrieval architecture.

<HeroCenteredText
  fields={{
    graphic_position: 'no-graphic',
    heading_tag: 'h1',
    heading: 'How to Reduce Data Lakehouse Costs for Agentic Workloads',
    paragraph:
      'Agentic systems can generate frequent, bursty read traffic that drives data lakehouse spend quickly. This guide explains concrete patterns to lower cost while maintaining retrieval quality.',
    cta: [
      {
        type: 'filled',
        cta: {
          title: 'See SQL federation and acceleration',
          url: '/platform/sql-federation-acceleration',
          target: '',
        },
      },
      {
        type: 'bordered',
        cta: {
          title: 'Read federated query docs',
          url: 'https://spiceai.org/docs/features/query-federation',
          target: '_blank',
        },
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<ContentRichText
  fields={{
    coverage: 'rc-start',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

Modern data lakehouses are excellent for many analytical and data engineering workloads. Agentic workloads, however, often stress a different dimension: high-frequency, low-latency retrieval with unpredictable query shapes.

When those requests run directly on warehouse-heavy paths, costs can rise faster than expected. Teams usually see this as a platform billing issue, but the root cause is often architectural mismatch between analytical infrastructure and agent-serving access patterns.

This guide provides an objective framework for reducing data lakehouse costs in agentic systems without sacrificing freshness or retrieval quality.

## Why Agentic Workloads Drive Cost Quickly

### Bursty request volume

Agents can fan out multiple retrieval calls per user request. A modest increase in active users can multiply backend query volume significantly.

### Query shape variability

Static dashboards often reuse predictable SQL. Agents generate dynamic predicates, joins, and filters that reduce cache hit rates in default warehouse-serving paths.

### Over-provisioned always-on clusters

To avoid cold-start latency, teams keep larger clusters warm. For agent workloads, this can become expensive if peak and average demand differ widely.

### Mixed workload interference

Running both heavy ETL and low-latency agent retrieval on the same compute tier creates contention and inefficient autoscaling behavior.

## Cost Reduction Strategy: Separate Serving from Analytics

The biggest cost win usually comes from separating workload paths:

- Keep the lakehouse for transformations, training features, and long-horizon analytics
- Serve agent retrieval from a purpose-built low-latency access path
- Synchronize only required datasets at the freshness level each agent needs

This reduces dependence on DBU-heavy query execution for repetitive serving traffic.

## Step-by-Step Cost Optimization Framework

### Step 1: Baseline agent query economics

Track cost per 1,000 agent requests, p95 latency, and query fan-out. Without this baseline, optimization decisions are guesswork.

Key baseline fields:

- Requests per agent workflow
- Queries per request
- Compute consumption per query class
- Source egress and acceleration storage costs

### Step 2: Classify query classes

Partition queries into three classes:

- Hot repetitive reads
- Warm operational joins
- Cold analytical lookups

Each class should use a different serving strategy rather than one global path.

### Step 3: Offload hot reads from expensive compute

For high-frequency repetitive reads, use local acceleration and shorter refresh intervals. This pattern is often cheaper than repeatedly querying warehouse compute.

See [data acceleration patterns](/learn/data-acceleration) and [real-time CDC approaches](/feature/real-time-change-data-capture) for implementation details.

### Step 4: Use federation for selective access

Instead of replicating everything, federate only the domains required for agent workflows. [SQL federation and acceleration](/platform/sql-federation-acceleration) can reduce unnecessary data movement and keep serving paths lean.

### Step 5: Right-size lakehouse usage by workload type

Keep the lakehouse focused on workloads where it is strongest:

- Batch transformations
- Complex analytics
- Model and feature pipelines

Avoid routing routine low-latency serving reads through the same expensive path.

### Step 6: Apply governance to prevent cost regression

Add query guardrails for timeout, scan size, and concurrency. Cost regressions often come from a few unconstrained query patterns.

## Practical Levers That Usually Work

### Reduce query fan-out in agent tools

Consolidate retrieval calls where possible. One well-designed query is often cheaper than multiple narrow queries with overlapping filters.

### Cache high-value dimensions close to the runtime

Frequently accessed dimension tables, policy metadata, and catalog mappings are prime acceleration candidates.

### Use freshness tiers

Not all data needs sub-minute updates. Define freshness tiers by business impact and align refresh policies accordingly.

### Eliminate redundant transformations in serving paths

If transformations are repeated on every retrieval request, move them upstream or materialize results where practical.

### Improve schema and join discipline

Wide tables and uncontrolled joins increase both latency and compute spend. Restrict serving schemas to fields required by agent tasks.

## Cost Model Comparison

| Path | Typical spend driver | Latency profile | Best use |
|---|---|---|---|
| Lakehouse-only serving | Compute units per repetitive query | Medium to high variability | Analytics-heavy workflows |
| Federation-only serving | Source query load | Source-dependent | Fast time-to-value prototypes |
| Acceleration-first serving | Refresh and storage cost | Low and predictable | High-frequency agent retrieval |
| Hybrid serving | Mixed, tunable | Tunable by class | Production agent systems at scale |

## Operational Controls for Sustainable Savings

### Budget alerts by query class

Set budget thresholds by query class, not only by overall platform spend. This identifies which agent paths are causing regressions.

### SLO and cost together

Track both retrieval SLOs and cost KPIs. Cost-only optimization can degrade quality, while latency-only optimization can inflate spend.

### Ownership and review cadence

Assign clear owners for each agent workflow's retrieval path and review cost/performance weekly. Shared ownership usually leads to slow correction cycles.

## Advanced Topics

### Marginal Cost per Agent Capability

As agent systems expand, measure marginal cost for each added capability, not just total monthly spend. This helps decide whether a capability should use cached, federated, or analytical retrieval.

### Cost-Aware Tool Routing

Some teams implement runtime routing rules that choose retrieval paths based on cost and latency constraints. For example, hot-path requests use accelerated reads while analytical deep dives route to warehouse compute.

### Egress and Cross-Region Considerations

Data lakehouse cost discussions often focus on compute credits but ignore egress. For global agent systems, cross-region traffic can become a material line item and should be included in TCO comparisons.

## How Spice Supports Lower-Cost Agentic Retrieval

Spice helps reduce serving-path cost by combining federated access with local acceleration and refresh controls tuned to workload needs. Teams can query across [any data source](/platform/sql-federation-acceleration), keep the lakehouse for analytical workflows, and serve repetitive low-latency agent reads from a more cost-efficient path.

For planning rollout budgets and production sizing, review [Spice Cloud pricing](/pricing).

<ContentRichText
  fields={{
    coverage: 'rc-end',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<AccordionFaq
  fields={{
    heading: 'Data Lakehouse Cost Reduction for Agentic Workloads FAQ',
    paragraph: '',
    items: [
      {
        title: 'Should the data lakehouse be removed from agent architectures?',
        paragraph:
          '<p>Not usually. A lakehouse remains valuable for analytics, transformations, and feature pipelines. Cost reduction typically comes from separating low-latency serving reads from heavy analytical paths.</p>',
      },
      {
        title: 'What is the quickest way to lower serving-path cost?',
        paragraph:
          '<p>Identify repetitive hot reads and move them to an accelerated serving layer with bounded freshness. This often reduces expensive repeated warehouse queries quickly.</p>',
      },
      {
        title: 'How do we decide what stays in the lakehouse?',
        paragraph:
          '<p>Keep workloads in the lakehouse when they are transformation-heavy, analytical, or batch-oriented. Move repetitive, latency-sensitive retrieval traffic to a serving-optimized path.</p>',
      },
      {
        title: 'How should we measure optimization success?',
        paragraph:
          '<p>Measure cost per 1,000 agent requests, p95 retrieval latency, freshness lag, and error rate by query class. Improvements should reduce cost without violating retrieval quality targets.</p>',
      },
      {
        title: 'Can federation increase source costs elsewhere?',
        paragraph:
          '<p>Yes, if query controls are weak. Use predicate pushdown, query limits, and selective acceleration so source systems are protected while overall serving cost remains lower.</p>',
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<ContentResourceFeatured
  fields={{
    heading: 'Learn more about cost-efficient agent data architectures',
    paragraph:
      'Documentation and technical resources on federation, acceleration, and workload-specific optimization for AI agent retrieval.',
    mode: 'default',
    resources: [
      {
        source: 'manual',
        resource: null,
        resource_manual: {
          eyebrow: 'Docs',
          title: {
            title: 'Query Federation Docs',
            url: 'https://spiceai.org/docs/features/query-federation',
            target: '_blank',
          },
          description:
            'Learn how to federate and optimize query paths across operational and analytical systems.',
          image: {
            ID: 1661,
            id: 1661,
            title: 'Docs jpeg',
            filename: 'Docs-jpeg.jpeg',
            filesize: 103192,
            url: '/website-assets/media/2025/12/Docs-jpeg.jpeg',
            link: '/docs-jpeg/',
            alt: '',
            author: '9',
            description: '',
            caption: '',
            name: 'docs-jpeg',
            status: 'inherit',
            uploaded_to: 0,
            date: '2025-12-05 04:13:53',
            modified: '2025-12-05 04:13:53',
            menu_order: 0,
            mime_type: 'image/jpeg',
            type: 'image',
            subtype: 'jpeg',
            icon: '/website-assets/media/default.png',
            width: 1832,
            height: 1036,
            sizes: {
              thumbnail: '/website-assets/media/2025/12/Docs-jpeg-150x150.jpeg',
              'thumbnail-width': 150,
              'thumbnail-height': 150,
              medium: '/website-assets/media/2025/12/Docs-jpeg-300x170.jpeg',
              'medium-width': 300,
              'medium-height': 170,
              medium_large:
                '/website-assets/media/2025/12/Docs-jpeg-768x434.jpeg',
              'medium_large-width': 768,
              'medium_large-height': 434,
              large: '/website-assets/media/2025/12/Docs-jpeg-1024x579.jpeg',
              'large-width': 1024,
              'large-height': 579,
              '1536x1536':
                '/website-assets/media/2025/12/Docs-jpeg-1536x869.jpeg',
              '1536x1536-width': 1536,
              '1536x1536-height': 869,
              '2048x2048': '/website-assets/media/2025/12/Docs-jpeg.jpeg',
              '2048x2048-width': 1832,
              '2048x2048-height': 1036,
            },
          },
        },
      },
      {
        source: 'picker',
        resource: [
          {
            title: 'Getting Started with Spice.ai SQL Query Federation & Acceleration',
            slug: '/blog/spice-sql-query-federation-acceleration',
            excerpt:
              'Learn how to use Spice.ai to federate and accelerate queries across operational and analytical systems with zero ETL.',
            image:
              '/website-assets/media/2025/11/68ee96eb08a0dfcb609c1969_Version-7-1.png',
            type: 'Blog',
            taxonomy: ['Spice AI'],
          },
        ],
        resource_manual: {
          eyebrow: '',
          title: null,
          description: '',
          image: false,
        },
      },
      {
        source: 'picker',
        resource: [
          {
            title: 'Databricks Partnership',
            slug: '/blog/databricks-partnership',
            excerpt:
              'How Spice integrates with Databricks across lakehouse and operational serving architectures.',
            image:
              '/website-assets/media/default.png',
            type: 'Blog',
            taxonomy: ['Spice AI', 'Partnership'],
          },
        ],
        resource_manual: {
          eyebrow: '',
          title: null,
          description: '',
          image: false,
        },
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<TalkToAnEngineerCta />

---

## How to Sandbox Data Access for AI Agents
URL: https://spice.ai/learn/how-to-sandbox-data-access-for-ai-agents
Date: 2026-06-04T00:00:00
Description: Step-by-step guide to sandboxing AI agent data access with least-privilege policies, query guardrails, redaction, and runtime controls for production safety.

<HeroCenteredText
  fields={{
    graphic_position: 'no-graphic',
    heading_tag: 'h1',
    heading: 'How to Sandbox Data Access for AI Agents',
    paragraph:
      'AI agents need access to real data, but unrestricted retrieval creates unnecessary risk. This guide explains how to sandbox data access while preserving useful agent capabilities.',
    cta: [
      {
        type: 'filled',
        cta: {
          title: 'Explore secure AI agent patterns',
          url: '/use-case/secure-ai-agents',
          target: '',
        },
      },
      {
        type: 'bordered',
        cta: {
          title: 'Read security docs',
          url: 'https://spiceai.org/docs/oss/security',
          target: '_blank',
        },
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<ContentRichText
  fields={{
    coverage: 'rc-start',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

Agent systems are most useful when they can retrieve live operational context. They are also most risky when that retrieval path is over-permissioned. A single prompt-injection attack, tool misuse, or broad credential can expose sensitive data quickly.

Sandboxing is how teams keep useful retrieval while limiting impact. In practice, sandboxing means giving each agent a constrained data environment with explicit boundaries for identity, reachable systems, query shape, and output content. It is the governance layer of [AI agent data access](/learn/ai-agent-data-access).

This guide outlines how to design and operate data access sandboxes for production AI agents.

## What Sandboxing Means for Agent Data Access

A data access sandbox is not one feature. It is a layered control model that includes:

- Identity scope: who the agent can act as
- Data scope: what domains, tables, fields, and records are visible
- Query scope: what operations and resource usage are allowed
- Output scope: what data can be returned to users or other systems
- Observability scope: what is logged and reviewed

No single layer is sufficient on its own. Production safety comes from combining controls.

## Core Sandbox Controls

### 1. Least-privilege identities

Issue dedicated identities per agent boundary. Avoid shared credentials across unrelated agents. If one identity is compromised, impact stays bounded.

### 2. Allowlisted data contracts

Expose only approved data contracts rather than broad schema access. Contracts can be views, curated API endpoints, or strongly typed tool responses.

### 3. Query guardrails

Set hard limits for query runtime, scanned rows, result size, and concurrency. Guardrails reduce abuse risk and prevent accidental expensive queries.

### 4. Row- and column-level policies

Use row-level filters for tenant and domain boundaries, and column-level restrictions for PII or regulated fields.

### 5. Output filtering and redaction

Apply output controls before returning data to end users. This can include masking, tokenization, and policy-aware response truncation.

### 6. Comprehensive audit logs

Log requested action, policy decision, query signature, source system, and returned field classes. Audits are critical for incident response and compliance.

## Step-by-Step Sandbox Implementation

### Step 1: Classify data and agent actions

Start with a matrix mapping data sensitivity levels to permitted agent actions. For example:

- Public reference data: broad read allowed
- Internal operational data: scoped read only
- Regulated data: masked or blocked unless explicit policy allows

### Step 2: Define agent capability profiles

Create capability profiles such as read-support-data, read-billing-summary, or trigger-approved-workflow. Associate each profile with explicit data contracts.

### Step 3: Route through a policy-aware gateway

Use a gateway model such as [MCP server gateway](/feature/mcp-server-gateway) so all agent tool calls pass through an authorization layer before query execution.

### Step 4: Enforce query constraints at execution time

Static policy is not enough. Enforce runtime constraints for timeout, memory, scanned data volume, and concurrent requests. This protects both sources and budgets.

### Step 5: Add redaction and response policies

Even allowed queries can contain sensitive fields. Apply output filters so responses match policy intent, not only query-level authorization.

### Step 6: Monitor and test continuously

Include policy regression tests, simulated prompt-injection attempts, and chaos tests for source failures. Sandboxes degrade over time without routine validation.

## Sandboxing Patterns by Maturity Stage

### Stage 1: Basic guardrails

- Dedicated agent identities
- Allowlisted schemas
- Timeout and result-size limits
- Central audit log

Useful for early production deployments, but limited against sophisticated misuse.

### Stage 2: Policy-rich sandboxing

- Row- and column-level controls
- Capability-based tool permissions
- Structured output filtering
- Per-agent alerting

This is where most enterprise teams should operate.

### Stage 3: High-assurance sandboxing

- Runtime isolation by trust tier
- Ephemeral credentials
- Context-aware anomaly detection
- Human approval for sensitive actions

Needed for regulated or high-impact agent operations.

## Common Failure Modes

### Policy defined only at the prompt layer

Prompt instructions are not enforcement. Policies must be enforced in the retrieval layer and gateway controls.

### Overbroad integration permissions

Connector setup often starts with admin-level credentials for convenience. Move to scoped credentials before launch.

### Missing denied-event telemetry

Many teams log successful queries but not denials. Denial trends are a key signal of probing, prompt abuse, or policy gaps.

### No separation between retrieval and actuation

Reading data and executing external actions should use separate capability sets. Combining both under one broad permission profile increases risk.

## Sandbox Controls and Performance

Security controls are often treated as latency overhead, but many controls can improve reliability and cost predictability:

- Query quotas reduce runaway resource usage
- Scoped acceleration improves tail latency for approved datasets
- Capability routing simplifies debugging and retry strategy

When implemented correctly, sandboxing improves both safety and operational quality.

## Advanced Topics

### Dynamic risk scoring for policy decisions

Some teams apply adaptive policies that tighten controls when risk signals rise, such as unusual access sequences, repeated denials, or cross-domain query attempts.

### Multi-tenant sandbox enforcement

For SaaS agent platforms, tenant context must propagate through identity, policy checks, query execution, and output filters. Missing tenant context at any layer can cause cross-tenant leakage.

### Recovery design after sandbox violations

Plan for controlled degradation. If a sandbox violation is detected, switch to reduced-capability mode rather than full outage. This keeps critical workflows alive while reducing risk.

## How Spice Supports Agent Data Sandboxing

[Spice](/platform/sql-federation-acceleration) gives teams a practical [sandbox enforcement point](/feature/secure-ai-sandboxing) between agents and production systems. Rather than wiring agents to each backend directly, teams can enforce query limits, policy checks, and governed routing through one SQL or MCP surface across [any data source](/integrations).

Aligned with [OpenClaw and Spice: Governed Access to Production Data for Enterprise Agents](/blog/openclaw-and-spice-governed-access-to-production-data-for-enterprise-agents), this approach combines governed access with observability: agent queries are constrained, reviewable, and auditable while still supporting real-time incident and workflow retrieval.

For deployment and cost planning across environments, see [Spice Cloud pricing](/pricing).

<ContentRichText
  fields={{
    coverage: 'rc-end',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<AccordionFaq
  fields={{
    heading: 'AI Agent Data Sandboxing FAQ',
    paragraph: '',
    items: [
      {
        title: 'What is the first sandbox control to implement?',
        paragraph:
          '<p>Start with dedicated per-agent identities and deny-by-default data policies. This immediately reduces lateral exposure and provides clearer audit trails.</p>',
      },
      {
        title: 'Can prompt instructions replace policy controls?',
        paragraph:
          '<p>No. Prompt instructions are guidance, not enforcement. Policy checks must run in the gateway and data access layer at execution time.</p>',
      },
      {
        title: 'How do we sandbox without hurting latency too much?',
        paragraph:
          '<p>Use targeted controls such as bounded query limits, scoped acceleration, and capability routing. These controls often improve consistency and reduce expensive retries.</p>',
      },
      {
        title: 'How should we handle sensitive fields in responses?',
        paragraph:
          '<p>Apply output redaction policies after query execution and before response delivery. This protects against accidental exposure even when a query is otherwise authorized.</p>',
      },
      {
        title: 'What should we monitor to detect sandbox drift?',
        paragraph:
          '<p>Track policy-denied requests, unusual cross-domain attempts, schema changes affecting access rules, and response redaction events by agent identity.</p>',
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<ContentResourceFeatured
  fields={{
    heading: 'Learn more about secure sandboxed access',
    paragraph:
      'Technical resources for implementing policy-aware gateways, guarded query paths, and secure agent retrieval patterns.',
    mode: 'default',
    resources: [
      {
        source: 'manual',
        resource: null,
        resource_manual: {
          eyebrow: 'Docs',
          title: {
            title: 'Security and Governance Docs',
            url: 'https://spiceai.org/docs/oss/security',
            target: '_blank',
          },
          description:
            'Review authentication, authorization, and secure deployment guidance for production data access layers.',
          image: {
            ID: 1661,
            id: 1661,
            title: 'Docs jpeg',
            filename: 'Docs-jpeg.jpeg',
            filesize: 103192,
            url: '/website-assets/media/2025/12/Docs-jpeg.jpeg',
            link: '/docs-jpeg/',
            alt: '',
            author: '9',
            description: '',
            caption: '',
            name: 'docs-jpeg',
            status: 'inherit',
            uploaded_to: 0,
            date: '2025-12-05 04:13:53',
            modified: '2025-12-05 04:13:53',
            menu_order: 0,
            mime_type: 'image/jpeg',
            type: 'image',
            subtype: 'jpeg',
            icon: '/website-assets/media/default.png',
            width: 1832,
            height: 1036,
            sizes: {
              thumbnail: '/website-assets/media/2025/12/Docs-jpeg-150x150.jpeg',
              'thumbnail-width': 150,
              'thumbnail-height': 150,
              medium: '/website-assets/media/2025/12/Docs-jpeg-300x170.jpeg',
              'medium-width': 300,
              'medium-height': 170,
              medium_large:
                '/website-assets/media/2025/12/Docs-jpeg-768x434.jpeg',
              'medium_large-width': 768,
              'medium_large-height': 434,
              large: '/website-assets/media/2025/12/Docs-jpeg-1024x579.jpeg',
              'large-width': 1024,
              'large-height': 579,
              '1536x1536':
                '/website-assets/media/2025/12/Docs-jpeg-1536x869.jpeg',
              '1536x1536-width': 1536,
              '1536x1536-height': 869,
              '2048x2048': '/website-assets/media/2025/12/Docs-jpeg.jpeg',
              '2048x2048-width': 1832,
              '2048x2048-height': 1036,
            },
          },
        },
      },
      {
        source: 'picker',
        resource: [
          {
            title: 'OpenClaw and Spice: Governed Access to Production Data for Enterprise Agents',
            slug: '/blog/openclaw-and-spice-governed-access-to-production-data-for-enterprise-agents',
            excerpt:
              'How enterprise teams implement governed access controls and policy enforcement for AI agent production workloads.',
            image:
              '/website-assets/media/default.png',
            type: 'Blog',
            taxonomy: ['Spice AI', 'Engineering', 'Security'],
          },
        ],
        resource_manual: {
          eyebrow: '',
          title: null,
          description: '',
          image: false,
        },
      },
      {
        source: 'picker',
        resource: [
          {
            title: 'Multi-Tenancy for AI Agents Without Pipelines',
            slug: '/blog/multi-tenancy-for-ai-agents-without-pipelines',
            excerpt:
              'A practical guide to building multi-tenant agent data architectures with policy boundaries and low-latency retrieval.',
            image:
              '/website-assets/media/default.png',
            type: 'Blog',
            taxonomy: ['Spice AI', 'Engineering'],
          },
        ],
        resource_manual: {
          eyebrow: '',
          title: null,
          description: '',
          image: false,
        },
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<TalkToAnEngineerCta />

---

## How to Simplify Data and AI Application Architectures
URL: https://spice.ai/learn/how-to-simplify-data-and-ai-application-architectures
Date: 2026-08-26T00:00:00
Description: Learn how to collapse complex ETL pipelines, CDC buses, vector database sync, and caching layers into a unified data runtime for modern AI applications.

<HeroCenteredText
  fields={{
    graphic_position: 'no-graphic',
    heading_tag: 'h1',
    heading: 'How to Simplify Data and AI Application Architectures',
    paragraph:
      'Modern data and AI applications often rely on complex architectures filled with message queues, custom ETL pipelines, vector synchronization workers, and cache layers. Architecture simplification replaces these fragmented systems with a unified data runtime that queries sources in place, tails database change logs directly, and serves data with sub-millisecond local access.',
    cta: [
      {
        type: 'filled',
        cta: {
          title: 'Explore Spice platform',
          url: '/platform/sql-federation-acceleration',
          target: '',
        },
      },
      {
        type: 'bordered',
        cta: {
          title: 'Read the docs',
          url: 'https://spiceai.org/docs',
          target: '_blank',
        },
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<ContentRichText
  fields={{
    coverage: 'rc-start',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

Engineering teams building modern data products and AI applications frequently face architectural sprawl. To answer analytical queries or supply context to language models, teams construct multi-stage pipelines. A typical stack includes Change Data Capture (CDC) connectors, message brokers, stream processing workers, cloud data warehouses, vector databases, and key-value caches.

Each additional system introduces failure modes, schema migration overhead, operational burden, and extra network hops. Data freshness degrades from seconds to minutes or hours. Debugging across five distinct infrastructure services slows development.

Data and AI architecture simplification is the practice of consolidating disparate ingestion, storage, search, and serving components into a co-located data runtime. Instead of moving data across networks, a unified engine runs federated queries and materializes acceleration caches locally. It also generates embeddings within one process boundary. For criteria to evaluate such an engine, see [what to look for in a unified data and AI platform](/learn/unified-data-and-ai-platform).

## Why Modern Data and AI Stacks Become Complex

Architectural complexity usually develops incrementally. Teams add single-purpose tools to address individual requirements as applications evolve:

1. **Analytical queries over production data.** Teams start with a read replica. When ad-hoc queries degrade operational database performance, teams build CDC pipelines using Debezium, Kafka, and data warehouses.
2. **Context retrieval for AI agents.** Adding LLMs requires grounding models in operational data. Engineers build tool servers, credential brokers, embedding pipelines, and vector database synchronization jobs.
3. **Cross-system data access.** Joining data from PostgreSQL, Snowflake, and external APIs requires building ELT pipelines or managing staging schemas.
4. **Hybrid search capabilities.** Combining keyword search with vector search leads teams to deploy both Elasticsearch and a vector database. Application code must then merge two result sets.
5. **Low-latency serving.** Meeting sub-millisecond API SLAs forces teams to implement cache-aside logic with Redis, background invalidation workers, and pre-warm cron jobs.

Although each tool solves its immediate task, the resulting architecture creates system sprawl. Maintenance shifts from building product features to monitoring pipeline health, handling schema drift, and managing cache invalidation.

```mermaid
flowchart LR
    subgraph Traditional["Fragmented Architecture"]
        direction TB
        DB[("PostgreSQL")] -.-|WAL| CDC["Debezium + Kafka"]
        CDC -.-> WH[("Warehouse")]
        CDC -.-> EMB["Embedding Worker"]
        EMB -.-> VDB[("Vector DB")]
        WH --> DBT["dbt + Airflow"]
        DBT -.-> Redis[("Redis Cache")]
        Redis --> App["Application / Agent"]
        VDB --> App
    end
```

### The Cost of Multi-System Data Pipelines

Every system boundary in a data pipeline incurs tangible engineering costs:

- **Serialization overhead:** Translating data between JSON, CSV, protocol buffers, and database row formats consumes CPU cycles at every hop.
- **Data staleness:** Pipeline schedules and queue processing delays add minutes or hours of lag between source updates and application visibility.
- **Schema synchronization drift:** Changing a column type in an operational database requires updating schema definitions across ingestion workers, warehouse tables, and application interfaces.
- **Operational failure surface:** Outages in message brokers, consumer lag in streaming workers, or stale keys in cache clusters disrupt downstream application logic.

Simplifying the stack aims to eliminate intermediate movement without reducing system reliability and performance.

## Five Core Architecture Simplification Patterns

Replacing fragmented infrastructure components with a co-located data engine simplifies system design across five common application patterns.

### 1. Real-Time Analytics Replica

Serving analytical queries directly against production databases risks locking tables and depleting connection pools. The standard solution deploys CDC connectors, Kafka brokers, sink workers, cloud warehouse landing zones, and orchestration engines like Airflow.

```mermaid
flowchart LR
    subgraph Traditional["Traditional CDC Pipeline"]
        PG1[("PostgreSQL")] -.-|WAL| DBZ["Debezium"]
        DBZ -.-> KAFKA["Kafka"]
        KAFKA -.-> SINK["Flink / Sink"]
        SINK -.-> WH[("Warehouse")]
        WH --> BI1["Dashboards"]
    end
```

A unified data runtime replaces this multi-stage pipeline by tailing the database Write-Ahead Log (WAL) directly via logical replication. The runtime streams change records directly into a local acceleration engine.

```mermaid
flowchart LR
    subgraph Simplified["Unified Architecture"]
        PG2[("PostgreSQL")] -.-|"Logical Replication"| SPICE["Data Runtime"]
        SPICE --> BI2["Dashboards / APIs"]
    end
```

This pattern eliminates the CDC cluster, Kafka brokers, warehouse landing zone, and transformation schedulers. Analytical queries execute against the local accelerator instead of consuming production database resources, although snapshotting and CDC still impose replication overhead on the source.

**Real-world use case:** Financial risk scoring services query live transaction tables without degrading primary payment processing databases.

### 2. Agent Data Stack

Giving AI agents governed access to operational systems typically requires custom tool servers, credential managers, query guardrails, embedding workers, and vector databases.

```mermaid
flowchart LR
    subgraph Traditional["Hand-Written Agent Data Plane"]
        AGENT1["AI Agent"] --> TOOLS["Tool Server"]
        TOOLS --> AUTH["Credential Broker"]
        TOOLS --> GUARD["Query Guardrails"]
        GUARD --> SRC1[("Operational DBs")]
        SRC1 -.-> EMBWorker["Embedding Worker"]
        EMBWorker -.-> VEC1[("Vector DB")]
        TOOLS --> VEC1
    end
```

Co-locating a unified data runtime alongside the agent application simplifies this architecture. The runtime manages data connectors, policy guardrails, dataset acceleration, and embedding generation inside one process boundary. For multi-source retrieval, teams can [connect AI agents to multiple databases](/learn/how-to-connect-ai-agents-to-multiple-databases) and serve [real-time analytics for AI agents](/learn/real-time-analytics-guide-for-ai-agents). The agent communicates with the runtime over a standardized protocol such as the Model Context Protocol (MCP) or SQL.

```mermaid
flowchart LR
    subgraph Simplified["Co-Located Agent Runtime"]
        SRC2[("Systems of Record")] -.-|"CDC / Direct Refresh"| RUNTIME["Data Sidecar"]
        AGENT2["AI Agent"] -->|"MCP (Streamable HTTP)"| RUNTIME
    end
```

The agent gets one endpoint and one query interface. Data arrives on a defined refresh schedule, and agent queries read from local storage with low local-network latency.

**Real-world use case:** Enterprise support agents query live customer records, billing status, and documentation vectors through a single co-located interface.

### 3. Multi-Source Data Federation

When applications require data across databases, warehouses, and object stores, traditional architectures copy datasets into a central warehouse. Managed ETL connectors handle these sync jobs.

```mermaid
flowchart LR
    subgraph Traditional["Centralized Warehouse Pipeline"]
        S1[("PostgreSQL")] -.-> ETL["ETL Connectors"]
        S2[("Snowflake")] -.-> ETL
        S3[("S3 / Iceberg")] -.-> ETL
        ETL -.-> STAGE[("Staging Schemas")]
        STAGE --> WAREHOUSE[("Central Warehouse")]
        WAREHOUSE --> APPS1["App / BI"]
    end
```

Federated query engines eliminate mandatory data movement by querying sources in place. The query engine pushes projections and filter predicates down to source databases, combining intermediate results in memory.

```mermaid
flowchart LR
    subgraph Simplified["Federated Query Runtime"]
        P1[("PostgreSQL")] <--> FED["Federated Engine"]
        P2[("Snowflake")] <--> FED
        P3[("S3 / Iceberg")] <--> FED
        FED --> APPS2["App / BI"]
    end
```

Applications issue a single SQL statement joining tables across PostgreSQL, Snowflake, and S3. For tables requiring fast response times, developers apply local acceleration on a per-dataset basis rather than copying the entire database.

**Real-world use case:** E-commerce applications join real-time inventory in PostgreSQL with historical order analytics in Snowflake without running batch sync jobs.

### 4. Operational Hybrid Search

Combining full-text keyword matching with vector similarity search often requires running separate search clusters and writing custom fusion code inside the application.

```mermaid
flowchart LR
    subgraph Traditional["Dual Search Clusters"]
        TX[("PostgreSQL")] -.-|WAL| FEED["CDC Feed"]
        FEED -.-> EMB3["Embedding Service"]
        EMB3 -.-> VDB3[("Vector DB")]
        FEED -.-> ES3[("Full-Text Search")]
        APP3["Application"] -->|"Vector Query"| VDB3
        APP3 -->|"Keyword Query"| ES3
        APP3 --> RERANK["Application Merges + Reranks"]
    end
```

A unified runtime integrates keyword indexing, vector search, and embedding generation into the data engine. As data changes arrive via logical replication, the engine generates embeddings and updates text indexes automatically.

```mermaid
flowchart LR
    subgraph Simplified["Runtime Hybrid Search"]
        PG4[("PostgreSQL")] -.-|"Logical Replication"| RUNTIME4["Data Runtime"]
        APP4["Application"] -->|"Hybrid Search Query"| RUNTIME4
    end
```

The application issues one hybrid search query. The runtime executes vector similarity and BM25 full-text searches, combines result ranks using Reciprocal Rank Fusion (RRF), and returns a single sorted list.

**Real-world use case:** Technical documentation portals search exact product part numbers and semantic concepts in one query call.

### 5. Low-Latency Application Serving Tier

To achieve low read latency, application developers frequently construct cache-aside systems using Redis, TTL invalidation sweeps, write-through workers, and read replicas.

```mermaid
flowchart LR
    subgraph Traditional["Cache-Aside Architecture"]
        USER1["Users"] --> API1["API Service"]
        API1 --> REDIS1[("Redis Cache")]
        API1 --> RR1[("Read Replica")]
        PG5[("Production DB")] -.-|Replication| RR1
        PG5 -.-> INV1["Invalidation Worker"]
        INV1 -.-> REDIS1
    end
```

Co-locating an accelerated data runtime with the API service removes the need for cache-aside application logic. Freshness settings, retention windows, and cache invalidation policies are declared as dataset configuration.

```mermaid
flowchart LR
    subgraph Simplified["Co-Located Serving Tier"]
        USER2["Users"] --> API2["API Service"]
        API2 -->|"SQL over Localhost"| SIDECAR["Co-Located Data Engine"]
        PG6[("Production DB")] -.-|"Logical Replication"| SIDECAR
    end
```

The data engine tails changes from the source database and maintains the active working set in local memory or columnar files on disk. The API queries data locally over `localhost` without network calls to external cache clusters.

**Real-world use case:** High-concurrency user profile services read cached user permissions at sub-millisecond latency without managing Redis key expiry.

## Architectural Tradeoffs and Operational Risks of Consolidation

Consolidating data infrastructure reduces system boundaries. However, it introduces operational tradeoffs that teams must evaluate:

### Coupled Failure Domains and Blast Radius

In a fragmented architecture, an Elasticsearch cluster outage does not prevent PostgreSQL from serving transactional reads. Consolidating ingestion, federation, vector search, and local acceleration into a single runtime couples these capabilities.

If the runtime experiences a panic, memory exhaustion, or disk failure, all dependent application capabilities fail simultaneously. Operating a unified engine requires strict process isolation, robust health checks, and automatic restart policies.

### Resource Contention across Workloads

Running heterogeneous workloads inside one process boundary creates internal resource competition:

- **CPU allocation:** Heavy vector embedding calculations or large analytical aggregation queries can starve low-latency API read threads.
- **Memory pressure:** Caching large analytical tables in memory leaves less RAM available for vector indexes and query workspace allocations.
- **I/O bandwidth:** Disk-intensive columnar scans can saturate local SSD throughput, increasing latency for concurrent point lookups.

To mitigate resource contention, teams must configure explicit thread limits, memory caps, and process priority controls per dataset.

### Independent Scaling Constraints

Fragmented microservice architectures scale components independently based on demand. For example, teams can scale a vector database to 50 nodes and an analytical warehouse to 4 nodes.

A co-located sidecar runtime scales linearly with application pod replicas. When an application scales out to handle web traffic, every pod receives a full instance of the sidecar runtime. This increases total cluster resource utilization. For large-scale deployments, teams must evaluate whether sidecar co-location or a centralized cluster runtime offers better cost efficiency.

### Migration Effort and Team Ownership Boundaries

Replacing established data pipelines requires operational changes across engineering teams:

- **Organizational boundaries:** Data engineering teams managing Kafka and Snowflake pipelines must coordinate with platform teams operating application sidecars.
- **Legacy pipeline migration:** Existing dbt models, Airflow DAGs, and custom ETL scripts cannot always be replaced immediately.
- **Tooling compatibility:** Teams must verify that existing monitoring, alerting, and security scanners support co-located runtime binaries.

Adopting a simplified architecture works best as a phased transition rather than a sudden rewrite.

## Comparison: Fragmented Multi-System Stack vs. Unified Data Runtime

| Dimension | Traditional Multi-System Stack | Unified Data Runtime |
| --- | --- | --- |
| **Component Count** | Multiple independent infrastructure services | Single co-located or cluster runtime |
| **Data Freshness** | Batch ETL lag (minutes to hours) | Real-time WAL change streams (seconds) |
| **Query Latency** | Remote network round-trips | Local loopback access (in-memory or disk) |
| **Development Overhead** | High (maintaining sync jobs, schemas, and cache invalidation) | Low (declarative dataset configuration) |
| **Operational Failure Surface** | Large (pipeline brokers, sink workers, cache drift) | Small (single runtime process or sidecar) |
| **Resource Efficiency** | Low (data duplicated across landing, warehouse, and cache) | High (shared Arrow memory and local columnar storage) |
| **Failure Isolation** | Isolated per infrastructure component | Shared blast radius across co-located capabilities |
| **Scaling Granularity** | Independent per service tier | Scaled per application pod or runtime cluster |

## Implementation Strategy and Migration Framework

Adopting a unified data architecture requires a structured migration plan to minimize operational risk:

### Step 1: Identify High-Friction Data Paths

Audit existing infrastructure for pipeline failure points. Candidate workloads for initial simplification include:

- Cache-aside Redis tiers with frequent invalidation bugs.
- Custom sync scripts copying database tables into vector stores.
- Heavy analytical queries hitting primary production replicas.

### Step 2: Deploy Read-Only Sidecar Acceleration

Deploy the data runtime as a sidecar container alongside a single non-critical microservice. Configure read-only acceleration for a subset of required tables. Validate query performance, memory consumption, and CDC synchronization lag under production traffic.

### Step 3: Unify Search and Protocol Endpoints

Expand the sidecar configuration to handle vector search and MCP tool routing for AI agents. Consolidate keyword search and vector retrieval into single hybrid SQL queries, eliminating application-side merging logic.

### Step 4: Establish Resource Boundaries and Observability

Configure memory limits, query timeout guardrails, and CPU thread pools for the co-located runtime. Instrument metrics for query p95 latency, WAL replication lag, and memory pressure to monitor resource contention before rolling out sitewide.

## Advanced Topics

### Declarative Dataset Refresh Strategies

Simplifying data architecture requires replacing custom pipeline code with declarative dataset management. A unified data runtime supports three distinct refresh patterns for source systems:

- **Changes (Log-Based CDC):** Tail transaction logs using native logical replication protocol. The engine applies row inserts, updates, and deletes to the local acceleration table continuously. This pattern maintains sub-second freshness with minimal source database overhead.
- **Append:** Poll source tables for new records based on incrementing keys or timestamps (such as `created_at` or event IDs). The engine appends new rows to local storage without re-scanning historical data.
- **Full Refresh:** Periodically re-query the full source dataset and swap the local accelerated view atomically. This pattern works well for small dimensions, reference tables, or SaaS API endpoints without change tracking.

Choosing the appropriate refresh mode per dataset allows developers to balance data freshness against source system resource limits.

### Memory-Mapped Columnar Storage and Zero-Copy Passing

High-performance data runtimes rely on standardized columnar formats to eliminate serialization costs between application processes and local storage.

By standardizing on Apache Arrow for in-memory representations, a data runtime shares memory buffers directly with application code. When querying a co-located engine over Arrow Flight SQL or IPC, results stream in Arrow columnar format without row-by-row serialization. Shared memory buffers or IPC sockets eliminate JSON parsing overhead.

For larger datasets that exceed physical RAM limits, runtimes can use memory-mapped columnar disk files such as Vortex. The OS page cache loads and evicts pages on demand, which reduces memory pressure when scanning datasets larger than RAM.

### Unifying SQL and Protocol Interfaces for AI Agents

AI agents require diverse data interactions. They need SQL for analytics, vector search for text, and protocols for tools. A unified engine handles all three tasks:

```mermaid
flowchart TD
    subgraph Runtime["Unified Engine"]
        Engine["Core Query Engine (Apache DataFusion)"]
        Arrow["Arrow Memory / Local Columnar Storage"]
    end
    SQL["SQL Interface (Flight SQL / JDBC / HTTP)"] <--> Engine
    MCP["Model Context Protocol (MCP Server)"] <--> Engine
    OAI["OpenAI-Compatible API (Embeddings / Search)"] <--> Engine
    Engine <--> Arrow
```

Exposing MCP endpoints enables AI models to discover datasets, execute tools, and perform vector search through one gateway.

## Simplifying Data and AI Architectures with Spice

[Spice](/platform/sql-federation-acceleration) is an open-source, Rust-based data and AI runtime designed to simplify complex data architectures. Spice co-locates alongside applications or deploys as a dedicated cluster. It combines query federation, dataset acceleration, logical CDC, and AI interfaces into one binary.

Key capabilities for architecture simplification include:

- **Federated SQL Execution:** Query across PostgreSQL, Snowflake, Iceberg, S3, and SaaS APIs in one SQL dialect. Powered by Apache DataFusion. Explore all supported connectors on the [Spice integrations](/integrations) page.
- **In-Memory and Disk Acceleration:** Materialize datasets locally using Arrow, DuckDB, or SQLite, or compressed columnar files via the Cayenne engine powered by Vortex.
- **Native CDC and WAL Tailing:** Stream database changes directly into local acceleration tables using logical replication for PostgreSQL and binlog CDC for MySQL.
- **Integrated Hybrid Search:** Combine BM25 full-text search with vector similarity search using [hybrid SQL search](/platform/hybrid-sql-search) fused with Reciprocal Rank Fusion (RRF).
- **Built-in MCP Gateway:** Expose accelerated datasets and vector search to LLM agents through a native [MCP server gateway](/feature/mcp-server-gateway) for [RAG applications](/use-case/retrieval-augmented-generation).

By running Spice as a [sidecar pattern](/learn/sidecar-pattern) container or co-located process, development teams eliminate separate CDC connectors, message queues, vector databases, and cache-aside code. For more on replacing complex ingestion pipelines with direct acceleration, read about [zero-ETL architectures](/learn/zero-etl) and [caching vs data acceleration](/learn/caching-vs-data-acceleration).

<ContentRichText
  fields={{
    coverage: 'rc-end',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<AccordionFaq
  fields={{
    heading: 'Data and AI Architecture Simplification FAQ',
    heading_tag: 'h2',
    paragraph: '',
    items: [
      {
        title: 'What is data and AI architecture simplification?',
        paragraph:
          '<p>Data and AI architecture simplification is the practice of replacing fragmented data pipelines, message queues, vector databases, and cache clusters with a unified data runtime. The runtime co-locates alongside applications, federating queries across sources, tailing change logs directly, and serving accelerated data with sub-millisecond local access.</p>',
      },
      {
        title: 'How does a unified data runtime replace traditional ETL pipelines?',
        paragraph:
          '<p>A unified data runtime queries source systems in place using federated SQL pushdown and tails database Write-Ahead Logs (WAL) via logical replication. By materializing local acceleration tables directly from change streams, the runtime eliminates separate ingestion pipelines, staging schemas, and scheduling tools.</p>',
      },
      {
        title: 'What are the benefits of co-locating a data runtime as a sidecar?',
        paragraph:
          '<p>Co-locating a data runtime as a sidecar process or container lets applications query accelerated data over local loopback. This removes remote cache-cluster hops from the serving path and scales data access with application pod replicas.</p>',
      },
      {
        title: 'How does architecture simplification improve AI agent development?',
        paragraph:
          '<p>AI agents typically require separate tool servers, vector databases, guardrails, and embedding workers. A unified data runtime combines dataset acceleration, hybrid search, and protocol endpoints into one process. The agent accesses data and tools through a single Model Context Protocol (MCP) or SQL interface.</p>',
      },
      {
        title: 'Does simplifying architecture require moving all data into memory?',
        paragraph:
          '<p>No. A unified data runtime uses tiered acceleration strategies. Small, high-frequency tables sit in RAM using Apache Arrow. Larger historical datasets stream into memory-mapped columnar files on local disk. Queries for unaccelerated data push down directly to upstream source databases.</p>',
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<ContentResourceFeatured
  fields={{
    heading: 'Learn more about data and AI architecture',
    heading_tag: 'h2',
    paragraph:
      'Documentation and guides on simplifying data access and AI infrastructure with Spice.',
    mode: 'default',
    resources: [
      {
        source: 'manual',
        resource: null,
        resource_manual: {
          eyebrow: 'Docs',
          title: {
            title: 'Spice AI Documentation',
            url: 'https://spiceai.org/docs',
            target: '_blank',
          },
          description:
            'Explore getting started guides, architecture references, and deployment options for running Spice in production.',
          image: {
            ID: 1661,
            id: 1661,
            title: 'Docs jpeg',
            filename: 'Docs-jpeg.jpeg',
            filesize: 103192,
            url: '/website-assets/media/2025/12/Docs-jpeg.jpeg',
            link: '/docs-jpeg/',
            alt: '',
            author: '9',
            description: '',
            caption: '',
            name: 'docs-jpeg',
            status: 'inherit',
            uploaded_to: 0,
            date: '2025-12-05 04:13:53',
            modified: '2025-12-05 04:13:53',
            menu_order: 0,
            mime_type: 'image/jpeg',
            type: 'image',
            subtype: 'jpeg',
            icon: '/website-assets/media/default.png',
            width: 1832,
            height: 1036,
            sizes: {
              thumbnail: '/website-assets/media/2025/12/Docs-jpeg-150x150.jpeg',
              'thumbnail-width': 150,
              'thumbnail-height': 150,
              medium: '/website-assets/media/2025/12/Docs-jpeg-300x170.jpeg',
              'medium-width': 300,
              'medium-height': 170,
              medium_large:
                '/website-assets/media/2025/12/Docs-jpeg-768x434.jpeg',
              'medium_large-width': 768,
              'medium_large-height': 434,
              large: '/website-assets/media/2025/12/Docs-jpeg-1024x579.jpeg',
              'large-width': 1024,
              'large-height': 579,
              '1536x1536':
                '/website-assets/media/2025/12/Docs-jpeg-1536x869.jpeg',
              '1536x1536-width': 1536,
              '1536x1536-height': 869,
              '2048x2048': '/website-assets/media/2025/12/Docs-jpeg.jpeg',
              '2048x2048-width': 1832,
              '2048x2048-height': 1036,
            },
          },
        },
      },
      {
        source: 'picker',
        resource: [
          {
            title: 'A Developer\'s Guide to Understanding Spice AI',
            slug: '/blog/a-developers-guide-to-understanding-spice-ai',
            excerpt:
              'An explanation of how Spice deploys as a co-located data and AI runtime alongside applications.',
            image:
              '/website-assets/media/2025/11/ExternalLinkImage.png',
            type: 'Blog',
            taxonomy: ['Engineering'],
          },
        ],
        resource_manual: {
          eyebrow: '',
          title: null,
          description: '',
          image: false,
        },
      },
      {
        source: 'picker',
        resource: [
          {
            title:
              'Getting Started with Spice.ai SQL Query Federation & Acceleration',
            slug: '/blog/spice-sql-query-federation-acceleration',
            excerpt:
              'Learn how to use Spice to federate and accelerate queries across your infrastructure.',
            image:
              '/website-assets/media/2025/11/68ee96eb08a0dfcb609c1969_Version-7-1.png',
            type: 'Blog',
            taxonomy: ['Spice AI'],
          },
        ],
        resource_manual: {
          eyebrow: '',
          title: null,
          description: '',
          image: false,
        },
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<ContentCta
  fields={{
    override_global_setting: false,
    custom_content: { heading: '', paragraph: '', cta: null },
    padding_top: 'unset',
    padding_bottom: 'unset',
    gcta_heading: 'See Spice in action',
    gcta_paragraph:
      'Get a guided walkthrough of how development teams use Spice to query, accelerate, and integrate AI for mission-critical workloads.',
    gcta_cta: {
      title: 'Get a demo',
      url: 'https://meetings.hubspot.com/lukekim/talk-to-sales',
      target: '_blank',
    },
  }}
/>

---

## What is a Hybrid Data Architecture?
URL: https://spice.ai/learn/hybrid-data-architecture
Date: 2026-03-08T00:00:00
Description: A hybrid data architecture combines application sidecars for sub-millisecond reads with a centralized cluster for data ingestion, acceleration, and distributed compute. Learn how the sidecar-cluster pattern works and when to use it.

<HeroCenteredText
  fields={{
    graphic_position: 'no-graphic',
    heading_tag: 'h1',
    heading: 'What is a Hybrid Data Architecture?',
    paragraph:
      'A hybrid data architecture pairs lightweight application sidecars with a centralized cluster: sidecars handle the hot path with locally accelerated data, while the cluster manages data ingestion, refresh, and distributed compute. Think of it as a CDN for your data.',
    cta: [
      {
        type: 'filled',
        cta: {
          title: 'Explore the Spice platform',
          url: '/platform/sql-federation-acceleration',
          target: '',
        },
      },
      {
        type: 'bordered',
        cta: {
          title: 'Read the architecture docs',
          url: 'https://spiceai.org/docs/deployment/architectures/hybrid',
          target: '_blank',
        },
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<ContentRichText
  fields={{
    coverage: 'rc-start',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

Running a data layer as a sidecar alongside your application gives you the lowest possible read latency: queries travel over loopback, not the network. But a pure sidecar model breaks down when you need centralized data ingestion, distributed queries across large datasets, or coordination of [acceleration](/learn/data-acceleration) refreshes. Every sidecar must independently connect to upstream sources, manage its own refresh cycles, and handle ingestion overhead.

Running everything in a centralized cluster solves the coordination problem. A single cluster can ingest data once, manage refresh schedules, and serve distributed analytical queries. But now every read from an application pod must cross the network to the cluster, adding milliseconds of latency to every query, unacceptable for hot-path workloads.

A hybrid data architecture combines both patterns. Application [sidecars](/learn/sidecar-pattern) cache frequently accessed datasets locally for sub-millisecond reads. A centralized cluster handles the heavy work: data ingestion from upstream sources, [acceleration](/learn/data-acceleration) and refresh, distributed compute for large queries, and [hybrid search](/learn/hybrid-search) indexing. When a sidecar receives a query for data beyond its cached working set, it transparently delegates to the cluster. The application never needs to know which tier served the response.

This is the most common production topology for latency-sensitive, data-intensive applications. It separates the concerns of fast reads (sidecars) from data management (cluster) while keeping both accessible through a unified query interface.

## How Hybrid Data Architecture Works

The hybrid architecture is a two-tier model. The first tier consists of lightweight sidecars deployed as containers alongside application pods, typically in Kubernetes. The second tier is a centralized cluster that manages data pipelines, acceleration, and distributed query execution.

### The Two-Tier Model

**Sidecars** run as pod-level containers in Kubernetes, co-located with the application. Each sidecar maintains a subset of accelerated datasets in local memory or on local disk. Because the sidecar runs on the same node as the application (or even in the same pod), queries travel over loopback: the network hop is eliminated entirely. Sidecars start in seconds and scale horizontally with application pods.

Each sidecar is configured via a `spicepod.yaml` that declares which datasets to cache, which acceleration engines to use (Arrow for in-memory, DuckDB for on-disk), and which views, search indices, or AI models to load locally. The sidecar handles only caching and query serving; it does not run data ingestion or refresh pipelines.

**The cluster** is a centralized deployment (single node or distributed) that handles everything the sidecars do not: connecting to upstream [data sources](/integrations), running ingestion pipelines, managing acceleration refresh cycles (including [CDC-based refresh](/learn/change-data-capture)), executing distributed queries across large datasets, and maintaining search indices. The cluster is the authoritative data layer. It connects to data warehouses, transactional databases, object stores, and streaming platforms, then accelerates and serves that data to sidecars on demand.

### Query Routing and Transparent Delegation

When a query arrives at a sidecar, the sidecar checks whether the requested data is available in its local acceleration cache. If the data is cached locally, the query is served directly: sub-millisecond, zero network hops.

If the data is not in the sidecar's local cache (because the dataset isn't configured for local acceleration, or because the query requires data the sidecar doesn't hold), the sidecar transparently delegates the query to the cluster over Arrow Flight (gRPC). The cluster executes the query against its own accelerated datasets or federates it to the upstream source, then streams the results back to the sidecar. The application receives the response through the same interface, unaware of which tier served it.

This transparent delegation is what makes the pattern practical. Application code does not need conditional logic to decide where to route queries. The sidecar handles routing automatically based on its local cache state.

### Cache Management and Invalidation

Sidecars do not manage their own data ingestion. Instead, the cluster handles all ingestion and refresh, then sidecars either pull updated data from the cluster on a configured schedule or receive push-based updates.

When the cluster refreshes a dataset (whether via CDC from a PostgreSQL WAL, scheduled polling from an S3 bucket, or streaming ingestion from Kafka), the updated data becomes available to sidecars on their next refresh cycle. The sidecar's refresh interval determines the maximum staleness of its local cache relative to the cluster.

For datasets where even seconds of staleness are unacceptable, sidecars can be configured to delegate all queries for that dataset to the cluster, using local caching only for datasets with relaxed freshness requirements. This per-dataset configuration gives operators fine-grained control over the latency-vs-freshness tradeoff.

```mermaid
flowchart TB
    subgraph K8s["Kubernetes Cluster"]
        subgraph Pod1["Application Pod 1"]
            App1[Application] <-->|loopback| SC1[Sidecar]
        end
        subgraph Pod2["Application Pod 2"]
            App2[Application] <-->|loopback| SC2[Sidecar]
        end
        subgraph Pod3["Application Pod 3"]
            App3[Application] <-->|loopback| SC3[Sidecar]
        end
        subgraph ClusterTier["Centralized Cluster"]
            CL[Cluster Node]
        end
    end
    SC1 <-->|Arrow Flight gRPC| CL
    SC2 <-->|Arrow Flight gRPC| CL
    SC3 <-->|Arrow Flight gRPC| CL
    CL <-->|Connectors| PG[(PostgreSQL)]
    CL <-->|Connectors| S3[(S3 / Data Lake)]
    CL <-->|Connectors| DW[(Data Warehouse)]
```

## The CDN Analogy

The hybrid sidecar-cluster pattern mirrors how content delivery networks (CDNs) work. In a CDN, an origin server holds the canonical content. Edge nodes cache popular content close to end users. When a user requests content that the edge node has cached, it serves it immediately: low latency, no origin round-trip. When the edge node doesn't have the content, it fetches from the origin, caches it, and serves the response.

In the hybrid data architecture, the cluster is the origin server. It holds the full set of accelerated datasets, manages ingestion pipelines, and handles distributed queries. The sidecars are the edge nodes. They cache the hot working set (the datasets and rows that the co-located application queries most frequently) and serve them with sub-millisecond latency over loopback.

When a sidecar receives a query for data it doesn't have, it fetches from the cluster (the origin), just as a CDN edge fetches from the origin. The network cost of this delegation is higher than a local cache hit, but far lower than querying the upstream data source directly, because the cluster already has the data accelerated and ready to serve.

The analogy extends to scaling. CDNs add edge nodes without increasing load on the origin: each node serves cached content independently. Similarly, adding sidecars does not increase load on upstream data sources. The cluster absorbs ingestion, and sidecars serve reads from their local caches. Ten sidecars or a thousand sidecars place the same load on PostgreSQL, S3, or Databricks; only the cluster connects to those sources.

## Benefits of the Hybrid Pattern

### Sub-Millisecond Reads

Because sidecars run alongside the application (on loopback in Kubernetes), queries that hit the local cache avoid all network overhead. In-memory acceleration with Apache Arrow delivers sub-millisecond reads for cached datasets. This is critical for hot-path workloads: API serving, real-time dashboards, AI inference pipelines, and [retrieval-augmented generation](/learn/retrieval-augmented-generation) that need embedding lookups in single-digit milliseconds.

### Centralized Data Management

Data ingestion, acceleration refresh, and pipeline orchestration happen once in the cluster, not redundantly in every sidecar. This means upstream data sources see a single connection (from the cluster), not hundreds of connections from individual sidecars. It also simplifies operational management: refresh schedules, CDC pipelines, and schema evolution are configured and monitored in one place.

### Horizontal Scalability

Sidecars scale with application pods. When Kubernetes scales an application from 3 replicas to 30, each new pod gets its own sidecar that caches the configured datasets. The cluster's load does not increase proportionally because sidecars serve most reads from their local cache. Only cache misses and refresh cycles generate cluster traffic.

This scaling model is particularly valuable for multi-tenant SaaS applications and microservice architectures where dozens or hundreds of application instances need fast access to the same datasets.

### Resilience

Sidecars serve cached data even if the cluster is temporarily unavailable. If the network between a sidecar and the cluster goes down, the sidecar continues serving queries from its local cache. Queries that require delegation will fail, but cached workloads remain unaffected. When the cluster recovers, sidecars resume normal operation, fetching updates and delegating cache misses.

This resilience model is similar to how CDN edge nodes continue serving cached content during origin outages. The sidecar's local cache acts as a buffer against cluster-level disruptions.

## When to Use Hybrid Architecture

The hybrid pattern is not universally optimal. It adds architectural complexity: two tiers to deploy, configure, and monitor. The following scenarios justify that complexity.

### Real-Time + Analytical Workloads

Applications that need both sub-millisecond reads for real-time serving and distributed analytical queries across large datasets benefit from the two-tier split. Sidecars handle the real-time reads; the cluster handles the analytical workload. This separation prevents heavy analytical queries from competing with latency-sensitive application queries for the same resources.

For example, an [operational data lakehouse](/use-case/operational-data-lakehouse) that serves both live dashboards and batch reports can use sidecars for the dashboard queries and the cluster for the batch analytics, all through a unified SQL interface.

### Multi-Instance and Multi-Tenant Applications

When multiple application instances (microservices, API replicas, tenant-specific deployments) need fast access to the same datasets, the hybrid pattern avoids each instance independently connecting to and querying upstream sources. The cluster ingests once, and sidecars distribute the cached data across all instances.

A multi-tenant SaaS platform that runs isolated pods per tenant can deploy a sidecar in each tenant pod. Each sidecar caches the datasets relevant to that tenant, while the cluster manages the full dataset across all tenants. The tenant's queries are fast (local sidecar), and the platform's upstream sources see only the cluster's connections.

### Reducing Upstream Source Load

If the priority is reducing load on upstream data sources (a production PostgreSQL database, a rate-limited SaaS API, or a cost-per-query data warehouse), the hybrid pattern centralizes all source access in the cluster. Sidecars never connect to upstream sources directly. This is the same principle behind CDN origin shielding: the edge never reaches the origin except through a controlled, cacheable path.

### Edge Computing and Distributed Deployments

Applications running across multiple regions or at the edge benefit from the hybrid pattern when a central cluster can be deployed in a primary region and sidecars deployed alongside applications in satellite regions. Sidecars cache the working set locally, absorbing most read traffic without cross-region network hops. Delegation to the cluster handles the long tail of queries that miss the local cache.

### When Hybrid Architecture Is Not Ideal

**Simple single-instance applications** that don't need horizontal scaling gain little from the two-tier model. A single sidecar or embedded deployment is simpler and sufficient.

**Pure batch workloads** with relaxed latency requirements (seconds to minutes are acceptable) can run directly against the cluster or the upstream source without needing the sidecar tier.

**Unreliable networks between sidecars and cluster** undermine the delegation model. If the sidecar-to-cluster connection is intermittent, queries that miss the local cache will fail unpredictably. In these scenarios, deploying full, self-contained instances (each with its own ingestion) may be more reliable.

## Advanced Topics

### Cache Coherency Strategies

In a distributed caching architecture, coherency (ensuring all sidecars have a consistent view of the data) is a design decision, not a guarantee. The hybrid pattern offers several strategies depending on the application's tolerance for staleness.

**Pull-based refresh** is the simplest model. Each sidecar periodically pulls the latest data from the cluster on a configured interval (e.g., every 10 seconds). This introduces a staleness window equal to the refresh interval, but it is predictable and easy to reason about. Most production deployments use this model for datasets where seconds of staleness are acceptable.

**Push-based invalidation** reduces staleness by having the cluster notify sidecars when data changes. When the cluster completes a refresh cycle (e.g., a CDC update), it pushes an invalidation signal to all connected sidecars. Sidecars then pull the updated data immediately rather than waiting for the next scheduled refresh. This reduces worst-case staleness from the full refresh interval to the time it takes for the invalidation-plus-pull cycle.

**Delegate-on-write** avoids coherency issues entirely for specific datasets by never caching them in the sidecar. All queries for those datasets are delegated to the cluster, which always has the latest data. This sacrifices sidecar-level latency for guaranteed freshness, and is appropriate for datasets where even seconds of staleness are unacceptable.

In practice, production deployments use a mix of these strategies, configured per dataset based on freshness requirements. Hot, frequently read datasets with relaxed freshness use pull-based refresh. Datasets requiring near-real-time freshness use push-based invalidation. Datasets requiring absolute freshness use delegation.

### Multi-Region Deployments

The hybrid pattern extends naturally to multi-region architectures. A primary cluster runs in one region, handling ingestion, refresh, and serving as the authoritative data layer. Sidecars in other regions cache the working set locally, serving reads without cross-region latency.

For multi-region setups with stricter latency requirements, a secondary cluster can be deployed in each region, replicating data from the primary cluster. Sidecars in each region connect to their regional cluster rather than the primary, reducing delegation latency. This mirrors the CDN pattern of regional origin servers behind a global origin.

The key consideration in multi-region deployments is conflict resolution for writes. If applications in multiple regions write to the same datasets, the architecture must define how those writes are reconciled. The hybrid pattern is primarily a read-optimized architecture: writes flow through the application's transactional database, and the cluster ingests those changes via CDC or scheduled refresh.

### Sidecar Resource Budgeting

Each sidecar consumes CPU and memory on the application pod's node. In Kubernetes, this means setting resource requests and limits in the sidecar container spec that reflect the sidecar's working set.

The primary resource dimension is memory. A sidecar using Arrow in-memory acceleration requires enough RAM to hold all configured datasets. A sidecar accelerating 500 MB of datasets with Arrow needs approximately 500 MB of memory (plus overhead for query execution buffers). Sidecars using DuckDB for on-disk acceleration require less memory but need local disk space.

CPU requirements are typically modest: sidecars serve cached data using Arrow's zero-copy reads, which require minimal CPU. CPU spikes occur during refresh cycles (loading updated data from the cluster) and during complex queries that involve local computation (joins, aggregations).

A practical budgeting approach is to start with memory equal to 1.5x the total dataset size (to account for query buffers and refresh overhead), a CPU limit of 0.5-1 core, and monitor actual usage during load testing. The sidecar's `spicepod.yaml` controls exactly which datasets are cached, so operators can tune the working set to fit within the resource budget.

## Hybrid Data Architecture with Spice

[Spice](/platform/sql-federation-acceleration) implements the hybrid sidecar-cluster pattern as its most common production deployment topology. The Spice runtime runs as both a sidecar (lightweight, caching, pod-level) and a cluster node (full-featured, ingestion, distributed compute).

Sidecars are configured via `spicepod.yaml`, specifying which datasets to accelerate locally, which acceleration engine to use, and the cluster endpoint for delegation:

```yaml
# Sidecar spicepod.yaml
datasets:
  - from: spice.ai/cluster:orders
    name: orders
    acceleration:
      engine: arrow
      refresh_mode: full
      refresh_check_interval: 10s

  - from: spice.ai/cluster:products
    name: products
    acceleration:
      engine: duckdb
      refresh_check_interval: 60s
```

The cluster connects to upstream sources (PostgreSQL, S3, Databricks, and [40+ other connectors](/integrations)), handles ingestion and CDC-based refresh, and serves queries from sidecars that exceed the local cache. Communication between sidecars and the cluster uses Arrow Flight (gRPC) with mTLS encryption, ensuring data in transit is encrypted.

This architecture enables teams to build [data lake acceleration layers](/use-case/datalake-accelerator), maintain a CDC-fed [analytics replica of operational databases](/platform/analytics), power [AI agent workloads](/use-case/secure-ai-agents) with sub-millisecond data access, and run federated queries across heterogeneous sources, all through a single, Kubernetes-native deployment. The cluster can be self-managed or run on the Spice Cloud Platform for managed operations.

For a detailed deployment guide, see the [hybrid architecture documentation](https://spiceai.org/docs/deployment/architectures/hybrid).

<ContentRichText
  fields={{
    coverage: 'rc-end',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<AccordionFaq
  fields={{
    heading: 'Hybrid Data Architecture FAQ',
    paragraph: '',
    items: [
      {
        title: 'What is the difference between a sidecar and a cluster in a hybrid data architecture?',
        paragraph:
          '<p>A sidecar is a lightweight runtime that runs alongside an application pod, caching frequently accessed datasets locally for sub-millisecond reads. The cluster is a centralized deployment that handles data ingestion, acceleration refresh, distributed queries, and serves as the authoritative data layer. Sidecars delegate queries to the cluster when data is not available in the local cache.</p>',
      },
      {
        title: 'How does the CDN analogy apply to data architecture?',
        paragraph:
          '<p>In a CDN, edge nodes cache popular content close to users while the origin server holds the full content set. In a hybrid data architecture, sidecars act as edge nodes (caching hot data close to the application) while the cluster acts as the origin server, holding the complete accelerated dataset. Both patterns reduce latency by serving from the nearest cache and delegating to the origin only on cache misses.</p>',
      },
      {
        title: 'How do sidecars stay in sync with the cluster?',
        paragraph:
          '<p>Sidecars periodically pull updated data from the cluster on a configured refresh interval. The cluster manages all upstream data ingestion and refresh (including CDC-based refresh from transactional databases). Depending on the configuration, sidecars can also receive push-based invalidation signals or delegate all queries for freshness-critical datasets directly to the cluster.</p>',
      },
      {
        title: 'Does the hybrid pattern increase load on upstream data sources?',
        paragraph:
          '<p>No. The hybrid pattern reduces upstream source load because only the cluster connects to data sources; sidecars never connect to upstream systems directly. Whether you run 5 or 500 sidecars, the upstream source sees the same number of connections and queries from the single cluster.</p>',
      },
      {
        title: 'When should I use a single sidecar instead of the hybrid architecture?',
        paragraph:
          '<p>A single sidecar (without a cluster) is simpler and sufficient for single-instance applications with small datasets, where the sidecar can handle both ingestion and caching. The hybrid pattern is justified when you need centralized data management, horizontal scaling across many application instances, or separation of real-time reads from analytical workloads.</p>',
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<ContentResourceFeatured
  fields={{
    heading: 'Learn more about hybrid data architecture',
    paragraph:
      'Documentation and technical blog posts on deploying the sidecar-cluster pattern in production.',
    mode: 'default',
    resources: [
      {
        source: 'manual',
        resource: null,
        resource_manual: {
          eyebrow: 'Docs',
          title: {
            title: 'Hybrid Architecture Docs',
            url: 'https://spiceai.org/docs/deployment/architectures/hybrid',
            target: '_blank',
          },
          description:
            'Learn how to deploy Spice in a hybrid sidecar-cluster architecture for sub-millisecond reads with centralized data management.',
          image: {
            ID: 1661,
            id: 1661,
            title: 'Docs jpeg',
            filename: 'Docs-jpeg.jpeg',
            filesize: 103192,
            url: '/website-assets/media/2025/12/Docs-jpeg.jpeg',
            link: '/docs-jpeg/',
            alt: '',
            author: '9',
            description: '',
            caption: '',
            name: 'docs-jpeg',
            status: 'inherit',
            uploaded_to: 0,
            date: '2025-12-05 04:13:53',
            modified: '2025-12-05 04:13:53',
            menu_order: 0,
            mime_type: 'image/jpeg',
            type: 'image',
            subtype: 'jpeg',
            icon: '/website-assets/media/default.png',
            width: 1832,
            height: 1036,
            sizes: {
              thumbnail: '/website-assets/media/2025/12/Docs-jpeg-150x150.jpeg',
              'thumbnail-width': 150,
              'thumbnail-height': 150,
              medium: '/website-assets/media/2025/12/Docs-jpeg-300x170.jpeg',
              'medium-width': 300,
              'medium-height': 170,
              medium_large:
                '/website-assets/media/2025/12/Docs-jpeg-768x434.jpeg',
              'medium_large-width': 768,
              'medium_large-height': 434,
              large: '/website-assets/media/2025/12/Docs-jpeg-1024x579.jpeg',
              'large-width': 1024,
              'large-height': 579,
              '1536x1536':
                '/website-assets/media/2025/12/Docs-jpeg-1536x869.jpeg',
              '1536x1536-width': 1536,
              '1536x1536-height': 869,
              '2048x2048': '/website-assets/media/2025/12/Docs-jpeg.jpeg',
              '2048x2048-width': 1832,
              '2048x2048-height': 1036,
            },
          },
        },
      },
      {
        source: 'picker',
        resource: [
          {
            title:
              'Getting Started with Spice.ai SQL Query Federation & Acceleration',
            slug: '/blog/spice-sql-query-federation-acceleration',
            excerpt:
              'Learn how to use Spice.ai to federate and accelerate queries across operational and analytical systems with zero ETL.',
            image:
              '/website-assets/media/2025/11/68ee96eb08a0dfcb609c1969_Version-7-1.png',
            type: 'Blog',
            taxonomy: ['Spice AI'],
          },
        ],
        resource_manual: {
          eyebrow: '',
          title: null,
          description: '',
          image: false,
        },
      },
      {
        source: 'picker',
        resource: [
          {
            title: 'How we use Apache DataFusion at Spice AI',
            slug: '/blog/how-we-use-apache-datafusion-at-spice-ai',
            excerpt:
              'A technical overview of how Spice extends Apache DataFusion with custom table providers, optimizer rules, and UDFs to power federated SQL, search, and AI inference.',
            image:
              '/website-assets/media/2026/01/Engineering-at-Spice-AI-Apache-DataFusion.png',
            type: 'Blog',
            taxonomy: ['SQL Federation', 'Engineering'],
          },
        ],
        resource_manual: {
          eyebrow: '',
          title: null,
          description: '',
          image: false,
        },
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<TalkToAnEngineerCta />

---

## What is Hybrid Search?
URL: https://spice.ai/learn/hybrid-search
Date: 2026-02-06T00:00:00
Description: Hybrid search combines vector similarity search with keyword matching to deliver more accurate results than either method alone. Learn how hybrid search works, ranking algorithms like RRF, and when to use it.

<HeroCenteredText
  fields={{
    graphic_position: 'no-graphic',
    heading_tag: 'h1',
    heading: 'What is Hybrid Search?',
    paragraph:
      'Hybrid search combines vector similarity search with keyword (lexical) search to deliver more accurate, comprehensive results than either method alone.',
    cta: [
      {
        type: 'filled',
        cta: {
          title: 'See Spice hybrid search',
          url: '/platform/hybrid-sql-search',
          target: '',
        },
      },
      {
        type: 'bordered',
        cta: {
          title: 'Read the docs',
          url: 'https://spiceai.org/docs/features/search',
          target: '',
        },
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<ContentRichText
  fields={{
    coverage: 'rc-start',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

Search has evolved beyond simple keyword matching. Vector search uses embeddings to find semantically similar content: "refund policy" matches "return process" even though they share no words. But vector search has blind spots: it can miss exact product names, error codes, or technical identifiers that keyword search handles effortlessly.

Hybrid search solves this by running both methods in parallel and combining their results. A user query is simultaneously matched against a vector index (for semantic relevance) and a keyword index (for exact term matching). The results are merged using a ranking algorithm that balances both signals, producing a final result set that captures both meaning and precision.

## Why Pure Vector Search Falls Short

Vector search (also called semantic search) encodes text into high-dimensional vectors using an embedding model and finds the closest vectors to the query. This captures meaning well: "How do I cancel my subscription?" matches content about "account termination procedures."

But vector search struggles with:

- **Exact identifiers:** Product names, model numbers, error codes, and acronyms may not embed well. Searching for "ERR-4502" might return results about errors in general rather than the specific error code.
- **Rare or technical terms:** Domain-specific jargon, newly coined terms, or proper nouns that weren't well-represented in the embedding model's training data produce weak vectors.
- **Precision at the tail:** For broad queries, vector search returns semantically related but not precisely relevant results. The top results are good, but quality drops quickly.

## Why Pure Keyword Search Falls Short

Keyword search (BM25, TF-IDF) matches documents that contain the query's exact terms, weighted by frequency and rarity. This is precise for exact matches but misses semantic equivalents:

- **Synonym blindness:** "automobile insurance" won't match content about "car coverage" despite identical meaning.
- **Intent misunderstanding:** "How to speed up queries" won't match content titled "Query Performance Optimization" because the terms differ.
- **Vocabulary mismatch:** Users describe problems in their own words, which often don't match the terminology in documentation or knowledge bases.

## How Hybrid Search Works

A hybrid search system operates in three stages: parallel retrieval, score normalization, and result fusion.

### Parallel Retrieval

The query is processed by both search systems simultaneously:

1. **Vector search:** The query is embedded into a vector and matched against the vector index using cosine similarity or dot product. Returns the top-k most semantically similar documents with similarity scores.
2. **Keyword search:** The query is tokenized and matched against the inverted index using BM25 scoring. Returns the top-k documents containing the most relevant keyword matches.

These two retrievals are independent and can execute concurrently, so hybrid search doesn't add meaningful latency over running either method alone.

### Score Normalization

Vector similarity scores and BM25 scores are on different scales. Cosine similarity ranges from -1 to 1, while BM25 scores are unbounded positive numbers. Before combining results, scores must be normalized to a common scale.

Common normalization approaches include min-max normalization (scaling to 0-1 range within each result set) and z-score normalization (centering on mean with unit standard deviation).

### Result Fusion

The normalized results are combined using a ranking algorithm. The most common approach is **Reciprocal Rank Fusion (RRF)**, which works by:

1. Assigning each result a score based on its rank position in each result set: `1 / (k + rank)`
2. Summing scores for documents that appear in multiple result sets
3. Sorting by the combined score

The key insight behind RRF is that it doesn't rely on raw scores at all, only rank positions. This makes it robust to score distribution differences between search methods.

```sql
-- Hybrid search using rrf() in Spice
SELECT id, title, content, fused_score
FROM rrf(
    vector_search(customer_docs, 'how to cancel subscription'),
    text_search(customer_docs, 'cancel subscription', content),
    join_key => 'id'
)
ORDER BY fused_score DESC
LIMIT 10;
```

Other fusion methods include:

- **Weighted linear combination:** `score = alpha * vector_score + (1 - alpha) * keyword_score`, where alpha controls the balance
- **Cross-encoder re-ranking:** A more expensive model re-scores the merged candidates for higher precision
- **Learned fusion:** A trained model determines optimal weights per query type

## Hybrid Search for RAG

Hybrid search is especially important for [retrieval-augmented generation (RAG)](/learn/retrieval-augmented-generation) systems, where retrieval quality directly determines answer quality.

RAG applications face a unique challenge: the retrieved context must be both semantically relevant (the right topic) and factually precise (the right details). Pure vector search might retrieve content about the right topic but miss the specific document containing the answer. Pure keyword search might find exact term matches in irrelevant contexts.

Hybrid search addresses both failure modes:

- **Semantic recall:** Vector search ensures the retriever captures conceptually related content even when the user's language differs from the source material
- **Precision grounding:** Keyword search ensures exact terms, names, and identifiers are matched, preventing the retriever from drifting to related-but-wrong content

In practice, RAG systems using hybrid search show measurably higher answer accuracy than those using either search method alone, especially for technical and domain-specific queries where vocabulary mismatch is common.

## Hybrid Search vs. Separate Search Systems

Many teams build hybrid search by stitching together separate systems: a vector database (Pinecone, Weaviate, Qdrant) alongside a search engine (Elasticsearch, OpenSearch). This approach works but introduces operational complexity:

- **Two systems to deploy and manage:** Separate infrastructure, monitoring, and scaling for each
- **Data synchronization:** Both systems must index the same data, and changes must propagate to both
- **Application-layer fusion:** The application must query both systems, normalize scores, and merge results
- **Latency overhead:** Two network round-trips instead of one

A unified runtime that supports vector search, keyword search, and SQL in a single system eliminates these problems. The data is indexed once, queries execute in a single round-trip, and fusion happens internally without application code.

## Hybrid Search with Spice

[Spice](/platform/hybrid-sql-search) provides hybrid search natively in a single runtime:

- **Vector, full-text, and SQL search** combined in one query engine, no separate systems to manage
- **Built-in RRF and weighted fusion** for combining vector and keyword results
- **[SQL federation](/learn/sql-federation)** for searching across [40+ connected data sources](/integrations)
- **[Real-time CDC](/learn/change-data-capture)** to keep search indexes fresh as source data changes
- **[LLM inference](/learn/llm-inference)** for generating embeddings alongside search queries in the same runtime

This unified approach means [RAG applications](/use-case/retrieval-augmented-generation) can index, search, and generate in one system rather than orchestrating separate vector databases, search engines, and data pipelines. The same runtime powers [in-product application search](/use-case/application-search), so one index serves both retrieval for generation and user-facing search.

## Advanced Topics

### Learned Sparse Representations (SPLADE)

Traditional keyword search relies on exact term matching with BM25 scoring. SPLADE (Sparse Lexical and Expansion) models improve on this by learning sparse representations that include term expansion: a trained model predicts which vocabulary terms are relevant to a passage even if they don't appear in the text.

For example, a passage about "automobile insurance premiums" would receive non-zero weights for related terms like "car," "vehicle," "coverage," and "policy." This means SPLADE captures some semantic understanding within a sparse representation, bridging the gap between keyword and vector search.

The practical benefit is that SPLADE models can replace or augment BM25 in the keyword leg of a hybrid search pipeline. Because the output is still a sparse vector, it uses the same inverted index infrastructure as BM25: no separate vector database required. SPLADE representations are typically more expensive to compute than BM25 scores but cheaper than dense embeddings, making them an attractive middle ground.

In hybrid search systems, replacing BM25 with a SPLADE model improves recall on queries where vocabulary mismatch is an issue, while maintaining the precision advantages of sparse representations for exact-match queries. The tradeoff is additional indexing compute and the need to train or fine-tune the SPLADE model on domain-specific data for optimal results.

### Cross-Encoder Re-ranking

The initial retrieval stage of hybrid search (whether BM25, vector, or both) uses models that encode the query and documents independently. This is efficient (each document embedding is computed once at index time) but limits how precisely the system can assess relevance.

Cross-encoder re-ranking addresses this by scoring each candidate document against the query in a single forward pass through a transformer model. The query and document tokens attend to each other directly, producing a more nuanced relevance score. Because this is computationally expensive (each query-document pair requires a full model inference), cross-encoders are applied only to the top candidates returned by the initial retrieval stage, typically re-scoring the top 50-100 results to produce the final top-k.

The re-ranking stage typically adds 50-200ms of latency depending on the number of candidates and the model size. In practice, this is an acceptable tradeoff for applications like [retrieval-augmented generation](/learn/retrieval-augmented-generation) where retrieval precision directly determines answer quality. Models like Cohere Rerank, ColBERT, and open-source cross-encoders from the sentence-transformers library are commonly used.

### Multi-Stage Retrieval Pipelines

Production search systems often use more than two stages. A common architecture is:

1. **Candidate generation:** BM25 or a fast approximate nearest neighbor (ANN) search retrieves a broad set of candidates (hundreds to thousands) with high recall but moderate precision.
2. **First-pass ranking:** A lightweight model (e.g., a small bi-encoder or SPLADE) re-scores candidates to reduce the set to a manageable size (50-100).
3. **Second-pass re-ranking:** A cross-encoder re-ranks the reduced candidate set for maximum precision, producing the final top-k results.

Each stage narrows the candidate set while applying progressively more expensive (and more accurate) scoring. This cascade design balances latency and quality: the cheap first stage ensures nothing important is missed, while the expensive final stage ensures the top results are maximally relevant.

Tuning a multi-stage pipeline requires optimizing each stage independently. The candidate generation stage must have high recall (retrieve all potentially relevant documents), even at the cost of lower precision. The re-ranking stages must have high precision (correctly rank the most relevant documents at the top). Metrics like recall@100 for the first stage and NDCG@10 for the final stage are standard benchmarks.

<ContentRichText
  fields={{
    coverage: 'rc-end',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<AccordionFaq
  fields={{
    heading: 'Hybrid Search FAQ',
    paragraph: '',
    items: [
      {
        title: 'What is Reciprocal Rank Fusion (RRF)?',
        paragraph:
          "<p>RRF is a ranking algorithm that merges results from multiple search methods by scoring each document based on its rank position (not its raw score) in each result set. Documents appearing near the top of multiple result sets receive the highest combined scores. RRF is popular because it is simple, effective, and doesn't require score normalization. For a deeper explanation, see <a href='/learn/reciprocal-rank-fusion'>What is Reciprocal Rank Fusion (RRF)?</a></p>",
      },
      {
        title:
          'Does hybrid search add latency compared to vector search alone?',
        paragraph:
          '<p>Minimal. The vector and keyword searches execute in parallel, so the total latency is roughly the maximum of the two rather than the sum. In a unified runtime where both indexes are co-located, hybrid search typically adds only a few milliseconds for the fusion step.</p>',
      },
      {
        title: 'When should I use hybrid search instead of pure vector search?',
        paragraph:
          '<p>Use hybrid search when your queries involve exact identifiers (product names, error codes, IDs), domain-specific terminology, or when retrieval precision matters more than just semantic similarity. In practice, hybrid search outperforms pure vector search for most production use cases, especially in RAG systems and enterprise search.</p>',
      },
      {
        title: 'How do I tune the balance between vector and keyword results?',
        paragraph:
          '<p>With RRF, the balance is determined by the k parameter (typically 60). With weighted linear combination, adjust the alpha weight between 0 (all keyword) and 1 (all vector). Start with equal weighting and tune based on evaluation metrics. The optimal balance depends on your data and query patterns.</p>',
      },
      {
        title: 'Can hybrid search work with SQL queries?',
        paragraph:
          '<p>Yes. In systems like Spice, hybrid search is expressed as SQL: you can combine vector similarity, keyword matching, and structured SQL filters in a single query. This is especially powerful for filtering search results by metadata (date ranges, categories, access permissions) alongside semantic and keyword matching.</p>',
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<ContentResourceFeatured
  fields={{
    heading: 'Learn more about hybrid search',
    paragraph:
      'Technical guides on building hybrid search with vector, full-text, and SQL in a single runtime.',
    mode: 'default',
    resources: [
      {
        source: 'manual',
        resource: null,
        resource_manual: {
          eyebrow: 'Docs',
          title: {
            title: 'Hybrid Search Docs',
            url: 'https://spiceai.org/docs/features/search',
            target: '_blank',
          },
          description:
            'Learn how Spice provides semantic, full-text, and hybrid search capabilities in a single SQL-native runtime.',
          image: {
            ID: 1661,
            id: 1661,
            title: 'Docs jpeg',
            filename: 'Docs-jpeg.jpeg',
            filesize: 103192,
            url: '/website-assets/media/2025/12/Docs-jpeg.jpeg',
            link: '/docs-jpeg/',
            alt: '',
            author: '9',
            description: '',
            caption: '',
            name: 'docs-jpeg',
            status: 'inherit',
            uploaded_to: 0,
            date: '2025-12-05 04:13:53',
            modified: '2025-12-05 04:13:53',
            menu_order: 0,
            mime_type: 'image/jpeg',
            type: 'image',
            subtype: 'jpeg',
            icon: '/website-assets/media/default.png',
            width: 1832,
            height: 1036,
            sizes: {
              thumbnail: '/website-assets/media/2025/12/Docs-jpeg-150x150.jpeg',
              'thumbnail-width': 150,
              'thumbnail-height': 150,
              medium: '/website-assets/media/2025/12/Docs-jpeg-300x170.jpeg',
              'medium-width': 300,
              'medium-height': 170,
              medium_large:
                '/website-assets/media/2025/12/Docs-jpeg-768x434.jpeg',
              'medium_large-width': 768,
              'medium_large-height': 434,
              large: '/website-assets/media/2025/12/Docs-jpeg-1024x579.jpeg',
              'large-width': 1024,
              'large-height': 579,
              '1536x1536':
                '/website-assets/media/2025/12/Docs-jpeg-1536x869.jpeg',
              '1536x1536-width': 1536,
              '1536x1536-height': 869,
              '2048x2048': '/website-assets/media/2025/12/Docs-jpeg.jpeg',
              '2048x2048-width': 1832,
              '2048x2048-height': 1036,
            },
          },
        },
      },
      {
        source: 'picker',
        resource: [
          {
            title:
              'True Hybrid Search: Vector, Full-Text, and SQL in One Runtime',
            slug: '/blog/true-hybrid-search',
            excerpt:
              'Build hybrid search without managing multiple systems. Query vectors, run full-text search, and execute SQL in one unified runtime.',
            image: '/website-assets/media/2025/09/image-33.png',
            type: 'Blog',
            taxonomy: ['Spice AI'],
          },
        ],
        resource_manual: {
          eyebrow: '',
          title: null,
          description: '',
          image: false,
        },
      },
      {
        source: 'picker',
        resource: [
          {
            title:
              'Real-Time Hybrid Search Using RRF: A Hands-On Guide with Spice',
            slug: '/blog/real-time-hybrid-search-using-rrf',
            excerpt:
              'Learn how to build hybrid search with RRF directly in SQL using Spice, combining text, vector, and time-based relevance in one query.',
            image:
              '/website-assets/media/2025/11/68fa4fdfded26b3b6472a172_image-8.png',
            type: 'Blog',
            taxonomy: ['Search', 'Spice AI'],
          },
        ],
        resource_manual: {
          eyebrow: '',
          title: null,
          description: '',
          image: false,
        },
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<TalkToAnEngineerCta />

---

## Learn Data & AI
URL: https://spice.ai/learn
Date: 2026-03-11T00:00:00
Description: Learn about the core technologies behind Spice.ai: SQL federation, data virtualization, RAG, hybrid search, change data capture, the Model Context Protocol, and more.

<HeroCenteredText
  fields={{
    graphic_position: 'no-graphic',
    heading_tag: 'h1',
    heading: 'Learn Data & AI',
    paragraph:
      'Understand the core technologies behind modern data and AI infrastructure. Each guide explains a key concept in depth: how it works, when to use it, and how it connects to the broader data stack.',
    cta: [],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<ContentThreeAcrossIconTiles
  fields={{
    heading: 'Data Infrastructure',
    heading_tag: 'h2',
    paragraph: '',
    item: [
      {
        icon: {
          url: '/website-assets/svg/Platform-Query_Benefits_Easily-connect-to-disparate-data-sources.svg',
          alt: 'SQL Federation',
          title: 'SQL Federation',
        },
        title: 'How to Do SQL Query Federation',
        description:
          'Query multiple databases with a single SQL statement without moving data. Learn how to set up federated queries with predicate pushdown and acceleration.',
        cta: {
          title: 'Read the guide',
          url: '/learn/sql-federation',
          target: '',
        },
      },
      {
        icon: {
          url: '/website-assets/svg/Source-Agnostic.svg',
          alt: 'Data Virtualization',
          title: 'Data Virtualization',
        },
        title: 'What is Data Virtualization?',
        description:
          'Access and combine data from multiple sources through a unified interface without replication. Learn how it compares to ETL and when to use it.',
        cta: {
          title: 'Read the guide',
          url: '/learn/data-virtualization',
          target: '',
        },
      },
      {
        icon: {
          url: '/website-assets/svg/Local-Acceleration.svg',
          alt: 'Data Acceleration',
          title: 'Data Acceleration',
        },
        title: 'What is Data Acceleration?',
        description:
          'Cache frequently accessed data locally for sub-second queries while keeping it fresh with CDC. Learn acceleration strategies and when to use them.',
        cta: {
          title: 'Read the guide',
          url: '/learn/data-acceleration',
          target: '',
        },
      },
      {
        icon: {
          url: '/website-assets/svg/Industry_FinServ_ETL-Free-Syncs.svg',
          alt: 'Zero-ETL',
          title: 'Zero-ETL',
        },
        title: 'What is Zero-ETL?',
        description:
          'Eliminate ETL pipelines by federating data in place and synchronizing acceleration caches with CDC. Learn the three zero-ETL patterns and when to use each.',
        cta: {
          title: 'Read the guide',
          url: '/learn/zero-etl',
          target: '',
        },
      },
      {
        icon: {
          url: '/website-assets/svg/Industry_SaaS_Real-Time-Data-Sync.svg',
          alt: 'Change Data Capture',
          title: 'Change Data Capture',
        },
        title: 'How to Implement Change Data Capture',
        description:
          'Track row-level database changes and stream them in real time. Learn how to implement log-based, trigger-based, and polling patterns for real-time pipelines.',
        cta: {
          title: 'Read the guide',
          url: '/learn/change-data-capture',
          target: '',
        },
      },
      {
        icon: {
          url: '/website-assets/svg/Platform-Query_Benefits_Easily-connect-to-disparate-data-sources.svg',
          alt: '',
          title: '',
        },
        title: 'How to Securely Connect AI Agents to Multiple Databases',
        description:
          'Practical guide to connecting AI agents to PostgreSQL, MySQL, Snowflake, and more with federated SQL, governed access, and low-latency serving.',
        cta: {
          title: 'Read the guide',
          url: '/learn/how-to-connect-ai-agents-to-multiple-databases',
          target: '',
        },
      },
      {
        icon: {
          url: '/website-assets/svg/Industry_SaaS_Real-Time-Data-Sync.svg',
          alt: '',
          title: '',
        },
        title: 'Real-Time Analytics Guide for AI Agents',
        description:
          'Framework for choosing real-time analytics architecture for AI agents based on freshness, latency, governance, and cost requirements.',
        cta: {
          title: 'Read the guide',
          url: '/learn/real-time-analytics-guide-for-ai-agents',
          target: '',
        },
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<ContentThreeAcrossIconTiles
  fields={{
    heading: 'Search',
    heading_tag: 'h2',
    paragraph: '',
    item: [
      {
        icon: {
          url: '/website-assets/svg/Industry_FinServ_Hybrid-Search.svg',
          alt: 'Hybrid Search',
          title: 'Hybrid Search',
        },
        title: 'What is Hybrid Search?',
        description:
          'Combine vector similarity with keyword matching for more accurate results. Learn about RRF, score fusion, and why hybrid search matters for RAG.',
        cta: {
          title: 'Read the guide',
          url: '/learn/hybrid-search',
          target: '',
        },
      },
      {
        icon: {
          url: '/website-assets/svg/Platform-Search_Benefits_Full-SQL-control.svg',
          alt: 'BM25 Full-Text Search',
          title: 'BM25 Full-Text Search',
        },
        title: 'What is BM25 Full-Text Search?',
        description:
          'The standard ranking function for full-text search. Learn how BM25 scores documents, how inverted indexes work, and when keyword search needs vector search.',
        cta: {
          title: 'Read the guide',
          url: '/learn/bm25-full-text-search',
          target: '',
        },
      },
      {
        icon: {
          url: '/website-assets/svg/UseCase_RAG_Built-in-Vector-Search.svg',
          alt: 'Vector Search',
          title: 'Vector Search',
        },
        title: 'What is Vector Search?',
        description:
          'Find semantically similar content by comparing vector embeddings. Learn about ANN algorithms, distance metrics, and vector indexes.',
        cta: {
          title: 'Read the guide',
          url: '/learn/vector-search',
          target: '',
        },
      },
      {
        icon: {
          url: '/website-assets/svg/UseCase_RAG_Hybrid-Ranking.svg',
          alt: 'Reciprocal Rank Fusion',
          title: 'Reciprocal Rank Fusion',
        },
        title: 'What is Reciprocal Rank Fusion (RRF)?',
        description:
          'The rank-based merging algorithm behind most hybrid search systems. Learn how RRF combines keyword and vector results without requiring score normalization.',
        cta: {
          title: 'Read the guide',
          url: '/learn/reciprocal-rank-fusion',
          target: '',
        },
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<ContentThreeAcrossIconTiles
  fields={{
    heading: 'AI & LLMs',
    heading_tag: 'h2',
    paragraph: '',
    item: [
      {
        icon: {
          url: '/website-assets/svg/UseCase_RAG_Real-Time-Federation.svg',
          alt: 'Retrieval Augmented Generation',
          title: 'Retrieval Augmented Generation',
        },
        title: 'What is RAG?',
        description:
          'Retrieval augmented generation grounds LLM responses in real data at inference time. Learn the three-stage pipeline, production challenges, and hybrid search integration.',
        cta: {
          title: 'Read the guide',
          url: '/learn/retrieval-augmented-generation',
          target: '',
        },
      },
      {
        icon: {
          url: '/website-assets/svg/Platform-LLM_Benefits_Accelerate-data-analysis.svg',
          alt: 'LLM Inference',
          title: 'LLM Inference',
        },
        title: 'What is LLM Inference?',
        description:
          'Understand how large language models generate responses. Learn about tokenization, KV caching, quantization, and latency optimization.',
        cta: {
          title: 'Read the guide',
          url: '/learn/llm-inference',
          target: '',
        },
      },
      {
        icon: {
          url: '/website-assets/svg/Platform-LLM_Benefits_Combine-data-and-AI-in-one-workflow.svg',
          alt: 'LLM Tool Calling',
          title: 'LLM Tool Calling',
        },
        title: 'What is LLM Tool Calling?',
        description:
          'LLMs output structured function calls instead of text to interact with external tools. Learn the tool calling loop, security considerations, and MCP.',
        cta: {
          title: 'Read the guide',
          url: '/learn/llm-tool-calling',
          target: '',
        },
      },
      {
        icon: {
          url: '/website-assets/svg/Industry_FinServ_MCP-Server-and-Gateway.svg',
          alt: 'Model Context Protocol',
          title: 'Model Context Protocol',
        },
        title: 'What is the Model Context Protocol?',
        description:
          'MCP standardizes how AI models discover and invoke external tools and data. Learn the client-server architecture and how gateways enable enterprise AI.',
        cta: {
          title: 'Read the guide',
          url: '/learn/model-context-protocol',
          target: '',
        },
      },
      {
        icon: {
          url: '/website-assets/svg/Platform-Query_Benefits_Simplify-your-data-stack.svg',
          alt: 'Text-to-SQL',
          title: 'Text-to-SQL',
        },
        title: 'How to Use Text-to-SQL',
        description:
          'Translate natural language questions into SQL queries using LLMs. Learn how to implement schema-aware generation and production safeguards.',
        cta: {
          title: 'Read the guide',
          url: '/learn/text-to-sql',
          target: '',
        },
      },
      {
        icon: {
          url: '/website-assets/svg/AboutUs_Vectors-over-scalars.svg',
          alt: 'Embeddings',
          title: 'Embeddings',
        },
        title: 'What are Embeddings?',
        description:
          'Dense vector representations that capture semantic meaning. Learn how embedding models work, how they enable semantic search and RAG, and how to choose the right model.',
        cta: {
          title: 'Read the guide',
          url: '/learn/embeddings',
          target: '',
        },
      },
      {
        icon: {
          url: '/website-assets/svg/Industry_FinServ_MCP-Server-and-Gateway.svg',
          alt: '',
          title: '',
        },
        title: 'Everything You Need to Know About AI Agent Data Access',
        description:
          'Complete guide to the four layers of agent data access: connectivity across systems, low-latency serving, governance, and per-agent isolation.',
        cta: {
          title: 'Read the guide',
          url: '/learn/ai-agent-data-access',
          target: '',
        },
      },
      {
        icon: {
          url: '/website-assets/svg/UseCase_RAG_Real-Time-Federation.svg',
          alt: 'Live operational data for AI agents',
          title: 'Live Operational Data',
        },
        title: 'How to Connect AI Agents to Live Operational Data Without ETL',
        description:
          'Practical architecture guide for connecting agents to live operational systems using federation, acceleration, and policy controls instead of batch ETL.',
        cta: {
          title: 'Read the guide',
          url: '/learn/how-to-connect-ai-agents-to-live-operational-data-without-etl',
          target: '',
        },
      },
      {
        icon: {
          url: '/website-assets/svg/UseCase_ApplicationSearch_Deploy-Anywhere.svg',
          alt: 'Isolated data environments for AI agents',
          title: 'Agent Data Isolation',
        },
        title: 'How to Give Each AI Agent Its Own Isolated Data Environment',
        description:
          'Step-by-step guide to isolating data access per AI agent with scoped identities, runtime boundaries, and policy controls for safer production operations.',
        cta: {
          title: 'Read the guide',
          url: '/learn/how-to-give-each-ai-agent-its-own-isolated-data-environment',
          target: '',
        },
      },
      {
        icon: {
          url: '/website-assets/svg/Industry_Cybersecurity_Resilience-at-Scale.svg',
          alt: 'Sandboxed data access for AI agents',
          title: 'Agent Data Sandboxing',
        },
        title: 'How to Sandbox Data Access for AI Agents',
        description:
          'Learn how to sandbox AI agent retrieval paths with least-privilege access, query guardrails, output redaction, and policy-aware monitoring.',
        cta: {
          title: 'Read the guide',
          url: '/learn/how-to-sandbox-data-access-for-ai-agents',
          target: '',
        },
      },
      {
        icon: {
          url: '/website-assets/svg/Industry_SaaS_Real-Time-Data-Sync.svg',
          alt: 'Reducing data lakehouse costs for agentic workloads',
          title: 'Agentic Workload Cost Optimization',
        },
        title: 'How to Reduce Data Lakehouse Costs for Agentic Workloads',
        description:
          'Practical framework for lowering data lakehouse cost in agentic systems by separating serving and analytics paths, tuning query classes, and applying acceleration.',
        cta: {
          title: 'Read the guide',
          url: '/learn/how-to-reduce-data-lakehouse-costs-for-agentic-workloads',
          target: '',
        },
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<ContentThreeAcrossIconTiles
  fields={{
    heading: 'Open-Source Technologies',
    heading_tag: 'h2',
    paragraph: '',
    item: [
      {
        icon: {
          url: '/website-assets/svg/Logo_Apache-DataFusion.svg',
          alt: 'Apache DataFusion logo',
          title: 'Apache DataFusion',
        },
        title: 'What is Apache DataFusion?',
        description:
          'An extensible SQL query engine written in Rust. Learn the architecture, how it compares to DuckDB and Trino, and how Spice extends it.',
        cta: {
          title: 'Read the guide',
          url: '/learn/apache-datafusion',
          target: '',
        },
      },
      {
        icon: {
          url: '/website-assets/svg/Logo_Apache-DataFusion.svg',
          alt: 'Apache DataFusion logo',
          title: 'Managed Apache DataFusion',
        },
        title: 'Managed Apache DataFusion: Federated SQL at Scale',
        description:
          'Learn how teams run Apache DataFusion in production with managed federation, optimizer controls, acceleration policy, and tenant-aware operations.',
        cta: {
          title: 'Read the guide',
          url: '/learn/managed-apache-datafusion',
          target: '',
        },
      },
      {
        icon: {
          url: '/website-assets/svg/Logo_Apache-Ballista.svg',
          alt: 'Apache Ballista logo',
          title: 'Apache Ballista',
        },
        title: 'What is Apache Ballista?',
        description:
          'A distributed SQL query engine that scales DataFusion across multiple nodes. Learn the scheduler-executor architecture and how it compares to Spark.',
        cta: {
          title: 'Read the guide',
          url: '/learn/apache-ballista',
          target: '',
        },
      },
      {
        icon: {
          url: '/website-assets/svg/Logo_Vortex.svg',
          alt: 'Vortex logo',
          title: 'Vortex',
        },
        title: 'What is Vortex?',
        description:
          'A compressed columnar file format with adaptive encoding for fast analytical queries. Learn how it compares to Parquet and powers Spice Cayenne.',
        cta: {
          title: 'Read the guide',
          url: '/learn/vortex',
          target: '',
        },
      },
      {
        icon: {
          url: '/website-assets/svg/Logo_DuckDB.svg',
          alt: 'DuckDB logo',
          title: 'DuckDB',
        },
        title: 'What is DuckDB?',
        description:
          'An in-process analytical database designed for fast OLAP queries with zero dependencies. Learn the columnar engine, vectorized execution, and how Spice uses it.',
        cta: {
          title: 'Read the guide',
          url: '/learn/duckdb',
          target: '',
        },
      },
      {
        icon: {
          url: '/website-assets/svg/Logo_Apache-Arrow.svg',
          alt: 'Apache Arrow logo',
          title: 'Apache Arrow',
        },
        title: 'What is Apache Arrow?',
        description:
          'A cross-language columnar in-memory data format for zero-copy analytics. Learn how Arrow enables high-speed data exchange and powers modern query engines.',
        cta: {
          title: 'Read the guide',
          url: '/learn/apache-arrow',
          target: '',
        },
      },
      {
        icon: {
          url: '/website-assets/svg/Logo_Apache-Iceberg.svg',
          alt: 'Apache Iceberg logo',
          title: 'Apache Iceberg',
        },
        title: 'What is Apache Iceberg?',
        description:
          'An open table format for large analytic datasets with schema evolution, hidden partitioning, and time travel. Learn the architecture and how Spice queries Iceberg tables.',
        cta: {
          title: 'Read the guide',
          url: '/learn/apache-iceberg',
          target: '',
        },
      },
      {
        icon: {
          url: '/website-assets/svg/Logo_Delta-Lake.svg',
          alt: 'Delta Lake logo',
          title: 'Delta Lake',
        },
        title: 'What is Delta Lake?',
        description:
          'An open-source storage layer that brings ACID transactions to data lakes. Learn the transaction log architecture and how Spice federates Delta tables.',
        cta: {
          title: 'Read the guide',
          url: '/learn/delta-lake',
          target: '',
        },
      },
      {
        icon: {
          url: '/website-assets/svg/Logo_Tantivy.svg',
          alt: 'Tantivy logo',
          title: 'Tantivy',
        },
        title: 'What is Tantivy?',
        description:
          'A full-text search engine library written in Rust, inspired by Apache Lucene. Learn about inverted indexes, BM25 scoring, and how Spice embeds it for hybrid search.',
        cta: {
          title: 'Read the guide',
          url: '/learn/tantivy',
          target: '',
        },
      },
      {
        icon: {
          url: '/website-assets/svg/Pricing_Built-on-open-source.svg',
          alt: '',
          title: '',
        },
        title: 'Open-Source AI Data Platforms',
        description:
          'How to evaluate an open-source data and AI platform by license type, governance model, open core boundaries, and the real cost of self-hosting.',
        cta: {
          title: 'Read the guide',
          url: '/learn/open-source-ai-data-platforms',
          target: '',
        },
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<ContentThreeAcrossIconTiles
  fields={{
    heading: 'Comparisons',
    heading_tag: 'h2',
    paragraph: '',
    item: [
      {
        title: 'SQL Federation vs ETL',
        description:
          'Query data in place or move it to a warehouse? Compare federation and ETL across latency, freshness, cost, and operational complexity.',
        cta: {
          title: 'Read the guide',
          url: '/learn/sql-federation-vs-etl',
          target: '',
        },
      },
      {
        title: 'Full-Text Search vs Vector Search',
        description:
          'Keyword matching or semantic similarity? Compare BM25 and vector search across accuracy, performance, and use cases, and learn when hybrid search wins.',
        cta: {
          title: 'Read the guide',
          url: '/learn/full-text-search-vs-vector-search',
          target: '',
        },
      },
      {
        title: 'RAG vs Fine-Tuning',
        description:
          'Ground LLM responses with retrieved data or train the model directly? Compare RAG and fine-tuning across cost, freshness, accuracy, and implementation effort.',
        cta: {
          title: 'Read the guide',
          url: '/learn/rag-vs-fine-tuning',
          target: '',
        },
      },
      {
        title: 'Data Virtualization vs Data Replication',
        description:
          'Access data virtually or replicate it physically? Compare virtualization and replication across latency, consistency, cost, and when to combine both.',
        cta: {
          title: 'Read the guide',
          url: '/learn/data-virtualization-vs-replication',
          target: '',
        },
      },
      {
        title: 'Caching vs Data Acceleration',
        description:
          'Store past results or keep the data itself fast? Compare caching and data acceleration across invalidation, freshness, query flexibility, and latency profiles.',
        cta: {
          title: 'Read the guide',
          url: '/learn/caching-vs-data-acceleration',
          target: '',
        },
      },
      {
        title: 'Data Lakehouse vs Data Warehouse',
        description:
          'Open table formats on object storage or an integrated warehouse? Compare storage formats, cost models, workload breadth, and application-serving latency.',
        cta: {
          title: 'Read the guide',
          url: '/learn/data-lakehouse-vs-data-warehouse',
          target: '',
        },
      },
      {
        title: 'Sidecar vs Microservice Architecture',
        description:
          'Deploy a data runtime alongside your app or as a shared service? Compare sidecar and microservice architectures across latency, scaling, resource usage, and operational complexity.',
        cta: {
          title: 'Read the guide',
          url: '/learn/sidecar-vs-microservice-architecture',
          target: '',
        },
      },
      {
        title: 'Apache DataFusion vs DuckDB',
        description:
          'Both are fast in-process SQL engines built for analytical workloads. Compare architecture, extensibility, language bindings, and when each is the better fit.',
        cta: {
          title: 'Read the guide',
          url: '/learn/apache-datafusion-vs-duckdb',
          target: '',
        },
      },
      {
        title: 'Apache Iceberg vs Delta Lake',
        description:
          'Open table formats with different metadata architectures and ecosystem strengths. Compare hidden partitioning, catalog support, and engine compatibility.',
        cta: {
          title: 'Read the guide',
          url: '/learn/apache-iceberg-vs-delta-lake',
          target: '',
        },
      },
      {
        title: 'Comparing Data Federation Tools for AI Agents',
        description:
          'An objective comparison of data federation tool categories for AI agents, including latency, governance, connector coverage, and deployment tradeoffs.',
        cta: {
          title: 'Read the guide',
          url: '/learn/comparing-data-federation-tools-for-ai-agents',
          target: '',
        },
      },
      {
        title: 'Best Alternatives to ETL Pipelines for AI Agents',
        description:
          'Objective guide to ETL alternatives for AI agent workloads, including federation, CDC acceleration, streaming, and hybrid architecture tradeoffs.',
        cta: {
          title: 'Read the guide',
          url: '/learn/best-alternatives-to-etl-pipelines-for-ai-agents',
          target: '',
        },
      },
      {
        title: 'Best Snowflake Alternatives for Real-Time SQL',
        description:
          'Objective comparison of architectures for real-time SQL, including federation engines, real-time OLAP databases, lakehouse engines, and columnar replicas.',
        cta: {
          title: 'Read the guide',
          url: '/learn/snowflake-alternatives-for-real-time-sql',
          target: '',
        },
      },
      {
        title: 'Best Query Engines for Real-Time AI Analytics',
        description:
          'Compare DataFusion, DuckDB, ClickHouse, Trino, Druid, Pinot, and Spark against what AI workloads actually demand from an execution engine.',
        cta: {
          title: 'Read the guide',
          url: '/learn/best-query-engines-for-real-time-ai-analytics',
          target: '',
        },
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<ContentThreeAcrossIconTiles
  fields={{
    heading: 'Architecture',
    heading_tag: 'h2',
    paragraph: '',
    item: [
      {
        icon: {
          url: '/website-assets/svg/Industry_Cybersecurity_Resilience-at-Scale.svg',
          alt: 'Hybrid Data Architecture',
          title: 'Hybrid Data Architecture',
        },
        title: 'What is a Hybrid Data Architecture?',
        description:
          'Combine sidecar caching with a centralized cluster for sub-millisecond reads and centralized data management. Learn the CDN-for-data pattern.',
        cta: {
          title: 'Read the guide',
          url: '/learn/hybrid-data-architecture',
          target: '',
        },
      },
      {
        icon: {
          url: '/website-assets/svg/UseCase_ApplicationSearch_Deploy-Anywhere.svg',
          alt: 'Sidecar Pattern',
          title: 'Sidecar Pattern',
        },
        title: 'What is the Sidecar Pattern?',
        description:
          'Co-locate a runtime alongside your application container for low-latency data access without network hops. Learn the sidecar pattern and when to use it.',
        cta: {
          title: 'Read the guide',
          url: '/learn/sidecar-pattern',
          target: '',
        },
      },
      {
        icon: {
          url: '/website-assets/svg/Platform-Query_Benefits_Simplify-your-data-stack.svg',
          alt: 'Data Substrate',
          title: 'Data Substrate',
        },
        title: 'What is a Data Substrate?',
        description:
          'A co-located data and AI layer that provides applications with sub-millisecond access to any data source. Learn how a substrate differs from a warehouse, lake, or lakehouse.',
        cta: {
          title: 'Read the guide',
          url: '/learn/data-substrate',
          target: '',
        },
      },
      {
        icon: {
          url: '/website-assets/svg/Platform-Query_Benefits_Simplify-your-data-stack.svg',
          alt: '',
          title: '',
        },
        title: 'How to Simplify Data and AI Application Architectures',
        description:
          'Learn how to collapse complex ETL pipelines, CDC buses, vector DB sync, and cache layers into a unified data runtime for AI and analytical apps.',
        cta: {
          title: 'Read the guide',
          url: '/learn/how-to-simplify-data-and-ai-application-architectures',
          target: '',
        },
      },
      {
        icon: {
          url: '/website-assets/svg/Pricing_Unified-data-and-AI-engine.svg',
          alt: '',
          title: '',
        },
        title: 'What to Look for in a Unified Data and AI Platform',
        description:
          'Eight criteria that separate a genuinely unified engine from a bundle of separate products, with a concrete test for each one.',
        cta: {
          title: 'Read the guide',
          url: '/learn/unified-data-and-ai-platform',
          target: '',
        },
      },
      {
        icon: {
          url: '/website-assets/svg/Local-Acceleration.svg',
          alt: 'Query Latency at Scale',
          title: 'Query Latency at Scale',
        },
        title: 'Why Query Latency Gets Worse at Scale',
        description:
          'Concurrency, data growth, and the distance between data and applications each push latency up. Learn how to diagnose which force dominates and the patterns that keep latency flat.',
        cta: {
          title: 'Read the guide',
          url: '/learn/database-query-latency-at-scale',
          target: '',
        },
      },
      {
        icon: {
          url: '/website-assets/svg/Industry_SaaS_Real-Time-Data-Sync.svg',
          alt: 'Cache Invalidation at Scale',
          title: 'Cache Invalidation at Scale',
        },
        title: 'Cache Invalidation at Scale',
        description:
          'TTLs, purge-on-write, and event-driven invalidation each break in a characteristic way as systems grow. Learn why, and how declarative refresh replaces invalidation logic.',
        cta: {
          title: 'Read the guide',
          url: '/learn/cache-invalidation-at-scale',
          target: '',
        },
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<TalkToAnEngineerCta />

---

## What is LLM Inference?
URL: https://spice.ai/learn/llm-inference
Date: 2026-01-29T00:00:00
Description: LLM inference is the process of generating text by running input through a trained large language model. Learn how inference works, key performance metrics, and optimization techniques like KV caching, quantization, and speculative decoding.

<HeroCenteredText
  fields={{
    graphic_position: 'no-graphic',
    heading_tag: 'h1',
    heading: 'What is LLM Inference?',
    paragraph:
      'LLM inference is the process of running input through a trained large language model to generate a response: the forward pass that transforms a prompt into tokens, predictions, and output text.',
    cta: [
      {
        type: 'filled',
        cta: {
          title: 'See Spice LLM inference',
          url: '/platform/llm-inference',
          target: '',
        },
      },
      {
        type: 'bordered',
        cta: {
          title: 'Read the docs',
          url: 'https://spiceai.org/docs',
          target: '',
        },
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<ContentRichText
  fields={{
    coverage: 'rc-start',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

Training a large language model and running inference on it are two fundamentally different operations. Training adjusts billions of parameters over weeks or months using massive datasets and GPU clusters. Inference uses those fixed parameters to generate output from a single input, and it needs to happen in milliseconds.

For most developers, inference is the only interaction point with a model. Whether you are building a chatbot, a code assistant, a search pipeline, or an autonomous agent, the quality and speed of inference determines the user experience. Understanding how inference works (and what levers you have to optimize it) is essential for building production AI systems.

## How LLM Inference Works

Inference is the forward pass through a trained neural network. For large language models, this process has four stages: tokenization, the forward pass, sampling, and detokenization.

### Tokenization

The model does not process raw text. Before inference begins, the input prompt is converted into a sequence of **tokens**: integer IDs that map to subword units in the model's vocabulary. A tokenizer splits text into these units based on a learned vocabulary (typically 32,000 to 128,000 tokens).

For example, the sentence "SQL federation queries multiple databases" might be tokenized into `["SQL", " feder", "ation", " queries", " multiple", " databases"]`, where each piece maps to an integer ID. The model operates entirely on these integer sequences.

### The Forward Pass

The token IDs are converted into dense vector embeddings and passed through the model's transformer layers. Each layer applies self-attention (computing relationships between all tokens in the sequence) and feed-forward transformations. For a model like Llama 3 70B, this means passing through 80 transformer layers with 64 attention heads each.

The output of the final layer is a probability distribution over the entire vocabulary for the **next token**. This is the core computation: given a sequence of tokens, predict the probability of every possible next token.

### Sampling

The raw probability distribution is processed by a sampling strategy to select the next token. Common strategies include:

- **Greedy decoding:** Always select the highest-probability token. Deterministic but can produce repetitive output.
- **Temperature sampling:** Scale the probability distribution by a temperature parameter. Lower temperatures (e.g., 0.2) make the distribution sharper, favoring high-probability tokens. Higher temperatures (e.g., 1.0) flatten the distribution, increasing diversity.
- **Top-k sampling:** Restrict selection to the k most probable tokens, then sample from that subset.
- **Top-p (nucleus) sampling:** Restrict selection to the smallest set of tokens whose cumulative probability exceeds p (e.g., 0.9), then sample.

The choice of sampling strategy affects output quality, creativity, and consistency. For structured tasks like code generation or SQL queries, low temperature with top-p sampling typically produces the best results. For creative writing or brainstorming, higher temperatures introduce useful variation.

### Detokenization

The selected token ID is mapped back to its text representation using the tokenizer's vocabulary. This token is appended to the output and, critically, fed back into the model as part of the input for predicting the next token. This autoregressive loop continues until the model generates a stop token or reaches a maximum length.

This sequential, token-by-token generation is why LLM inference is inherently slower than a simple database query. Each new token requires a forward pass through the entire model.

## Inference Performance Metrics

Four metrics define the performance profile of an LLM inference system:

### Latency

Total time from request to complete response. For a chat application, this is how long the user waits. Latency is the sum of time-to-first-token plus the time to generate all subsequent tokens.

### Time to First Token (TTFT)

The time between receiving a request and producing the first output token. TTFT is dominated by the **prefill phase**: processing the entire input prompt through the model in a single forward pass. Longer prompts mean longer TTFT because the model must compute attention across all input tokens before generating any output.

For interactive applications, TTFT determines perceived responsiveness. A system with 200ms TTFT feels responsive even if total generation takes several seconds, because the user sees output beginning almost immediately.

### Tokens Per Second (TPS)

The rate at which output tokens are generated after the first token. TPS measures the speed of the **decode phase**: the autoregressive loop where each new token is generated one at a time. TPS is bounded by memory bandwidth rather than compute, because each decode step reads the full model weights from memory to generate a single token.

### Throughput

The total number of tokens a system can generate per second across all concurrent requests. A system with 50 TPS per request serving 20 concurrent users has an aggregate throughput of 1,000 tokens per second. Throughput determines cost-efficiency: higher throughput means more work done per GPU-hour.

## Inference vs. Training

Training and inference use the same model architecture but differ in nearly every operational dimension:

- **Direction:** Training computes forward and backward passes (backpropagation) to update weights. Inference computes only the forward pass with fixed weights.
- **Compute profile:** Training is compute-bound, dominated by matrix multiplications across large batches. Inference (especially the decode phase) is memory-bandwidth-bound: each token generation reads the full model weights but performs relatively little computation.
- **Hardware:** Training requires clusters of high-end GPUs with fast interconnects (NVLink, InfiniBand). Inference can run on a single GPU, a CPU, or even edge devices depending on the model size and latency requirements.
- **Batching:** Training uses large batch sizes (thousands of samples) for efficiency. Inference batches are constrained by latency requirements: larger batches improve throughput but increase per-request latency.

## Inference Optimization Techniques

Several techniques reduce the cost and latency of LLM inference without significantly affecting output quality.

### KV Cache

During autoregressive generation, the model recomputes attention over all previous tokens at each step. The **key-value (KV) cache** stores the intermediate key and value tensors from previous tokens so they don't need to be recomputed. This turns each decode step from O(n^2) attention to O(n), dramatically reducing computation for long sequences.

The tradeoff is memory. For a 70B parameter model with a 4,096-token context, the KV cache can consume several gigabytes of GPU memory. Managing KV cache memory is one of the primary challenges in serving long-context models.

### Quantization

Quantization reduces the precision of model weights from 16-bit floating point to 8-bit integers (INT8) or 4-bit integers (INT4). This reduces memory usage by 2-4x and increases inference speed because lower-precision operations are faster and the model reads less data from memory.

```
# Model memory usage at different precisions
# Llama 3 70B parameters:
#   FP16:  ~140 GB (70B params x 2 bytes)
#   INT8:  ~70 GB  (70B params x 1 byte)
#   INT4:  ~35 GB  (70B params x 0.5 bytes)
```

Modern quantization methods (GPTQ, AWQ, GGUF) minimize quality loss by calibrating quantization ranges against representative data. In practice, INT8 quantization produces output nearly indistinguishable from FP16 for most tasks. INT4 introduces measurable quality degradation but enables running large models on consumer hardware.

### Speculative Decoding

Speculative decoding uses a small, fast **draft model** to generate several candidate tokens quickly, then verifies them in a single forward pass through the large target model. If the draft tokens are accepted (because the large model assigns them high probability), multiple tokens are produced in the time it would take to generate one.

This technique works well when the draft model's predictions frequently align with the target model, which is common for straightforward text. Speculative decoding can improve TPS by 2-3x without any quality loss, because rejected draft tokens are replaced with the target model's output.

### Continuous Batching

Traditional batching groups requests into fixed-size batches and processes them together. The problem: short requests finish early but wait for the longest request in the batch to complete, wasting GPU cycles.

Continuous batching (also called iteration-level batching) inserts new requests into the batch as soon as existing requests finish, keeping the GPU fully utilized. This improves throughput significantly. Frameworks like vLLM and TensorRT-LLM use continuous batching to serve 2-5x more concurrent requests on the same hardware.

## Local vs. Cloud Inference

Developers choosing where to run inference face a set of tradeoffs:

**Cloud/API inference** (OpenAI, Anthropic, Google) provides access to the largest models without managing infrastructure. The tradeoffs are per-token cost, network latency, data privacy constraints, and vendor dependency. For prototyping and applications where the largest models are necessary, cloud inference is the practical starting point.

**Local inference** runs models on your own hardware: GPUs, CPUs, or edge devices. This eliminates per-token cost, removes network latency, and keeps data private. The tradeoffs are hardware investment, model size limitations (you need enough memory to fit the model), and operational overhead. Quantized open-source models (Llama, Mistral, Qwen) make local inference increasingly practical for production workloads.

**Hybrid approaches** route requests to local or cloud models based on task complexity, latency requirements, or cost budgets. Simple classification or extraction tasks go to a fast, small local model. Complex reasoning tasks go to a large cloud model. This pattern optimizes for both cost and quality.

## Inference for Embeddings vs. Generation

Not all LLM inference is text generation. **Embedding inference** runs input through a model to produce a dense vector representation rather than generating new tokens. Embedding models are used for [semantic search](/learn/hybrid-search), [retrieval-augmented generation](/learn/retrieval-augmented-generation), clustering, and classification.

Embedding inference is fundamentally different from generative inference:

- **Single forward pass:** Embeddings are produced in one pass through the model. There is no autoregressive loop, no sampling, no token-by-token generation.
- **Batch-friendly:** Embedding requests can be batched aggressively because there is no sequential dependency between tokens.
- **Latency profile:** Embedding latency scales with input length but is typically 10-100x faster than generating the same number of tokens, because there is no decode phase.

Production systems often run embedding and generative models side by side. A search query generates an embedding (fast, single-pass inference), which retrieves relevant documents, which are then fed to a generative model for synthesis (slower, autoregressive inference).

## LLM Inference with Spice

[Spice](/platform/llm-inference) serves LLM inference alongside [federated SQL queries](/learn/sql-federation), embedding search, and [tool calling](/learn/llm-tool-calling) in a single runtime. This co-location means AI applications can:

- **Query data and run inference in one request:** Retrieve context from databases via [SQL federation](/learn/sql-federation), generate embeddings for [hybrid search](/learn/hybrid-search), and produce a response, all through a single endpoint.
- **Route across models:** Direct requests to local open-source models or cloud APIs based on task requirements, cost, and latency constraints.
- **Combine inference with tool use:** Models served through Spice can invoke tools via the [MCP gateway](/feature/mcp-server-gateway) to access live data, execute queries, and take actions as part of the inference loop.
- **Observe everything:** Distributed tracing across data queries, inference calls, and tool invocations provides full visibility into end-to-end AI workflows.

This unified approach eliminates the need to stitch together separate services for data access, [AI model serving](/feature/ai-model-serving), and tool execution, reducing operational complexity while improving latency through co-located processing.

## Advanced Topics

### The Inference Pipeline

A complete inference request passes through multiple stages, each with distinct performance characteristics and optimization opportunities.

```mermaid
flowchart LR
    A[Prompt] --> B[Tokenize]
    B --> C[Prefill]
    C --> D[Decode Loop]
    D --> E[Detokenize]
    E --> F[Response]
```

The prefill phase processes all input tokens in parallel through the model's transformer layers, producing the KV cache and the first output token. The decode phase then generates tokens one at a time in an autoregressive loop, reading from and appending to the KV cache at each step. Prefill is compute-bound (matrix multiplications across the full input sequence), while decode is memory-bandwidth-bound (reading model weights for each single-token generation). Understanding this distinction is essential for choosing the right optimization strategy.

### PagedAttention

The KV cache is the primary memory bottleneck in LLM serving. Traditional implementations pre-allocate a contiguous block of GPU memory for each request's KV cache based on the maximum possible sequence length. This leads to significant memory waste: a request that generates 100 tokens still reserves memory for the full context window (e.g., 8,192 or 128,000 tokens).

PagedAttention, introduced by the vLLM project, applies virtual memory concepts from operating systems to KV cache management. Instead of allocating contiguous memory, it divides the KV cache into fixed-size blocks (pages) that are allocated on demand as new tokens are generated. Pages can be stored non-contiguously in GPU memory and mapped through a block table, similar to how a CPU's page table maps virtual addresses to physical memory.

The practical impact is substantial: PagedAttention reduces KV cache memory waste from 60-80% to near zero, enabling 2-4x more concurrent requests on the same GPU hardware. This directly translates to higher throughput and lower cost per token. PagedAttention also enables efficient memory sharing for techniques like parallel sampling and beam search, where multiple output sequences share the same input prefix.

### Prefix Caching

Many inference workloads involve repeated prefixes. Chat applications prepend the same system prompt to every request. [RAG](/learn/retrieval-augmented-generation) systems share common instructions and formatting templates. API endpoints serving the same application reuse the same tool definitions and context structures.

Prefix caching stores the KV cache entries for common prefixes in GPU memory so they don't need to be recomputed for each request. When a new request arrives with a matching prefix, the system copies the cached KV entries (or references them via PagedAttention's block table) and only computes the prefill for the unique portion of the prompt.

For workloads where the shared prefix constitutes 50-90% of the input (common in production applications with long system prompts), prefix caching can reduce time-to-first-token by a corresponding 50-90%. This optimization is especially impactful for [tool calling](/learn/llm-tool-calling) workloads where tool definitions are repeated across every request.

### Inference Serving Architectures

Production inference serving systems must balance throughput, latency, and cost across diverse workload patterns. Two architectural approaches have emerged.

**Model-parallel serving** distributes a single large model across multiple GPUs using tensor parallelism (splitting layers across GPUs) or pipeline parallelism (assigning different layers to different GPUs). Tensor parallelism reduces per-token latency by parallelizing the computation within each layer, while pipeline parallelism increases throughput by processing different requests at different pipeline stages simultaneously.

**Disaggregated serving** separates the prefill and decode phases onto different hardware. Prefill is compute-bound and benefits from high-FLOPS GPUs, while decode is memory-bandwidth-bound and benefits from GPUs with high memory bandwidth. By routing prefill and decode to hardware optimized for each phase, disaggregated architectures can improve overall cost-efficiency by 30-50% compared to running both phases on the same hardware. This pattern is gaining adoption in large-scale serving systems where the workload justifies the additional routing complexity.

<ContentRichText
  fields={{
    coverage: 'rc-end',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<AccordionFaq
  fields={{
    heading: 'LLM Inference FAQ',
    paragraph: '',
    items: [
      {
        title: 'What is the difference between LLM inference and training?',
        paragraph:
          "<p>Training adjusts a model's parameters by computing forward and backward passes over large datasets, typically requiring GPU clusters and running for weeks. Inference uses the trained, fixed parameters to generate output from a single input in milliseconds to seconds. Training is compute-bound; inference (particularly the decode phase) is memory-bandwidth-bound.</p>",
      },
      {
        title: 'What is the difference between TTFT and TPS?',
        paragraph:
          '<p>Time to First Token (TTFT) measures how long it takes to produce the first output token, dominated by processing the input prompt (the prefill phase). Tokens Per Second (TPS) measures how fast subsequent tokens are generated during the decode phase. A system can have low TTFT but moderate TPS, or vice versa; they are independent performance dimensions influenced by different bottlenecks.</p>',
      },
      {
        title: 'Does quantization significantly reduce output quality?',
        paragraph:
          '<p>INT8 quantization produces output that is nearly indistinguishable from full-precision (FP16) inference for most tasks, with minimal quality degradation. INT4 quantization introduces measurable quality loss, particularly on reasoning-heavy tasks, but enables running large models on significantly less hardware. Modern quantization methods (GPTQ, AWQ) minimize this loss by calibrating against representative data.</p>',
      },
      {
        title: 'When should I use local inference vs. a cloud API?',
        paragraph:
          '<p>Use cloud APIs when you need the largest models, want to avoid infrastructure management, or are prototyping. Use local inference when per-token cost, data privacy, or network latency are primary concerns. Many production systems use a hybrid approach: routing simple tasks to fast local models and complex tasks to large cloud models based on cost and quality requirements.</p>',
      },
      {
        title: 'How does embedding inference differ from text generation?',
        paragraph:
          '<p>Embedding inference produces a fixed-size vector representation of input text in a single forward pass: no autoregressive token generation, no sampling. This makes it significantly faster and more batch-friendly than generative inference. Embedding inference is used for semantic search, retrieval-augmented generation (RAG), classification, and clustering, while generative inference produces free-form text output.</p>',
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<ContentResourceFeatured
  fields={{
    heading: 'Learn more about LLM inference',
    paragraph:
      'Documentation and blog posts on serving LLM inference with Spice.',
    mode: 'default',
    resources: [
      {
        source: 'manual',
        resource: null,
        resource_manual: {
          eyebrow: 'Docs',
          title: {
            title: 'Spice AI Docs',
            url: 'https://spiceai.org/docs',
            target: '_blank',
          },
          description:
            'Learn how to serve LLM inference alongside federated SQL queries, embeddings, and tool calling in a single Spice runtime.',
          image: {
            ID: 1661,
            id: 1661,
            title: 'Docs jpeg',
            filename: 'Docs-jpeg.jpeg',
            filesize: 103192,
            url: '/website-assets/media/2025/12/Docs-jpeg.jpeg',
            link: '/docs-jpeg/',
            alt: '',
            author: '9',
            description: '',
            caption: '',
            name: 'docs-jpeg',
            status: 'inherit',
            uploaded_to: 0,
            date: '2025-12-05 04:13:53',
            modified: '2025-12-05 04:13:53',
            menu_order: 0,
            mime_type: 'image/jpeg',
            type: 'image',
            subtype: 'jpeg',
            icon: '/website-assets/media/default.png',
            width: 1832,
            height: 1036,
            sizes: {
              thumbnail: '/website-assets/media/2025/12/Docs-jpeg-150x150.jpeg',
              'thumbnail-width': 150,
              'thumbnail-height': 150,
              medium: '/website-assets/media/2025/12/Docs-jpeg-300x170.jpeg',
              'medium-width': 300,
              'medium-height': 170,
              medium_large:
                '/website-assets/media/2025/12/Docs-jpeg-768x434.jpeg',
              'medium_large-width': 768,
              'medium_large-height': 434,
              large: '/website-assets/media/2025/12/Docs-jpeg-1024x579.jpeg',
              'large-width': 1024,
              'large-height': 579,
              '1536x1536':
                '/website-assets/media/2025/12/Docs-jpeg-1536x869.jpeg',
              '1536x1536-width': 1536,
              '1536x1536-height': 869,
              '2048x2048': '/website-assets/media/2025/12/Docs-jpeg.jpeg',
              '2048x2048-width': 1832,
              '2048x2048-height': 1036,
            },
          },
        },
      },
      {
        source: 'picker',
        resource: [
          {
            title: "A Developer's Guide to Understanding Spice.ai",
            slug: '/blog/a-developers-guide-to-understanding-spice-ai',
            excerpt:
              'Learn what Spice.ai is, when to use it, and how it solves enterprise data challenges. A developer-focused guide to federation, acceleration, search, and AI.',
            image:
              '/website-assets/media/2026/02/A-developers-guide-to-understanding-Spice.ai_.png',
            type: 'Blog',
            taxonomy: ['Engineering', 'Spice AI'],
          },
        ],
        resource_manual: {
          eyebrow: '',
          title: null,
          description: '',
          image: false,
        },
      },
      {
        source: 'picker',
        resource: [
          {
            title:
              'The Spice.ai for GitHub Copilot Extension is now available!',
            slug: '/blog/spice-ai-for-github-copilot-extension-now-available',
            excerpt:
              'With the Spice.ai Extension, developers can interact with data from any external data source directly within GitHub Copilot.',
            image:
              '/website-assets/media/2025/11/671e8bd1c976b00f27838fb9_github-extension.webp',
            type: 'Blog',
            taxonomy: ['Spice AI', 'Spice OSS'],
          },
        ],
        resource_manual: {
          eyebrow: '',
          title: null,
          description: '',
          image: false,
        },
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<TalkToAnEngineerCta />

---

## What is LLM Tool Calling?
URL: https://spice.ai/learn/llm-tool-calling
Date: 2026-02-20T00:00:00
Description: LLM tool calling is a capability where a model outputs structured function calls instead of plain text, enabling AI agents to query databases, call APIs, and take actions. Learn how tool calling works, security considerations, and how MCP standardizes tool use.

<HeroCenteredText
  fields={{
    graphic_position: 'no-graphic',
    heading_tag: 'h1',
    heading: 'What is LLM Tool Calling?',
    paragraph:
      'LLM tool calling is a model capability where, instead of generating plain text, the model outputs a structured function call with a name and arguments, enabling AI applications to execute code, query databases, and interact with external systems.',
    cta: [
      {
        type: 'filled',
        cta: {
          title: 'See Spice MCP gateway',
          url: '/feature/mcp-server-gateway',
          target: '',
        },
      },
      {
        type: 'bordered',
        cta: {
          title: 'Read the docs',
          url: 'https://spiceai.org/docs/components/tools/mcp',
          target: '',
        },
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<ContentRichText
  fields={{
    coverage: 'rc-start',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

Large language models generate text. But text alone cannot query a database, send an email, read a file, or call an API. Tool calling bridges this gap by enabling a model to output structured function calls that an application can execute on the model's behalf.

Without tool calling, developers resort to prompt engineering: instructing the model to output JSON in a specific format, then parsing that output with custom code. This approach is fragile: the model might produce malformed JSON, hallucinate function names, or include extra text around the structured output. Tool calling formalizes this interaction, giving the model a typed interface for expressing "I want to call this function with these arguments."

Tool calling is the foundation of agentic AI. Every autonomous agent that plans, executes multi-step tasks, and interacts with the real world depends on the ability to invoke tools reliably and correctly.

## How Tool Calling Works

A tool calling interaction follows a defined loop between the application, the model, and external systems.

### Step 1: Define Available Tools

The application provides the model with a set of **tool definitions**, each specifying a name, description, and parameter schema. These definitions tell the model what tools are available and how to call them.

```json
{
  "tools": [
    {
      "name": "query_database",
      "description": "Execute a read-only SQL query against the application database",
      "parameters": {
        "type": "object",
        "properties": {
          "sql": {
            "type": "string",
            "description": "The SQL query to execute"
          }
        },
        "required": ["sql"]
      }
    },
    {
      "name": "search_documents",
      "description": "Search indexed documents using natural language",
      "parameters": {
        "type": "object",
        "properties": {
          "query": { "type": "string" },
          "limit": { "type": "integer", "default": 10 }
        },
        "required": ["query"]
      }
    }
  ]
}
```

The quality of tool definitions directly affects how well the model uses them. Clear, specific descriptions and well-typed parameter schemas reduce errors and hallucinated arguments.

### Step 2: Model Selects a Tool

Given the user's message and the available tool definitions, the model decides whether to respond with text or invoke a tool. If it chooses a tool, it outputs a structured object with the tool name and arguments:

```json
{
  "tool_call": {
    "name": "query_database",
    "arguments": {
      "sql": "SELECT customer_name, SUM(amount) as total FROM orders WHERE created_at > '2026-01-01' GROUP BY customer_name ORDER BY total DESC LIMIT 10"
    }
  }
}
```

The model does not execute the tool. It produces a structured request that the application interprets.

### Step 3: Application Executes the Tool

The application receives the tool call, validates the arguments, and executes the function. This is where security controls, rate limiting, and authorization checks are applied. The application, not the model, decides whether the tool call is safe to execute.

### Step 4: Result Fed Back to Model

The tool's output is sent back to the model as a new message in the conversation. The model then reasons about the result and either responds to the user with text or makes another tool call.

```json
{
  "role": "tool",
  "name": "query_database",
  "content": "[{\"customer_name\": \"Acme Corp\", \"total\": 142500}, {\"customer_name\": \"Globex\", \"total\": 98300}]"
}
```

This loop (tool call, execution, result, reasoning) can repeat multiple times in a single interaction, enabling multi-step workflows.

## The Multi-Step Tool Calling Loop

Simple questions need a single tool call. Complex tasks require multiple steps where the output of one tool informs the next. Consider a user asking: "Which of our enterprise customers had the highest support ticket volume last quarter, and what were the top issues?"

A capable agent might execute this sequence:

1. **Call `query_database`** to get enterprise customers from the CRM
2. **Call `query_database`** to get support tickets for those customers in the last quarter
3. **Call `query_database`** to aggregate tickets by issue category
4. **Reason** about the results and produce a summary

Each step depends on the previous step's output. The model plans the sequence, executes tools iteratively, and synthesizes the results into a coherent response. This multi-step reasoning is what distinguishes agentic tool use from simple function calling.

### Parallel Tool Calls

Some models support **parallel tool calling**, where multiple independent tools are invoked in a single turn. If the model needs both customer data and product data, it can issue both queries simultaneously rather than sequentially. This reduces round trips and improves latency in multi-step workflows.

## Tool Calling vs. Prompt Engineering for Structured Output

Before tool calling was widely available, developers extracted structured actions from models using prompt engineering:

```
You are a helpful assistant. When the user asks for data, respond with
a JSON object like: {"action": "query", "sql": "SELECT ..."}
Do not include any other text in your response.
```

This approach has several problems:

- **Unreliable formatting:** The model might include markdown code fences, explanatory text, or malformed JSON.
- **No schema validation:** There is no formal contract between the model's output and the expected structure.
- **Ambiguous intent:** The model might respond with text when a tool call was expected, or vice versa.
- **No tool discovery:** Adding new tools requires rewriting the system prompt rather than adding a typed definition.

Tool calling solves these problems by making function invocation a first-class capability of the model. The model produces typed, validated tool calls through a dedicated output channel, separate from text generation. This is more reliable, easier to maintain, and scales to dozens or hundreds of tools.

## How MCP Standardizes Tool Calling

The [Model Context Protocol (MCP)](/learn/model-context-protocol) standardizes how AI applications discover, connect to, and invoke tools across distributed servers. Without MCP, every AI application implements its own tool calling integration for each external service. MCP defines a universal protocol so a tool built once works with any MCP-compatible client.

MCP's contribution to tool calling is threefold:

**Discovery:** MCP servers expose tool manifests: machine-readable descriptions of available tools, their parameters, and their capabilities. An AI application connecting to an MCP server automatically discovers what tools are available without hardcoded configurations.

**Transport:** MCP defines how tool calls and results are transmitted between the AI application (client) and the tool provider (server), supporting both local execution (stdio) and remote execution (SSE over HTTP).

**Interoperability:** A tool exposed as an MCP server works with Claude, GitHub Copilot, Cursor, and any other MCP-compatible client. This eliminates the O(N x M) integration problem where N applications each need custom integrations for M tools.

## Tool Calling for Data Access

One of the most common tool calling patterns is giving AI models access to data through SQL queries, API calls, or search operations.

### SQL as a Tool

When a model has access to a `query_database` tool, it can answer data questions by writing and executing SQL. This is more flexible than pre-computed dashboards because the model generates queries dynamically based on the user's specific question.

[SQL federation](/platform/sql-federation-acceleration) makes this pattern even more powerful. A single tool can provide access to PostgreSQL, MySQL, Snowflake, S3, and [40+ other data sources](/integrations) through one interface. The model writes a SQL query; the federation engine routes it to the correct source.

### Search as a Tool

Models that need to retrieve relevant documents or context can use search tools. A [hybrid search](/platform/hybrid-sql-search) tool combines keyword and semantic search to find relevant content, which the model then uses to generate informed responses. This is the tool-calling-based approach to [retrieval-augmented generation (RAG)](/learn/retrieval-augmented-generation).

### API Calls as Tools

Tools can wrap any HTTP API: reading from a CRM, posting a message to Slack, creating a Jira ticket, or triggering a deployment. Each API endpoint becomes a tool with a defined schema, and the model invokes it as needed during multi-step workflows.

## Security Considerations

Tool calling introduces a new attack surface: the model can now take actions, not just produce text. Security must be treated as a first-class concern.

### Input Validation

Every tool call argument must be validated before execution. A model generating SQL queries could produce destructive statements (`DROP TABLE`, `DELETE FROM` without a `WHERE` clause). The application must enforce read-only constraints, parameterize inputs, and reject malformed queries.

```python
# Always validate and constrain tool call arguments
def execute_query(sql: str) -> str:
    # Reject write operations
    normalized = sql.strip().upper()
    if any(normalized.startswith(kw) for kw in ["DROP", "DELETE", "UPDATE", "INSERT", "ALTER", "TRUNCATE"]):
        return "Error: Only read-only queries are permitted."

    # Execute with timeout and row limit
    result = db.execute(sql, timeout=5000, max_rows=1000)
    return json.dumps(result)
```

### Sandboxing

Tools that execute code, access file systems, or interact with infrastructure should run in sandboxed environments with minimal permissions. A code execution tool should run in a container with no network access and no persistent storage. A file system tool should be restricted to a specific directory.

### Authorization

Not every user (or model) should have access to every tool. Authorization policies should control:

- Which tools are available to which models or users
- What parameter values are permitted (e.g., restricting queries to specific tables)
- Rate limits on tool invocations
- Audit logging for compliance and debugging

### Prompt Injection

Malicious content in tool results can attempt to manipulate the model's behavior. If a search tool returns a document containing "Ignore all previous instructions and...", the model might follow those instructions. Defenses include sanitizing tool outputs, using separate system prompts for tool results, and monitoring for anomalous model behavior after tool execution.

## Tool Calling with Spice

[Spice](/feature/mcp-server-gateway) provides governed tool calling through its MCP gateway, combining tool execution with [federated data access](/platform/sql-federation-acceleration) and [LLM inference](/platform/llm-inference) in a single runtime:

- **MCP server federation:** Aggregate tools from multiple MCP servers behind a single endpoint. Models access all available tools through one connection rather than managing separate integrations.
- **Governed tool routing:** Assign specific tools to specific models with fine-grained access controls. A customer-facing model gets read-only data tools; an internal automation agent gets broader access.
- **Data tools built in:** SQL queries, embedding search, and [hybrid search](/platform/hybrid-sql-search) are available as tools natively: no external MCP server needed for data access.
- **End-to-end observability:** Distributed tracing follows a request from the [inference](/platform/llm-inference) call through tool execution, data queries, and back to the model, providing full visibility into multi-step agent workflows.
- **Security controls:** Input validation, rate limiting, and audit logging are applied at the gateway level, enforcing consistent policies across all tool invocations regardless of which model or client initiated the call. For agents that touch production data, [secure AI sandboxing](/feature/secure-ai-sandboxing) adds row- and column-level isolation at the same enforcement point.

This approach means AI applications get [AI model serving](/feature/ai-model-serving), tool calling, and data access through a single, governed infrastructure layer, reducing complexity while maintaining the security controls that enterprise deployments require.

## Advanced Topics

### The Tool Calling Loop

In agentic workflows, tool calling is not a single request-response exchange. It is an iterative loop where the model reasons, invokes tools, processes results, and decides whether to continue or respond to the user.

```mermaid
sequenceDiagram
    participant User
    participant LLM
    participant Tools
    User->>LLM: User message + tool definitions
    loop Until LLM responds with text
        LLM->>Tools: Tool call (name + arguments)
        Tools->>LLM: Tool result
        Note over LLM: Reason about result
    end
    LLM->>User: Final text response
```

Understanding the mechanics of this loop (and the failure modes at each step) is essential for building reliable agent systems.

### Parallel Tool Calls

When the model needs data from multiple independent sources, sequential tool calls introduce unnecessary latency. Parallel tool calling enables the model to emit multiple tool call requests in a single turn, which the application executes concurrently and returns as a batch.

Consider an agent asked: "Compare our Q1 revenue against the industry benchmark and check if any support escalations are open." The model can issue a `query_revenue` call and a `check_escalations` call simultaneously. The application runs both, returns both results, and the model synthesizes a single response.

Not all models support parallel tool calls natively. For models that do (including Claude and GPT-4), the tool call response contains an array of calls rather than a single call. The application must match each result back to the correct call ID when returning results. For models that don't support parallel calls, the application can implement a planning layer that detects independent tool calls across sequential turns and executes them concurrently, returning results in a single batch.

Parallel tool calls reduce round trips and end-to-end latency proportionally to the number of independent calls. In multi-step agent workflows with 3-5 independent data lookups, parallel execution can cut total latency by 60-80%.

### Tool Call Chaining and Planning

Complex tasks require the model to plan a sequence of tool calls where each step depends on the output of the previous one. This is tool call chaining: the model decomposes a high-level objective into an ordered sequence of tool invocations.

A user asking "Find the customer with the highest churn risk and draft a retention email based on their recent activity" requires:

1. Call `query_database` to retrieve churn risk scores
2. Call `query_database` to fetch the top customer's recent activity
3. Call `send_email` (or draft the email in text) based on the activity data

The model must plan this chain, execute each step, validate intermediate results, and adjust the plan if unexpected data appears (e.g., the highest-risk customer has no recent activity on record).

Effective chaining depends on the model's ability to maintain a coherent plan across multiple turns. Providing the model with explicit planning instructions in the system prompt ("Think step by step about what information you need before taking action") improves chaining reliability. Some frameworks (like LangChain's plan-and-execute pattern) formalize this by having the model output an explicit plan before executing any tools.

### Error Recovery Patterns

Tool calls fail. Databases time out, APIs return errors, arguments are malformed, and rate limits are hit. A robust tool calling system needs strategies for handling these failures gracefully.

**Retry with backoff** is the simplest pattern: if a tool call returns a transient error (timeout, rate limit, 503), the application retries with exponential backoff before returning a permanent failure to the model. The model should not be responsible for implementing retry logic; this is an application-layer concern.

**Fallback tools** provide alternative paths when the primary tool fails. If a real-time API is unavailable, the application can fall back to a cached data source or a different API that provides approximate data. The model receives the result with a note that it came from a fallback source.

**Graceful degradation** means the model explains what it could not do rather than failing silently. If a tool call fails after retries and no fallback is available, the model should report the specific failure ("I wasn't able to retrieve the latest revenue data because the database connection timed out") and offer what it can provide from the context it has. This is preferable to hallucinating an answer or returning a generic error message.

Error context matters: when returning a tool failure to the model, include the error type, a human-readable message, and whether the error is transient or permanent. This gives the model enough information to decide whether to retry, use an alternative approach, or report the issue to the user.

<ContentRichText
  fields={{
    coverage: 'rc-end',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<AccordionFaq
  fields={{
    heading: 'Tool Calling FAQ',
    paragraph: '',
    items: [
      {
        title:
          'What is the difference between tool calling and function calling?',
        paragraph:
          '<p>Tool calling and function calling refer to the same capability: the model outputs a structured function invocation instead of plain text. "Function calling" was the original term used by OpenAI; "tool calling" is the more general term adopted across the industry. MCP and most frameworks use "tool calling" to describe this capability.</p>',
      },
      {
        title: 'How does the model decide which tool to use?',
        paragraph:
          "<p>The model selects tools based on the user's message, the conversation history, and the tool definitions (name, description, parameter schema) provided by the application. Clear, specific tool descriptions are critical; they help the model match user intent to the correct tool. When multiple tools could apply, the model uses the descriptions and parameter schemas to choose the best fit.</p>",
      },
      {
        title: 'What are the security risks of tool calling?',
        paragraph:
          '<p>Tool calling allows models to take actions, not just produce text, which introduces risks: SQL injection through generated queries, unauthorized access to sensitive APIs, destructive operations (deleting data, modifying configurations), and prompt injection through tool results. Mitigations include input validation, read-only constraints, sandboxed execution, authorization policies, and audit logging.</p>',
      },
      {
        title:
          'How does tool calling differ from retrieval-augmented generation (RAG)?',
        paragraph:
          "<p>RAG retrieves relevant documents and injects them into the model's context before generation. Tool calling lets the model invoke arbitrary functions, which can include retrieval, but also database queries, API calls, code execution, and actions. Tool calling is more general: RAG is one pattern that can be implemented through tool calling (a search tool), but tool calling supports many other patterns beyond retrieval.</p>",
      },
      {
        title: 'Can a model use multiple tools in a single interaction?',
        paragraph:
          '<p>Yes. Models can make sequential tool calls where the output of one tool informs the next, enabling multi-step workflows. Some models also support parallel tool calling, where multiple independent tools are invoked simultaneously in a single turn. Multi-step tool use is the foundation of agentic AI, where models plan and execute complex tasks autonomously.</p>',
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<ContentResourceFeatured
  fields={{
    heading: 'Learn more about tool calling',
    paragraph:
      'Documentation and blog posts on enabling governed tool calling with Spice.',
    mode: 'default',
    resources: [
      {
        source: 'manual',
        resource: null,
        resource_manual: {
          eyebrow: 'Docs',
          title: {
            title: 'MCP Server & Gateway Docs',
            url: 'https://spiceai.org/docs/components/tools/mcp',
            target: '_blank',
          },
          description:
            'Learn how to expose tools through MCP servers, federate them through the Spice gateway, and apply governance policies to tool invocations.',
          image: {
            ID: 1661,
            id: 1661,
            title: 'Docs jpeg',
            filename: 'Docs-jpeg.jpeg',
            filesize: 103192,
            url: '/website-assets/media/2025/12/Docs-jpeg.jpeg',
            link: '/docs-jpeg/',
            alt: '',
            author: '9',
            description: '',
            caption: '',
            name: 'docs-jpeg',
            status: 'inherit',
            uploaded_to: 0,
            date: '2025-12-05 04:13:53',
            modified: '2025-12-05 04:13:53',
            menu_order: 0,
            mime_type: 'image/jpeg',
            type: 'image',
            subtype: 'jpeg',
            icon: '/website-assets/media/default.png',
            width: 1832,
            height: 1036,
            sizes: {
              thumbnail: '/website-assets/media/2025/12/Docs-jpeg-150x150.jpeg',
              'thumbnail-width': 150,
              'thumbnail-height': 150,
              medium: '/website-assets/media/2025/12/Docs-jpeg-300x170.jpeg',
              'medium-width': 300,
              'medium-height': 170,
              medium_large:
                '/website-assets/media/2025/12/Docs-jpeg-768x434.jpeg',
              'medium_large-width': 768,
              'medium_large-height': 434,
              large: '/website-assets/media/2025/12/Docs-jpeg-1024x579.jpeg',
              'large-width': 1024,
              'large-height': 579,
              '1536x1536':
                '/website-assets/media/2025/12/Docs-jpeg-1536x869.jpeg',
              '1536x1536-width': 1536,
              '1536x1536-height': 869,
              '2048x2048': '/website-assets/media/2025/12/Docs-jpeg.jpeg',
              '2048x2048-width': 1832,
              '2048x2048-height': 1036,
            },
          },
        },
      },
      {
        source: 'picker',
        resource: [
          {
            title:
              'The Spice.ai for GitHub Copilot Extension is now available!',
            slug: '/blog/spice-ai-for-github-copilot-extension-now-available',
            excerpt:
              'With the Spice.ai Extension, developers can interact with data from any external data source directly within GitHub Copilot.',
            image:
              '/website-assets/media/2025/11/671e8bd1c976b00f27838fb9_github-extension.webp',
            type: 'Blog',
            taxonomy: ['Spice AI', 'Spice OSS'],
          },
        ],
        resource_manual: {
          eyebrow: '',
          title: null,
          description: '',
          image: false,
        },
      },
      {
        source: 'picker',
        resource: [
          {
            title: "A Developer's Guide to Understanding Spice.ai",
            slug: '/blog/a-developers-guide-to-understanding-spice-ai',
            excerpt:
              'Learn what Spice.ai is, when to use it, and how it solves enterprise data challenges. A developer-focused guide to federation, acceleration, search, and AI.',
            image:
              '/website-assets/media/2026/02/A-developers-guide-to-understanding-Spice.ai_.png',
            type: 'Blog',
            taxonomy: ['Engineering', 'Spice AI'],
          },
        ],
        resource_manual: {
          eyebrow: '',
          title: null,
          description: '',
          image: false,
        },
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<TalkToAnEngineerCta />

---

## Managed Apache DataFusion: Federated SQL at Scale
URL: https://spice.ai/learn/managed-apache-datafusion
Date: 2026-04-15T00:00:00
Description: Managed Apache DataFusion provides federated SQL across heterogeneous systems with centralized operations, query optimization, and production controls. Learn how it works and when to use it.

<HeroCenteredText
  fields={{
    graphic_position: 'no-graphic',
    heading_tag: 'h1',
    heading: 'Managed Apache DataFusion: Federated SQL at Scale',
    paragraph:
      'Managed Apache DataFusion is an operational model where teams use DataFusion as the query core while a platform handles source connectivity, federation planning, acceleration policies, and runtime reliability.',
    cta: [
      {
        type: 'filled',
        cta: {
          title: 'See SQL federation and acceleration',
          url: '/platform/sql-federation-acceleration',
          target: '',
        },
      },
      {
        type: 'bordered',
        cta: {
          title: 'Read the docs',
          url: 'https://spiceai.org/docs',
          target: '_blank',
        },
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<ContentRichText
  fields={{
    coverage: 'rc-start',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

Teams rarely struggle with writing SQL itself. The harder problem is operating SQL across many systems with different dialects, latency profiles, and reliability characteristics. Managed Apache DataFusion addresses that operational gap by combining DataFusion's embeddable query engine with platform-level controls for connectors, pushdown, cache freshness, fallback behavior, and multi-tenant execution.

At a high level, this model keeps the parts DataFusion does best: parsing, logical planning, optimization, and execution in Rust, while shifting operational complexity into a managed control plane. This matters when a single workload must query PostgreSQL, Snowflake, S3, and streams through one query layer, while still meeting isolation, reliability, and cost constraints.

For a practical implementation walkthrough, see [How we use Apache DataFusion at Spice AI](/blog/how-we-use-apache-datafusion-at-spice-ai). For the product-level architecture and deployment model, see [SQL federation and acceleration](/platform/sql-federation-acceleration).

## Why Teams Choose Managed DataFusion

Most teams evaluating DataFusion can ship a prototype quickly. The challenge appears later, when they need to run federated SQL continuously in production.

Common pressure points include:

- Connector lifecycle management across many source systems and credentials.
- Cross-source query planning where each backend has different SQL capabilities.
- Freshness controls for accelerated datasets and fallback behavior on cache misses.
- Multi-tenant safeguards to keep policies, workload isolation, and routing consistent.
- Operational visibility for query failures, retries, and performance regressions.

A managed approach packages these concerns into repeatable platform behavior. Instead of every application team implementing the same engine-level controls, they reuse a common runtime with centralized policy.

## What Managed Apache DataFusion Includes

Managed DataFusion is not a separate SQL language. It is a runtime and operations model layered around DataFusion's extension points.

### Federated SQL Across Heterogeneous Sources

DataFusion provides the planning pipeline. Managed platforms implement source adapters and table providers that expose remote systems as queryable tables. This allows one query to span databases, warehouses, object storage, and streams through the same interface.

In practice, federated execution depends on two paths:

- Push work down to each source when possible to reduce data movement.
- Merge or post-process results locally when a query spans multiple systems.

For a detailed background on federation mechanics, see [SQL federation](/learn/sql-federation).

### Optimizer and Pushdown Management

Managed DataFusion systems usually add analyzer and optimizer rules that are specific to federation. These rules decide which filters, projections, and aggregates are safe to run at the source versus locally.

This is one reason teams adopt managed offerings: optimizer behavior becomes part of platform configuration rather than ad hoc logic in each application.

### Acceleration and Freshness Controls

Many production workloads combine federation with local acceleration to improve latency. Managed runtimes configure refresh policy (for example, append or CDC-based updates), stale-read policy, and fallback behavior in one place.

This pattern aligns with [real-time change data capture](/feature/real-time-change-data-capture) and [data lake acceleration](/use-case/datalake-accelerator) use cases where freshness and response time both matter.

### SQL-Embedded Search and AI Operators

DataFusion's UDF and table-function model allows platforms to expose search and AI capabilities inside SQL. Managed systems can register these functions consistently and enforce governance controls around model access, execution cost, and tenancy.

This is how teams combine [hybrid SQL search](/platform/hybrid-sql-search) and [LLM inference](/platform/llm-inference) with federated data access inside a single query workflow.

## How DataFusion Enables the Managed Model

The Apache DataFusion architecture makes this operational model practical because its core interfaces are designed to be extended.

### Query Pipeline

DataFusion executes a stable pipeline:

`SQL -> AST -> Logical Plan -> Optimizer -> Physical Plan -> Execution -> Arrow results`

Managed platforms can attach custom behavior at each stage, including:

- Table providers for source registration.
- Analyzer and optimizer rules for federated rewrites.
- Execution operators for fallback, schema casting, and runtime policies.

### Extension Points That Matter in Production

DataFusion's `TableProvider`, `OptimizerRule`, `ExecutionPlan`, and UDF interfaces are the primary hooks for managed behavior.

This is reflected in Spice's implementation approach described in [How we use Apache DataFusion at Spice AI](/blog/how-we-use-apache-datafusion-at-spice-ai), where federation, acceleration, search, and AI behaviors are implemented in the planner and runtime rather than bolted on externally.

### Managed Execution Topology

The architecture below shows a common managed pattern for federated SQL at scale.

```mermaid
flowchart LR
    Q[Application Query] --> R[Managed DataFusion Runtime]
    R --> P[Planner and Optimizer Rules]
    P --> S1[(PostgreSQL)]
    P --> S2[(Snowflake)]
    P --> S3[(S3 and Iceberg)]
    P --> C[(Local Acceleration Cache)]
    S1 --> M[Merge and Final Operators]
    S2 --> M
    S3 --> M
    C --> M
    M --> O[Arrow Results]
```

## Managed vs Self-Managed DataFusion

Both approaches can work. The decision depends on team shape, operational maturity, and workload requirements.

| Dimension | Self-managed DataFusion | Managed DataFusion |
|---|---|---|
| Initial flexibility | Highest, full custom control | High, within platform extension model |
| Time to production | Slower for most teams | Faster for most teams |
| Connector operations | Built and maintained in-house | Centralized and standardized |
| Federated optimizer behavior | Team-specific implementation | Platform-level governance |
| Runtime reliability features | Team builds fallback and recovery | Included as managed capabilities |
| Multi-tenant controls | Custom policy implementation | Built-in policy and routing patterns |

Teams that already run a mature query platform may prefer full control. Teams focused on product delivery often prefer managed execution so data access does not become a long-running infrastructure project.

## Advanced Topics

### Dialect Translation and Function Rewrites

Federated SQL is not only about connectivity. It requires dialect-aware plan rewriting. A single logical expression may need source-specific SQL forms to run correctly across PostgreSQL, Snowflake, and other engines. Managed platforms maintain these translation layers as part of runtime compatibility.

This is also where function mapping matters. For example, semantic equivalents of random, regexp, or distance functions can vary by backend. Keeping those mappings in a managed planner avoids query portability drift across teams.

### Multi-Source Query Splitting

When a query joins data from multiple systems, managed federation planners usually split the query into per-source subqueries, push source-compatible operations down, and run cross-source join or union stages locally. The quality of this split directly affects network cost and latency.

A mature managed implementation tracks pushdown boundaries explicitly, so teams can reason about where compute occurred and tune policies over time.

### Runtime Reliability Patterns

Reliable federated execution requires more than successful planning. Managed DataFusion systems generally include deferred connection handling, schema-cast operators, and fallback operators that keep query behavior predictable when sources are slow or temporarily unavailable.

These patterns reduce the operational blast radius of transient source failures and help maintain service-level objectives for applications and agents.

## Managed Apache DataFusion with Spice

Spice uses Apache DataFusion as the query core and extends it with connector table providers, federated planning rules, acceleration controls, and SQL operators for search and AI workloads. This enables one query layer across [40+ integrations](/integrations) while preserving flexibility around source pushdown and local execution.

For teams evaluating this model, start with [SQL federation and acceleration](/platform/sql-federation-acceleration), [hybrid SQL search](/platform/hybrid-sql-search), [LLM inference](/platform/llm-inference), and [Spice pricing](/pricing).

<ContentRichText
  fields={{
    coverage: 'rc-end',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<AccordionFaq
  fields={{
    heading: 'Managed Apache DataFusion FAQ',
    paragraph: '',
    items: [
      {
        title: 'What is managed Apache DataFusion?',
        paragraph:
          '<p>Managed Apache DataFusion is an operational model where DataFusion provides SQL planning and execution while a platform manages connectors, federation rules, acceleration policy, reliability controls, and tenant-aware runtime operations.</p>',
      },
      {
        title: 'How is managed DataFusion different from running DataFusion directly?',
        paragraph:
          '<p>Running DataFusion directly gives maximum implementation control but requires teams to build and operate source adapters, optimizer policies, and runtime safeguards themselves. Managed DataFusion centralizes those responsibilities so application teams can focus on product workloads instead of engine operations.</p>',
      },
      {
        title: 'Can managed DataFusion query multiple systems in one SQL statement?',
        paragraph:
          '<p>Yes. Managed DataFusion platforms typically use custom table providers and federation analyzers to split cross-source plans into per-source subqueries, push down compatible operations, and combine results locally when needed.</p>',
      },
      {
        title: 'How does managed DataFusion handle freshness and low latency together?',
        paragraph:
          '<p>Most managed implementations combine source federation with local acceleration and configurable refresh policies. Hot datasets can be served from local acceleration while freshness is maintained through scheduled or CDC-based refresh modes.</p>',
      },
      {
        title: 'When should a team choose managed DataFusion?',
        paragraph:
          '<p>Managed DataFusion is typically the better fit when teams need federated SQL across many systems, multi-tenant controls, and reliable production behavior without building a query platform from scratch.</p>',
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<ContentResourceFeatured
  fields={{
    heading: 'Learn more about managed DataFusion',
    paragraph:
      'Explore technical resources on Apache DataFusion, federation planning, and production runtime patterns.',
    mode: 'default',
    resources: [
      {
        source: 'manual',
        resource: null,
        resource_manual: {
          eyebrow: 'Docs',
          title: {
            title: 'Spice.ai OSS Documentation',
            url: 'https://spiceai.org/docs',
            target: '_blank',
          },
          description:
            'Reference architecture and runtime configuration for federation, acceleration, and AI-enabled SQL workflows.',
          image: {
            ID: 1661,
            id: 1661,
            title: 'Docs jpeg',
            filename: 'Docs-jpeg.jpeg',
            filesize: 103192,
            url: '/website-assets/media/2025/12/Docs-jpeg.jpeg',
            link: '/docs-jpeg/',
            alt: '',
            author: '9',
            description: '',
            caption: '',
            name: 'docs-jpeg',
            status: 'inherit',
            uploaded_to: 0,
            date: '2025-12-05 04:13:53',
            modified: '2025-12-05 04:13:53',
            menu_order: 0,
            mime_type: 'image/jpeg',
            type: 'image',
            subtype: 'jpeg',
            icon: '/website-assets/media/default.png',
            width: 1832,
            height: 1036,
            sizes: {
              thumbnail: '/website-assets/media/2025/12/Docs-jpeg-150x150.jpeg',
              'thumbnail-width': 150,
              'thumbnail-height': 150,
              medium: '/website-assets/media/2025/12/Docs-jpeg-300x170.jpeg',
              'medium-width': 300,
              'medium-height': 170,
              medium_large:
                '/website-assets/media/2025/12/Docs-jpeg-768x434.jpeg',
              'medium_large-width': 768,
              'medium_large-height': 434,
              large: '/website-assets/media/2025/12/Docs-jpeg-1024x579.jpeg',
              'large-width': 1024,
              'large-height': 579,
              '1536x1536':
                '/website-assets/media/2025/12/Docs-jpeg-1536x869.jpeg',
              '1536x1536-width': 1536,
              '1536x1536-height': 869,
              '2048x2048': '/website-assets/media/2025/12/Docs-jpeg.jpeg',
              '2048x2048-width': 1832,
              '2048x2048-height': 1036,
            },
          },
        },
      },
      {
        source: 'picker',
        resource: [
          {
            title: 'How we use Apache DataFusion at Spice AI',
            slug: '/blog/how-we-use-apache-datafusion-at-spice-ai',
            excerpt:
              'A technical overview of how Spice extends Apache DataFusion with custom table providers, optimizer rules, and UDFs.',
            image:
              '/website-assets/media/2026/01/Engineering-at-Spice-AI-Apache-DataFusion.png',
            type: 'Blog',
            taxonomy: ['SQL Federation', 'Engineering'],
          },
        ],
        resource_manual: {
          eyebrow: '',
          title: null,
          description: '',
          image: false,
        },
      },
      {
        source: 'picker',
        resource: [
          {
            title: 'Contribution of TableProviders to DataFusion',
            slug: '/blog/contribution-of-tableproviders-to-datafusion',
            excerpt:
              'How Spice contributes table providers to Apache DataFusion and why connector abstractions matter for federated SQL.',
            image: '/website-assets/media/2025/11/ExternalLinkImage.png',
            type: 'Blog',
            taxonomy: ['Engineering'],
          },
        ],
        resource_manual: {
          eyebrow: '',
          title: null,
          description: '',
          image: false,
        },
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<TalkToAnEngineerCta />

---

## What is the Model Context Protocol (MCP)?
URL: https://spice.ai/learn/model-context-protocol
Date: 2026-02-25T00:00:00
Description: The Model Context Protocol (MCP) is an open standard for connecting AI models to external data and tools. Learn how MCP works, its architecture, and how MCP servers enable agentic AI.

<HeroCenteredText
  fields={{
    graphic_position: 'no-graphic',
    heading_tag: 'h1',
    heading: 'What is the Model Context Protocol?',
    paragraph:
      'The Model Context Protocol (MCP) is an open standard that defines how AI models discover, authenticate with, and invoke external tools and data sources, replacing custom integrations with a standardized, interoperable protocol.',
    cta: [
      {
        type: 'filled',
        cta: {
          title: 'See Spice MCP gateway',
          url: '/feature/mcp-server-gateway',
          target: '',
        },
      },
      {
        type: 'bordered',
        cta: {
          title: 'Read the docs',
          url: 'https://spiceai.org/docs/components/tools/mcp',
          target: '',
        },
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<ContentRichText
  fields={{
    coverage: 'rc-start',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

AI models are increasingly expected to do more than generate text. They query databases, read files, call APIs, search the web, and execute code. Each of these capabilities requires the model to interact with an external system, and until recently, every integration was custom.

An AI coding assistant that needs to read your project files requires one integration. If it also needs to search Jira tickets, that's a second integration with completely different authentication, error handling, and response formatting. Adding GitHub, Slack, or a database means building and maintaining yet more custom code.

The Model Context Protocol (MCP) standardizes this. MCP defines a universal interface between AI applications and the external tools and data sources they need. Instead of building custom integrations for each service, developers implement the MCP server specification once, and any MCP-compatible AI client can discover and use those tools.

## MCP Architecture

MCP follows a client-server architecture with three core concepts: servers, clients, and transports.

### MCP Servers

An MCP server is a process that exposes capabilities to AI models through a standardized interface. A server can expose three types of capabilities:

**Tools** are functions that an AI model can invoke. A database query tool accepts a SQL string and returns results. A file system tool reads or writes files. A Slack tool sends messages to channels. Each tool has a defined name, description, and parameter schema that the AI model uses to understand what the tool does and how to call it.

**Resources** are data that a model can read. A project's file tree, a database schema, or a configuration file can be exposed as MCP resources. Unlike tools, resources are read-only: the model accesses them for context but doesn't invoke them to perform actions.

**Prompts** are reusable templates that structure how a model interacts with the server. A code review prompt might define how the model should analyze a pull request; a data analysis prompt might structure how the model should query and interpret results.

### MCP Clients

AI applications act as MCP clients. The client discovers available servers, reads their capability manifests (what tools, resources, and prompts they expose), and orchestrates interactions between the AI model and servers.

When the model decides to use a tool, the client handles:

1. **Discovery:** Querying available servers to find a tool that matches the model's intent
2. **Parameter construction:** Formatting the model's requested parameters according to the tool's schema
3. **Invocation:** Sending the request to the correct server over the configured transport
4. **Response handling:** Parsing the result and feeding it back to the model for further reasoning

### Transport Layer

MCP supports two transport mechanisms that determine how clients and servers communicate:

**stdio (Standard I/O)** is for local execution. The MCP server runs as a subprocess of the client application, and they communicate over stdin/stdout. This is the simplest setup: no networking, no authentication, minimal latency. Most development tools and IDE integrations use stdio transport.

**SSE (Server-Sent Events) over HTTP** is for remote execution. The MCP server runs on separate infrastructure and the client connects over HTTP. SSE enables distributed architectures where MCP servers are hosted centrally and shared across multiple clients, teams, or applications.

The transport choice determines the deployment model: stdio for local, single-user tools; SSE for shared, enterprise-grade infrastructure.

## Why MCP Matters

### Before MCP: Custom Integrations Everywhere

Before MCP, connecting an AI model to a new data source or tool required custom code for each combination of AI application and external service. A team using Claude, ChatGPT, and a custom AI agent would need three separate integrations for the same database, each with its own authentication, error handling, and response parsing logic.

This approach doesn't scale. Every new AI application or tool requires O(N x M) integrations (N applications x M tools) rather than O(N + M) with a shared standard.

### After MCP: Build Once, Use Everywhere

With MCP, a tool integration is built once as an MCP server and works with any MCP-compatible client. A PostgreSQL MCP server works with Claude, GitHub Copilot, Cursor, and custom AI agents (no modification needed for each client).

This changes the economics of AI tool integration. Instead of every team building its own connectors, a shared ecosystem of MCP servers emerges. Open-source MCP servers already exist for dozens of common services: databases, file systems, GitHub, Slack, Jira, Google Drive, and more.

### Agentic AI Workflows

AI agents (models that plan and execute multi-step tasks autonomously) need reliable, discoverable access to tools. An agent that's asked to "analyze our sales pipeline and email a summary to the VP" needs to:

1. Query the CRM database for pipeline data
2. Run analytical queries across historical data
3. Generate a formatted summary
4. Send an email through the organization's email system

MCP provides the standardized discovery and invocation layer that makes this possible. The agent discovers available tools, reads their schemas to understand parameters, invokes them in sequence, and handles results, all through a uniform protocol.

### Security and Governance

In enterprise environments, giving AI models unrestricted access to tools and data creates security and compliance risks. MCP enables centralized governance:

- **Access control:** Define which models can invoke which tools, with what parameters, under what conditions
- **Audit logging:** Record every tool invocation for compliance and debugging
- **Rate limiting:** Prevent AI models from overwhelming external services
- **Data masking:** Filter sensitive information from tool responses before they reach the model

These controls are especially important in regulated industries like [financial services](/industry/financial-services) and [cybersecurity](/industry/cybersecurity) where AI access to data must be governed and auditable.

## MCP Servers in Practice

### Database Access

An MCP server wrapping a database (PostgreSQL, MySQL, Snowflake) exposes tools for executing queries and resources for reading schema information. The AI model can discover the database schema, write SQL queries, and execute them, all through the MCP interface.

With [SQL federation](/learn/sql-federation), a single MCP server can provide access to multiple databases simultaneously, so the AI model queries any connected source through one interface.

### Developer Tools

IDE integrations (VS Code, JetBrains, Cursor) use MCP to give AI coding assistants access to:

- **Project files:** Reading and writing source code
- **Build systems:** Running tests, compiling code, checking linting
- **Version control:** Viewing diffs, creating branches, committing changes
- **Documentation:** Searching API docs, reading README files, accessing style guides

The AI assistant discovers these capabilities through MCP and uses them as needed during coding tasks.

### Enterprise MCP Gateways

As organizations deploy more MCP servers, managing them individually becomes unwieldy. An **MCP gateway** sits between clients and servers, providing:

- **Federation:** Multiple MCP servers behind a single endpoint
- **Centralized auth:** One authentication point for all tool access
- **Observability:** Distributed tracing across all MCP interactions
- **Load balancing:** Routing requests across server replicas

This gateway pattern is how MCP scales from individual developer tools to enterprise-wide AI infrastructure.

## MCP vs. Function Calling

Function calling is a model-level capability where the AI generates structured arguments for predefined functions. MCP is a protocol that standardizes how models discover, connect to, and invoke those functions across distributed servers.

Think of it this way: function calling defines the "what" (the model wants to call a function with these arguments), and MCP defines the "how" (discovering the function, routing the request to the right server, handling authentication, and returning results).

They're complementary layers. Function calling without MCP means custom integration code for every tool. MCP without function calling means the model can't express tool-use intent. Together, they create a complete system for AI-tool interaction.

## MCP with Spice

[Spice](/feature/mcp-server-gateway) functions as an enterprise MCP gateway, federating distributed MCP servers with:

- **Internal and remote hosting:** Run stdio-based tools locally for low-latency or federate to remote servers over SSE
- **Governed tool routing:** Dynamically assign tools to specific models with fine-grained access controls
- **Hybrid data access:** Combine MCP tool results with [federated SQL queries](/learn/sql-federation), embeddings, and [hybrid search](/platform/hybrid-sql-search) in a single runtime
- **Distributed tracing:** Full visibility into execution paths across MCP servers, models, and data sources

This means AI applications get tool access, data access, and query capabilities through a single, governed infrastructure layer.

## Advanced Topics

### MCP Transport Protocols in Depth

The choice of transport protocol determines how MCP clients and servers communicate, and each transport has implications for latency, scalability, and security.

**stdio** runs the MCP server as a child process of the client. Communication happens over stdin and stdout using JSON-RPC 2.0 messages. This transport has near-zero latency (no network overhead), strong process isolation, and simple lifecycle management: the server starts and stops with the client. The limitation is that stdio servers cannot be shared across multiple clients or machines. Each client spawns its own server instance.

**Streamable HTTP** (which supersedes the earlier SSE-only transport) uses HTTP POST for client-to-server messages and Server-Sent Events for server-to-client streaming. This enables remote deployment where MCP servers run on dedicated infrastructure and clients connect over the network. Streamable HTTP supports standard HTTP infrastructure: load balancers, TLS termination, API gateways, and authentication middleware. The tradeoff is network latency (typically 1-50ms per round trip) and the need for explicit authentication and authorization.

For enterprise deployments, the Streamable HTTP transport is necessary. Multiple AI applications across an organization can connect to centrally managed MCP servers. When combined with a gateway, this creates a hub-and-spoke architecture where tool governance is centralized regardless of which client initiates the request.

### Capability Negotiation

When an MCP client connects to a server, the first exchange is a capability negotiation. The client sends an `initialize` request declaring its protocol version and supported features. The server responds with its own capabilities: which of the three primitives (tools, resources, prompts) it supports, whether it supports change notifications, and any server-specific metadata.

This negotiation serves two purposes. First, it ensures version compatibility: a client can detect if a server uses an unsupported protocol version and fail gracefully. Second, it enables feature discovery. A client connecting to an unknown server learns exactly what the server offers without hardcoded assumptions. If a server only exposes resources (no tools), the client knows not to send tool invocation requests.

Capability negotiation also supports **change notifications**. A server that declares support for `tools/listChanged` can notify the client when its tool set changes at runtime (for example, when a new database table is added or a new API endpoint becomes available). The client refreshes its tool manifest without requiring a restart or reconnection. This dynamic discovery is critical for long-running agent systems that need to adapt to evolving tool landscapes.

### Gateway Patterns

```mermaid
flowchart TD
    C1[AI Client A] --> G[MCP Gateway]
    C2[AI Client B] --> G
    C3[AI Client C] --> G
    G --> S1[Database MCP Server]
    G --> S2[Search MCP Server]
    G --> S3[API MCP Server]
    G --> S4[File System MCP Server]
```

As organizations deploy dozens of MCP servers, managing direct client-to-server connections becomes impractical. An MCP gateway sits between clients and servers, aggregating tools from multiple servers behind a single endpoint.

The gateway pattern provides several architectural benefits. **Tool aggregation** combines tools from all downstream servers into a unified manifest. A client sees one tool list regardless of how many servers provide those tools. **Centralized authentication** means each client authenticates once with the gateway rather than managing credentials for every downstream server. **Access control policies** are enforced at the gateway level: an AI model used for customer support gets access to knowledge base tools but not to deployment or financial tools, regardless of what the underlying servers expose.

**Observability** is another key benefit. The gateway is the single point through which all [tool calls](/learn/llm-tool-calling) pass, making it the natural place to implement distributed tracing, latency monitoring, and usage metrics. When a multi-step agent workflow spans five tool calls across three servers, the gateway can trace the entire execution path and measure end-to-end performance.

Gateway architectures also enable **tool versioning and migration**. When a tool's implementation changes (for example, migrating a database query tool from one backend to another), the gateway can route requests to the new implementation without any client changes. This decouples tool consumers (AI applications) from tool providers (MCP servers), enabling independent evolution of both sides.

<ContentRichText
  fields={{
    coverage: 'rc-end',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<AccordionFaq
  fields={{
    heading: 'MCP FAQ',
    paragraph: '',
    items: [
      {
        title: 'What is the difference between MCP and function calling?',
        paragraph:
          '<p>Function calling is a model-level capability where the AI generates structured arguments for predefined functions. MCP is a protocol that standardizes how models discover, connect to, and invoke those functions across distributed servers. MCP builds on function calling by standardizing the discovery, transport, and execution layer, so tools are interoperable across AI applications rather than hardcoded into each one.</p>',
      },
      {
        title: 'What is an MCP server?',
        paragraph:
          '<p>An MCP server is a process that exposes tools, resources, and prompts through the Model Context Protocol. It can run locally as a subprocess (using stdio transport) or remotely over HTTP with Server-Sent Events (SSE). Examples include MCP servers for databases, file systems, and SaaS APIs like GitHub, Slack, and Jira.</p>',
      },
      {
        title: 'What is an MCP gateway?',
        paragraph:
          '<p>An MCP gateway federates multiple MCP servers behind a single endpoint, handling authentication, authorization, rate limiting, and observability for all tool invocations. Gateways are important for enterprise deployments where AI access to tools must be centrally governed. Spice functions as an MCP gateway with fine-grained access controls and distributed tracing.</p>',
      },
      {
        title: 'Is MCP only for chat-based AI applications?',
        paragraph:
          '<p>No. While MCP is widely used with chat assistants and coding tools, the protocol is application-agnostic. Any AI system that needs to interact with external tools or data sources can use MCP, including autonomous agents, batch processing pipelines, and retrieval-augmented generation (RAG) systems.</p>',
      },
      {
        title: 'How does MCP handle security?',
        paragraph:
          '<p>MCP supports authentication at the transport layer (TLS for SSE connections, process isolation for stdio). MCP gateways add authorization policies controlling which models can invoke which tools with what parameters. Enterprise deployments typically combine MCP with role-based access control, audit logging, and network segmentation.</p>',
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<ContentResourceFeatured
  fields={{
    heading: 'Learn more about MCP',
    paragraph:
      'Documentation and blog posts on building and deploying MCP servers with Spice.',
    mode: 'default',
    resources: [
      {
        source: 'manual',
        resource: null,
        resource_manual: {
          eyebrow: 'Docs',
          title: {
            title: 'MCP Server & Gateway Docs',
            url: 'https://spiceai.org/docs/components/tools/mcp',
            target: '_blank',
          },
          description:
            'Learn how to deploy MCP servers, federate distributed tools, and expose Spice as an MCP gateway with full observability.',
          image: {
            ID: 1661,
            id: 1661,
            title: 'Docs jpeg',
            filename: 'Docs-jpeg.jpeg',
            filesize: 103192,
            url: '/website-assets/media/2025/12/Docs-jpeg.jpeg',
            link: '/docs-jpeg/',
            alt: '',
            author: '9',
            description: '',
            caption: '',
            name: 'docs-jpeg',
            status: 'inherit',
            uploaded_to: 0,
            date: '2025-12-05 04:13:53',
            modified: '2025-12-05 04:13:53',
            menu_order: 0,
            mime_type: 'image/jpeg',
            type: 'image',
            subtype: 'jpeg',
            icon: '/website-assets/media/default.png',
            width: 1832,
            height: 1036,
            sizes: {
              thumbnail: '/website-assets/media/2025/12/Docs-jpeg-150x150.jpeg',
              'thumbnail-width': 150,
              'thumbnail-height': 150,
              medium: '/website-assets/media/2025/12/Docs-jpeg-300x170.jpeg',
              'medium-width': 300,
              'medium-height': 170,
              medium_large:
                '/website-assets/media/2025/12/Docs-jpeg-768x434.jpeg',
              'medium_large-width': 768,
              'medium_large-height': 434,
              large: '/website-assets/media/2025/12/Docs-jpeg-1024x579.jpeg',
              'large-width': 1024,
              'large-height': 579,
              '1536x1536':
                '/website-assets/media/2025/12/Docs-jpeg-1536x869.jpeg',
              '1536x1536-width': 1536,
              '1536x1536-height': 869,
              '2048x2048': '/website-assets/media/2025/12/Docs-jpeg.jpeg',
              '2048x2048-width': 1832,
              '2048x2048-height': 1036,
            },
          },
        },
      },
      {
        source: 'picker',
        resource: [
          {
            title:
              'The Spice.ai for GitHub Copilot Extension is now available!',
            slug: '/blog/spice-ai-for-github-copilot-extension-now-available',
            excerpt:
              'With the Spice.ai Extension, developers can interact with data from any external data source directly within GitHub Copilot.',
            image:
              '/website-assets/media/2025/11/671e8bd1c976b00f27838fb9_github-extension.webp',
            type: 'Blog',
            taxonomy: ['Spice AI', 'Spice OSS'],
          },
        ],
        resource_manual: {
          eyebrow: '',
          title: null,
          description: '',
          image: false,
        },
      },
      {
        source: 'picker',
        resource: [
          {
            title: "A Developer's Guide to Understanding Spice.ai",
            slug: '/blog/a-developers-guide-to-understanding-spice-ai',
            excerpt:
              'Learn what Spice.ai is, when to use it, and how it solves enterprise data challenges. A developer-focused guide to federation, acceleration, search, and AI.',
            image:
              '/website-assets/media/2026/02/A-developers-guide-to-understanding-Spice.ai_.png',
            type: 'Blog',
            taxonomy: ['Engineering', 'Spice AI'],
          },
        ],
        resource_manual: {
          eyebrow: '',
          title: null,
          description: '',
          image: false,
        },
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<TalkToAnEngineerCta />

---

## Open-Source AI Data Platforms: Licensing, Governance, and Open Core
URL: https://spice.ai/learn/open-source-ai-data-platforms
Date: 2026-09-03T00:00:00
Description: Guide to evaluating open-source AI data platforms by license type, governance model, and where the open core boundary sits, rather than by the open-source label alone.

<HeroCenteredText
  fields={{
    graphic_position: 'no-graphic',
    heading_tag: 'h1',
    heading: 'Open-Source AI Data Platforms: Licensing, Governance, and Open Core',
    paragraph:
      'The open-source label covers licenses with very different terms and governance models with very different risks. This guide explains what to check before choosing a platform on that basis.',
    cta: [
      {
        type: 'filled',
        cta: {
          title: 'See deployment options',
          url: '/feature/edge-to-cloud-deployments',
          target: '',
        },
      },
      {
        type: 'bordered',
        cta: {
          title: 'Read the deployment docs',
          url: 'https://spiceai.org/docs/deployment',
          target: '_blank',
        },
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<ContentRichText
  fields={{
    coverage: 'rc-start',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

Teams choose open-source data and AI platforms for four reasons: cost, control, portability, and the ability to read the code. The label on its own does not tell you whether a platform delivers any of them.

Two projects can both be described as open source and give you very different rights. One permits commercial use with almost no conditions. Another restricts offering the software as a service, which matters if your product is a service. A third publishes the core and holds back the features that production requires.

This guide covers what to check: the license, who governs the project, where the open core boundary sits, and what self-hosting actually costs. It covers those questions rather than ranking projects. For engine selection, see [the best query engines for real-time AI analytics](/learn/best-query-engines-for-real-time-ai-analytics). For platform capability criteria, see [what to look for in a unified data and AI platform](/learn/unified-data-and-ai-platform).

## Four Questions the Label Does Not Answer

1. **Which license, and what does it permit?** The differences decide whether you can build a product on it.
2. **Who governs the project?** This predicts whether the license can change later.
3. **Where does the open core boundary sit?** The free tier is only useful if production can run on it.
4. **What does self-hosting cost?** The license fee is zero. The total is not.

## License Types and What Each Permits

### Permissive licenses

Apache 2.0, MIT, and BSD permit use, modification, and redistribution with few conditions. Apache 2.0 also grants patent rights explicitly, which legal teams usually prefer.

These impose no restriction on offering the software as a service. If your product is a hosted product, this category carries the least risk.

### Copyleft licenses

GPL and AGPL permit the same use and require derivative works to carry the same license. AGPL extends that requirement to software offered over a network.

AGPL is approved by the Open Source Initiative and is genuinely open source. It still needs legal review when the software sits inside a commercial product, because the reciprocal obligation can reach further than teams expect.

### Source-available licenses

The Business Source License (BSL), the Server Side Public License (SSPL), and the Elastic License publish source code with commercial restrictions. They typically forbid offering the software as a competing managed service.

These are not open-source licenses under the Open Source Initiative definition, although vendors often market them alongside genuinely open projects. BSL commonly converts to an open license after a set period, usually a few years per release.

| License type | Examples | Commercial use | Offer as a service | OSI approved |
| --- | --- | --- | --- | --- |
| Permissive | Apache 2.0, MIT, BSD | Yes | Yes | Yes |
| Copyleft | GPL, AGPL | Yes, with reciprocal terms | Yes, with source obligations | Yes |
| Source-available | BSL, SSPL, Elastic License | Usually | Usually restricted | No |
| Proprietary with open components | Vendor platforms built on open projects | Per contract | Per contract | Not applicable |

Licenses change. Verify the current license on the project repository before making a decision on it.

## Governance: Foundation or Single Vendor

The license tells you the terms today. Governance tells you how likely they are to hold.

**Foundation-governed projects** are held by a neutral body such as the Apache Software Foundation or the Linux Foundation. [Apache DataFusion](/learn/apache-datafusion), [Apache Arrow](/learn/apache-arrow), [Apache Iceberg](/learn/apache-iceberg), [Delta Lake](/learn/delta-lake), and [Vortex](/learn/vortex) sit here. Foundation stewardship can distribute decision-making, but it does not by itself determine copyright ownership or make relicensing impossible. Check each project's charter and contribution terms.

**Single-vendor projects** are controlled by one company that owns or aggregates the copyright, often through a contributor license agreement. That company can relicense future versions.

This is not theoretical. Several widely adopted infrastructure projects have moved from permissive licenses to source-available ones after building large user bases. Each time, downstream users faced the same choice: accept the new terms, pay for a commercial license, or move to a fork.

Single-vendor governance is not disqualifying. Many excellent projects work this way. It is a risk to price rather than a reason to refuse.

### Signals worth checking

- Does a foundation hold the copyright, or does one company?
- Does contributing require a license agreement, and what rights does it grant?
- How concentrated are the contributors? A project where one company writes most commits behaves like a single-vendor project whatever its license says.
- Has the project relicensed before?

## Open Core: Where the Line Sits

Most commercial open-source platforms publish a core and sell additions. The question is which side of the line the features you need fall on.

Some capabilities are commonly held back:

- Single sign-on and directory integration
- Role-based access control and row-level policy
- Audit logging
- High availability, clustering, and failover
- Managed operations and support commitments

None of that is unreasonable. A company needs revenue. The problem arises when the free tier is a demonstration rather than a product, and the requirement only becomes visible during a security review.

**The test:** list the capabilities your production deployment requires, including the compliance ones. Check each against the open-source edition specifically, not the documentation site as a whole. Documentation often describes the commercial edition without marking which parts need a license.

## What Self-Hosting Actually Costs

The license fee is zero. Four costs replace it.

**Operations.** Someone runs upgrades, capacity planning, and incident response. For a distributed system this is a meaningful fraction of an engineer.

**Expertise.** Tuning an unfamiliar engine takes time before it takes effect. Budget the learning period.

**Integration.** Authentication, secrets, monitoring, and backup all need wiring into your existing systems. A managed service usually includes these.

**Support.** Community support is real but has no response commitment. If an outage needs an answer within an hour, that commitment costs money.

Self-hosting is often the correct choice. It is correct for reasons of control and data residency more often than for reasons of cost.

## Evaluation Checklist

| Check | What to look for | Risk if skipped |
| --- | --- | --- |
| License | Current license on the repository, not the marketing page | Building a product on terms that forbid it |
| Governance | Foundation ownership or single-vendor control | Terms change after you depend on them |
| Contributor spread | Commits across several organizations | Project stalls if one company leaves |
| Open core line | Production requirements against the free edition | Security review blocks launch |
| Data format | Open table and file formats | Exit requires a migration |
| Operational load | Who runs it, and at what response commitment | Cost appears later as headcount |

## How to Choose

### 1. Start from what you are building

If your product is a hosted service, source-available licenses need legal review first. That single question removes several options quickly.

### 2. Separate the engine from the platform

An open engine inside a proprietary platform gives you portability of skills, not portability of workloads. Check what governs the layer you actually depend on.

### 3. Weight open formats above open engines

Engines are replaceable if the data is readable. Open table formats such as Iceberg and Delta Lake preserve that option. A proprietary storage format removes it whatever the engine license says.

### 4. Price the relicensing risk

Estimate the cost of migrating away within two years. That number is what single-vendor governance is asking you to accept.

### 5. Decide honestly who operates it

Match the choice to the team carrying the pager. A platform that needs a dedicated operator is the wrong choice for a team of four.

## Advanced Topics

### Forks as an escape hatch

When a project relicenses, the community sometimes forks the last permissive version. OpenSearch, OpenTofu, and Valkey all began this way. A fork is a real option and it is not free: it needs its own maintainers, and ecosystem support splits between the two.

The relevant question is whether a credible fork could exist. A project with contributors across several organizations can be forked successfully. A project written almost entirely by one company usually cannot.

### Open formats reduce the cost of being wrong

Storing data in Iceberg, Delta Lake, or Parquet lets another compatible engine read the same stored data. SQL dialects, catalogs, and engine-specific features can still require migration work. Open formats reduce switching cost, but they do not make every choice reversible.

Check this at the layer you actually write to. A platform can read open formats and still store its own working data in a proprietary one. That leaves the acceleration tier locked even when the lake is portable. Ask what a different engine could read tomorrow without a conversion job.

### Contributor concentration as a health signal

Look at commits by organization over the last year. Broad distribution indicates a project that survives any single company changing direction. Concentration indicates a project whose future is one company's roadmap, whatever the license permits.

Release cadence and issue response times add to the picture. A project with many contributors and no releases for a year carries a different risk from one shipping monthly. Check whether maintainers outside the primary company can merge changes, because that is what determines whether the project continues if the company stops.

### Reading the CLA

A contributor license agreement is what usually makes future relicensing practical, and its presence alone does not settle the question. Some agreements assign copyright to a company. Others leave copyright with the author and grant the company broad rights, which can include relicensing. A project with no agreement can still relicense if every copyright holder agrees, which is feasible when contributors are few.

Read the rights the agreement grants rather than noting that one exists.

## Open Source at Spice

[Spice](/platform/sql-federation-acceleration) is open source under Apache 2.0. The runtime includes federation, acceleration, hybrid search, and AI inference, and it is available at [github.com/spiceai/spiceai](https://github.com/spiceai/spiceai).

The commercial line sits at operations and enterprise controls. Spice Cloud runs the same runtime as a managed service. Spice.ai Enterprise adds self-hosted deployment with SSO, RBAC, audit logs, and support commitments. The engine is the same in all three, so a deployment can move between them without a rewrite.

Spice is built on foundation-governed projects: [Apache DataFusion](/learn/apache-datafusion), [Apache Arrow](/learn/apache-arrow), and [Vortex](/learn/vortex). Spice reads open formats including Parquet, Iceberg, and Delta Lake, and Cayenne stores accelerated data in the open-source Vortex format. Deployment runs locally, at the edge, in your own account, or fully managed, as described in [edge-to-cloud deployments](/feature/edge-to-cloud-deployments).

<ContentRichText
  fields={{
    coverage: 'rc-end',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<AccordionFaq
  fields={{
    heading: 'Open-Source AI Data Platforms FAQ',
    heading_tag: 'h2',
    paragraph: '',
    items: [
      {
        title: 'Is source-available software the same as open source?',
        paragraph:
          '<p>No. Source-available licenses such as BSL, SSPL, and the Elastic License publish the code with commercial restrictions, usually forbidding offering the software as a competing service. The Open Source Initiative does not approve them. Vendors often market them alongside genuinely open projects.</p>',
      },
      {
        title: 'Why does project governance matter if the license is permissive?',
        paragraph:
          '<p>A license describes the terms today. Governance predicts whether they hold. Centralized copyright ownership can let one organization relicense future versions. Foundation governance reduces that risk, but the project&apos;s copyright assignments and contribution terms determine whether relicensing is possible.</p>',
      },
      {
        title: 'How do I tell whether the free edition is production-ready?',
        paragraph:
          '<p>List your production requirements, including single sign-on, access control, audit logging, and high availability. Check each against the open-source edition specifically. Documentation often describes the commercial edition without marking which features need a license.</p>',
      },
      {
        title: 'Is self-hosting cheaper than a managed service?',
        paragraph:
          '<p>Sometimes, and less often than expected. The license fee is zero, but operations, expertise, integration, and support replace it. Self-hosting is usually the right call for control and data residency rather than for cost.</p>',
      },
      {
        title: 'What matters more, an open engine or an open data format?',
        paragraph:
          '<p>The format. Engines are replaceable when the data stays readable, so open table formats such as Iceberg and Delta Lake keep every other decision reversible. A proprietary storage format removes that option whatever the engine license permits.</p>',
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<ContentResourceFeatured
  fields={{
    heading: 'Learn more about the open-source runtime',
    heading_tag: 'h2',
    paragraph:
      'Documentation and technical resources for deploying and extending the open-source Spice runtime.',
    mode: 'default',
    resources: [
      {
        source: 'manual',
        resource: null,
        resource_manual: {
          eyebrow: 'Docs',
          title: {
            title: 'Deployment Docs',
            url: 'https://spiceai.org/docs/deployment',
            target: '_blank',
          },
          description:
            'Learn how to run the open-source runtime locally, at the edge, on-premises, or in the cloud.',
          image: {
            ID: 1661,
            id: 1661,
            title: 'Docs jpeg',
            filename: 'Docs-jpeg.jpeg',
            filesize: 103192,
            url: '/website-assets/media/2025/12/Docs-jpeg.jpeg',
            link: '/docs-jpeg/',
            alt: '',
            author: '9',
            description: '',
            caption: '',
            name: 'docs-jpeg',
            status: 'inherit',
            uploaded_to: 0,
            date: '2025-12-05 04:13:53',
            modified: '2025-12-05 04:13:53',
            menu_order: 0,
            mime_type: 'image/jpeg',
            type: 'image',
            subtype: 'jpeg',
            icon: '/website-assets/media/default.png',
            width: 1832,
            height: 1036,
            sizes: {
              thumbnail: '/website-assets/media/2025/12/Docs-jpeg-150x150.jpeg',
              'thumbnail-width': 150,
              'thumbnail-height': 150,
              medium: '/website-assets/media/2025/12/Docs-jpeg-300x170.jpeg',
              'medium-width': 300,
              'medium-height': 170,
              medium_large:
                '/website-assets/media/2025/12/Docs-jpeg-768x434.jpeg',
              'medium_large-width': 768,
              'medium_large-height': 434,
              large: '/website-assets/media/2025/12/Docs-jpeg-1024x579.jpeg',
              'large-width': 1024,
              'large-height': 579,
              '1536x1536':
                '/website-assets/media/2025/12/Docs-jpeg-1536x869.jpeg',
              '1536x1536-width': 1536,
              '1536x1536-height': 869,
              '2048x2048': '/website-assets/media/2025/12/Docs-jpeg.jpeg',
              '2048x2048-width': 1832,
              '2048x2048-height': 1036,
            },
          },
        },
      },
      {
        source: 'picker',
        resource: [
          {
            title: 'Announcing Spice.ai Open Source 1.0-stable',
            slug: '/blog/announcing-spice-ai-open-source-1-0-stable',
            excerpt:
              'The open-source runtime reaching 1.0: a portable data, AI, and retrieval engine under Apache 2.0.',
            image: '/website-assets/media/default.png',
            type: 'Blog',
            taxonomy: ['Spice AI'],
          },
        ],
        resource_manual: {
          eyebrow: '',
          title: null,
          description: '',
          image: false,
        },
      },
      {
        source: 'picker',
        resource: [
          {
            title: 'A Developer\u2019s Guide to Understanding Spice.ai',
            slug: '/blog/a-developers-guide-to-understanding-spice-ai',
            excerpt:
              'What Spice is, what it is not, and how the open-source runtime relates to the managed and enterprise editions.',
            image: '/website-assets/media/default.png',
            type: 'Blog',
            taxonomy: ['Spice AI'],
          },
        ],
        resource_manual: {
          eyebrow: '',
          title: null,
          description: '',
          image: false,
        },
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<ContentCta
  fields={{
    override_global_setting: false,
    custom_content: { heading: '', paragraph: '', cta: null },
    padding_top: 'unset',
    padding_bottom: 'unset',
    gcta_heading: 'See Spice in action',
    gcta_paragraph:
      'Get a guided walkthrough of how development teams use Spice to query, accelerate, and integrate AI for mission-critical workloads.',
    gcta_cta: {
      title: 'Get a demo',
      url: 'https://meetings.hubspot.com/lukekim/talk-to-sales',
      target: '_blank',
    },
  }}
/>

---

## RAG vs Fine-Tuning: How to Choose
URL: https://spice.ai/learn/rag-vs-fine-tuning
Date: 2026-02-05T00:00:00
Description: RAG retrieves external data at inference time while fine-tuning embeds knowledge into model weights. Learn the key differences, tradeoffs, and when to use each approach for production AI applications.

<HeroCenteredText
  fields={{
    graphic_position: 'no-graphic',
    heading_tag: 'h1',
    heading: 'RAG vs Fine-Tuning',
    paragraph:
      'Retrieval-augmented generation and fine-tuning are the two primary approaches to customizing LLM behavior with domain-specific knowledge. Each solves a different problem, and most production systems benefit from understanding when to apply each.',
    cta: [
      {
        type: 'filled',
        cta: {
          title: 'See Spice RAG platform',
          url: '/use-case/retrieval-augmented-generation',
          target: '',
        },
      },
      {
        type: 'bordered',
        cta: {
          title: 'Read the docs',
          url: 'https://spiceai.org/docs/features/search',
          target: '',
        },
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<ContentRichText
  fields={{
    coverage: 'rc-start',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

When teams build AI applications that need domain-specific knowledge, they face a fundamental question: should the model retrieve relevant data at query time, or should that knowledge be trained directly into the model's weights? This is the core distinction between retrieval-augmented generation (RAG) and fine-tuning.

Neither approach is universally better. RAG excels at injecting current, factual information into model responses. Fine-tuning excels at shaping how a model reasons, responds, and follows domain-specific patterns. Understanding the tradeoffs between them (and knowing when to combine them) is essential for building production AI systems that are accurate, maintainable, and cost-effective.

## What is RAG?

[Retrieval-augmented generation](/learn/retrieval-augmented-generation) is an architecture pattern that retrieves relevant data from external sources at inference time and includes it in the LLM's prompt as context. Rather than relying solely on knowledge stored in model weights, the LLM generates responses grounded in specific, current information.

A RAG pipeline operates in three stages:

1. **Indexing:** Source data (documents, database records, knowledge base articles) is chunked and converted into [embeddings](/learn/embeddings): dense vector representations stored in a searchable index.
2. **Retrieval:** When a user query arrives, the system searches the index using vector similarity, keyword matching, or [hybrid search](/platform/hybrid-sql-search) to find the most relevant chunks.
3. **Generation:** The retrieved chunks are injected into the LLM prompt as context, and the model generates a response grounded in that specific data.

RAG does not modify the model itself. The same base model can serve different use cases simply by changing which data sources it retrieves from. This makes RAG highly flexible and straightforward to update: new knowledge becomes available as soon as it is indexed.

## What is Fine-Tuning?

Fine-tuning modifies a pre-trained model's weights by continuing its training on a domain-specific dataset. This permanently embeds knowledge, behavior patterns, and stylistic preferences into the model. After fine-tuning, the model "knows" the new information in the same way it knows its original training data: through learned parameters rather than external context.

The fine-tuning process typically involves:

1. **Data preparation:** Curating a dataset of input-output pairs that demonstrate the desired behavior (e.g., question-answer pairs in your domain, examples of the target writing style, or task-specific demonstrations).
2. **Training:** Running additional training passes over this data, adjusting the model's weights to minimize prediction error on the new examples. Techniques like LoRA (Low-Rank Adaptation) reduce the computational cost by training only a small subset of parameters.
3. **Evaluation:** Testing the fine-tuned model against held-out examples to measure improvement and check for regressions in general capability.

Fine-tuning changes the model permanently. The resulting model carries its new knowledge and behaviors without needing any external data at inference time.

## Key Differences

The following table summarizes the core tradeoffs between RAG and fine-tuning across the dimensions that matter most for production systems.

| Dimension | RAG | Fine-Tuning |
| --- | --- | --- |
| **Knowledge source** | External data retrieved at query time | Embedded in model weights during training |
| **Data freshness** | Real-time: updates available as soon as data is indexed | Static: requires retraining to incorporate new information |
| **Setup cost** | Moderate: requires retrieval infrastructure (search index, embedding pipeline) | High: requires curated training data, GPU compute, and training expertise |
| **Update cost** | Low: re-index changed data | High: retrain the model on updated data |
| **Inference latency** | Higher: adds retrieval step before generation | Lower: no retrieval step required |
| **Accuracy on factual queries** | High: answers grounded in retrieved source data | Variable: depends on training data coverage |
| **Hallucination risk** | Lower for covered topics: model has source context | Higher for edge cases outside training distribution |
| **Behavioral customization** | Limited: model behavior unchanged | Strong: can reshape tone, style, and reasoning patterns |
| **Context window dependency** | Yes: bounded by how much context the model can process | No: knowledge is in weights, not context |
| **Auditability** | High: can trace answers to specific source documents | Low: knowledge is distributed across model parameters |

## When to Use RAG

RAG is the better choice when your application needs to work with data that changes frequently, when auditability and source attribution matter, or when you need to query across multiple data sources without retraining a model.

**Use RAG when:**

- **Data changes frequently.** Product documentation, pricing, policies, inventory, and support articles change regularly. RAG reflects these changes as soon as the index is updated, without retraining.
- **Source attribution is required.** Compliance, legal, and customer-facing applications often need to cite the specific documents that informed a response. RAG naturally supports this because the retrieved chunks are available alongside the generated answer.
- **You query multiple or heterogeneous data sources.** Enterprise data lives across databases, wikis, APIs, and file systems. RAG can retrieve from all of these sources through a unified search layer.
- **You need to control costs.** RAG avoids the GPU compute and training pipeline required for fine-tuning. Adding new knowledge is a data indexing operation, not a model training operation.
- **Accuracy on factual questions is critical.** Grounding responses in retrieved source data significantly reduces hallucinations compared to relying solely on model weights.

## When to Use Fine-Tuning

Fine-tuning is the better choice when you need to change how a model behaves, not just what information it has access to. It is particularly effective for shaping output format, tone, reasoning style, and domain-specific patterns.

**Use fine-tuning when:**

- **You need a specific output format or style.** If your application requires responses in a particular structure (JSON, specific templates, clinical language, legal prose), fine-tuning teaches the model to consistently produce that format.
- **You need domain-specific reasoning.** Medical diagnosis, legal analysis, and financial modeling involve reasoning patterns that general-purpose models may not handle well. Fine-tuning on expert examples teaches the model how to reason in your domain.
- **Latency is critical.** Fine-tuning eliminates the retrieval step, reducing inference latency. For real-time applications where every millisecond matters, this can be significant.
- **The knowledge is static and well-defined.** If your domain knowledge rarely changes (e.g., established medical terminology, programming language syntax, mathematical concepts), fine-tuning embeds it directly without needing retrieval infrastructure.
- **You want to reduce prompt size.** Fine-tuned models carry knowledge in their weights, so you don't need to include large amounts of context in each prompt. This reduces token costs and avoids context window limitations.

## Decision Framework

Use the following framework to determine which approach (or combination) fits your use case.

### Step 1: Identify the Problem Type

Ask: **"Am I trying to give the model new information, or change how it behaves?"**

- New information (facts, documents, records) --> RAG
- New behavior (style, format, reasoning patterns) --> Fine-tuning
- Both --> Combine RAG and fine-tuning

### Step 2: Assess Data Volatility

Ask: **"How often does the underlying data change?"**

- Daily or more frequently --> RAG (retraining at this cadence is impractical)
- Monthly to quarterly --> Either approach works; consider other factors
- Rarely or never --> Fine-tuning is viable

### Step 3: Evaluate Auditability Requirements

Ask: **"Do I need to trace responses back to specific source documents?"**

- Yes --> RAG (source attribution is a built-in capability)
- No --> Either approach works

### Step 4: Consider Infrastructure and Cost

Ask: **"What infrastructure and expertise do I have available?"**

- Strong data infrastructure, limited ML training expertise --> RAG
- Strong ML training expertise, stable training data --> Fine-tuning
- Both --> Combine approaches

### Step 5: Plan for the Combination

In many production systems, the answer is not RAG _or_ fine-tuning, but RAG _and_ fine-tuning. A common pattern is:

- **Fine-tune** the model for domain-specific behavior: output format, terminology, reasoning style, and tone
- **Use RAG** to inject current, factual knowledge at query time: product data, customer records, policy documents, real-time metrics

This combination gives you a model that both _behaves_ correctly for your domain and _knows_ the latest information, without requiring retraining every time your data changes.

## Advanced Topics

### RAG with Structured Data

Most RAG tutorials focus on unstructured text: documents, articles, knowledge bases. But enterprise data is frequently structured: relational databases, data warehouses, operational systems. Structured data RAG retrieves from SQL-queryable sources rather than (or in addition to) vector indexes.

Instead of embedding and searching document chunks, structured data RAG translates natural language queries into SQL, executes them against connected databases, and includes the results as context for the LLM. This approach is particularly effective for questions involving aggregations, filtering, joins, and exact lookups (operations where vector similarity search performs poorly).

[Hybrid SQL search](/platform/hybrid-sql-search) combines both paradigms: vector search for semantic retrieval over unstructured content and SQL queries for precise retrieval from structured data. This is critical in enterprise environments where the answer to a question may require joining product documentation (unstructured) with pricing tables (structured) and customer records (structured).

### Parameter-Efficient Fine-Tuning

Full fine-tuning updates all of a model's parameters, which is computationally expensive and risks catastrophic forgetting: the model loses general capabilities as it overfits to the new data. Parameter-efficient fine-tuning (PEFT) methods address this by training only a small fraction of parameters.

**LoRA (Low-Rank Adaptation)** is the most widely adopted PEFT method. It freezes the original model weights and injects small, trainable rank-decomposition matrices into each layer. Instead of updating millions or billions of parameters, LoRA trains thousands to millions, reducing GPU memory requirements by 60-80% while achieving comparable quality to full fine-tuning on most tasks.

**QLoRA** combines LoRA with quantization, loading the base model in 4-bit precision and training only the LoRA adapters in full precision. This enables fine-tuning large models (7B-70B parameters) on a single consumer GPU, a significant reduction in the infrastructure barrier to fine-tuning.

These techniques make fine-tuning more accessible, but the fundamental tradeoffs remain: fine-tuning still requires curated training data, evaluation infrastructure, and retraining when the domain evolves.

### Combining RAG and Fine-Tuning in Production

The most sophisticated production systems use fine-tuning and RAG together, but integrating them introduces its own challenges. A fine-tuned model may have learned patterns during training that conflict with retrieved context at inference time. For example, if the model was fine-tuned on outdated pricing information and the RAG system retrieves current pricing, the model must correctly prioritize the retrieved context over its trained knowledge.

Techniques to manage this include instruction tuning the model to explicitly prefer retrieved context over internal knowledge, using system prompts that reinforce context-grounding behavior, and evaluating with adversarial examples where retrieved context contradicts trained knowledge.

Monitoring is essential in combined systems. Track how often the model's responses align with retrieved context versus its trained knowledge. A drift toward trained knowledge (ignoring retrieved context) is a signal that the fine-tuning is overriding RAG, a common failure mode that degrades accuracy as source data diverges from training data.

## How Spice Powers RAG Pipelines

[Spice](/use-case/retrieval-augmented-generation) provides the data infrastructure layer that production RAG systems require: unified retrieval across structured and unstructured data, with the performance characteristics needed for real-time AI applications.

**[Hybrid SQL search](/platform/hybrid-sql-search)** combines vector similarity, full-text keyword matching, and structured SQL queries in a single interface. Rather than managing separate vector databases, search engines, and relational databases, Spice executes all three retrieval modes in one query. This is particularly important for enterprise RAG where answers depend on both unstructured documents and structured operational data.

**[LLM inference](/platform/llm-inference)** runs embedding models and generation models alongside data queries in the same runtime. Embedding generation, retrieval, and response generation happen within a single system, eliminating the network hops and orchestration complexity of stitching together separate embedding services, vector databases, and LLM APIs.

**Data federation and acceleration** connect RAG pipelines to data wherever it lives. Spice federates queries across [40+ data sources](/integrations) (databases, warehouses, APIs, and file systems) so the retrieval layer has access to all relevant enterprise data without complex ETL pipelines. Query acceleration caches frequently accessed data locally for low-latency retrieval, a critical requirement when RAG queries must complete in hundreds of milliseconds.

**Real-time data freshness** keeps indexes current as source data changes. Through change data capture and incremental re-indexing, Spice ensures that the retrieval layer reflects the latest state of your data, addressing one of the most common failure modes in production RAG systems where stale indexes produce outdated answers.

For teams evaluating whether to use RAG, fine-tuning, or both, Spice provides the retrieval infrastructure that makes RAG practical at production scale, letting you focus on the AI application logic rather than the underlying data plumbing.

<ContentRichText
  fields={{
    coverage: 'rc-end',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<AccordionFaq
  fields={{
    heading: 'RAG vs Fine-Tuning FAQ',
    paragraph: '',
    items: [
      {
        title: 'Can I use RAG and fine-tuning together?',
        paragraph:
          '<p>Yes, and many production systems do. A common pattern is to fine-tune the model for domain-specific behavior (output format, reasoning style, terminology) and use RAG to inject current factual knowledge at query time. This gives you a model that both behaves correctly for your domain and has access to the latest information without retraining.</p>',
      },
      {
        title: 'Which approach is more cost-effective?',
        paragraph:
          '<p>RAG is typically more cost-effective for knowledge-intensive applications. The primary cost is retrieval infrastructure (search indexes, embedding pipelines), which scales predictably. Fine-tuning requires GPU compute for training, curated datasets, and retraining whenever domain knowledge changes. However, fine-tuning can reduce per-query costs by eliminating the retrieval step and reducing prompt token counts.</p>',
      },
      {
        title: 'Does RAG work with structured data like databases?',
        paragraph:
          '<p>Yes. While most RAG implementations focus on unstructured text, production RAG systems increasingly retrieve from structured data sources using SQL queries alongside vector search. Spice supports hybrid SQL search that combines vector similarity, keyword matching, and structured SQL retrieval in a single query, making it possible to ground LLM responses in both documents and database records.</p>',
      },
      {
        title: 'How do I know if my fine-tuned model is hallucinating?',
        paragraph:
          '<p>Fine-tuned models hallucinate when queries fall outside their training distribution: they generate plausible-sounding but incorrect responses. Detection requires evaluation datasets with known correct answers, human review of edge cases, and monitoring confidence signals. RAG reduces this risk by grounding responses in retrieved source data, making it easier to verify accuracy and trace answers to specific documents.</p>',
      },
      {
        title: 'What are the latency tradeoffs between RAG and fine-tuning?',
        paragraph:
          '<p>RAG adds a retrieval step before generation, typically adding 50-200ms depending on index size, search complexity, and infrastructure. Fine-tuned models skip this step, generating responses directly from weights. For latency-critical applications (real-time chat, autocomplete), this difference matters. However, RAG latency can be minimized with query acceleration, local caching, and optimized search infrastructure.</p>',
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<ContentResourceFeatured
  fields={{
    heading: 'Learn more about RAG and fine-tuning',
    paragraph:
      'Technical guides and blog posts on building production RAG systems with hybrid search, LLM inference, and real-time data.',
    mode: 'default',
    resources: [
      {
        source: 'manual',
        resource: null,
        resource_manual: {
          eyebrow: 'Docs',
          title: {
            title: 'Hybrid Search Docs',
            url: 'https://spiceai.org/docs/features/search',
            target: '_blank',
          },
          description:
            'Learn how Spice provides semantic, full-text, and hybrid search capabilities for RAG applications.',
          image: {
            ID: 1661,
            id: 1661,
            title: 'Docs jpeg',
            filename: 'Docs-jpeg.jpeg',
            filesize: 103192,
            url: '/website-assets/media/2025/12/Docs-jpeg.jpeg',
            link: '/docs-jpeg/',
            alt: '',
            author: '9',
            description: '',
            caption: '',
            name: 'docs-jpeg',
            status: 'inherit',
            uploaded_to: 0,
            date: '2025-12-05 04:13:53',
            modified: '2025-12-05 04:13:53',
            menu_order: 0,
            mime_type: 'image/jpeg',
            type: 'image',
            subtype: 'jpeg',
            icon: '/website-assets/media/default.png',
            width: 1832,
            height: 1036,
            sizes: {
              thumbnail: '/website-assets/media/2025/12/Docs-jpeg-150x150.jpeg',
              'thumbnail-width': 150,
              'thumbnail-height': 150,
              medium: '/website-assets/media/2025/12/Docs-jpeg-300x170.jpeg',
              'medium-width': 300,
              'medium-height': 170,
              medium_large:
                '/website-assets/media/2025/12/Docs-jpeg-768x434.jpeg',
              'medium_large-width': 768,
              'medium_large-height': 434,
              large: '/website-assets/media/2025/12/Docs-jpeg-1024x579.jpeg',
              'large-width': 1024,
              'large-height': 579,
              '1536x1536':
                '/website-assets/media/2025/12/Docs-jpeg-1536x869.jpeg',
              '1536x1536-width': 1536,
              '1536x1536-height': 869,
              '2048x2048': '/website-assets/media/2025/12/Docs-jpeg.jpeg',
              '2048x2048-width': 1832,
              '2048x2048-height': 1036,
            },
          },
        },
      },
      {
        source: 'picker',
        resource: [
          {
            title: 'AWS Workshop: Federated Queries and Hybrid Search with Spice.ai',
            slug: '/blog/aws-workshop-federated-queries-and-hybrid-search-with-spice',
            excerpt:
              'A new AWS catalog workshop for deploying Spice as a data and AI substrate for federated queries, hybrid search, and LLM inference.',
            image:
              '/website-assets/media/2026/04/aws-workshop-header.svg',
            type: 'Blog',
            taxonomy: ['Spice AI', 'Engineering', 'Data Federation'],
          },
        ],
        resource_manual: {
          eyebrow: '',
          title: null,
          description: '',
          image: false,
        },
      },
      {
        source: 'picker',
        resource: [
          {
            title:
              'Getting Started with Spice.ai SQL Query Federation & Acceleration',
            slug: '/blog/spice-sql-query-federation-acceleration',
            excerpt:
              'Learn how to use Spice.ai to federate and accelerate queries across operational and analytical systems with zero ETL.',
            image:
              '/website-assets/media/2025/11/68ee96eb08a0dfcb609c1969_Version-7-1.png',
            type: 'Blog',
            taxonomy: ['Spice AI'],
          },
        ],
        resource_manual: {
          eyebrow: '',
          title: null,
          description: '',
          image: false,
        },
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<TalkToAnEngineerCta />

---

## Real-Time Analytics Guide for AI Agents
URL: https://spice.ai/learn/real-time-analytics-guide-for-ai-agents
Date: 2026-08-11T00:00:00
Description: Learn how to deliver real-time analytics for AI agents using analytics replicas, change data capture, low-latency serving, and governed access without ETL.

<HeroCenteredText
  fields={{
    graphic_position: 'no-graphic',
    heading_tag: 'h1',
    heading: 'Real-Time Analytics Guide for AI Agents',
    paragraph:
      'Real-time analytics for AI agents requires fast replicas, high-throughput replication, and policy controls. This guide explains practical architecture choices for production workloads.',
    cta: [
      {
        type: 'filled',
        cta: {
          title: 'See real-time change data capture',
          url: '/feature/real-time-change-data-capture',
          target: '',
        },
      },
      {
        type: 'bordered',
        cta: {
          title: 'Read CDC docs',
          url: 'https://spiceai.org/docs/features/cdc',
          target: '_blank',
        },
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<ContentRichText
  fields={{
    coverage: 'rc-start',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

AI agents now run analytical queries on operational databases to answer live questions, rank options, and trigger actions.

Teams no longer ask whether agents need data. They ask whether those queries stay current and trustworthy under production load.

A real-time analytics platform for AI agents is the runtime layer that serves low-latency reads, enforces policy, and keeps data fresh for each decision window.

For most operational AI workflows, real-time means a bounded freshness window matched to decision requirements. The right platform depends on workload mix and risk.

## Core Requirements

**Bounded freshness.** The platform needs explicit freshness contracts by dataset. Agents should know whether data is seconds old, minutes old, or batch refreshed.

**Low tail latency.** Agent workflows depend on p95 and p99 latency, not average latency. One slow call can break the whole response.

**Governance by default.** Every query path must enforce identity scope, data scope, and output controls.

**Multi-source retrieval.** Most enterprise answers require joins across operational and analytical systems. Real-time platforms must support broad [integrations](/integrations).

**Operational observability.** Teams need full traces across agent call, query execution, policy decision, and source response.

## Architectural Patterns for Agent Workloads

### Analytics replica pattern

The [Analytics Replica Pattern](/blog/the-analytics-replica-pattern-shortening-the-path-to-data-based-ai) serves analytical reads from sandboxed replicas beside operational data. It uses [change data capture](/learn/change-data-capture) to replicate native logs such as PostgreSQL WAL, MySQL binlog, and MongoDB oplog. This keeps analytical query load off production systems.

Best fit:

- Fast-moving operational workflows.
- Multiple databases with uneven query volume.
- Teams that need sub-second query and second-level freshness without loading source systems directly.

### Streaming-first serving layer

This pattern uses event streams to materialize serving views continuously. It delivers tight freshness but adds pipeline complexity.

Best fit:

- Ultra-low-lag use cases.
- Stable schema domains.
- Teams with mature stream operations.

### Warehouse-centric serving

This pattern routes most retrieval through the warehouse. It is simple for analytics-heavy workloads, but often costly for high-frequency agent traffic.

Best fit:

- Historical analysis workflows.
- Lower interactivity requirements.
- Existing warehouse-first operations.

## Decision Framework

Use this framework to choose platform direction.

**If freshness is strict and source count is high.** Start with the [Analytics Replica Pattern](/blog/the-analytics-replica-pattern-shortening-the-path-to-data-based-ai), then tune CDC replication and compaction for sustained ingest.

**If freshness is strict and schema is stable.** Streaming-first materialization can work well, but only if your team can manage stream reliability.

**If workload is mostly analytical.** A warehouse-centric path may be enough. Add replica-local serving where operational freshness becomes user-visible.

## Comparison Table

| Dimension | Analytics Replica Pattern | Streaming-first | Warehouse-centric |
|---|---|---|---|
| Freshness | Seconds | Sub-second to seconds | Minutes to hours |
| p95 latency | Low with replica-local reads | Low if materialization is healthy | Variable |
| Source coverage | Broad | Medium, depends on connectors | Broad for loaded data |
| Operational complexity | Low | High | Medium |
| Cost predictability | Good with tuning | Good after maturity | Can spike with agent fan-out |
| Best fit | Mixed operational and analytical retrieval | Event-heavy domains | Analytics-first retrieval |

## Implementation Checklist

1. **Define freshness tiers:** Group datasets by freshness need. Do not apply one global policy.
2. **Measure baseline tail latency:** Capture p95 and timeout rates before architecture changes.
3. **Add policy and identity boundaries:** Secure the data path before scaling agent traffic.
4. **Optimize hot retrieval paths:** Tune CDC replication, compaction, and replica indexes where they change outcomes.
5. **Track cost per request class:** Monitor cost per 1,000 agent requests by workload type.

## Advanced Topics

### Freshness-Aware Agent Tool Planning

Modern AI agents select tools dynamically based on input prompts and data constraints. Annotating datasets and tools with freshness metadata allows agent reasoning frameworks to choose optimal query paths.

For time-critical actions like fraud evaluation, the agent routes queries to real-time CDC acceleration tables. For background reporting or trend analysis, the agent selects batch data warehouse views. Exposing explicit SLA metadata prevents agents from making decisions based on stale data.

### Multi-Region Real-Time Serving Architectures

Global application deployments require low-latency data access across multiple geographical regions. Deploying regional analytics replicas alongside local application services reduces cross-region network latency.

In a multi-region setup, local sidecar engines tail change streams from primary transactional databases using regional read replicas or CDC brokers. Local API services and AI agents query local replicas over loopback interfaces. This architecture maintains sub-second query performance while keeping regional data synchronized.

### Reliability Engineering and Fallback Degraded Modes

Production real-time data paths require robust operational runbooks for infrastructure failures. When source databases experience outage or replication lag spikes, the serving layer degrades gracefully.

The serving engine tracks change stream lag continuously. If CDC lag exceeds configured SLAs, the runtime routes agent queries to fallback endpoints or returns cached data snapshot views with explicit staleness warnings. Circuit breakers prevent cascading failures across co-located agent services.

## Real-Time Agent Platforms with Spice

[Spice](/platform/sql-federation-acceleration) supports the Analytics Replica Pattern with [real-time CDC](/feature/real-time-change-data-capture), governed retrieval, and sandboxed data access controls. Teams can connect operational and analytical systems, set seconds-level freshness targets, and enforce policy boundaries through one data path.

The same platform supports [secure AI agent deployments](/use-case/secure-ai-agents) and [MCP gateway workflows](/feature/mcp-server-gateway), so teams can standardize retrieval and tool access together.

For capacity planning and managed deployment, see [Spice Cloud pricing](/pricing/cloud).

<ContentRichText
  fields={{
    coverage: 'rc-end',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<AccordionFaq
  fields={{
    heading: 'Real-Time Data Platforms for AI Agents FAQ',
    heading_tag: 'h2',
    paragraph: '',
    items: [
      {
        title: 'What is real-time for AI agents?',
        paragraph:
          '<p>Real-time usually means a bounded freshness window that matches business decisions, plus stable low tail latency. For many teams, that is seconds to a few minutes.</p>',
      },
      {
        title: 'Do we need streaming for every agent workload?',
        paragraph:
          '<p>No. Many teams get strong outcomes from the analytics replica pattern with CDC-backed refresh. Streaming is useful when freshness needs are strict and domains are stable.</p>',
      },
      {
        title: 'Which metric should we optimize first?',
        paragraph:
          '<p>Start with p95 latency and freshness lag by dataset. Those two metrics usually explain most user-facing retrieval failures.</p>',
      },
      {
        title: 'How do we keep costs predictable?',
        paragraph:
          '<p>Classify query workloads, accelerate hot paths, and enforce query limits. Track cost per 1,000 requests by class, not only total platform spend.</p>',
      },
      {
        title: 'Can one platform serve both retrieval and tool calls?',
        paragraph:
          '<p>Yes. Many teams use one governed runtime for SQL retrieval, policy enforcement, and MCP tool access so operations and audits stay consistent.</p>',
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<ContentResourceFeatured
  fields={{
    heading: 'Learn more about real-time agent data platforms',
    heading_tag: 'h2',
    paragraph:
      'Resources on CDC, analytics replica architecture, and production patterns for real-time AI agent analytics.',
    mode: 'default',
    resources: [
      {
        source: 'manual',
        resource: null,
        resource_manual: {
          eyebrow: 'Docs',
          title: {
            title: 'Change Data Capture Docs',
            url: 'https://spiceai.org/docs/features/cdc',
            target: '_blank',
          },
          description:
            'Learn how to configure CDC refresh paths for low-lag serving and bounded freshness.',
          image: {
            ID: 1661,
            id: 1661,
            title: 'Docs jpeg',
            filename: 'Docs-jpeg.jpeg',
            filesize: 103192,
            url: '/website-assets/media/2025/12/Docs-jpeg.jpeg',
            link: '/docs-jpeg/',
            alt: '',
            author: '9',
            description: '',
            caption: '',
            name: 'docs-jpeg',
            status: 'inherit',
            uploaded_to: 0,
            date: '2025-12-05 04:13:53',
            modified: '2025-12-05 04:13:53',
            menu_order: 0,
            mime_type: 'image/jpeg',
            type: 'image',
            subtype: 'jpeg',
            icon: '/website-assets/media/default.png',
            width: 1832,
            height: 1036,
            sizes: {
              thumbnail: '/website-assets/media/2025/12/Docs-jpeg-150x150.jpeg',
              'thumbnail-width': 150,
              'thumbnail-height': 150,
              medium: '/website-assets/media/2025/12/Docs-jpeg-300x170.jpeg',
              'medium-width': 300,
              'medium-height': 170,
              medium_large:
                '/website-assets/media/2025/12/Docs-jpeg-768x434.jpeg',
              'medium_large-width': 768,
              'medium_large-height': 434,
              large: '/website-assets/media/2025/12/Docs-jpeg-1024x579.jpeg',
              'large-width': 1024,
              'large-height': 579,
              '1536x1536':
                '/website-assets/media/2025/12/Docs-jpeg-1536x869.jpeg',
              '1536x1536-width': 1536,
              '1536x1536-height': 869,
              '2048x2048': '/website-assets/media/2025/12/Docs-jpeg.jpeg',
              '2048x2048-width': 1832,
              '2048x2048-height': 1036,
            },
          },
        },
      },
      {
        source: 'picker',
        resource: [
          {
            title: 'Real-Time Control Plane Acceleration with DynamoDB Streams',
            slug: '/blog/real-time-acceleration-with-dynamodb-streams',
            excerpt:
              'How to sync DynamoDB data to thousands of nodes with sub-second latency using a two-tier architecture with DynamoDB Streams and Spice acceleration.',
            image: '/website-assets/media/2026/01/image-33.png',
            type: 'Blog',
            taxonomy: ['Data Acceleration', 'Engineering'],
          },
        ],
        resource_manual: {
          eyebrow: '',
          title: null,
          description: '',
          image: false,
        },
      },
      {
        source: 'picker',
        resource: [
          {
            title: 'Operationalizing Amazon S3 for AI',
            slug: '/blog/operationalizing-amazon-s3-for-ai',
            excerpt:
              'How to make object storage operational for AI workloads with freshness controls and reliable query performance.',
            image: '/website-assets/media/default.png',
            type: 'Blog',
            taxonomy: ['Spice AI', 'Engineering'],
          },
        ],
        resource_manual: {
          eyebrow: '',
          title: null,
          description: '',
          image: false,
        },
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<ContentCta
  fields={{
    override_global_setting: false,
    custom_content: { heading: '', paragraph: '', cta: null },
    padding_top: 'unset',
    padding_bottom: 'unset',
    gcta_heading: 'See Spice in action',
    gcta_paragraph:
      'Get a guided walkthrough of how development teams use Spice to query, accelerate, and integrate AI for mission-critical workloads.',
    gcta_cta: {
      title: 'Get a demo',
      url: 'https://meetings.hubspot.com/lukekim/talk-to-sales',
      target: '_blank',
    },
  }}
/>

---

## What is Reciprocal Rank Fusion (RRF)?
URL: https://spice.ai/learn/reciprocal-rank-fusion
Date: 2026-04-03T00:00:00
Description: Reciprocal Rank Fusion (RRF) is a ranking algorithm that merges result lists from multiple search methods by position rather than score. Learn how RRF works, its parameters, and why it is the standard fusion method in hybrid search.

<HeroCenteredText
  fields={{
    graphic_position: 'no-graphic',
    heading_tag: 'h1',
    heading: 'What is Reciprocal Rank Fusion (RRF)?',
    paragraph:
      'Reciprocal Rank Fusion (RRF) is a ranking algorithm that combines result lists from multiple retrieval methods into a single, unified ranking. Instead of comparing raw scores (which are on incompatible scales), RRF uses only each result\'s position in each list. Documents appearing near the top of multiple result lists get the highest combined scores.',
    cta: [
      {
        type: 'filled',
        cta: {
          title: 'See Spice hybrid search',
          url: '/platform/hybrid-sql-search',
          target: '',
        },
      },
      {
        type: 'bordered',
        cta: {
          title: 'Read the docs',
          url: 'https://spiceai.org/docs/features/search',
          target: '_blank',
        },
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<ContentRichText
  fields={{
    coverage: 'rc-start',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

[Hybrid search](/platform/hybrid-sql-search) runs two retrieval methods in parallel (vector similarity search for semantic relevance and BM25 full-text search for keyword precision) and combines their results. The challenge is that the scores from these two methods are on fundamentally different scales: cosine similarity scores range from -1 to 1, while BM25 scores are unbounded positive numbers. Combining raw scores directly produces unpredictable results.

Reciprocal Rank Fusion solves this by ignoring raw scores entirely. It assigns each result a score based only on where it ranked in each result list, then sums those scores. This rank-based approach is robust to score distribution differences, requires no calibration, and is straightforward to implement. It was introduced by Cormack, Clarke, and Buettcher in their 2009 paper and has become the default fusion algorithm for hybrid search systems.

## The RRF Formula

The RRF score for a document `d` across `n` ranked lists is:

```
RRF(d) = Σ [ 1 / (k + rank_i(d)) ]
         i=1 to n
```

Where:
- `rank_i(d)` is the position of document `d` in the i-th result list (1-indexed, so the top result is rank 1)
- `k` is a constant (typically 60) that dampens the impact of high-ranking documents

If a document does not appear in a result list, it contributes 0 to the sum for that list.

### Example

Consider a hybrid search query that returns the following results:

| Document | Vector search rank | BM25 rank |
|---|---|---|
| Doc A | 1 | 5 |
| Doc B | 4 | 1 |
| Doc C | 2 | 3 |
| Doc D | 3 | not ranked |

With k = 60:

- **Doc A:** 1/61 + 1/65 = 0.01639 + 0.01538 = 0.03177
- **Doc B:** 1/64 + 1/61 = 0.01563 + 0.01639 = 0.03202
- **Doc C:** 1/62 + 1/63 = 0.01613 + 0.01587 = 0.03200
- **Doc D:** 1/63 + 0 = 0.01587

Final ranking: Doc B (0.03202) > Doc C (0.03200) > Doc A (0.03177) > Doc D (0.01587)

Document B wins because it was top-ranked by BM25 and still appeared in the vector search results. Document A was the top vector result but ranked poorly for keywords, so it is slightly behind Doc B and Doc C.

## Why Use Rank Positions Instead of Scores?

The core insight behind RRF is that rank positions are more meaningful than raw scores when combining different retrieval methods.

**Score incompatibility.** A vector cosine similarity of 0.85 and a BM25 score of 12.4 cannot be directly compared. They are produced by different models with different normalization. Any attempt to add or average them requires arbitrary scaling decisions that can favor one method over the other depending on the current query.

**Score instability.** BM25 scores depend on corpus statistics (document frequency, inverse document frequency) that change as the corpus grows. Vector scores depend on the embedding model. Calibrating the scales between them would require frequent recalibration as either changes.

**Rank stability.** Whether a document is the top result or third result is a meaningful, stable signal that does not depend on score scale. RRF leverages this stability.

**Robustness to outliers.** A single extremely high BM25 score for an exact keyword match would dominate a weighted score combination. RRF gives that document only a slight advantage from its high rank rather than allowing its raw score to overwhelm the list.

## The k Parameter

The constant `k` is the most important tuning parameter in RRF. Its role is to reduce the score advantage of documents at the very top of a list relative to those ranked slightly lower.

With k = 60 (the value recommended in the original paper):
- Rank 1 score: 1/61 ≈ 0.01639
- Rank 2 score: 1/62 ≈ 0.01613
- Rank 10 score: 1/70 ≈ 0.01429
- Rank 60 score: 1/120 ≈ 0.00833

The difference between rank 1 and rank 2 is small (1.6% relative). The difference between rank 1 and rank 60 is about 49%. RRF treats the top ranks roughly equally and has a smooth decay toward lower ranks.

With a smaller k (e.g., k = 1), the score advantage for rank 1 becomes much larger relative to rank 2, making the top result from each list more dominant in the combined ranking. With a larger k (e.g., k = 1000), all positions contribute nearly equal scores and the ranking becomes very flat.

In practice, k = 60 is a sensible default. The original paper showed that this value was robust across many benchmark datasets; empirical testing on your specific dataset and query patterns should guide further tuning.

## RRF vs. Weighted Score Combination

The alternative to RRF is a weighted linear combination of normalized scores:

```
Combined(d) = α × score_vector(d) + (1 - α) × score_keyword(d)
```

Where `α` (alpha) controls the balance between the two methods (0 = all keyword, 1 = all vector).

**When to prefer RRF:**
- When you do not want to calibrate `α` and cannot run evaluation experiments
- When the score distributions of the two methods differ significantly or change over time
- When simplicity and interpretability matter: RRF has one meaningful parameter (`k`)
- In most production deployments where both methods should contribute equally

**When to prefer weighted combination:**
- When evaluation data is available and shows that one method significantly outperforms the other on your query distribution
- When domain knowledge justifies weighting (e.g., exact product code searches where keyword precision should dominate)
- When implementing cross-encoder re-ranking at a later stage and the first-pass scores need to reflect calibrated relevance

Most practitioners start with RRF for its robustness and only switch to weighted combination when evaluation data justifies it.

## RRF with More Than Two Result Lists

RRF is not limited to two retrieval methods. The formula sums contributions from any number of result lists, making it straightforward to combine three or more signals:

```
RRF(d) = Σ [ 1 / (k + rank_i(d)) ]
         i=1 to n
```

For example, a [hybrid search](/learn/hybrid-search) system might combine:
1. Vector search results (semantic similarity via [embeddings](/learn/embeddings))
2. BM25 full-text search results (keyword precision via [Tantivy](/learn/tantivy))
3. Recency scores (time-weighted ranking to prefer recent documents)

Each list contributes independently, and documents that rank well across all three signals receive the highest combined scores.

## How RRF Is Used in Production

In a typical [hybrid search](/learn/hybrid-search) pipeline with RRF:

1. The query is submitted to both the vector index and the inverted index simultaneously
2. Each index returns a ranked list of the top-k candidates (e.g., top 100 from each)
3. The union of both lists is formed (up to 200 unique documents)
4. RRF scores are computed for each document in the union
5. Documents are sorted by RRF score, and the top-k are returned to the application

```mermaid
flowchart LR
    Q[Query] --> V[Vector Search\ntop 100]
    Q --> K[BM25 Search\ntop 100]
    V --> U[Union\n≤ 200 docs]
    K --> U
    U --> R[RRF Scoring\n1 / k + rank]
    R --> F[Final Ranking\ntop 10]
```

The number of candidates retrieved from each method (the "retrieval depth") affects both recall and computation. Retrieving more candidates (e.g., top 500 from each) increases the chance that the best documents are included in the union, but also increases the cost of RRF scoring and any subsequent re-ranking step. A retrieval depth of 50-200 is typical for most production deployments.

## Advanced Topics

### RRF and Multi-Stage Retrieval

RRF is commonly used as the fusion step in a two-stage retrieval pipeline:

1. **Stage 1:** BM25 and vector search independently retrieve a broad candidate set (hundreds of documents) with high recall
2. **Stage 2 (RRF):** Candidates from both lists are merged and scored by RRF to produce a shorter, higher-quality ranked list
3. **Stage 3 (optional):** A cross-encoder re-ranker scores each remaining candidate against the query for maximum precision

RRF's rank-based approach makes it fast and deterministic at Stage 2, which is important when the pipeline must complete within a latency budget. Cross-encoder re-ranking (Stage 3) is expensive (each candidate-query pair requires a full model forward pass), so applying it only to the top-20 or top-50 from RRF limits its latency impact.

### RRF in Distributed Search

In distributed search systems where each shard returns a local top-k result list, RRF is applied after gathering results from all shards. The shard-local rankings are often imperfect (a document ranked first on one shard might rank 50th globally), but RRF's tolerance for rank imprecision makes it robust to this limitation.

For exact global relevance ordering, some systems perform a second-pass re-ranking over the merged candidates using raw scores from each shard. This is more expensive than RRF but produces more accurate global rankings when shard score calibration is reliable.

### Evaluating RRF Quality

The standard metric for evaluating a retrieval system's ranking quality is Normalized Discounted Cumulative Gain (NDCG). NDCG@10 measures how well the top 10 results are ordered relative to an ideal ranking, discounting the score of results that appear lower in the list.

To evaluate whether RRF improves over single-method retrieval:

1. Collect a ground truth relevance dataset: a set of queries with known relevant documents
2. Run each retrieval method independently (vector only, BM25 only) and measure NDCG@10 for each
3. Run hybrid search with RRF and measure NDCG@10
4. Compare: ideally, RRF should outperform both individual methods

In practice, hybrid search with RRF consistently outperforms both individual methods on datasets with mixed query types (some semantic, some keyword-dominant). The improvement is largest for technical datasets where users mix natural language questions with exact identifier lookups.

## RRF with Spice

[Spice](/platform/hybrid-sql-search) implements hybrid search with RRF natively in a single SQL runtime. Vector search, [BM25 full-text search](/learn/bm25-full-text-search), and RRF fusion run in the same Apache DataFusion-based execution engine with no separate systems to manage.

The `rrf()` function accepts two or more `vector_search()` or `text_search()` UDTFs as arguments and returns a unified result set with a `fused_score` column:

```sql
-- Hybrid search with RRF in Spice
SELECT id, title, content, fused_score
FROM rrf(
    vector_search(product_docs, 'how to cancel subscription'),
    text_search(product_docs, 'cancel subscription refund', content),
    join_key => 'id'   -- explicit join key for optimal performance
)
ORDER BY fused_score DESC
LIMIT 10;
```

To weight one method more heavily than the other, pass a `rank_weight` argument to the relevant search UDTF:

```sql
-- Boost semantic search over exact keyword matching
SELECT id, title, content, fused_score
FROM rrf(
    text_search(product_docs, 'cancel subscription', content,
                rank_weight => 50.0),
    vector_search(product_docs, 'how to cancel subscription',
                  rank_weight => 200.0)
)
ORDER BY fused_score DESC
LIMIT 10;
```

The `k` smoothing parameter (default 60.0) is configurable per call. Because results are returned as a standard SQL result set, they can be filtered by additional predicates, joined with metadata tables, or combined with application-specific signals. This makes RRF-fused retrieval practical both for [application search](/use-case/application-search) features and as the retrieval stage in [retrieval-augmented generation](/use-case/retrieval-augmented-generation) pipelines.

<ContentRichText
  fields={{
    coverage: 'rc-end',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<AccordionFaq
  fields={{
    heading: 'Reciprocal Rank Fusion FAQ',
    paragraph: '',
    items: [
      {
        title: 'What does Reciprocal Rank Fusion do?',
        paragraph:
          '<p>RRF combines result lists from multiple retrieval methods (e.g., vector search and BM25) into a single ranked output. Instead of comparing raw scores, it assigns each document a value based on its position in each list and sums those values. Documents that appear near the top of multiple lists receive the highest combined scores.</p>',
      },
      {
        title: 'What is the k parameter in RRF?',
        paragraph:
          "<p>The k constant (typically 60) dampens the score advantage for documents ranked at the very top of a list. A smaller k makes the top result more dominant; a larger k flattens the ranking so all positions contribute nearly equal scores. The value 60 was shown to be robust across many benchmark datasets in the original 2009 paper and is a sensible default for most use cases.</p>",
      },
      {
        title: 'When should I use RRF instead of weighted score combination?',
        paragraph:
          '<p>Use RRF when you do not have evaluation data to calibrate the weighting between methods, or when the score distributions of your retrieval methods differ significantly. Use weighted combination when you have evaluation data showing that one method clearly outperforms the other for your query distribution and you want to favor it proportionally.</p>',
      },
      {
        title: 'Can RRF combine more than two result lists?',
        paragraph:
          '<p>Yes. The RRF formula sums contributions from any number of ranked lists. You can combine vector search, BM25, recency scores, and other signals; each list contributes a term to the sum. Documents ranking well across all signals receive the highest scores.</p>',
      },
      {
        title: 'Does RRF work for all types of queries?',
        paragraph:
          '<p>RRF works well for most query types, especially mixed workloads that include both semantic questions and exact identifier lookups. For highly specialized domains where one retrieval method clearly dominates (e.g., exact code search where keyword matching always wins), weighted combination or single-method retrieval may be more appropriate. Evaluating on your specific dataset and query distribution is the best way to determine the right approach.</p>',
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<ContentResourceFeatured
  fields={{
    heading: 'Learn more about hybrid search and RRF',
    paragraph:
      'Guides on building hybrid search with vector, full-text, and RRF fusion in a single SQL runtime.',
    mode: 'default',
    resources: [
      {
        source: 'manual',
        resource: null,
        resource_manual: {
          eyebrow: 'Docs',
          title: {
            title: 'Hybrid Search Docs',
            url: 'https://spiceai.org/docs/features/search',
            target: '_blank',
          },
          description:
            'Learn how Spice provides semantic, full-text, and hybrid search with built-in RRF fusion in a single SQL-native runtime.',
          image: {
            ID: 1661,
            id: 1661,
            title: 'Docs jpeg',
            filename: 'Docs-jpeg.jpeg',
            filesize: 103192,
            url: '/website-assets/media/2025/12/Docs-jpeg.jpeg',
            link: '/docs-jpeg/',
            alt: '',
            author: '9',
            description: '',
            caption: '',
            name: 'docs-jpeg',
            status: 'inherit',
            uploaded_to: 0,
            date: '2025-12-05 04:13:53',
            modified: '2025-12-05 04:13:53',
            menu_order: 0,
            mime_type: 'image/jpeg',
            type: 'image',
            subtype: 'jpeg',
            icon: '/website-assets/media/default.png',
            width: 1832,
            height: 1036,
            sizes: {
              thumbnail: '/website-assets/media/2025/12/Docs-jpeg-150x150.jpeg',
              'thumbnail-width': 150,
              'thumbnail-height': 150,
              medium: '/website-assets/media/2025/12/Docs-jpeg-300x170.jpeg',
              'medium-width': 300,
              'medium-height': 170,
              medium_large:
                '/website-assets/media/2025/12/Docs-jpeg-768x434.jpeg',
              'medium_large-width': 768,
              'medium_large-height': 434,
              large: '/website-assets/media/2025/12/Docs-jpeg-1024x579.jpeg',
              'large-width': 1024,
              'large-height': 579,
              '1536x1536':
                '/website-assets/media/2025/12/Docs-jpeg-1536x869.jpeg',
              '1536x1536-width': 1536,
              '1536x1536-height': 869,
              '2048x2048': '/website-assets/media/2025/12/Docs-jpeg.jpeg',
              '2048x2048-width': 1832,
              '2048x2048-height': 1036,
            },
          },
        },
      },
      {
        source: 'picker',
        resource: [
          {
            title: 'Real-Time Hybrid Search Using RRF',
            slug: '/blog/real-time-hybrid-search-using-rrf',
            excerpt:
              'How Spice implements hybrid search with Reciprocal Rank Fusion for combined vector and keyword retrieval.',
            image:
              '/website-assets/media/2025/11/ExternalLinkImage.png',
            type: 'Blog',
            taxonomy: ['Engineering'],
          },
        ],
        resource_manual: {
          eyebrow: '',
          title: null,
          description: '',
          image: false,
        },
      },
      {
        source: 'picker',
        resource: [
          {
            title: 'Getting Started with Amazon S3 Vectors and Spice',
            slug: '/blog/getting-started-with-amazon-s3-vectors-and-spice',
            excerpt:
              'How to use Spice hybrid vector and full-text search with Amazon S3 Vectors.',
            image:
              '/website-assets/media/2025/11/ExternalLinkImage.png',
            type: 'Blog',
            taxonomy: ['Engineering'],
          },
        ],
        resource_manual: {
          eyebrow: '',
          title: null,
          description: '',
          image: false,
        },
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<ContentCta
  fields={{
    override_global_setting: false,
    custom_content: { heading: '', paragraph: '', cta: null },
    padding_top: 'unset',
    padding_bottom: 'unset',
    gcta_heading: 'See Spice in action',
    gcta_paragraph:
      'Get a guided walkthrough of how development teams use Spice to query, accelerate, and integrate AI for mission-critical workloads.',
    gcta_cta: {
      title: 'Get a demo',
      url: 'https://meetings.hubspot.com/vladi-semenov',
      target: '_blank',
    },
  }}
/>

---

## What is Retrieval Augmented Generation (RAG)?
URL: https://spice.ai/learn/retrieval-augmented-generation
Date: 2025-12-27T00:00:00
Description: Retrieval augmented generation (RAG) grounds LLM responses in real data by retrieving relevant context at inference time. Learn how RAG works, its architecture, and production best practices.

<HeroCenteredText
  fields={{
    graphic_position: 'no-graphic',
    heading_tag: 'h1',
    heading: 'What is Retrieval Augmented Generation?',
    paragraph:
      'Retrieval augmented generation (RAG) is an AI architecture pattern that improves large language model (LLM) responses by retrieving relevant data from external sources and including it in the prompt at inference time.',
    cta: [
      {
        type: 'filled',
        cta: {
          title: 'See Spice for RAG',
          url: '/use-case/retrieval-augmented-generation',
          target: '',
        },
      },
      {
        type: 'bordered',
        cta: {
          title: 'Read the docs',
          url: 'https://spiceai.org/docs',
          target: '',
        },
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<ContentRichText
  fields={{
    coverage: 'rc-start',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

Large language models are trained on massive text corpora, but that training data has a cutoff date and doesn't include an organization's private data. When you ask an LLM a question about your company's products, internal policies, or recent events, it either guesses (hallucinating a plausible-sounding answer) or admits it doesn't know.

Retrieval augmented generation solves this by adding a retrieval step before generation. Instead of relying solely on knowledge baked into model weights, RAG retrieves relevant documents, database records, or API responses and injects them into the LLM's context window. The model generates its answer grounded in this specific, current data, dramatically reducing hallucinations and enabling domain-specific, accurate responses.

## How RAG Works

A RAG system operates in three stages: indexing source data ahead of time, retrieving relevant context at query time, and augmenting the LLM prompt with that context before generation.

### Stage 1: Indexing

Before RAG can retrieve anything, source data must be indexed. This involves:

1. **Collecting source data** from databases, knowledge bases, document stores, APIs, and file systems
2. **Chunking** long documents into smaller segments (typically 256-1024 tokens) that fit within an LLM's context window
3. **Embedding** each chunk into a vector representation using an embedding model (e.g., OpenAI's text-embedding-3, Cohere Embed, or open-source alternatives)
4. **Storing** the vectors alongside the original text in a vector index or database

This indexing step runs ahead of time and must be refreshed as source data changes. Stale indexes are one of the most common failure modes in production RAG systems: the retriever returns outdated context, and the LLM generates outdated answers.

### Stage 2: Retrieval

When a user query arrives:

1. The query is embedded using the same embedding model used during indexing
2. The query vector is compared against the index to find the most semantically similar chunks (typically using cosine similarity or dot product)
3. The top-k most relevant chunks are returned as candidate context

In practice, pure vector search often isn't enough. **Hybrid search**, combining vector similarity with keyword (BM25) matching, significantly improves retrieval quality. Vector search captures semantic meaning ("What are your refund terms?" matches "return policy"), while keyword search catches exact terms that vector search might miss (product names, error codes, technical identifiers).

The quality of retrieval is the single most important factor in RAG performance. If the retriever returns irrelevant chunks, the LLM generates poor answers regardless of how capable the model is. Improving retrieval quality (through better chunking, hybrid search, re-ranking, and metadata filtering) typically has a larger impact than switching to a more powerful LLM.

### Stage 3: Augmented Generation

The retrieved chunks are assembled into the LLM prompt as context, typically before the user's question:

```
Context:
[Retrieved chunk 1]
[Retrieved chunk 2]
[Retrieved chunk 3]

User question: What is the refund policy for enterprise plans?

Answer based on the context above:
```

The LLM generates a response grounded in this specific, retrieved data. Because the model has the actual source material in its context, it can provide accurate, specific answers with citations traceable back to source documents.

## RAG vs. Fine-Tuning

RAG and fine-tuning are the two main approaches to customizing LLM behavior with domain-specific knowledge. They solve different problems and are often combined.

**Fine-tuning** modifies a model's weights by training on domain-specific data. This permanently embeds knowledge and behavior patterns into the model. Fine-tuning is effective for changing the model's tone, style, or reasoning patterns: for example, training it to respond like a technical support agent or to follow a specific output format.

**RAG** retrieves knowledge at inference time without modifying the model. This is effective for injecting factual, frequently changing information: product documentation, internal policies, customer data, real-time metrics.

The key tradeoff is **maintenance cost vs. flexibility**:

- Fine-tuning is expensive (GPU hours, labeled data) and slow to update. When information changes, the model must be retrained.
- RAG is cheap to update: new knowledge becomes available as soon as it's indexed. But it depends on retrieval quality and is bounded by context window size.

Most production systems use both: fine-tuning for behavior and style, RAG for factual knowledge.

## Production RAG Challenges

The gap between a RAG prototype and a production RAG system is significant. Several data infrastructure challenges determine whether the system is reliable enough for real users.

### Data Freshness

If your vector index is rebuilt nightly, every answer is at least a day stale. For many use cases (customer support, compliance queries, operational dashboards), this staleness is unacceptable.

Production RAG systems need real-time or near-real-time indexing. This typically involves [change data capture (CDC)](/learn/change-data-capture) to detect when source data changes and incrementally update the vector index. Without CDC, teams resort to periodic full re-indexing, which is slow and expensive at scale.

### Retrieval Quality

Poor retrieval is the most common reason RAG systems underperform. Common failure modes include:

- **Chunking too aggressively:** Important context is split across chunks, so no single chunk contains enough information
- **Missing keyword matches:** Pure vector search misses exact terms (product names, error codes) that users search for
- **Irrelevant results:** The retriever returns semantically similar but factually irrelevant content
- **Missing metadata filters:** Queries that should be scoped (e.g., "2026 pricing") retrieve content from all time periods

[Hybrid search](/platform/hybrid-sql-search), combining vector similarity with BM25 keyword matching, addresses several of these failures. Re-ranking models (e.g., Cohere Rerank, cross-encoders) can further improve precision by scoring retrieved chunks against the query using a more expensive model.

### Multi-Source Federation

Enterprise data doesn't live in a single database. Customer records are in PostgreSQL, product documentation is in Confluence, support tickets are in Zendesk, and financial data is in Snowflake. A production RAG system needs to retrieve from all of these sources.

Building a separate retrieval pipeline for each source is fragile and doesn't scale. [SQL federation](/learn/sql-federation) provides a unified query interface across all sources, so the RAG system can retrieve structured data from any connected system alongside vector search results.

### Observability and Evaluation

Production RAG systems need monitoring to detect quality degradation:

- **Retrieval metrics:** Are the retrieved chunks relevant? How often does the retriever return empty or low-confidence results?
- **Generation metrics:** Are the LLM's answers faithful to the retrieved context, or is it hallucinating beyond what the context supports?
- **End-to-end metrics:** Are users finding the answers helpful? What's the failure rate?

Without observability, RAG quality degrades silently as source data changes, retrieval patterns shift, or index staleness increases.

## Common RAG Use Cases

### Customer Support and Knowledge Base Q&A

Connect an LLM to product documentation, FAQ articles, and support ticket history. Users ask natural language questions and receive accurate, cited answers drawn from authoritative sources, reducing support ticket volume and improving resolution time.

### Internal Enterprise Search

Employees search across internal wikis, policies, engineering docs, and Slack history using natural language. RAG provides answers with citations, not just a list of matching documents.

### Code Assistance and Developer Tools

AI coding assistants use RAG to ground suggestions in the actual codebase, API documentation, and project-specific patterns. This dramatically reduces incorrect or hallucinated code suggestions.

### Compliance and Regulatory Queries

Legal and compliance teams query regulatory documents, internal policies, and audit records. RAG ensures answers are traceable to specific source documents, critical for regulatory compliance.

## RAG with Spice

[Spice](/use-case/retrieval-augmented-generation) provides the data infrastructure layer that production RAG systems require:

- **[Hybrid search](/platform/hybrid-sql-search)** combining vector, full-text, and SQL retrieval in a single query
- **[SQL federation](/learn/sql-federation)** for retrieving structured data from [40+ connected sources](/integrations) alongside vector search results
- **[Real-time CDC](/feature/real-time-change-data-capture)** to keep vector indexes and acceleration caches fresh as source data changes
- **[LLM inference](/platform/llm-inference)** for running embedding and generation models alongside data queries

This unified runtime means RAG applications can index, retrieve, and generate in a single system instead of stitching together separate vector databases, search engines, and data pipelines.

## Advanced Topics

### The Full RAG Pipeline

A production RAG pipeline involves more stages than the basic three-step model suggests. Between the user's query and the final generated response, multiple processing and refinement steps determine answer quality.

```mermaid
flowchart LR
    A[Query] --> B[Embed Query]
    B --> C[Retrieve Candidates]
    C --> D[Re-rank]
    D --> E[Augment Prompt]
    E --> F[Generate Response]
```

Understanding each stage (and where quality breaks down) is essential for debugging and improving RAG systems in production.

### Chunking Strategies

How source documents are split into chunks has an outsized impact on retrieval quality. The simplest approach (splitting on a fixed token count) often breaks mid-sentence or separates a question from its answer.

**Recursive character splitting** divides text hierarchically: first by section headers, then by paragraphs, then by sentences. This preserves semantic boundaries better than fixed-size splits. **Semantic chunking** goes further by using an embedding model to detect topic shifts and placing chunk boundaries where the semantic similarity between adjacent sentences drops. This produces chunks that are coherent units of meaning rather than arbitrary slices.

**Parent-child chunking** (also called small-to-big retrieval) indexes small chunks for retrieval precision but returns the surrounding parent chunk for generation context. The retriever matches on a focused passage, but the LLM receives enough surrounding context to generate a complete answer. This balances retrieval precision against generation context, a tradeoff that single-level chunking cannot address.

Chunk overlap (including 10-20% of the previous chunk at the start of each new chunk) helps preserve context at boundaries but increases index size. The optimal overlap depends on the nature of the source material.

### Re-ranking

Initial retrieval (whether vector, keyword, or [hybrid](/learn/hybrid-search)) uses a bi-encoder model that embeds the query and documents independently. This is fast but imprecise: the query and document never directly attend to each other.

**Cross-encoder re-rankers** score each candidate by processing the query and document together through a single model, allowing full cross-attention between them. This produces significantly more accurate relevance scores but is too expensive to run against the full index. The standard pattern is to retrieve a larger candidate set (e.g., top-50 from initial retrieval) and re-rank to the final top-k (e.g., top-5).

Re-ranking is one of the highest-impact improvements for RAG quality. In benchmarks, adding a cross-encoder re-ranker to a hybrid retrieval pipeline typically improves answer accuracy by 10-20% without changing any other component.

### Multi-Hop Retrieval

Some questions cannot be answered from a single retrieved passage. "How does our enterprise pricing compare to competitors mentioned in Q4 analyst reports?" requires first finding the analyst reports, then extracting competitor mentions, then retrieving pricing data for each competitor.

Multi-hop retrieval decomposes complex queries into sub-queries, retrieves context for each, and chains the results. The LLM generates intermediate queries based on partial results, retrieves additional context, and synthesizes across all retrieved information. This is more complex than single-shot retrieval (it requires the LLM to plan a retrieval strategy), but it's necessary for questions that span multiple documents or require reasoning across disparate data sources.

Frameworks for multi-hop retrieval include iterative retrieval (retrieve, reason, retrieve again) and graph-based retrieval (following entity relationships across a knowledge graph to gather connected context). Both patterns increase latency but enable the system to answer questions that would otherwise require multiple user interactions.

<ContentRichText
  fields={{
    coverage: 'rc-end',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<AccordionFaq
  fields={{
    heading: 'RAG FAQ',
    paragraph: '',
    items: [
      {
        title: 'What is the difference between RAG and fine-tuning?',
        paragraph:
          "<p>Fine-tuning modifies a model's weights by training on domain-specific data, permanently embedding that knowledge. RAG retrieves relevant data at inference time and injects it into the prompt. Fine-tuning is better for changing style or behavior; RAG is better for injecting factual, frequently changing knowledge. Most production systems combine both.</p>",
      },
      {
        title: 'What types of data can RAG retrieve from?',
        paragraph:
          '<p>RAG can retrieve from any data source that can be indexed: relational databases, document stores, vector databases, APIs, PDFs, wikis, and file systems. SQL-based retrieval (querying structured data directly) is an emerging pattern that complements vector search for structured enterprise data.</p>',
      },
      {
        title: 'Does RAG eliminate hallucinations completely?',
        paragraph:
          '<p>No. RAG significantly reduces hallucinations by grounding responses in retrieved data, but the model can still misinterpret context or generate plausible but incorrect inferences. Proper evaluation, chunk quality monitoring, and response validation remain important in production systems.</p>',
      },
      {
        title: 'What is hybrid search in the context of RAG?',
        paragraph:
          '<p>Hybrid search combines vector similarity search (finding semantically similar content) with keyword search (exact term matching). This improves retrieval quality because vector search alone can miss exact terms while keyword search alone misses semantic meaning. Combining both methods is especially important for technical and domain-specific queries.</p>',
      },
      {
        title: 'How does RAG handle large-scale enterprise data?',
        paragraph:
          '<p>Enterprise RAG requires a data infrastructure layer that can federate queries across multiple sources, cache frequently accessed data for low-latency retrieval, and keep indexes fresh through real-time synchronization. Spice provides SQL federation, query acceleration, and hybrid search in a single runtime purpose-built for these requirements.</p>',
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<ContentResourceFeatured
  fields={{
    heading: 'Learn more about RAG',
    paragraph:
      'Technical guides and blog posts on building production RAG systems with hybrid search and real-time data.',
    mode: 'default',
    resources: [
      {
        source: 'manual',
        resource: null,
        resource_manual: {
          eyebrow: 'Docs',
          title: {
            title: 'Hybrid Search Docs',
            url: 'https://spiceai.org/docs/features/search',
            target: '_blank',
          },
          description:
            'Learn how Spice provides semantic, full-text, and hybrid search capabilities for RAG applications.',
          image: {
            ID: 1661,
            id: 1661,
            title: 'Docs jpeg',
            filename: 'Docs-jpeg.jpeg',
            filesize: 103192,
            url: '/website-assets/media/2025/12/Docs-jpeg.jpeg',
            link: '/docs-jpeg/',
            alt: '',
            author: '9',
            description: '',
            caption: '',
            name: 'docs-jpeg',
            status: 'inherit',
            uploaded_to: 0,
            date: '2025-12-05 04:13:53',
            modified: '2025-12-05 04:13:53',
            menu_order: 0,
            mime_type: 'image/jpeg',
            type: 'image',
            subtype: 'jpeg',
            icon: '/website-assets/media/default.png',
            width: 1832,
            height: 1036,
            sizes: {
              thumbnail: '/website-assets/media/2025/12/Docs-jpeg-150x150.jpeg',
              'thumbnail-width': 150,
              'thumbnail-height': 150,
              medium: '/website-assets/media/2025/12/Docs-jpeg-300x170.jpeg',
              'medium-width': 300,
              'medium-height': 170,
              medium_large:
                '/website-assets/media/2025/12/Docs-jpeg-768x434.jpeg',
              'medium_large-width': 768,
              'medium_large-height': 434,
              large: '/website-assets/media/2025/12/Docs-jpeg-1024x579.jpeg',
              'large-width': 1024,
              'large-height': 579,
              '1536x1536':
                '/website-assets/media/2025/12/Docs-jpeg-1536x869.jpeg',
              '1536x1536-width': 1536,
              '1536x1536-height': 869,
              '2048x2048': '/website-assets/media/2025/12/Docs-jpeg.jpeg',
              '2048x2048-width': 1832,
              '2048x2048-height': 1036,
            },
          },
        },
      },
      {
        source: 'picker',
        resource: [
          {
            title:
              'True Hybrid Search: Vector, Full-Text, and SQL in One Runtime',
            slug: '/blog/true-hybrid-search',
            excerpt:
              'Build hybrid search without managing multiple systems. Query vectors, run full-text search, and execute SQL in one unified runtime.',
            image: '/website-assets/media/2025/09/image-33.png',
            type: 'Blog',
            taxonomy: ['Spice AI'],
          },
        ],
        resource_manual: {
          eyebrow: '',
          title: null,
          description: '',
          image: false,
        },
      },
      {
        source: 'picker',
        resource: [
          {
            title:
              'Real-Time Hybrid Search Using RRF: A Hands-On Guide with Spice',
            slug: '/blog/real-time-hybrid-search-using-rrf',
            excerpt:
              'Learn how to build hybrid search with Reciprocal Rank Fusion (RRF) directly in SQL using Spice, combining text, vector, and time-based relevance in one query.',
            image:
              '/website-assets/media/2025/11/68fa4fdfded26b3b6472a172_image-8.png',
            type: 'Blog',
            taxonomy: ['Search', 'Spice AI'],
          },
        ],
        resource_manual: {
          eyebrow: '',
          title: null,
          description: '',
          image: false,
        },
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<TalkToAnEngineerCta />

---

## What is the Sidecar Pattern?
URL: https://spice.ai/learn/sidecar-pattern
Date: 2026-04-03T00:00:00
Description: The sidecar pattern deploys a helper process alongside the main application in the same host or pod, communicating over local loopback. Learn how sidecars work, when to use them, and how the pattern applies to data and AI runtimes.

<HeroCenteredText
  fields={{
    graphic_position: 'no-graphic',
    heading_tag: 'h1',
    heading: 'What is the Sidecar Pattern?',
    paragraph:
      'The sidecar pattern deploys a secondary process alongside the main application in the same host or Kubernetes pod. The sidecar and the main application share the same network namespace, communicating over local loopback rather than over a network. This eliminates network overhead for calls between them and gives the application low-latency access to sidecar capabilities.',
    cta: [
      {
        type: 'filled',
        cta: {
          title: 'See Spice deployment options',
          url: '/platform/sql-federation-acceleration',
          target: '',
        },
      },
      {
        type: 'bordered',
        cta: {
          title: 'Read the deployment docs',
          url: 'https://spiceai.org/docs/deployment/architectures',
          target: '_blank',
        },
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<ContentRichText
  fields={{
    coverage: 'rc-start',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

In software architecture, sidecars appear across many contexts: service meshes use sidecars (Envoy, Linkerd) to intercept and manage network traffic; observability platforms use sidecars to collect logs and metrics; data runtimes use sidecars to serve accelerated data and run local inference. The underlying concept is the same in each case: co-locate a helper process with the application it serves to reduce communication overhead and decouple concerns.

The pattern takes its name from motorcycle sidecars: an additional compartment attached to the side of the main vehicle. The sidecar depends on the motorcycle to operate but handles its own responsibilities.

## How the Sidecar Pattern Works

In a Kubernetes deployment, the sidecar runs as a second container within the same Pod as the main application. Because containers in a Kubernetes Pod share the same network namespace, they communicate over `localhost`, the loopback interface. There is no DNS resolution, no load balancer, and no network hop.

```mermaid
flowchart LR
    subgraph Pod["Kubernetes Pod"]
        App["Main Application\nContainer"] <-->|localhost| SC["Sidecar\nContainer"]
    end
    SC <-->|Network| Ext["External Services\n(databases, APIs)"]
```

Key properties of sidecar deployments:

- **Loopback communication.** Calls from the application to the sidecar travel over the loopback interface. Round-trip latency is measured in microseconds, not milliseconds.
- **Shared lifecycle.** In Kubernetes, all containers in a Pod start and stop together. The sidecar's lifecycle is coupled to the application's. When the application pod restarts, the sidecar restarts too.
- **Independent process.** Despite sharing a Pod, the sidecar runs as a separate process with its own CPU, memory, and filesystem. It does not share memory address space with the application (unlike a library).
- **Per-instance deployment.** Each application pod gets its own dedicated sidecar instance. There is no sharing between pods; each sidecar is isolated to its co-located application.

On non-Kubernetes infrastructure (bare metal, VMs, Docker Compose), the sidecar runs as a separate process on the same host, connected to the application over `127.0.0.1`.

## The Sidecar Pattern vs. Background Services

In classic multi-process application design, "background service" and "sidecar" are similar concepts. The key distinctions in modern distributed systems:

**Sidecar** specifically implies co-location with a single application instance: one sidecar per application pod. It is not shared across applications. Its purpose is to extend the capabilities of that specific application instance. Many teams use this pattern to [simplify data and AI application architectures](/learn/how-to-simplify-data-and-ai-application-architectures) by eliminating separate infrastructure components.

**Background service (microservice)** runs independently and is shared across multiple callers. It scales independently, has its own deployment lifecycle, and is accessed over the network.

The sidecar is a private extension of the application. The microservice is a shared infrastructure component. For a full comparison of these patterns in the context of data runtimes, see [Sidecar vs Microservice Architecture](/learn/sidecar-vs-microservice-architecture).

## When the Sidecar Pattern Makes Sense

### Latency-critical data access

When an application needs to query data in the hot path of a request (for real-time fraud scoring, inline personalization, or sub-millisecond cache lookups), a network round-trip to a remote service adds latency that is hard to eliminate. A sidecar serving locally cached data over loopback can respond in under a millisecond, indistinguishable from an in-process call with the operational simplicity of a separate process.

### Local AI inference

Running an LLM or embedding model inference alongside the application means embeddings and completions do not leave the host. The sidecar handles model loading, threading, and batching while the application calls it over a simple HTTP or gRPC API on `localhost`. This pattern is increasingly common for privacy-sensitive workloads where inference must remain inside a trust boundary.

### Service mesh data planes

Envoy Proxy, the sidecar component in Istio and other service meshes, intercepts all inbound and outbound network traffic from the application. Because it runs as a sidecar, it can apply mTLS, circuit breaking, retries, and observability instrumentation without modifying the application code. The sidecar handles cross-cutting concerns; the application focuses on business logic.

### Log and metrics agents

Observability agents (Fluent Bit, the OpenTelemetry Collector, Datadog Agent) run as sidecars to collect logs, traces, and metrics from the co-located application. The application writes to a local socket or shared volume; the agent batches and forwards to the observability backend. This decouples telemetry collection from the application's primary process.

### Edge and offline resilience

When applications run at edge locations with unreliable connectivity, a sidecar caching critical data locally ensures the application continues serving requests during network outages. The sidecar loads data from a central cluster when connected and serves from its local cache when disconnected. This availability pattern is not possible with a remote service dependency.

## Sidecar Resource Considerations

Every sidecar consumes CPU and memory on the application pod's node. The resources are not shared with other pods; each sidecar is dedicated to its pod.

**Memory:** A sidecar used for local data acceleration needs enough memory to hold its working dataset. A sidecar caching 500 MB of data with an Arrow in-memory engine needs approximately 500 MB of container memory plus overhead for query execution. This must be reserved in the pod spec.

**CPU:** Data serving sidecars are typically CPU-light during steady-state query serving (especially for in-memory columnar data). CPU usage peaks during data refresh cycles, when the sidecar pulls updated data from an upstream source or cluster.

**Aggregate cluster cost:** With many application pods, the total resource cost of sidecar duplication becomes significant. 50 pods each with a sidecar using 1 GB RAM means 50 GB of RAM allocated across the cluster for sidecars alone. This overhead is the primary argument for centralizing to a microservice at large scale.

## Sidecar Pattern in Data and AI Platforms

Data and AI runtimes have adopted the sidecar pattern because it addresses the latency requirements of latency-sensitive application-serving workloads that remote shared services cannot meet.

A data runtime sidecar typically:

1. Connects to one or more upstream data sources (databases, object stores, warehouses) at startup
2. Loads a configured working set of data locally using [acceleration](/learn/data-acceleration)
3. Keeps that data synchronized using [CDC-based incremental refresh](/learn/change-data-capture) or scheduled full refresh
4. Serves SQL queries from the application over a local endpoint (Arrow Flight SQL, HTTP, gRPC)

From the application's perspective, the sidecar is a local database. Queries execute against in-memory or on-disk accelerated data with sub-millisecond latency. The application code does not need to know whether the sidecar is serving from a local cache or delegating to an upstream source; the SQL interface is identical either way.

In a [hybrid data architecture](/learn/hybrid-data-architecture), sidecars serve the hot path while a centralized cluster handles data ingestion, refresh pipelines, and large analytical queries. Sidecars transparently delegate cache-miss queries to the cluster over Arrow Flight gRPC, with the application unaware of which tier served each request.

## Sidecar Pattern in Service Meshes

Service mesh sidecars are the most widely deployed example of the sidecar pattern at scale. Envoy Proxy (used in Istio, Consul Connect, and others) runs as a sidecar in every application pod and intercepts all network traffic:

- **Inbound traffic** passes through the sidecar proxy before reaching the application
- **Outbound traffic** passes through the sidecar before leaving the pod

This interception allows the service mesh to apply consistent policies (mTLS, rate limiting, circuit breaking, retries) and collect consistent telemetry (request counts, latency percentiles, error rates) across all services without any application changes.

The sidecar proxy is opaque to the application: from the application's perspective, it sends requests to `service-name:port` and receives responses. The sidecar handles the TLS termination, retries, and observability transparently.

## Advanced Topics

### Init Containers and Startup Ordering

In Kubernetes, init containers run to completion before the main application containers start. In some sidecar deployments, an init container pre-populates a shared volume or performs startup bootstrapping (e.g., loading an initial dataset snapshot) before the main application and sidecar containers start.

As of Kubernetes 1.29, sidecar containers can be declared with `restartPolicy: Always` in the init container list, giving Kubernetes native sidecar semantics: the sidecar starts before the application, restarts on failure without terminating the pod, and is guaranteed to terminate after the application container. This addresses a historical challenge where sidecar containers had no lifecycle guarantees relative to the application.

### Memory-Mapped Storage in Sidecars

For sidecars serving large local datasets, memory-mapped files offer a significant advantage over loading data fully into heap memory. Memory-mapped files are backed by the operating system's page cache. Pages are loaded on demand (on first access) and evicted by the OS when memory pressure increases. The RSS (Resident Set Size) of the sidecar grows only as accessed pages are loaded, rather than immediately consuming memory for the full dataset.

The [Vortex](/learn/vortex) columnar format used in Spice Cayenne is designed for memory-mapped access. Encoded data is read directly from the mapped file without decompression into a separate buffer, which reduces memory usage and improves scan throughput for large cached datasets.

### Container Resource Limits and QoS Class

Kubernetes assigns a Quality of Service (QoS) class to each pod based on its resource requests and limits. Pods with both CPU and memory requests equal to limits are assigned the `Guaranteed` QoS class, which makes them the last to be evicted under node memory pressure. For latency-critical sidecar deployments, setting matching requests and limits ensures the pod is not evicted during resource contention.

Sidecar containers within a pod share the pod's QoS class. If the application container has `Guaranteed` QoS, the sidecar also receives `Guaranteed` QoS, protecting both from eviction.

## Sidecar Deployment with Spice

[Spice](/platform/sql-federation-acceleration) is designed to run in sidecar mode alongside applications in Kubernetes. The Spice runtime deploys as a container within the application pod, connects to configured data sources, loads the declared datasets into a local acceleration engine (Arrow in-memory, DuckDB on-disk, or Vortex via Spice Cayenne), and exposes them through Arrow Flight SQL, HTTP, and gRPC on `localhost`.

In a typical Kubernetes deployment:

```yaml
# kubernetes/deployment.yaml (abbreviated)
spec:
  containers:
    - name: app
      image: myapp:latest
      env:
        - name: SPICE_ENDPOINT
          value: "localhost:50051"  # Arrow Flight SQL on loopback
    - name: spice
      image: spiceai/spiceai:latest
      volumeMounts:
        - name: spicepod-config
          mountPath: /app
```

The application queries Spice over `localhost:50051` (Arrow Flight SQL) or `localhost:8090` (HTTP). All query planning, federation, and local acceleration happen within the sidecar; the application sends SQL and receives results with sub-millisecond latency for accelerated datasets.

When the sidecar receives a query for data not in its local cache, it transparently delegates to the centralized Spice cluster or queries the upstream source directly, following the same tiered model as Spice's [edge-to-cloud deployments](/feature/edge-to-cloud-deployments). The application sees identical SQL semantics regardless of which path the query takes. For a full comparison of sidecar and microservice deployment modes, see [Sidecar vs Microservice Architecture](/learn/sidecar-vs-microservice-architecture).

<ContentRichText
  fields={{
    coverage: 'rc-end',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<AccordionFaq
  fields={{
    heading: 'Sidecar Pattern FAQ',
    paragraph: '',
    items: [
      {
        title: 'What is the sidecar pattern?',
        paragraph:
          '<p>The sidecar pattern deploys a secondary process alongside the main application in the same host or Kubernetes pod. The sidecar and application share the same network namespace and communicate over local loopback, eliminating network overhead. The sidecar handles specific responsibilities (data caching, network proxying, observability) while the application focuses on business logic.</p>',
      },
      {
        title: 'How does the sidecar pattern differ from a microservice?',
        paragraph:
          '<p>A sidecar is co-located with a single application instance and is private to that instance. A microservice runs as an independent, shared service accessed over the network by multiple callers. Sidecars provide lower latency (loopback vs. network) but consume resources per-instance. Microservices share resources across callers but add network latency. See the full comparison at <a href="/learn/sidecar-vs-microservice-architecture">Sidecar vs Microservice Architecture</a>.</p>',
      },
      {
        title: 'What are the resource implications of the sidecar pattern?',
        paragraph:
          '<p>Each sidecar consumes dedicated CPU and memory on its pod\'s node. With many application replicas, the total cluster cost of sidecar duplication multiplies. A sidecar using 1 GB of RAM in a 50-pod deployment consumes 50 GB of RAM across the cluster. For large-scale deployments where resource efficiency matters more than absolute latency, a centralized microservice may be more cost-effective.</p>',
      },
      {
        title: 'How is the sidecar pattern used in service meshes?',
        paragraph:
          '<p>Service meshes like Istio deploy Envoy Proxy as a sidecar in each application pod. The proxy intercepts all inbound and outbound traffic, applying mTLS, circuit breaking, retries, and telemetry collection without any application changes. Because Envoy runs as a sidecar, it shares the pod network namespace and can intercept all traffic at the loopback level.</p>',
      },
      {
        title: 'Can sidecars be used for local AI inference?',
        paragraph:
          '<p>Yes. Running an LLM or embedding model as a sidecar keeps inference on the same host as the application, eliminating network latency for inference calls and avoiding data leaving the trust boundary. The application calls the sidecar over localhost with a standard API (OpenAI-compatible HTTP, gRPC). This pattern is common for privacy-sensitive workloads and latency-critical AI applications.</p>',
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<ContentResourceFeatured
  fields={{
    heading: 'Learn more about sidecar deployment',
    paragraph:
      'Documentation and guides on deploying Spice as a sidecar for sub-millisecond data access.',
    mode: 'default',
    resources: [
      {
        source: 'manual',
        resource: null,
        resource_manual: {
          eyebrow: 'Docs',
          title: {
            title: 'Deployment Architecture Docs',
            url: 'https://spiceai.org/docs/deployment/architectures',
            target: '_blank',
          },
          description:
            'Learn how to deploy Spice as a sidecar alongside your application for sub-millisecond data access and local AI inference.',
          image: {
            ID: 1661,
            id: 1661,
            title: 'Docs jpeg',
            filename: 'Docs-jpeg.jpeg',
            filesize: 103192,
            url: '/website-assets/media/2025/12/Docs-jpeg.jpeg',
            link: '/docs-jpeg/',
            alt: '',
            author: '9',
            description: '',
            caption: '',
            name: 'docs-jpeg',
            status: 'inherit',
            uploaded_to: 0,
            date: '2025-12-05 04:13:53',
            modified: '2025-12-05 04:13:53',
            menu_order: 0,
            mime_type: 'image/jpeg',
            type: 'image',
            subtype: 'jpeg',
            icon: '/website-assets/media/default.png',
            width: 1832,
            height: 1036,
            sizes: {
              thumbnail: '/website-assets/media/2025/12/Docs-jpeg-150x150.jpeg',
              'thumbnail-width': 150,
              'thumbnail-height': 150,
              medium: '/website-assets/media/2025/12/Docs-jpeg-300x170.jpeg',
              'medium-width': 300,
              'medium-height': 170,
              medium_large:
                '/website-assets/media/2025/12/Docs-jpeg-768x434.jpeg',
              'medium_large-width': 768,
              'medium_large-height': 434,
              large: '/website-assets/media/2025/12/Docs-jpeg-1024x579.jpeg',
              'large-width': 1024,
              'large-height': 579,
              '1536x1536':
                '/website-assets/media/2025/12/Docs-jpeg-1536x869.jpeg',
              '1536x1536-width': 1536,
              '1536x1536-height': 869,
              '2048x2048': '/website-assets/media/2025/12/Docs-jpeg.jpeg',
              '2048x2048-width': 1832,
              '2048x2048-height': 1036,
            },
          },
        },
      },
      {
        source: 'picker',
        resource: [
          {
            title: 'A Developer\'s Guide to Understanding Spice AI',
            slug: '/blog/a-developers-guide-to-understanding-spice-ai',
            excerpt:
              'An explanation of how Spice deploys as a sidecar data and AI runtime alongside applications.',
            image:
              '/website-assets/media/2025/11/ExternalLinkImage.png',
            type: 'Blog',
            taxonomy: ['Engineering'],
          },
        ],
        resource_manual: {
          eyebrow: '',
          title: null,
          description: '',
          image: false,
        },
      },
      {
        source: 'picker',
        resource: [
          {
            title:
              'Getting Started with Spice.ai SQL Query Federation & Acceleration',
            slug: '/blog/spice-sql-query-federation-acceleration',
            excerpt:
              'Learn how to use Spice to federate and accelerate queries in sidecar mode.',
            image:
              '/website-assets/media/2025/11/68ee96eb08a0dfcb609c1969_Version-7-1.png',
            type: 'Blog',
            taxonomy: ['Spice AI'],
          },
        ],
        resource_manual: {
          eyebrow: '',
          title: null,
          description: '',
          image: false,
        },
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<ContentCta
  fields={{
    override_global_setting: false,
    custom_content: { heading: '', paragraph: '', cta: null },
    padding_top: 'unset',
    padding_bottom: 'unset',
    gcta_heading: 'See Spice in action',
    gcta_paragraph:
      'Get a guided walkthrough of how development teams use Spice to query, accelerate, and integrate AI for mission-critical workloads.',
    gcta_cta: {
      title: 'Get a demo',
      url: 'https://meetings.hubspot.com/vladi-semenov',
      target: '_blank',
    },
  }}
/>

---

## Sidecar vs Microservice Architecture: How to Choose
URL: https://spice.ai/learn/sidecar-vs-microservice-architecture
Date: 2026-03-10T00:00:00
Description: Sidecar and microservice are two deployment architectures for data and AI runtimes. Learn the key differences in latency, scaling, resource usage, and when to use each pattern.

<HeroCenteredText
  fields={{
    graphic_position: 'no-graphic',
    heading_tag: 'h1',
    heading: 'Sidecar vs Microservice Architecture',
    paragraph:
      'Sidecar and microservice are two deployment architectures for data and AI runtimes. A sidecar deploys alongside your application in the same pod or machine. A microservice runs as an independent service behind a load balancer. Each makes different tradeoffs in latency, scaling, and operational complexity, and many production systems combine both.',
    cta: [
      {
        type: 'filled',
        cta: {
          title: 'See Spice deployment options',
          url: '/platform/sql-federation-acceleration',
          target: '',
        },
      },
      {
        type: 'bordered',
        cta: {
          title: 'Read the docs',
          url: 'https://spiceai.org/docs/deployment/architectures',
          target: '_blank',
        },
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<ContentRichText
  fields={{
    coverage: 'rc-start',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

When deploying a data or AI runtime (a query engine, inference server, or acceleration layer), one of the first architectural decisions is how the runtime relates to the applications that consume it. The two most common patterns are the **sidecar** and the **microservice** (centralized) deployment. To understand the sidecar pattern in depth before comparing, see [What is the Sidecar Pattern?](/learn/sidecar-pattern).

The sidecar pattern co-locates the runtime alongside each application instance, typically in the same Kubernetes pod or on the same machine. The microservice pattern deploys the runtime as a standalone service, independently scaled and accessed over the network. Neither approach is universally better. The right choice depends on latency requirements, scale, resource constraints, and organizational structure.

This guide explains how each architecture works, compares them across the dimensions that matter in production, and provides a decision framework for choosing the right pattern.

## How Sidecar Architecture Works

In a sidecar deployment, the data or AI runtime runs as a secondary process alongside the primary application: in the same Kubernetes pod, the same virtual machine, or the same container group. The application communicates with the sidecar over the local loopback interface (`localhost`), eliminating network hops between the application and its runtime.

```mermaid
flowchart LR
    subgraph Pod A
        A1[App A] --> S1[Runtime Sidecar]
    end
    subgraph Pod B
        A2[App B] --> S2[Runtime Sidecar]
    end
    S1 --> DB[(Data Sources)]
    S2 --> DB
```

Key characteristics of sidecar deployments:

- **Local loopback communication.** The application talks to the runtime over `localhost`, avoiding network latency, DNS resolution, and load balancer overhead. Round-trip times are measured in microseconds rather than milliseconds.
- **Lifecycle coupling.** The sidecar starts, stops, and restarts with the application pod. There is no separate deployment pipeline or versioning to manage; the runtime version is pinned to the application deployment.
- **Per-instance resource allocation.** Each application pod gets its own runtime instance with dedicated CPU, memory, and any locally [accelerated data](/learn/data-acceleration). There is no contention between applications.
- **Data locality.** Accelerated datasets are replicated to each sidecar instance. Queries against cached data never leave the machine, delivering consistent sub-millisecond response times.

The tradeoff is resource duplication. If ten application pods each run a sidecar, the cluster runs ten copies of the runtime, each consuming CPU and memory. Accelerated datasets are replicated to each sidecar, multiplying storage usage. For small-to-moderate deployments, this overhead is manageable. At large scale, it can become expensive.

### When Sidecar Architecture Excels

Sidecar deployments are well-suited to scenarios where latency dominates other concerns:

- **Real-time decision-making.** A trading bot that needs sub-millisecond access to market data benefits from having the data runtime in the same pod. Every network hop adds latency that can translate into missed opportunities.
- **Latency-critical AI inference.** Applications that call an [LLM or embedding model](/learn/llm-inference) as part of a request-response cycle benefit from local inference where the model runtime is co-located with the calling application.
- **Autonomous edge deployments.** When applications run at edge locations with unreliable network connectivity, a sidecar ensures the runtime remains available even if the connection to central services drops.

## How Microservice Architecture Works

In a microservice deployment, the data or AI runtime runs as an independent service: one or more replicas behind a load balancer, accessed over the network via HTTP, gRPC, or a database protocol like Arrow Flight SQL. The runtime is decoupled from any single application and serves multiple consumers.

```mermaid
flowchart LR
    A1[App A] --> LB[Load Balancer]
    A2[App B] --> LB
    A3[App C] --> LB
    LB --> R1[Runtime Replica 1]
    LB --> R2[Runtime Replica 2]
    R1 --> DB[(Data Sources)]
    R2 --> DB
```

Key characteristics of microservice deployments:

- **Loose coupling.** The runtime has its own deployment lifecycle, versioning, and scaling rules. It can be upgraded, restarted, or scaled without touching application deployments.
- **Shared infrastructure.** A single runtime service can serve multiple applications and teams. Data is [federated and accelerated](/platform/sql-federation-acceleration) once and shared across all consumers rather than duplicated per pod.
- **Independent scaling.** The runtime scales based on its own resource utilization and query load, not on the number of application pods. If query traffic spikes, the runtime auto-scales without requiring the applications to scale in tandem.
- **Network hop.** Every query travels over the network from the application to the runtime service. Even within the same cluster, this adds latency compared to local loopback: typically single-digit milliseconds, but measurable for latency-sensitive workloads.

The tradeoff is added infrastructure complexity. The microservice requires service discovery, health checks, load balancing, and connection pooling. Network partitions, DNS failures, or load balancer misconfiguration can disrupt connectivity between applications and the runtime.

### When Microservice Architecture Excels

Microservice deployments fit scenarios where sharing, scaling, and operational independence matter more than absolute latency:

- **Shared data and AI platform.** When multiple applications or teams need access to the same federated data layer and [connector integrations](/integrations), a centralized microservice avoids duplicating configuration and accelerated datasets across dozens of sidecars.
- **Variable traffic patterns.** If query load fluctuates significantly (low during off-hours, high during business hours), an independently scaled microservice can right-size resources without over-provisioning every application pod.
- **Independent release cycles.** When the data platform team needs to upgrade the runtime, patch security vulnerabilities, or add new [data connectors](/integrations) without coordinating with every application team, a decoupled microservice is the right pattern.

## Comparison Table

The following table summarizes the key differences between sidecar and microservice architectures across the dimensions that matter most in production.

| Dimension | Sidecar | Microservice |
|---|---|---|
| **Latency** | Sub-millisecond via local loopback | Single-digit milliseconds over the network |
| **Scaling** | Scales with application pods | Scales independently based on query load |
| **Resource usage** | Runtime duplicated per pod; higher aggregate resource cost | Shared runtime; more efficient resource utilization |
| **Data acceleration** | Accelerated data replicated to each sidecar | Single shared acceleration cache |
| **Deployment coupling** | Tightly coupled to application lifecycle | Independent deployment and versioning |
| **Operational complexity** | Low: no service discovery or load balancing needed | Higher: requires load balancer, health checks, connection pooling |
| **Multi-tenant access** | One application per sidecar | Multiple applications and teams share one service |
| **Failure blast radius** | Failure affects only one application pod | Failure can affect all consuming applications |
| **Cost at scale** | Higher: N copies of runtime for N pods | Lower: shared replicas serve all consumers |
| **Best for** | Latency-critical, small-to-moderate scale | Shared platform, variable traffic, large organizations |

Neither column is strictly better. The right choice depends on the workload requirements, which the decision framework below addresses.

## Decision Framework

Use the following questions to determine which architecture fits each deployment scenario.

### 1. How sensitive is the application to latency?

- **Sub-millisecond required:** Sidecar; local loopback eliminates network overhead
- **Single-digit milliseconds acceptable:** Microservice works well
- **Mixed requirements:** Use a tiered approach (described below)

### 2. How many applications consume the runtime?

- **One or a few tightly coupled applications:** Sidecar keeps things simple
- **Many applications across multiple teams:** Microservice avoids duplicating configuration and accelerated data across sidecars
- **Both:** Central microservice for shared access, sidecars for latency-critical paths

### 3. What are the resource constraints?

- **Resource-constrained environment (edge, small clusters):** Evaluate whether duplicating the runtime per pod is feasible. A single microservice may use fewer total resources
- **Ample cluster resources:** Sidecar duplication overhead is tolerable for the latency benefit
- **Cost-sensitive at scale:** Microservice; sharing runtime replicas is more efficient than running one per pod

### 4. How independent are deployment lifecycles?

- **Application and runtime release together:** Sidecar simplifies coordination (same pod, same deployment)
- **Runtime team and application teams release independently:** Microservice decouples release cycles
- **Mixed:** Microservice with pinned versions for stability-critical consumers

### 5. What is the expected scale?

- **Small-to-moderate (dozens of pods):** Sidecar duplication overhead is manageable
- **Large (hundreds or thousands of pods):** Microservice avoids the cost of running hundreds of runtime instances
- **Growing rapidly:** Start with microservice to avoid re-architecting as scale increases

### Summary Matrix

| Scenario | Recommended architecture |
|---|---|
| Real-time trading bot needing sub-millisecond data access | Sidecar |
| Shared AI inference engine serving multiple teams | Microservice |
| Edge deployment with unreliable connectivity | Sidecar |
| Large org where 20+ services query the same data layer | Microservice |
| Latency-critical app with variable query traffic | Sidecar with auto-scaling, or tiered approach |
| Cost-sensitive cluster with limited resources | Microservice |

## Tiered and Hybrid Approaches

In practice, many organizations combine sidecar and microservice patterns in a tiered architecture. This approach uses sidecars for performance-critical paths and a centralized microservice for everything else.

A common tiered pattern consists of:

- **Edge tier.** Sidecars deployed at edge locations for low-latency local access and offline resilience.
- **Application tier.** Sidecars co-located with latency-sensitive applications that require sub-millisecond data access or inline AI inference.
- **Platform tier.** A centralized microservice deployment that serves shared queries, batch workloads, and applications where single-digit-millisecond latency is acceptable.

This tiered model lets teams optimize each workload independently. A real-time fraud detection service might run a sidecar for instant access to accelerated risk scores, while a reporting dashboard queries the same data through the centralized microservice. Both consume the same [data connectors](/integrations) and acceleration layer, just at different latency tiers.

## Advanced Topics

### Multi-Cluster Federation

In distributed enterprises, data and AI runtimes may span multiple Kubernetes clusters across regions or cloud providers. Multi-cluster federation adds a routing layer that directs queries to the nearest or most appropriate runtime instance. Sidecar deployments in each cluster can serve local reads, while a central microservice handles cross-cluster queries that require joining data from multiple regions.

The key challenge is consistency. When accelerated data is replicated to sidecars across clusters, each sidecar's cache may be at a slightly different point in time. Architectures that require strong consistency across clusters typically route those queries to a single authoritative microservice instance, accepting the latency penalty for correctness.

### Service Mesh Integration

In Kubernetes environments, service meshes like Istio or Linkerd add observability, mutual TLS, and traffic management to service-to-service communication. For microservice deployments, the service mesh provides load balancing, circuit breaking, and retry logic that improve reliability between applications and the runtime.

Sidecar deployments benefit from service meshes differently. Since the application-to-runtime communication happens over `localhost`, the mesh proxy does not intercept it. However, the mesh still manages outbound traffic from the sidecar to data sources, providing encryption and observability for those connections.

### Resource Optimization Strategies

Both architectures can be optimized to reduce resource overhead. For sidecar deployments, key strategies include limiting the datasets accelerated at each sidecar to only those the co-located application needs, using memory-mapped storage for large accelerated datasets to reduce RSS memory pressure, and configuring CPU limits to prevent the sidecar from starving the primary application.

For microservice deployments, optimization focuses on connection pooling to reduce per-query overhead, query result caching to avoid redundant source queries, and horizontal pod autoscaling tuned to query concurrency rather than CPU utilization. [Data acceleration](/learn/data-acceleration) in the microservice tier reduces load on upstream data sources and improves [query latency](/learn/database-query-latency-at-scale) for frequently accessed datasets.

## Deployment Architectures with Spice

[Spice](/platform/sql-federation-acceleration) supports both sidecar and microservice deployment patterns natively, along with tiered and cluster architectures for enterprise workloads.

In **sidecar mode**, Spice deploys alongside the application in the same pod. The application queries Spice over `localhost` via Arrow Flight SQL, HTTP, or gRPC. Accelerated datasets are cached locally in Apache Arrow (in-memory) or DuckDB (on-disk), delivering sub-millisecond query latency. This pattern works well for latency-critical applications that need real-time access to [federated and accelerated data](/use-case/datalake-accelerator), and it is a common choice for [multi-tenant SaaS products](/industry/saas) that shard a runtime per tenant.

In **microservice mode**, Spice runs as an independent service with one or more replicas behind a load balancer. Multiple applications and teams share a single Spice deployment, querying the same [federated data sources](/integrations) and acceleration caches. The runtime scales independently based on query traffic, and the platform team manages it separately from application deployments.

For organizations with mixed requirements, Spice supports a **tiered architecture** where sidecars serve performance-critical paths and a centralized microservice handles shared workloads. Edge, application, and platform tiers can each run Spice with different acceleration configurations tuned to their latency and throughput requirements.

At enterprise scale, Spice provides a **cluster deployment** on Kubernetes with high availability, advanced security, centralized monitoring, and commercial support. The cluster architecture builds on the microservice pattern with multi-replica coordination, automated failover, and [operational data lakehouse](/use-case/operational-data-lakehouse) capabilities for mission-critical workloads.

<ContentRichText
  fields={{
    coverage: 'rc-end',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<AccordionFaq
  fields={{
    heading: 'Sidecar vs Microservice Architecture FAQ',
    paragraph: '',
    items: [
      {
        title: 'What is the main difference between sidecar and microservice deployment?',
        paragraph:
          '<p>A sidecar deploys alongside the application in the same pod or machine, communicating over local loopback for sub-millisecond latency. A microservice runs as an independent service accessed over the network, enabling independent scaling and shared access across multiple applications. The core tradeoff is latency versus resource efficiency and operational independence.</p>',
      },
      {
        title: 'When should I choose a sidecar architecture over a microservice?',
        paragraph:
          '<p>Choose a sidecar when your application requires sub-millisecond data access, when lifecycle coupling with the application simplifies operations, or when you are deploying at edge locations with unreliable network connectivity. Sidecar is best for small-to-moderate scale where the resource overhead of duplicating the runtime per pod is acceptable.</p>',
      },
      {
        title: 'Does a microservice architecture introduce significant latency?',
        paragraph:
          '<p>A microservice adds a network hop compared to a sidecar, typically single-digit milliseconds within the same Kubernetes cluster. For most applications (dashboards, batch analytics, shared AI inference), this latency is negligible. For latency-critical workloads like real-time trading or inline fraud detection, the difference can matter, making the sidecar pattern more appropriate.</p>',
      },
      {
        title: 'Can I combine sidecar and microservice patterns in the same system?',
        paragraph:
          '<p>Yes. A tiered architecture uses sidecars for performance-critical paths and a centralized microservice for shared or batch workloads. This is common in production: for example, a real-time pricing engine runs a sidecar for sub-millisecond access, while reporting dashboards query the same data through a centralized microservice deployment.</p>',
      },
      {
        title: 'How does the sidecar pattern affect resource usage at scale?',
        paragraph:
          '<p>Each application pod runs its own copy of the runtime, so resource usage scales linearly with the number of pods. If 50 pods each run a sidecar with 2 GB of accelerated data, the cluster uses 100 GB of memory for data alone. Microservice architectures are more resource-efficient at scale because a shared set of replicas serves all consumers without per-pod duplication.</p>',
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<ContentResourceFeatured
  fields={{
    heading: 'Learn more about deployment architectures',
    paragraph:
      'Documentation and blog posts on deploying data and AI runtimes in production.',
    mode: 'default',
    resources: [
      {
        source: 'manual',
        resource: null,
        resource_manual: {
          eyebrow: 'Docs',
          title: {
            title: 'Deployment Architecture Docs',
            url: 'https://spiceai.org/docs/deployment/architectures',
            target: '_blank',
          },
          description:
            'Learn about Spice deployment patterns including sidecar, microservice, tiered, hybrid, and cluster architectures.',
          image: {
            ID: 1661,
            id: 1661,
            title: 'Docs jpeg',
            filename: 'Docs-jpeg.jpeg',
            filesize: 103192,
            url: '/website-assets/media/2025/12/Docs-jpeg.jpeg',
            link: '/docs-jpeg/',
            alt: '',
            author: '9',
            description: '',
            caption: '',
            name: 'docs-jpeg',
            status: 'inherit',
            uploaded_to: 0,
            date: '2025-12-05 04:13:53',
            modified: '2025-12-05 04:13:53',
            menu_order: 0,
            mime_type: 'image/jpeg',
            type: 'image',
            subtype: 'jpeg',
            icon: '/website-assets/media/default.png',
            width: 1832,
            height: 1036,
            sizes: {
              thumbnail: '/website-assets/media/2025/12/Docs-jpeg-150x150.jpeg',
              'thumbnail-width': 150,
              'thumbnail-height': 150,
              medium: '/website-assets/media/2025/12/Docs-jpeg-300x170.jpeg',
              'medium-width': 300,
              'medium-height': 170,
              medium_large:
                '/website-assets/media/2025/12/Docs-jpeg-768x434.jpeg',
              'medium_large-width': 768,
              'medium_large-height': 434,
              large: '/website-assets/media/2025/12/Docs-jpeg-1024x579.jpeg',
              'large-width': 1024,
              'large-height': 579,
              '1536x1536':
                '/website-assets/media/2025/12/Docs-jpeg-1536x869.jpeg',
              '1536x1536-width': 1536,
              '1536x1536-height': 869,
              '2048x2048': '/website-assets/media/2025/12/Docs-jpeg.jpeg',
              '2048x2048-width': 1832,
              '2048x2048-height': 1036,
            },
          },
        },
      },
      {
        source: 'picker',
        resource: [
          {
            title:
              'Getting Started with Spice.ai SQL Query Federation & Acceleration',
            slug: '/blog/spice-sql-query-federation-acceleration',
            excerpt:
              'Learn how to use Spice.ai to federate and accelerate queries across operational and analytical systems with zero ETL.',
            image:
              '/website-assets/media/2025/11/68ee96eb08a0dfcb609c1969_Version-7-1.png',
            type: 'Blog',
            taxonomy: ['Spice AI'],
          },
        ],
        resource_manual: {
          eyebrow: '',
          title: null,
          description: '',
          image: false,
        },
      },
      {
        source: 'picker',
        resource: [
          {
            title: 'How we use Apache DataFusion at Spice AI',
            slug: '/blog/how-we-use-apache-datafusion-at-spice-ai',
            excerpt:
              'A technical overview of how Spice extends Apache DataFusion with custom table providers, optimizer rules, and UDFs to power federated SQL, search, and AI inference.',
            image:
              '/website-assets/media/2026/01/Engineering-at-Spice-AI-Apache-DataFusion.png',
            type: 'Blog',
            taxonomy: ['SQL Federation', 'Engineering'],
          },
        ],
        resource_manual: {
          eyebrow: '',
          title: null,
          description: '',
          image: false,
        },
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<TalkToAnEngineerCta />

---

## Best Snowflake Alternatives for Real-Time SQL
URL: https://spice.ai/learn/snowflake-alternatives-for-real-time-sql
Date: 2026-09-02T00:00:00
Description: Objective guide to Snowflake alternatives for real-time SQL workloads, comparing federation engines, real-time OLAP databases, lakehouse engines, and columnar replicas.

<HeroCenteredText
  fields={{
    graphic_position: 'no-graphic',
    heading_tag: 'h1',
    heading: 'Best Snowflake Alternatives for Real-Time SQL',
    paragraph:
      'Snowflake is a strong analytical warehouse. Real-time SQL is a different workload with different constraints. This guide compares the architectures teams use when freshness and query latency drive the requirement.',
    cta: [
      {
        type: 'filled',
        cta: {
          title: 'See distributed query',
          url: '/feature/distributed-query',
          target: '',
        },
      },
      {
        type: 'bordered',
        cta: {
          title: 'Read federation docs',
          url: 'https://spiceai.org/docs/features/query-federation',
          target: '_blank',
        },
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<ContentRichText
  fields={{
    coverage: 'rc-start',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

Snowflake is a cloud data warehouse built for analytical queries over large historical datasets. It separates storage from compute, scales elastically, and handles complex SQL over terabytes without tuning work from the user. For scheduled reporting and analyst-driven exploration, it does that job well.

Real-time SQL is a different workload. It means querying current state with sub-second response, often at high request volume, and often from an application rather than a dashboard. Teams evaluating alternatives are usually not unhappy with Snowflake as a warehouse. They have a second workload that a warehouse is not shaped for.

This guide defines what real-time SQL requires, explains where a warehouse architecture meets its limits, and compares the categories of alternatives. It does not declare a winner, because the correct answer depends on freshness, latency, and query volume. It compares architectures rather than engines. For the engine-level question, see [the best query engines for real-time AI analytics](/learn/best-query-engines-for-real-time-ai-analytics).

## What Real-Time SQL Requires

Four requirements distinguish this workload from analytical reporting.

**Freshness measured in seconds.** The query must reflect current state, not the state at the last load.

**Latency measured in milliseconds.** An application waits on the query. A person waiting on a report tolerates seconds; an API endpoint does not.

**High and variable request volume.** Product features and AI agents issue many small queries rather than a few large ones.

**Predictable cost per query.** When query volume scales with users or agent tasks, a per-query cost model becomes the constraint on the feature.

A workload that needs none of these is a reporting workload, and a warehouse is the right tool for it.

## Where a Warehouse Architecture Meets Its Limits

### Load latency sets the freshness floor

Data reaches a warehouse through a pipeline. Whatever the pipeline interval is, that interval is the best freshness the warehouse can offer. Making the pipeline continuous narrows the gap and does not close it, because the load step still exists.

### The cost model rewards few large queries

Warehouse pricing is built around compute time for substantial analytical work. That model fits an analyst running twenty queries a day. It fits less well when a product feature runs twenty queries per user session, because cost then scales with usage rather than with analysis.

### Warm-up affects the tail

Elastic compute must be running to answer quickly. Keeping it warm costs money during idle periods, and letting it suspend adds startup time to the first query after a quiet interval. Interactive workloads feel this in the tail latency.

### Data must arrive before it can be queried

The warehouse answers questions about data it holds. A question that spans the warehouse and an operational database requires either another pipeline or a federated query. See [SQL federation versus ETL](/learn/sql-federation-vs-etl) for that tradeoff.

## Alternative 1: Federated Query Engines

A federation engine queries systems in place and pushes filters and aggregations down to each source. No load step exists, so freshness matches the source.

**Strengths:** Fresh by construction. No pipeline to build or maintain. Cross-system joins in one SQL statement.

**Limits:** Latency depends on the slowest source. Source systems absorb the read load. Large historical scans are slower than in a warehouse built for them.

**Fits when:** Questions span several live systems and freshness matters more than scan throughput. [SQL federation](/learn/sql-federation) covers the mechanism.

## Alternative 2: Real-Time OLAP Databases

Purpose-built analytical databases such as ClickHouse, Apache Druid, and Apache Pinot ingest streams continuously and answer aggregate queries in milliseconds.

**Strengths:** The lowest latency in this list for aggregate queries. Designed for high concurrency. Continuous ingestion rather than batch loading.

**Limits:** A separate system to operate and to load. Joins are more constrained than in a general SQL engine. The data must be ingested, so the copy problem returns in a different form.

**Fits when:** The workload is high-volume aggregate queries over event data, and the shape of those queries is known in advance.

## Alternative 3: Lakehouse Engines on Open Table Formats

Engines such as Trino, Apache Spark, Dremio, and Databricks query open table formats including [Apache Iceberg](/learn/apache-iceberg) and [Delta Lake](/learn/delta-lake) directly on object storage.

**Strengths:** Data stays in open formats that several engines can read, which lowers exit cost. Storage cost is object storage cost. Strong for large analytical scans.

**Limits:** Object storage latency sets a floor that pure in-memory systems do not have. Freshness depends on how data lands in the table format. Real-time serving usually needs an acceleration layer in front.

**Fits when:** The priority is open storage and analytical scale, with real-time serving handled by a separate layer. [Data lakehouse versus data warehouse](/learn/data-lakehouse-vs-data-warehouse) compares the two models.

## Alternative 4: Embedded and Single-Node Engines

Engines such as [DuckDB](/learn/duckdb) and [Apache DataFusion](/learn/apache-datafusion) run inside a process rather than as a cluster. Modern hardware makes single-node analytical query viable for datasets that once required a cluster.

**Strengths:** No network hop, so latency is very low. No cluster to operate. Cost is the cost of the host.

**Limits:** Bounded by one machine. No built-in ingestion, governance, or multi-user coordination. The surrounding system must supply those.

**Fits when:** The working set fits on one node and latency is the dominant requirement. This category is usually a component of a larger design rather than a standalone replacement.

## Alternative 5: A Columnar Replica of the Operational Database

This pattern keeps data out of the warehouse. It replicates the operational database into a columnar store kept current by [change data capture](/learn/change-data-capture), then serves analytical queries from that replica.

**Strengths:** Freshness in seconds without a pipeline to schedule. The operational database stays authoritative. Adoption is incremental, because one table can be replicated before the rest.

**Limits:** Scoped to the systems being replicated, so it does not answer cross-organization questions. Local storage to operate.

**Fits when:** The analytical questions concern application data, and the feature ships inside a product. The [analytics replica pattern](/blog/the-analytics-replica-pattern-shortening-the-path-to-data-based-ai) covers this in detail.

## Comparing the Categories

| Category | Freshness | Query latency | Operational cost | Cross-system joins | Best fit |
| --- | --- | --- | --- | --- | --- |
| Cloud warehouse | Pipeline interval | Seconds | Low to operate, usage-priced | Within the warehouse | Historical analysis and reporting |
| Federation engine | Live | Source dependent | Low to medium | Yes | Fresh questions across live systems |
| Real-time OLAP database | Seconds | Milliseconds | Medium to high | Limited | High-volume aggregates over events |
| Lakehouse engine | Depends on landing | Sub-second to seconds | Medium | Yes | Open storage at analytical scale |
| Embedded engine | Depends on host | Milliseconds | Low | No | Latency-critical local serving |
| Columnar replica | Seconds | Milliseconds | Low to medium | Limited | Product analytics on application data |

## How to Choose

### 1. Write down the freshness requirement first

State it as a number with units. Most architecture arguments end quickly once someone commits to "under ten seconds" or "within the hour." The two answers point at different categories.

### 2. Count the queries, not the users

Estimate queries per user session, then multiply by expected sessions. A feature that looks affordable per query often does not survive that multiplication under a usage-priced model.

### 3. Identify how many systems the question spans

A question about one application database has a different answer than a question spanning six systems. Federation earns its complexity only when the span is real.

### 4. Decide who operates it

A real-time OLAP database is powerful and is another system with its own failure modes. Match the choice to the team that carries the pager.

### 5. Test with production query shapes

Benchmark with real schemas and the queries the feature will actually issue. Synthetic benchmarks are directional. Concurrency behavior in particular rarely matches the vendor chart.

## When to Keep the Warehouse

Replacing Snowflake is rarely the goal, and often the wrong one. A warehouse remains the better tool when:

- Queries span years of history that operational systems no longer hold
- Analysts need ad-hoc exploration across the whole business
- Compliance requires an archive separate from operational systems
- The workload is scheduled reporting rather than interactive serving

Most teams keep the warehouse and add a serving path beside it. The serving path handles fresh, high-volume, low-latency queries. The warehouse handles everything else.

## Advanced Topics

### Cost modelling beyond the query price

Compare total cost over a year, not price per query. Include pipeline maintenance, storage duplication, egress between systems, and the engineering time spent operating each component. A cheaper query price with two more systems to run is often more expensive.

Build the model on query volume you have measured rather than estimated. Instrument the existing feature for a week, count the queries, and project from that. Estimates of query volume are consistently low, because nobody counts the reads a page makes on load or the polling a dashboard does while open.

### Concurrency is the usual failure point

Single-query benchmarks rarely predict production behavior. Test at the concurrency the feature will reach, and measure p99 rather than the median. Systems separate from each other under concurrency more than under raw scan speed.

Ramp the load rather than starting at the target. Most systems degrade gradually and then sharply, and the point where the curve bends is the real capacity number. Record queue depth and error rate alongside latency, because a system that sheds load looks fast in a latency chart.

### Open formats reduce the cost of being wrong

Storing data in [Apache Iceberg](/learn/apache-iceberg) or Delta Lake lets another compatible engine read the same stored data. SQL dialects, catalogs, and engine-specific features can still require migration work. Open formats reduce the cost without making the change purely configuration.

The value is easy to quantify. Estimate what a migration would cost in engineering weeks, then treat open formats as insurance against that number. Teams that skip this step usually discover the cost during a vendor negotiation, at the worst possible moment.

### The two-path architecture

The common end state is not one engine. It is a serving path optimized for freshness and latency, beside an analytical path optimized for scan throughput and history. One query interface covers both. [Zero-ETL](/learn/zero-etl) covers how teams keep the two in sync without a pipeline between them.

The design question is where the boundary sits. Drawing it by dataset is simpler to reason about than drawing it by query type, because a dataset has one owner and one freshness requirement. Drawing it by query type means the same table is served from two places, and the two disagree at some point.

## Real-Time SQL with Spice

[Spice](/platform/sql-federation-acceleration) addresses this workload by combining federation with local acceleration in one runtime. It queries Snowflake, PostgreSQL, object storage, and [40+ other sources](/integrations) through one SQL interface, and accelerates the working set locally for sub-second reads.

That combination means the warehouse stays in place for what it does well. Spice serves the fresh, high-volume path from an accelerated local copy, kept current by [real-time change data capture](/feature/real-time-change-data-capture). Query volume then costs local compute rather than warehouse compute.

For deployment planning and cost comparison, review [Spice Cloud pricing](/pricing).

<ContentRichText
  fields={{
    coverage: 'rc-end',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<AccordionFaq
  fields={{
    heading: 'Snowflake Alternatives FAQ',
    heading_tag: 'h2',
    paragraph: '',
    items: [
      {
        title: 'What is the best Snowflake alternative for real-time SQL?',
        paragraph:
          '<p>There is no single answer, because the categories optimize for different constraints. Real-time OLAP databases give the lowest latency for aggregates over events. Federation with local acceleration gives fresh cross-system queries without a pipeline. Choose by freshness requirement and query volume.</p>',
      },
      {
        title: 'Why is a data warehouse slow for real-time queries?',
        paragraph:
          '<p>Data reaches a warehouse through a pipeline, so the pipeline interval sets the freshness floor. Elastic compute also needs to be warm to answer quickly, which adds startup time to the first query after an idle period. Both constraints come from the architecture, not from tuning.</p>',
      },
      {
        title: 'Do teams have to replace Snowflake entirely?',
        paragraph:
          '<p>Usually not. Most teams keep the warehouse for historical analysis and compliance archives, then add a separate serving path for fresh, high-volume queries. Replacing the warehouse is rarely the goal and rarely the cheapest option.</p>',
      },
      {
        title: 'How does query cost change with an application workload?',
        paragraph:
          '<p>Usage-priced compute suits an analyst running a few queries a day. A product feature runs many queries per user session, so cost scales with usage rather than with analysis. Estimate queries per session and multiply by expected sessions before committing to an architecture.</p>',
      },
      {
        title: 'What should a proof of concept measure?',
        paragraph:
          '<p>Use real schemas and the queries the feature will issue. Measure p99 latency at the target concurrency, freshness lag, and cost at projected volume. Systems separate from each other under concurrency far more than under single-query benchmarks.</p>',
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<ContentResourceFeatured
  fields={{
    heading: 'Learn more about real-time SQL',
    heading_tag: 'h2',
    paragraph:
      'Documentation and technical resources for federation, acceleration, and low-latency query serving.',
    mode: 'default',
    resources: [
      {
        source: 'manual',
        resource: null,
        resource_manual: {
          eyebrow: 'Docs',
          title: {
            title: 'Query Federation Docs',
            url: 'https://spiceai.org/docs/features/query-federation',
            target: '_blank',
          },
          description:
            'Learn how to query Snowflake, PostgreSQL, and object storage through one SQL interface with pushdown.',
          image: {
            ID: 1661,
            id: 1661,
            title: 'Docs jpeg',
            filename: 'Docs-jpeg.jpeg',
            filesize: 103192,
            url: '/website-assets/media/2025/12/Docs-jpeg.jpeg',
            link: '/docs-jpeg/',
            alt: '',
            author: '9',
            description: '',
            caption: '',
            name: 'docs-jpeg',
            status: 'inherit',
            uploaded_to: 0,
            date: '2025-12-05 04:13:53',
            modified: '2025-12-05 04:13:53',
            menu_order: 0,
            mime_type: 'image/jpeg',
            type: 'image',
            subtype: 'jpeg',
            icon: '/website-assets/media/default.png',
            width: 1832,
            height: 1036,
            sizes: {
              thumbnail: '/website-assets/media/2025/12/Docs-jpeg-150x150.jpeg',
              'thumbnail-width': 150,
              'thumbnail-height': 150,
              medium: '/website-assets/media/2025/12/Docs-jpeg-300x170.jpeg',
              'medium-width': 300,
              'medium-height': 170,
              medium_large:
                '/website-assets/media/2025/12/Docs-jpeg-768x434.jpeg',
              'medium_large-width': 768,
              'medium_large-height': 434,
              large: '/website-assets/media/2025/12/Docs-jpeg-1024x579.jpeg',
              'large-width': 1024,
              'large-height': 579,
              '1536x1536':
                '/website-assets/media/2025/12/Docs-jpeg-1536x869.jpeg',
              '1536x1536-width': 1536,
              '1536x1536-height': 869,
              '2048x2048': '/website-assets/media/2025/12/Docs-jpeg.jpeg',
              '2048x2048-width': 1832,
              '2048x2048-height': 1036,
            },
          },
        },
      },
      {
        source: 'picker',
        resource: [
          {
            title: 'Getting Started with Spice.ai SQL Query Federation & Acceleration',
            slug: '/blog/spice-sql-query-federation-acceleration',
            excerpt:
              'Learn how to federate and accelerate queries across operational and analytical systems with zero ETL.',
            image: '/website-assets/media/default.png',
            type: 'Blog',
            taxonomy: ['Spice AI'],
          },
        ],
        resource_manual: {
          eyebrow: '',
          title: null,
          description: '',
          image: false,
        },
      },
      {
        source: 'picker',
        resource: [
          {
            title: 'Introducing Spice Cayenne: The Next-Generation Data Accelerator Built on Vortex for Performance and Scale',
            slug: '/blog/introducing-spice-cayenne-data-accelerator',
            excerpt:
              'A data accelerator built for multi-terabyte, low-latency workloads using the Vortex columnar format.',
            image: '/website-assets/media/default.png',
            type: 'Blog',
            taxonomy: ['Spice AI', 'Engineering'],
          },
        ],
        resource_manual: {
          eyebrow: '',
          title: null,
          description: '',
          image: false,
        },
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<ContentCta
  fields={{
    override_global_setting: false,
    custom_content: { heading: '', paragraph: '', cta: null },
    padding_top: 'unset',
    padding_bottom: 'unset',
    gcta_heading: 'See Spice in action',
    gcta_paragraph:
      'Get a guided walkthrough of how development teams use Spice to query, accelerate, and integrate AI for mission-critical workloads.',
    gcta_cta: {
      title: 'Get a demo',
      url: 'https://meetings.hubspot.com/lukekim/talk-to-sales',
      target: '_blank',
    },
  }}
/>

---

## SQL Federation vs ETL: How to Choose
URL: https://spice.ai/learn/sql-federation-vs-etl
Date: 2026-02-20T00:00:00
Description: SQL federation and ETL are two approaches to accessing data across distributed systems. Learn the key differences, when to use each, and how modern platforms combine both for real-time performance.

<HeroCenteredText
  fields={{
    graphic_position: 'no-graphic',
    heading_tag: 'h1',
    heading: 'SQL Federation vs ETL',
    paragraph:
      'SQL federation and ETL are two approaches to querying data across distributed systems. Federation queries data in place at runtime. ETL copies data into a central store on a schedule. Each approach makes different tradeoffs, and the best architectures often combine both.',
    cta: [
      {
        type: 'filled',
        cta: {
          title: 'See Spice SQL federation',
          url: '/platform/sql-federation-acceleration',
          target: '',
        },
      },
      {
        type: 'bordered',
        cta: {
          title: 'Read the docs',
          url: 'https://spiceai.org/docs/features/query-federation',
          target: '',
        },
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<ContentRichText
  fields={{
    coverage: 'rc-start',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

Most organizations store data across many systems: transactional databases like PostgreSQL and MySQL, analytical warehouses like Databricks and Snowflake, object stores like Amazon S3, and SaaS platforms like Salesforce. When applications or analytics need to combine data from several of these systems, teams must choose how to bridge the gap. When the driving requirement is low-latency serving rather than integration, [Snowflake alternatives for real-time SQL](/learn/snowflake-alternatives-for-real-time-sql) compares the architectures.

The two dominant approaches are **ETL (extract, transform, load)** and **SQL federation**. ETL copies data from source systems into a central warehouse on a schedule. SQL federation queries data in place across sources at runtime using a single SQL interface. Neither approach is universally better; they solve different problems and make different tradeoffs around freshness, performance, complexity, and cost.

This guide explains how each approach works, compares them across the dimensions that matter in production, and provides a framework for choosing the right pattern for your workloads.

## How ETL Works

ETL is the traditional approach to centralizing data. A pipeline extracts data from source systems, transforms it into the target schema, and loads it into a central warehouse or data lake.

### Extract

The pipeline connects to each source system and reads data, either a full snapshot or an incremental batch based on timestamps or sequence numbers. Extraction can be scheduled (hourly, daily) or triggered by events.

### Transform

Raw data is cleaned, normalized, and reshaped to match the target schema. Transformations may include deduplication, type casting, joining reference tables, computing derived columns, and enforcing data quality rules.

### Load

Transformed data is written to the central warehouse, data lake, or [lakehouse](/use-case/datalake-accelerator). The target system becomes the single source of truth for downstream consumers: BI tools, dashboards, and analytical queries.

ETL pipelines are well-understood and widely supported by tools like Apache Airflow, dbt, Fivetran, and Apache Spark. They work reliably for batch analytics over historical data, but they introduce inherent latency: data in the warehouse is always at least as old as the last pipeline run.

## How SQL Federation Works

[SQL federation](/learn/sql-federation) takes a different approach. Instead of moving data, a federation engine connects to each source at query time, translates a single SQL query into source-specific requests, and merges the results. The data stays where it is.

A federated query goes through three stages:

1. **Query planning:** The engine parses the SQL, identifies which tables map to which sources, and builds an optimized execution plan with predicate and aggregation pushdown.
2. **Distributed execution:** Sub-queries are dispatched to each source in parallel. Filters and aggregations are pushed down to minimize data transfer.
3. **Result merging:** Partial results are joined, sorted, and formatted in the federation layer before being returned to the application.

Federation provides real-time access to data across [40+ source types](/integrations) through a single SQL endpoint. Applications see a unified interface regardless of where data is stored.

## Comparison Table

The following table summarizes the key differences between SQL federation and ETL across the dimensions that matter most in production deployments.

| Dimension | SQL Federation | ETL |
|---|---|---|
| **Data freshness** | Real-time: queries hit live sources | Batch: as fresh as the last pipeline run (minutes to hours) |
| **Data movement** | None: data stays in source systems | Full copy into a central warehouse or lake |
| **Time to first query** | Minutes: configure a connector and query | Days to weeks: design schemas, build transforms, orchestrate pipelines |
| **Schema change handling** | Automatic: queries execute against the current schema | Manual: pipeline breaks require code changes and redeployment |
| **Query performance** | Bounded by source latency and network; improved with acceleration | Fast for pre-computed, co-located data |
| **Storage cost** | No duplication | Duplicate storage in the warehouse |
| **Operational overhead** | Low: no pipelines to monitor | High: pipeline failures, scheduling, orchestration |
| **Best for** | Real-time access, ad-hoc queries, AI workloads | Batch analytics, historical reporting, compliance archives |
| **Source availability dependency** | High: sources must be available at query time | Low: warehouse is independent after loading |

Neither column is strictly better. The right choice depends on the workload requirements, which the decision framework below addresses.

## When ETL Is the Right Choice

ETL remains the right approach for several well-defined scenarios.

### Heavy Analytical Workloads on Historical Data

When analysts run complex aggregations, window functions, and multi-table joins over months or years of data, co-locating that data in a warehouse optimized for analytical queries delivers the best performance. Federation would require pulling large volumes of data over the network on every query.

### Known, Stable Query Patterns

If the same set of reports and dashboards run daily against the same datasets, ETL's batch model is efficient. The upfront cost of building pipelines is amortized over many query executions, and the warehouse can be tuned for those specific access patterns.

### Compliance and Audit Requirements

Some regulatory frameworks require durable, timestamped copies of data in a controlled environment. ETL into a governed warehouse or [data lake](/use-case/datalake-accelerator) satisfies these requirements by producing an immutable historical record.

### Source Systems with Limited Query Capacity

If a source database cannot handle additional analytical query load (for example, a production OLTP system under heavy write pressure), extracting data on a schedule and querying the copy avoids adding load to the source.

## When SQL Federation Is the Right Choice

Federation excels in scenarios where freshness, speed-to-value, and cross-source access matter more than pre-computed performance.

### Real-Time Operational Applications

Applications that need current data from multiple systems (operational dashboards, monitoring tools, customer-facing portals) benefit from federation's real-time access. Stale data from a batch pipeline can lead to incorrect decisions or degraded user experiences.

### AI and Machine Learning Workloads

AI models, [retrieval-augmented generation (RAG)](/learn/retrieval-augmented-generation) systems, and inference pipelines require fresh, multi-source data. Federation provides the real-time, cross-source access these workloads demand without building separate data pipelines for each model.

### Ad-Hoc Exploration and Prototyping

When data teams need to explore a new data source or prototype a cross-system query, federation eliminates the weeks of pipeline engineering that ETL requires. Configure a connector and start querying in minutes.

### Data Mesh Architectures

In data mesh, each domain team owns its data products. Federation enables governed, cross-domain queries without centralizing everything into a monolithic warehouse. Each team maintains autonomy while the organization gets unified access.

## Decision Framework

Use the following questions to determine which approach fits each workload. In many organizations, the answer is "both": different workloads within the same architecture use different patterns.

### 1. How fresh does the data need to be?

- **Seconds to minutes:** Federation, potentially with [change data capture](/learn/change-data-capture) for acceleration cache refresh
- **Hours to days:** ETL is sufficient
- **Mixed requirements:** Federation for real-time consumers, ETL for batch analytics

### 2. How predictable are the query patterns?

- **Known, repeated queries:** ETL can pre-compute and optimize for these patterns
- **Ad-hoc, exploratory, or evolving:** Federation adapts without pipeline changes
- **Both:** Accelerate known patterns locally; federate the rest on demand

### 3. What is the acceptable time-to-value?

- **Minutes:** Federation (connect and query immediately)
- **Weeks are acceptable:** ETL with proper schema design and pipeline engineering
- **Start fast, optimize later:** Federation first, add acceleration and ETL for mature workloads

### 4. What are the source system constraints?

- **Sources can handle additional query load:** Federation is straightforward
- **Sources are capacity-constrained:** ETL extracts data during off-peak windows, or federation with [data acceleration](/learn/data-acceleration) caches the data locally to avoid repeated source queries

### 5. What is the data volume?

- **Moderate (gigabytes):** Federation with acceleration handles this well
- **Very large (terabytes+):** ETL into a [data lake or lakehouse](/use-case/datalake-accelerator) may be more practical for full-scan analytical queries
- **Mixed:** Federate smaller, real-time datasets; ETL larger, historical datasets

### Summary Matrix

| Scenario | Recommended approach |
|---|---|
| Real-time dashboard over 3 databases | Federation |
| Monthly revenue report over 2 years of data | ETL |
| AI model needing fresh features from 5 sources | Federation with acceleration |
| Compliance archive of transactional records | ETL |
| Ad-hoc exploration of a new data source | Federation |
| High-frequency analytics on a data lake | ETL into lakehouse, or federation with acceleration |

## Advanced Topics

### Hybrid Architectures: Combining Federation and ETL

In practice, the most effective data architectures use both patterns. Federation handles real-time access and cross-source queries, while ETL pipelines populate warehouses and data lakes for heavy analytical workloads. The challenge is managing the boundary between the two.

A common hybrid pattern is **federate-first with selective materialization**. All data sources are accessible via federation by default. As query patterns mature and performance requirements become clear, specific datasets are materialized, either through traditional ETL into a warehouse, or through local acceleration caches kept fresh by [change data capture](/learn/change-data-capture). This approach minimizes upfront pipeline engineering while providing an optimization path for production workloads.

The key architectural decision is where to place the boundary between federated and materialized data. Criteria include query frequency (datasets queried hundreds of times per minute should be materialized), latency sensitivity (sub-second requirements demand local acceleration or warehouse co-location), and data volume (very large datasets are expensive to federate repeatedly).

### ELT and the Modern Data Stack

The traditional ETL sequence (extract, transform, load) has evolved into ELT (extract, load, transform), where raw data is loaded into the warehouse first and transformations happen inside the warehouse using SQL. Tools like dbt popularized this pattern by enabling transformation-as-code within the warehouse.

ELT addresses some of ETL's pain points: transformations are version-controlled, testable, and run inside a powerful SQL engine. But ELT still requires extraction pipelines, still introduces batch latency, and still duplicates data into a central store. For organizations evaluating federation vs. ETL, ELT shares most of ETL's tradeoffs: the key distinction remains batch movement vs. real-time in-place access.

Federation complements ELT architectures by providing real-time access to data that hasn't yet been extracted and loaded. An application can query the federation layer for the freshest data while the ELT pipeline processes the same data for historical analytics on a schedule.

### Federation Performance Optimization

Raw federation performance depends on source latency, network bandwidth, and the federation engine's ability to push computation down to sources. Several techniques close the gap between federation and co-located warehouse queries.

**Predicate pushdown** is the most impactful optimization. When the federation engine pushes `WHERE` clauses to the source, only matching rows are transferred, reducing network transfer by orders of magnitude for selective queries.

**Parallel execution** dispatches sub-queries to independent sources concurrently. A query joining data from PostgreSQL, S3, and Databricks issues all three sub-queries simultaneously rather than sequentially.

**Result caching** stores the results of expensive federated queries for a configurable TTL. Subsequent identical queries are served from cache without hitting the sources. This is particularly effective for dashboard queries that refresh on a fixed interval.

**Local acceleration** goes further than result caching by materializing entire datasets locally. Instead of caching individual query results, the acceleration layer maintains a full, queryable copy of the dataset that is refreshed via CDC or scheduled sync. This enables sub-second performance for any query pattern against the accelerated dataset, not just previously executed queries.

These optimizations can be combined. A federation engine might push predicates to the source, execute sub-queries in parallel, serve frequently accessed datasets from local acceleration, and cache the merged results for identical follow-up queries.

## How Spice Bridges Federation and ETL

[Spice](/platform/sql-federation-acceleration) combines SQL federation and local data acceleration in a single runtime, providing a practical middle ground between pure federation and full ETL.

Queries are federated across [40+ data connectors](/integrations) with automatic predicate pushdown and parallel execution. For datasets that require lower latency than raw federation can deliver, Spice provides local acceleration: caching data in-memory (Apache Arrow) or on-disk (DuckDB) with [change data capture](/learn/change-data-capture) keeping the cache synchronized with source systems.

This hybrid approach gives teams the real-time access and operational simplicity of federation, with the performance characteristics of co-located data, without building and maintaining traditional ETL pipelines. Data freshness is measured in seconds (via CDC) rather than hours (via batch ETL), and new data sources become queryable in minutes rather than weeks.

For large-scale [data lake workloads](/use-case/datalake-accelerator), Spice provides acceleration engines optimized for high-throughput analytical queries over object storage, bridging the gap between data lake scalability and the sub-second performance that applications require.

The result is an architecture where federation, acceleration, and ETL coexist. Teams start with federation for immediate access, add acceleration for performance-critical datasets, and retain ETL pipelines only for workloads that genuinely require batch materialization into a central warehouse.

<ContentRichText
  fields={{
    coverage: 'rc-end',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<AccordionFaq
  fields={{
    heading: 'SQL Federation vs ETL FAQ',
    paragraph: '',
    items: [
      {
        title: 'Can SQL federation completely replace ETL?',
        paragraph:
          '<p>For many workloads, yes. Federation eliminates the need for ETL pipelines when the goal is real-time, cross-source data access. However, ETL remains valuable for heavy analytical workloads over large historical datasets, compliance archives, and scenarios where source systems cannot handle additional query load. Most production architectures use both patterns for different workloads.</p>',
      },
      {
        title: 'Is SQL federation slower than querying a warehouse?',
        paragraph:
          '<p>Raw federation can be slower because queries must travel over the network to source systems. However, federation engines with local acceleration close this gap by caching frequently accessed data in-memory or on-disk. With acceleration, federated queries can match warehouse performance while providing real-time data freshness that ETL cannot.</p>',
      },
      {
        title: 'How does federation handle source system outages?',
        paragraph:
          '<p>If a source system is unavailable, federated queries that depend on it will fail. Production federation engines mitigate this with local acceleration caches that can serve queries even when the source is temporarily offline, connection pooling with health checks, and configurable fallback behavior. ETL avoids this issue because the warehouse is independent after data is loaded.</p>',
      },
      {
        title: 'What happens to ETL pipelines when source schemas change?',
        paragraph:
          '<p>Schema changes are one of the biggest operational challenges with ETL. When a source adds a column, changes a data type, or renames a table, ETL pipelines break and require manual fixes. Federation handles schema changes more gracefully because queries execute against the current schema at runtime. The query adapts automatically as long as the referenced columns still exist.</p>',
      },
      {
        title: 'Can I use federation and ETL together in the same architecture?',
        paragraph:
          '<p>Yes, and this is the recommended approach for most organizations. Use federation for real-time access, ad-hoc queries, and AI workloads. Use ETL for batch analytics, historical reporting, and compliance. Spice supports this hybrid model natively: federated queries and locally accelerated datasets coexist in a single runtime, so teams choose the right pattern per workload without managing separate infrastructure.</p>',
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<ContentResourceFeatured
  fields={{
    heading: 'Learn more about SQL federation and data integration',
    paragraph:
      'Guides, blog posts, and documentation on federated queries, acceleration, and modern data architectures.',
    mode: 'default',
    resources: [
      {
        source: 'manual',
        resource: null,
        resource_manual: {
          eyebrow: 'Docs',
          title: {
            title: 'Query Federation Docs',
            url: 'https://spiceai.org/docs/features/query-federation',
            target: '_blank',
          },
          description:
            'Learn how Spice federates SQL queries across multiple data sources with predicate pushdown and local acceleration.',
          image: {
            ID: 1661,
            id: 1661,
            title: 'Docs jpeg',
            filename: 'Docs-jpeg.jpeg',
            filesize: 103192,
            url: '/website-assets/media/2025/12/Docs-jpeg.jpeg',
            link: '/docs-jpeg/',
            alt: '',
            author: '9',
            description: '',
            caption: '',
            name: 'docs-jpeg',
            status: 'inherit',
            uploaded_to: 0,
            date: '2025-12-05 04:13:53',
            modified: '2025-12-05 04:13:53',
            menu_order: 0,
            mime_type: 'image/jpeg',
            type: 'image',
            subtype: 'jpeg',
            icon: '/website-assets/media/default.png',
            width: 1832,
            height: 1036,
            sizes: {
              thumbnail: '/website-assets/media/2025/12/Docs-jpeg-150x150.jpeg',
              'thumbnail-width': 150,
              'thumbnail-height': 150,
              medium: '/website-assets/media/2025/12/Docs-jpeg-300x170.jpeg',
              'medium-width': 300,
              'medium-height': 170,
              medium_large:
                '/website-assets/media/2025/12/Docs-jpeg-768x434.jpeg',
              'medium_large-width': 768,
              'medium_large-height': 434,
              large: '/website-assets/media/2025/12/Docs-jpeg-1024x579.jpeg',
              'large-width': 1024,
              'large-height': 579,
              '1536x1536':
                '/website-assets/media/2025/12/Docs-jpeg-1536x869.jpeg',
              '1536x1536-width': 1536,
              '1536x1536-height': 869,
              '2048x2048': '/website-assets/media/2025/12/Docs-jpeg.jpeg',
              '2048x2048-width': 1832,
              '2048x2048-height': 1036,
            },
          },
        },
      },
      {
        source: 'picker',
        resource: [
          {
            title:
              'Getting Started with Spice.ai SQL Query Federation & Acceleration',
            slug: '/blog/spice-sql-query-federation-acceleration',
            excerpt:
              'Learn how to use Spice.ai to federate and accelerate queries across operational and analytical systems with zero ETL.',
            image:
              '/website-assets/media/2025/11/68ee96eb08a0dfcb609c1969_Version-7-1.png',
            type: 'Blog',
            taxonomy: ['Spice AI'],
          },
        ],
        resource_manual: {
          eyebrow: '',
          title: null,
          description: '',
          image: false,
        },
      },
      {
        source: 'picker',
        resource: [
          {
            title: 'How we use Apache DataFusion at Spice AI',
            slug: '/blog/how-we-use-apache-datafusion-at-spice-ai',
            excerpt:
              'A technical overview of how Spice extends Apache DataFusion with custom table providers, optimizer rules, and UDFs to power federated SQL, search, and AI inference.',
            image:
              '/website-assets/media/2026/01/Engineering-at-Spice-AI-Apache-DataFusion.png',
            type: 'Blog',
            taxonomy: ['SQL Federation', 'Engineering'],
          },
        ],
        resource_manual: {
          eyebrow: '',
          title: null,
          description: '',
          image: false,
        },
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<TalkToAnEngineerCta />

---

## How to Do SQL Query Federation
URL: https://spice.ai/learn/sql-federation
Date: 2025-12-15T00:00:00
Description: SQL query federation lets you query multiple databases with a single SQL statement without moving data. Learn how to set up federated queries, optimize with predicate pushdown, and combine federation with acceleration.

<HeroCenteredText
  fields={{
    graphic_position: 'no-graphic',
    heading_tag: 'h1',
    heading: 'How to Do SQL Query Federation',
    paragraph:
      'SQL federation is a data access pattern that lets you query multiple, heterogeneous data sources through a single SQL interface, without copying or moving data into a central store.',
    cta: [
      {
        type: 'filled',
        cta: {
          title: 'See Spice SQL federation',
          url: '/platform/sql-federation-acceleration',
          target: '',
        },
      },
      {
        type: 'bordered',
        cta: {
          title: 'Read the docs',
          url: 'https://spiceai.org/docs/features/query-federation',
          target: '',
        },
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<ContentRichText
  fields={{
    coverage: 'rc-start',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

Most organizations store data across many systems: transactional databases like PostgreSQL and MySQL, analytical warehouses like Databricks and Snowflake, object stores like Amazon S3, and streaming platforms like Kafka. When an application or analyst needs to combine data from several of these systems, the traditional approach is to build ETL (extract, transform, load) pipelines that copy everything into a central warehouse.

SQL federation takes a different approach. Instead of moving data, a federation engine connects to each source at query time, translates a single SQL query into source-specific requests, and merges the results. The data stays where it is. The application sees a single, unified SQL interface.

## How SQL Federation Works

A federated query goes through three stages: planning, execution, and merging.

### Query Planning

When a query arrives, the federation engine parses the SQL and identifies which tables map to which data sources. It then builds an optimized execution plan. The planner determines which operations (filters, joins, aggregations, sorts) can be pushed down to each source system versus which must be handled in the federation layer.

This planning step is critical for performance. A well-optimized plan minimizes the amount of data transferred over the network by pushing as much work as possible to the sources.

### Predicate and Aggregation Pushdown

Pushdown is the most important optimization in SQL federation. When the engine detects that a filter (e.g., `WHERE created_at > '2026-01-01'`) or aggregation (e.g., `COUNT(*)`, `SUM(amount)`) can be executed natively by the source database, it pushes that operation down rather than pulling all the raw data into the federation layer.

For example, consider a query that joins customer records from PostgreSQL with order events from Databricks, filtered to the last 30 days:

```sql
SELECT c.name, COUNT(o.id) as order_count
FROM postgres.customers c
JOIN databricks.orders o ON c.id = o.customer_id
WHERE o.created_at > NOW() - INTERVAL '30 days'
GROUP BY c.name
```

A federation engine with good pushdown will:

1. Push the `WHERE o.created_at > ...` filter to Databricks, so only recent orders are transferred
2. Potentially push the `COUNT` aggregation partially to each source
3. Pull only the filtered, reduced result sets into the federation layer for the final join

Without pushdown, the engine would pull every row from both tables and filter locally, a much slower and more expensive operation.

### Result Merging

After each source returns its partial results, the federation layer applies any remaining operations: cross-source joins, final sorts, limit clauses, and formatting. The merged result is returned to the application as a single result set, indistinguishable from a query against a single database.

## SQL Federation vs. ETL Pipelines

ETL and SQL federation solve the same fundamental problem (accessing data across systems), but they make different tradeoffs.

**Data movement:** ETL copies data from sources into a central warehouse on a schedule. Federation queries data in place at runtime. ETL introduces storage duplication and pipeline maintenance. Federation eliminates both but depends on source availability at query time.

**Data freshness:** ETL pipelines run on schedules (hourly, daily), so warehouse data is always behind. Federation queries live sources, so results reflect the current state. For AI workloads, real-time dashboards, and operational applications, this freshness difference is significant.

**Time to value:** ETL requires schema design, transformation logic, and orchestration before data is queryable. Federation makes a new source available as soon as a connector is configured, often in minutes.

**Performance:** Raw federation queries are bounded by source performance and network latency. ETL trades freshness for speed by pre-computing and co-locating data. The best systems combine both: federation for real-time access, with local acceleration caching for performance-critical queries.

**Maintenance:** ETL pipelines break when source schemas change, requiring manual fixes. Federation adapts more gracefully because queries execute against the current schema at runtime.

In practice, many production systems use both patterns. Federated queries handle real-time access and ad-hoc exploration, while [acceleration caches](/feature/real-time-change-data-capture), kept fresh via change data capture, provide sub-second performance for latency-sensitive workloads. This combined approach (federation plus CDC-backed local caches, without centralized ETL pipelines) is what architects describe as a [zero-ETL architecture](/learn/zero-etl).

## Key Benefits of SQL Federation

### No ETL Pipelines to Maintain

Every ETL pipeline is a liability: it can break when source schemas change, it introduces data staleness, and it requires engineering time to build and monitor. Federation eliminates these pipelines for many use cases, reducing the operational burden on data teams.

### Unified SQL Interface

Application developers write standard SQL against a single endpoint. The federation engine handles connectivity, dialect translation, and schema mapping across PostgreSQL, MySQL, S3, Databricks, and [40+ other sources](/integrations). Teams don't need to learn each source's query language or manage separate connections.

### Real-Time Data Access

Because queries execute against live sources, results reflect the current state of each system. This is critical for operational dashboards, AI workloads, and any application where stale data leads to bad decisions.

### Governed, Secure Access

A federation layer provides a single point of access control, audit logging, and policy enforcement. Instead of managing permissions across every source individually, teams define policies once at the federation layer. This simplifies compliance and security, especially in regulated industries like [financial services](/industry/financial-services) and [cybersecurity](/industry/cybersecurity).

## Common SQL Federation Use Cases

### Cross-Database Analytics

Join customer data in PostgreSQL with event data in Databricks and product data in Amazon S3, all in a single query. Federation eliminates the need to pre-join datasets in a warehouse, making it possible to run ad-hoc analytics across any combination of sources.

### AI and Machine Learning Pipelines

AI models and [retrieval-augmented generation (RAG)](/learn/retrieval-augmented-generation) systems need fresh, complete data from multiple sources. Federation provides the real-time, multi-source data access that AI workloads require without building and maintaining separate data pipelines for each model.

### Operational Data Lakehouses

Combine transactional databases with analytical stores and object storage into a [single queryable layer](/use-case/operational-data-lakehouse). Federation bridges the gap between OLTP and OLAP workloads, enabling teams to query operational and analytical data together.

### Data Mesh Architectures

In data mesh, each domain team owns its data products. Federation provides governed, cross-domain queries without centralizing data into a monolithic warehouse. Each team maintains autonomy over its data while the federation layer enables organization-wide access.

## How to Set Up SQL Federation with Spice

[Spice](/platform/sql-federation-acceleration) combines SQL federation and local acceleration in a single runtime. Here's how to federate queries across multiple data sources in practice.

### Step 1: Define Your Data Sources

A `spicepod.yaml` file declares each data source and how Spice should connect to it. Each dataset maps a remote source to a local table name:

```yaml
version: v1
kind: Spicepod
name: federated_analytics

datasets:
  # Transactional data from PostgreSQL
  - from: postgres:public.customers
    name: customers
    params:
      pg_host: db.example.com
      pg_port: '5432'
      pg_db: production
      pg_user: ${secrets:PG_USER}
      pg_pass: ${secrets:PG_PASS}

  # Analytical data from Databricks
  - from: databricks:catalog.schema.orders
    name: orders
    params:
      databricks_host: dbc-example.cloud.databricks.com
      databricks_token: ${secrets:DATABRICKS_TOKEN}

  # Product catalog from S3 Parquet files
  - from: s3://data-lake/products/
    name: products
    params:
      file_format: parquet
```

Run `spice run` and Spice connects to all three sources. No ETL pipelines, no data movement.

### Step 2: Query Across Sources with Standard SQL

Once the sources are registered, query them with standard SQL as if they were tables in a single database. Spice handles dialect translation, connection management, and predicate pushdown automatically:

```sql
-- Join PostgreSQL customers with Databricks orders and S3 product data
SELECT c.name, p.category, COUNT(o.id) AS order_count, SUM(o.amount) AS total_spend
FROM customers c
JOIN orders o ON c.id = o.customer_id
JOIN products p ON o.product_id = p.id
WHERE o.created_at > NOW() - INTERVAL '30 days'
GROUP BY c.name, p.category
ORDER BY total_spend DESC
LIMIT 20
```

Spice pushes the `WHERE o.created_at > ...` filter to Databricks, fetches only matching rows, and merges results locally. The application receives a single result set through [Arrow Flight SQL](/learn/apache-arrow), ODBC, JDBC, or HTTP.

### Step 3: Add Acceleration for Performance-Critical Queries

Pure federation depends on source latency. For queries that need sub-second performance, add local acceleration with a few lines of configuration:

```yaml
datasets:
  - from: postgres:public.customers
    name: customers
    acceleration:
      engine: arrow # In-memory acceleration
      refresh_mode: full
      refresh_check_interval: 10s

  - from: databricks:catalog.schema.orders
    name: orders
    acceleration:
      engine: arrow
      refresh_mode: full
      refresh_check_interval: 10m
```

With acceleration enabled, Spice caches the dataset locally and serves queries from the cache. For PostgreSQL, [change data capture](/learn/change-data-capture) keeps the cache synchronized with the source in real time. For Databricks, periodic full refresh ensures the cache stays current.

This pattern (federation for connectivity, acceleration for performance) addresses the main limitation of pure federation while preserving real-time data freshness. Queries that hit the acceleration layer return in single-digit milliseconds, even when the underlying sources are slow or remote.

### Step 4: Connect Your Application

Spice exposes federated and accelerated data through standard protocols. Applications connect using whichever client fits their stack:

- **Arrow Flight SQL** for high-throughput columnar data transfer (Python, Go, Rust, Java)
- **HTTP/JSON** for lightweight queries from any language
- **ODBC/JDBC** for BI tools, dashboards, and legacy applications
- **OpenAI-compatible API** for [LLM inference](/learn/llm-inference) and [text-to-SQL](/learn/text-to-sql)

No custom SDKs or proprietary protocols. Teams query Spice the same way they query PostgreSQL or any other SQL database.

## Advanced Topics

### Federation Query Planning Internals

The query planner is the most performance-critical component in a federation engine. When a multi-source SQL query arrives, the planner must decompose it into a set of sub-queries that each target a single source, determine the optimal execution order, and decide which operations to execute locally versus remotely.

Modern federation engines build a logical plan tree from the parsed SQL, then apply a series of optimizer rules. The most impactful rules include join reordering (choosing which source to query first based on estimated selectivity), predicate pushdown (moving filters as close to the source as possible), and projection pruning (requesting only the columns needed by the final result, rather than `SELECT *` from each source).

The planner also handles type coercion between sources. PostgreSQL's `TIMESTAMPTZ`, Snowflake's `TIMESTAMP_LTZ`, and S3 Parquet's `TIMESTAMP_MICROS` all represent timestamps differently. The planner inserts cast operations to normalize types before cross-source joins.

```mermaid
flowchart LR
    A[SQL Query] --> B[Query Parser]
    B --> C[Logical Planner]
    C --> D[Optimizer Rules]
    D --> E1[Source Query: PostgreSQL]
    D --> E2[Source Query: Databricks]
    D --> E3[Source Query: S3]
    E1 --> F[Merge & Join Layer]
    E2 --> F
    E3 --> F
    F --> G[Final Result Set]
```

### Cost-Based Optimization

Simple rule-based planners apply optimizations in a fixed order, which works for straightforward queries but misses opportunities in complex ones. Cost-based optimizers (CBOs) estimate the execution cost of multiple candidate plans and select the cheapest one.

Cost estimation in federation is harder than in a single database because the planner must account for network transfer costs, source-specific query latency, and varying source capabilities. A CBO might estimate that pushing a `GROUP BY` to Databricks (which is optimized for large-scale aggregations) saves more time than pushing it to PostgreSQL, even if both support the operation. The planner assigns cost weights to network transfer, source compute, and local compute, then evaluates candidate plans against these weights.

In practice, federation engines maintain statistics about source performance (average query latency, throughput capacity, and supported pushdown operations) and use these to inform planning decisions.

### Connection Pooling and Source Management

Each federated query opens connections to one or more source databases. Without connection pooling, a burst of concurrent queries could exhaust source connection limits and cause failures. Federation engines maintain connection pools for each configured source, reusing connections across queries and enforcing concurrency limits.

Connection pools also handle health checks and failover. If a source becomes temporarily unavailable, the pool marks it unhealthy and returns errors immediately rather than hanging on connection timeouts. When the source recovers, the pool resumes routing queries to it. For latency-sensitive workloads, some engines support read replicas or fallback sources: if the primary source is slow, the query is routed to a replica or an [acceleration cache](/learn/data-acceleration) instead.

<ContentRichText
  fields={{
    coverage: 'rc-end',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<AccordionFaq
  fields={{
    heading: 'SQL Federation FAQ',
    paragraph: '',
    items: [
      {
        title: 'What is the difference between SQL federation and ETL?',
        paragraph:
          '<p>ETL copies data from source systems into a central warehouse on a schedule. SQL federation queries data in place at runtime without copying it. ETL introduces latency and pipeline maintenance, while federation provides real-time access but depends on source availability. Many teams combine both: federated queries for real-time access and acceleration caches for performance-critical workloads.</p>',
      },
      {
        title:
          'How does SQL federation handle performance across slow data sources?',
        paragraph:
          '<p>Federation engines use predicate pushdown to minimize data transfer and query acceleration (local caching) to avoid repeated round-trips to slow sources. Spice combines federation with local acceleration: frequently accessed data is cached in-memory or on-disk, enabling sub-second queries even when the underlying source is slow or remote.</p>',
      },
      {
        title: 'What types of data sources support SQL federation?',
        paragraph:
          '<p>Most federation engines support relational databases (PostgreSQL, MySQL, SQL Server), analytical warehouses (Databricks, Snowflake, BigQuery), object stores (S3, Azure Blob, GCS), and streaming systems. The specific connectors vary by engine. Spice supports 40+ data connectors out of the box.</p>',
      },
      {
        title: 'Is SQL federation suitable for production workloads?',
        paragraph:
          '<p>Yes, when paired with query acceleration and proper governance. Raw federation without caching can be slow for latency-sensitive applications. Production-grade federation engines like Spice add local acceleration, connection pooling, and fault tolerance to ensure reliable sub-second performance.</p>',
      },
      {
        title: 'How does SQL federation differ from data virtualization?',
        paragraph:
          '<p>Data virtualization is the broader concept of abstracting data access across sources. SQL federation is a specific implementation that uses SQL as the query interface. All SQL federation is data virtualization, but data virtualization can also include REST APIs, GraphQL, or other query paradigms.</p>',
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<ContentResourceFeatured
  fields={{
    heading: 'Learn more about SQL federation',
    paragraph:
      'Guides, blog posts, and documentation to help you get started with federated SQL queries.',
    mode: 'default',
    resources: [
      {
        source: 'manual',
        resource: null,
        resource_manual: {
          eyebrow: 'Docs',
          title: {
            title: 'Query Federation Docs',
            url: 'https://spiceai.org/docs/features/query-federation',
            target: '_blank',
          },
          description:
            'Learn how Spice federates SQL queries across multiple data sources with predicate pushdown and local acceleration.',
          image: {
            ID: 1661,
            id: 1661,
            title: 'Docs jpeg',
            filename: 'Docs-jpeg.jpeg',
            filesize: 103192,
            url: '/website-assets/media/2025/12/Docs-jpeg.jpeg',
            link: '/docs-jpeg/',
            alt: '',
            author: '9',
            description: '',
            caption: '',
            name: 'docs-jpeg',
            status: 'inherit',
            uploaded_to: 0,
            date: '2025-12-05 04:13:53',
            modified: '2025-12-05 04:13:53',
            menu_order: 0,
            mime_type: 'image/jpeg',
            type: 'image',
            subtype: 'jpeg',
            icon: '/website-assets/media/default.png',
            width: 1832,
            height: 1036,
            sizes: {
              thumbnail: '/website-assets/media/2025/12/Docs-jpeg-150x150.jpeg',
              'thumbnail-width': 150,
              'thumbnail-height': 150,
              medium: '/website-assets/media/2025/12/Docs-jpeg-300x170.jpeg',
              'medium-width': 300,
              'medium-height': 170,
              medium_large:
                '/website-assets/media/2025/12/Docs-jpeg-768x434.jpeg',
              'medium_large-width': 768,
              'medium_large-height': 434,
              large: '/website-assets/media/2025/12/Docs-jpeg-1024x579.jpeg',
              'large-width': 1024,
              'large-height': 579,
              '1536x1536':
                '/website-assets/media/2025/12/Docs-jpeg-1536x869.jpeg',
              '1536x1536-width': 1536,
              '1536x1536-height': 869,
              '2048x2048': '/website-assets/media/2025/12/Docs-jpeg.jpeg',
              '2048x2048-width': 1832,
              '2048x2048-height': 1036,
            },
          },
        },
      },
      {
        source: 'picker',
        resource: [
          {
            title:
              'Getting Started with Spice.ai SQL Query Federation & Acceleration',
            slug: '/blog/spice-sql-query-federation-acceleration',
            excerpt:
              'Learn how to use Spice.ai to federate and accelerate queries across operational and analytical systems with zero ETL.',
            image:
              '/website-assets/media/2025/11/68ee96eb08a0dfcb609c1969_Version-7-1.png',
            type: 'Blog',
            taxonomy: ['Spice AI'],
          },
        ],
        resource_manual: {
          eyebrow: '',
          title: null,
          description: '',
          image: false,
        },
      },
      {
        source: 'picker',
        resource: [
          {
            title: 'How we use Apache DataFusion at Spice AI',
            slug: '/blog/how-we-use-apache-datafusion-at-spice-ai',
            excerpt:
              'A technical overview of how Spice extends Apache DataFusion with custom table providers, optimizer rules, and UDFs to power federated SQL, search, and AI inference.',
            image:
              '/website-assets/media/2026/01/Engineering-at-Spice-AI-Apache-DataFusion.png',
            type: 'Blog',
            taxonomy: ['SQL Federation', 'Engineering'],
          },
        ],
        resource_manual: {
          eyebrow: '',
          title: null,
          description: '',
          image: false,
        },
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<TalkToAnEngineerCta />

---

## What is Tantivy?
URL: https://spice.ai/learn/tantivy
Date: 2026-03-12T00:00:00
Description: Tantivy is an open-source, full-text search engine library written in Rust, inspired by Apache Lucene. Learn how Tantivy works, its architecture, how it compares to Lucene and Elasticsearch, and how Spice uses it for search.

<HeroCenteredText
  fields={{
    graphic_position: 'no-graphic',
    heading_tag: 'h1',
    heading: 'What is Tantivy?',
    paragraph:
      'Tantivy is an open-source, full-text search engine library written in Rust. Inspired by Apache Lucene, Tantivy provides fast, reliable text indexing and search as an embeddable library rather than a standalone server.',
    cta: [
      {
        type: 'filled',
        cta: {
          title: 'See Spice search',
          url: '/platform/hybrid-sql-search',
          target: '',
        },
      },
      {
        type: 'bordered',
        cta: {
          title: 'Read the docs',
          url: 'https://spiceai.org/docs',
          target: '',
        },
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<ContentRichText
  fields={{
    coverage: 'rc-start',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

Full-text search is a core capability for any system that needs to find relevant documents from a large corpus based on natural language queries. The dominant technology behind full-text search, Apache Lucene, has been the industry standard for over two decades. But Lucene is a Java library, and embedding it into non-JVM systems introduces complexity, overhead, and operational constraints.

Tantivy is a full-text search engine library written in Rust that brings Lucene-class search capabilities to the Rust ecosystem. It implements the same fundamental data structures and algorithms (inverted indexes, [BM25 scoring](/learn/bm25-full-text-search), segment-based architecture) while taking advantage of Rust's memory safety, zero-cost abstractions, and native performance. Like Lucene, Tantivy is a library, not a server. It is designed to be embedded directly into applications that need search functionality without the overhead of running a separate search service.

## Core Architecture

Tantivy's architecture follows the same proven design that made Lucene successful: documents are indexed into segments, each containing an inverted index that maps terms to the documents where they appear.

### Inverted Indexes

The inverted index is the fundamental data structure behind full-text search. For every unique term that appears in the indexed documents, the inverted index maintains a **posting list**: a sorted list of document IDs where that term appears, along with metadata like term frequency and positions.

For example, indexing three documents about database topics might produce:

```
"query"     → [doc_1, doc_2, doc_3]
"optimize"  → [doc_1, doc_3]
"postgres"  → [doc_2]
"index"     → [doc_1, doc_2]
```

When a search query arrives, Tantivy tokenizes the query, looks up the posting lists for each term, and combines them to find matching documents. This is fast because the work is proportional to the number of matching documents, not the total corpus size.

Tantivy stores posting lists in a compressed format optimized for sequential access and intersection operations. The compression uses techniques like variable-byte encoding and block-based compression that balance space efficiency with decompression speed.

### Segments and the Segment Architecture

Tantivy organizes its index into **segments**, each of which is an independent, self-contained inverted index. New documents are written to new segments rather than modifying existing ones. This append-only design has several advantages:

- **Concurrent reads and writes:** Readers operate on immutable segments while writers create new ones, so indexing never blocks searching.
- **Crash safety:** If the process crashes mid-write, only the incomplete segment is lost. Existing segments remain intact.
- **Efficient updates:** Deleting a document marks it as deleted in a bitmap rather than physically removing it from the segment. The deleted document is excluded from search results and physically cleaned up during merging.

Each segment contains its own inverted index, stored fields, fast fields (columnar numeric data for sorting and filtering), and term dictionary. The term dictionary maps terms to their posting lists and uses a finite state transducer (FST) for compact, fast prefix lookups.

### Segment Merging

Over time, as new segments accumulate, the index can become fragmented: many small segments increase the overhead of searching (each segment must be searched independently and results merged). Tantivy addresses this with **segment merging**, a background process that combines multiple segments into larger ones.

Merging serves multiple purposes:

- **Performance:** Fewer, larger segments reduce per-query overhead
- **Space reclamation:** Documents marked as deleted are physically removed during merging
- **Compaction:** The merged segment has a more compact representation than the sum of its inputs

Tantivy uses a configurable merge policy that determines when and how segments are merged. The default policy targets a logarithmic distribution of segment sizes, similar to Lucene's tiered merge policy. This balances merge cost against search performance.

## Key Features

### BM25 Scoring

Tantivy uses [BM25 (Best Match 25)](/learn/bm25-full-text-search) as its default ranking function. BM25 scores documents based on three factors: term frequency (how often query terms appear in the document), inverse document frequency (how rare those terms are across the corpus), and document length normalization (penalizing longer documents that naturally contain more term occurrences).

BM25 is the same ranking function used by Elasticsearch, Apache Solr, and most production search engines. Using BM25 as the default means Tantivy produces relevance rankings comparable to these established systems.

### Phrase Queries and Positional Indexing

Tantivy supports phrase queries: queries that require terms to appear in a specific order and proximity. The query `"database optimization"` matches only documents where "database" and "optimization" appear adjacent and in that order, excluding documents where the terms appear separately.

Phrase queries require positional information in the inverted index. For each term occurrence, Tantivy records not just the document ID but also the position within the document. This positional data enables phrase matching, proximity queries (terms within N positions of each other), and highlighting of matching passages.

### Faceted Search

Faceted search enables categorization and filtering of search results by structured attributes. Tantivy supports hierarchical facets (structured paths like `/category/databases/postgresql`) that allow users to drill down into search results by category.

Facets are stored as a special field type in the index and can be combined with full-text queries. A search for "query optimization" can be filtered to only documents faceted under `/category/databases`, with counts showing how many results exist under each sub-facet.

### Range Queries and Fast Fields

Tantivy supports range queries on numeric and date fields: for example, finding documents where `published_date` falls between two dates or where `price` is below a threshold. These queries use **fast fields**, Tantivy's equivalent of Lucene's doc values.

Fast fields store columnar numeric data alongside the inverted index. Unlike the inverted index (which maps terms to documents), fast fields map documents to values. This columnar layout enables efficient sorting, filtering, and aggregation on numeric fields without reading the full document.

### Multi-Threaded Indexing

Tantivy supports multi-threaded indexing out of the box. Multiple threads can add documents to the index concurrently, with each thread writing to its own segment. This parallelism is particularly valuable for bulk indexing operations where throughput is critical.

The indexing pipeline includes configurable tokenization, concurrent segment writing, and automatic segment merging. A configurable memory budget controls how much data is buffered in memory before being flushed to disk as a new segment.

### Custom Tokenizers

Tantivy provides a tokenizer pipeline that can be customized per field. The default tokenizer splits text on whitespace and punctuation, lowercases tokens, and removes stop words. Custom tokenizers can add stemming (reducing words to their root form), n-gram generation, language-specific analysis, or any other text processing step.

The tokenizer pipeline is applied both at index time (when documents are added) and at query time (when queries are processed), ensuring consistent token handling across indexing and search.

## Tantivy vs. Apache Lucene

Tantivy and Apache Lucene share the same fundamental architecture (inverted indexes, segment-based storage, BM25 scoring) but differ in language, deployment model, and ecosystem.

**Language and runtime:** Lucene is written in Java and requires the JVM. Tantivy is written in Rust with no runtime dependencies. Rust's ownership model provides memory safety without garbage collection pauses, and its zero-cost abstractions enable performance comparable to hand-written C/C++ code.

**Embedding model:** Both are libraries, but embedding Lucene into a non-Java application requires JNI bridges, JVM lifecycle management, and cross-language memory coordination. Tantivy can be embedded directly into any Rust application or accessed through FFI bindings from C, Python, or other languages with simpler interop.

**Feature parity:** Lucene has a broader feature set developed over two decades: custom similarity models, spatial search, auto-suggest, and a rich analyzer ecosystem. Tantivy covers the core search features (inverted indexes, BM25, phrase queries, facets, range queries) but does not yet match Lucene's full breadth. For most full-text search use cases, Tantivy's feature set is sufficient.

**Performance characteristics:** Benchmarks show Tantivy achieving competitive or superior indexing throughput and query latency compared to Lucene, particularly for single-node workloads. Rust's predictable performance (no GC pauses, no JIT warm-up) makes Tantivy's latency profile more consistent, which matters for search workloads where tail latency affects user experience.

## Tantivy vs. Elasticsearch

Elasticsearch is a distributed search and analytics engine built on top of Lucene. Comparing Tantivy to Elasticsearch is comparing a library to a full system.

**Architecture:** Elasticsearch is a distributed server with REST APIs, cluster management, replication, and sharding. Tantivy is an embeddable library with no network layer, clustering, or server infrastructure. Elasticsearch adds operational complexity but provides horizontal scalability. Tantivy adds zero operational overhead but requires the application to handle distribution if needed.

**Deployment:** Elasticsearch requires deploying, monitoring, and maintaining a cluster. Tantivy is embedded directly in the application process: there is no separate system to manage, no network hops between the application and the search engine, and no data synchronization between systems.

**Use case fit:** Choose Elasticsearch when you need a standalone, distributed search service with its own cluster infrastructure, REST APIs, and a rich ecosystem of clients and integrations. Choose Tantivy when you need search capabilities embedded directly in a Rust application without the overhead of a separate service.

**Performance:** For single-node search workloads, Tantivy's embedded model eliminates the network serialization and deserialization overhead inherent in Elasticsearch's HTTP-based API. Query latency is lower because the search happens in-process. For distributed workloads across large clusters, Elasticsearch's built-in sharding and replication provide capabilities that Tantivy does not include.

## How Spice Uses Tantivy

[Spice](/platform/hybrid-sql-search) embeds Tantivy as its full-text search engine. When users enable full-text search on accelerated datasets, Spice builds Tantivy indexes automatically and exposes search through SQL. This powers [BM25 keyword search](/learn/bm25-full-text-search), which combines with [vector search](/learn/vector-search) to enable [hybrid search](/learn/hybrid-search) in a single SQL query.

Tantivy's Rust-native design aligns with Spice's Rust-based architecture. Spice is built on [Apache DataFusion](/learn/apache-datafusion) and Apache Arrow, both of which are Rust-native. Embedding Tantivy means full-text search runs in the same process, with the same memory model, and without the overhead of crossing language boundaries (as would be required with a JVM-based library like Lucene) or network boundaries (as would be required with a separate service like Elasticsearch).

### Automatic Index Management

When full-text search is enabled on a dataset in Spice, the runtime automatically:

1. Builds a Tantivy index over the specified text columns
2. Keeps the index synchronized as source data changes through [change data capture](/learn/change-data-capture)
3. Exposes the index through SQL query functions

Users do not interact with Tantivy directly: they write SQL queries and Spice translates full-text search operations into Tantivy queries internally.

### Hybrid Search in SQL

Spice combines Tantivy-powered full-text search with vector similarity search in a unified SQL interface. A single query can perform BM25 keyword search, vector search, or both, with results fused using Reciprocal Rank Fusion (RRF):

```sql
-- Hybrid search combining BM25 full-text and vector similarity
SELECT * FROM search(
  'knowledge_base',
  'kubernetes deployment troubleshooting',
  mode => 'hybrid',
  limit => 10
)
```

This hybrid approach addresses the [vocabulary mismatch problem](/learn/hybrid-search) (BM25 handles exact keyword matches while vector search captures semantic similarity) without requiring separate search infrastructure or complex result merging logic in the application layer. For teams building [search features into applications](/use-case/application-search), this removes the need to run a dedicated search cluster alongside the database.

## When to Use Tantivy

Tantivy is the right choice when:

- **You are building a Rust application that needs search:** Tantivy integrates natively with Rust codebases. No JVM, no external services, no FFI complexity.
- **You need an embedded search library:** If search is a feature within a larger application (rather than a standalone service), Tantivy's library model eliminates the operational overhead of running and synchronizing a separate search system.
- **Latency consistency matters:** Rust's lack of garbage collection means no GC pauses during search. Query latency is predictable, which matters for user-facing search and real-time applications.
- **You need core full-text search features:** BM25 scoring, phrase queries, faceted search, range queries, and multi-threaded indexing cover the needs of most full-text search use cases.

Elasticsearch or Solr remain better choices when you need a standalone distributed search cluster, built-in REST APIs, a rich client ecosystem, or advanced features like learning-to-rank, cross-cluster replication, or the full Lucene analyzer ecosystem.

## Advanced Topics

### The Term Dictionary and Finite State Transducers

Tantivy's term dictionary maps terms to their posting list offsets in the inverted index. Rather than using a hash map or B-tree, Tantivy uses a **finite state transducer (FST)**: a compact, immutable data structure that represents a sorted set of key-value pairs.

FSTs are space-efficient because they share common prefixes and suffixes between terms. For a typical English text corpus, the FST representation of the term dictionary is significantly smaller than a hash map or sorted array. FSTs also support efficient prefix lookups, which Tantivy uses for wildcard queries and auto-completion.

The trade-off is that FSTs are immutable: they cannot be updated in place. This fits Tantivy's segment architecture: each segment has its own term dictionary, and new terms are added by creating new segments rather than modifying existing ones.

### Posting List Compression

Posting lists, the sorted lists of document IDs for each term, can be large for common terms. Tantivy compresses posting lists using a combination of techniques:

- **Delta encoding:** Instead of storing absolute document IDs, Tantivy stores the difference (delta) between consecutive IDs. For dense posting lists, these deltas are small and compress well.
- **Block-based compression:** Posting lists are divided into fixed-size blocks (typically 128 document IDs). Each block is compressed independently using bitpacking, where each delta is stored using only as many bits as needed. This enables fast decompression of individual blocks without decompressing the entire list.
- **Skip lists:** Tantivy maintains skip pointers that allow jumping forward in a posting list without reading every entry. This accelerates intersection operations (AND queries) where the engine needs to find document IDs present in multiple posting lists.

These compression techniques reduce index size while maintaining fast query execution. The block-based approach is particularly efficient because modern CPUs can decompress a block of 128 bitpacked integers in a single SIMD operation.

### Concurrent Search and Indexing

Tantivy uses a **searcher snapshot** model to enable concurrent reads and writes. When a search is executed, Tantivy captures a snapshot of the current set of segments and searches that snapshot. New segments created by concurrent indexing operations are not visible to in-progress searches; they become visible only when the next searcher snapshot is created.

This model provides read consistency (a search sees a consistent view of the index) without blocking (indexing continues unimpeded while searches execute). The searcher snapshot is lightweight: it references existing immutable segments rather than copying data.

The `IndexReader` component manages searcher lifecycle, including warming (pre-loading segment data into OS page cache) and recycling (reusing searcher resources across queries). Applications can configure the reload policy to control how quickly new segments become visible to searches.

### Tantivy's Scoring Pipeline

While BM25 is the default, Tantivy's scoring pipeline is customizable. The pipeline consists of:

1. **Weight creation:** At query time, each query clause creates a `Weight` object that encapsulates the global statistics (document frequency, average document length) needed for scoring.
2. **Scorer iteration:** The `Weight` produces a `Scorer` that iterates over matching documents in a segment. The scorer combines posting list traversal with score computation.
3. **Score combination:** For multi-term queries, individual term scores are combined according to the query structure (sum for boolean OR, sum for boolean AND with minimum-should-match semantics).

Developers can implement custom `Weight` and `Scorer` types to use alternative scoring functions (e.g., BM25F for multi-field scoring, or custom learned ranking models) while reusing Tantivy's indexing and posting list infrastructure.

<ContentRichText
  fields={{
    coverage: 'rc-end',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<AccordionFaq
  fields={{
    heading: 'Tantivy FAQ',
    paragraph: '',
    items: [
      {
        title: 'How does Tantivy compare to Apache Lucene?',
        paragraph:
          '<p>Tantivy and Lucene share the same core architecture (inverted indexes, segment-based storage, BM25 scoring) but differ in language and runtime. Lucene is written in Java and requires the JVM. Tantivy is written in Rust with no runtime dependencies. Tantivy offers competitive performance with more predictable latency (no garbage collection pauses), while Lucene has a broader feature set developed over two decades.</p>',
      },
      {
        title: 'Is Tantivy a replacement for Elasticsearch?',
        paragraph:
          '<p>No. Elasticsearch is a distributed search server built on Lucene, with clustering, REST APIs, and operational tooling. Tantivy is an embeddable library without networking or distribution. They serve different use cases: Elasticsearch for standalone distributed search infrastructure, Tantivy for embedding search directly into an application without external dependencies.</p>',
      },
      {
        title: 'What search features does Tantivy support?',
        paragraph:
          '<p>Tantivy supports BM25 scoring, phrase queries, boolean queries, range queries on numeric and date fields, faceted search with hierarchical facets, fuzzy queries, regex queries, and custom tokenizers. It also provides multi-threaded indexing, configurable merge policies, and concurrent search during indexing.</p>',
      },
      {
        title: 'Can Tantivy be used from languages other than Rust?',
        paragraph:
          '<p>Yes. Tantivy has bindings for Python (tantivy-py), and its C-compatible FFI interface allows integration from any language that supports C interop. However, the primary and most complete API is the native Rust API. The Python bindings cover the most common use cases but may not expose every feature.</p>',
      },
      {
        title: 'How does Spice use Tantivy?',
        paragraph:
          '<p>Spice embeds Tantivy as its full-text search engine. When full-text search is enabled on an accelerated dataset, Spice automatically builds and maintains Tantivy indexes and exposes search through SQL. This powers BM25 keyword search, which combines with vector search to enable hybrid search in a single SQL query, without requiring a separate search service.</p>',
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<ContentResourceFeatured
  fields={{
    heading: 'Learn more about Tantivy and search',
    paragraph:
      'Technical guides on full-text search, hybrid search, and how Spice embeds Tantivy for SQL-native search.',
    mode: 'default',
    resources: [
      {
        source: 'manual',
        resource: null,
        resource_manual: {
          eyebrow: 'Docs',
          title: {
            title: 'Spice.ai OSS Documentation',
            url: 'https://spiceai.org/docs',
            target: '_blank',
          },
          description:
            'Learn how Spice embeds Tantivy for full-text search and hybrid search within its SQL query engine.',
          image: {
            ID: 1661,
            id: 1661,
            title: 'Docs jpeg',
            filename: 'Docs-jpeg.jpeg',
            filesize: 103192,
            url: '/website-assets/media/2025/12/Docs-jpeg.jpeg',
            link: '/docs-jpeg/',
            alt: '',
            author: '9',
            description: '',
            caption: '',
            name: 'docs-jpeg',
            status: 'inherit',
            uploaded_to: 0,
            date: '2025-12-05 04:13:53',
            modified: '2025-12-05 04:13:53',
            menu_order: 0,
            mime_type: 'image/jpeg',
            type: 'image',
            subtype: 'jpeg',
            icon: '/website-assets/media/default.png',
            width: 1832,
            height: 1036,
            sizes: {
              thumbnail: '/website-assets/media/2025/12/Docs-jpeg-150x150.jpeg',
              'thumbnail-width': 150,
              'thumbnail-height': 150,
              medium: '/website-assets/media/2025/12/Docs-jpeg-300x170.jpeg',
              'medium-width': 300,
              'medium-height': 170,
              medium_large:
                '/website-assets/media/2025/12/Docs-jpeg-768x434.jpeg',
              'medium_large-width': 768,
              'medium_large-height': 434,
              large: '/website-assets/media/2025/12/Docs-jpeg-1024x579.jpeg',
              'large-width': 1024,
              'large-height': 579,
              '1536x1536':
                '/website-assets/media/2025/12/Docs-jpeg-1536x869.jpeg',
              '1536x1536-width': 1536,
              '1536x1536-height': 869,
              '2048x2048': '/website-assets/media/2025/12/Docs-jpeg.jpeg',
              '2048x2048-width': 1832,
              '2048x2048-height': 1036,
            },
          },
        },
      },
      {
        source: 'picker',
        resource: [
          {
            title: 'How we use Apache DataFusion at Spice AI',
            slug: '/blog/how-we-use-apache-datafusion-at-spice-ai',
            excerpt:
              'A technical overview of how Spice extends Apache DataFusion with custom table providers, optimizer rules, and UDFs.',
            image:
              '/website-assets/media/2026/01/Engineering-at-Spice-AI-Apache-DataFusion.png',
            type: 'Blog',
            taxonomy: ['SQL Federation', 'Engineering'],
          },
        ],
        resource_manual: {
          eyebrow: '',
          title: null,
          description: '',
          image: false,
        },
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<TalkToAnEngineerCta />

---

## How to Use Text-to-SQL
URL: https://spice.ai/learn/text-to-sql
Date: 2026-01-15T00:00:00
Description: Text-to-SQL uses large language models to translate natural language questions into SQL queries. Learn how to implement text-to-SQL with schema-aware generation, prompt engineering, and production safeguards.

<HeroCenteredText
  fields={{
    graphic_position: 'no-graphic',
    heading_tag: 'h1',
    heading: 'How to Use Text-to-SQL',
    paragraph:
      'Text-to-SQL is a technique that uses large language models to translate natural language questions into executable SQL queries, enabling anyone to query databases without writing SQL by hand.',
    cta: [
      {
        type: 'filled',
        cta: {
          title: 'See Spice SQL federation',
          url: '/platform/sql-federation-acceleration',
          target: '',
        },
      },
      {
        type: 'bordered',
        cta: {
          title: 'Read the docs',
          url: 'https://spiceai.org/docs',
          target: '',
        },
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<ContentRichText
  fields={{
    coverage: 'rc-start',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

Databases hold answers to most business questions. But getting those answers requires SQL, a skill that most stakeholders, analysts, and even many developers don't use daily. The gap between "I want to know X" and `SELECT ... FROM ... WHERE ...` is where text-to-SQL fits in.

Text-to-SQL systems accept a natural language question (e.g., "What were our top 10 customers by revenue last quarter?"), generate the corresponding SQL query, execute it against a database, and return the results. The translation is handled by a large language model (LLM) that has been given enough context about the database schema to produce valid, executable SQL.

This is not a new idea: natural language interfaces to databases (NLIDBs) date back to the 1970s. What changed is that modern LLMs are good enough at SQL generation to make these systems practical for real workloads.

## How Text-to-SQL Works

A text-to-SQL system has four stages: schema context injection, natural language parsing, SQL generation, and result delivery.

### Schema Context Injection

Before the LLM can generate SQL, it needs to understand the database structure. This means providing table names, column names, data types, primary and foreign key relationships, and ideally sample values or column descriptions. This context is injected into the LLM prompt alongside the user's question.

The quality of schema context directly determines output quality. An LLM that knows `orders.customer_id` references `customers.id` will generate correct joins. Without that context, it may hallucinate column names or produce syntactically valid but semantically wrong queries.

Schema context can be provided statically (a fixed schema description in the prompt) or dynamically (retrieved at query time based on the user's question). Dynamic retrieval is more scalable for large databases with hundreds of tables, because it limits the prompt to only the relevant tables.

### Natural Language Parsing

The LLM interprets the user's intent from their natural language input. This involves:

- Identifying the entities referenced (tables, columns, metrics)
- Understanding temporal references ("last quarter," "year-over-year")
- Resolving ambiguity ("revenue" might mean `gross_revenue`, `net_revenue`, or `total_amount` depending on the schema)
- Recognizing aggregation intent ("top 10," "average," "total")

This step is where most errors originate. Natural language is inherently ambiguous, and the same question can map to different SQL queries depending on business context.

### SQL Generation

The LLM produces a SQL query based on the parsed intent and schema context. A well-constructed prompt might yield:

```sql
SELECT c.name, SUM(o.total_amount) AS revenue
FROM customers c
JOIN orders o ON c.id = o.customer_id
WHERE o.created_at >= DATE_TRUNC('quarter', CURRENT_DATE - INTERVAL '3 months')
  AND o.created_at < DATE_TRUNC('quarter', CURRENT_DATE)
GROUP BY c.name
ORDER BY revenue DESC
LIMIT 10
```

The generated SQL must be syntactically correct for the target database dialect (PostgreSQL, MySQL, DuckDB, etc.), use only columns and tables that actually exist, and correctly express the user's intent.

### Execution and Result Delivery

The generated SQL is executed against the database, and results are returned to the user. In production systems, this step includes validation (checking the SQL for syntax errors or disallowed operations before execution), sandboxing (running the query with restricted permissions), and result formatting (converting tabular results into a human-readable response).

## NSQL: Natural SQL as an Emerging Concept

NSQL (natural SQL) refers to an emerging approach where the boundary between natural language and SQL becomes fluid. Rather than treating text-to-SQL as a strict translation problem (natural language in, SQL out), NSQL systems allow users to express queries in a mix of natural language and SQL fragments.

For example, a user might write: "Show me all orders WHERE total > 1000 from last week." The system interprets the natural language portions ("from last week") and passes through the SQL fragments (`WHERE total > 1000`) directly.

NSQL is still an early concept, but it reflects a practical reality: power users often know parts of the SQL they want and prefer to specify those directly rather than relying entirely on LLM interpretation.

## Common Approaches to Text-to-SQL

### Prompt Engineering with General-Purpose LLMs

The most common approach uses a general-purpose LLM (GPT-4, Claude, Llama) with a carefully engineered prompt that includes the database schema, query examples, and instructions for SQL generation. This requires no model training and can be deployed immediately.

The prompt typically includes:

- The database schema (DDL statements or structured descriptions)
- A few examples of natural language to SQL mappings (few-shot learning)
- Instructions about the target SQL dialect
- Business-specific terminology mappings

This approach works well for straightforward queries but can struggle with complex joins, subqueries, and domain-specific logic.

### Fine-Tuned Models

Fine-tuning a base LLM on a dataset of (question, SQL) pairs from a specific database produces a model that is specialized for that schema. Fine-tuned models are typically more accurate for their target database than general-purpose models, but they require training data, compute resources, and retraining when the schema changes.

Open-source models like SQLCoder and NSQL-Llama have been fine-tuned specifically for text-to-SQL tasks and achieve competitive accuracy on benchmarks like Spider and BIRD.

### RAG over Schema Metadata

For databases with hundreds or thousands of tables, including the full schema in every prompt is impractical. Retrieval-augmented generation ([RAG](/learn/retrieval-augmented-generation)) addresses this by retrieving only the relevant schema elements at query time.

When a user asks a question, the system:

1. Embeds the question and searches a vector index of table and column descriptions
2. Retrieves the most relevant tables and their schemas
3. Constructs a prompt with only the relevant schema context
4. Generates SQL using the focused context

This approach scales to large databases and reduces hallucination by limiting the schema surface area the LLM must reason about.

## Challenges in Text-to-SQL

### Ambiguity in Natural Language

"Show me active users" could mean users who logged in today, users with active subscriptions, or users who have made a purchase in the last 30 days. Without explicit business definitions, the LLM must guess, and it often guesses wrong.

The most reliable mitigation is to include business glossaries or metric definitions in the prompt context: "active user = a user with at least one login event in the last 30 days."

### Complex Joins and Multi-Table Queries

Single-table queries are relatively straightforward. Performance degrades significantly for queries that require multiple joins, correlated subqueries, window functions, or CTEs (common table expressions). These queries demand that the LLM correctly trace foreign key relationships across several tables, a task that increases in difficulty with schema size.

### Hallucinated Column and Table Names

LLMs can generate SQL that references columns or tables that don't exist. This is particularly common when the schema context is incomplete or when column names are ambiguous. A model might generate `SELECT user_email FROM users` when the actual column is `email_address`.

Schema validation before execution catches these errors, but it doesn't fix them. More advanced systems re-prompt the LLM with the error message, allowing it to self-correct.

### SQL Dialect Differences

SQL is not a single language. PostgreSQL, MySQL, BigQuery, DuckDB, and SQL Server each have their own syntax for date functions, string operations, window functions, and type casting. A text-to-SQL system must generate queries in the correct dialect for the target database.

## Evaluating Text-to-SQL Systems

Two primary metrics are used to evaluate text-to-SQL accuracy:

**Execution accuracy** measures whether the generated SQL, when executed, produces the correct result set. This is the more practical metric: it doesn't matter if the SQL is different from the reference query as long as the results match.

**Exact match accuracy** measures whether the generated SQL exactly matches a reference query. This is stricter and less useful in practice, since many different SQL queries can produce the same results.

On the Spider benchmark (a widely used text-to-SQL evaluation dataset), state-of-the-art systems achieve 85-90% execution accuracy on simple queries but drop to 50-70% on complex queries involving multiple joins, nested subqueries, and aggregations.

## Production Patterns for Text-to-SQL

### SQL Validation and Sandboxing

Never execute LLM-generated SQL without validation. At minimum, production systems should:

- Parse the SQL and verify that all referenced tables and columns exist
- Check for disallowed operations (DROP, DELETE, UPDATE in read-only contexts)
- Execute the query with a read-only database user and strict resource limits (timeouts, row limits)
- Log every generated query for audit and debugging

### Result Verification

After execution, verify that the results are reasonable. Common checks include:

- Row count sanity checks (a query asking for "top 10" should return at most 10 rows)
- Type validation (a "revenue" column should contain numeric values)
- NULL handling (unexpected NULLs often indicate a wrong join)

### Multi-Turn Refinement

When the first query doesn't match the user's intent, a conversational interface allows the user to refine their question. The system can use the previous query, its results, and the user's feedback to generate an improved query. This iterative approach significantly improves practical accuracy.

## How to Build Text-to-SQL with Spice

Text-to-SQL becomes more powerful when combined with [SQL federation](/learn/sql-federation). In a federated environment, a single SQL query can access data from PostgreSQL, Databricks, S3, and dozens of other sources simultaneously. Text-to-SQL on top of federation means a user can ask a natural language question that spans multiple data systems, without knowing where the data lives or how to connect to each source.

Spice provides SQL federation, data acceleration, and [LLM inference](/platform/llm-inference) in a single runtime: everything needed for production text-to-SQL. Here's how to set it up.

### Step 1: Configure Data Sources and a Model

A `spicepod.yaml` defines the federated data sources and the LLM model that will generate SQL:

```yaml
version: v1
kind: Spicepod
name: text_to_sql

datasets:
  - from: postgres:public.customers
    name: customers
    params:
      pg_host: db.example.com
      pg_user: ${secrets:PG_USER}
      pg_pass: ${secrets:PG_PASS}
    acceleration:
      engine: arrow
      refresh_mode: changes
      refresh_check_interval: 1s

  - from: s3://data-lake/orders/
    name: orders
    params:
      file_format: parquet
    acceleration:
      engine: arrow
      refresh_mode: full
      refresh_check_interval: 10m

models:
  - name: text_to_sql
    from: openai:gpt-4o
    params:
      openai_api_key: ${secrets:OPENAI_API_KEY}
```

Spice automatically provides the model with the schema of all registered datasets: table names, column names, data types, and relationships. The model doesn't need a manually maintained schema description; it introspects the federated catalog directly.

### Step 2: Query with Natural Language via the NSQL Endpoint

Spice exposes a `/v1/nsql` endpoint that accepts natural language questions, translates them to SQL using the configured model, executes the query against the federated data sources, and returns the results:

```bash
curl -XPOST "http://localhost:8090/v1/nsql" \
  -H "Content-Type: application/json" \
  -d '{"query": "What were the top 10 customers by total order value last quarter?"}'
```

Behind the scenes, Spice:

1. Passes the question and the full federated schema to the configured LLM
2. The LLM generates a SQL query (e.g., `SELECT c.name, SUM(o.amount) ... FROM customers c JOIN orders o ...`)
3. Spice validates the SQL against the catalog (catching hallucinated column names)
4. Executes the query across PostgreSQL and S3 with predicate pushdown
5. Returns the result set as JSON

Because the LLM and the federation engine are co-located in the same runtime, the round-trip time from question to answer is minimized: no network hops between separate model-serving and data-access services.

### Step 3: Add Schema Context for Better Accuracy

For complex schemas, adding column descriptions and business glossary entries to the dataset configuration improves generation accuracy:

```yaml
datasets:
  - from: postgres:public.orders
    name: orders
    metadata:
      description: 'Customer orders with status tracking'
      columns:
        status: 'Order status enum: pending, shipped, delivered, cancelled'
        amount: 'Total order amount in USD including tax'
        customer_id: 'References customers.id'
```

This metadata is included in the prompt context sent to the LLM, reducing ambiguity and hallucination. For databases with hundreds of tables, Spice retrieves only the relevant tables based on the question, keeping the prompt focused.

### Why This Approach Works

The combination of federation, acceleration, and inference in a single runtime solves several production text-to-SQL challenges:

- **Schema awareness is automatic.** The model sees the real federated catalog, not a manually maintained schema document that drifts out of sync.
- **Queries span multiple sources.** "Compare CRM satisfaction scores with warehouse order volumes" becomes a federated query across two systems, triggered by a single natural language question.
- **Performance is production-grade.** Accelerated datasets return results in milliseconds, making text-to-SQL feel interactive rather than batch-oriented.
- **[Tool calling](/learn/llm-tool-calling) enables iteration.** Models served through Spice can invoke SQL execution as a tool via the [MCP gateway](/feature/mcp-server-gateway), creating agentic workflows where the model iteratively queries, inspects results, and refines its approach.

In regulated industries such as [financial services](/industry/financial-services), the same runtime enforces audit and access controls on every generated query, so analysts can ask natural language questions of sensitive data without bypassing governance.

## Advanced Topics

### Schema-Aware Prompting

The difference between a text-to-SQL system that works in demos and one that works in production often comes down to how schema context is structured in the LLM prompt. Naive approaches dump the full DDL (CREATE TABLE statements) into the prompt and hope the model figures out the relationships. Production systems are more deliberate.

Effective schema-aware prompting includes several layers of context beyond raw DDL:

- **Column descriptions:** Natural language annotations explaining what each column contains. `orders.status` might be an enum with values `pending`, `shipped`, `delivered`, `cancelled`; without this context, the LLM cannot correctly filter by status.
- **Foreign key annotations:** Explicit statements like "orders.customer_id references customers.id" guide the model toward correct joins. Without these, the model may join on column name similarity, which often produces wrong results.
- **Sample values:** Including 3-5 representative values for categorical columns (e.g., `region: ['us-east', 'us-west', 'eu-west', 'ap-southeast']`) helps the LLM generate correct filter predicates.
- **Business glossary entries:** Definitions like "active customer = a customer with at least one order in the last 90 days" resolve ambiguity before the model encounters it.

For large schemas, dynamic schema retrieval is essential. The system embeds the user's question, searches a vector index of table and column descriptions, and includes only the top-k most relevant tables in the prompt. This keeps the prompt focused and reduces hallucination of non-existent columns.

```mermaid
flowchart LR
    A[Natural Language Query] --> B[Schema Retrieval]
    B --> C[Prompt Assembly]
    C --> D[LLM Generates SQL]
    D --> E[SQL Validation]
    E -->|Valid| F[Query Execution]
    E -->|Invalid| G[Error Feedback to LLM]
    G --> D
    F --> H[Result Formatting]
```

### Query Validation Pipelines

LLM-generated SQL cannot be trusted without validation. A production validation pipeline applies multiple checks before execution:

**Syntactic validation** parses the SQL using the target dialect's parser. This catches malformed queries, unclosed parentheses, and invalid keywords before they reach the database. Parsing also produces an AST (abstract syntax tree) that subsequent checks can inspect.

**Schema validation** verifies that every table and column referenced in the query actually exists in the database catalog. This is the most effective defense against hallucinated column names, the most common failure mode in text-to-SQL systems. Schema validation also checks data types: if the query compares a string column to an integer, the validator flags the type mismatch.

**Policy validation** enforces security and governance rules. Common policies include: no DDL statements (DROP, ALTER, CREATE), no DML mutations (INSERT, UPDATE, DELETE) in read-only contexts, no queries against restricted tables or columns, and mandatory WHERE clauses on large tables to prevent full table scans. Policy validation inspects the AST to detect disallowed operations.

**Cost estimation** uses the database's EXPLAIN output to estimate query cost before execution. Queries that exceed a cost threshold (indicating a potential full table scan or cartesian join) are rejected or flagged for human review. This prevents runaway queries that could overload the database.

When validation fails, the most effective recovery strategy is to feed the error message back to the LLM and ask it to regenerate the query. Most validation errors (wrong column name, missing join condition) are easily correctable with one retry.

### Multi-Turn SQL Conversations

Single-turn text-to-SQL (one question, one query) covers the simplest use cases. Production systems increasingly support multi-turn conversations where users iteratively refine their queries.

In a multi-turn flow, the system maintains a conversation context that includes: the original question, the generated SQL, the query results, and any follow-up questions. When the user says "now filter that to just the US region" or "break that down by month," the system must modify the previous query rather than generating a new one from scratch.

The technical challenge is context window management. Each turn adds the previous SQL and results to the prompt, consuming token budget. Production systems manage this by summarizing previous turns (replacing full result sets with row counts and column summaries), maintaining a running SQL query that accumulates modifications, and capping conversation depth (typically 5-10 turns before resetting context).

Multi-turn conversations also enable a powerful debugging pattern: when a query returns unexpected results, the user can ask "why are there NULL values in the revenue column?" and the system can inspect the query, identify the likely cause (a LEFT JOIN that produced unmatched rows), and suggest a correction. This iterative refinement loop makes text-to-SQL practical for exploratory analysis where the user doesn't know the exact question upfront.

<ContentRichText
  fields={{
    coverage: 'rc-end',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<AccordionFaq
  fields={{
    heading: 'Text-to-SQL FAQ',
    paragraph: '',
    items: [
      {
        title: 'What is the difference between text-to-SQL and NSQL?',
        paragraph:
          '<p>Text-to-SQL treats the problem as a strict translation from natural language to SQL. NSQL (natural SQL) is an emerging concept that allows users to mix natural language and SQL fragments in a single query, giving power users more control over the generated output while still handling natural language interpretation for ambiguous parts.</p>',
      },
      {
        title: 'How accurate is text-to-SQL in practice?',
        paragraph:
          '<p>On standard benchmarks, state-of-the-art systems achieve 85-90% execution accuracy on simple queries (single table, basic filters and aggregations). Accuracy drops to 50-70% for complex queries involving multiple joins, subqueries, and window functions. In production, accuracy depends heavily on schema context quality, prompt engineering, and the complexity of the target database.</p>',
      },
      {
        title: 'What are the security risks of text-to-SQL?',
        paragraph:
          '<p>The primary risk is SQL injection: an LLM could generate destructive SQL (DROP TABLE, DELETE FROM) if not properly constrained. Production systems mitigate this by executing generated queries with read-only database credentials, parsing and validating SQL before execution, disallowing DDL and DML operations, and enforcing query timeouts and row limits.</p>',
      },
      {
        title: 'Can text-to-SQL handle complex multi-table queries?',
        paragraph:
          '<p>It can, but accuracy decreases with query complexity. Queries requiring multiple joins, correlated subqueries, CTEs, and window functions are significantly harder for LLMs to generate correctly. Providing complete foreign key relationships and example queries in the prompt context improves results. RAG-based schema retrieval also helps by surfacing the most relevant tables.</p>',
      },
      {
        title: 'Is text-to-SQL production-ready?',
        paragraph:
          '<p>Text-to-SQL is production-ready for specific, well-scoped use cases, particularly when paired with SQL validation, sandbox execution, result verification, and human-in-the-loop review for critical queries. It works best as an assistant that generates draft queries for review, rather than a fully autonomous system executing unchecked SQL against production databases.</p>',
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<ContentResourceFeatured
  fields={{
    heading: 'Learn more about text-to-SQL and data access',
    paragraph:
      'Guides, blog posts, and documentation on natural language querying and SQL federation.',
    mode: 'default',
    resources: [
      {
        source: 'manual',
        resource: null,
        resource_manual: {
          eyebrow: 'Docs',
          title: {
            title: 'Spice.ai OSS Documentation',
            url: 'https://spiceai.org/docs',
            target: '_blank',
          },
          description:
            'Learn how Spice combines SQL federation, LLM inference, and data acceleration to power natural language data access.',
          image: {
            ID: 1661,
            id: 1661,
            title: 'Docs jpeg',
            filename: 'Docs-jpeg.jpeg',
            filesize: 103192,
            url: '/website-assets/media/2025/12/Docs-jpeg.jpeg',
            link: '/docs-jpeg/',
            alt: '',
            author: '9',
            description: '',
            caption: '',
            name: 'docs-jpeg',
            status: 'inherit',
            uploaded_to: 0,
            date: '2025-12-05 04:13:53',
            modified: '2025-12-05 04:13:53',
            menu_order: 0,
            mime_type: 'image/jpeg',
            type: 'image',
            subtype: 'jpeg',
            icon: '/website-assets/media/default.png',
            width: 1832,
            height: 1036,
            sizes: {
              thumbnail: '/website-assets/media/2025/12/Docs-jpeg-150x150.jpeg',
              'thumbnail-width': 150,
              'thumbnail-height': 150,
              medium: '/website-assets/media/2025/12/Docs-jpeg-300x170.jpeg',
              'medium-width': 300,
              'medium-height': 170,
              medium_large:
                '/website-assets/media/2025/12/Docs-jpeg-768x434.jpeg',
              'medium_large-width': 768,
              'medium_large-height': 434,
              large: '/website-assets/media/2025/12/Docs-jpeg-1024x579.jpeg',
              'large-width': 1024,
              'large-height': 579,
              '1536x1536':
                '/website-assets/media/2025/12/Docs-jpeg-1536x869.jpeg',
              '1536x1536-width': 1536,
              '1536x1536-height': 869,
              '2048x2048': '/website-assets/media/2025/12/Docs-jpeg.jpeg',
              '2048x2048-width': 1832,
              '2048x2048-height': 1036,
            },
          },
        },
      },
      {
        source: 'picker',
        resource: [
          {
            title: "A Developer's Guide to Understanding Spice.ai",
            slug: '/blog/a-developers-guide-to-understanding-spice-ai',
            excerpt:
              'Learn what Spice.ai is, when to use it, and how it solves enterprise data challenges.',
            image:
              '/website-assets/media/2026/02/A-developers-guide-to-understanding-Spice.ai_.png',
            type: 'Blog',
            taxonomy: ['Spice AI'],
          },
        ],
        resource_manual: {
          eyebrow: '',
          title: null,
          description: '',
          image: false,
        },
      },
      {
        source: 'picker',
        resource: [
          {
            title:
              'Getting Started with Spice.ai SQL Query Federation & Acceleration',
            slug: '/blog/spice-sql-query-federation-acceleration',
            excerpt:
              'Learn how to use Spice.ai to federate and accelerate queries.',
            image:
              '/website-assets/media/2025/11/68ee96eb08a0dfcb609c1969_Version-7-1.png',
            type: 'Blog',
            taxonomy: ['Spice AI'],
          },
        ],
        resource_manual: {
          eyebrow: '',
          title: null,
          description: '',
          image: false,
        },
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<TalkToAnEngineerCta />

---

## What to Look for in a Unified Data and AI Platform
URL: https://spice.ai/learn/unified-data-and-ai-platform
Date: 2026-09-02T00:00:00
Description: Evaluation guide to unified data and AI platforms, covering query and inference in one engine, federation, acceleration, search, governance, and deployment.

<HeroCenteredText
  fields={{
    graphic_position: 'no-graphic',
    heading_tag: 'h1',
    heading: 'What to Look for in a Unified Data and AI Platform',
    paragraph:
      'Most platforms described as unified are several products behind one bill. This guide gives eight evaluation criteria that separate real unification from bundling, and explains how to test each one.',
    cta: [
      {
        type: 'filled',
        cta: {
          title: 'See SQL and LLM inference together',
          url: '/platform/llm-inference',
          target: '',
        },
      },
      {
        type: 'bordered',
        cta: {
          title: 'Read the AI SQL docs',
          url: 'https://spiceai.org/docs/reference/sql/ai',
          target: '_blank',
        },
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<ContentRichText
  fields={{
    coverage: 'rc-start',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

A unified data and AI platform runs query, search, and model inference through one execution path, over data it can reach without a migration project. The definition matters because most products that claim the label are a warehouse, a vector database, and an inference service sold together.

Bundling and unification produce different results under load. Bundled products still move data between components, so each boundary adds a copy, a format conversion, and a place where permissions can drift. A unified engine removes those boundaries.

This guide gives eight criteria for evaluating a platform, and a test for each one. The criteria are ordered by how often they decide the outcome of a proof of concept.

## 1. Query and Inference in One Execution Path

The core question is whether model inference runs inside the query engine or beside it.

When inference sits outside, an application queries for rows, ships them to an inference endpoint, waits, and joins the results back. That round trip costs latency, and it moves data out of the governed path. Every classification job becomes orchestration code.

When inference runs inside the engine, a model call is a function in a SQL statement. Classification, extraction, and summarization compose with joins and filters in one plan.

**How to test it:** Ask whether one SQL statement can filter rows, call a model, and aggregate the output. If application code must orchestrate a separate model call, the platform is bundled.

## 2. Reach Without Migration

A platform that requires your data before it becomes useful has moved the cost rather than removed it.

Evaluate whether the engine queries systems in place. [SQL federation](/learn/sql-federation) pushes filters and aggregations down to each source and merges the reduced results, so no preliminary load is required.

**How to test it:** Run the first useful query and check what it read. If it executed against source data that was never copied, the platform federates. If the data had to land somewhere first, the platform migrates, whatever the setup took.

## 3. Acceleration With Explicit Freshness

Federation alone puts read load on production systems. Serious platforms pair it with local acceleration, and the important detail is how they express freshness.

Look for a declared refresh policy rather than a cache with manual invalidation. [Data acceleration](/learn/data-acceleration) maintains a queryable replica on a stated interval, which turns freshness into a configuration value instead of application logic. [Cache invalidation at scale](/learn/cache-invalidation-at-scale) covers why the manual approach degrades.

**How to test it:** Ask what the maximum staleness of an accelerated dataset is, and whether the platform reports the current age of the data. A platform that cannot answer the second question cannot be audited on the first.

## 4. Search in the Same Engine as SQL

Retrieval workloads need keyword matching, vector similarity, and structured filters in one query. Platforms that treat search as a separate system force the application to merge results, which is where relevance quietly breaks.

[Hybrid search](/learn/hybrid-search) combines the two retrieval methods and fuses their rankings. When it runs in the query engine, a filter on tenant or date applies to both halves. When it runs across two systems, the filter usually applies to one.

**How to test it:** Write one query that filters by a structured column, matches keywords, and ranks by vector similarity. Count the systems involved.

## 5. Governance Below the Model

Authorization must sit under the execution path, not in prompts or application code. This matters more for agent workloads, where the query is generated at runtime. See [AI agent data access](/learn/ai-agent-data-access) for the wider pattern.

Check three things. Do credentials for sources stay out of the application? Does row and column policy apply to every access path, including search and inference? Are denied requests logged?

**How to test it:** Attempt a query that policy should refuse, through each interface the platform exposes. A gap in one interface is a gap in all of them.

## 6. Tenancy and Blast Radius

Ask what happens when one workload misbehaves. A shared runtime is cheaper and couples every tenant to the noisiest one. Per-tenant runtimes cost more to operate and keep failures local.

Neither answer is correct in general. The wrong outcome is a platform that offers only one and calls it a feature.

**How to test it:** Ask how the platform isolates a runaway query, and whether that isolation is per tenant, per workload, or global.

## 7. Deployment Fit

A platform tied to one cloud constrains architecture later. Evaluate whether the same engine runs as a managed service, in your own account, and beside an application as a sidecar.

The [sidecar pattern](/learn/sidecar-pattern) matters for latency-sensitive serving, because a local engine removes a network hop from every read.

**How to test it:** Ask whether the local development runtime and the production runtime are the same software. Different binaries mean different behavior in production.

## 8. Open Formats and Exit Cost

Unification should not require a proprietary storage format. Open table formats such as [Apache Iceberg](/learn/apache-iceberg) and [Delta Lake](/learn/delta-lake) keep data readable by other engines.

**How to test it:** Ask what reads your data if the platform is removed. If the answer is only the platform, the exit cost is the real price.

## Evaluation Summary

| Criterion | Bundled platform | Unified platform |
| --- | --- | --- |
| Inference | External service call | Function inside the query |
| Data reach | Load before use | Query in place |
| Freshness | Manual invalidation | Declared refresh policy |
| Search | Separate system | Same engine as SQL |
| Governance | Per interface, uneven | One policy below all paths |
| Tenancy | Single shared model | Shared or isolated by choice |
| Deployment | One environment | Managed, self-hosted, or sidecar |
| Storage format | Proprietary | Open table formats |

## Advanced Topics

### Measuring unification rather than trusting it

Count format conversions in a representative workload. Every conversion between a wire format, a storage format, and an in-memory format costs CPU and indicates a component boundary. A genuinely unified path converts once at the edge. [Apache Arrow](/learn/apache-arrow) as the in-memory format is a strong signal, because it lets components share buffers without copying.

Two other signals are easy to check. Look at how many network endpoints a single user request touches, because each hop is a component that was sold as part of one product. Then look at whether the query plan is visible end to end. A platform that can explain a plan covering retrieval and inference together is running them together. A platform that explains only the SQL portion is orchestrating the rest.

### Cost behavior under agent traffic

Bundled platforms usually price each component separately, so agent traffic multiplies across all of them. Model the cost of one agent task end to end, including the query, the retrieval, and the inference. Then multiply by expected task volume rather than by user count, because agents run many tasks per user.

Include the retry rate in that model. A task that succeeds on the second attempt costs twice, and retry rates of two or three times are ordinary in production agent systems. Cost models built on successful tasks understate the bill by the same factor.

### The semantic layer question

A unified engine still needs curation. Exposing 4,000 columns to a model produces worse SQL than exposing 40 curated views. Treat the semantic layer as part of the platform evaluation rather than as later documentation work.

Ask where the curation lives. A semantic layer defined inside the platform travels with it. One defined in application code has to be rebuilt if the platform changes, which quietly raises the exit cost that criterion 8 tries to measure.

### Failure modes at the seams

Boundaries between components fail in ways that are hard to attribute. When retrieval and inference run in separate systems, a slow response could be either, and the traces usually do not join. Before committing, run a deliberate failure test: make one component slow and check whether the platform reports which one. A unified engine can answer that question. A bundle often cannot.

## Unified Data and AI with Spice

[Spice](/platform/sql-federation-acceleration) runs query, search, and inference in one engine built on Apache DataFusion and Apache Arrow. Model calls are SQL functions through [LLM inference](/platform/llm-inference), so classification and extraction compose with joins in a single statement.

The same runtime federates across [40+ connectors](/integrations), accelerates the working set with declared refresh policies, and serves [hybrid SQL search](/platform/hybrid-sql-search) over the result. It deploys as a managed service, in your own account, or as a sidecar beside an application.

For budget planning, review [Spice Cloud pricing](/pricing).

<ContentRichText
  fields={{
    coverage: 'rc-end',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<AccordionFaq
  fields={{
    heading: 'Unified Data and AI Platform FAQ',
    heading_tag: 'h2',
    paragraph: '',
    items: [
      {
        title: 'What is a unified data and AI platform?',
        paragraph:
          '<p>A unified data and AI platform runs query, search, and model inference through one execution path over data it reaches without a migration. The test is whether a single SQL statement can filter rows and call a model on the result, with no external service call.</p>',
      },
      {
        title: 'How is a unified platform different from a bundled one?',
        paragraph:
          '<p>A bundle sells separate products under one contract. Data still moves between components, and each boundary adds a copy, a format conversion, and a place where permissions drift. A unified engine removes those boundaries rather than pricing them together.</p>',
      },
      {
        title: 'Does a unified platform remove the need for ETL?',
        paragraph:
          '<p>It removes ETL from the serving path, not from every path. Federation and acceleration cover fresh operational reads. Batch pipelines remain useful for long-horizon history and compliance archives, where freshness is not the constraint.</p>',
      },
      {
        title: 'Which criterion matters most for large enterprises?',
        paragraph:
          '<p>Governance and tenancy usually decide the outcome. Large organizations run many workloads with different trust levels, so policy must apply below every access path and one workload must not affect another. Performance rarely fails the evaluation; isolation often does.</p>',
      },
      {
        title: 'How do you test whether inference is really in the engine?',
        paragraph:
          '<p>Write one SQL statement that filters rows, calls a model on the survivors, and aggregates the model output. If the platform needs an external endpoint or orchestration code to run it, inference sits beside the engine rather than inside it.</p>',
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<ContentResourceFeatured
  fields={{
    heading: 'Learn more about unified data and AI',
    heading_tag: 'h2',
    paragraph:
      'Documentation and technical resources for running query, search, and inference in one engine.',
    mode: 'default',
    resources: [
      {
        source: 'manual',
        resource: null,
        resource_manual: {
          eyebrow: 'Docs',
          title: {
            title: 'AI SQL Function Docs',
            url: 'https://spiceai.org/docs/reference/sql/ai',
            target: '_blank',
          },
          description:
            'Learn how to call models directly from SQL so inference composes with joins and filters.',
          image: {
            ID: 1661,
            id: 1661,
            title: 'Docs jpeg',
            filename: 'Docs-jpeg.jpeg',
            filesize: 103192,
            url: '/website-assets/media/2025/12/Docs-jpeg.jpeg',
            link: '/docs-jpeg/',
            alt: '',
            author: '9',
            description: '',
            caption: '',
            name: 'docs-jpeg',
            status: 'inherit',
            uploaded_to: 0,
            date: '2025-12-05 04:13:53',
            modified: '2025-12-05 04:13:53',
            menu_order: 0,
            mime_type: 'image/jpeg',
            type: 'image',
            subtype: 'jpeg',
            icon: '/website-assets/media/default.png',
            width: 1832,
            height: 1036,
            sizes: {
              thumbnail: '/website-assets/media/2025/12/Docs-jpeg-150x150.jpeg',
              'thumbnail-width': 150,
              'thumbnail-height': 150,
              medium: '/website-assets/media/2025/12/Docs-jpeg-300x170.jpeg',
              'medium-width': 300,
              'medium-height': 170,
              medium_large:
                '/website-assets/media/2025/12/Docs-jpeg-768x434.jpeg',
              'medium_large-width': 768,
              'medium_large-height': 434,
              large: '/website-assets/media/2025/12/Docs-jpeg-1024x579.jpeg',
              'large-width': 1024,
              'large-height': 579,
              '1536x1536':
                '/website-assets/media/2025/12/Docs-jpeg-1536x869.jpeg',
              '1536x1536-width': 1536,
              '1536x1536-height': 869,
              '2048x2048': '/website-assets/media/2025/12/Docs-jpeg.jpeg',
              '2048x2048-width': 1832,
              '2048x2048-height': 1036,
            },
          },
        },
      },
      {
        source: 'picker',
        resource: [
          {
            title: 'A Developer\u2019s Guide to Understanding Spice.ai',
            slug: '/blog/a-developers-guide-to-understanding-spice-ai',
            excerpt:
              'What Spice is, what it is not, and where a unified query, search, and inference engine fits in a data stack.',
            image: '/website-assets/media/default.png',
            type: 'Blog',
            taxonomy: ['Spice AI'],
          },
        ],
        resource_manual: {
          eyebrow: '',
          title: null,
          description: '',
          image: false,
        },
      },
      {
        source: 'picker',
        resource: [
          {
            title: 'Spice 2.0 Is Now Available',
            slug: '/blog/spice-2-0-is-now-available',
            excerpt:
              'Distributed query, expanded catalog connectors, and the engine changes behind unified data and AI workloads.',
            image: '/website-assets/media/default.png',
            type: 'Blog',
            taxonomy: ['Spice AI'],
          },
        ],
        resource_manual: {
          eyebrow: '',
          title: null,
          description: '',
          image: false,
        },
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<ContentCta
  fields={{
    override_global_setting: false,
    custom_content: { heading: '', paragraph: '', cta: null },
    padding_top: 'unset',
    padding_bottom: 'unset',
    gcta_heading: 'See Spice in action',
    gcta_paragraph:
      'Get a guided walkthrough of how development teams use Spice to query, accelerate, and integrate AI for mission-critical workloads.',
    gcta_cta: {
      title: 'Get a demo',
      url: 'https://meetings.hubspot.com/lukekim/talk-to-sales',
      target: '_blank',
    },
  }}
/>

---

## What is Vector Search?
URL: https://spice.ai/learn/vector-search
Date: 2026-03-08T00:00:00
Description: Vector search (semantic search) finds the most similar items by comparing vector embeddings using distance metrics like cosine similarity. Learn how ANN algorithms like HNSW work, vector index tradeoffs, and when to use vector search vs. keyword search.

<HeroCenteredText
  fields={{
    graphic_position: 'no-graphic',
    heading_tag: 'h1',
    heading: 'What is Vector Search?',
    paragraph:
      'Vector search finds the most similar items by comparing vector embeddings in high-dimensional space, enabling search by meaning rather than keywords.',
    cta: [
      {
        type: 'filled',
        cta: {
          title: 'See Spice hybrid search',
          url: '/platform/hybrid-sql-search',
          target: '',
        },
      },
      {
        type: 'bordered',
        cta: {
          title: 'Read the docs',
          url: 'https://spiceai.org/docs/features/search',
          target: '',
        },
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<ContentRichText
  fields={{
    coverage: 'rc-start',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

Traditional search systems match keywords. Vector search matches meaning. When a user searches for "how to fix a slow API," vector search can find documents about "improving endpoint latency" or "API performance optimization," even though these phrases share no words with the query. This capability has made vector search a foundational technology for AI applications, from semantic search to [retrieval-augmented generation (RAG)](/learn/retrieval-augmented-generation).

Vector search works by converting text (or images, code, or any data) into numerical vectors called [embeddings](/learn/embeddings), then finding the vectors in a database that are closest to the query vector. The "closeness" is measured by a distance metric, and specialized index structures make this lookup fast even across millions or billions of vectors.

## How Vector Search Works

The vector search pipeline has two phases: indexing and querying.

### Indexing

At index time, every document (or document chunk) is passed through an embedding model to produce a dense vector: a list of floating-point numbers, typically 384 to 3072 dimensions. These vectors are stored in a vector index alongside metadata (document ID, text, source, timestamps).

### Querying

At query time:

1. The search query is passed through the same embedding model to produce a query vector
2. The vector index finds the **k nearest neighbors**: the k stored vectors closest to the query vector
3. The corresponding documents are returned, ranked by similarity

```mermaid
flowchart LR
    A[Query] --> B[Embed]
    B --> C[ANN Index Lookup]
    C --> D[Top-k Nearest Vectors]
    D --> E[Results]
```

The critical property is that vectors for semantically similar content are close together in the embedding space. "Cancel my subscription" and "terminate my account" produce nearby vectors because the embedding model learned that these phrases have similar meanings.

## Distance Metrics

The choice of distance metric determines how "closeness" between vectors is measured:

### Cosine Similarity

Measures the angle between two vectors, ignoring their magnitudes. Two vectors pointing in the same direction have a cosine similarity of 1, orthogonal vectors have 0, and opposing vectors have -1. This is the most common metric because it handles vectors of different magnitudes gracefully.

```
cosine_similarity(A, B) = (A . B) / (||A|| * ||B||)
```

### Dot Product

Computes the sum of element-wise products. Unlike cosine similarity, the dot product is affected by vector magnitude: longer vectors produce larger dot products. This is useful when magnitude carries information (e.g., a document's relevance or importance). Many embedding models produce normalized vectors, in which case dot product and cosine similarity are equivalent.

```
dot_product(A, B) = sum(A[i] * B[i])
```

### Euclidean Distance (L2)

Measures the straight-line distance between two points in vector space. Smaller distances indicate greater similarity. Euclidean distance is sensitive to vector magnitude and works best when vectors are normalized to unit length.

```
euclidean_distance(A, B) = sqrt(sum((A[i] - B[i])^2))
```

In practice, cosine similarity is the default choice for text [embeddings](/learn/embeddings). If your embedding model produces normalized vectors (most modern models do), all three metrics produce equivalent rankings.

## Approximate Nearest Neighbor (ANN) Algorithms

Exact nearest neighbor search requires comparing the query vector against every stored vector, an O(n) operation that becomes prohibitively slow at scale. **Approximate nearest neighbor (ANN)** algorithms trade a small amount of recall accuracy for dramatic speed improvements, making it possible to search millions of vectors in milliseconds.

### HNSW (Hierarchical Navigable Small World)

HNSW is the most widely used ANN algorithm. It builds a multi-layer graph where:

- The bottom layer contains all vectors, connected to their nearest neighbors
- Higher layers contain progressively fewer vectors (a random subset), forming "express lanes"
- Search starts at the top layer and navigates greedily toward the query vector, dropping to lower layers as it gets closer

This hierarchical structure enables O(log n) search complexity. HNSW provides excellent recall (typically 95-99%) with sub-millisecond query times on datasets of millions of vectors.

### IVF (Inverted File Index)

IVF partitions the vector space into clusters using k-means clustering. At query time, only the vectors in the nearest clusters are searched, reducing the search space dramatically.

1. **Index time:** Cluster all vectors into **nlist** partitions using k-means
2. **Query time:** Find the **nprobe** nearest cluster centroids, then search only the vectors within those clusters

IVF is faster to build than HNSW and uses less memory, but typically achieves lower recall at the same query speed. It works well when combined with other techniques like product quantization.

### Product Quantization (PQ)

Product quantization compresses vectors to reduce memory usage. It divides each vector into sub-vectors, quantizes each sub-vector to the nearest centroid in a learned codebook, and stores only the centroid IDs. This reduces memory by 10-100x at the cost of some accuracy.

PQ is often combined with IVF (IVF-PQ) or HNSW (HNSW-PQ) to enable vector search on datasets too large to fit in memory at full precision.

## Vector Index Tradeoffs

Choosing and configuring a vector index involves balancing three factors:

| Factor       | HNSW                        | IVF                                 | IVF-PQ                        |
| ------------ | --------------------------- | ----------------------------------- | ----------------------------- |
| Recall       | High (95-99%)               | Moderate (85-95%)                   | Lower (80-90%)                |
| Query speed  | Fast (sub-ms)               | Fast (sub-ms)                       | Fast (sub-ms)                 |
| Memory usage | High (full vectors + graph) | Moderate (full vectors + centroids) | Low (compressed vectors)      |
| Build time   | Slow (graph construction)   | Moderate (k-means)                  | Moderate (k-means + codebook) |
| Update cost  | Low (incremental insert)    | High (re-clustering needed)         | High (re-clustering needed)   |

For most applications with fewer than 10 million vectors, HNSW is the default choice: it provides the best recall with acceptable memory usage. For larger datasets or memory-constrained environments, IVF-PQ provides a good balance.

## Vector Search vs. Keyword Search

Vector search and [BM25 full-text search](/learn/bm25-full-text-search) have complementary strengths:

| Aspect                                             | Vector Search                          | Keyword Search (BM25)      |
| -------------------------------------------------- | -------------------------------------- | -------------------------- |
| Matches                                            | Semantic meaning                       | Exact terms                |
| "fix slow API" vs. "endpoint latency optimization" | Match                                  | No match                   |
| Error code "ERR-4502"                              | Weak (may match generic error content) | Exact match                |
| Vocabulary mismatch handling                       | Strong                                 | None                       |
| Interpretability                                   | Low (opaque similarity scores)         | High (which terms matched) |
| Index type                                         | Vector index (HNSW, IVF)               | Inverted index             |
| Index storage                                      | Dense vectors (KB per document)        | Posting lists (smaller)    |

Neither method is strictly superior. Vector search excels at understanding intent and handling vocabulary mismatch. Keyword search excels at matching exact terms, identifiers, and technical terminology. In practice, [hybrid search](/learn/hybrid-search) (running both methods and fusing results with algorithms like Reciprocal Rank Fusion) delivers the best results for most production use cases.

## Vector Databases vs. Vector Search in SQL Engines

Teams implementing vector search have two architectural choices:

**Dedicated vector databases** (Pinecone, Weaviate, Qdrant, Milvus) are purpose-built for vector storage and search. They provide optimized ANN algorithms, built-in metadata filtering, and managed scaling. The tradeoff is another system to deploy, another data pipeline to maintain, and no native SQL support for joining vector results with relational data.

**Vector search in SQL engines** embeds vector indexing within a SQL-compatible query engine. This approach allows vector similarity search alongside standard SQL queries (filtering, joining, aggregating) in a single system. The tradeoff is that general-purpose SQL engines may not match the raw vector search performance of dedicated systems, though for most workloads the difference is negligible.

For [RAG applications](/learn/retrieval-augmented-generation) and [enterprise AI use cases](/use-case/secure-ai-agents), the ability to combine vector search with SQL is a significant advantage. Filtering search results by metadata (date ranges, access permissions, document categories), joining with relational data, and expressing complex retrieval logic in SQL eliminates the application-layer glue code required when vector search and SQL live in separate systems.

## Vector Search with Spice

[Spice](/platform/hybrid-sql-search) provides vector similarity search alongside [BM25 full-text search](/learn/bm25-full-text-search) and SQL in a single unified runtime. This enables [hybrid search](/learn/hybrid-search) (combining vector and keyword results with built-in RRF fusion) without managing separate systems.

Key capabilities:

- **Vector, full-text, and SQL search** in one query engine: store [embeddings](/learn/embeddings), build vector indexes, and search alongside your relational data
- **[SQL federation](/learn/sql-federation)** across [40+ connected data sources](/integrations), with vector search results joinable with federated data
- **[Real-time CDC](/learn/change-data-capture)** to keep vector indexes fresh as source data changes
- **[LLM inference](/learn/llm-inference)** for generating embeddings alongside search queries in the same runtime

```sql
-- Vector similarity search in Spice
SELECT * FROM search(
  'knowledge_base',
  'how to optimize query performance',
  mode => 'vector',
  limit => 10
)
```

The unified approach eliminates the operational complexity of maintaining separate vector databases and keeping them synchronized with your primary data stores. When source data changes, both vector and keyword indexes update through the same [change data capture](/learn/change-data-capture) pipeline, ensuring consistent search results across all modalities.

## Advanced Topics

### HNSW Internals

HNSW (Hierarchical Navigable Small World) constructs a proximity graph with a hierarchical structure inspired by skip lists. Understanding its internals helps with tuning:

**Graph construction:** When inserting a new vector, HNSW assigns it a random maximum layer (drawn from an exponential distribution). The vector is then connected to its nearest neighbors at each layer from the top down. The greedy search used during insertion finds these neighbors efficiently.

**Key parameters:**

- **M:** The number of bi-directional links per node at each layer. Higher M increases recall and memory usage. Typical values are 16-64.
- **ef_construction:** The size of the dynamic candidate list during index construction. Higher values produce a better graph (higher recall) at the cost of slower build times. Typical values are 100-400.
- **ef_search:** The size of the dynamic candidate list during search. Higher values increase recall at the cost of query latency. This is the primary parameter for tuning the recall-speed tradeoff at query time.

The relationship between these parameters is: ef_construction determines the quality ceiling of the graph, M determines the memory footprint, and ef_search controls the runtime tradeoff between recall and speed.

### Filtered Vector Search

In practice, vector search rarely operates in isolation: users want to filter results by metadata (date ranges, categories, access permissions) alongside semantic similarity. Filtered vector search combines vector nearest-neighbor queries with predicate-based filtering.

There are three approaches:

1. **Pre-filtering:** Apply metadata filters first, then search only the matching vectors. This is precise but can be slow if the filter is very selective (few matching vectors).
2. **Post-filtering:** Run vector search first, then filter results by metadata. This is fast but may return fewer than k results if many top candidates are filtered out.
3. **Integrated filtering:** Apply filters during the ANN search traversal. This is the most sophisticated approach, supported by modern vector indexes, and balances speed with precision.

The choice depends on filter selectivity. Highly selective filters (matching < 1% of documents) favor pre-filtering. Broad filters (matching > 50%) favor post-filtering or integrated filtering.

### Multi-Vector Retrieval (ColBERT)

Standard vector search represents each document as a single embedding vector. **ColBERT** (Contextualized Late Interaction over BERT) takes a different approach: it represents each document as a set of token-level vectors (one per token) and computes similarity using late interaction.

At query time, each query token's vector is compared against all document token vectors using a MaxSim operation: for each query token, find its maximum similarity to any document token, then sum these maximums. This token-level matching is more expressive than single-vector comparison because it can capture fine-grained relevance signals.

ColBERT achieves higher retrieval quality than single-vector models, especially on queries requiring precise term-level matching. The tradeoff is significantly higher storage requirements (one vector per token instead of one per document) and more complex index structures. Recent work on compressed ColBERT representations (ColBERTv2) reduces storage costs while maintaining most of the quality advantage.

<ContentRichText
  fields={{
    coverage: 'rc-end',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<AccordionFaq
  fields={{
    heading: 'Vector Search FAQ',
    paragraph: '',
    items: [
      {
        title:
          'What is the difference between vector search and semantic search?',
        paragraph:
          '<p>They are often used interchangeably. Semantic search is the broader concept of searching by meaning rather than keywords. Vector search is the specific technique that powers semantic search: encoding content as vectors and finding nearest neighbors. In practice, saying "vector search" implies the same capability as "semantic search."</p>',
      },
      {
        title: 'How much memory does a vector index require?',
        paragraph:
          '<p>Memory depends on the number of vectors, their dimensions, and the index type. A rough formula for HNSW: memory (bytes) = num_vectors * (dimensions * 4 + M * 8 + overhead). For example, 1 million 768-dimensional vectors with M=16 requires approximately 3.2 GB of memory. Product quantization can reduce this by 10-100x at the cost of some recall accuracy.</p>',
      },
      {
        title: 'What recall rate should I target for production?',
        paragraph:
          '<p>For most applications, 95% recall or higher is a good target. This means 95% of the true nearest neighbors are returned by the approximate search. For RAG applications where retrieval quality directly determines answer quality, aim for 98-99% recall. You can increase recall by tuning ef_search (HNSW) or nprobe (IVF) at the cost of slightly higher query latency.</p>',
      },
      {
        title: 'Can I update vectors in place without rebuilding the index?',
        paragraph:
          '<p>It depends on the index type. HNSW supports incremental inserts and deletes without rebuilding: new vectors are connected into the existing graph. IVF-based indexes may require periodic re-clustering as the data distribution changes. In practice, most production systems use HNSW for workloads that require frequent updates.</p>',
      },
      {
        title: 'When should I use vector search vs. hybrid search?',
        paragraph:
          '<p>Use pure vector search when queries are primarily conceptual and vocabulary mismatch is the dominant challenge (e.g., natural language questions against a knowledge base). Use hybrid search when queries may include exact identifiers, technical terms, or product names that must be matched precisely. In most production systems, hybrid search outperforms pure vector search because it captures both semantic and lexical signals.</p>',
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<ContentResourceFeatured
  fields={{
    heading: 'Learn more about vector search',
    paragraph:
      'Technical guides on building vector and hybrid search with embeddings, full-text, and SQL in a single runtime.',
    mode: 'default',
    resources: [
      {
        source: 'manual',
        resource: null,
        resource_manual: {
          eyebrow: 'Docs',
          title: {
            title: 'Search Docs',
            url: 'https://spiceai.org/docs/features/search',
            target: '_blank',
          },
          description:
            'Learn how Spice provides vector similarity, full-text, and hybrid search capabilities in a single SQL-native runtime.',
          image: {
            ID: 1661,
            id: 1661,
            title: 'Docs jpeg',
            filename: 'Docs-jpeg.jpeg',
            filesize: 103192,
            url: '/website-assets/media/2025/12/Docs-jpeg.jpeg',
            link: '/docs-jpeg/',
            alt: '',
            author: '9',
            description: '',
            caption: '',
            name: 'docs-jpeg',
            status: 'inherit',
            uploaded_to: 0,
            date: '2025-12-05 04:13:53',
            modified: '2025-12-05 04:13:53',
            menu_order: 0,
            mime_type: 'image/jpeg',
            type: 'image',
            subtype: 'jpeg',
            icon: '/website-assets/media/default.png',
            width: 1832,
            height: 1036,
            sizes: {
              thumbnail: '/website-assets/media/2025/12/Docs-jpeg-150x150.jpeg',
              'thumbnail-width': 150,
              'thumbnail-height': 150,
              medium: '/website-assets/media/2025/12/Docs-jpeg-300x170.jpeg',
              'medium-width': 300,
              'medium-height': 170,
              medium_large:
                '/website-assets/media/2025/12/Docs-jpeg-768x434.jpeg',
              'medium_large-width': 768,
              'medium_large-height': 434,
              large: '/website-assets/media/2025/12/Docs-jpeg-1024x579.jpeg',
              'large-width': 1024,
              'large-height': 579,
              '1536x1536':
                '/website-assets/media/2025/12/Docs-jpeg-1536x869.jpeg',
              '1536x1536-width': 1536,
              '1536x1536-height': 869,
              '2048x2048': '/website-assets/media/2025/12/Docs-jpeg.jpeg',
              '2048x2048-width': 1832,
              '2048x2048-height': 1036,
            },
          },
        },
      },
      {
        source: 'picker',
        resource: [
          {
            title:
              'True Hybrid Search: Vector, Full-Text, and SQL in One Runtime',
            slug: '/blog/true-hybrid-search',
            excerpt:
              'Build hybrid search without managing multiple systems. Query vectors, run full-text search, and execute SQL in one unified runtime.',
            image: '/website-assets/media/2025/09/image-33.png',
            type: 'Blog',
            taxonomy: ['Spice AI'],
          },
        ],
        resource_manual: {
          eyebrow: '',
          title: null,
          description: '',
          image: false,
        },
      },
      {
        source: 'picker',
        resource: [
          {
            title:
              'Real-Time Hybrid Search Using RRF: A Hands-On Guide with Spice',
            slug: '/blog/real-time-hybrid-search-using-rrf',
            excerpt:
              'Learn how to build hybrid search with RRF directly in SQL using Spice, combining text, vector, and time-based relevance in one query.',
            image:
              '/website-assets/media/2025/11/68fa4fdfded26b3b6472a172_image-8.png',
            type: 'Blog',
            taxonomy: ['Search', 'Spice AI'],
          },
        ],
        resource_manual: {
          eyebrow: '',
          title: null,
          description: '',
          image: false,
        },
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<TalkToAnEngineerCta />

---

## What is Vortex?
URL: https://spice.ai/learn/vortex
Date: 2026-02-11T00:00:00
Description: Vortex is an open-source compressed columnar file format designed for analytical queries. Learn how Vortex compares to Parquet, its adaptive encoding system, and when to use it over Parquet for analytical workloads.

<HeroCenteredText
  fields={{
    graphic_position: 'no-graphic',
    heading_tag: 'h1',
    heading: 'What is Vortex?',
    paragraph:
      'Vortex is an open-source compressed columnar file format designed for analytical queries. It is a Linux Foundation project licensed under Apache 2.0, and uses adaptive encoding to deliver faster scans and better compression than traditional columnar formats.',
    cta: [
      {
        type: 'filled',
        cta: {
          title: 'See Spice acceleration',
          url: '/platform/sql-federation-acceleration',
          target: '',
        },
      },
      {
        type: 'bordered',
        cta: {
          title: 'Read the docs',
          url: 'https://spiceai.org/docs',
          target: '',
        },
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<ContentRichText
  fields={{
    coverage: 'rc-start',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

Analytical workloads (dashboards, AI pipelines, federated queries) depend on fast, efficient reads over large columnar datasets. Apache Parquet has been the standard columnar file format for over a decade, but its design predates many of the techniques that modern hardware and query engines can exploit: memory-mapped I/O, zero-copy reads, and adaptive per-column encoding.

Vortex is a new open-source columnar file format built from scratch to take advantage of these capabilities. It is a Linux Foundation project licensed under Apache 2.0, and is designed specifically for the demands of analytical query engines that need to scan, filter, and aggregate data as fast as possible.

## How Vortex Works

At its core, Vortex stores data in a columnar layout: each column is stored independently, so a query that only needs three columns out of fifty reads only those three. This is the same fundamental principle behind Parquet, ORC, and other columnar formats. Where Vortex diverges is in how it encodes and compresses the data within each column.

### Adaptive Encoding

Traditional columnar formats apply a single encoding scheme per column (or per row group). Parquet, for example, uses dictionary encoding for low-cardinality columns and falls back to plain encoding otherwise. The encoding is chosen at write time and remains fixed.

Vortex takes a different approach: it uses a cascading encoding system that adapts to the actual data distribution within each column segment. Rather than selecting a single encoding, Vortex can layer multiple encodings on top of each other:

- **Dictionary encoding** for columns with repeated values
- **Run-length encoding (RLE)** for columns with consecutive repeated values
- **Frame-of-reference (FOR)** encoding for columns with values clustered around a base
- **Bit-packing** for integer columns that don't use the full bit width
- **Delta encoding** for monotonically increasing sequences like timestamps
- **Constant encoding** for segments where every value is the same

The encoding selection happens per column segment, not per column. A single column can use different encodings for different portions of the data, depending on the local distribution. This means Vortex consistently achieves better compression ratios than formats that apply a single encoding globally.

### Zero-Copy Reads and Memory Mapping

Vortex is designed for zero-copy reads from memory-mapped files. When a query engine accesses a Vortex file, it can memory-map the file and read encoded data directly without first decompressing the entire column into a separate buffer. The encodings are designed so that common operations (scanning, filtering, aggregation) can operate directly on the encoded representation.

This is a significant architectural difference from Parquet, where data must be fully decompressed and decoded before a query engine can process it. With Vortex, decompression is lazy: only the data actually needed by the query is decoded, and only at the point of use.

### Random Access Without Full Decompression

Parquet supports predicate pushdown through row group statistics (min/max values), but once a row group is selected, the entire column chunk must be decompressed to access individual values. Vortex supports fine-grained random access within encoded segments. A query that needs a single value from a column can locate and decode just that value without decompressing the surrounding data.

This property is particularly valuable for point lookups, late materialization, and any query pattern where only a small fraction of the data in a column is actually needed.

## Vortex vs. Apache Parquet

Both Vortex and Parquet are columnar file formats, and they share the same goal: efficient storage and retrieval of analytical data. The differences are in execution.

**Encoding flexibility:** Parquet uses a fixed set of encodings chosen at write time. Vortex uses adaptive, cascading encodings that vary per column segment based on data distribution. This gives Vortex consistently better compression ratios across diverse data types.

**Decompression model:** Parquet requires full decompression of column chunks before processing. Vortex supports lazy decompression and can operate on encoded data directly, reducing memory usage and improving scan performance.

**Random access:** Parquet's smallest addressable unit is a column chunk within a row group. Vortex supports finer-grained access within encoded segments, enabling efficient point lookups and late materialization.

**Memory mapping:** Vortex is designed for zero-copy reads from memory-mapped files. Parquet was not designed with memory mapping as a primary access pattern, though some implementations (like DuckDB's Parquet reader) add this capability at the reader level.

**Ecosystem maturity:** Parquet has broad ecosystem support: virtually every data tool can read and write Parquet. Vortex is a newer format, and adoption is growing across downstream projects, including [Spice Cayenne](/blog/introducing-spice-cayenne-data-accelerator), [LangChain's SmithDB](https://www.langchain.com/blog/introducing-smithdb), and [PolarSignals](https://www.polarsignals.com/blog/posts/2025/11/25/interface-parquet-vortex). For interchange between systems, Parquet remains the standard. For performance-critical acceleration workloads, Vortex offers measurable advantages.

## Vortex vs. Other Columnar Formats

### Vortex vs. Lance

Lance is a columnar format designed for machine learning workloads, with a focus on versioned datasets and fast vector search. Vortex is designed for general analytical query performance with an emphasis on scan speed and compression efficiency. Lance optimizes for ML-specific access patterns (random row access, version management); Vortex optimizes for the scan-filter-aggregate patterns common in SQL analytics.

### Vortex vs. Apache ORC

ORC (Optimized Row Columnar) is the Hive ecosystem's columnar format. Like Parquet, ORC uses fixed encodings chosen at write time. Vortex's adaptive encoding system and lazy decompression give it performance advantages for scan-heavy workloads. ORC is tightly integrated with the Hadoop ecosystem; Vortex is designed for modern, Rust-native query engines.

### Vortex vs. Apache Arrow IPC

Arrow IPC is an in-memory serialization format for Apache Arrow arrays. It is designed for zero-copy data exchange between processes, not for persistent storage with compression. Vortex is a storage format that achieves high compression while preserving the ability to operate on encoded data. They serve different purposes: Arrow IPC for inter-process communication, Vortex for on-disk analytical storage.

## Performance Characteristics

Vortex's design yields several measurable performance benefits:

- **Faster scan times:** Lazy decompression means the query engine avoids decoding data that is filtered out early. For selective queries (those that touch a small fraction of rows), this translates to significantly faster scans compared to formats that require full decompression.
- **Better compression ratios:** Adaptive encoding that varies per column segment consistently achieves smaller file sizes than fixed-encoding formats on the same data. Smaller files mean less I/O, which compounds the scan speed improvement.
- **Lower memory usage:** Zero-copy reads from memory-mapped files eliminate the need to allocate separate buffers for decompressed data. The working memory footprint of a Vortex-backed query is proportional to the data actually accessed, not the total column size.
- **Efficient point lookups:** Random access within encoded segments enables efficient lookups without scanning or decompressing surrounding data.

These characteristics are most impactful in acceleration workloads: scenarios where data is cached locally for fast, repeated access by [SQL federation](/learn/sql-federation) queries, dashboards, or AI pipelines.

## How Vortex Is Adopted

Vortex is an open-source project under the Linux Foundation. It is a library rather than a service, so it reaches users through the systems that embed it. Three integration patterns are available today.

**Embedded as a storage format in a query engine.** Vortex exposes a table provider interface, so an engine can read Vortex files and push filters and projections into the storage layer. Spice uses this pattern in the Cayenne accelerator, described in the next section.

**Consumed through Apache Arrow.** Vortex interoperates with Arrow and supports zero-copy conversion when their memory layouts match. Other encodings require decoding into Arrow buffers. This lets Arrow-based tooling consume Vortex data without a separate interchange format.

**Used directly as an on-disk format.** Teams that maintain their own caching or acceleration tier can adopt the library directly, without an engine in between.

Vortex is younger than Parquet and its ecosystem is correspondingly smaller. Parquet remains the interchange format that every engine reads. Vortex is chosen where scan speed and random access matter more than universal compatibility. For current adopters, check the project repository rather than relying on a list that ages.

## How Spice Uses Vortex

Spice uses Vortex as the storage format for its Cayenne [data lake accelerator](/use-case/datalake-accelerator). When data is accelerated in Spice (cached locally from remote sources like PostgreSQL, Databricks, or Amazon S3), it is stored in Vortex format on disk or in memory.

This means that [federated queries](/learn/sql-federation) that hit the acceleration layer benefit from Vortex's lazy decompression, adaptive encoding, and zero-copy reads. The result is sub-second query performance over locally cached data, even for datasets that would be too large to hold fully decompressed in memory.

The acceleration layer is kept synchronized with source systems using [change data capture](/learn/change-data-capture), so the Vortex-encoded local cache always reflects the current state of the source data.

### Cayenne and Vortex

Cayenne is Spice's next-generation data accelerator, purpose-built for the high-scale analytical workloads at the center of Spice's [SQL federation and acceleration engine](/platform/sql-federation-acceleration). It uses Vortex as its underlying storage format and adds:

- **Incremental updates:** When source data changes, only the affected segments are re-encoded. The entire dataset does not need to be rewritten.
- **Tiered storage:** Hot data is memory-mapped for zero-copy access. Warm data is stored on local disk. The tiering is transparent to the query engine.
- **Integration with [Apache DataFusion](/learn/apache-datafusion):** Cayenne exposes Vortex-encoded data as DataFusion table providers, so the query engine can push filters and projections directly into the storage layer.

## When to Use Vortex

Vortex is the right choice when:

- **Query performance is the priority:** If you need the fastest possible scan, filter, and aggregate performance over columnar data, Vortex's adaptive encoding and lazy decompression provide measurable improvements over Parquet.
- **Data is cached locally for acceleration:** Vortex is designed for the acceleration use case, caching remote data locally for fast repeated access.
- **Memory efficiency matters:** Zero-copy reads and lazy decompression reduce the memory footprint of analytical workloads.

Parquet remains the better choice for data interchange between systems, archival storage in data lakes, and any scenario where broad ecosystem compatibility is more important than raw scan performance.

## Advanced Topics

### Encoding Selection Algorithms

Vortex does not rely on manual encoding hints or fixed heuristics. Instead, it uses a cost-based encoding selection algorithm that evaluates each column segment against the available encoding schemes and selects the combination that minimizes a weighted objective of compressed size and expected decode cost.

The algorithm works in two phases. First, it profiles a column segment to compute statistics: cardinality, run lengths, value range, null density, and sort order. Second, it evaluates each candidate encoding against these statistics. Dictionary encoding is favored when cardinality is low relative to segment length. Run-length encoding is favored when there are long runs of consecutive identical values. Frame-of-reference encoding is favored when values fall within a narrow range. Bit-packing is favored when the effective bit width is significantly smaller than the storage type's bit width. Delta encoding is favored for monotonically increasing or decreasing sequences.

The cost model accounts for both storage efficiency (bytes per value after encoding) and query performance (estimated CPU cycles to decode a value). This trade-off matters because a highly compressed encoding that is expensive to decode may be slower in practice than a moderately compressed encoding that supports fast scans. The algorithm selects the encoding that optimizes for the expected query workload, which is scan-heavy by default.

### Cascading Encodings

One of Vortex's distinguishing features is its support for cascading (layered) encodings. Rather than choosing a single encoding per segment, Vortex can stack multiple encodings in sequence. For example, a timestamp column with mostly increasing values might first be delta-encoded (converting absolute timestamps to small deltas), and then the resulting delta values might be bit-packed (since the deltas require fewer bits than the original timestamps).

Cascading works because each encoding transforms data into a representation that may be more amenable to further encoding. The encoding selection algorithm evaluates multi-layer combinations, not just individual encodings. It uses a bounded search to avoid exponential blowup, typically evaluating up to two or three layers, since additional layers rarely yield significant benefit.

This approach lets Vortex achieve compression ratios that no single encoding can match. In practice, cascading is most effective on numeric columns with structured patterns (timestamps, auto-incrementing IDs, sensor readings with bounded variation) where the first encoding removes most of the entropy and the second encoding compresses the residual.

### Lazy Decompression and Pushdown

Vortex's lazy decompression model is more than a performance optimization: it changes which operations are possible at the storage layer. Because encoded data retains enough structure for certain operations, Vortex supports compute pushdown into the encoding layer itself.

For example, a filter predicate like `WHERE timestamp > '2026-01-01'` on a delta-encoded column can be evaluated without fully decoding the column. The storage layer translates the predicate threshold into the delta domain (by computing the delta relative to the base value) and evaluates it against the encoded representation. Only segments that pass the filter are decoded to Arrow arrays for further processing.

Similarly, min/max statistics and null counts are maintained per segment in the Vortex file metadata. The query engine uses these statistics for segment pruning (skipping entire segments that cannot contain matching rows) before any data is read from disk.

This pushdown capability is exposed to [Apache DataFusion](/learn/apache-datafusion) through the `TableProvider` interface. When DataFusion pushes filters and projections down to a Vortex table provider, the provider evaluates them at the encoding level, reads and decodes only the qualifying segments, and returns the results as Arrow record batches. The query engine never sees or processes data that was pruned at the storage layer.

### Segment Layout and Metadata

Vortex files are organized into segments, each containing a contiguous range of rows for a single column. Segment boundaries are chosen based on a target size (typically 64 KB to 1 MB of encoded data), balancing between fine-grained pruning and metadata overhead. Each segment stores its encoding type, compressed data, null bitmap, and lightweight statistics (row count, null count, min, max).

The file footer contains a segment index that maps row ranges to segment offsets. This index enables efficient range scans and point lookups: the query engine binary-searches the index to find the relevant segments, reads only those segments from disk, and decodes them. For memory-mapped files, this translates to a small number of page faults rather than a sequential scan of the entire column.

<ContentRichText
  fields={{
    coverage: 'rc-end',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<AccordionFaq
  fields={{
    heading: 'Vortex FAQ',
    paragraph: '',
    items: [
      {
        title: 'How does Vortex compare to Apache Parquet?',
        paragraph:
          '<p>Both are columnar file formats for analytical data, but they differ in encoding and decompression. Parquet uses fixed encodings chosen at write time and requires full decompression before processing. Vortex uses adaptive, cascading encodings that vary per column segment and supports lazy decompression: only the data actually needed by a query is decoded. This gives Vortex faster scan times and better compression ratios for most workloads, while Parquet has broader ecosystem support.</p>',
      },
      {
        title: 'Is Vortex open source?',
        paragraph:
          '<p>Yes. Vortex is a Linux Foundation project and is licensed under Apache 2.0. The source code, documentation, and issue tracker are publicly accessible.</p>',
      },
      {
        title: 'When should I use Vortex instead of Parquet?',
        paragraph:
          '<p>Use Vortex when query performance and memory efficiency are priorities, particularly for data acceleration workloads where data is cached locally for fast, repeated access. Use Parquet when you need broad ecosystem compatibility or are storing data in a data lake for interchange between multiple tools.</p>',
      },
      {
        title: 'Can Vortex be used with existing data tools?',
        paragraph:
          '<p>Vortex is used in multiple systems, including <a href="/blog/introducing-spice-cayenne-data-accelerator">Spice Cayenne</a>, <a href="https://www.langchain.com/blog/introducing-smithdb">LangChain\'s SmithDB</a>, and <a href="https://www.polarsignals.com/blog/posts/2025/11/25/interface-parquet-vortex">PolarSignals</a>. It is not yet a drop-in replacement for Parquet in arbitrary data pipelines. For data interchange, Parquet remains the standard. Within Spice, Vortex is used automatically when data acceleration is enabled.</p>',
      },
      {
        title: 'What is the relationship between Vortex and Apache Arrow?',
        paragraph:
          '<p>Vortex is designed to work with Apache Arrow. When Vortex data is decoded, it produces Arrow arrays that can be processed by any Arrow-compatible query engine. Vortex also supports operating on encoded data directly (without decoding to Arrow) for operations like filtering and aggregation, which is where its performance advantages come from. Arrow IPC is an in-memory interchange format; Vortex is a compressed on-disk storage format.</p>',
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<ContentResourceFeatured
  fields={{
    heading: 'Learn more about Vortex and data acceleration',
    paragraph:
      'Guides and blog posts on columnar storage, data acceleration, and query performance with Spice.',
    mode: 'default',
    resources: [
      {
        source: 'manual',
        resource: null,
        resource_manual: {
          eyebrow: 'Docs',
          title: {
            title: 'Spice.ai OSS Documentation',
            url: 'https://spiceai.org/docs',
            target: '_blank',
          },
          description:
            'Learn how Spice uses Vortex to accelerate queries with adaptive encoding, lazy decompression, and zero-copy reads.',
          image: {
            ID: 1661,
            id: 1661,
            title: 'Docs jpeg',
            filename: 'Docs-jpeg.jpeg',
            filesize: 103192,
            url: '/website-assets/media/2025/12/Docs-jpeg.jpeg',
            link: '/docs-jpeg/',
            alt: '',
            author: '9',
            description: '',
            caption: '',
            name: 'docs-jpeg',
            status: 'inherit',
            uploaded_to: 0,
            date: '2025-12-05 04:13:53',
            modified: '2025-12-05 04:13:53',
            menu_order: 0,
            mime_type: 'image/jpeg',
            type: 'image',
            subtype: 'jpeg',
            icon: '/website-assets/media/default.png',
            width: 1832,
            height: 1036,
            sizes: {
              thumbnail: '/website-assets/media/2025/12/Docs-jpeg-150x150.jpeg',
              'thumbnail-width': 150,
              'thumbnail-height': 150,
              medium: '/website-assets/media/2025/12/Docs-jpeg-300x170.jpeg',
              'medium-width': 300,
              'medium-height': 170,
              medium_large:
                '/website-assets/media/2025/12/Docs-jpeg-768x434.jpeg',
              'medium_large-width': 768,
              'medium_large-height': 434,
              large: '/website-assets/media/2025/12/Docs-jpeg-1024x579.jpeg',
              'large-width': 1024,
              'large-height': 579,
              '1536x1536':
                '/website-assets/media/2025/12/Docs-jpeg-1536x869.jpeg',
              '1536x1536-width': 1536,
              '1536x1536-height': 869,
              '2048x2048': '/website-assets/media/2025/12/Docs-jpeg.jpeg',
              '2048x2048-width': 1832,
              '2048x2048-height': 1036,
            },
          },
        },
      },
      {
        source: 'picker',
        resource: [
          {
            title:
              'Introducing Spice Cayenne: The Next-Generation Data Accelerator Built on Vortex for Performance and Scale',
            slug: '/blog/introducing-spice-cayenne-data-accelerator',
            excerpt:
              'Spice Cayenne is the next-generation Spice.ai data accelerator built for high-scale and low latency data lake workloads.',
            image:
              '/website-assets/media/2025/12/Spice-Cayenne-Blog-Header.png',
            type: 'Blog',
            taxonomy: ['Spice AI'],
          },
        ],
        resource_manual: {
          eyebrow: '',
          title: null,
          description: '',
          image: false,
        },
      },
      {
        source: 'picker',
        resource: [
          {
            title: 'How we use Apache DataFusion at Spice AI',
            slug: '/blog/how-we-use-apache-datafusion-at-spice-ai',
            excerpt:
              'A technical overview of how Spice extends Apache DataFusion with custom table providers, optimizer rules, and UDFs.',
            image:
              '/website-assets/media/2026/01/Engineering-at-Spice-AI-Apache-DataFusion.png',
            type: 'Blog',
            taxonomy: ['SQL Federation', 'Engineering'],
          },
        ],
        resource_manual: {
          eyebrow: '',
          title: null,
          description: '',
          image: false,
        },
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<TalkToAnEngineerCta />

---

## What is Zero-ETL?
URL: https://spice.ai/learn/zero-etl
Date: 2026-04-03T00:00:00
Description: Zero-ETL is a data architecture approach that eliminates traditional extract-transform-load pipelines by querying data in place or using CDC-backed acceleration. Learn what zero-ETL means in practice and when to use it.

<HeroCenteredText
  fields={{
    graphic_position: 'no-graphic',
    heading_tag: 'h1',
    heading: 'What is Zero-ETL?',
    paragraph:
      'Zero-ETL is a data architecture approach that eliminates traditional extract-transform-load pipelines. Instead of copying data into a central warehouse on a schedule, zero-ETL systems query data in place or use change data capture to keep local caches synchronized in real time.',
    cta: [
      {
        type: 'filled',
        cta: {
          title: 'See Spice SQL federation',
          url: '/platform/sql-federation-acceleration',
          target: '',
        },
      },
      {
        type: 'bordered',
        cta: {
          title: 'Read the docs',
          url: 'https://spiceai.org/docs/features/query-federation',
          target: '_blank',
        },
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<ContentRichText
  fields={{
    coverage: 'rc-start',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

ETL (extract, transform, load) has been the default approach to integrating data across systems for decades. Data is extracted from source systems on a schedule, transformed into a target schema, and loaded into a central warehouse where analysts and applications can query it. ETL works, but it introduces a persistent problem: data in the warehouse is always behind the source. Minutes-old or hours-old data leads to stale analytics, incorrect AI outputs, and delayed operational decisions.

Zero-ETL is the architectural response to this limitation. It describes data access patterns that eliminate or minimize the ETL step, either by querying source systems directly at runtime or by using event-driven mechanisms like change data capture (CDC) to keep local copies synchronized continuously. The result is data that reflects the current state of source systems, not the state as of the last pipeline run.

The term is used in two overlapping ways. Cloud vendors (AWS, Google, Databricks) use it as a marketing term for near-zero-latency replication features, where the "ETL" is automated but still happens. The architecture community uses it to describe genuinely pipeline-free patterns where data either is not moved at all, or is kept synchronized through CDC without manual pipeline code. This guide focuses on the architectural meaning.

## Why ETL Pipelines Create Problems

Before understanding zero-ETL, it is worth understanding what ETL pipelines actually cost in practice.

### Staleness

ETL pipelines run on schedules. A daily pipeline means warehouse data is up to 24 hours old. An hourly pipeline means up to 60 minutes of staleness. For operational use cases (detecting fraud, answering customer questions, making real-time recommendations), even minutes of staleness is unacceptable.

### Fragility

ETL pipelines break when upstream schemas change. A source team adds a column, renames a field, or changes a data type, and downstream pipelines fail. Someone must diagnose the failure, fix the transformation code, backfill the gap, and redeploy. This maintenance burden compounds as the number of pipelines grows.

### Time to value

Building an ETL pipeline requires schema design, transformation logic, orchestration tooling, and testing before any data is queryable. For exploratory analyses or new data sources, this overhead can take days or weeks.

### Redundant storage

ETL copies data from sources into the warehouse. For large datasets, this doubles or triples storage costs. The copy in the warehouse is not the source of truth; it is a snapshot that requires continuous replication to stay current.

## What Zero-ETL Looks Like in Practice

Zero-ETL is not a single technology; it is a set of patterns that share the goal of making data accessible without manual pipeline code.

### Pattern 1: SQL Federation

[SQL federation](/platform/sql-federation-acceleration) queries data in place across multiple sources at runtime. A federation engine connects to PostgreSQL, Databricks, Amazon S3, and other sources, translates a single SQL query into source-specific requests, and merges the results. No data is copied. There are no pipelines to build or maintain.

```sql
-- Query across PostgreSQL and Databricks in a single statement
SELECT c.name, SUM(o.amount) AS total_spend
FROM postgres.customers c
JOIN databricks.orders o ON c.id = o.customer_id
WHERE o.created_at > NOW() - INTERVAL '30 days'
GROUP BY c.name
ORDER BY total_spend DESC
```

The trade-off with pure federation is that query performance is bounded by source latency. A query that joins a slow Snowflake warehouse with a fast PostgreSQL database is limited by Snowflake's response time.

### Pattern 2: CDC-Backed Acceleration

[Change data capture](/learn/change-data-capture) monitors database transaction logs and streams row-level changes (inserts, updates, deletes) to downstream consumers in real time. When paired with a local [acceleration cache](/platform/sql-federation-acceleration), CDC provides the best of both worlds: data is stored locally for fast queries, but the local copy is kept synchronized continuously with the source without manual pipeline code.

```yaml
# spicepod.yaml: CDC-backed local acceleration -- no ETL pipeline required
datasets:
  - from: postgres:public.orders
    name: orders
    acceleration:
      engine: arrow
      refresh_mode: changes  # Log-based CDC
      refresh_check_interval: 1s
```

The local cache reflects source changes within seconds. No scheduled jobs, no transformation code, no pipeline orchestration.

### Pattern 3: Direct Query Pushdown

Some modern data platforms (Snowflake Data Sharing, BigQuery Authorized Views, Databricks Delta Sharing) allow consumers to query data directly from the producer's storage without physically copying it. The query is pushed down to the producer's execution engine and the results are returned. This eliminates data movement while preserving the performance of the source engine.

## Zero-ETL vs. Traditional ETL

The following comparison covers the key dimensions that matter when evaluating the approaches.

| Dimension | Zero-ETL (Federation + CDC) | Traditional ETL |
|---|---|---|
| **Data freshness** | Real-time to near-real-time | Minutes to hours behind source |
| **Data movement** | None (federation) or CDC increments only | Full copy on each pipeline run |
| **Time to first query** | Minutes: configure connectors and query | Days to weeks: build and test pipelines |
| **Maintenance burden** | Low: no pipeline code to maintain | High: pipelines break on schema changes |
| **Storage cost** | No duplication (federation) or minimal delta (CDC) | Full duplicate at destination |
| **Query performance** | Depends on source latency; acceleration layers close the gap | Fast for pre-computed, co-located data |
| **Source availability** | Federated queries require source availability | Warehouse independent after load |
| **Best for** | Operational apps, real-time AI, live dashboards | Historical analytics, compliance archives, batch ML |

## When Zero-ETL Is the Right Choice

Zero-ETL is not a universal replacement for ETL. It is better suited to some workloads than others.

### Zero-ETL fits well when:

**Real-time data is required.** Any application that needs data reflecting the current state (fraud detection, live dashboards, AI inference, real-time search) benefits from zero-ETL. Scheduled ETL cannot serve these use cases without significant lag.

**Multiple sources need to be combined.** When joining PostgreSQL with Databricks with Amazon S3 in a single query, SQL federation eliminates the need to pre-join datasets in a warehouse. No pipeline needs to be built for each combination.

**Schema evolution is frequent.** Federated queries execute against the current schema. There is no transformation code to update when an upstream team adds a column.

**Time to query matters.** Adding a new data source to a federation engine takes minutes: configure the connector, query. Building an ETL pipeline to the same source takes days.

### ETL still fits well when:

**Long-term historical analytics are needed.** Data archives, compliance reporting, and historical trend analysis often operate over years of data. ETL and a well-designed warehouse schema are better suited to these workloads than real-time federation.

**Complex multi-step transformations are required.** If data must be significantly reshaped, enriched, or quality-checked before it is queryable, ETL's explicit transformation step is the right tool. Zero-ETL does not replace transformation logic; it eliminates the extraction and loading overhead.

**Source availability is not reliable.** If a source system has high downtime, federation will expose that downtime to applications. ETL's decoupled warehouse buffers applications from source failures.

**Query performance requires pre-computation.** Materialized aggregations over terabytes of historical data are best served from a pre-computed warehouse table, not from a federated query at runtime.

## Zero-ETL and the Anti-Pattern of Misuse

The term zero-ETL is sometimes used to describe managed replication services that automate ETL rather than eliminate it. AWS Zero-ETL, for example, replicates Aurora changes into Redshift continuously; the ETL step is handled by the platform, but it still occurs. This is useful, but it is not the same as eliminating the pipeline architecture.

The practical distinction: true zero-ETL means there is no centralized data copy that can go stale, no pipeline code that can break, and no replication lag from copying full tables on a schedule. CDC-backed acceleration approaches this but does involve local storage. Pure federation is the closest to "zero" data movement.

## Zero-ETL for Enterprise AI Workloads

AI workloads changed which zero-ETL argument matters. The original case was cost and maintenance. The current case is freshness and reach.

### Agents read differently than dashboards

A dashboard runs known queries on a schedule, so a pipeline can prepare for it. An agent generates queries at runtime and reads many times per task. Preparing every path in advance is not possible, which favors querying in place. [AI agent data access](/learn/ai-agent-data-access) covers the wider pattern.

### Staleness produces wrong answers, not stale charts

A dashboard that is an hour behind looks slightly old. An agent acting on hour-old inventory takes a wrong action. The cost of the staleness window rises when the reader can act.

### Governance must follow the data

Every pipeline copy is a place where permissions can drift from the source. Removing the copy removes the drift. Enforcing policy at the query layer means one rule covers every path, which is easier to audit than one rule per destination.

### What enterprises still keep pipelines for

Zero-ETL does not replace the archive. Regulatory retention, long-horizon history, and reproducible reporting snapshots all need a copy that does not change. Most enterprise architectures run both: zero-ETL paths for serving, pipelines for history.

## Advanced Topics

### Predicate Pushdown in Federation

The performance of zero-ETL federation depends heavily on how aggressively the engine pushes predicates (filters) down to source systems. Without pushdown, a federated query that filters `WHERE created_at > '2026-01-01'` would pull all rows from the source and filter locally. With pushdown, the source executes the filter and returns only matching rows.

[Apache DataFusion](/learn/apache-datafusion) (the query engine underlying Spice) applies multi-level pushdown: filter predicates, aggregation functions, and projection (column selection) are all pushed to sources when the connector supports it. For a query joining PostgreSQL and S3 Parquet files, the PostgreSQL connector generates a parameterized SQL query with the filter, and the Parquet reader skips row groups whose min/max statistics exclude the filter range. This minimizes data transfer and improves query latency substantially.

### CDC Exactly-Once Semantics

CDC-backed acceleration requires careful handling to avoid duplicating or missing changes. CDC consumers track their position in the source's transaction log (the Log Sequence Number, or LSN, in PostgreSQL). On restart, the consumer resumes from its last acknowledged LSN, ensuring no events are replayed or skipped.

For the local acceleration cache, Spice uses upsert semantics: each change event is applied as an insert-or-update based on the primary key. This makes the consumer idempotent: applying the same event twice produces the same result as applying it once. This avoids the need for distributed transactions while still achieving exactly-once logical outcomes.

### Combining Federation and CDC Acceleration

The most performant zero-ETL architecture combines both patterns. Frequently accessed, latency-sensitive datasets are accelerated locally with CDC-based refresh. Infrequently accessed or cold datasets are federated on demand without local storage. Applications query through a unified SQL endpoint and are unaware of which tier serves each table.

In a [hybrid data architecture](/learn/hybrid-data-architecture), sidecars cache the hot working set for sub-millisecond local reads, while a centralized cluster manages ingestion and serves cold queries. This extends the zero-ETL pattern across tiers while maintaining a unified query interface.

## Zero-ETL with Spice

[Spice](/platform/sql-federation-acceleration) is built around the zero-ETL principle. The [SQL federation and acceleration platform](/platform/sql-federation-acceleration) connects to [40+ data sources](/integrations) without requiring ETL pipelines. Each dataset can be queried in-place through federation, accelerated locally through CDC-backed refresh, or both, using a single declarative YAML configuration.

The [real-time CDC feature](/feature/real-time-change-data-capture) supports log-based CDC from PostgreSQL, MySQL, and other sources. Changes flow from the source transaction log into the local acceleration cache within seconds, without Kafka, Debezium, or custom pipeline code for the most common use cases.

For teams building AI applications, RAG pipelines, or [real-time analytics on operational data](/use-case/analytics), Spice provides the zero-ETL foundation: query any source with SQL, cached locally for performance, kept live through CDC.

<ContentRichText
  fields={{
    coverage: 'rc-end',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<AccordionFaq
  fields={{
    heading: 'Zero-ETL FAQ',
    paragraph: '',
    items: [
      {
        title: 'What does zero-ETL actually mean?',
        paragraph:
          '<p>Zero-ETL refers to data access architectures that eliminate traditional extract-transform-load pipelines. The two main approaches are SQL federation (querying data in place across sources at runtime) and CDC-backed acceleration (keeping local caches synchronized in real time via change data capture). Zero-ETL data is always current, not a snapshot from the last pipeline run.</p>',
      },
      {
        title: 'Is zero-ETL the same as CDC?',
        paragraph:
          '<p>No, though CDC is one technique used in zero-ETL architectures. Zero-ETL is a broader category: it includes SQL federation (no data movement at all), CDC-backed local caches (incremental sync without batch pipelines), and direct query pushdown patterns. CDC eliminates the batch extraction step by streaming changes in real time.</p>',
      },
      {
        title: 'When should I still use ETL?',
        paragraph:
          '<p>ETL remains appropriate for long-term historical archives, complex multi-step transformations, compliance reporting that requires auditable snapshots, and workloads where pre-computed aggregations over terabytes of historical data are needed. Zero-ETL is better suited to operational and real-time workloads where data freshness matters more than batch throughput.</p>',
      },
      {
        title: 'Does zero-ETL mean no data transformation?',
        paragraph:
          '<p>Not necessarily. Zero-ETL eliminates the extraction and loading overhead: the pipeline code that copies data on a schedule. Transformations can still be applied at query time (via SQL views), at acceleration time (via materialized views in the local cache), or via event-driven compute triggered by CDC events. The difference is that transformation logic is not embedded in a fragile batch pipeline.</p>',
      },
      {
        title: 'Can zero-ETL handle large datasets?',
        paragraph:
          '<p>Yes. SQL federation handles large datasets through predicate pushdown, which minimizes data transferred from source systems. CDC-backed acceleration handles large datasets by syncing only changed rows rather than reloading the full table. For analytical queries over very large local caches, Spice uses columnar storage engines like DuckDB and Vortex (Cayenne) that deliver fast scans over billions of rows.</p>',
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<ContentResourceFeatured
  fields={{
    heading: 'Learn more about zero-ETL data access',
    paragraph:
      'Guides and documentation on federated SQL, CDC-backed acceleration, and building zero-ETL data architectures.',
    mode: 'default',
    resources: [
      {
        source: 'manual',
        resource: null,
        resource_manual: {
          eyebrow: 'Docs',
          title: {
            title: 'Query Federation Docs',
            url: 'https://spiceai.org/docs/features/query-federation',
            target: '_blank',
          },
          description:
            'Learn how Spice federates SQL queries across multiple data sources with predicate pushdown and local acceleration, no ETL required.',
          image: {
            ID: 1661,
            id: 1661,
            title: 'Docs jpeg',
            filename: 'Docs-jpeg.jpeg',
            filesize: 103192,
            url: '/website-assets/media/2025/12/Docs-jpeg.jpeg',
            link: '/docs-jpeg/',
            alt: '',
            author: '9',
            description: '',
            caption: '',
            name: 'docs-jpeg',
            status: 'inherit',
            uploaded_to: 0,
            date: '2025-12-05 04:13:53',
            modified: '2025-12-05 04:13:53',
            menu_order: 0,
            mime_type: 'image/jpeg',
            type: 'image',
            subtype: 'jpeg',
            icon: '/website-assets/media/default.png',
            width: 1832,
            height: 1036,
            sizes: {
              thumbnail: '/website-assets/media/2025/12/Docs-jpeg-150x150.jpeg',
              'thumbnail-width': 150,
              'thumbnail-height': 150,
              medium: '/website-assets/media/2025/12/Docs-jpeg-300x170.jpeg',
              'medium-width': 300,
              'medium-height': 170,
              medium_large:
                '/website-assets/media/2025/12/Docs-jpeg-768x434.jpeg',
              'medium_large-width': 768,
              'medium_large-height': 434,
              large: '/website-assets/media/2025/12/Docs-jpeg-1024x579.jpeg',
              'large-width': 1024,
              'large-height': 579,
              '1536x1536':
                '/website-assets/media/2025/12/Docs-jpeg-1536x869.jpeg',
              '1536x1536-width': 1536,
              '1536x1536-height': 869,
              '2048x2048': '/website-assets/media/2025/12/Docs-jpeg.jpeg',
              '2048x2048-width': 1832,
              '2048x2048-height': 1036,
            },
          },
        },
      },
      {
        source: 'picker',
        resource: [
          {
            title:
              'Getting Started with Spice.ai SQL Query Federation & Acceleration',
            slug: '/blog/spice-sql-query-federation-acceleration',
            excerpt:
              'Learn how to use Spice.ai to federate and accelerate queries across operational and analytical systems with zero ETL.',
            image:
              '/website-assets/media/2025/11/68ee96eb08a0dfcb609c1969_Version-7-1.png',
            type: 'Blog',
            taxonomy: ['Spice AI'],
          },
        ],
        resource_manual: {
          eyebrow: '',
          title: null,
          description: '',
          image: false,
        },
      },
      {
        source: 'picker',
        resource: [
          {
            title: 'Real-Time Acceleration with DynamoDB Streams',
            slug: '/blog/real-time-acceleration-with-dynamodb-streams',
            excerpt:
              'How Spice uses CDC from DynamoDB Streams to keep acceleration caches current without ETL pipelines.',
            image:
              '/website-assets/media/2025/11/68e42f8a5daa71c139c95512_Version-2.png',
            type: 'Blog',
            taxonomy: ['Engineering'],
          },
        ],
        resource_manual: {
          eyebrow: '',
          title: null,
          description: '',
          image: false,
        },
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<ContentCta
  fields={{
    override_global_setting: false,
    custom_content: { heading: '', paragraph: '', cta: null },
    padding_top: 'unset',
    padding_bottom: 'unset',
    gcta_heading: 'See Spice in action',
    gcta_paragraph:
      'Get a guided walkthrough of how development teams use Spice to query, accelerate, and integrate AI for mission-critical workloads.',
    gcta_cta: {
      title: 'Get a demo',
      url: 'https://meetings.hubspot.com/vladi-semenov',
      target: '_blank',
    },
  }}
/>

---

## Spice AI for AWS
URL: https://spice.ai/partners/aws
Description: Build Fast, Scalable AI Applications with Spice AI and Amazon Web Services

<PartnerHero
  fields={{
    primary_logo: {
      src: '/website-assets/partners/aws/spice-logo-black.svg',
      alt: 'Spice AI',
      width: 256,
      height: 64,
    },
    partner_logo: {
      src: '/website-assets/partners/aws/aws-logo.svg',
      alt: 'Amazon Web Services',
      width: 128,
      height: 64,
    },
    heading: 'Build Data-Intensive AI Applications on AWS Infrastructure',
    paragraph:
      'Spice AI partners with Amazon Web Services to help organizations build real-time, data-driven applications and AI agents. Through native integrations with AWS data services like S3, DynamoDB, Redshift, and AI services like Bedrock, Spice AI enables customers to accelerate development, reduce costs, and deploy production-ready AI applications across AWS infrastructure.',
    primary_cta: {
      url: 'https://aws.amazon.com/marketplace/pp/prodview-jmf6jskjvnq7i',
      title: 'Get it on AWS Marketplace',
      target: '_blank',
    },
    secondary_cta: {
      url: 'https://spiceai.org/docs/deployment/aws',
      title: 'Read the docs',
      target: '_blank',
    },
    learn_more_text: 'Explore all AWS integrations in Spice AI',
    learn_more_url: 'https://spiceai.org/docs/deployment/aws/integrations',
    padding_top: 'st-lg',
    padding_bottom: 'sb-lg',
    theme: 'aws',
  }}
/>

<PartnerCapabilities
  fields={{
    heading: 'With Spice AI + AWS, Enterprises can:',
    heading_tag: 'h2',
    paragraph:
      'Build high-performance, secure, and scalable AI applications with unified access to your AWS data and AI services',
    items: [
      {
        icon: 'database',
        title: 'Federate Data Across AWS Services',
        description:
          "Execute fast, low-latency SQL queries across <strong>Amazon S3</strong>, <strong>DynamoDB</strong>, <strong>Redshift</strong>, <strong>Aurora</strong>, <strong>RDS</strong>, and <strong>Amazon MSK</strong> with Spice.ai's unified query engine - no data movement required.",
      },
      {
        icon: 'bolt',
        title: 'Integrate Amazon Bedrock AI',
        description:
          'Connect <strong>Amazon Nova</strong>, <strong>Titan</strong>, <strong>Claude</strong>, and other foundation models through Amazon Bedrock for LLM inference and embeddings, with <strong>Bedrock Guardrails</strong> support for safe AI applications.',
      },
      {
        icon: 'shield',
        title: 'Vector Search with S3 Vectors',
        description:
          'Build semantic search and RAG applications using <strong>Amazon S3 Vectors</strong> - a new S3 bucket type for sub-second similarity queries on billions of vectors at up to 90% cost reduction.',
      },
      {
        icon: 'building',
        title: 'Deploy via AWS Marketplace',
        description:
          'Purchase and deploy Spice.ai Enterprise through <strong>AWS Marketplace</strong> with consolidated billing, Private Offers support, and fast onboarding using your existing AWS procurement workflows.',
      },
    ],
    padding_top: 'st-lg',
    padding_bottom: 'sb-lg',
    theme: 'aws',
  }}
/>

<PartnerFeatures
  fields={{
    heading: 'Native AWS Data & AI Integrations',
    heading_tag: 'h2',
    paragraph:
      'Spice AI provides deep integrations across the AWS ecosystem for data federation, AI inference, vector search, and secret management:',
    items: [
      {
        logo: {
          src: '/website-assets/partners/aws/services/s3.svg',
          alt: 'Amazon S3',
        },
        title: 'Amazon S3 & S3 Tables',
        description:
          'Query Parquet, CSV, and JSON files from S3 buckets. Access <strong>Iceberg tables</strong> in Amazon S3 Tables using AWS Glue catalog integration.',
        url: 'https://spiceai.org/docs/components/data-connectors/s3',
      },
      {
        logo: {
          src: '/website-assets/partners/aws/services/dynamodb.svg',
          alt: 'Amazon DynamoDB',
        },
        title: 'Amazon DynamoDB & Streams',
        description:
          'Federated SQL queries on DynamoDB tables with automatic schema inference and <strong>real-time CDC</strong> via DynamoDB Streams.',
        url: 'https://spiceai.org/docs/components/data-connectors/dynamodb',
      },
      {
        logo: {
          src: '/website-assets/partners/aws/services/bedrock.svg',
          alt: 'Amazon Bedrock',
        },
        title: 'Amazon Bedrock (Nova, Titan, Claude)',
        description:
          'LLM inference with <strong>Amazon Nova</strong> and embeddings with <strong>Titan</strong>. Supports <strong>Bedrock Guardrails</strong> for content filtering.',
        url: 'https://spiceai.org/docs/components/models/aws-bedrock',
      },
      {
        logo: {
          src: '/website-assets/partners/aws/services/s3-vectors.svg',
          alt: 'Amazon S3 Vectors',
        },
        title: 'Amazon S3 Vectors',
        description:
          'Sub-second similarity queries on billions of vectors with up to <strong>90% cost reduction</strong> compared to traditional vector databases.',
        url: 'https://spice.ai/blog/amazon-s3-vectors',
      },
      {
        logo: {
          src: '/website-assets/partners/aws/services/glue.svg',
          alt: 'AWS Glue',
        },
        title: 'AWS Glue Data Catalog',
        description:
          'Discover and query tables from AWS Glue with glob pattern filtering. Supports <strong>Iceberg</strong> and <strong>Delta Lake</strong> table formats.',
        url: 'https://spiceai.org/docs/components/catalogs/glue',
      },
      {
        logo: {
          src: '/website-assets/partners/aws/services/redshift.svg',
          alt: 'Amazon Redshift',
        },
        title: 'Amazon Redshift, Aurora & RDS',
        description:
          'Connect to <strong>Redshift</strong> clusters, <strong>Aurora PostgreSQL/MySQL</strong>, and <strong>RDS</strong> instances with full SQL federation.',
        url: 'https://spiceai.org/docs/deployment/aws/integrations',
      },
    ],
    padding_top: 'st-lg',
    padding_bottom: 'sb-lg',
    theme: 'aws',
  }}
/>

<PartnerTestimonials
  fields={{
    heading: 'What Our Customers Say',
    testimonials: [
      {
        logo: {
          src: '/website-assets/media/2025/11/Homepage_Logos_Twilio-1.svg',
          alt: 'Twilio',
          width: 120,
          height: 40,
        },
        company_type: 'Cloud Communications Platform',
        quote:
          'Spice opened the door to take these critical control-plane datasets and move them next to our services in the runtime path.',
        author_name: 'Peter Janovsky',
        author_title: 'Software Architect, Twilio',
        gradient: 'orange',
      },
      {
        logo: {
          src: '/website-assets/partners/aws/aws-logo.svg',
          alt: 'AWS',
          width: 120,
          height: 60,
        },
        company_type: 'AWS Marketplace Enterprise Solution',
        quote:
          'Spice.ai Enterprise is available on AWS Marketplace, enabling teams to deploy with existing AWS billing and procurement workflows. With support for Private Offers, consolidated billing, and fast onboarding, enterprises can start building AI applications in minutes.',
        author_name: 'AWS Marketplace',
        author_title: 'Enterprise Solutions',
        gradient: 'blue',
      },
    ],
    padding_top: 'st-lg',
    padding_bottom: 'sb-lg',
    theme: 'aws',
  }}
/>

<PartnerAbout
  fields={{
    heading: 'About Spice AI',
    heading_tag: 'h2',
    paragraph:
      'Spice AI helps enterprises build fast, accurate, and scalable AI applications and agents with its portable, open-source data and AI compute engine. It connects data from disparate sources including AWS services, simplifies application development, and supports workloads across cloud, edge, and on-premises systems.',
    getting_started_text:
      'Get started with Spice.ai Open Source in just 30 seconds:',
    getting_started_link_text: 'spiceai.org/docs/getting-started',
    getting_started_url: 'https://spiceai.org/docs/getting-started',
    cta_heading: 'Deploy on AWS Marketplace',
    cta_paragraph:
      'Ready to deploy Spice AI on AWS? Get Spice.ai Enterprise from AWS Marketplace with consolidated billing, Private Offers support, and enterprise-grade SLAs.',
    cta: {
      url: 'https://aws.amazon.com/marketplace/pp/prodview-jmf6jskjvnq7i',
      title: 'Visit AWS Marketplace',
      target: '_blank',
    },
    padding_top: 'st-lg',
    padding_bottom: 'sb-lg',
    theme: 'aws',
  }}
/>

---

## Spice AI for Databricks
URL: https://spice.ai/partners/databricks
Description: Build Fast, Accurate AI Applications with Spice AI and Databricks

<PartnerHero
  fields={{
    primary_logo: {
      src: '/website-assets/partners/databricks/spice-logo-black.svg',
      alt: 'Spice AI',
      width: 256,
      height: 64,
    },
    partner_logo: {
      src: '/website-assets/partners/databricks/databricks-logo-text.svg',
      alt: 'Databricks',
      width: 400,
      height: 64,
    },
    heading:
      'Powering Enterprise-Grade AI Applications & Agents with Operational Data',
    paragraph:
      'Spice AI partners with Databricks to help organizations build real-time, data-driven applications and AI agents. Through integration with the Databricks Data Intelligence Platform, Spice AI enables customers to build faster and more reliable AI apps and agents that extend across on-premises, cloud, and edge more rapidly with fewer errors at reduced cost.',
    primary_cta: {
      url: 'https://docs.spice.ai/',
      title: 'Get Started',
      target: '_blank',
    },
    secondary_cta: {
      url: 'https://docs.spice.ai/building-blocks/data-connectors/databricks',
      title: 'Read the docs',
      target: '_blank',
    },
    learn_more_text: 'Learn more about the Spice AI & Databricks partnership',
    learn_more_url: 'https://www.spiceai.io/blog/databricks-partnership',
    padding_top: 'st-lg',
    padding_bottom: 'sb-lg',
  }}
/>

<PartnerCapabilities
  fields={{
    heading: 'With Spice AI + Databricks, Enterprises can:',
    heading_tag: 'h2',
    paragraph:
      'Build high-performance, secure, and business-ready AI applications with unified access to your Databricks data and models',
    items: [
      {
        icon: 'database',
        title: 'Query Data For Operational Use Cases',
        description:
          "Execute fast, low-latency SQL queries across Databricks, on-premises, and edge sources with Spice.ai's unified engine, enabling real-time applications like <strong>inventory tracking</strong> or <strong>fraud detection</strong>.",
      },
      {
        icon: 'bolt',
        title: 'Embed AI with Applications',
        description:
          'Integrate Databricks Mosaic AI model serving and embeddings with the Spice engine to deploy AI features, such as <strong>low-latency recommendation systems</strong>, <strong>search</strong>, or <strong>predictive maintenance</strong>.',
      },
      {
        icon: 'shield',
        title: 'Streamline Data Governance',
        description:
          'Manage <strong>Apache Iceberg</strong> and <strong>Delta Lake</strong> tables using Unity Catalog, enforcing secure access, ensuring compliance, and restricted data access.',
      },
      {
        icon: 'bolt',
        title: 'Optimize Workload Performance',
        description:
          'Use Spice.ai to <strong>cache hot data</strong>, <strong>replicate high-demand datasets</strong>, and <strong>load-balance hosted AI endpoints</strong>, maintaining speed and resilience for applications like real-time dashboards.',
      },
    ],
    padding_top: 'st-lg',
    padding_bottom: 'sb-lg',
  }}
/>

<PartnerFeatures
  fields={{
    heading: 'Native Support for the Databricks Data Intelligence Platform',
    heading_tag: 'h2',
    paragraph:
      'Spice AI integrates with the Databricks Data Intelligence platform and features the following capabilities:',
    items: [
      {
        icon: 'database',
        title: 'Databricks SQL Warehouse and Spark Connect',
        description:
          'Integrations for high-performance SQL queries accelerated with <strong>DuckDB</strong> and <strong>SQLite</strong>.',
        url: 'https://spiceai.org/docs/components/data-connectors/databricks#spark-connect',
      },
      {
        icon: 'bolt',
        title: 'Databricks Mosaic AI Integration',
        description:
          'Model serving and embeddings integrations to bring <strong>MosaicAI</strong> alongside applications.',
        url: 'https://spiceai.org/docs/components/embeddings/databricks',
      },
      {
        icon: 'shield',
        title: 'Unity Catalog Support',
        description:
          'Comprehensive support for <strong>governance</strong> and <strong>security</strong>.',
        url: 'https://spiceai.org/docs/components/catalogs/databricks',
      },
      {
        icon: 'building',
        title: 'Apache Iceberg & Delta Lake Support',
        description:
          'Query and management of <strong>open format tables</strong> via Unity Catalog.',
        url: 'https://spiceai.org/docs/components/data-connectors/databricks#delta-lake-s3',
      },
      {
        icon: 'users',
        title: 'Service Principal Authentication',
        description:
          '<strong>M2M & U2M OAuth</strong> authentication for enterprise-grade role-based security.',
        url: 'https://spiceai.org/docs/components/data-connectors/databricks#authentication',
      },
    ],
    padding_top: 'st-lg',
    padding_bottom: 'sb-lg',
  }}
/>

<PartnerTestimonials
  fields={{
    heading: 'What Our Customers & Databricks Say',
    testimonials: [
      {
        logo: {
          src: '/website-assets/partners/databricks/Homepage_Logos_NRC-1.svg',
          alt: 'NRC Health',
          width: 80,
          height: 80,
        },
        company_type: 'Healthcare Analytics and Patient Experience',
        quote:
          "Partnering with Spice AI has transformed how NRC Health delivers AI-driven insights. We reduced time-to-market from months to weeks - or even days - and empowered our developers to build dependable, patient-centric tools. Spice isn't just solving our data and AI challenges, it's redefining what's possible in personalized healthcare.",
        author_name: 'Tim Ottersburg',
        author_title: 'VP of Technology, NRC Health',
        gradient: 'blue',
      },
      {
        logo: {
          src: '/website-assets/partners/databricks/databricks-logo.png',
          alt: 'Databricks',
          width: 220,
          height: 60,
        },
        company_type: 'Data Intelligence Platform',
        quote:
          "Nearly every enterprise is investing in domain-specific AI agents. Operational data is the key differentiator. We're excited to partner with Spice AI to unlock value on the Databricks Data Intelligence Platform and help customers turn data into intelligence.",
        author_name: 'Roger Murff',
        author_title: 'VP of Technology Partners, Databricks',
        gradient: 'orange',
      },
    ],
    padding_top: 'st-lg',
    padding_bottom: 'sb-lg',
  }}
/>

<PartnerAbout
  fields={{
    heading: 'About Spice AI',
    heading_tag: 'h2',
    paragraph:
      'Spice AI helps enterprises build fast, accurate, and scalable AI applications and agents with its portable, open-source data and AI compute engine. It connects data from disparate sources, simplifies application development, and supports workloads across cloud, edge, and on-premises systems.',
    getting_started_text:
      'Get started with Spice.ai Open Source in just 30 seconds:',
    getting_started_link_text: 'spiceai.org/docs/getting-started',
    getting_started_url: 'https://spiceai.org/docs/getting-started',
    cta_heading: 'Work with Spice AI',
    cta_paragraph:
      "Interested in working with Spice AI or looking to learn more about our work? We're always looking for our next big challenge. Take a deeper look at our enterprise offerings.",
    cta: {
      url: 'https://spice.ai',
      title: 'Visit Spice.ai',
      target: '_blank',
    },
    padding_top: 'st-lg',
    padding_bottom: 'sb-lg',
  }}
/>

---

## Spice AI for NetApp
URL: https://spice.ai/partners/netapp
Description: Build Accelerated, Data-Grounded AI Applications with Spice AI and NetApp ONTAP

<PartnerHero
  fields={{
    primary_logo: {
      src: '/website-assets/partners/netapp/spice-logo-black.svg',
      alt: 'Spice AI',
      width: 256,
      height: 64,
    },
    partner_logo: {
      src: '/website-assets/partners/netapp/netapp-logo.svg',
      alt: 'NetApp',
      width: 256,
      height: 64,
    },
    heading: 'Build Accelerated, Data-Grounded AI Applications',
    paragraph:
      'Spice AI partners with NetApp to help organizations build real-time, data-driven applications and AI agents. By combining Spice.ai data engines with NetApp ONTAP S3 Lakehouse and Azure NetApp Files, enterprises can connect diverse data sources, accelerate queries locally, and build modern, performant, and cost-efficient architectures for AI workloads.',
    primary_cta: {
      url: 'https://www.netapp.com/partners/partner-connect/spice-ai-inc/',
      title: 'View Partnership',
      target: '_blank',
    },
    secondary_cta: {
      url: 'https://spiceai.org/docs/components/data-connectors/s3',
      title: 'Read the docs',
      target: '_blank',
    },
    learn_more_text: 'Learn how Spice AI works with NetApp ONTAP',
    learn_more_url:
      'https://community.netapp.com/t5/Tech-ONTAP-Blogs/Building-Accelerated-Data-Grounded-Apps-with-Spice-ai-and-NetApp/ba-p/463612',
    padding_top: 'st-lg',
    padding_bottom: 'sb-lg',
    theme: 'netapp',
  }}
/>

<PartnerCapabilities
  fields={{
    heading: 'With Spice AI + NetApp, Enterprises can:',
    heading_tag: 'h2',
    paragraph:
      'Build high-performance, data-grounded AI applications with unified access to your NetApp storage infrastructure',
    items: [
      {
        icon: 'database',
        title: 'Federate Data Across Storage Protocols',
        description:
          "Execute fast, low-latency SQL queries across <strong>NetApp ONTAP S3</strong>, <strong>NFS</strong>, <strong>SMB</strong>, and <strong>Azure NetApp Files</strong> with Spice.ai's unified query engine - no data movement required.",
      },
      {
        icon: 'bolt',
        title: 'Accelerate Queries Locally',
        description:
          'Cache frequently accessed data alongside your application for <strong>sub-second latency</strong>. Eliminate network round-trips and reduce load on primary storage systems.',
      },
      {
        icon: 'shield',
        title: 'Build Modern Data Lakehouses',
        description:
          'Combine <strong>NetApp ONTAP S3 Lakehouse</strong> with Dremio and PostgreSQL for a composable data platform that supports real-time analytics and AI workloads.',
      },
      {
        icon: 'building',
        title: 'Integrate LLMs with Your Data',
        description:
          'Connect foundation models like <strong>GPT-4</strong> to your NetApp data sources. Use natural language queries with <strong>spice chat</strong> to get answers grounded in your enterprise data.',
      },
    ],
    padding_top: 'st-lg',
    padding_bottom: 'sb-lg',
    theme: 'netapp',
  }}
/>

<PartnerFeatures
  fields={{
    heading: 'Native Storage Protocol Integrations',
    heading_tag: 'h2',
    paragraph:
      'Spice AI connects to NetApp storage through multiple protocols, enabling unified SQL access across your entire data infrastructure:',
    items: [
      {
        logo: {
          src: '/website-assets/partners/netapp/services/s3.svg',
          alt: 'S3-Compatible Storage',
        },
        title: 'NetApp ONTAP S3',
        description:
          'Query Parquet, CSV, and JSON files from <strong>ONTAP S3</strong> buckets. Build data lakehouses with native <strong>Apache Iceberg</strong> support.',
        url: 'https://spiceai.org/docs/components/data-connectors/s3',
      },
      {
        logo: {
          src: '/website-assets/partners/netapp/services/nfs.svg',
          alt: 'NFS',
        },
        title: 'NFS File Shares',
        description:
          'Access data on <strong>NFS-mounted</strong> NetApp volumes directly. Query files from network-attached storage with the File Data Connector.',
        url: 'https://spiceai.org/docs/components/data-connectors/file',
      },
      {
        logo: {
          src: '/website-assets/partners/netapp/services/smb.svg',
          alt: 'SMB',
        },
        title: 'SMB/CIFS Shares',
        description:
          'Connect to <strong>SMB file shares</strong> for Windows-based workflows. Federate data from CIFS-mounted NetApp storage.',
        url: 'https://spiceai.org/docs/components/data-connectors/file',
      },
      {
        logo: {
          src: '/website-assets/partners/netapp/services/sftp.svg',
          alt: 'SFTP',
        },
        title: 'FTP/SFTP Access',
        description:
          'Query files from <strong>FTP and SFTP</strong> servers. Supports Parquet, CSV, and JSON formats with secure transfer.',
        url: 'https://spiceai.org/docs/components/data-connectors/ftp',
      },
      {
        logo: {
          src: '/website-assets/partners/netapp/services/ontap.svg',
          alt: 'ONTAP',
        },
        title: 'Azure NetApp Files',
        description:
          'Connect to <strong>Azure NetApp Files</strong> by Instaclustr for cloud-native enterprise file storage with high performance.',
        url: 'https://community.netapp.com/t5/Tech-ONTAP-Blogs/Building-Accelerated-Data-Grounded-Apps-with-Spice-ai-and-NetApp/ba-p/463612',
      },
      {
        logo: {
          src: '/website-assets/partners/netapp/services/file.svg',
          alt: 'File Connector',
        },
        title: 'Local File Systems',
        description:
          'Query any locally accessible filesystem including <strong>mounted network shares</strong>. Supports automatic refresh on file changes.',
        url: 'https://spiceai.org/docs/components/data-connectors/file',
      },
    ],
    padding_top: 'st-lg',
    padding_bottom: 'sb-lg',
    theme: 'netapp',
  }}
/>

<PartnerTestimonials
  fields={{
    heading: 'What Our Partners Say',
    testimonials: [
      {
        logo: {
          src: '/website-assets/partners/databricks/Homepage_Logos_NRC-1.svg',
          alt: 'NRC Health',
          width: 80,
          height: 80,
        },
        company_type: 'Healthcare Analytics and Patient Experience',
        quote:
          "Partnering with Spice AI has transformed how NRC Health delivers AI-driven insights. We reduced time-to-market from months to weeks - or even days - and empowered our developers to build dependable, patient-centric tools. Spice isn't just solving our data and AI challenges, it's redefining what's possible in personalized healthcare.",
        author_name: 'Tim Ottersburg',
        author_title: 'VP of Technology, NRC Health',
        gradient: 'blue',
      },
      {
        logo: {
          src: '/website-assets/partners/netapp/netapp-logo.svg',
          alt: 'NetApp',
          width: 120,
          height: 40,
        },
        company_type: 'Enterprise Data Infrastructure',
        quote:
          'By combining Spice.ai, Dremio, PostgreSQL, and NetApp ONTAP S3 Lakehouse, you can build a modern data platform that supports real-time analytics and AI workloads. This architecture is not only performant and scalable but also cost-efficient.',
        author_name: 'NetApp Tech ONTAP',
        author_title: 'Technical Blog',
        gradient: 'orange',
      },
    ],
    padding_top: 'st-lg',
    padding_bottom: 'sb-lg',
    theme: 'netapp',
  }}
/>

<PartnerAbout
  fields={{
    heading: 'About Spice AI',
    heading_tag: 'h2',
    paragraph:
      'Spice AI helps enterprises build fast, accurate, and scalable AI applications and agents with its portable, open-source data and AI compute engine. It connects data from disparate sources including NetApp storage systems, simplifies application development, and supports workloads across cloud, edge, and on-premises systems.',
    getting_started_text:
      'Get started with Spice.ai Open Source in just 30 seconds:',
    getting_started_link_text: 'spiceai.org/docs/getting-started',
    getting_started_url: 'https://spiceai.org/docs/getting-started',
    cta_heading: 'Learn More About the Partnership',
    cta_paragraph:
      'Discover how Spice AI and NetApp work together to build accelerated, data-grounded AI applications with modern data lakehouse architecture.',
    cta: {
      url: 'https://community.netapp.com/t5/Tech-ONTAP-Blogs/Building-Accelerated-Data-Grounded-Apps-with-Spice-ai-and-NetApp/ba-p/463612',
      title: 'Read the Tech ONTAP Blog',
      target: '_blank',
    },
    padding_top: 'st-lg',
    padding_bottom: 'sb-lg',
    theme: 'netapp',
  }}
/>

---

## Partners
URL: https://spice.ai/partners
Date: 2025-11-21T00:46:27
Description: Partner with Spice AI to deliver faster data, search, and AI solutions for your customers. Build integrations, co-market solutions, and power data-intensive applications and AI agents together.

<HeroCenteredText
  fields={{
    graphic_position: 'no-graphic',
    heading_tag: 'h1',
    heading: 'A platform built on partnerships ',
    paragraph:
      'Join the ecosystem of cloud, data, AI, and developer-tool providers partnering with Spice to power the next generation of intelligent applications. Integrate, innovate, and scale with us.',
    cta: [
      {
        type: 'filled',
        cta: {
          title: 'Become a partner',
          url: '/contact/',
          target: '',
        },
      },
      {
        type: 'bordered',
        cta: {
          title: 'View integrations',
          url: '/integrations/',
          target: '',
        },
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<ContentImageVideo
  fields={{
    variant: 'variant-1',
    heading: 'Partner with Spice AI',
    heading_tag: 'h2',
    paragraph:
      "Whether you're a cloud provider, database, AI model vendor, observability platform, or productivity tool, partnering with Spice introduces new capabilities for your customers. We work closely with partners across the cloud, analytics, AI, and infrastructure ecosystems to ship high-performance, low-latency, developer-first experiences.",
    cta: [
      {
        type: 'filled',
        cta: {
          title: 'Connect with us',
          url: 'https://baunfire.vercel.app/contact/',
          target: '',
        },
      },
    ],
    media_type: 'image',
    media_image: {
      ID: 612,
      id: 612,
      title: 'Platform-Query_Illustration',
      filename: 'Platform-Query_Illustration.svg',
      filesize: 246230,
      url: '/website-assets/media/2025/11/Platform-Query_Illustration.svg',
      link: '/platform/sql-federation-acceleration/attachment/platform-query_illustration/',
      alt: 'Spice runtime icon surrounded by data connector logos including Snowflake, Databricks, MySQL, and GitHub',
      author: '6',
      description: '',
      caption: '',
      name: 'platform-query_illustration',
      status: 'inherit',
      uploaded_to: 543,
      date: '2025-11-18 19:42:54',
      modified: '2025-11-18 19:42:54',
      menu_order: 0,
      mime_type: 'image/svg+xml',
      type: 'image',
      subtype: 'svg+xml',
      icon: '/website-assets/media/default.png',
      width: 0,
      height: 0,
      sizes: {
        thumbnail: '/website-assets/media/2025/11/Platform-Query_Illustration.svg',
        'thumbnail-width': 1,
        'thumbnail-height': 1,
        medium: '/website-assets/media/2025/11/Platform-Query_Illustration.svg',
        'medium-width': 1,
        'medium-height': 1,
        medium_large: '/website-assets/media/2025/11/Platform-Query_Illustration.svg',
        'medium_large-width': 1,
        'medium_large-height': 1,
        large: '/website-assets/media/2025/11/Platform-Query_Illustration.svg',
        'large-width': 1,
        'large-height': 1,
        '1536x1536': '/website-assets/media/2025/11/Platform-Query_Illustration.svg',
        '1536x1536-width': 1,
        '1536x1536-height': 1,
        '2048x2048': '/website-assets/media/2025/11/Platform-Query_Illustration.svg',
        '2048x2048-width': 1,
        '2048x2048-height': 1,
      },
    },
    graphic_overlay: false,
    media_video: '',
    padding_top: 'st-lg',
    padding_bottom: 'sb-lg',
  }}
/>

<TabsIntegrationsGrid
  fields={{
    heading: 'Why partner with Spice AI',
    heading_tag: 'h2',
    paragraph:
      'Expand your platform, reach new customers, and enable new use cases by integrating with the Spice data and AI platform.',
    enable_filters: false,
    source: 'partner',
    padding_top: 'unset',
    padding_bottom: 'unset',
    posts: [
      {
        title: 'Anthropic',
        type: {
          term_id: 20,
          name: 'Model Provider',
          slug: 'model-provider',
          term_group: 0,
          term_taxonomy_id: 20,
          taxonomy: 'partner-type',
          description: '',
          parent: 0,
          count: 8,
          filter: 'raw',
        },
        icon: {
          ID: 1307,
          id: 1307,
          title: 'download__7_-removebg-preview',
          filename: 'download__7_-removebg-preview.png',
          filesize: 15822,
          url: '/website-assets/media/2025/11/download__7_-removebg-preview.png',
          link: '/?attachment_id=1307',
          alt: '',
          author: '7',
          description: '',
          caption: '',
          name: 'download__7_-removebg-preview',
          status: 'inherit',
          uploaded_to: 1203,
          date: '2025-11-24 23:23:21',
          modified: '2025-11-24 23:23:21',
          menu_order: 0,
          mime_type: 'image/png',
          type: 'image',
          subtype: 'png',
          icon: '/website-assets/media/default.png',
          width: 225,
          height: 225,
          sizes: {
            thumbnail:
              '/website-assets/media/2025/11/download__7_-removebg-preview-150x150.png',
            'thumbnail-width': 150,
            'thumbnail-height': 150,
            medium: '/website-assets/media/2025/11/download__7_-removebg-preview.png',
            'medium-width': 225,
            'medium-height': 225,
            medium_large: '/website-assets/media/2025/11/download__7_-removebg-preview.png',
            'medium_large-width': 225,
            'medium_large-height': 225,
            large: '/website-assets/media/2025/11/download__7_-removebg-preview.png',
            'large-width': 225,
            'large-height': 225,
            '1536x1536': '/website-assets/media/2025/11/download__7_-removebg-preview.png',
            '1536x1536-width': 225,
            '1536x1536-height': 225,
            '2048x2048': '/website-assets/media/2025/11/download__7_-removebg-preview.png',
            '2048x2048-width': 225,
            '2048x2048-height': 225,
          },
        },
        description:
          'AI research and products that put safety at the frontier. AI will have a vast impact on the world. Anthropic is a public benefit corporation dedicated to securing its benefits and mitigating its risks.',
        cta: {
          title: 'Learn more',
          url: 'https://www.anthropic.com/',
          target: '_blank',
        },
      },
      {
        title: 'OpenAI',
        type: {
          term_id: 20,
          name: 'Model Provider',
          slug: 'model-provider',
          term_group: 0,
          term_taxonomy_id: 20,
          taxonomy: 'partner-type',
          description: '',
          parent: 0,
          count: 8,
          filter: 'raw',
        },
        icon: {
          ID: 1306,
          id: 1306,
          title: 'download__6_-removebg-preview',
          filename: 'download__6_-removebg-preview.png',
          filesize: 27982,
          url: '/website-assets/media/2025/11/download__6_-removebg-preview.png',
          link: '/?attachment_id=1306',
          alt: '',
          author: '7',
          description: '',
          caption: '',
          name: 'download__6_-removebg-preview',
          status: 'inherit',
          uploaded_to: 1201,
          date: '2025-11-24 23:23:03',
          modified: '2025-11-24 23:23:03',
          menu_order: 0,
          mime_type: 'image/png',
          type: 'image',
          subtype: 'png',
          icon: '/website-assets/media/default.png',
          width: 225,
          height: 225,
          sizes: {
            thumbnail:
              '/website-assets/media/2025/11/download__6_-removebg-preview-150x150.png',
            'thumbnail-width': 150,
            'thumbnail-height': 150,
            medium: '/website-assets/media/2025/11/download__6_-removebg-preview.png',
            'medium-width': 225,
            'medium-height': 225,
            medium_large: '/website-assets/media/2025/11/download__6_-removebg-preview.png',
            'medium_large-width': 225,
            'medium_large-height': 225,
            large: '/website-assets/media/2025/11/download__6_-removebg-preview.png',
            'large-width': 225,
            'large-height': 225,
            '1536x1536': '/website-assets/media/2025/11/download__6_-removebg-preview.png',
            '1536x1536-width': 225,
            '1536x1536-height': 225,
            '2048x2048': '/website-assets/media/2025/11/download__6_-removebg-preview.png',
            '2048x2048-width': 225,
            '2048x2048-height': 225,
          },
        },
        description:
          'OpenAI is an AI research and deployment company dedicated to ensuring that general-purpose artificial intelligence benefits all of humanity.',
        cta: {
          title: 'Learn more',
          url: 'https://openai.com/',
          target: '_blank',
        },
      },
      {
        title: 'Hugging Face',
        type: {
          term_id: 20,
          name: 'Model Provider',
          slug: 'model-provider',
          term_group: 0,
          term_taxonomy_id: 20,
          taxonomy: 'partner-type',
          description: '',
          parent: 0,
          count: 8,
          filter: 'raw',
        },
        icon: {
          ID: 1305,
          id: 1305,
          title: 'download__5_-removebg-preview',
          filename: 'download__5_-removebg-preview.png',
          filesize: 61283,
          url: '/website-assets/media/2025/11/download__5_-removebg-preview.png',
          link: '/?attachment_id=1305',
          alt: '',
          author: '7',
          description: '',
          caption: '',
          name: 'download__5_-removebg-preview',
          status: 'inherit',
          uploaded_to: 1199,
          date: '2025-11-24 23:22:43',
          modified: '2025-11-24 23:22:43',
          menu_order: 0,
          mime_type: 'image/png',
          type: 'image',
          subtype: 'png',
          icon: '/website-assets/media/default.png',
          width: 225,
          height: 225,
          sizes: {
            thumbnail:
              '/website-assets/media/2025/11/download__5_-removebg-preview-150x150.png',
            'thumbnail-width': 150,
            'thumbnail-height': 150,
            medium: '/website-assets/media/2025/11/download__5_-removebg-preview.png',
            'medium-width': 225,
            'medium-height': 225,
            medium_large: '/website-assets/media/2025/11/download__5_-removebg-preview.png',
            'medium_large-width': 225,
            'medium_large-height': 225,
            large: '/website-assets/media/2025/11/download__5_-removebg-preview.png',
            'large-width': 225,
            'large-height': 225,
            '1536x1536': '/website-assets/media/2025/11/download__5_-removebg-preview.png',
            '1536x1536-width': 225,
            '1536x1536-height': 225,
            '2048x2048': '/website-assets/media/2025/11/download__5_-removebg-preview.png',
            '2048x2048-width': 225,
            '2048x2048-height': 225,
          },
        },
        description:
          'The AI community building the future. The platform where the machine learning community collaborates on models, datasets, and applications.',
        cta: {
          title: 'Learn more',
          url: 'https://huggingface.co/',
          target: '_blank',
        },
      },
      {
        title: 'GitHub',
        type: {
          term_id: 20,
          name: 'Model Provider',
          slug: 'model-provider',
          term_group: 0,
          term_taxonomy_id: 20,
          taxonomy: 'partner-type',
          description: '',
          parent: 0,
          count: 8,
          filter: 'raw',
        },
        icon: {
          ID: 1304,
          id: 1304,
          title: 'download__4_-removebg-preview',
          filename: 'download__4_-removebg-preview.png',
          filesize: 15632,
          url: '/website-assets/media/2025/11/download__4_-removebg-preview.png',
          link: '/?attachment_id=1304',
          alt: '',
          author: '7',
          description: '',
          caption: '',
          name: 'download__4_-removebg-preview',
          status: 'inherit',
          uploaded_to: 1197,
          date: '2025-11-24 23:22:24',
          modified: '2025-11-24 23:22:24',
          menu_order: 0,
          mime_type: 'image/png',
          type: 'image',
          subtype: 'png',
          icon: '/website-assets/media/default.png',
          width: 224,
          height: 224,
          sizes: {
            thumbnail:
              '/website-assets/media/2025/11/download__4_-removebg-preview-150x150.png',
            'thumbnail-width': 150,
            'thumbnail-height': 150,
            medium: '/website-assets/media/2025/11/download__4_-removebg-preview.png',
            'medium-width': 224,
            'medium-height': 224,
            medium_large: '/website-assets/media/2025/11/download__4_-removebg-preview.png',
            'medium_large-width': 224,
            'medium_large-height': 224,
            large: '/website-assets/media/2025/11/download__4_-removebg-preview.png',
            'large-width': 224,
            'large-height': 224,
            '1536x1536': '/website-assets/media/2025/11/download__4_-removebg-preview.png',
            '1536x1536-width': 224,
            '1536x1536-height': 224,
            '2048x2048': '/website-assets/media/2025/11/download__4_-removebg-preview.png',
            '2048x2048-width': 224,
            '2048x2048-height': 224,
          },
        },
        description:
          'The future of building happens together. Tools and trends evolve, but collaboration endures. With GitHub, developers, agents, and code come together on one platform.',
        cta: {
          title: 'Learn more',
          url: 'https://github.com/',
          target: '_blank',
        },
      },
      {
        title: 'MongoDB',
        type: {
          term_id: 20,
          name: 'Model Provider',
          slug: 'model-provider',
          term_group: 0,
          term_taxonomy_id: 20,
          taxonomy: 'partner-type',
          description: '',
          parent: 0,
          count: 8,
          filter: 'raw',
        },
        icon: {
          ID: 1303,
          id: 1303,
          title: 'download__3_-removebg-preview',
          filename: 'download__3_-removebg-preview.png',
          filesize: 26504,
          url: '/website-assets/media/2025/11/download__3_-removebg-preview.png',
          link: '/?attachment_id=1303',
          alt: '',
          author: '7',
          description: '',
          caption: '',
          name: 'download__3_-removebg-preview',
          status: 'inherit',
          uploaded_to: 1195,
          date: '2025-11-24 23:22:02',
          modified: '2025-11-24 23:22:02',
          menu_order: 0,
          mime_type: 'image/png',
          type: 'image',
          subtype: 'png',
          icon: '/website-assets/media/default.png',
          width: 225,
          height: 225,
          sizes: {
            thumbnail:
              '/website-assets/media/2025/11/download__3_-removebg-preview-150x150.png',
            'thumbnail-width': 150,
            'thumbnail-height': 150,
            medium: '/website-assets/media/2025/11/download__3_-removebg-preview.png',
            'medium-width': 225,
            'medium-height': 225,
            medium_large: '/website-assets/media/2025/11/download__3_-removebg-preview.png',
            'medium_large-width': 225,
            'medium_large-height': 225,
            large: '/website-assets/media/2025/11/download__3_-removebg-preview.png',
            'large-width': 225,
            'large-height': 225,
            '1536x1536': '/website-assets/media/2025/11/download__3_-removebg-preview.png',
            '1536x1536-width': 225,
            '1536x1536-height': 225,
            '2048x2048': '/website-assets/media/2025/11/download__3_-removebg-preview.png',
            '2048x2048-width': 225,
            '2048x2048-height': 225,
          },
        },
        description:
          'An open-source, NoSQL database program that stores data in flexible, JSON-like documents instead of the traditional tables and rows of relational databases.',
        cta: {
          title: 'Learn more',
          url: 'https://www.mongodb.com/',
          target: '_blank',
        },
      },
      {
        title: 'Snowflake',
        type: {
          term_id: 20,
          name: 'Model Provider',
          slug: 'model-provider',
          term_group: 0,
          term_taxonomy_id: 20,
          taxonomy: 'partner-type',
          description: '',
          parent: 0,
          count: 8,
          filter: 'raw',
        },
        icon: {
          ID: 1302,
          id: 1302,
          title: 'download__2_-removebg-preview',
          filename: 'download__2_-removebg-preview.png',
          filesize: 46141,
          url: '/website-assets/media/2025/11/download__2_-removebg-preview.png',
          link: '/?attachment_id=1302',
          alt: '',
          author: '7',
          description: '',
          caption: '',
          name: 'download__2_-removebg-preview',
          status: 'inherit',
          uploaded_to: 1192,
          date: '2025-11-24 23:21:42',
          modified: '2025-11-24 23:21:42',
          menu_order: 0,
          mime_type: 'image/png',
          type: 'image',
          subtype: 'png',
          icon: '/website-assets/media/default.png',
          width: 225,
          height: 225,
          sizes: {
            thumbnail:
              '/website-assets/media/2025/11/download__2_-removebg-preview-150x150.png',
            'thumbnail-width': 150,
            'thumbnail-height': 150,
            medium: '/website-assets/media/2025/11/download__2_-removebg-preview.png',
            'medium-width': 225,
            'medium-height': 225,
            medium_large: '/website-assets/media/2025/11/download__2_-removebg-preview.png',
            'medium_large-width': 225,
            'medium_large-height': 225,
            large: '/website-assets/media/2025/11/download__2_-removebg-preview.png',
            'large-width': 225,
            'large-height': 225,
            '1536x1536': '/website-assets/media/2025/11/download__2_-removebg-preview.png',
            '1536x1536-width': 225,
            '1536x1536-height': 225,
            '2048x2048': '/website-assets/media/2025/11/download__2_-removebg-preview.png',
            '2048x2048-width': 225,
            '2048x2048-height': 225,
          },
        },
        description:
          'Your Solution for Data Warehousing, Data Lakes, Data Engineering, Data Science, and More. Test Drive Snowflake and Experience How You Can Drive Your Business Forward with Data.',
        cta: {
          title: 'Learn more',
          url: 'https://signup.snowflake.com/',
          target: '_blank',
        },
      },
      {
        title: 'Databricks',
        type: {
          term_id: 20,
          name: 'Model Provider',
          slug: 'model-provider',
          term_group: 0,
          term_taxonomy_id: 20,
          taxonomy: 'partner-type',
          description: '',
          parent: 0,
          count: 8,
          filter: 'raw',
        },
        icon: {
          ID: 1300,
          id: 1300,
          title: 'download__1_-removebg-preview',
          filename: 'download__1_-removebg-preview-1.png',
          filesize: 40707,
          url: '/website-assets/media/2025/11/download__1_-removebg-preview-1.png',
          link: '/?attachment_id=1300',
          alt: '',
          author: '7',
          description: '',
          caption: '',
          name: 'download__1_-removebg-preview-2',
          status: 'inherit',
          uploaded_to: 1027,
          date: '2025-11-24 23:21:07',
          modified: '2025-11-24 23:21:07',
          menu_order: 0,
          mime_type: 'image/png',
          type: 'image',
          subtype: 'png',
          icon: '/website-assets/media/default.png',
          width: 242,
          height: 208,
          sizes: {
            thumbnail:
              '/website-assets/media/2025/11/download__1_-removebg-preview-1-150x150.png',
            'thumbnail-width': 150,
            'thumbnail-height': 150,
            medium: '/website-assets/media/2025/11/download__1_-removebg-preview-1.png',
            'medium-width': 242,
            'medium-height': 208,
            medium_large: '/website-assets/media/2025/11/download__1_-removebg-preview-1.png',
            'medium_large-width': 242,
            'medium_large-height': 208,
            large: '/website-assets/media/2025/11/download__1_-removebg-preview-1.png',
            'large-width': 242,
            'large-height': 208,
            '1536x1536': '/website-assets/media/2025/11/download__1_-removebg-preview-1.png',
            '1536x1536-width': 242,
            '1536x1536-height': 208,
            '2048x2048': '/website-assets/media/2025/11/download__1_-removebg-preview-1.png',
            '2048x2048-width': 242,
            '2048x2048-height': 208,
          },
        },
        description:
          'The Databricks. Data Intelligence Platform. Databricks brings AI to your data to help you bring AI to the world.',
        cta: {
          title: 'Learn more',
          url: 'https://www.databricks.com/',
          target: '_blank',
        },
      },
      {
        title: 'Amazon S3',
        type: {
          term_id: 20,
          name: 'Model Provider',
          slug: 'model-provider',
          term_group: 0,
          term_taxonomy_id: 20,
          taxonomy: 'partner-type',
          description: '',
          parent: 0,
          count: 8,
          filter: 'raw',
        },
        icon: {
          ID: 1301,
          id: 1301,
          title: 'download-removebg-preview',
          filename: 'download-removebg-preview-1.png',
          filesize: 30797,
          url: '/website-assets/media/2025/11/download-removebg-preview-1.png',
          link: '/?attachment_id=1301',
          alt: '',
          author: '7',
          description: '',
          caption: '',
          name: 'download-removebg-preview-2',
          status: 'inherit',
          uploaded_to: 1190,
          date: '2025-11-24 23:21:23',
          modified: '2025-11-24 23:21:23',
          menu_order: 0,
          mime_type: 'image/png',
          type: 'image',
          subtype: 'png',
          icon: '/website-assets/media/default.png',
          width: 205,
          height: 246,
          sizes: {
            thumbnail: '/website-assets/media/2025/11/download-removebg-preview-1-150x150.png',
            'thumbnail-width': 150,
            'thumbnail-height': 150,
            medium: '/website-assets/media/2025/11/download-removebg-preview-1.png',
            'medium-width': 205,
            'medium-height': 246,
            medium_large: '/website-assets/media/2025/11/download-removebg-preview-1.png',
            'medium_large-width': 205,
            'medium_large-height': 246,
            large: '/website-assets/media/2025/11/download-removebg-preview-1.png',
            'large-width': 205,
            'large-height': 246,
            '1536x1536': '/website-assets/media/2025/11/download-removebg-preview-1.png',
            '1536x1536-width': 205,
            '1536x1536-height': 246,
            '2048x2048': '/website-assets/media/2025/11/download-removebg-preview-1.png',
            '2048x2048-width': 205,
            '2048x2048-height': 246,
          },
        },
        description:
          'Amazon Simple Storage Service (Amazon S3) is an object storage service offering industry-leading scalability, data availability, security, and performance.',
        cta: {
          title: 'Learn more',
          url: 'https://aws.amazon.com/s3/',
          target: '_blank',
        },
      },
    ],
    categories: [
      {
        label: 'Model Provider',
        value: 'model-provider',
      },
    ],
  }}
/>

<ContentThreeAcrossIconTiles
  fields={{
    heading: 'Why partner with Spice AI',
    heading_tag: 'h2',
    paragraph:
      'Expand your platform, reach new customers, and enable new use cases by integrating with the Spice data and AI platform.',
    item: [
      {
        icon: {
          ID: 1164,
          id: 1164,
          title: 'Partners_Technical integration support',
          filename: 'Partners_Technical-integration-support.svg',
          filesize: 12314,
          url: '/website-assets/media/2025/11/Partners_Technical-integration-support.svg',
          link: '/website-assets/partners/attachment/partners_technical-integration-support/',
          alt: '',
          author: '6',
          description: '',
          caption: '',
          name: 'partners_technical-integration-support',
          status: 'inherit',
          uploaded_to: 1028,
          date: '2025-11-22 00:34:35',
          modified: '2025-11-22 00:34:35',
          menu_order: 0,
          mime_type: 'image/svg+xml',
          type: 'image',
          subtype: 'svg+xml',
          icon: '/website-assets/media/default.png',
          width: 0,
          height: 0,
          sizes: {
            thumbnail:
              '/website-assets/media/2025/11/Partners_Technical-integration-support.svg',
            'thumbnail-width': 1,
            'thumbnail-height': 1,
            medium: '/website-assets/media/2025/11/Partners_Technical-integration-support.svg',
            'medium-width': 1,
            'medium-height': 1,
            medium_large:
              '/website-assets/media/2025/11/Partners_Technical-integration-support.svg',
            'medium_large-width': 1,
            'medium_large-height': 1,
            large: '/website-assets/media/2025/11/Partners_Technical-integration-support.svg',
            'large-width': 1,
            'large-height': 1,
            '1536x1536':
              '/website-assets/media/2025/11/Partners_Technical-integration-support.svg',
            '1536x1536-width': 1,
            '1536x1536-height': 1,
            '2048x2048':
              '/website-assets/media/2025/11/Partners_Technical-integration-support.svg',
            '2048x2048-width': 1,
            '2048x2048-height': 1,
          },
        },
        title: 'Technical integration support',
        description:
          'Access Spice engineering resources to build deep integrations with the Spice runtime for federation, acceleration, search, or AI workloads.',
        cta: {
          title: 'Learn more',
          url: 'https://baunfire.vercel.app/contact/',
          target: '',
        },
      },
      {
        icon: {
          ID: 1163,
          id: 1163,
          title: 'Partners_Sales and GTM collaboration',
          filename: 'Partners_Sales-and-GTM-collaboration.svg',
          filesize: 4145,
          url: '/website-assets/media/2025/11/Partners_Sales-and-GTM-collaboration.svg',
          link: '/website-assets/partners/attachment/partners_sales-and-gtm-collaboration/',
          alt: '',
          author: '6',
          description: '',
          caption: '',
          name: 'partners_sales-and-gtm-collaboration',
          status: 'inherit',
          uploaded_to: 1028,
          date: '2025-11-22 00:34:34',
          modified: '2025-11-22 00:34:34',
          menu_order: 0,
          mime_type: 'image/svg+xml',
          type: 'image',
          subtype: 'svg+xml',
          icon: '/website-assets/media/default.png',
          width: 0,
          height: 0,
          sizes: {
            thumbnail:
              '/website-assets/media/2025/11/Partners_Sales-and-GTM-collaboration.svg',
            'thumbnail-width': 1,
            'thumbnail-height': 1,
            medium: '/website-assets/media/2025/11/Partners_Sales-and-GTM-collaboration.svg',
            'medium-width': 1,
            'medium-height': 1,
            medium_large:
              '/website-assets/media/2025/11/Partners_Sales-and-GTM-collaboration.svg',
            'medium_large-width': 1,
            'medium_large-height': 1,
            large: '/website-assets/media/2025/11/Partners_Sales-and-GTM-collaboration.svg',
            'large-width': 1,
            'large-height': 1,
            '1536x1536':
              '/website-assets/media/2025/11/Partners_Sales-and-GTM-collaboration.svg',
            '1536x1536-width': 1,
            '1536x1536-height': 1,
            '2048x2048':
              '/website-assets/media/2025/11/Partners_Sales-and-GTM-collaboration.svg',
            '2048x2048-width': 1,
            '2048x2048-height': 1,
          },
        },
        title: 'Co-marketing opportunities',
        description:
          'Launch joint content, demos, webinars, or partner-focused campaigns to reach developers and enterprise teams adopting modern data and AI stacks.',
        cta: {
          title: 'Learn more',
          url: 'https://baunfire.vercel.app/contact/',
          target: '',
        },
      },
      {
        icon: {
          ID: 1162,
          id: 1162,
          title: 'Partners_Co-marketing opportunities',
          filename: 'Partners_Co-marketing-opportunities.svg',
          filesize: 10175,
          url: '/website-assets/media/2025/11/Partners_Co-marketing-opportunities.svg',
          link: '/website-assets/partners/attachment/partners_co-marketing-opportunities/',
          alt: '',
          author: '6',
          description: '',
          caption: '',
          name: 'partners_co-marketing-opportunities',
          status: 'inherit',
          uploaded_to: 1028,
          date: '2025-11-22 00:34:33',
          modified: '2025-11-22 00:34:33',
          menu_order: 0,
          mime_type: 'image/svg+xml',
          type: 'image',
          subtype: 'svg+xml',
          icon: '/website-assets/media/default.png',
          width: 0,
          height: 0,
          sizes: {
            thumbnail: '/website-assets/media/2025/11/Partners_Co-marketing-opportunities.svg',
            'thumbnail-width': 1,
            'thumbnail-height': 1,
            medium: '/website-assets/media/2025/11/Partners_Co-marketing-opportunities.svg',
            'medium-width': 1,
            'medium-height': 1,
            medium_large:
              '/website-assets/media/2025/11/Partners_Co-marketing-opportunities.svg',
            'medium_large-width': 1,
            'medium_large-height': 1,
            large: '/website-assets/media/2025/11/Partners_Co-marketing-opportunities.svg',
            'large-width': 1,
            'large-height': 1,
            '1536x1536':
              '/website-assets/media/2025/11/Partners_Co-marketing-opportunities.svg',
            '1536x1536-width': 1,
            '1536x1536-height': 1,
            '2048x2048':
              '/website-assets/media/2025/11/Partners_Co-marketing-opportunities.svg',
            '2048x2048-width': 1,
            '2048x2048-height': 1,
          },
        },
        title: 'Sales and GTM collaboration',
        description:
          'Work alongside our GTM team to support shared customers, build reference architectures, and deliver solutions optimized for performance and scale.',
        cta: {
          title: 'Learn more',
          url: 'https://baunfire.vercel.app/contact/',
          target: '',
        },
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<Testimonials
  heading="Proven in production"
  headingTag="h2"
  paragraph="Enterprises trust Spice to run data-intensive workloads."
  items={["twilio","barracuda","nrc-tim"]}
/>

<TalkToAnEngineerCta />

---

## Analytics Replica
URL: https://spice.ai/platform/analytics
Date: 2026-07-08T00:00:00
Description: Add a real-time analytics replica to PostgreSQL, MySQL, and MongoDB in minutes. Spice replicates operational data with high-throughput CDC for sub-second analytics, without ETL and without load on production.

<HeroCenteredTextFullWidth
  fields={{
    heading_tag: 'h1',
    heading: 'Analytics Replica',
    paragraph:
      'Add a sandboxed, analytics-ready replica alongside PostgreSQL, MySQL, and MongoDB in minutes. Spice keeps it fresh with high-throughput change data capture for sub-second queries, no ETL, and no analytical load on your production database.',
    cta: [
      {
        type: 'filled',
        cta: {
          title: 'Get a demo',
          url: 'https://meetings.hubspot.com/vladi-semenov',
          target: '',
        },
      },
      {
        type: 'bordered',
        cta: {
          title: 'View the docs',
          url: 'https://spiceai.org/docs/features/cdc',
          target: '_blank',
        },
      },
    ],
    media_type: 'svg',
    media_video: '',
  }}
/>

<ContentThreeAcrossIconTiles
  fields={{
    heading: 'Add analytics to your operational data, without ETL',
    heading_tag: 'h2',
    paragraph:
      'Point Spice at a live operational database and it maintains a continuously-updated analytics replica. Start with one table, then compose across sources and join replicated datasets in a single SQL query.',
    item: [
      {
        icon: {
          ID: 602,
          id: 602,
          title: 'Protect production',
          filename: 'platform_federation_simplify_icon.svg',
          url: '/website-assets/media/2025/11/platform_federation_simplify_icon.svg',
          alt: '',
          name: 'platform_federation_simplify_icon',
          mime_type: 'image/svg+xml',
          type: 'image',
          subtype: 'svg+xml',
          width: 0,
          height: 0,
        },
        title: 'Zero load on production',
        description:
          'Spice replicates from the native change log, so analytical queries and AI agents run against the sandboxed replica. Your operational database never executes a single analytical query.',
        cta: {
          title: 'Explore CDC replication',
          url: 'https://spiceai.org/docs/features/cdc',
          target: '',
        },
      },
      {
        icon: {
          ID: 610,
          id: 610,
          title: 'Real-time freshness',
          filename: 'platform_federation_connect_sources_icon.svg',
          url: '/website-assets/media/2025/11/platform_federation_connect_sources_icon.svg',
          alt: '',
          name: 'platform_federation_connect_sources_icon',
          mime_type: 'image/svg+xml',
          type: 'image',
          subtype: 'svg+xml',
          width: 0,
          height: 0,
        },
        title: 'Real-time freshness,<br>no pipelines',
        description:
          'Native replication from the PostgreSQL WAL, MySQL binlog, and MongoDB oplog delivers single-digit-second freshness. No Debezium or external streaming layer required.',
        cta: {
          title: 'See real-time CDC',
          url: '/feature/real-time-change-data-capture',
          target: '',
        },
      },
      {
        icon: {
          ID: 603,
          id: 603,
          title: 'Sub-second analytics',
          filename: 'platform_federation_fast_icon.svg',
          url: '/website-assets/media/2025/11/platform_federation_fast_icon.svg',
          alt: '',
          name: 'platform_federation_fast_icon',
          mime_type: 'image/svg+xml',
          type: 'image',
          subtype: 'svg+xml',
          width: 0,
          height: 0,
        },
        title: 'Sub-second query<br>performance',
        description:
          'Spice materializes the replica with the Spice Cayenne accelerator, built on Vortex. Cayenne is 1.4x faster than DuckDB with 3x less memory, and DuckDB and SQLite are also supported.',
        cta: {
          title: 'Explore Spice Cayenne',
          url: 'https://spiceai.org/docs/components/data-accelerators/cayenne',
          target: '_blank',
        },
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<ContentStats
  fields={{
    heading: 'Real-time analytics, zero production impact',
    heading_tag: 'h2',
    stats: [
      {
        media_type: 'image',
        image: false,
        lottie: false,
        amount: '0',
        suffix: '',
        after_text: 'analytical queries run on your production database, ever',
      },
      {
        media_type: 'image',
        image: false,
        lottie: false,
        amount: '2.0',
        suffix: 's',
        after_text:
          'end-to-end freshness under load, from source commit to query-ready',
      },
      {
        media_type: 'image',
        image: false,
        lottie: false,
        amount: '1.4',
        suffix: 'x',
        after_text: 'faster than DuckDB with 3x less memory on Spice Cayenne',
      },
    ],
    padding_top: 'st-none',
    padding_bottom: 'unset',
  }}
/>

<ContentRichText
  fields={{
    coverage: 'rc-start',
    padding_top: 'st-xl',
    padding_bottom: 'unset',
  }}
/>

## How the analytics replica works

Spice adds an analytical node to your stack in three steps, and it is incrementally adoptable. Start with a single store or table, replicate its changes into a Spice dataset, then compose and join across replicated sources.

```mermaid
flowchart LR
    subgraph Operational["Operational databases"]
        PG[(PostgreSQL)]
        MY[(MySQL)]
        MG[(MongoDB)]
    end
    REPLICA["Spice analytics replica with Cayenne acceleration"]
    subgraph Clients["Analytics clients and agents"]
        BI["Power BI and Tableau"]
        PY["Python, SDKs, and notebooks"]
        AG["AI agents"]
    end
    PG -->|WAL| REPLICA
    MY -->|binlog| REPLICA
    MG -->|oplog| REPLICA
    REPLICA -->|Arrow Flight SQL, ODBC, JDBC| BI
    REPLICA -->|Arrow Flight SQL, ODBC, JDBC| PY
    REPLICA -->|Arrow Flight SQL, ODBC, JDBC| AG
```

1. **Connect.** Point Spice at an operational database. Spice bootstraps a snapshot and manages replication slots automatically.
2. **Replicate.** Committed writes, updates, and deletes stream from the native change log into an accelerated Spice dataset, with no query load on production.
3. **Query.** Run analytics with familiar SQL from any client, joining across replicated datasets and other federated sources.

For append-only sources such as Kafka, Spice also supports event-stream replication with upsert semantics. Learn more in the [Spice 2.0 launch post](/blog/spice-2-0-is-now-available) and the [SQL Federation and Acceleration](/platform/sql-federation-acceleration) platform.

<ContentRichText
  fields={{
    coverage: 'rc-end',
    padding_top: 'unset',
    padding_bottom: 'sb-xl',
  }}
/>

<ContentImageVideo
  fields={{
    variant: 'variant-1',
    heading: 'Connect the analytics tools your team already uses',
    heading_tag: 'h2',
    paragraph:
      'The replica speaks open protocols, so your existing stack connects with no rewrites. Query from Microsoft Power BI through the native Spice connector built on the Flight SQL ADBC driver, and from Tableau, Looker, and Apache Superset over Arrow Flight SQL, ODBC, and JDBC. Build in code with the SpicePy Python library, plus Go, Rust, Java, and JavaScript SDKs. Extend queries with SQL, WASM, and HTTP user-defined functions that auto-register as tools and propagate across the cluster, and federate Apache Spark through Spark Connect.',
    cta: [
      {
        type: 'filled',
        cta: {
          title: 'See all integrations',
          url: '/integrations',
          target: '',
        },
      },
      {
        type: 'bordered',
        cta: {
          title: 'Read the Power BI guide',
          url: '/blog/spice-and-power-bi',
          target: '',
        },
      },
    ],
    media_type: 'image',
    media_image: {
      ID: 2602,
      id: 2602,
      title: 'Microsoft Power BI and Spice AI',
      filename: '68cad2f64c35671cc146ea08_image-3.png',
      url: '/website-assets/media/2025/11/68cad2f64c35671cc146ea08_image-3.png',
      alt: 'Microsoft Power BI connects to Spice AI',
      name: 'powerbi-spice-ai',
      mime_type: 'image/png',
      type: 'image',
      subtype: 'png',
      width: 2404,
      height: 1262,
    },
    graphic_overlay: false,
    media_video: '',
    padding_top: 'st-lg',
    padding_bottom: 'sb-lg',
  }}
/>

<ContentImageVideo
  fields={{
    variant: 'variant-2',
    heading: 'Query operational data with SQL in the Spice portal',
    heading_tag: 'h2',
    paragraph:
      'Explore datasets, run SQL, and inspect results in the Spice Cloud portal. Built-in observability traces every query with execution timing and lineage, so you can validate freshness and tune performance against the replica instead of production.',
    cta: [
      {
        type: 'filled',
        cta: {
          title: 'Query with Spice',
          url: 'https://spiceai.org/docs/getting-started',
          target: '_blank',
        },
      },
    ],
    media_type: 'image',
    media_image: {
      ID: 2603,
      id: 2603,
      title: 'Spice portal SQL query and results',
      filename: 'spice-sql-observability-v2.png',
      url: '/website-assets/media/2026/04/spice-sql-observability-v2.png',
      alt: 'Spice AI portal running a SQL query against an accelerated dataset with results and execution timing',
      name: 'spice-sql-observability-v2',
      mime_type: 'image/png',
      type: 'image',
      subtype: 'png',
      width: 3476,
      height: 1692,
    },
    graphic_overlay: false,
    media_video: '',
    padding_top: 'st-lg',
    padding_bottom: 'sb-lg',
  }}
/>

<Testimonials
  heading="Proven in production"
  headingTag="h2"
  paragraph="Teams building real-time systems at scale run Spice to serve analytics and AI from operational data."
  items={['barracuda', 'twilio']}
/>

<AccordionFaq
  fields={{
    heading: 'FAQs',
    heading_tag: 'h2',
    paragraph:
      'Learn how an analytics replica keeps operational data query-ready without ETL or load on production.',
    items: [
      {
        title: 'What is an analytics replica?',
        paragraph:
          '<p>An analytics replica is a read-optimized, continuously-updated copy of your operational data that Spice maintains alongside your database. Analytical queries, dashboards, and AI agents run against the replica instead of production, so heavy reads never contend with your transactional workload.</p>\n',
      },
      {
        title: 'Does it add load to my production database?',
        paragraph:
          '<p>No. Spice replicates from the native change log, the PostgreSQL WAL, MySQL binlog, or MongoDB oplog, rather than polling with queries. In benchmarks the operational database sustained its full transactional workload while Spice served all analytics from the replica, and production never executed a single analytical query.</p>\n',
      },
      {
        title: 'Which databases can I replicate from?',
        paragraph:
          '<p>Spice ships native replication for PostgreSQL, MySQL, MongoDB, and DynamoDB, plus append-only event streams from systems like Kafka with upsert semantics. Debezium is also supported. See the <a href="https://spiceai.org/docs/features/cdc">CDC documentation</a> for the full list.</p>\n',
      },
      {
        title: 'How fresh is the data?',
        paragraph:
          '<p>End-to-end freshness is single-digit seconds under load, roughly 2.0 seconds for CDC covering inserts, updates, and deletes, measured from source commit to exactly-correct results on the replica.</p>\n',
      },
      {
        title: 'Do I need to build ETL pipelines?',
        paragraph:
          '<p>No. Replication is built into the runtime, so there are no external ETL jobs, no Debezium to operate, and no streaming layer to manage. It is incrementally adoptable: start with one table and expand as needed.</p>\n',
      },
      {
        title: 'Which BI tools and clients can query the replica?',
        paragraph:
          '<p>Any tool that speaks Arrow Flight SQL, ODBC, or JDBC. That includes Microsoft Power BI through the native Spice connector, along with Tableau, Looker, and Apache Superset. In code, use the SpicePy Python library or the Go, Rust, Java, and JavaScript SDKs, and extend queries with SQL, WASM, and HTTP user-defined functions.</p>\n',
      },
      {
        title: 'How fast are analytical queries?',
        paragraph:
          '<p>Sub-second on accelerated working sets. Spice materializes the replica with the Spice Cayenne accelerator, built on the Vortex columnar format, which is 1.4x faster than DuckDB with 3x less memory. DuckDB and SQLite acceleration engines are also supported.</p>\n',
      },
      {
        title: 'Is Spice open source?',
        paragraph:
          '<p>Yes. The Spice runtime is open source under the Apache 2.0 license, including federation, acceleration with Cayenne, hybrid search, and AI integration. Spice Cloud offers a fully managed option, and Spice.ai Enterprise adds self-hosted deployment with SSO, RBAC, and audit logs.</p>\n',
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<TalkToAnEngineerCta />

---

## Hybrid SQL Search
URL: https://spice.ai/platform/hybrid-sql-search
Date: 2025-11-14T14:39:28
Description: Combine vector similarity, full-text, and keyword search in one SQL query. Fast, scalable, and production-ready.

<HeroCenteredTextFullWidth
  fields={{
    heading_tag: 'h1',
    heading: 'Hybrid SQL Search',
    paragraph:
      'Combine vector similarity, full-text, and relational filters in a single SQL engine. Run hybrid search across your data-no extra pipelines or systems needed.',
    cta: [
      {
        type: 'filled',
        cta: {
          title: 'Get a demo',
          url: 'https://meetings.hubspot.com/vladi-semenov',
          target: '',
        },
      },
      {
        type: 'bordered',
        cta: {
          title: 'View the docs',
          url: 'https://docs.spice.ai/features/search-and-retrieval',
          target: '',
        },
      },
    ],
    media_type: 'image',
    media_image: {
      ID: 1656,
      id: 1656,
      title: 'Platform Search Header',
      filename: 'platform_search_header.png',
      filesize: 294919,
      url: '/website-assets/media/2025/12/platform_search_header.png',
      link: '/platform/hybrid-sql-search/attachment/platform_search_header/',
      alt: 'Diagram of Spice.ai OSS serving search and SQL queries with a local embeddings model over Amazon S3 vector buckets and databases',
      author: '6',
      description: '',
      caption: '',
      name: 'platform_search_header',
      status: 'inherit',
      uploaded_to: 542,
      date: '2025-12-04 22:31:03',
      modified: '2025-12-04 22:31:03',
      menu_order: 0,
      mime_type: 'image/png',
      type: 'image',
      subtype: 'png',
      icon: '/website-assets/media/default.png',
      width: 1360,
      height: 676,
      sizes: {
        thumbnail: '/website-assets/media/2025/12/platform_search_header.png',
        'thumbnail-width': 150,
        'thumbnail-height': 150,
        medium: '/website-assets/media/2025/12/platform_search_header.png',
        'medium-width': 300,
        'medium-height': 149,
        medium_large: '/website-assets/media/2025/12/platform_search_header.png',
        'medium_large-width': 768,
        'medium_large-height': 382,
        large: '/website-assets/media/2025/12/platform_search_header.png',
        'large-width': 1024,
        'large-height': 509,
        '1536x1536': '/website-assets/media/2025/12/platform_search_header.png',
        '1536x1536-width': 1360,
        '1536x1536-height': 676,
        '2048x2048': '/website-assets/media/2025/12/platform_search_header.png',
        '2048x2048-width': 1360,
        '2048x2048-height': 676,
      },
    },
    media_video: '',
  }}
/>

<ContentThreeAcrossIconTiles
  fields={{
    heading: 'Find what matters with hybrid search',
    heading_tag: 'h2',
    paragraph:
      'Scale to billions of embeddings and maintain control with SQL filters, joins, and ranking in a single runtime.',
    item: [
      {
        icon: {
          ID: 609,
          id: 609,
          title: 'Platform Search Relevant Results Icon',
          filename: 'platform_search_relevant_results_icon.svg',
          filesize: 5209,
          url: '/website-assets/media/2025/11/platform_search_relevant_results_icon.svg',
          link: '/platform/hybrid-sql-search/attachment/platform_search_relevant_results_icon/',
          alt: '',
          author: '6',
          description: '',
          caption: '',
          name: 'platform_search_relevant_results_icon',
          status: 'inherit',
          uploaded_to: 543,
          date: '2025-11-18 19:39:18',
          modified: '2025-11-18 19:39:18',
          menu_order: 0,
          mime_type: 'image/svg+xml',
          type: 'image',
          subtype: 'svg+xml',
          icon: '/website-assets/media/default.png',
          width: 0,
          height: 0,
          sizes: {
            thumbnail:
              '/website-assets/media/2025/11/platform_search_relevant_results_icon.svg',
            'thumbnail-width': 1,
            'thumbnail-height': 1,
            medium:
              '/website-assets/media/2025/11/platform_search_relevant_results_icon.svg',
            'medium-width': 1,
            'medium-height': 1,
            medium_large:
              '/website-assets/media/2025/11/platform_search_relevant_results_icon.svg',
            'medium_large-width': 1,
            'medium_large-height': 1,
            large:
              '/website-assets/media/2025/11/platform_search_relevant_results_icon.svg',
            'large-width': 1,
            'large-height': 1,
            '1536x1536':
              '/website-assets/media/2025/11/platform_search_relevant_results_icon.svg',
            '1536x1536-width': 1,
            '1536x1536-height': 1,
            '2048x2048':
              '/website-assets/media/2025/11/platform_search_relevant_results_icon.svg',
            '2048x2048-width': 1,
            '2048x2048-height': 1,
          },
        },
        title: 'Relevant results,<br>every time',
        description:
          'Retrieve answers that reflect context (semantic meaning) and precision (exact match).',
        cta: {
          title: 'Explore hybrid search docs',
          url: 'https://spiceai.org/docs/features/search',
          target: '',
        },
      },
      {
        icon: {
          ID: 605,
          id: 605,
          title: 'Platform Search Any Scale Icon',
          filename: 'platform_search_any_scale_icon.svg',
          filesize: 8140,
          url: '/website-assets/media/2025/11/platform_search_any_scale_icon.svg',
          link: '/platform/hybrid-sql-search/attachment/platform_search_any_scale_icon/',
          alt: '',
          author: '6',
          description: '',
          caption: '',
          name: 'platform_search_any_scale_icon',
          status: 'inherit',
          uploaded_to: 543,
          date: '2025-11-18 19:39:16',
          modified: '2025-11-18 19:39:16',
          menu_order: 0,
          mime_type: 'image/svg+xml',
          type: 'image',
          subtype: 'svg+xml',
          icon: '/website-assets/media/default.png',
          width: 0,
          height: 0,
          sizes: {
            thumbnail:
              '/website-assets/media/2025/11/platform_search_any_scale_icon.svg',
            'thumbnail-width': 1,
            'thumbnail-height': 1,
            medium:
              '/website-assets/media/2025/11/platform_search_any_scale_icon.svg',
            'medium-width': 1,
            'medium-height': 1,
            medium_large:
              '/website-assets/media/2025/11/platform_search_any_scale_icon.svg',
            'medium_large-width': 1,
            'medium_large-height': 1,
            large:
              '/website-assets/media/2025/11/platform_search_any_scale_icon.svg',
            'large-width': 1,
            'large-height': 1,
            '1536x1536':
              '/website-assets/media/2025/11/platform_search_any_scale_icon.svg',
            '1536x1536-width': 1,
            '1536x1536-height': 1,
            '2048x2048':
              '/website-assets/media/2025/11/platform_search_any_scale_icon.svg',
            '2048x2048-width': 1,
            '2048x2048-height': 1,
          },
        },
        title: 'Search at any scale',
        description:
          'Index and search billions of embeddings with low-latency, across cloud object storage or operational databases. Performance remains consistent as datasets grow.',
        cta: {
          title: 'Read the S3 Vectors guide',
          url: '/blog/getting-started-with-amazon-s3-vectors-and-spice',
          target: '',
        },
      },
      {
        icon: {
          ID: 604,
          id: 604,
          title: 'Platform Search SQL Control Icon',
          filename: 'platform_search_sql_control_icon.svg',
          filesize: 6603,
          url: '/website-assets/media/2025/11/platform_search_sql_control_icon.svg',
          link: '/platform/hybrid-sql-search/attachment/platform_search_sql_control_icon/',
          alt: '',
          author: '6',
          description: '',
          caption: '',
          name: 'platform_search_sql_control_icon',
          status: 'inherit',
          uploaded_to: 543,
          date: '2025-11-18 19:39:15',
          modified: '2025-11-18 19:39:15',
          menu_order: 0,
          mime_type: 'image/svg+xml',
          type: 'image',
          subtype: 'svg+xml',
          icon: '/website-assets/media/default.png',
          width: 0,
          height: 0,
          sizes: {
            thumbnail:
              '/website-assets/media/2025/11/platform_search_sql_control_icon.svg',
            'thumbnail-width': 1,
            'thumbnail-height': 1,
            medium:
              '/website-assets/media/2025/11/platform_search_sql_control_icon.svg',
            'medium-width': 1,
            'medium-height': 1,
            medium_large:
              '/website-assets/media/2025/11/platform_search_sql_control_icon.svg',
            'medium_large-width': 1,
            'medium_large-height': 1,
            large:
              '/website-assets/media/2025/11/platform_search_sql_control_icon.svg',
            'large-width': 1,
            'large-height': 1,
            '1536x1536':
              '/website-assets/media/2025/11/platform_search_sql_control_icon.svg',
            '1536x1536-width': 1,
            '1536x1536-height': 1,
            '2048x2048':
              '/website-assets/media/2025/11/platform_search_sql_control_icon.svg',
            '2048x2048-width': 1,
            '2048x2048-height': 1,
          },
        },
        title: 'Full SQL control',
        description:
          'Design, refine, and combine search results entirely in standard SQL.',
        cta: {
          title: 'See SQL search reference',
          url: 'https://spiceai.org/docs/reference/sql/search',
          target: '',
        },
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<CarouselHorizontalCards
  fields={{
    heading: 'Build for scale with tools developers trust',
    heading_tag: 'h2',
    paragraph:
      'A familiar, SQL-powered experience enables advanced search without leaving existing SQL workflows. Spice provides full transparency, control, and scalability with modern infrastructure behind the scenes.',
    item: [
      {
        title: 'Compose hybrid search in SQL',
        paragraph:
          'Write, filter, join, and re-rank using standard SQL commands like vector_search and text_search. Integrate advanced search directly into your analytics or application stack.',
        cta: {
          title: 'Explore search features',
          url: 'https://spiceai.org/docs/features/search',
          target: '',
        },
        image: {
          ID: 1594,
          id: 1594,
          title: 'Platform Search Hybrid Search in SQL',
          filename: 'platform_search_hybrid_search_in_sql.png',
          filesize: 249413,
          url: '/website-assets/media/2025/12/platform_search_hybrid_search_in_sql.png',
          link: '/platform/hybrid-sql-search/attachment/platform_search_hybrid_search_in_sql/',
          alt: 'SQL query fusing vector_search and text_search results with rrf() next to a ranked table of review results',
          author: '6',
          description: '',
          caption: '',
          name: 'platform_search_hybrid_search_in_sql',
          status: 'inherit',
          uploaded_to: 542,
          date: '2025-12-02 02:25:23',
          modified: '2025-12-02 02:25:23',
          menu_order: 0,
          mime_type: 'image/png',
          type: 'image',
          subtype: 'png',
          icon: '/website-assets/media/default.png',
          width: 1254,
          height: 800,
          sizes: {
            thumbnail: '/website-assets/media/2025/12/platform_search_hybrid_search_in_sql.png',
            'thumbnail-width': 150,
            'thumbnail-height': 150,
            medium: '/website-assets/media/2025/12/platform_search_hybrid_search_in_sql.png',
            'medium-width': 300,
            'medium-height': 191,
            medium_large:
              '/website-assets/media/2025/12/platform_search_hybrid_search_in_sql.png',
            'medium_large-width': 768,
            'medium_large-height': 490,
            large: '/website-assets/media/2025/12/platform_search_hybrid_search_in_sql.png',
            'large-width': 1024,
            'large-height': 653,
            '1536x1536': '/website-assets/media/2025/12/platform_search_hybrid_search_in_sql.png',
            '1536x1536-width': 1254,
            '1536x1536-height': 800,
            '2048x2048': '/website-assets/media/2025/12/platform_search_hybrid_search_in_sql.png',
            '2048x2048-width': 1254,
            '2048x2048-height': 800,
          },
        },
      },
      {
        title: 'Serve billions of records from cloud storage',
        paragraph:
          'Store, index, and retrieve embeddings with partitioned S3 vector indexing. Spice automatically manages ingest, refresh, and metadata for scalable, efficient queries.',
        cta: {
          title: 'See S3 Vectors docs',
          url: 'https://spiceai.org/docs/components/vectors/s3_vectors',
          target: '',
        },
        image: {
          ID: 1482,
          id: 1482,
          title: 'Platform Search Search Any Scale',
          filename: 'platform_search_search_any_scale.png',
          filesize: 474723,
          url: '/website-assets/media/2025/12/platform_search_search_any_scale.png',
          link: '/platform/hybrid-sql-search/attachment/platform_search_search_any_scale/',
          alt: 'Diagram of AI apps querying Amazon S3 Vectors buckets and models from OpenAI, NVIDIA NIM, and Hugging Face through Spice AI',
          author: '6',
          description: '',
          caption: '',
          name: 'platform_search_search_any_scale',
          status: 'inherit',
          uploaded_to: 542,
          date: '2025-11-27 00:20:15',
          modified: '2025-11-27 00:20:15',
          menu_order: 0,
          mime_type: 'image/png',
          type: 'image',
          subtype: 'png',
          icon: '/website-assets/media/default.png',
          width: 1470,
          height: 984,
          sizes: {
            thumbnail:
              '/website-assets/media/2025/12/platform_search_search_any_scale.png',
            'thumbnail-width': 150,
            'thumbnail-height': 150,
            medium:
              '/website-assets/media/2025/12/platform_search_search_any_scale.png',
            'medium-width': 300,
            'medium-height': 201,
            medium_large:
              '/website-assets/media/2025/12/platform_search_search_any_scale.png',
            'medium_large-width': 768,
            'medium_large-height': 514,
            large:
              '/website-assets/media/2025/12/platform_search_search_any_scale.png',
            'large-width': 1024,
            'large-height': 685,
            '1536x1536':
              '/website-assets/media/2025/12/platform_search_search_any_scale.png',
            '1536x1536-width': 1470,
            '1536x1536-height': 984,
            '2048x2048':
              '/website-assets/media/2025/12/platform_search_search_any_scale.png',
            '2048x2048-width': 1470,
            '2048x2048-height': 984,
          },
        },
      },
      {
        title: 'Fine-tune results with built-in controls',
        paragraph:
          'Spice hybrid search is fully expressed in standard SQL, letting you filter, join, re-rank with reciprocal rank fusion, and project fields within each query with zero middleware.',
        cta: {
          title: 'Explore Reciprocal Rank Fusion',
          url: 'https://spiceai.org/docs/reference/sql/search#reciprocal-rank-fusion-rrf',
          target: '',
        },
        image: {
          ID: 1481,
          id: 1481,
          title: 'Platform Search Built In Controls',
          filename: 'platform_search_built_in_controls.png',
          filesize: 212599,
          url: '/website-assets/media/2025/12/platform_search_built_in_controls.png',
          link: '/platform/hybrid-sql-search/attachment/platform_search_built_in_controls/',
          alt: 'SQL hybrid search query tuning rrf() with exponential recency decay parameters',
          author: '6',
          description: '',
          caption: '',
          name: 'platform_search_built_in_controls',
          status: 'inherit',
          uploaded_to: 542,
          date: '2025-11-27 00:20:11',
          modified: '2025-11-27 00:20:11',
          menu_order: 0,
          mime_type: 'image/png',
          type: 'image',
          subtype: 'png',
          icon: '/website-assets/media/default.png',
          width: 1470,
          height: 984,
          sizes: {
            thumbnail:
              '/website-assets/media/2025/12/platform_search_built_in_controls.png',
            'thumbnail-width': 150,
            'thumbnail-height': 150,
            medium:
              '/website-assets/media/2025/12/platform_search_built_in_controls.png',
            'medium-width': 300,
            'medium-height': 201,
            medium_large:
              '/website-assets/media/2025/12/platform_search_built_in_controls.png',
            'medium_large-width': 768,
            'medium_large-height': 514,
            large:
              '/website-assets/media/2025/12/platform_search_built_in_controls.png',
            'large-width': 1024,
            'large-height': 685,
            '1536x1536':
              '/website-assets/media/2025/12/platform_search_built_in_controls.png',
            '1536x1536-width': 1470,
            '1536x1536-height': 984,
            '2048x2048':
              '/website-assets/media/2025/12/platform_search_built_in_controls.png',
            '2048x2048-width': 1470,
            '2048x2048-height': 984,
          },
        },
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<Testimonials
  heading="Trusted in production"
  headingTag="h2"
  paragraph="Teams use Spice to replace complex search stacks with one engine that's fast, scalable, and controllable-without standing up additional systems."
  items={["basisset","nrc-tim"]}
/>

<ContentImageVideo
  fields={{
    variant: 'variant-1',
    heading: 'Integrations across all of your data sources',
    heading_tag: 'h2',
    paragraph:
      'Accelerate your data stack with a library of 40+ prebuilt connectors for the most common databases, warehouses, and file stores-from Databricks and S3 to MySQL and PostgreSQL.',
    cta: [
      {
        type: 'filled',
        cta: {
          title: 'See Integrations',
          url: '/integrations',
          target: '',
        },
      },
    ],
    media_type: 'image',
    media_image: {
      ID: 612,
      id: 612,
      title: 'Platform Integrations',
      filename: 'platform_integrations.png',
      filesize: 1330111,
      url: '/website-assets/media/2025/11/platform_integrations.png',
      link: '/platform/hybrid-sql-search/attachment/platform_integrations/',
      alt: '',
      author: '6',
      description: '',
      caption: '',
      name: 'platform_integrations',
      status: 'inherit',
      uploaded_to: 543,
      date: '2025-11-18 19:42:54',
      modified: '2025-11-18 19:42:54',
      menu_order: 0,
      mime_type: 'image/png',
      type: 'image',
      subtype: 'png',
      icon: '/website-assets/media/default.png',
      width: 1360,
      height: 1034,
      sizes: {
        thumbnail: '/website-assets/media/2025/11/platform_integrations.png',
        'thumbnail-width': 150,
        'thumbnail-height': 150,
        medium: '/website-assets/media/2025/11/platform_integrations.png',
        'medium-width': 300,
        'medium-height': 228,
        medium_large: '/website-assets/media/2025/11/platform_integrations.png',
        'medium_large-width': 768,
        'medium_large-height': 584,
        large: '/website-assets/media/2025/11/platform_integrations.png',
        'large-width': 1024,
        'large-height': 779,
        '1536x1536': '/website-assets/media/2025/11/platform_integrations.png',
        '1536x1536-width': 1360,
        '1536x1536-height': 1034,
        '2048x2048': '/website-assets/media/2025/11/platform_integrations.png',
        '2048x2048-width': 1360,
        '2048x2048-height': 1034,
      },
    },
    graphic_overlay: false,
    media_video: '',
    padding_top: 'st-lg',
    padding_bottom: 'sb-lg',
  }}
/>

<AccordionFaq
  fields={{
    heading: 'FAQs',
    heading_tag: 'h2',
    paragraph: '',
    items: [
      {
        title: 'How does hybrid search work?',
        paragraph:
          '<p>Hybrid search in Spice.ai merges vector similarity (semantic) and full-text BM25 (keyword) results into one ranked output. Both search types run in parallel, and their ranks are combined using Reciprocal Rank Fusion (RRF) for optimal relevance.</p>\n<p>You can query this through the /v1/search API or with SQL functions like vector_search() and text_search(). Because results are treated as tables, you can filter, join, and aggregate just like any SQL dataset.</p>\n',
      },
      {
        title: 'How is Spice.ai different from a vector database?',
        paragraph:
          '<p>Traditional vector databases require you to pair a vector index with separate text and keyword search systems, all running on clusters you have to provision and maintain. Spice.ai unifies vector, text, and relational search in a single runtime that you can deploy locally, in your cloud, or fully managed.</p>\n<p>You can join vector results with structured data, apply SQL filters, and run inference on top of them, all without moving data or managing multiple systems. For developers, this means a single query layer that delivers the power of a vector database, the flexibility of SQL, and the speed of an accelerated cache.</p>\n',
      },
      {
        title: 'When should I use S3 Vectors?',
        paragraph:
          "<p>Use S3 Vectors when you need to store and query embeddings at large scale. It's ideal for workloads with millions or billions of vectors that don't need always-on compute. By offloading storage and similarity search to S3 Vectors, you get the scalability and durability of S3 with sub-second queries via transient compute. Spice manages the entire lifecycle: embedding, indexing, filtering, and query orchestration.</p>\n",
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<TalkToAnEngineerCta />

---

## LLM Inference
URL: https://spice.ai/platform/llm-inference
Date: 2025-10-29T14:30:24
Description: Call LLMs directly from SQL. Generate, summarize, and enrich data inline using the SQL AI function or natural language queries.

<HeroCenteredTextFullWidth
  fields={{
    heading_tag: 'h1',
    heading: 'Bring AI to your SQL queries',
    paragraph:
      'Spice transforms SQL into your interface for AI. Call models like OpenAI, Anthropic, or Bedrock with the AI() SQL function to generate text, classify data, and enrich results.',
    cta: [
      {
        type: 'filled',
        cta: {
          title: 'Get a demo',
          url: 'https://meetings.hubspot.com/vladi-semenov',
          target: '',
        },
      },
      {
        type: 'bordered',
        cta: {
          title: 'View the docs',
          url: 'https://spiceai.org/docs/reference/sql/ai',
          target: '',
        },
      },
    ],
    media_type: 'image',
    media_image: {
      ID: 1498,
      id: 1498,
      title: 'Platform LLM Header',
      filename: 'platform_llm_header.png',
      filesize: 352263,
      url: '/website-assets/media/2025/11/platform_llm_header.png',
      link: '/platform/llm-inference/attachment/platform_llm_header/',
      alt: 'Diagram of apps calling LLM providers OpenAI, Anthropic, xAI, and NVIDIA NIM through the Spice.ai runtime',
      author: '6',
      description: '',
      caption: '',
      name: 'platform_llm_header',
      status: 'inherit',
      uploaded_to: 406,
      date: '2025-11-27 16:09:12',
      modified: '2025-11-27 16:09:12',
      menu_order: 0,
      mime_type: 'image/png',
      type: 'image',
      subtype: 'png',
      icon: '/website-assets/media/default.png',
      width: 1360,
      height: 654,
      sizes: {
        thumbnail: '/website-assets/media/2025/11/platform_llm_header.png',
        'thumbnail-width': 150,
        'thumbnail-height': 150,
        medium: '/website-assets/media/2025/11/platform_llm_header.png',
        'medium-width': 300,
        'medium-height': 144,
        medium_large: '/website-assets/media/2025/11/platform_llm_header.png',
        'medium_large-width': 768,
        'medium_large-height': 369,
        large: '/website-assets/media/2025/11/platform_llm_header.png',
        'large-width': 1024,
        'large-height': 492,
        '1536x1536': '/website-assets/media/2025/11/platform_llm_header.png',
        '1536x1536-width': 1360,
        '1536x1536-height': 654,
        '2048x2048': '/website-assets/media/2025/11/platform_llm_header.png',
        '2048x2048-width': 1360,
        '2048x2048-height': 654,
      },
    },
    media_video: '',
  }}
/>

<ContentThreeAcrossIconTiles
  fields={{
    heading: 'AI where your data lives',
    heading_tag: 'h2',
    paragraph:
      'Generate insights, build autonomous agents, and enrich results-directly from the tools and SQL workflows you already rely on.',
    item: [
      {
        icon: {
          ID: 608,
          id: 608,
          title: 'Platform LLM Accelerate Icon',
          filename: 'platform_llm_accelerate_icon.svg',
          filesize: 3153,
          url: '/website-assets/media/2025/11/platform_llm_accelerate_icon.svg',
          link: '/platform/llm-inference/attachment/platform_llm_accelerate_icon/',
          alt: '',
          author: '6',
          description: '',
          caption: '',
          name: 'platform_llm_accelerate_icon',
          status: 'inherit',
          uploaded_to: 543,
          date: '2025-11-18 19:39:18',
          modified: '2025-11-18 19:39:18',
          menu_order: 0,
          mime_type: 'image/svg+xml',
          type: 'image',
          subtype: 'svg+xml',
          icon: '/website-assets/media/default.png',
          width: 0,
          height: 0,
          sizes: {
            thumbnail:
              '/website-assets/media/2025/11/platform_llm_accelerate_icon.svg',
            'thumbnail-width': 1,
            'thumbnail-height': 1,
            medium:
              '/website-assets/media/2025/11/platform_llm_accelerate_icon.svg',
            'medium-width': 1,
            'medium-height': 1,
            medium_large:
              '/website-assets/media/2025/11/platform_llm_accelerate_icon.svg',
            'medium_large-width': 1,
            'medium_large-height': 1,
            large:
              '/website-assets/media/2025/11/platform_llm_accelerate_icon.svg',
            'large-width': 1,
            'large-height': 1,
            '1536x1536':
              '/website-assets/media/2025/11/platform_llm_accelerate_icon.svg',
            '1536x1536-width': 1,
            '1536x1536-height': 1,
            '2048x2048':
              '/website-assets/media/2025/11/platform_llm_accelerate_icon.svg',
            '2048x2048-width': 1,
            '2048x2048-height': 1,
          },
        },
        title: 'Accelerate data analysis',
        description:
          'Call large language models inline using SQL functions to summarize, translate, or classify data with no external APIs or glue code.',
        cta: {
          title: 'Explore SQL AI functions',
          url: 'https://spiceai.org/docs/reference/sql/ai',
          target: '',
        },
      },
      {
        icon: {
          ID: 607,
          id: 607,
          title: 'Platform LLM Combine Data AI Icon',
          filename: 'platform_llm_combine_data_ai_icon.svg',
          filesize: 2889,
          url: '/website-assets/media/2025/11/platform_llm_combine_data_ai_icon.svg',
          link: '/platform/llm-inference/attachment/platform_llm_combine_data_ai_icon/',
          alt: '',
          author: '6',
          description: '',
          caption: '',
          name: 'platform_llm_combine_data_ai_icon',
          status: 'inherit',
          uploaded_to: 543,
          date: '2025-11-18 19:39:17',
          modified: '2025-11-18 19:39:17',
          menu_order: 0,
          mime_type: 'image/svg+xml',
          type: 'image',
          subtype: 'svg+xml',
          icon: '/website-assets/media/default.png',
          width: 0,
          height: 0,
          sizes: {
            thumbnail:
              '/website-assets/media/2025/11/platform_llm_combine_data_ai_icon.svg',
            'thumbnail-width': 1,
            'thumbnail-height': 1,
            medium:
              '/website-assets/media/2025/11/platform_llm_combine_data_ai_icon.svg',
            'medium-width': 1,
            'medium-height': 1,
            medium_large:
              '/website-assets/media/2025/11/platform_llm_combine_data_ai_icon.svg',
            'medium_large-width': 1,
            'medium_large-height': 1,
            large:
              '/website-assets/media/2025/11/platform_llm_combine_data_ai_icon.svg',
            'large-width': 1,
            'large-height': 1,
            '1536x1536':
              '/website-assets/media/2025/11/platform_llm_combine_data_ai_icon.svg',
            '1536x1536-width': 1,
            '1536x1536-height': 1,
            '2048x2048':
              '/website-assets/media/2025/11/platform_llm_combine_data_ai_icon.svg',
            '2048x2048-width': 1,
            '2048x2048-height': 1,
          },
        },
        title: 'Combine data and AI<br>in one workflow',
        description:
          'Avoid context switching and integrate AI with standard SQL operations. Chain model responses to filters, joins, or aggregations to build RAG pipelines.',
        cta: {
          title: 'Explore SQL AI functions',
          url: 'https://spiceai.org/docs/reference/sql/ai',
          target: '',
        },
      },
      {
        icon: {
          ID: 606,
          id: 606,
          title: 'Platform LLM Governance Icon',
          filename: 'platform_llm_governance_icon.svg',
          filesize: 5586,
          url: '/website-assets/media/2025/11/platform_llm_governance_icon.svg',
          link: '/platform/llm-inference/attachment/platform_llm_governance_icon/',
          alt: '',
          author: '6',
          description: '',
          caption: '',
          name: 'platform_llm_governance_icon',
          status: 'inherit',
          uploaded_to: 543,
          date: '2025-11-18 19:39:16',
          modified: '2025-11-18 19:39:16',
          menu_order: 0,
          mime_type: 'image/svg+xml',
          type: 'image',
          subtype: 'svg+xml',
          icon: '/website-assets/media/default.png',
          width: 0,
          height: 0,
          sizes: {
            thumbnail:
              '/website-assets/media/2025/11/platform_llm_governance_icon.svg',
            'thumbnail-width': 1,
            'thumbnail-height': 1,
            medium:
              '/website-assets/media/2025/11/platform_llm_governance_icon.svg',
            'medium-width': 1,
            'medium-height': 1,
            medium_large:
              '/website-assets/media/2025/11/platform_llm_governance_icon.svg',
            'medium_large-width': 1,
            'medium_large-height': 1,
            large:
              '/website-assets/media/2025/11/platform_llm_governance_icon.svg',
            'large-width': 1,
            'large-height': 1,
            '1536x1536':
              '/website-assets/media/2025/11/platform_llm_governance_icon.svg',
            '1536x1536-width': 1,
            '1536x1536-height': 1,
            '2048x2048':
              '/website-assets/media/2025/11/platform_llm_governance_icon.svg',
            '2048x2048-width': 1,
            '2048x2048-height': 1,
          },
        },
        title: 'Maintain data governance<br>& security',
        description:
          'All AI-driven operations are performed within your governed SQL environment, so data never leaves your compliance boundaries and access is fully auditable.',
        cta: {
          title: 'Explore secure AI sandboxing',
          url: '/feature/secure-ai-sandboxing',
          target: '',
        },
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<CarouselHorizontalCards
  fields={{
    heading: 'AI engine designed for developers',
    heading_tag: 'h2',
    paragraph:
      'Spice makes AI a native part of SQL with built-in model functions, prompt execution, and inference orchestration.',
    item: [
      {
        title: 'AI(), the SQL Function for LLMs',
        paragraph:
          'Use the AI() SQL function to query OpenAI, Anthropic, Bedrock, or any custom LLM endpoint. Spice handles tokenization, context management, and streaming responses.',
        cta: {
          title: 'Explore the AI() function',
          url: 'https://spiceai.org/docs/reference/sql/ai',
          target: '',
        },
        image: {
          ID: 1485,
          id: 1485,
          title: 'Platform LLM Text to SQL',
          filename: 'platform_llm_text_to_sql.png',
          filesize: 192521,
          url: '/website-assets/media/2025/11/platform_llm_text_to_sql.png',
          link: '/platform/llm-inference/attachment/platform_llm_text_to_sql/',
          alt: 'SQL query calling the ai() function with gpt-4o-mini to generate alternative search terms',
          author: '6',
          description: '',
          caption: '',
          name: 'platform_llm_text_to_sql',
          status: 'inherit',
          uploaded_to: 406,
          date: '2025-11-27 00:22:01',
          modified: '2025-11-27 00:22:01',
          menu_order: 0,
          mime_type: 'image/png',
          type: 'image',
          subtype: 'png',
          icon: '/website-assets/media/default.png',
          width: 1254,
          height: 800,
          sizes: {
            thumbnail:
              '/website-assets/media/2025/11/platform_llm_text_to_sql.png',
            'thumbnail-width': 150,
            'thumbnail-height': 150,
            medium:
              '/website-assets/media/2025/11/platform_llm_text_to_sql.png',
            'medium-width': 300,
            'medium-height': 191,
            medium_large:
              '/website-assets/media/2025/11/platform_llm_text_to_sql.png',
            'medium_large-width': 768,
            'medium_large-height': 490,
            large:
              '/website-assets/media/2025/11/platform_llm_text_to_sql.png',
            'large-width': 1024,
            'large-height': 653,
            '1536x1536':
              '/website-assets/media/2025/11/platform_llm_text_to_sql.png',
            '1536x1536-width': 1254,
            '1536x1536-height': 800,
            '2048x2048':
              '/website-assets/media/2025/11/platform_llm_text_to_sql.png',
            '2048x2048-width': 1254,
            '2048x2048-height': 800,
          },
        },
      },
      {
        title: 'Native Text-to-SQL generation',
        paragraph:
          'Use natural-language prompts to generate SQL queries automatically. Spice leverages an LLM to interpret intent and produce valid, optimized SQL against your connected datasets.',
        cta: {
          title: 'Explore AI model serving',
          url: '/feature/ai-model-serving',
          target: '',
        },
        image: {
          ID: 1483,
          id: 1483,
          title: 'Platform LLM AI Function',
          filename: 'platform_llm_ai_function.png',
          filesize: 135058,
          url: '/website-assets/media/2025/11/platform_llm_ai_function.png',
          link: '/platform/llm-inference/attachment/platform_llm_ai_function/',
          alt: 'Natural language question sent to the Spice /v1/nsql endpoint returning vendor trip counts as JSON',
          author: '6',
          description: '',
          caption: '',
          name: 'platform_llm_ai_function',
          status: 'inherit',
          uploaded_to: 406,
          date: '2025-11-27 00:21:55',
          modified: '2025-11-27 00:21:55',
          menu_order: 0,
          mime_type: 'image/png',
          type: 'image',
          subtype: 'png',
          icon: '/website-assets/media/default.png',
          width: 1254,
          height: 800,
          sizes: {
            thumbnail:
              '/website-assets/media/2025/11/platform_llm_ai_function.png',
            'thumbnail-width': 150,
            'thumbnail-height': 150,
            medium:
              '/website-assets/media/2025/11/platform_llm_ai_function.png',
            'medium-width': 300,
            'medium-height': 191,
            medium_large:
              '/website-assets/media/2025/11/platform_llm_ai_function.png',
            'medium_large-width': 768,
            'medium_large-height': 490,
            large:
              '/website-assets/media/2025/11/platform_llm_ai_function.png',
            'large-width': 1024,
            'large-height': 653,
            '1536x1536':
              '/website-assets/media/2025/11/platform_llm_ai_function.png',
            '1536x1536-width': 1254,
            '1536x1536-height': 800,
            '2048x2048':
              '/website-assets/media/2025/11/platform_llm_ai_function.png',
            '2048x2048-width': 1254,
            '2048x2048-height': 800,
          },
        },
      },
      {
        title: 'AI sandboxing for least-privilege access',
        paragraph:
          'Define governed AI sandboxes as intermediary access points. Spice lets teams expose only specific table, column, or row access to LLM queries without exposing production databases.',
        cta: {
          title: 'Explore secure AI sandboxing',
          url: '/feature/secure-ai-sandboxing',
          target: '',
        },
        image: {
          ID: 1484,
          id: 1484,
          title: 'Platform LLM Sandboxing',
          filename: 'platform_llm_sandboxing.png',
          filesize: 332867,
          url: '/website-assets/media/2025/11/platform_llm_sandboxing.png',
          link: '/platform/llm-inference/attachment/platform_llm_sandboxing/',
          alt: 'Diagram of a governed Spice.ai sandbox connecting Amazon S3, Snowflake, and PostgreSQL to OpenAI and Anthropic models behind a firewall',
          author: '6',
          description: '',
          caption: '',
          name: 'platform_llm_sandboxing',
          status: 'inherit',
          uploaded_to: 406,
          date: '2025-11-27 00:21:58',
          modified: '2025-11-27 00:21:58',
          menu_order: 0,
          mime_type: 'image/png',
          type: 'image',
          subtype: 'png',
          icon: '/website-assets/media/default.png',
          width: 1254,
          height: 800,
          sizes: {
            thumbnail:
              '/website-assets/media/2025/11/platform_llm_sandboxing.png',
            'thumbnail-width': 150,
            'thumbnail-height': 150,
            medium:
              '/website-assets/media/2025/11/platform_llm_sandboxing.png',
            'medium-width': 300,
            'medium-height': 191,
            medium_large:
              '/website-assets/media/2025/11/platform_llm_sandboxing.png',
            'medium_large-width': 768,
            'medium_large-height': 490,
            large:
              '/website-assets/media/2025/11/platform_llm_sandboxing.png',
            'large-width': 1024,
            'large-height': 653,
            '1536x1536':
              '/website-assets/media/2025/11/platform_llm_sandboxing.png',
            '1536x1536-width': 1254,
            '1536x1536-height': 800,
            '2048x2048':
              '/website-assets/media/2025/11/platform_llm_sandboxing.png',
            '2048x2048-width': 1254,
            '2048x2048-height': 800,
          },
        },
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<Testimonials
  heading="Trusted by developers building production AI"
  headingTag="h2"
  paragraph="Teams use Spice to integrate AI directly into SQL workflows-accelerating development and eliminating redundant pipelines."
  items={["nrc-tim","basisset"]}
/>

<ContentImageVideo
  fields={{
    variant: 'variant-1',
    heading: 'Integrations across all of your data sources',
    heading_tag: 'h2',
    paragraph:
      'Built-in connectors for 40+ modern and legacy sources, from Databricks and S3 to MySQL and PostgreSQL, with provider-agnostic support for major LLM APIs.',
    cta: [
      {
        type: 'filled',
        cta: {
          title: 'See connectors',
          url: '/integrations',
          target: '',
        },
      },
    ],
    media_type: 'image',
    media_image: {
      ID: 612,
      id: 612,
      title: 'Platform Integrations',
      filename: 'platform_integrations.png',
      filesize: 1330111,
      url: '/website-assets/media/2025/11/platform_integrations.png',
      link: '/platform/llm-inference/attachment/platform_integrations/',
      alt: '',
      author: '6',
      description: '',
      caption: '',
      name: 'platform_integrations',
      status: 'inherit',
      uploaded_to: 543,
      date: '2025-11-18 19:42:54',
      modified: '2025-11-18 19:42:54',
      menu_order: 0,
      mime_type: 'image/png',
      type: 'image',
      subtype: 'png',
      icon: '/website-assets/media/default.png',
      width: 1360,
      height: 1034,
      sizes: {
        thumbnail: '/website-assets/media/2025/11/platform_integrations.png',
        'thumbnail-width': 150,
        'thumbnail-height': 150,
        medium: '/website-assets/media/2025/11/platform_integrations.png',
        'medium-width': 300,
        'medium-height': 228,
        medium_large: '/website-assets/media/2025/11/platform_integrations.png',
        'medium_large-width': 768,
        'medium_large-height': 584,
        large: '/website-assets/media/2025/11/platform_integrations.png',
        'large-width': 1024,
        'large-height': 779,
        '1536x1536': '/website-assets/media/2025/11/platform_integrations.png',
        '1536x1536-width': 1360,
        '1536x1536-height': 1034,
        '2048x2048': '/website-assets/media/2025/11/platform_integrations.png',
        '2048x2048-width': 1360,
        '2048x2048-height': 1034,
      },
    },
    graphic_overlay: false,
    media_video: '',
    padding_top: 'st-lg',
    padding_bottom: 'sb-lg',
  }}
/>

<AccordionFaq
  fields={{
    heading: 'FAQs',
    heading_tag: 'h2',
    paragraph: 'Answers to common questions about calling LLMs from SQL',
    items: [
      {
        title: 'What is the AI() function?',
        paragraph:
          '<p>AI() is a built-in Spice function that lets you call large language models directly inside SQL queries. It takes a prompt (and optional data columns) as input and returns model completions as query results. This allows you to summarize, translate, generate, or classify text inline without additional code or API management.</p>\n',
      },
      {
        title: 'How does text-to-SQL work?',
        paragraph:
          '<p>Spice uses your preferred LLM to convert prompts into executable SQL. Results are constrained to your connected datasets and subject to all existing SQL permissions and governance rules.</p>\n',
      },
      {
        title: 'Can I use different model providers?',
        paragraph:
          '<p>Yes. Spice abstracts model providers behind a common interface via <a href="/feature/ai-model-serving">AI model serving</a>; select OpenAI, Anthropic, Bedrock, or your custom model by name in each call. This keeps your SQL portable and futureproof.</p>\n',
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<TalkToAnEngineerCta />

---

## SQL Federation & Acceleration
URL: https://spice.ai/platform/sql-federation-acceleration
Date: 2025-11-14T14:40:16
Description: Query any data source with sub-second speed. Spice combines SQL federation and acceleration in a single runtime with zero ETL.

<HeroCenteredTextFullWidth
  fields={{
    heading_tag: 'h1',
    heading: 'SQL Federation & Acceleration',
    paragraph:
      'Federate across data warehouses, data lakes, operational databases, and services, and accelerate data locally for sub-second performance.',
    cta: [
      {
        type: 'filled',
        cta: {
          title: 'Get a demo',
          url: 'https://meetings.hubspot.com/vladi-semenov',
          target: '',
        },
      },
      {
        type: 'bordered',
        cta: {
          title: 'View the docs',
          url: 'https://spiceai.org/docs/features/query-federation',
          target: '',
        },
      },
    ],
    media_type: 'image',
    media_image: {
      ID: 1392,
      id: 1392,
      title: 'Platform Federation Header',
      filename: 'platform_federation_header.png',
      filesize: 403715,
      url: '/website-assets/media/2025/11/platform_federation_header.png',
      link: '/platform/sql-federation-acceleration/attachment/platform_federation_header/',
      alt: 'Diagram of Spice.ai federating queries across Snowflake, Amazon S3, and PostgreSQL with DuckDB, SQLite, and Cayenne acceleration',
      author: '6',
      description: '',
      caption: '',
      name: 'platform_federation_header',
      status: 'inherit',
      uploaded_to: 543,
      date: '2025-11-26 15:50:02',
      modified: '2025-11-26 15:50:02',
      menu_order: 0,
      mime_type: 'image/png',
      type: 'image',
      subtype: 'png',
      icon: '/website-assets/media/default.png',
      width: 1360,
      height: 688,
      sizes: {
        thumbnail: '/website-assets/media/2025/11/platform_federation_header.png',
        'thumbnail-width': 150,
        'thumbnail-height': 150,
        medium: '/website-assets/media/2025/11/platform_federation_header.png',
        'medium-width': 300,
        'medium-height': 152,
        medium_large: '/website-assets/media/2025/11/platform_federation_header.png',
        'medium_large-width': 768,
        'medium_large-height': 388,
        large: '/website-assets/media/2025/11/platform_federation_header.png',
        'large-width': 1024,
        'large-height': 518,
        '1536x1536': '/website-assets/media/2025/11/platform_federation_header.png',
        '1536x1536-width': 1360,
        '1536x1536-height': 688,
        '2048x2048': '/website-assets/media/2025/11/platform_federation_header.png',
        '2048x2048-width': 1360,
        '2048x2048-height': 688,
      },
    },
    media_video: '',
  }}
/>

<ContentThreeAcrossIconTiles
  fields={{
    heading: 'Federate and accelerate in a single runtime',
    heading_tag: 'h2',
    paragraph:
      'Consolidate operational, analytical, and object store data into a governed and accelerated SQL layer.',
    item: [
      {
        icon: {
          ID: 610,
          id: 610,
          title: 'Platform Federation Connect Sources Icon',
          filename: 'platform_federation_connect_sources_icon.svg',
          filesize: 6149,
          url: '/website-assets/media/2025/11/platform_federation_connect_sources_icon.svg',
          link: '/platform/sql-federation-acceleration/attachment/platform_federation_connect_sources_icon/',
          alt: '',
          author: '6',
          description: '',
          caption: '',
          name: 'platform_federation_connect_sources_icon',
          status: 'inherit',
          uploaded_to: 543,
          date: '2025-11-18 19:39:19',
          modified: '2025-11-18 19:39:19',
          menu_order: 0,
          mime_type: 'image/svg+xml',
          type: 'image',
          subtype: 'svg+xml',
          icon: '/website-assets/media/default.png',
          width: 0,
          height: 0,
          sizes: {
            thumbnail:
              '/website-assets/media/2025/11/platform_federation_connect_sources_icon.svg',
            'thumbnail-width': 1,
            'thumbnail-height': 1,
            medium:
              '/website-assets/media/2025/11/platform_federation_connect_sources_icon.svg',
            'medium-width': 1,
            'medium-height': 1,
            medium_large:
              '/website-assets/media/2025/11/platform_federation_connect_sources_icon.svg',
            'medium_large-width': 1,
            'medium_large-height': 1,
            large:
              '/website-assets/media/2025/11/platform_federation_connect_sources_icon.svg',
            'large-width': 1,
            'large-height': 1,
            '1536x1536':
              '/website-assets/media/2025/11/platform_federation_connect_sources_icon.svg',
            '1536x1536-width': 1,
            '1536x1536-height': 1,
            '2048x2048':
              '/website-assets/media/2025/11/platform_federation_connect_sources_icon.svg',
            '2048x2048-width': 1,
            '2048x2048-height': 1,
          },
        },
        title: 'Easily connect to disparate<br>data sources',
        description:
          'Query across data lakes, operational databases, and analytical warehouses. Join, aggregate, and analyze without data movement.',
        cta: {
          title: 'Explore federated SQL query',
          url: 'https://docs.spice.ai/features/federated-sql-query',
          target: '',
        },
      },
      {
        icon: {
          ID: 603,
          id: 603,
          title: 'Platform Federation Fast Icon',
          filename: 'platform_federation_fast_icon.svg',
          filesize: 8658,
          url: '/website-assets/media/2025/11/platform_federation_fast_icon.svg',
          link: '/platform/sql-federation-acceleration/attachment/platform_federation_fast_icon/',
          alt: '',
          author: '6',
          description: '',
          caption: '',
          name: 'platform_federation_fast_icon',
          status: 'inherit',
          uploaded_to: 543,
          date: '2025-11-18 19:39:14',
          modified: '2025-11-18 19:39:14',
          menu_order: 0,
          mime_type: 'image/svg+xml',
          type: 'image',
          subtype: 'svg+xml',
          icon: '/website-assets/media/default.png',
          width: 0,
          height: 0,
          sizes: {
            thumbnail:
              '/website-assets/media/2025/11/platform_federation_fast_icon.svg',
            'thumbnail-width': 1,
            'thumbnail-height': 1,
            medium:
              '/website-assets/media/2025/11/platform_federation_fast_icon.svg',
            'medium-width': 1,
            'medium-height': 1,
            medium_large:
              '/website-assets/media/2025/11/platform_federation_fast_icon.svg',
            'medium_large-width': 1,
            'medium_large-height': 1,
            large:
              '/website-assets/media/2025/11/platform_federation_fast_icon.svg',
            'large-width': 1,
            'large-height': 1,
            '1536x1536':
              '/website-assets/media/2025/11/platform_federation_fast_icon.svg',
            '1536x1536-width': 1,
            '1536x1536-height': 1,
            '2048x2048':
              '/website-assets/media/2025/11/platform_federation_fast_icon.svg',
            '2048x2048-width': 1,
            '2048x2048-height': 1,
          },
        },
        title: 'Deliver sub-second<br>query performance',
        description:
          'Accelerate frequently-accessed data by materializing and indexing hot tables with local engines like DuckDB and SQLite.',
        cta: {
          title: 'Explore data acceleration',
          url: 'https://docs.spice.ai/features/data-acceleration',
          target: '',
        },
      },
      {
        icon: {
          ID: 602,
          id: 602,
          title: 'Platform Federation Simplify Icon',
          filename: 'platform_federation_simplify_icon.svg',
          filesize: 2610,
          url: '/website-assets/media/2025/11/platform_federation_simplify_icon.svg',
          link: '/platform/sql-federation-acceleration/attachment/platform_federation_simplify_icon/',
          alt: '',
          author: '6',
          description: '',
          caption: '',
          name: 'platform_federation_simplify_icon',
          status: 'inherit',
          uploaded_to: 543,
          date: '2025-11-18 19:39:14',
          modified: '2025-11-18 19:39:14',
          menu_order: 0,
          mime_type: 'image/svg+xml',
          type: 'image',
          subtype: 'svg+xml',
          icon: '/website-assets/media/default.png',
          width: 0,
          height: 0,
          sizes: {
            thumbnail:
              '/website-assets/media/2025/11/platform_federation_simplify_icon.svg',
            'thumbnail-width': 1,
            'thumbnail-height': 1,
            medium:
              '/website-assets/media/2025/11/platform_federation_simplify_icon.svg',
            'medium-width': 1,
            'medium-height': 1,
            medium_large:
              '/website-assets/media/2025/11/platform_federation_simplify_icon.svg',
            'medium_large-width': 1,
            'medium_large-height': 1,
            large:
              '/website-assets/media/2025/11/platform_federation_simplify_icon.svg',
            'large-width': 1,
            'large-height': 1,
            '1536x1536':
              '/website-assets/media/2025/11/platform_federation_simplify_icon.svg',
            '1536x1536-width': 1,
            '1536x1536-height': 1,
            '2048x2048':
              '/website-assets/media/2025/11/platform_federation_simplify_icon.svg',
            '2048x2048-width': 1,
            '2048x2048-height': 1,
          },
        },
        title: 'Simplify your data stack',
        description:
          'Replace multiple engines, ETL jobs, and custom caches with one lightweight runtime that handles federation, acceleration, and hybrid search in a single environment.',
        cta: {
          title: 'Get started with Spice',
          url: 'https://spiceai.org/docs/getting-started',
          target: '',
        },
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<ContentStats
  fields={{
    heading: 'Do more with your data',
    heading_tag: 'h2',
    stats: [
      {
        media_type: 'image',
        image: false,
        lottie: false,
        amount: '100',
        suffix: 'x',
        after_text: 'Up to 100x faster queries',
      },
      {
        media_type: 'image',
        image: false,
        lottie: false,
        amount: 'Up to 80',
        suffix: '%',
        after_text: 'up to 80% cost savings on data lakehouse spend',
      },
      {
        media_type: 'image',
        image: false,
        lottie: false,
        amount: '2',
        suffix: 'x',
        after_text: 'Increase in data reliability',
      },
    ],
    padding_top: 'st-none',
    padding_bottom: 'unset',
  }}
/>

<CarouselHorizontalCards
  fields={{
    heading: 'Engineered for the enterprise',
    heading_tag: 'h2',
    paragraph:
      'Spice enables data and AI teams to build, scale, and operate production-grade systems without the overhead and complexity of traditional query engines',
    item: [
      {
        title: 'Familiar open-source tooling',
        paragraph:
          'Connect via JDBC, ODBC, or Arrow Flight to consolidate data from legacy and modern systems. Transform slow or distributed data into fast, interactive experiences using modern open-source engines like Apache DataFusion, DuckDB, and SQLite.',
        cta: {
          title: 'Read the docs',
          url: 'https://spiceai.org/docs',
          target: '',
        },
        image: {
          ID: 1395,
          id: 1395,
          title: 'Platform Federation Open Source',
          filename: 'platform_federation_open_source.png',
          filesize: 455917,
          url: '/website-assets/media/2025/11/platform_federation_open_source.png',
          link: '/platform/sql-federation-acceleration/attachment/platform_federation_open_source/',
          alt: 'Grid of open-source project logos including Apache DataFusion, Apache Arrow, DuckDB, SQLite, PostgreSQL, Kafka, Debezium, Parquet, and Vortex',
          author: '6',
          description: '',
          caption: '',
          name: 'platform_federation_open_source',
          status: 'inherit',
          uploaded_to: 543,
          date: '2025-11-26 15:53:24',
          modified: '2025-11-26 15:53:24',
          menu_order: 0,
          mime_type: 'image/png',
          type: 'image',
          subtype: 'png',
          icon: '/website-assets/media/default.png',
          width: 1254,
          height: 800,
          sizes: {
            thumbnail: '/website-assets/media/2025/11/platform_federation_open_source.png',
            'thumbnail-width': 150,
            'thumbnail-height': 150,
            medium: '/website-assets/media/2025/11/platform_federation_open_source.png',
            'medium-width': 300,
            'medium-height': 191,
            medium_large: '/website-assets/media/2025/11/platform_federation_open_source.png',
            'medium_large-width': 768,
            'medium_large-height': 490,
            large: '/website-assets/media/2025/11/platform_federation_open_source.png',
            'large-width': 1024,
            'large-height': 653,
            '1536x1536': '/website-assets/media/2025/11/platform_federation_open_source.png',
            '1536x1536-width': 1254,
            '1536x1536-height': 800,
            '2048x2048': '/website-assets/media/2025/11/platform_federation_open_source.png',
            '2048x2048-width': 1254,
            '2048x2048-height': 800,
          },
        },
      },
      {
        title: 'Integrated AI and search workflows',
        paragraph:
          'Bring hybrid search and LLM inference into the same SQL environment as your data. Federate, accelerate, compose hybrid search, and call LLMs directly from SQL, all in one governed interface.',
        cta: {
          title: 'Explore search features',
          url: 'https://spiceai.org/docs/features/search',
          target: '',
        },
        image: {
          ID: 1403,
          id: 1403,
          title: 'Platform Federation Integrated AI',
          filename: 'platform_federation_integrated_AI.png',
          filesize: 314376,
          url: '/website-assets/media/2025/11/platform_federation_integrated_AI.png',
          link: '/platform/sql-federation-acceleration/attachment/platform_federation_integrated_AI/',
          alt: 'Diagram of Spice.ai OSS serving search and SQL queries with a local embeddings model over Amazon S3 vector and general purpose buckets',
          author: '6',
          description: '',
          caption: '',
          name: 'platform_federation_integrated_AI',
          status: 'inherit',
          uploaded_to: 543,
          date: '2025-11-26 16:14:28',
          modified: '2025-11-26 16:14:28',
          menu_order: 0,
          mime_type: 'image/png',
          type: 'image',
          subtype: 'png',
          icon: '/website-assets/media/default.png',
          width: 1254,
          height: 800,
          sizes: {
            thumbnail: '/website-assets/media/2025/11/platform_federation_integrated_AI.png',
            'thumbnail-width': 150,
            'thumbnail-height': 150,
            medium: '/website-assets/media/2025/11/platform_federation_integrated_AI.png',
            'medium-width': 300,
            'medium-height': 191,
            medium_large: '/website-assets/media/2025/11/platform_federation_integrated_AI.png',
            'medium_large-width': 768,
            'medium_large-height': 490,
            large: '/website-assets/media/2025/11/platform_federation_integrated_AI.png',
            'large-width': 1024,
            'large-height': 653,
            '1536x1536': '/website-assets/media/2025/11/platform_federation_integrated_AI.png',
            '1536x1536-width': 1254,
            '1536x1536-height': 800,
            '2048x2048': '/website-assets/media/2025/11/platform_federation_integrated_AI.png',
            '2048x2048-width': 1254,
            '2048x2048-height': 800,
          },
        },
      },
      {
        title: 'Fast, virtualized views',
        paragraph:
          'Create virtual tables or materialized views for dashboards, APIs, and applications. Deliver federated and accelerated results with real-time data.',
        cta: {
          title: 'Explore views',
          url: 'https://spiceai.org/docs/components/views',
          target: '',
        },
        image: {
          ID: 1397,
          id: 1397,
          title: 'Platform Federation Views',
          filename: 'platform_federation_views.png',
          filesize: 306524,
          url: '/website-assets/media/2025/11/platform_federation_views.png',
          link: '/platform/sql-federation-acceleration/attachment/platform_federation_views/',
          alt: 'Diagram of Spice.ai acceleration refresh modes: pull on interval from Amazon S3, push on change via Debezium and Kafka from PostgreSQL, and push on update',
          author: '6',
          description: '',
          caption: '',
          name: 'platform_federation_views',
          status: 'inherit',
          uploaded_to: 543,
          date: '2025-11-26 15:53:33',
          modified: '2025-11-26 15:53:33',
          menu_order: 0,
          mime_type: 'image/png',
          type: 'image',
          subtype: 'png',
          icon: '/website-assets/media/default.png',
          width: 1254,
          height: 800,
          sizes: {
            thumbnail: '/website-assets/media/2025/11/platform_federation_views.png',
            'thumbnail-width': 150,
            'thumbnail-height': 150,
            medium: '/website-assets/media/2025/11/platform_federation_views.png',
            'medium-width': 300,
            'medium-height': 191,
            medium_large: '/website-assets/media/2025/11/platform_federation_views.png',
            'medium_large-width': 768,
            'medium_large-height': 490,
            large: '/website-assets/media/2025/11/platform_federation_views.png',
            'large-width': 1024,
            'large-height': 653,
            '1536x1536': '/website-assets/media/2025/11/platform_federation_views.png',
            '1536x1536-width': 1254,
            '1536x1536-height': 800,
            '2048x2048': '/website-assets/media/2025/11/platform_federation_views.png',
            '2048x2048-width': 1254,
            '2048x2048-height': 800,
          },
        },
      },
      {
        title: 'Governance, observability, and control',
        paragraph:
          'Monitor data freshness, query latency, and ingest lag with built-in metrics and fully-observable and distributed tracing. Apply role-based access controls across federated data to ensure compliance and auditability at scale.',
        cta: {
          title: 'Explore observability',
          url: 'https://spiceai.org/docs/features/observability',
          target: '',
        },
        image: {
          ID: 1396,
          id: 1396,
          title: 'Platform Federation Governance',
          filename: 'platform_federation_governance.png',
          filesize: 340429,
          url: '/website-assets/media/2025/11/platform_federation_governance.png',
          link: '/platform/sql-federation-acceleration/attachment/platform_federation_governance/',
          alt: 'Diagram of Spice.ai connecting to Unity Catalog, AWS Glue, and Apache Iceberg catalogs, model hosting from AWS, NIM, and OpenAI, and storage',
          author: '6',
          description: '',
          caption: '',
          name: 'platform_federation_governance',
          status: 'inherit',
          uploaded_to: 543,
          date: '2025-11-26 15:53:30',
          modified: '2025-11-26 15:53:30',
          menu_order: 0,
          mime_type: 'image/png',
          type: 'image',
          subtype: 'png',
          icon: '/website-assets/media/default.png',
          width: 1254,
          height: 800,
          sizes: {
            thumbnail: '/website-assets/media/2025/11/platform_federation_governance.png',
            'thumbnail-width': 150,
            'thumbnail-height': 150,
            medium: '/website-assets/media/2025/11/platform_federation_governance.png',
            'medium-width': 300,
            'medium-height': 191,
            medium_large: '/website-assets/media/2025/11/platform_federation_governance.png',
            'medium_large-width': 768,
            'medium_large-height': 490,
            large: '/website-assets/media/2025/11/platform_federation_governance.png',
            'large-width': 1024,
            'large-height': 653,
            '1536x1536': '/website-assets/media/2025/11/platform_federation_governance.png',
            '1536x1536-width': 1254,
            '1536x1536-height': 800,
            '2048x2048': '/website-assets/media/2025/11/platform_federation_governance.png',
            '2048x2048-width': 1254,
            '2048x2048-height': 800,
          },
        },
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<Testimonials
  heading="Proven in production"
  headingTag="h2"
  paragraph="Run data-intensive workloads on a high-performance engine trusted by teams building real-time systems at scale."
  items={["twilio","barracuda","nrc-tim"]}
/>

<ContentImageVideo
  fields={{
    variant: 'variant-1',
    heading: 'Integrations across all of your data sources',
    heading_tag: 'h2',
    paragraph:
      'Accelerate your data stack with a library of 40+ prebuilt connectors for the most common databases, warehouses, and file stores - from Databricks and S3 to MySQL and PostgreSQL',
    cta: [
      {
        type: 'filled',
        cta: {
          title: 'See connectors',
          url: '/integrations',
          target: '',
        },
      },
    ],
    media_type: 'image',
    media_image: {
      ID: 612,
      id: 612,
      title: 'Platform Integrations',
      filename: 'platform_integrations.png',
      filesize: 1330111,
      url: '/website-assets/media/2025/11/platform_integrations.png',
      link: '/platform/sql-federation-acceleration/attachment/platform_integrations/',
      alt: '',
      author: '6',
      description: '',
      caption: '',
      name: 'platform_integrations',
      status: 'inherit',
      uploaded_to: 543,
      date: '2025-11-18 19:42:54',
      modified: '2025-11-18 19:42:54',
      menu_order: 0,
      mime_type: 'image/png',
      type: 'image',
      subtype: 'png',
      icon: '/website-assets/media/default.png',
      width: 1360,
      height: 1034,
      sizes: {
        thumbnail: '/website-assets/media/2025/11/platform_integrations.png',
        'thumbnail-width': 150,
        'thumbnail-height': 150,
        medium: '/website-assets/media/2025/11/platform_integrations.png',
        'medium-width': 300,
        'medium-height': 228,
        medium_large: '/website-assets/media/2025/11/platform_integrations.png',
        'medium_large-width': 768,
        'medium_large-height': 584,
        large: '/website-assets/media/2025/11/platform_integrations.png',
        'large-width': 1024,
        'large-height': 779,
        '1536x1536': '/website-assets/media/2025/11/platform_integrations.png',
        '1536x1536-width': 1360,
        '1536x1536-height': 1034,
        '2048x2048': '/website-assets/media/2025/11/platform_integrations.png',
        '2048x2048-width': 1360,
        '2048x2048-height': 1034,
      },
    },
    graphic_overlay: false,
    media_video: '',
    padding_top: 'st-lg',
    padding_bottom: 'sb-lg',
  }}
/>

<AccordionFaq
  fields={{
    heading: 'FAQs',
    heading_tag: 'h2',
    paragraph:
      'Learn how to connect data sources, enable acceleration, and start querying with Spice.',
    items: [
      {
        title: 'What is SQL federation?',
        paragraph:
          '<p>SQL federation lets you query data across multiple sources as if it were one. With Spice, you can connect directly to systems like S3, PostgreSQL, or Snowflake and execute unified SQL queries. Spice handles source integration, query planning, and result merging automatically without ETL.</p>\n',
      },
      {
        title: 'How does acceleration in Spice work?',
        paragraph:
          '<p>Spice materializes and indexes hot data locally using embedded engines such as DuckDB, PostgreSQL, and SQLite. Frequently-queried data is cached and optimized for sub-second responses, while changes from the source are synced through CDC. This approach delivers analytical performance for operational workloads - ideal for APIs, dashboards, and AI agents.</p>\n',
      },
      {
        title: 'How is Spice different from other query engines?',
        paragraph:
          '<p>Traditional query engines focus on analytics and often require separate systems for federation, caching, and serving. Spice unifies these capabilities in a single runtime built for operational and AI workloads. </p>\n<p>What sets Spice apart from other query engines is its broader, application-focused feature set designed for modern data and AI workloads. Spice combines federation, hybrid search, and embedded LLM inference into a single runtime, enabling teams to build complete, end-to-end workflows without the management overhead and performance concessions of using multiple systems.</p>\n',
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<TalkToAnEngineerCta />

---

## Spice Cloud Plans
URL: https://spice.ai/pricing/cloud
Description: Flexible cloud pricing plans for teams of all sizes

<HeroCenteredText
  fields={{
    graphic_position: 'no-graphic',
    heading_tag: 'h1',
    heading: 'Spice Cloud Plans',
    paragraph:
      'Flexible plans designed to grow with your needs. Start with a free trial and scale as you grow.',
    cta: false,
    padding_top: 'unset',
    padding_bottom: 'sb-none',
  }}
/>

<ContentColoredPricingTable
  fields={{
    padding_top: 'unset',
    padding_bottom: 'unset',
    plans: [
      {
        theme: 'light-blue',
        name: 'Developer',
        description: 'For individual developers exploring Spice Cloud',
        cta: {
          title: '$19/month',
          url: 'https://spice.ai/login',
          target: '_blank',
        },
      },
      {
        theme: 'blue',
        name: 'Pro for Teams',
        description: 'For teams building production workloads',
        cta: {
          title: '$99/month',
          url: 'https://spice.ai/login',
          target: '_blank',
        },
      },
      {
        theme: 'dark-blue',
        name: 'Enterprise',
        description: 'For organizations requiring dedicated infrastructure',
        cta: {
          title: 'Contact us',
          url: '/contact/',
          target: '',
        },
      },
    ],
    rows: [
      {
        cell: [
          { text: '<p><strong>Serverless Compute Instances</strong></p>' },
          { text: '<p>Single Instance<br />2 vCPU / 4 GB</p>' },
          { text: '<p>Single Instance<br />4 vCPU / 8 GB</p>' },
          { text: '<p>Multi-Instance<br />Custom vCPU & Mem</p>' },
        ],
      },
      {
        cell: [
          { text: '<p><strong>Cloud Hosting</strong></p>' },
          {
            text: '<p>Shared, Multi-Tenant Cluster<br />(us-east-1, us-west-2)</p>',
          },
          {
            text: '<p>Shared, Multi-Tenant Cluster<br />(us-east-1, us-west-2)</p>',
          },
          {
            text: '<p>Dedicated AWS Cluster<br />(us-east-1, us-west-2 + additional regions by request)</p>',
          },
        ],
      },
      {
        cell: [
          { text: '<p><strong>Ephemeral Local Storage</strong></p>' },
          { text: '<p>100 MB</p>' },
          { text: '<p>1.0 GB</p>' },
          { text: '<p>4.0+ GB</p>' },
        ],
      },
      {
        cell: [
          { text: '<p><strong>Persistent Object Storage</strong></p>' },
          { text: '<p>N/A</p>' },
          { text: '<p>N/A</p>' },
          { text: '<p>10.0+ GB</p>' },
        ],
      },
      {
        cell: [
          { text: '<p><strong>Query Limits</strong></p>' },
          { text: '<p>Up to 16 concurrent queries<br />90-second timeout</p>' },
          { text: '<p>Up to 64 concurrent queries<br />5-minute timeout</p>' },
          {
            text: '<p>Up to 1024 concurrent queries<br />30-minute timeout</p>',
          },
        ],
      },
      {
        cell: [
          { text: '<p><strong>APIs</strong></p>' },
          { text: '<p>HTTP, Arrow Flight,<br />Arrow Flight SQL, ADBC</p>' },
          { text: '<p>HTTP, Arrow Flight,<br />Arrow Flight SQL, ADBC</p>' },
          {
            text: '<p>HTTP, Arrow Flight, Arrow Flight SQL,<br />JDBC/ODBC/ADBC</p>',
          },
        ],
      },
      {
        cell: [
          { text: '<p><strong>SDKs</strong></p>' },
          { text: '<p>Python, Go, Node.js,<br />Rust, C#, Java</p>' },
          { text: '<p>Python, Go, Node.js,<br />Rust, C#, Java</p>' },
          { text: '<p>Python, Go, Node.js,<br />Rust, C#, Java</p>' },
        ],
      },
      {
        cell: [
          { text: '<p><strong>Availability</strong></p>' },
          { text: '<p>Single Cloud,<br />Single Region</p>' },
          { text: '<p>Single Cloud,<br />Single Region</p>' },
          { text: '<p>Multi-Cloud, Multi-Region<br />High-Availability</p>' },
        ],
      },
      {
        cell: [
          { text: '<p><strong>Users</strong></p>' },
          { text: '<p>1</p>' },
          { text: '<p>Unlimited</p>' },
          { text: '<p>Unlimited</p>' },
        ],
      },
      {
        cell: [
          { text: '<p><strong>Apps</strong></p>' },
          { text: '<p>5</p>' },
          { text: '<p>10</p>' },
          { text: '<p>1000</p>' },
        ],
      },
      {
        cell: [
          { text: '<p><strong>Commercial License</strong></p>' },
          { text: '<p>No</p>' },
          { text: '<p>Yes</p>', icon: 'check' },
          { text: '<p>Yes</p>', icon: 'check' },
        ],
      },
      {
        cell: [
          { text: '<p><strong>Commercial Resale</strong></p>' },
          { text: '<p>No</p>' },
          { text: '<p>No</p>' },
          { text: '<p>Yes</p>', icon: 'check' },
        ],
      },
      {
        cell: [
          { text: '<p><strong>Support</strong></p>' },
          { text: '<p>Community support</p>' },
          { text: '<p>Standard, 8/5 next-business day</p>' },
          { text: '<p>Premium, 24/7 on-call</p>' },
        ],
      },
      {
        cell: [
          { text: '<p><strong>Support Channels</strong></p>' },
          { text: '<p>Community Slack</p>' },
          { text: '<p>Private Slack channel, Email</p>' },
          {
            text: '<p>Private GitHub repo, Private Slack, Email, On-Call Pager</p>',
          },
        ],
      },
      {
        cell: [
          { text: '<p><strong>SLA</strong></p>' },
          { text: '<p>99.0+ SLA</p>' },
          { text: '<p>99.0+ SLA</p>' },
          { text: '<p>Enterprise 99.9+ SLA</p>' },
        ],
      },
      {
        cell: [
          { text: '<p><strong>Compliance</strong></p>' },
          { text: '<p>SOC 2 Type II</p>', icon: 'check' },
          { text: '<p>SOC 2 Type II</p>', icon: 'check' },
          { text: '<p>SOC 2 Type II</p>', icon: 'check' },
        ],
      },
      {
        cell: [
          { text: '<p><strong>SSO</strong></p>' },
          { text: '<p>Sign in with GitHub</p>' },
          { text: '<p>Sign in with GitHub</p>' },
          { text: '<p>Sign in with GitHub</p>' },
        ],
      },
      {
        cell: [
          { text: '<p><strong>Trial</strong></p>' },
          { text: '<p>Free 7-day Pro for Teams trial</p>' },
          { text: '<p>Free 7-day Pro for Teams trial</p>' },
          { text: '<p><a href="/contact">Contact us</a></p>' },
        ],
      },
    ],
  }}
/>

<ContentThreeAcrossIconTiles
  fields={{
    heading: 'Why Spice Cloud?',
    heading_tag: 'h2',
    paragraph:
      'Fully managed infrastructure so you can focus on building, not operations.',
    padding_top: 'st-xl',
    padding_bottom: 'unset',
    item: [
      {
        icon: {
          url: '/website-assets/svg/Pricing_Unified-data-and-AI-engine.svg',
          alt: 'Serverless Compute',
          title: 'Serverless Compute',
        },
        title: 'Serverless <br>Compute',
        description:
          'Scale automatically with serverless compute instances. No infrastructure to manage - just deploy and go.',
        cta: {
          title: 'Get started',
          url: 'https://spice.ai/login',
          target: '_blank',
        },
      },
      {
        icon: {
          url: '/website-assets/svg/Pricing_Built-on-open-source.svg',
          alt: 'Enterprise Security',
          title: 'Enterprise Security',
        },
        title: 'Enterprise <br>Security',
        description:
          'SOC 2 Type II compliant with enterprise-grade security controls and privacy protections built in.',
        cta: {
          title: 'Learn more',
          url: '/security/',
          target: '',
        },
      },
      {
        icon: {
          url: '/website-assets/svg/Pricing_Designed-for-performance-and-scale.svg',
          alt: 'High Availability',
          title: 'High Availability',
        },
        title: 'High <br>Availability',
        description:
          'Enterprise plans include multi-region, high-availability deployments with 99.9%+ SLA.',
        cta: {
          title: 'Contact sales',
          url: '/contact/',
          target: '',
        },
      },
    ],
  }}
/>

<AccordionFaq
  fields={{
    heading: 'Frequently Asked Questions',
    heading_tag: 'h2',
    paragraph: 'Common questions about Spice Cloud Platform pricing and plans.',
    padding_top: 'st-xl',
    padding_bottom: 'sb-xl',
    items: [
      {
        title: 'What is included in the free trial?',
        paragraph:
          '<p>All new accounts start with a free 7-day Pro for Teams trial. This gives you access to enhanced compute resources (4 vCPU / 8 GB), up to 64 concurrent queries, 5-minute query timeout, and 1.0 GB ephemeral storage. No credit card required to start.</p>',
      },
      {
        title: 'Can I upgrade or downgrade my plan?',
        paragraph:
          '<p>Yes, you can upgrade or downgrade your plan at any time. Changes take effect immediately and billing is prorated based on your usage.</p>',
      },
      {
        title: 'What APIs and SDKs are supported?',
        paragraph:
          '<p>All plans support HTTP, Apache Arrow Flight, Apache Arrow Flight SQL, and ADBC APIs. SDKs are available for Python, Go, Node.js, Rust, C#, and Java. Enterprise plans also include JDBC/ODBC support.</p>',
      },
      {
        title: 'What is the difference between Developer and Pro for Teams?',
        paragraph:
          '<p>Developer is designed for individual developers with a single user, 5 apps, and basic compute resources. Pro for Teams supports unlimited users, 10 apps, enhanced compute (4 vCPU / 8 GB), higher concurrency limits, commercial licensing, and standard support with private Slack and email channels.</p>',
      },
      {
        title: 'What does Enterprise include?',
        paragraph:
          '<p>Enterprise provides dedicated AWS clusters, multi-region high-availability, custom compute configurations, persistent object storage, up to 1024 concurrent queries, 30-minute query timeout, commercial resale rights, premium 24/7 on-call support, private GitHub repository access, and a 99.9%+ SLA.</p>',
      },
    ],
  }}
/>

<ContentCta
  fields={{
    override_global_setting: false,
    custom_content: {
      heading: '',
      paragraph: '',
      cta: null,
    },
    padding_top: 'unset',
    padding_bottom: 'unset',
    gcta_heading: 'Ready to get started?',
    gcta_paragraph:
      'Start your free trial today or talk to our sales team about Enterprise.',
    gcta_cta: {
      title: 'Start free trial',
      url: 'https://spice.ai/login',
      target: '_blank',
    },
  }}
/>

---

## Pricing
URL: https://spice.ai/pricing
Date: 2025-11-19T12:16:23
Description: Start free and deploy anywhere: on your laptop, on-prem, at the edge, or in the cloud. Flexible pricing designed for teams building data-intensive applications & AI agents.

<HeroCenteredText
  fields={{
    graphic_position: 'no-graphic',
    heading: 'Flexible and scalable pricing for every deployment',
    heading_tag: 'h1',
    paragraph:
      'Run Spice where and how your application demands: open-source, self-hosted, on-prem, at the edge, or fully managed on the Spice Cloud Platform. Start free and scale when you need to. ',
    cta: false,
    padding_top: 'unset',
    padding_bottom: 'sb-none',
  }}
/>

<ContentColoredPricingTable
  fields={{
    plans: [
      {
        theme: 'orange',
        name: 'Open Source',
        description: 'Free under Apache 2.0 with community-only support',
        cta: {
          title: 'Free!',
          url: 'https://spiceai.org/docs/getting-started',
          target: '_blank',
        },
      },
      {
        theme: 'blue',
        name: 'Cloud',
        description: 'Subscription and usage-based pricing with tiered plans',
        cta: {
          title: 'See plans here',
          url: '/pricing/cloud',
          target: '_blank',
        },
      },
      {
        theme: 'black',
        name: 'Enterprise',
        description: 'Enterprise licensing with 24/7 support and SLAs',
        cta: {
          title: 'Contact us for tailored pricing',
          url: '/contact/',
          target: '',
        },
      },
    ],
    rows: [
      {
        cell: [
          {
            text: '<p><strong>Optimized For</strong></p>\n',
          },
          {
            text: '<p>Community</p>\n',
          },
          {
            text: '<p>Managed Workloads</p>\n',
          },
          {
            text: '<p>Self-Hosted Workloads</p>\n',
          },
        ],
      },
      {
        cell: [
          {
            text: '<p><strong>Scale</strong></p>\n',
          },
          {
            text: '<p>Single-node engine</p>\n',
          },
          {
            text: '<p>Multi-node with clustering and high-availability</p>\n',
          },
          {
            text: '<p>Multi-node with clustering and high-availability</p>\n',
          },
        ],
      },
      {
        cell: [
          {
            text: '<p><strong>Control Plane</strong></p>\n',
          },
          {
            text: '<p>Static, configuration-driven only (YAML)</p>\n',
          },
          {
            text: '<p>Dynamic, remote (Portal/API-managed)</p>\n',
          },
          {
            text: '<p>Dynamic, remote/local (API/YAML)<br />\n<em>Remote control in preview</em></p>\n',
          },
        ],
      },
      {
        cell: [
          {
            text: '<p><strong>Commercial License</strong></p>\n',
          },
          {
            text: '<p>Apache 2.0</p>\n',
          },
          {
            icon: 'check',
            text: '<p>Consumption-based TOS</p>\n',
          },
          {
            icon: 'check',
            text: '<p>Enterprise Software License</p>\n',
          },
        ],
      },
      {
        cell: [
          {
            text: '<p><strong>Code / Security Audited</strong></p>\n',
          },
          {
            text: '<p>No</p>\n',
          },
          {
            icon: 'check',
            text: '<p>Yes</p>\n',
          },
          {
            icon: 'check',
            text: '<p>Yes</p>\n',
          },
        ],
      },
      {
        cell: [
          {
            text: '<p><strong>Security Updates</strong></p>\n',
          },
          {
            text: '<p>Latest minus-one release (6-8 weeks)</p>\n',
          },
          {
            text: '<p>Rolling updates with automated patches</p>\n',
          },
          {
            text: '<p>Tiered support up to 3 years with guaranteed patches</p>\n',
          },
        ],
      },
      {
        cell: [
          {
            text: '<p><strong>SLA</strong></p>\n',
          },
          {
            text: '<p>N/A</p>\n',
          },
          {
            icon: 'check',
            text: '<p>99.9% uptime with proactive failover</p>\n',
          },
          {
            icon: 'check',
            text: '<p>99.9% uptime with 24/7 on-call</p>\n',
          },
        ],
      },
      {
        cell: [
          {
            text: '<p><strong>Support</strong></p>\n',
          },
          {
            text: '<p>Community (GitHub Issues, Community Slack)</p>\n',
          },
          {
            text: '<p>Standard support (email, Slack Connect)</p>\n',
          },
          {
            text: '<p>Premium 24/7 support with dedicated account team (Slack Connect)</p>\n',
          },
        ],
      },
      {
        cell: [
          {
            text: '<p><strong>Distribution</strong></p>\n',
          },
          {
            text: '<p>Docker images and GitHub release binaries</p>\n',
          },
          {
            text: '<p>Enterprise image via AWS Marketplace SaaS</p>\n',
          },
          {
            text: '<p>Enterprise image via AWS Marketplace ECR &amp; AMI</p>\n',
          },
        ],
      },
      {
        cell: [
          {
            text: '<p><strong>Hosting</strong></p>\n',
          },
          {
            text: '<p>Self-Hosted</p>\n',
          },
          {
            text: '<p>Fully-managed, cloud-hosted; dedicated deployments (AWS)</p>\n',
          },
          {
            text: '<p>Self-hosted BYOL; Kubernetes, AWS AMI</p>\n',
          },
        ],
      },
      {
        cell: [
          {
            text: '<p><strong>Monitoring &amp; Observability</strong></p>\n',
          },
          {
            text: '<p>DIY via OpenTelemetry (e.g. Grafana)</p>\n',
          },
          {
            text: '<p>Built-in dashboards with real-time monitoring</p>\n',
          },
          {
            text: '<p>BYO (Datadog, New Relic, etc.) or Spice Cloud Connect</p>\n',
          },
        ],
      },
      {
        cell: [
          {
            text: '<p><strong>Compliance</strong></p>\n',
          },
          {
            text: '<p>N/A</p>\n',
          },
          {
            icon: 'check',
            text: '<p>SOC 2 Type II audited security &amp; privacy controls</p>\n',
          },
          {
            icon: 'check',
            text: '<p>SOC 2 Type II audited security &amp; privacy controls</p>\n',
          },
        ],
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<ContentThreeAcrossIconTiles
  fields={{
    heading: 'One engine, nearly unlimited deployment options',
    heading_tag: 'h2',
    paragraph:
      'Spice is an open-source data and AI runtime that works the same everywhere - locally, on-prem, hybrid, or cloud. Build once, deploy anywhere, and scale without lock-in.',
    item: [
      {
        icon: {
          ID: 1138,
          id: 1138,
          title: 'Pricing_Unified data and AI engine',
          filename: 'Pricing_Unified-data-and-AI-engine.svg',
          filesize: 42909,
          url: '/website-assets/media/2025/11/Pricing_Unified-data-and-AI-engine.svg',
          link: '/pricing/attachment/pricing_unified-data-and-ai-engine/',
          alt: '',
          author: '6',
          description: '',
          caption: '',
          name: 'pricing_unified-data-and-ai-engine',
          status: 'inherit',
          uploaded_to: 648,
          date: '2025-11-21 22:20:32',
          modified: '2025-11-21 22:20:32',
          menu_order: 0,
          mime_type: 'image/svg+xml',
          type: 'image',
          subtype: 'svg+xml',
          icon: '/website-assets/media/default.png',
          width: 0,
          height: 0,
          sizes: {
            thumbnail:
              '/website-assets/media/2025/11/Pricing_Unified-data-and-AI-engine.svg',
            'thumbnail-width': 1,
            'thumbnail-height': 1,
            medium:
              '/website-assets/media/2025/11/Pricing_Unified-data-and-AI-engine.svg',
            'medium-width': 1,
            'medium-height': 1,
            medium_large:
              '/website-assets/media/2025/11/Pricing_Unified-data-and-AI-engine.svg',
            'medium_large-width': 1,
            'medium_large-height': 1,
            large:
              '/website-assets/media/2025/11/Pricing_Unified-data-and-AI-engine.svg',
            'large-width': 1,
            'large-height': 1,
            '1536x1536':
              '/website-assets/media/2025/11/Pricing_Unified-data-and-AI-engine.svg',
            '1536x1536-width': 1,
            '1536x1536-height': 1,
            '2048x2048':
              '/website-assets/media/2025/11/Pricing_Unified-data-and-AI-engine.svg',
            '2048x2048-width': 1,
            '2048x2048-height': 1,
          },
        },
        title: 'Unified data and <br>AI engine',
        description:
          'Federate data, accelerate queries, perform hybrid search, and run AI models all from one portable runtime that can be deployed locally, on-prem, at the edge, or in the cloud.',
        cta: {
          title: 'Learn more',
          url: 'https://spiceai.org/docs/deployment',
          target: '_blank',
        },
      },
      {
        icon: {
          ID: 1136,
          id: 1136,
          title: 'Pricing_Built on open-source',
          filename: 'Pricing_Built-on-open-source.svg',
          filesize: 5035,
          url: '/website-assets/media/2025/11/Pricing_Built-on-open-source.svg',
          link: '/pricing/attachment/pricing_built-on-open-source/',
          alt: '',
          author: '6',
          description: '',
          caption: '',
          name: 'pricing_built-on-open-source',
          status: 'inherit',
          uploaded_to: 648,
          date: '2025-11-21 22:20:30',
          modified: '2025-11-21 22:20:30',
          menu_order: 0,
          mime_type: 'image/svg+xml',
          type: 'image',
          subtype: 'svg+xml',
          icon: '/website-assets/media/default.png',
          width: 0,
          height: 0,
          sizes: {
            thumbnail:
              '/website-assets/media/2025/11/Pricing_Built-on-open-source.svg',
            'thumbnail-width': 1,
            'thumbnail-height': 1,
            medium:
              '/website-assets/media/2025/11/Pricing_Built-on-open-source.svg',
            'medium-width': 1,
            'medium-height': 1,
            medium_large:
              '/website-assets/media/2025/11/Pricing_Built-on-open-source.svg',
            'medium_large-width': 1,
            'medium_large-height': 1,
            large:
              '/website-assets/media/2025/11/Pricing_Built-on-open-source.svg',
            'large-width': 1,
            'large-height': 1,
            '1536x1536':
              '/website-assets/media/2025/11/Pricing_Built-on-open-source.svg',
            '1536x1536-width': 1,
            '1536x1536-height': 1,
            '2048x2048':
              '/website-assets/media/2025/11/Pricing_Built-on-open-source.svg',
            '2048x2048-width': 1,
            '2048x2048-height': 1,
          },
        },
        title: 'Built on <br>open-source',
        description:
          'Leverage modern open-source technologies, including Arrow, DataFusion, DuckDB, SQLite, Iceberg, and more in one engine. ',
        cta: {
          title: 'Learn more',
          url: 'https://spiceai.org/docs',
          target: '_blank',
        },
      },
      {
        icon: {
          ID: 1137,
          id: 1137,
          title: 'Pricing_Designed for performance and scale',
          filename: 'Pricing_Designed-for-performance-and-scale.svg',
          filesize: 5289,
          url: '/website-assets/media/2025/11/Pricing_Designed-for-performance-and-scale.svg',
          link: '/pricing/attachment/pricing_designed-for-performance-and-scale/',
          alt: '',
          author: '6',
          description: '',
          caption: '',
          name: 'pricing_designed-for-performance-and-scale',
          status: 'inherit',
          uploaded_to: 648,
          date: '2025-11-21 22:20:31',
          modified: '2025-11-21 22:20:31',
          menu_order: 0,
          mime_type: 'image/svg+xml',
          type: 'image',
          subtype: 'svg+xml',
          icon: '/website-assets/media/default.png',
          width: 0,
          height: 0,
          sizes: {
            thumbnail:
              '/website-assets/media/2025/11/Pricing_Designed-for-performance-and-scale.svg',
            'thumbnail-width': 1,
            'thumbnail-height': 1,
            medium:
              '/website-assets/media/2025/11/Pricing_Designed-for-performance-and-scale.svg',
            'medium-width': 1,
            'medium-height': 1,
            medium_large:
              '/website-assets/media/2025/11/Pricing_Designed-for-performance-and-scale.svg',
            'medium_large-width': 1,
            'medium_large-height': 1,
            large:
              '/website-assets/media/2025/11/Pricing_Designed-for-performance-and-scale.svg',
            'large-width': 1,
            'large-height': 1,
            '1536x1536':
              '/website-assets/media/2025/11/Pricing_Designed-for-performance-and-scale.svg',
            '1536x1536-width': 1,
            '1536x1536-height': 1,
            '2048x2048':
              '/website-assets/media/2025/11/Pricing_Designed-for-performance-and-scale.svg',
            '2048x2048-width': 1,
            '2048x2048-height': 1,
          },
        },
        title: 'Designed for performance and scale',
        description:
          "Spice's architecture is optimized for low-latency data access. Deploy with single-node or distributed multi-node query execution.",
        cta: {
          title: 'Learn more',
          url: 'https://spiceai.org/docs/features/data-acceleration',
          target: '_blank',
        },
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<Testimonials
  heading="Deployed in production"
  headingTag="h2"
  paragraph="Teams trust Spice to bring inference closer to their data, enabling low-latency, enterprise-grade AI across industries."
  items={['twilio', 'barracuda', 'nrc-dustin']}
/>

<AccordionFaq
  fields={{
    heading: 'FAQs',
    heading_tag: 'h2',
    paragraph:
      'How pricing works in Spice for open-source, enterprise, and cloud deployments.',
    items: [
      {
        title: 'Is Spice available on AWS Marketplace?',
        paragraph:
          '<p>Yes. Spice.ai Enterprise is <a href="https://aws.amazon.com/marketplace/seller-profile?id=seller-zrdzyyqfdudxc">available on AWS Marketplace</a>, allowing teams to purchase and deploy Spice through their existing AWS billing and procurement workflows. This includes support for Private Offers, consolidated billing, and fast onboarding. Visit the AWS Marketplace listing here.</p>\n',
      },
      {
        title: 'Is on-prem supported?',
        paragraph:
          '<p>Yes. Spice is portable and can run on-prem in Kubernetes, VMs, or bare metal. Enterprises can also use private cloud deployments or hybrid models where acceleration and model serving run close to the application while governance is centralized.</p>\n',
      },
      {
        title:
          'How is Spice Cloud Enterprise different from the other offerings?',
        paragraph:
          '<p>Enterprise Cloud provides a dedicated, multi-region, high-availability cluster with significantly higher compute, storage, and concurrency limits, as well as enterprise-grade features. Unlike the Developer and Pro tiers, Enterprise includes custom vCPU/memory configurations, persistent object storage, JDBC/ODBC support, 1024+ concurrent queries, commercial licensing and resale rights, and Premium 24/7 on-call support with a 99.9% SLA.</p>\n',
      },
    ],
    padding_top: 'st-xl',
    padding_bottom: 'sb-xl',
  }}
/>

<TalkToAnEngineerCta />

---

## Privacy Policy
URL: https://spice.ai/privacy-policy
Date: 2025-10-23T00:58:38
Description: Your privacy matters. Read Spice AI's policy on data collection, usage, protection, and your rights to control your personal information.

<HeroSimple
  fields={{
    heading: 'Privacy policy',
    paragraph:
      'A pharetra fusce sed ac neque ullamcorper egestas nunc. Eu suscipit viverra.',
    subtext: 'Updated: February 12, 2025',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<ContentRichText
  fields={{
    coverage: 'rc-start',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<CoreBlock
  name="core-heading"
  content={
    '<h2 class="wp-block-heading h3">Large title si eros laoreet cui bitur mey socio</h2>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Viverra volutpat varius gravida ultrices pulvinar. <a href="#">Hyperlink facilisis risus</a>, quisque imperdiet pellentesque cursus etiam porttitor. Diam, feugiat facilisis congue lectus neque, risus. Integer id suscipit ut quis in hendrerit placerat nisi a. Volutpat at vitae vitae luctus ut odio. Felis vel risus elementum, sagittis. Mattis et faucibus diam quis risus. Odio vel viverra nulla consectetur varius tellus integer ultrices.</p>'
  }
/>

<CoreBlock
  name="core-heading"
  content={
    '<h3 class="wp-block-heading h4">Small title si eros laoreet cui bitur mey socio</h3>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Viverra volutpat varius gravida ultrices pulvinar. Adipiscing facilisis risus, quisque imperdiet pellentesque cursus etiam hyperlink hover. Diam, feugiat facilisis congue lectus neque, risus. Integer id suscipit ut quis in hendrerit placerat nisi a. Volutpat at vitae vitae luctus ut odio.<br>Volutpat at vitae vitae luctus ut odio. Felis vel risus elementum, sagittis. Mattis et faucibus diam quis risus. Odio vel viverra nulla consectetur varius tellus integer ultrices.</p>'
  }
/>

<CoreBlock
  name="core-heading"
  content={
    '<h4 class="wp-block-heading h5">Small title si eros laoreet cui bitur mey socio</h4>'
  }
/>

<CoreBlock
  name="core-list"
  content={
    '<ul class="wp-block-list"><li>List volutpat varius gravida ultrices pulvinar.</li><li>Adipiscing facilisis risus, quisque imperdiet pellentesque cursus etiam porttitor.</li><li>Diam, feugiat facilisis congue lectus neque, risus.</li><li>Integer id suscipit ut quis in hendrerit placerat nisi a.</li><li>Volutpat at vitae vitae luctus ut odio.</li></ul>'
  }
/>

<CoreBlock
  name="core-heading"
  content={
    '<h4 class="wp-block-heading h5">Small title si eros laoreet cui bitur mey socio</h4>'
  }
/>

<CoreBlock
  name="core-list"
  content={
    '<ol class="wp-block-list"><li>List volutpat varius gravida ultrices pulvinar.</li><li>Adipiscing facilisis risus, quisque imperdiet pellentesque cursus etiam porttitor.</li><li>Diam, feugiat facilisis congue lectus neque, risus.</li><li>Integer id suscipit ut quis in hendrerit placerat nisi a.</li><li>Volutpat at vitae vitae luctus ut odio.</li></ol>'
  }
/>

<CoreBlock
  name="core-heading"
  content={
    '<h4 class="wp-block-heading h5">Small title si eros laoreet cui bitur mey socio</h4>'
  }
/>

<CoreBlock
  name="core-paragraph"
  content={
    '<p>Viverra volutpat varius gravida ultrices pulvinar. Adipiscing facilisis risus, quisque imperdiet pellentesque cursus etiam hyperlink hover. Diam, feugiat facilisis congue lectus neque, risus. Integer id suscipit ut quis in hendrerit placerat nisi a. Volutpat at vitae vitae luctus ut odio.<br>Volutpat at vitae vitae luctus ut odio. Felis vel risus elementum, sagittis. Mattis et faucibus diam quis risus. Odio vel viverra nulla consectetur varius tellus integer ultrices.</p>'
  }
/>

<ContentRichText
  fields={{
    coverage: 'rc-end',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<TalkToAnEngineerCta />

---

## Security
URL: https://spice.ai/security
Date: 2025-11-21T00:42:01
Description: Learn how Spice AI protects your data with SOC 2 Type II compliance, strong access controls, encryption, secure coding, and a principled, defense-in-depth approach.

<HeroCenteredText
  fields={{
    graphic_position: 'graphic-right',
    heading_tag: 'h1',
    heading: 'Security you can trust',
    paragraph:
      'We take a principled approach to protecting your data and systems across Spice Cloud, open-source, and enterprise deployments. Our team works diligently to ensure everything we build is safe, reliable, and secure.',
    cta: [
      {
        type: 'filled',
        cta: {
          title: 'Report a vulnerability',
          url: 'https://docs.spice.ai/security/report',
          target: '_blank',
        },
      },
      {
        type: 'bordered',
        cta: {
          title: 'Contact us',
          url: '/contact/',
          target: '',
        },
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<ContentThreeAcrossIconText
  fields={{
    heading: 'Security Principles',
    heading_tag: 'h2',
    paragraph:
      "Our principles form the foundation of Spice AI's security, guiding every decision and action we make.",
    items: [
      {
        icon: {
          ID: 1170,
          id: 1170,
          title: 'Security_Compliance',
          filename: 'Security_Compliance.svg',
          filesize: 12371,
          url: '/website-assets/media/2025/11/Security_Compliance.svg',
          link: '/security/attachment/security_compliance/',
          alt: '',
          author: '6',
          description: '',
          caption: '',
          name: 'security_compliance',
          status: 'inherit',
          uploaded_to: 1011,
          date: '2025-11-22 00:50:04',
          modified: '2025-11-22 00:50:04',
          menu_order: 0,
          mime_type: 'image/svg+xml',
          type: 'image',
          subtype: 'svg+xml',
          icon: '/website-assets/media/default.png',
          width: 0,
          height: 0,
          sizes: {
            thumbnail: '/website-assets/media/2025/11/Security_Compliance.svg',
            'thumbnail-width': 1,
            'thumbnail-height': 1,
            medium: '/website-assets/media/2025/11/Security_Compliance.svg',
            'medium-width': 1,
            'medium-height': 1,
            medium_large: '/website-assets/media/2025/11/Security_Compliance.svg',
            'medium_large-width': 1,
            'medium_large-height': 1,
            large: '/website-assets/media/2025/11/Security_Compliance.svg',
            'large-width': 1,
            'large-height': 1,
            '1536x1536': '/website-assets/media/2025/11/Security_Compliance.svg',
            '1536x1536-width': 1,
            '1536x1536-height': 1,
            '2048x2048': '/website-assets/media/2025/11/Security_Compliance.svg',
            '2048x2048-width': 1,
            '2048x2048-height': 1,
          },
        },
        title: 'Compliance',
        description: 'Certified SOC 2 Type II compliance.',
      },
      {
        icon: {
          ID: 1176,
          id: 1176,
          title: 'Security_Secure access control',
          filename: 'Security_Secure-access-control.svg',
          filesize: 3850,
          url: '/website-assets/media/2025/11/Security_Secure-access-control.svg',
          link: '/security/attachment/security_secure-access-control/',
          alt: '',
          author: '6',
          description: '',
          caption: '',
          name: 'security_secure-access-control',
          status: 'inherit',
          uploaded_to: 1011,
          date: '2025-11-22 00:50:09',
          modified: '2025-11-22 00:50:09',
          menu_order: 0,
          mime_type: 'image/svg+xml',
          type: 'image',
          subtype: 'svg+xml',
          icon: '/website-assets/media/default.png',
          width: 0,
          height: 0,
          sizes: {
            thumbnail: '/website-assets/media/2025/11/Security_Secure-access-control.svg',
            'thumbnail-width': 1,
            'thumbnail-height': 1,
            medium: '/website-assets/media/2025/11/Security_Secure-access-control.svg',
            'medium-width': 1,
            'medium-height': 1,
            medium_large: '/website-assets/media/2025/11/Security_Secure-access-control.svg',
            'medium_large-width': 1,
            'medium_large-height': 1,
            large: '/website-assets/media/2025/11/Security_Secure-access-control.svg',
            'large-width': 1,
            'large-height': 1,
            '1536x1536': '/website-assets/media/2025/11/Security_Secure-access-control.svg',
            '1536x1536-width': 1,
            '1536x1536-height': 1,
            '2048x2048': '/website-assets/media/2025/11/Security_Secure-access-control.svg',
            '2048x2048-width': 1,
            '2048x2048-height': 1,
          },
        },
        title: 'Secure access control',
        description:
          'Authentication (AuthN), Authorization (AuthZ), and RBAC (Role-Based Access Control).',
      },
      {
        icon: {
          ID: 1171,
          id: 1171,
          title: 'Security_Data protection',
          filename: 'Security_Data-protection.svg',
          filesize: 5976,
          url: '/website-assets/media/2025/11/Security_Data-protection.svg',
          link: '/security/attachment/security_data-protection/',
          alt: '',
          author: '6',
          description: '',
          caption: '',
          name: 'security_data-protection',
          status: 'inherit',
          uploaded_to: 1011,
          date: '2025-11-22 00:50:05',
          modified: '2025-11-22 00:50:05',
          menu_order: 0,
          mime_type: 'image/svg+xml',
          type: 'image',
          subtype: 'svg+xml',
          icon: '/website-assets/media/default.png',
          width: 0,
          height: 0,
          sizes: {
            thumbnail: '/website-assets/media/2025/11/Security_Data-protection.svg',
            'thumbnail-width': 1,
            'thumbnail-height': 1,
            medium: '/website-assets/media/2025/11/Security_Data-protection.svg',
            'medium-width': 1,
            'medium-height': 1,
            medium_large: '/website-assets/media/2025/11/Security_Data-protection.svg',
            'medium_large-width': 1,
            'medium_large-height': 1,
            large: '/website-assets/media/2025/11/Security_Data-protection.svg',
            'large-width': 1,
            'large-height': 1,
            '1536x1536': '/website-assets/media/2025/11/Security_Data-protection.svg',
            '1536x1536-width': 1,
            '1536x1536-height': 1,
            '2048x2048': '/website-assets/media/2025/11/Security_Data-protection.svg',
            '2048x2048-width': 1,
            '2048x2048-height': 1,
          },
        },
        title: 'Data protection',
        description:
          'All secret and sensitive information is encrypted in transit and at rest.',
      },
      {
        icon: {
          ID: 1175,
          id: 1175,
          title: 'Security_Multi-factor authentication',
          filename: 'Security_Multi-factor-authentication.svg',
          filesize: 49835,
          url: '/website-assets/media/2025/11/Security_Multi-factor-authentication.svg',
          link: '/security/attachment/security_multi-factor-authentication/',
          alt: '',
          author: '6',
          description: '',
          caption: '',
          name: 'security_multi-factor-authentication',
          status: 'inherit',
          uploaded_to: 1011,
          date: '2025-11-22 00:50:08',
          modified: '2025-11-22 00:50:08',
          menu_order: 0,
          mime_type: 'image/svg+xml',
          type: 'image',
          subtype: 'svg+xml',
          icon: '/website-assets/media/default.png',
          width: 0,
          height: 0,
          sizes: {
            thumbnail:
              '/website-assets/media/2025/11/Security_Multi-factor-authentication.svg',
            'thumbnail-width': 1,
            'thumbnail-height': 1,
            medium: '/website-assets/media/2025/11/Security_Multi-factor-authentication.svg',
            'medium-width': 1,
            'medium-height': 1,
            medium_large:
              '/website-assets/media/2025/11/Security_Multi-factor-authentication.svg',
            'medium_large-width': 1,
            'medium_large-height': 1,
            large: '/website-assets/media/2025/11/Security_Multi-factor-authentication.svg',
            'large-width': 1,
            'large-height': 1,
            '1536x1536':
              '/website-assets/media/2025/11/Security_Multi-factor-authentication.svg',
            '1536x1536-width': 1,
            '1536x1536-height': 1,
            '2048x2048':
              '/website-assets/media/2025/11/Security_Multi-factor-authentication.svg',
            '2048x2048-width': 1,
            '2048x2048-height': 1,
          },
        },
        title: 'Multi-factor authentication',
        description:
          'All authentication systems require and enforce multi-factor authentication (MFA).',
      },
      {
        icon: {
          ID: 1174,
          id: 1174,
          title: 'Security_Least privilege',
          filename: 'Security_Least-privilege.svg',
          filesize: 11526,
          url: '/website-assets/media/2025/11/Security_Least-privilege.svg',
          link: '/security/attachment/security_least-privilege/',
          alt: '',
          author: '6',
          description: '',
          caption: '',
          name: 'security_least-privilege',
          status: 'inherit',
          uploaded_to: 1011,
          date: '2025-11-22 00:50:07',
          modified: '2025-11-22 00:50:07',
          menu_order: 0,
          mime_type: 'image/svg+xml',
          type: 'image',
          subtype: 'svg+xml',
          icon: '/website-assets/media/default.png',
          width: 0,
          height: 0,
          sizes: {
            thumbnail: '/website-assets/media/2025/11/Security_Least-privilege.svg',
            'thumbnail-width': 1,
            'thumbnail-height': 1,
            medium: '/website-assets/media/2025/11/Security_Least-privilege.svg',
            'medium-width': 1,
            'medium-height': 1,
            medium_large: '/website-assets/media/2025/11/Security_Least-privilege.svg',
            'medium_large-width': 1,
            'medium_large-height': 1,
            large: '/website-assets/media/2025/11/Security_Least-privilege.svg',
            'large-width': 1,
            'large-height': 1,
            '1536x1536': '/website-assets/media/2025/11/Security_Least-privilege.svg',
            '1536x1536-width': 1,
            '1536x1536-height': 1,
            '2048x2048': '/website-assets/media/2025/11/Security_Least-privilege.svg',
            '2048x2048-width': 1,
            '2048x2048-height': 1,
          },
        },
        title: 'Least privilege',
        description:
          'Least privilege access is employed so that users, employees, and contractors do not have greater access beyond what is necessary.',
      },
      {
        icon: {
          ID: 1179,
          id: 1179,
          title: 'Security_Defense-in-depth',
          filename: 'Security_Defense-in-depth.png',
          filesize: 20925,
          url: '/website-assets/media/2025/11/Security_Defense-in-depth.png',
          link: '/security/attachment/security_defense-in-depth-2/',
          alt: '',
          author: '6',
          description: '',
          caption: '',
          name: 'security_defense-in-depth-2',
          status: 'inherit',
          uploaded_to: 1011,
          date: '2025-11-22 01:04:38',
          modified: '2025-11-22 01:04:38',
          menu_order: 0,
          mime_type: 'image/png',
          type: 'image',
          subtype: 'png',
          icon: '/website-assets/media/default.png',
          width: 200,
          height: 200,
          sizes: {
            thumbnail: '/website-assets/media/2025/11/Security_Defense-in-depth-150x150.png',
            'thumbnail-width': 150,
            'thumbnail-height': 150,
            medium: '/website-assets/media/2025/11/Security_Defense-in-depth.png',
            'medium-width': 200,
            'medium-height': 200,
            medium_large: '/website-assets/media/2025/11/Security_Defense-in-depth.png',
            'medium_large-width': 200,
            'medium_large-height': 200,
            large: '/website-assets/media/2025/11/Security_Defense-in-depth.png',
            'large-width': 200,
            'large-height': 200,
            '1536x1536': '/website-assets/media/2025/11/Security_Defense-in-depth.png',
            '1536x1536-width': 200,
            '1536x1536-height': 200,
            '2048x2048': '/website-assets/media/2025/11/Security_Defense-in-depth.png',
            '2048x2048-width': 200,
            '2048x2048-height': 200,
          },
        },
        title: 'Defense-in-depth',
        description: 'Multiple security controls in depth.',
      },
      {
        icon: {
          ID: 1169,
          id: 1169,
          title: 'Security_Code audits',
          filename: 'Security_Code-audits.svg',
          filesize: 5163,
          url: '/website-assets/media/2025/11/Security_Code-audits.svg',
          link: '/security/attachment/security_code-audits/',
          alt: '',
          author: '6',
          description: '',
          caption: '',
          name: 'security_code-audits',
          status: 'inherit',
          uploaded_to: 1011,
          date: '2025-11-22 00:50:04',
          modified: '2025-11-22 00:50:04',
          menu_order: 0,
          mime_type: 'image/svg+xml',
          type: 'image',
          subtype: 'svg+xml',
          icon: '/website-assets/media/default.png',
          width: 0,
          height: 0,
          sizes: {
            thumbnail: '/website-assets/media/2025/11/Security_Code-audits.svg',
            'thumbnail-width': 1,
            'thumbnail-height': 1,
            medium: '/website-assets/media/2025/11/Security_Code-audits.svg',
            'medium-width': 1,
            'medium-height': 1,
            medium_large: '/website-assets/media/2025/11/Security_Code-audits.svg',
            'medium_large-width': 1,
            'medium_large-height': 1,
            large: '/website-assets/media/2025/11/Security_Code-audits.svg',
            'large-width': 1,
            'large-height': 1,
            '1536x1536': '/website-assets/media/2025/11/Security_Code-audits.svg',
            '1536x1536-width': 1,
            '1536x1536-height': 1,
            '2048x2048': '/website-assets/media/2025/11/Security_Code-audits.svg',
            '2048x2048-width': 1,
            '2048x2048-height': 1,
          },
        },
        title: 'Auditable',
        description: 'Access and usage are logged and auditable.',
      },
      {
        icon: {
          ID: 1177,
          id: 1177,
          title: 'Security_Secure code',
          filename: 'Security_Secure-code.svg',
          filesize: 12349,
          url: '/website-assets/media/2025/11/Security_Secure-code.svg',
          link: '/security/attachment/security_secure-code/',
          alt: '',
          author: '6',
          description: '',
          caption: '',
          name: 'security_secure-code',
          status: 'inherit',
          uploaded_to: 1011,
          date: '2025-11-22 00:50:10',
          modified: '2025-11-22 00:50:10',
          menu_order: 0,
          mime_type: 'image/svg+xml',
          type: 'image',
          subtype: 'svg+xml',
          icon: '/website-assets/media/default.png',
          width: 0,
          height: 0,
          sizes: {
            thumbnail: '/website-assets/media/2025/11/Security_Secure-code.svg',
            'thumbnail-width': 1,
            'thumbnail-height': 1,
            medium: '/website-assets/media/2025/11/Security_Secure-code.svg',
            'medium-width': 1,
            'medium-height': 1,
            medium_large: '/website-assets/media/2025/11/Security_Secure-code.svg',
            'medium_large-width': 1,
            'medium_large-height': 1,
            large: '/website-assets/media/2025/11/Security_Secure-code.svg',
            'large-width': 1,
            'large-height': 1,
            '1536x1536': '/website-assets/media/2025/11/Security_Secure-code.svg',
            '1536x1536-width': 1,
            '1536x1536-height': 1,
            '2048x2048': '/website-assets/media/2025/11/Security_Secure-code.svg',
            '2048x2048-width': 1,
            '2048x2048-height': 1,
          },
        },
        title: 'Secure code',
        description:
          'Code is scanned and tested for secrets and vulnerabilities.',
      },
      {
        icon: {
          ID: 1169,
          id: 1169,
          title: 'Security_Code audits',
          filename: 'Security_Code-audits.svg',
          filesize: 5163,
          url: '/website-assets/media/2025/11/Security_Code-audits.svg',
          link: '/security/attachment/security_code-audits/',
          alt: '',
          author: '6',
          description: '',
          caption: '',
          name: 'security_code-audits',
          status: 'inherit',
          uploaded_to: 1011,
          date: '2025-11-22 00:50:04',
          modified: '2025-11-22 00:50:04',
          menu_order: 0,
          mime_type: 'image/svg+xml',
          type: 'image',
          subtype: 'svg+xml',
          icon: '/website-assets/media/default.png',
          width: 0,
          height: 0,
          sizes: {
            thumbnail: '/website-assets/media/2025/11/Security_Code-audits.svg',
            'thumbnail-width': 1,
            'thumbnail-height': 1,
            medium: '/website-assets/media/2025/11/Security_Code-audits.svg',
            'medium-width': 1,
            'medium-height': 1,
            medium_large: '/website-assets/media/2025/11/Security_Code-audits.svg',
            'medium_large-width': 1,
            'medium_large-height': 1,
            large: '/website-assets/media/2025/11/Security_Code-audits.svg',
            'large-width': 1,
            'large-height': 1,
            '1536x1536': '/website-assets/media/2025/11/Security_Code-audits.svg',
            '1536x1536-width': 1,
            '1536x1536-height': 1,
            '2048x2048': '/website-assets/media/2025/11/Security_Code-audits.svg',
            '2048x2048-width': 1,
            '2048x2048-height': 1,
          },
        },
        title: 'Code audits',
        description:
          'Internal and external experts audit codebases to identify and address vulnerabilities, maintain best practices, and ensure adherence to security standards.',
      },
      {
        icon: {
          ID: 1173,
          id: 1173,
          title: 'Security_Just-in-time access',
          filename: 'Security_Just-in-time-access.svg',
          filesize: 5219,
          url: '/website-assets/media/2025/11/Security_Just-in-time-access.svg',
          link: '/security/attachment/security_just-in-time-access/',
          alt: '',
          author: '6',
          description: '',
          caption: '',
          name: 'security_just-in-time-access',
          status: 'inherit',
          uploaded_to: 1011,
          date: '2025-11-22 00:50:06',
          modified: '2025-11-22 00:50:06',
          menu_order: 0,
          mime_type: 'image/svg+xml',
          type: 'image',
          subtype: 'svg+xml',
          icon: '/website-assets/media/default.png',
          width: 0,
          height: 0,
          sizes: {
            thumbnail: '/website-assets/media/2025/11/Security_Just-in-time-access.svg',
            'thumbnail-width': 1,
            'thumbnail-height': 1,
            medium: '/website-assets/media/2025/11/Security_Just-in-time-access.svg',
            'medium-width': 1,
            'medium-height': 1,
            medium_large: '/website-assets/media/2025/11/Security_Just-in-time-access.svg',
            'medium_large-width': 1,
            'medium_large-height': 1,
            large: '/website-assets/media/2025/11/Security_Just-in-time-access.svg',
            'large-width': 1,
            'large-height': 1,
            '1536x1536': '/website-assets/media/2025/11/Security_Just-in-time-access.svg',
            '1536x1536-width': 1,
            '1536x1536-height': 1,
            '2048x2048': '/website-assets/media/2025/11/Security_Just-in-time-access.svg',
            '2048x2048-width': 1,
            '2048x2048-height': 1,
          },
        },
        title: 'Just-in-time access',
        description: "Access is given only when it's required.",
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<ContentImageVideo
  fields={{
    variant: 'variant-2',
    heading: 'Security is a shared responsibility',
    heading_tag: 'h2',
    paragraph:
      'Protecting the confidentiality, integrity, and availability of Spice systems is the top priority. We use strong access controls, encryption, code scans, secure patching, isolated environments, and external audits. Customers also help maintain security by following authentication and access best practices.',
    cta: [
      {
        type: 'filled',
        cta: {
          title: 'Report a vulnerability',
          url: 'https://docs.spice.ai/security/report',
          target: '_blank',
        },
      },
    ],
    media_type: 'image',
    media_image: {
      ID: 995,
      id: 995,
      title: 'Frame-1171275267-5',
      filename: 'Frame-1171275267-5.png',
      filesize: 411785,
      url: '/website-assets/media/2025/11/Frame-1171275267-5.png',
      link: '/careers/attachment/frame-1171275267-5/',
      alt: '',
      author: '5',
      description: '',
      caption: '',
      name: 'frame-1171275267-5',
      status: 'inherit',
      uploaded_to: 961,
      date: '2025-11-19 21:17:03',
      modified: '2025-11-19 21:17:03',
      menu_order: 0,
      mime_type: 'image/png',
      type: 'image',
      subtype: 'png',
      icon: '/website-assets/media/default.png',
      width: 651,
      height: 447,
      sizes: {
        thumbnail: '/website-assets/media/2025/11/Frame-1171275267-5-150x150.png',
        'thumbnail-width': 150,
        'thumbnail-height': 150,
        medium: '/website-assets/media/2025/11/Frame-1171275267-5-300x206.png',
        'medium-width': 300,
        'medium-height': 206,
        medium_large: '/website-assets/media/2025/11/Frame-1171275267-5.png',
        'medium_large-width': 651,
        'medium_large-height': 447,
        large: '/website-assets/media/2025/11/Frame-1171275267-5.png',
        'large-width': 651,
        'large-height': 447,
        '1536x1536': '/website-assets/media/2025/11/Frame-1171275267-5.png',
        '1536x1536-width': 651,
        '1536x1536-height': 447,
        '2048x2048': '/website-assets/media/2025/11/Frame-1171275267-5.png',
        '2048x2048-width': 651,
        '2048x2048-height': 447,
      },
    },
    graphic_overlay: false,
    media_video: '',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<AccordionFaq
  fields={{
    heading: 'FAQs',
    heading_tag: 'h2',
    paragraph:
      'Answers to common questions about how we protect data and ensure safe, reliable operations.',
    items: [
      {
        title: 'Is Spice SOC 2 compliant?',
        paragraph:
          '<p>Yes. Spice AI has achieved SOC 2 Type II compliance, independently audited by Prescient Assurance in accordance with AICPA standards. This certification validates our commitment to enterprise-grade security, availability, and process integrity. A copy of the audit report is available to customers on the Spice.ai Enterprise plan upon request.</p>\n',
      },
      {
        title: 'How is data protected in Spice?',
        paragraph:
          '<p>Spice AI encrypts all sensitive data in transit and at rest. Corporate secrets are stored in an enterprise-grade password manager with SSO access, and service secrets are managed using platform-specific secure key vaults. TLS 1.2+ is enforced for all encrypted transmissions. Access is logged, auditable, and restricted using least-privilege and JIT access controls.</p>\n',
      },
      {
        title: 'How does Spice enforce access control?',
        paragraph:
          '<p>Spice uses a combination of SSO, RBAC, strong authentication, and least-privilege policies to protect systems and environments. Access is granted only when required through just-in-time (JIT) workflows and automatically expires after a limited time. All access is logged, monitored, and auditable.</p>\n',
      },
    ],
    padding_top: 'st-xl',
    padding_bottom: 'sb-xl',
  }}
/>

<TalkToAnEngineerCta />

---

## Analytics
URL: https://spice.ai/use-case/analytics
Date: 2026-07-09T16:00:00
Description: Add a real-time analytics replica to PostgreSQL, MySQL, and MongoDB in minutes. Run sub-second analytics on operational data with high-throughput CDC replication, without ETL and without load on production.

<HeroTextImageFiftyFifty
  fields={{
    variant: 'variant-1',
    eyebrow: 'Analytics',
    heading_tag: 'h1',
    heading: 'Real-time analytics on operational data, without ETL',
    paragraph:
      'Add a sandboxed, analytics-ready replica alongside PostgreSQL, MySQL, and MongoDB in minutes. Spice keeps it fresh with high-throughput change data capture for sub-second queries, no ETL, and no analytical load on your production database.',
    cta: [
      {
        type: 'filled',
        cta: {
          title: 'Get a demo',
          url: 'https://meetings.hubspot.com/vladi-semenov',
          target: '_blank',
        },
      },
      {
        type: 'bordered',
        cta: {
          title: 'View the docs',
          url: 'https://spiceai.org/docs/features/cdc',
          target: '_blank',
        },
      },
    ],
    media_type: 'svg',
    media_video: '',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<ContentStats
  fields={{
    heading: 'Real-time analytics, zero production impact',
    heading_tag: 'h2',
    stats: [
      {
        media_type: 'image',
        image: false,
        lottie: false,
        amount: '0',
        suffix: '',
        after_text: 'analytical queries run on your production database, ever',
      },
      {
        media_type: 'image',
        image: false,
        lottie: false,
        amount: '2.0',
        suffix: 's',
        after_text:
          'end-to-end freshness under load, from source commit to query-ready',
      },
      {
        media_type: 'image',
        image: false,
        lottie: false,
        amount: '1.5',
        suffix: 'x',
        after_text: 'faster than DuckDB with 3x less memory on Spice Cayenne',
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<ContentImageVideo
  fields={{
    variant: 'variant-2',
    heading: "Operational databases weren't built for analytics",
    heading_tag: 'h2',
    paragraph:
      'Running analytical queries directly on MySQL, PostgreSQL, or MongoDB puts mission-critical operations at risk: heavy queries contend with production traffic, row-level security policies grow brittle, and data can leak beyond its intended audience. The usual workaround, ETL pipelines that copy data into a separate analytical system, is expensive to build, costly to operate, and never real-time, with data arriving hours or days stale.',
    cta: false,
    media_type: 'image',
    media_image: {
      ID: 1048,
      id: 1048,
      title: 'use_case_challenge',
      filename: 'use_case_challenge.png',
      url: '/website-assets/media/2025/11/use_case_challenge.png',
      alt: 'Analytical queries competing with transactional load on an operational database',
      name: 'use_case_challenge',
      mime_type: 'image/png',
      type: 'image',
      subtype: 'png',
      width: 2720,
      height: 1824,
    },
    graphic_overlay: false,
    media_video: '',
    padding_top: 'st-lg',
    padding_bottom: 'sb-lg',
  }}
/>

<CarouselHorizontalCards
  fields={{
    heading: 'Add analytics to your operational data, without ETL',
    heading_tag: 'h2',
    paragraph:
      'Point Spice at a live operational database and it maintains a continuously updated analytics replica. Start with one table, then compose and join across replicated sources in a single SQL query.',
    item: [
      {
        title: 'Zero load on production',
        paragraph:
          'Spice replicates from the native change log, so analytical queries and AI agents run against the sandboxed replica. Your operational database never executes a single analytical query.',
        cta: {
          title: 'Explore CDC replication',
          url: 'https://spiceai.org/docs/features/cdc',
          target: '_blank',
        },
        image: {
          ID: 1615,
          id: 1615,
          title: 'use_case_operational_data_federation',
          filename: 'use_case_operational_data_federation.png',
          url: '/website-assets/media/2025/12/use_case_operational_data_federation.png',
          alt: 'Spice replicating committed changes from operational databases into an analytics replica',
          name: 'use_case_operational_data_federation',
          mime_type: 'image/png',
          type: 'image',
          subtype: 'png',
          width: 1388,
          height: 768,
        },
      },
      {
        title: 'Real-time freshness, no pipelines',
        paragraph:
          'Native replication from the PostgreSQL WAL, MySQL binlog, and MongoDB oplog delivers single-digit-second freshness. No Debezium or external streaming layer required.',
        cta: {
          title: 'See real-time CDC',
          url: '/feature/real-time-change-data-capture',
          target: '',
        },
        image: {
          ID: 1616,
          id: 1616,
          title: 'use_case_operational_data_accelerate',
          filename: 'use_case_operational_data_accelerate.png',
          url: '/website-assets/media/2025/12/use_case_operational_data_accelerate.png',
          alt: 'Spice keeping an analytics replica fresh with high-throughput change data capture',
          name: 'use_case_operational_data_accelerate',
          mime_type: 'image/png',
          type: 'image',
          subtype: 'png',
          width: 1388,
          height: 768,
        },
      },
      {
        title: 'Sub-second query performance',
        paragraph:
          'Spice materializes the replica with the Spice Cayenne accelerator, built on the Vortex columnar format: 1.5x faster than DuckDB with 3x less memory. DuckDB and SQLite acceleration engines are also supported.',
        cta: {
          title: 'Explore Spice Cayenne',
          url: '/blog/introducing-spice-cayenne-data-accelerator',
          target: '',
        },
        image: {
          ID: 1617,
          id: 1617,
          title: 'use_case_operational_data_ai',
          filename: 'use_case_operational_data_ai.png',
          url: '/website-assets/media/2025/12/use_case_operational_data_ai.png',
          alt: 'Sub-second analytical queries served from an accelerated Spice replica',
          name: 'use_case_operational_data_ai',
          mime_type: 'image/png',
          type: 'image',
          subtype: 'png',
          width: 1388,
          height: 768,
        },
      },
      {
        title: 'Connect the tools you already use',
        paragraph:
          'Query the replica from Microsoft Power BI, Tableau, Looker, and Apache Superset over Arrow Flight SQL, ODBC, and JDBC, or build in code with the SpicePy Python library and the Go, Rust, Java, and JavaScript SDKs.',
        cta: {
          title: 'Read the Power BI guide',
          url: '/blog/spice-and-power-bi',
          target: '',
        },
        image: {
          ID: 2602,
          id: 2602,
          title: 'Microsoft Power BI and Spice AI',
          filename: '68cad2f64c35671cc146ea08_image-3.png',
          url: '/website-assets/media/2025/11/68cad2f64c35671cc146ea08_image-3.png',
          alt: 'Microsoft Power BI connected to an analytics replica served by Spice',
          name: 'powerbi-spice-ai',
          mime_type: 'image/png',
          type: 'image',
          subtype: 'png',
          width: 2404,
          height: 1262,
        },
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<ContentThreeAcrossIconText
  fields={{
    heading: 'Why teams run analytics on Spice',
    heading_tag: 'h2',
    paragraph:
      'Spice adds an analytics replica to your operational data with the freshness, scale, and controls that production analytics and AI agents demand.',
    items: [
      {
        icon: {
          ID: 610,
          id: 610,
          title: 'Native CDC replication',
          filename: 'platform_federation_connect_sources_icon.svg',
          url: '/website-assets/media/2025/11/platform_federation_connect_sources_icon.svg',
          alt: '',
          name: 'platform_federation_connect_sources_icon',
          mime_type: 'image/svg+xml',
          type: 'image',
          subtype: 'svg+xml',
          width: 0,
          height: 0,
        },
        title: 'Native CDC replication',
        description:
          'Replicate directly from the PostgreSQL WAL, MySQL binlog, and MongoDB oplog, with automatic slot management and bootstrapped snapshots. No Debezium required.',
      },
      {
        icon: {
          ID: 1093,
          id: 1093,
          title: 'One SQL surface',
          filename: 'UseCase_OperationalDataLakehouse_SQL-First-Engine.svg',
          url: '/website-assets/media/2025/11/UseCase_OperationalDataLakehouse_SQL-First-Engine.svg',
          alt: '',
          name: 'usecase_operationaldatalakehouse_sql-first-engine',
          mime_type: 'image/svg+xml',
          type: 'image',
          subtype: 'svg+xml',
          width: 0,
          height: 0,
        },
        title: 'One SQL surface',
        description:
          'Federate and join replicated datasets with object storage, warehouses, and APIs in a single query using standard SQL.',
      },
      {
        icon: {
          ID: 603,
          id: 603,
          title: 'Sub-second acceleration',
          filename: 'platform_federation_fast_icon.svg',
          url: '/website-assets/media/2025/11/platform_federation_fast_icon.svg',
          alt: '',
          name: 'platform_federation_fast_icon',
          mime_type: 'image/svg+xml',
          type: 'image',
          subtype: 'svg+xml',
          width: 0,
          height: 0,
        },
        title: 'Sub-second acceleration',
        description:
          'Materialize hot working sets locally with Spice Cayenne, built on the Vortex columnar format, for millisecond query performance.',
      },
      {
        icon: {
          ID: 1091,
          id: 1091,
          title: 'Petabyte-scale distributed query',
          filename:
            'UseCase_OperationalDataLakehouse_Operational-and-Analytical.svg',
          url: '/website-assets/media/2025/11/UseCase_OperationalDataLakehouse_Operational-and-Analytical.svg',
          alt: '',
          name: 'usecase_operationaldatalakehouse_operational-and-analytical',
          mime_type: 'image/svg+xml',
          type: 'image',
          subtype: 'svg+xml',
          width: 0,
          height: 0,
        },
        title: 'Petabyte-scale distributed query',
        description:
          'Scale beyond one node with multi-node distributed compute built on Apache Ballista, object-store native and highly available.',
      },
      {
        icon: {
          ID: 1089,
          id: 1089,
          title: 'Sandboxed and governed',
          filename:
            'UseCase_OperationalDataLakehouse_Governance-and-Observability.svg',
          url: '/website-assets/media/2025/11/UseCase_OperationalDataLakehouse_Governance-and-Observability.svg',
          alt: '',
          name: 'usecase_operationaldatalakehouse_governance-and-observability',
          mime_type: 'image/svg+xml',
          type: 'image',
          subtype: 'svg+xml',
          width: 0,
          height: 0,
        },
        title: 'Sandboxed and governed',
        description:
          'Each replica is a physically isolated sandbox. Row- and column-level policy, PII masking, mTLS, and OIDC authentication are enforced inside the query engine.',
      },
      {
        icon: {
          ID: 1090,
          id: 1090,
          title: 'Built on open standards',
          filename: 'UseCase_OperationalDataLakehouse_Open-Table-Support.svg',
          url: '/website-assets/media/2025/11/UseCase_OperationalDataLakehouse_Open-Table-Support.svg',
          alt: '',
          name: 'usecase_operationaldatalakehouse_open-table-support',
          mime_type: 'image/svg+xml',
          type: 'image',
          subtype: 'svg+xml',
          width: 0,
          height: 0,
        },
        title: 'Built on open standards',
        description:
          'Arrow, Iceberg, Delta, Parquet, and Vortex, served over Arrow Flight SQL, ODBC, and JDBC. Open source and portable, with no lock-in.',
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<ContentImageVideo
  fields={{
    variant: 'variant-1',
    heading: 'Query operational data with SQL in the Spice portal',
    heading_tag: 'h2',
    paragraph:
      'Explore datasets, run SQL, and inspect results in the Spice Cloud portal. Built-in observability traces every query with execution timing and lineage, so you can validate freshness and tune performance against the replica instead of production.',
    cta: [
      {
        type: 'filled',
        cta: {
          title: 'Query with Spice',
          url: 'https://spiceai.org/docs/getting-started',
          target: '_blank',
        },
      },
    ],
    media_type: 'image',
    media_image: {
      ID: 2603,
      id: 2603,
      title: 'Spice portal SQL query and results',
      filename: 'spice-sql-observability-v2.png',
      url: '/website-assets/media/2026/04/spice-sql-observability-v2.png',
      alt: 'Spice AI portal running a SQL query against an accelerated dataset with results and execution timing',
      name: 'spice-sql-observability-v2',
      mime_type: 'image/png',
      type: 'image',
      subtype: 'png',
      width: 3476,
      height: 1692,
    },
    graphic_overlay: false,
    media_video: '',
    padding_top: 'st-lg',
    padding_bottom: 'sb-lg',
  }}
/>

<Testimonials
  heading="Proven in production"
  headingTag="h2"
  paragraph="Teams building real-time systems at scale run Spice to serve analytics and AI from operational data."
  items={['barracuda', 'twilio']}
/>

<AccordionFaq
  fields={{
    heading: 'FAQs',
    heading_tag: 'h2',
    paragraph:
      'Common questions from teams adding real-time analytics to an operational database.',
    items: [
      {
        title:
          'When should I add an analytics replica instead of a data warehouse?',
        paragraph:
          '<p>Add an analytics replica when dashboards, in-app reporting, or AI agents need fresh answers on operational data without a pipeline project. A warehouse fits scheduled, organization-wide BI over historical data. The replica is query-ready within seconds of a source commit, while ETL into a warehouse lands data hours or days later.</p>\n',
      },
      {
        title:
          'Can I run dashboards on production data without slowing it down?',
        paragraph:
          '<p>Yes. Spice replicates from the native change log, the PostgreSQL WAL, MySQL binlog, or MongoDB oplog, into a sandboxed replica, and dashboards query the replica. In benchmarks the operational database sustained its full transactional workload while Spice served all analytics, and production never executed a single analytical query.</p>\n',
      },
      {
        title:
          'Can I join data across PostgreSQL, MySQL, and MongoDB in one query?',
        paragraph:
          '<p>Yes. Each source replicates into the same Spice runtime, so one SQL query can join tables replicated from PostgreSQL, MySQL, MongoDB, and DynamoDB, plus event streams from systems like Kafka. Start with one table, then compose across sources as you go. See the <a href="https://spiceai.org/docs/features/cdc">CDC documentation</a> for supported sources.</p>\n',
      },
      {
        title: 'How far behind production is the replica?',
        paragraph:
          '<p>Single-digit seconds under load: roughly 2.0 seconds end-to-end for CDC covering inserts, updates, and deletes, measured from source commit to exactly-correct results on the replica. Dashboards and agents stay current without scheduled batch loads.</p>\n',
      },
      {
        title: 'What happens to my existing ETL pipelines?',
        paragraph:
          '<p>You can retire them for the workloads the replica serves. Replication is built into the runtime, so there are no external ETL jobs, no Debezium to operate, and no streaming layer to manage. Adoption is incremental: move one table or dashboard at a time while existing pipelines keep running.</p>\n',
      },
      {
        title:
          'What does it take to point an existing dashboard at the replica?',
        paragraph:
          '<p>Any tool that speaks Arrow Flight SQL, ODBC, or JDBC can query the replica. Tableau, Looker, and Apache Superset connect through standard drivers, and Microsoft Power BI uses the native Spice connector, a one-time install. The queries themselves stay SQL, so dashboard logic carries over unchanged. Application code can use the SpicePy Python library or the Go, Rust, Java, and JavaScript SDKs.</p>\n',
      },
      {
        title: 'How does analytics scale beyond a single node?',
        paragraph:
          '<p>Spice adds multi-node distributed compute built on Apache Ballista for petabyte-scale query. Distribution composes with local acceleration: use acceleration for working sets that fit on one node, and distribution for data that does not.</p>\n',
      },
      {
        title: 'Do I need Spice Cloud, or can I self-host the replica?',
        paragraph:
          '<p>Both work. The Spice runtime is open source under the Apache 2.0 license and includes CDC replication and acceleration, so you can self-host the full analytics replica. Spice Cloud offers it fully managed, and Spice.ai Enterprise adds self-hosted deployment with SSO, RBAC, and audit logs.</p>\n',
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<ContentResourceFeatured
  fields={{
    heading: 'Learn more about analytics on Spice',
    heading_tag: 'h2',
    paragraph:
      'Guides, benchmarks, and references for adding a real-time analytics replica to your operational data.',
    mode: 'default',
    resources: [
      {
        source: 'picker',
        resource: [
          {
            title:
              'Spice 2.0: Real-Time Analytical Query on Operational Data, Without ETL',
            slug: '/blog/spice-2-0-is-now-available',
            excerpt:
              'Add real-time analytical query and search to operational data without ETL via high-throughput CDC replication, petabyte-scale distributed compute built on Apache Ballista, and enterprise-grade controls.',
            image: '/website-assets/media/2026/04/spice-2.0-blog-header.svg',
            type: 'Blog',
            taxonomy: [],
          },
        ],
        resource_manual: {
          eyebrow: '',
          title: null,
          description: '',
          image: false,
        },
      },
      {
        source: 'manual',
        resource: null,
        resource_manual: {
          eyebrow: 'Platform',
          title: {
            title: 'Analytics Replica',
            url: '/platform/analytics',
            target: '',
          },
          description:
            'See how Spice adds a sandboxed analytics replica to PostgreSQL, MySQL, and MongoDB with real-time CDC replication.',
          image: {
            url: '/website-assets/media/2026/04/spice-dashboard-v2.png',
          },
        },
      },
      {
        source: 'manual',
        resource: null,
        resource_manual: {
          eyebrow: 'Docs',
          title: {
            title: 'Change Data Capture (CDC) Replication',
            url: 'https://spiceai.org/docs/features/cdc',
            target: '_blank',
          },
          description:
            'Configure native replication from the PostgreSQL WAL, MySQL binlog, and MongoDB oplog, plus event-stream ingestion from Kafka.',
          image: {
            url: '/website-assets/media/2025/12/cookbooks-jpeg.png',
          },
        },
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<TalkToAnEngineerCta />

---

## Application Search
URL: https://spice.ai/use-case/application-search
Date: 2025-11-21T16:16:20
Description: Add fast, relevant search to your app with hybrid SQL search. Governed, low-latency, and easy to ship anywhere.

<HeroTextImageFiftyFifty
  fields={{
    variant: 'variant-1',
    eyebrow: 'Application Search',
    heading_tag: 'h1',
    heading: 'Application search that scales',
    paragraph:
      'Deliver relevant and fast results by combining vector, full-text, and keyword search in one runtime. ',
    cta: [
      {
        type: 'filled',
        cta: {
          title: 'Get a demo',
          url: 'https://meetings.hubspot.com/vladi-semenov',
          target: '_blank',
        },
      },
      {
        type: 'bordered',
        cta: {
          title: 'View the docs',
          url: 'https://spiceai.org/docs/features/search',
          target: '_blank',
        },
      },
    ],
    media_type: 'image',
    media_image: {
      ID: 1558,
      id: 1558,
      title: 'use_case_app_search_header',
      filename: 'use_case_app_search_header.png',
      filesize: 154796,
      url: '/website-assets/media/2025/12/use_case_app_search_header.png',
      link: '/use-case/application-search/attachment/use_case_app_search_header/',
      alt: '',
      author: '6',
      description: '',
      caption: '',
      name: 'use_case_app_search_header',
      status: 'inherit',
      uploaded_to: 1044,
      date: '2025-12-01 22:32:01',
      modified: '2025-12-01 22:32:01',
      menu_order: 0,
      mime_type: 'image/png',
      type: 'image',
      subtype: 'png',
      icon: '/website-assets/media/default.png',
      width: 1360,
      height: 676,
      sizes: {
        thumbnail:
          '/website-assets/media/2025/12/use_case_app_search_header.png',
        'thumbnail-width': 150,
        'thumbnail-height': 150,
        medium: '/website-assets/media/2025/12/use_case_app_search_header.png',
        'medium-width': 300,
        'medium-height': 149,
        medium_large:
          '/website-assets/media/2025/12/use_case_app_search_header.png',
        'medium_large-width': 768,
        'medium_large-height': 382,
        large: '/website-assets/media/2025/12/use_case_app_search_header.png',
        'large-width': 1024,
        'large-height': 509,
        '1536x1536':
          '/website-assets/media/2025/12/use_case_app_search_header.png',
        '1536x1536-width': 1536,
        '1536x1536-height': 676,
        '2048x2048':
          '/website-assets/media/2025/12/use_case_app_search_header.png',
        '2048x2048-width': 2048,
        '2048x2048-height': 676,
      },
    },
    media_video: '',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<ContentStats
  fields={{
    heading: 'Do more with your data',
    heading_tag: 'h2',
    stats: [
      {
        media_type: 'image',
        image: false,
        lottie: false,
        amount: '100',
        suffix: 'x',
        after_text: 'up to 100x faster queries',
      },
      {
        media_type: 'image',
        image: false,
        lottie: false,
        amount: '80',
        suffix: '%',
        after_text: 'up to 80% cost savings on data lakehouse spend',
      },
      {
        media_type: 'image',
        image: false,
        lottie: false,
        amount: '2',
        suffix: 'x',
        after_text: 'increase in data reliability for critical workloads',
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<ContentImageVideo
  fields={{
    variant: 'variant-2',
    heading: 'Modern application search mandates a hybrid approach',
    heading_tag: 'h2',
    paragraph:
      'Building great application search demands a blend of search methods: keyword for precision, full-text for context, and vector for semantic meaning. Most teams struggle to combine them effectively without standing up separate engines or ETL pipelines. The result is fragmented search logic, inconsistent results, and slower performance.',
    cta: false,
    media_type: 'image',
    media_image: {
      ID: 1048,
      id: 1048,
      title: 'use_case_challenge',
      filename: 'use_case_challenge.png',
      filesize: 4349638,
      url: '/website-assets/media/2025/11/use_case_challenge.png',
      link: '/use-case/application-search/attachment/use_case_challenge/',
      alt: '',
      author: '6',
      description: '',
      caption: '',
      name: 'use_case_challenge',
      status: 'inherit',
      uploaded_to: 1044,
      date: '2025-11-21 16:21:07',
      modified: '2025-11-21 16:21:07',
      menu_order: 0,
      mime_type: 'image/png',
      type: 'image',
      subtype: 'png',
      icon: '/website-assets/media/default.png',
      width: 2720,
      height: 1824,
      sizes: {
        thumbnail: '/website-assets/media/2025/11/use_case_challenge.png',
        'thumbnail-width': 150,
        'thumbnail-height': 150,
        medium: '/website-assets/media/2025/11/use_case_challenge.png',
        'medium-width': 300,
        'medium-height': 201,
        medium_large: '/website-assets/media/2025/11/use_case_challenge.png',
        'medium_large-width': 768,
        'medium_large-height': 515,
        large: '/website-assets/media/2025/11/use_case_challenge.png',
        'large-width': 1024,
        'large-height': 687,
        '1536x1536': '/website-assets/media/2025/11/use_case_challenge.png',
        '1536x1536-width': 1536,
        '1536x1536-height': 1030,
        '2048x2048': '/website-assets/media/2025/11/use_case_challenge.png',
        '2048x2048-width': 2048,
        '2048x2048-height': 1373,
      },
    },
    graphic_overlay: false,
    media_video: '',
    padding_top: 'st-lg',
    padding_bottom: 'sb-lg',
  }}
/>

<CarouselHorizontalCards
  fields={{
    heading: 'Relevant and fast application search',
    heading_tag: 'h2',
    paragraph:
      'Ship application search that combines multiple methods, predictable performance, and full data governance.',
    item: [
      {
        title: 'Hybrid search out-of-the-box',
        paragraph:
          'Blend results for keyword, full-text, and vector similarity using Reciprocal Rank Fusion (RRF). Add per-query weights, filters, and recency boosts so the most relevant and newest results appear first.',
        cta: {
          title: 'Explore hybrid SQL search',
          url: '/platform/hybrid-sql-search',
          target: '',
        },
        image: {
          ID: 1604,
          id: 1604,
          title: 'use_case_app_search_ootb',
          filename: 'use_case_app_search_ootb.png',
          filesize: 202757,
          url: '/website-assets/media/2025/12/use_case_app_search_ootb.png',
          link: '/use-case/application-search/attachment/use_case_app_search_ootb/',
          alt: '',
          author: '6',
          description: '',
          caption: '',
          name: 'use_case_app_search_ootb',
          status: 'inherit',
          uploaded_to: 1044,
          date: '2025-12-02 23:28:05',
          modified: '2025-12-02 23:28:05',
          menu_order: 0,
          mime_type: 'image/png',
          type: 'image',
          subtype: 'png',
          icon: '/website-assets/media/default.png',
          width: 1388,
          height: 940,
          sizes: {
            thumbnail:
              '/website-assets/media/2025/12/use_case_app_search_ootb.png',
            'thumbnail-width': 150,
            'thumbnail-height': 150,
            medium:
              '/website-assets/media/2025/12/use_case_app_search_ootb.png',
            'medium-width': 300,
            'medium-height': 203,
            medium_large:
              '/website-assets/media/2025/12/use_case_app_search_ootb.png',
            'medium_large-width': 768,
            'medium_large-height': 520,
            large: '/website-assets/media/2025/12/use_case_app_search_ootb.png',
            'large-width': 1024,
            'large-height': 693,
            '1536x1536':
              '/website-assets/media/2025/12/use_case_app_search_ootb.png',
            '1536x1536-width': 1388,
            '1536x1536-height': 940,
            '2048x2048':
              '/website-assets/media/2025/12/use_case_app_search_ootb.png',
            '2048x2048-width': 1388,
            '2048x2048-height': 940,
          },
        },
      },
      {
        title: 'Natively integrated with AI',
        paragraph:
          "Add categorization, classification, and enrichment directly into your search results using Spice's SQL AI function. Leverage built-in LLM functions for labeling, summarizing, sentiment, and custom tasks.",
        cta: {
          title: 'Explore SQL AI functions',
          url: 'https://spiceai.org/docs/reference/sql/ai',
          target: '',
        },
        image: {
          ID: 1606,
          id: 1606,
          title: 'use_case_app_search_native_ai',
          filename: 'use_case_app_search_native_ai.png',
          filesize: 182716,
          url: '/website-assets/media/2025/12/use_case_app_search_native_ai.png',
          link: '/use-case/application-search/attachment/use_case_app_search_native_ai/',
          alt: '',
          author: '6',
          description: '',
          caption: '',
          name: 'use_case_app_search_native_ai',
          status: 'inherit',
          uploaded_to: 1044,
          date: '2025-12-02 23:28:10',
          modified: '2025-12-02 23:28:10',
          menu_order: 0,
          mime_type: 'image/png',
          type: 'image',
          subtype: 'png',
          icon: '/website-assets/media/default.png',
          width: 1388,
          height: 940,
          sizes: {
            thumbnail:
              '/website-assets/media/2025/12/use_case_app_search_native_ai.png',
            'thumbnail-width': 150,
            'thumbnail-height': 150,
            medium:
              '/website-assets/media/2025/12/use_case_app_search_native_ai.png',
            'medium-width': 300,
            'medium-height': 203,
            medium_large:
              '/website-assets/media/2025/12/use_case_app_search_native_ai.png',
            'medium_large-width': 768,
            'medium_large-height': 520,
            large:
              '/website-assets/media/2025/12/use_case_app_search_native_ai.png',
            'large-width': 1024,
            'large-height': 693,
            '1536x1536':
              '/website-assets/media/2025/12/use_case_app_search_native_ai.png',
            '1536x1536-width': 1388,
            '1536x1536-height': 940,
            '2048x2048':
              '/website-assets/media/2025/12/use_case_app_search_native_ai.png',
            '2048x2048-width': 1388,
            '2048x2048-height': 940,
          },
        },
      },
      {
        title: 'Simple to build, easy to scale',
        paragraph:
          'Spice integrates with serverless S3 Vectors and scales with your data and traffic',
        cta: {
          title: 'Get started with Amazon S3 Vectors and Spice',
          url: '/blog/getting-started-with-amazon-s3-vectors-and-spice',
          target: '',
        },
        image: {
          ID: 1605,
          id: 1605,
          title: 'use_case_app_search_scale',
          filename: 'use_case_app_search_scale.png',
          filesize: 247064,
          url: '/website-assets/media/2025/12/use_case_app_search_scale.png',
          link: '/use-case/application-search/attachment/use_case_app_search_scale/',
          alt: '',
          author: '6',
          description: '',
          caption: '',
          name: 'use_case_app_search_scale',
          status: 'inherit',
          uploaded_to: 1044,
          date: '2025-12-02 23:28:08',
          modified: '2025-12-02 23:28:08',
          menu_order: 0,
          mime_type: 'image/png',
          type: 'image',
          subtype: 'png',
          icon: '/website-assets/media/default.png',
          width: 1388,
          height: 940,
          sizes: {
            thumbnail:
              '/website-assets/media/2025/12/use_case_app_search_scale.png',
            'thumbnail-width': 150,
            'thumbnail-height': 150,
            medium:
              '/website-assets/media/2025/12/use_case_app_search_scale.png',
            'medium-width': 300,
            'medium-height': 203,
            medium_large:
              '/website-assets/media/2025/12/use_case_app_search_scale.png',
            'medium_large-width': 768,
            'medium_large-height': 520,
            large:
              '/website-assets/media/2025/12/use_case_app_search_scale.png',
            'large-width': 1024,
            'large-height': 693,
            '1536x1536':
              '/website-assets/media/2025/12/use_case_app_search_scale.png',
            '1536x1536-width': 1388,
            '1536x1536-height': 940,
            '2048x2048':
              '/website-assets/media/2025/12/use_case_app_search_scale.png',
            '2048x2048-width': 1388,
            '2048x2048-height': 940,
          },
        },
      },
      {
        title: 'Accelerate locally',
        paragraph:
          'Materialize hot data with DuckDB, SQLite or Spice Cayenne acceleration and offload vector loads to scalable object store indexes with Amazon S3 Vectors. Get predictable performance for common queries with index-only reads and filter pushdown.',
        cta: {
          title: 'Explore Spice Cayenne Data Accelerator',
          url: '/blog/introducing-spice-cayenne-data-accelerator',
          target: '',
        },
        image: {
          ID: 1607,
          id: 1607,
          title: 'use_case_app_search_accelerate_locally',
          filename: 'use_case_app_search_accelerate_locally.png',
          filesize: 259897,
          url: '/website-assets/media/2025/12/use_case_app_search_accelerate_locally.png',
          link: '/use-case/application-search/attachment/use_case_app_search_accelerate_locally/',
          alt: '',
          author: '6',
          description: '',
          caption: '',
          name: 'use_case_app_search_accelerate_locally',
          status: 'inherit',
          uploaded_to: 1044,
          date: '2025-12-02 23:28:12',
          modified: '2025-12-02 23:28:12',
          menu_order: 0,
          mime_type: 'image/png',
          type: 'image',
          subtype: 'png',
          icon: '/website-assets/media/default.png',
          width: 1388,
          height: 940,
          sizes: {
            thumbnail:
              '/website-assets/media/2025/12/use_case_app_search_accelerate_locally.png',
            'thumbnail-width': 150,
            'thumbnail-height': 150,
            medium:
              '/website-assets/media/2025/12/use_case_app_search_accelerate_locally.png',
            'medium-width': 300,
            'medium-height': 203,
            medium_large:
              '/website-assets/media/2025/12/use_case_app_search_accelerate_locally.png',
            'medium_large-width': 768,
            'medium_large-height': 520,
            large:
              '/website-assets/media/2025/12/use_case_app_search_accelerate_locally.png',
            'large-width': 1024,
            'large-height': 693,
            '1536x1536':
              '/website-assets/media/2025/12/use_case_app_search_accelerate_locally.png',
            '1536x1536-width': 1388,
            '1536x1536-height': 940,
            '2048x2048':
              '/website-assets/media/2025/12/use_case_app_search_accelerate_locally.png',
            '2048x2048-width': 1388,
            '2048x2048-height': 940,
          },
        },
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<ContentThreeAcrossIconText
  fields={{
    heading: 'Unified search for real-time, data-driven apps',
    heading_tag: 'h2',
    paragraph:
      'Spice provides SQL-first, unified hybrid search. No extra pipelines or duplicate storage.',
    items: [
      {
        icon: {
          ID: 1054,
          id: 1054,
          title: 'UseCase_ApplicationSearch_SQL-First Hybrid Search',
          filename: 'UseCase_ApplicationSearch_SQL-First-Hybrid-Search.svg',
          filesize: 3156,
          url: '/website-assets/media/2025/11/UseCase_ApplicationSearch_SQL-First-Hybrid-Search.svg',
          link: '/use-case/application-search/attachment/usecase_applicationsearch_sql-first-hybrid-search/',
          alt: '',
          author: '6',
          description: '',
          caption: '',
          name: 'usecase_applicationsearch_sql-first-hybrid-search',
          status: 'inherit',
          uploaded_to: 1044,
          date: '2025-11-21 16:21:12',
          modified: '2025-11-21 16:21:12',
          menu_order: 0,
          mime_type: 'image/svg+xml',
          type: 'image',
          subtype: 'svg+xml',
          icon: '/website-assets/media/default.png',
          width: 0,
          height: 0,
          sizes: {
            thumbnail:
              '/website-assets/media/2025/11/UseCase_ApplicationSearch_SQL-First-Hybrid-Search.svg',
            'thumbnail-width': 1,
            'thumbnail-height': 1,
            medium:
              '/website-assets/media/2025/11/UseCase_ApplicationSearch_SQL-First-Hybrid-Search.svg',
            'medium-width': 1,
            'medium-height': 1,
            medium_large:
              '/website-assets/media/2025/11/UseCase_ApplicationSearch_SQL-First-Hybrid-Search.svg',
            'medium_large-width': 1,
            'medium_large-height': 1,
            large:
              '/website-assets/media/2025/11/UseCase_ApplicationSearch_SQL-First-Hybrid-Search.svg',
            'large-width': 1,
            'large-height': 1,
            '1536x1536':
              '/website-assets/media/2025/11/UseCase_ApplicationSearch_SQL-First-Hybrid-Search.svg',
            '1536x1536-width': 1,
            '1536x1536-height': 1,
            '2048x2048':
              '/website-assets/media/2025/11/UseCase_ApplicationSearch_SQL-First-Hybrid-Search.svg',
            '2048x2048-width': 1,
            '2048x2048-height': 1,
          },
        },
        title: 'SQL-First Hybrid Search',
        description: 'Express all search functions in familiar SQL syntax.',
      },
      {
        icon: {
          ID: 1052,
          id: 1052,
          title: 'UseCase_ApplicationSearch_Low-Latency Runtime',
          filename: 'UseCase_ApplicationSearch_Low-Latency-Runtime.svg',
          filesize: 19724,
          url: '/website-assets/media/2025/11/UseCase_ApplicationSearch_Low-Latency-Runtime.svg',
          link: '/use-case/application-search/attachment/usecase_applicationsearch_low-latency-runtime/',
          alt: '',
          author: '6',
          description: '',
          caption: '',
          name: 'usecase_applicationsearch_low-latency-runtime',
          status: 'inherit',
          uploaded_to: 1044,
          date: '2025-11-21 16:21:10',
          modified: '2025-11-21 16:21:10',
          menu_order: 0,
          mime_type: 'image/svg+xml',
          type: 'image',
          subtype: 'svg+xml',
          icon: '/website-assets/media/default.png',
          width: 0,
          height: 0,
          sizes: {
            thumbnail:
              '/website-assets/media/2025/11/UseCase_ApplicationSearch_Low-Latency-Runtime.svg',
            'thumbnail-width': 1,
            'thumbnail-height': 1,
            medium:
              '/website-assets/media/2025/11/UseCase_ApplicationSearch_Low-Latency-Runtime.svg',
            'medium-width': 1,
            'medium-height': 1,
            medium_large:
              '/website-assets/media/2025/11/UseCase_ApplicationSearch_Low-Latency-Runtime.svg',
            'medium_large-width': 1,
            'medium_large-height': 1,
            large:
              '/website-assets/media/2025/11/UseCase_ApplicationSearch_Low-Latency-Runtime.svg',
            'large-width': 1,
            'large-height': 1,
            '1536x1536':
              '/website-assets/media/2025/11/UseCase_ApplicationSearch_Low-Latency-Runtime.svg',
            '1536x1536-width': 1,
            '1536x1536-height': 1,
            '2048x2048':
              '/website-assets/media/2025/11/UseCase_ApplicationSearch_Low-Latency-Runtime.svg',
            '2048x2048-width': 1,
            '2048x2048-height': 1,
          },
        },
        title: 'Low-Latency Runtime',
        description:
          'Accelerate queries for sub-second responses under high concurrency.',
      },
      {
        icon: {
          ID: 1049,
          id: 1049,
          title: 'UseCase_ApplicationSearch_Built-in Ranking and Reranking',
          filename:
            'UseCase_ApplicationSearch_Built-in-Ranking-and-Reranking.svg',
          filesize: 7141,
          url: '/website-assets/media/2025/11/UseCase_ApplicationSearch_Built-in-Ranking-and-Reranking.svg',
          link: '/use-case/application-search/attachment/usecase_applicationsearch_built-in-ranking-and-reranking/',
          alt: '',
          author: '6',
          description: '',
          caption: '',
          name: 'usecase_applicationsearch_built-in-ranking-and-reranking',
          status: 'inherit',
          uploaded_to: 1044,
          date: '2025-11-21 16:21:08',
          modified: '2025-11-21 16:21:08',
          menu_order: 0,
          mime_type: 'image/svg+xml',
          type: 'image',
          subtype: 'svg+xml',
          icon: '/website-assets/media/default.png',
          width: 0,
          height: 0,
          sizes: {
            thumbnail:
              '/website-assets/media/2025/11/UseCase_ApplicationSearch_Built-in-Ranking-and-Reranking.svg',
            'thumbnail-width': 1,
            'thumbnail-height': 1,
            medium:
              '/website-assets/media/2025/11/UseCase_ApplicationSearch_Built-in-Ranking-and-Reranking.svg',
            'medium-width': 1,
            'medium-height': 1,
            medium_large:
              '/website-assets/media/2025/11/UseCase_ApplicationSearch_Built-in-Ranking-and-Reranking.svg',
            'medium_large-width': 1,
            'medium_large-height': 1,
            large:
              '/website-assets/media/2025/11/UseCase_ApplicationSearch_Built-in-Ranking-and-Reranking.svg',
            'large-width': 1,
            'large-height': 1,
            '1536x1536':
              '/website-assets/media/2025/11/UseCase_ApplicationSearch_Built-in-Ranking-and-Reranking.svg',
            '1536x1536-width': 1,
            '1536x1536-height': 1,
            '2048x2048':
              '/website-assets/media/2025/11/UseCase_ApplicationSearch_Built-in-Ranking-and-Reranking.svg',
            '2048x2048-width': 1,
            '2048x2048-height': 1,
          },
        },
        title: 'Built-in Re-Ranking',
        description:
          'Blend multiple result sets with Reciprocal Rank Fusion for per-query weighting and tunable relevance.',
      },
      {
        icon: {
          ID: 1051,
          id: 1051,
          title: 'UseCase_ApplicationSearch_Governance Built-In',
          filename: 'UseCase_ApplicationSearch_Governance-Built-In.svg',
          filesize: 3452,
          url: '/website-assets/media/2025/11/UseCase_ApplicationSearch_Governance-Built-In.svg',
          link: '/use-case/application-search/attachment/usecase_applicationsearch_governance-built-in/',
          alt: '',
          author: '6',
          description: '',
          caption: '',
          name: 'usecase_applicationsearch_governance-built-in',
          status: 'inherit',
          uploaded_to: 1044,
          date: '2025-11-21 16:21:09',
          modified: '2025-11-21 16:21:09',
          menu_order: 0,
          mime_type: 'image/svg+xml',
          type: 'image',
          subtype: 'svg+xml',
          icon: '/website-assets/media/default.png',
          width: 0,
          height: 0,
          sizes: {
            thumbnail:
              '/website-assets/media/2025/11/UseCase_ApplicationSearch_Governance-Built-In.svg',
            'thumbnail-width': 1,
            'thumbnail-height': 1,
            medium:
              '/website-assets/media/2025/11/UseCase_ApplicationSearch_Governance-Built-In.svg',
            'medium-width': 1,
            'medium-height': 1,
            medium_large:
              '/website-assets/media/2025/11/UseCase_ApplicationSearch_Governance-Built-In.svg',
            'medium_large-width': 1,
            'medium_large-height': 1,
            large:
              '/website-assets/media/2025/11/UseCase_ApplicationSearch_Governance-Built-In.svg',
            'large-width': 1,
            'large-height': 1,
            '1536x1536':
              '/website-assets/media/2025/11/UseCase_ApplicationSearch_Governance-Built-In.svg',
            '1536x1536-width': 1,
            '1536x1536-height': 1,
            '2048x2048':
              '/website-assets/media/2025/11/UseCase_ApplicationSearch_Governance-Built-In.svg',
            '2048x2048-width': 1,
            '2048x2048-height': 1,
          },
        },
        title: 'Centralized Policy and Governance',
        description:
          'Apply enterprise-grade security, access controls, and audit capabilities to every query. ',
      },
      {
        icon: {
          ID: 1053,
          id: 1053,
          title: 'UseCase_ApplicationSearch_Single Data and AI Runtime',
          filename: 'UseCase_ApplicationSearch_Single-Data-and-AI-Runtime.svg',
          filesize: 4097,
          url: '/website-assets/media/2025/11/UseCase_ApplicationSearch_Single-Data-and-AI-Runtime.svg',
          link: '/use-case/application-search/attachment/usecase_applicationsearch_single-data-and-ai-runtime/',
          alt: '',
          author: '6',
          description: '',
          caption: '',
          name: 'usecase_applicationsearch_single-data-and-ai-runtime',
          status: 'inherit',
          uploaded_to: 1044,
          date: '2025-11-21 16:21:11',
          modified: '2025-11-21 16:21:11',
          menu_order: 0,
          mime_type: 'image/svg+xml',
          type: 'image',
          subtype: 'svg+xml',
          icon: '/website-assets/media/default.png',
          width: 0,
          height: 0,
          sizes: {
            thumbnail:
              '/website-assets/media/2025/11/UseCase_ApplicationSearch_Single-Data-and-AI-Runtime.svg',
            'thumbnail-width': 1,
            'thumbnail-height': 1,
            medium:
              '/website-assets/media/2025/11/UseCase_ApplicationSearch_Single-Data-and-AI-Runtime.svg',
            'medium-width': 1,
            'medium-height': 1,
            medium_large:
              '/website-assets/media/2025/11/UseCase_ApplicationSearch_Single-Data-and-AI-Runtime.svg',
            'medium_large-width': 1,
            'medium_large-height': 1,
            large:
              '/website-assets/media/2025/11/UseCase_ApplicationSearch_Single-Data-and-AI-Runtime.svg',
            'large-width': 1,
            'large-height': 1,
            '1536x1536':
              '/website-assets/media/2025/11/UseCase_ApplicationSearch_Single-Data-and-AI-Runtime.svg',
            '1536x1536-width': 1,
            '1536x1536-height': 1,
            '2048x2048':
              '/website-assets/media/2025/11/UseCase_ApplicationSearch_Single-Data-and-AI-Runtime.svg',
            '2048x2048-width': 1,
            '2048x2048-height': 1,
          },
        },
        title: 'Single Data and AI Runtime',
        description:
          'Combine hybrid search, federated data access, and AI workflows to deliver an enterprise-grade search experience.',
      },
      {
        icon: {
          ID: 1050,
          id: 1050,
          title: 'UseCase_ApplicationSearch_Deploy Anywhere',
          filename: 'UseCase_ApplicationSearch_Deploy-Anywhere.svg',
          filesize: 5668,
          url: '/website-assets/media/2025/11/UseCase_ApplicationSearch_Deploy-Anywhere.svg',
          link: '/use-case/application-search/attachment/usecase_applicationsearch_deploy-anywhere/',
          alt: '',
          author: '6',
          description: '',
          caption: '',
          name: 'usecase_applicationsearch_deploy-anywhere',
          status: 'inherit',
          uploaded_to: 1044,
          date: '2025-11-21 16:21:09',
          modified: '2025-11-21 16:21:09',
          menu_order: 0,
          mime_type: 'image/svg+xml',
          type: 'image',
          subtype: 'svg+xml',
          icon: '/website-assets/media/default.png',
          width: 0,
          height: 0,
          sizes: {
            thumbnail:
              '/website-assets/media/2025/11/UseCase_ApplicationSearch_Deploy-Anywhere.svg',
            'thumbnail-width': 1,
            'thumbnail-height': 1,
            medium:
              '/website-assets/media/2025/11/UseCase_ApplicationSearch_Deploy-Anywhere.svg',
            'medium-width': 1,
            'medium-height': 1,
            medium_large:
              '/website-assets/media/2025/11/UseCase_ApplicationSearch_Deploy-Anywhere.svg',
            'medium_large-width': 1,
            'medium_large-height': 1,
            large:
              '/website-assets/media/2025/11/UseCase_ApplicationSearch_Deploy-Anywhere.svg',
            'large-width': 1,
            'large-height': 1,
            '1536x1536':
              '/website-assets/media/2025/11/UseCase_ApplicationSearch_Deploy-Anywhere.svg',
            '1536x1536-width': 1,
            '1536x1536-height': 1,
            '2048x2048':
              '/website-assets/media/2025/11/UseCase_ApplicationSearch_Deploy-Anywhere.svg',
            '2048x2048-width': 1,
            '2048x2048-height': 1,
          },
        },
        title: 'Deploy Anywhere',
        description:
          'Run Spice anywhere: as a sidecar, microservice, cluster, or on the managed Spice Cloud Platform.',
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<Testimonials
  heading="Deployed in production"
  headingTag="h2"
  paragraph="Run data-intensive workloads on a high-performance engine trusted by teams building real-time systems at scale."
  items={['twilio', 'barracuda', 'nrc-tim', 'basisset']}
/>

<CarouselLogos
  fields={{
    heading: 'Trusted by global enterprises',
    logos: [
      {
        logo: {
          ID: 443,
          id: 443,
          title: 'Homepage_Logos_Twilio',
          filename: 'Homepage_Logos_Twilio-1.svg',
          filesize: 4020,
          url: '/website-assets/media/2025/11/Homepage_Logos_Twilio-1.svg',
          link: '/home/homepage_logos_twilio-2/',
          alt: 'Twilio logo',
          author: '6',
          description: '',
          caption: '',
          name: 'homepage_logos_twilio-2',
          status: 'inherit',
          uploaded_to: 2,
          date: '2025-11-05 18:46:45',
          modified: '2025-11-05 18:46:45',
          menu_order: 0,
          mime_type: 'image/svg+xml',
          type: 'image',
          subtype: 'svg+xml',
          icon: '/website-assets/media/default.png',
          width: 0,
          height: 0,
          sizes: {
            thumbnail:
              '/website-assets/media/2025/11/Homepage_Logos_Twilio-1.svg',
            'thumbnail-width': 1,
            'thumbnail-height': 1,
            medium: '/website-assets/media/2025/11/Homepage_Logos_Twilio-1.svg',
            'medium-width': 1,
            'medium-height': 1,
            medium_large:
              '/website-assets/media/2025/11/Homepage_Logos_Twilio-1.svg',
            'medium_large-width': 1,
            'medium_large-height': 1,
            large: '/website-assets/media/2025/11/Homepage_Logos_Twilio-1.svg',
            'large-width': 1,
            'large-height': 1,
            '1536x1536':
              '/website-assets/media/2025/11/Homepage_Logos_Twilio-1.svg',
            '1536x1536-width': 1,
            '1536x1536-height': 1,
            '2048x2048':
              '/website-assets/media/2025/11/Homepage_Logos_Twilio-1.svg',
            '2048x2048-width': 1,
            '2048x2048-height': 1,
          },
        },
      },
      {
        logo: {
          ID: 442,
          id: 442,
          title: 'Homepage_Logos_NRC',
          filename: 'Homepage_Logos_NRC-1.svg',
          filesize: 1030,
          url: '/website-assets/media/2025/11/Homepage_Logos_NRC-1.svg',
          link: '/home/homepage_logos_nrc-2/',
          alt: 'NRC Health logo',
          author: '6',
          description: '',
          caption: '',
          name: 'homepage_logos_nrc-2',
          status: 'inherit',
          uploaded_to: 2,
          date: '2025-11-05 18:46:45',
          modified: '2025-11-05 18:46:45',
          menu_order: 0,
          mime_type: 'image/svg+xml',
          type: 'image',
          subtype: 'svg+xml',
          icon: '/website-assets/media/default.png',
          width: 0,
          height: 0,
          sizes: {
            thumbnail: '/website-assets/media/2025/11/Homepage_Logos_NRC-1.svg',
            'thumbnail-width': 1,
            'thumbnail-height': 1,
            medium: '/website-assets/media/2025/11/Homepage_Logos_NRC-1.svg',
            'medium-width': 1,
            'medium-height': 1,
            medium_large:
              '/website-assets/media/2025/11/Homepage_Logos_NRC-1.svg',
            'medium_large-width': 1,
            'medium_large-height': 1,
            large: '/website-assets/media/2025/11/Homepage_Logos_NRC-1.svg',
            'large-width': 1,
            'large-height': 1,
            '1536x1536':
              '/website-assets/media/2025/11/Homepage_Logos_NRC-1.svg',
            '1536x1536-width': 1,
            '1536x1536-height': 1,
            '2048x2048':
              '/website-assets/media/2025/11/Homepage_Logos_NRC-1.svg',
            '2048x2048-width': 1,
            '2048x2048-height': 1,
          },
        },
      },
      {
        logo: {
          ID: 441,
          id: 441,
          title: 'Homepage_Logos_BasisSet',
          filename: 'Homepage_Logos_BasisSet-1.svg',
          filesize: 2629,
          url: '/website-assets/media/2025/11/Homepage_Logos_BasisSet-1.svg',
          link: '/home/homepage_logos_basisset-2/',
          alt: 'Basis Set Ventures logo',
          author: '6',
          description: '',
          caption: '',
          name: 'homepage_logos_basisset-2',
          status: 'inherit',
          uploaded_to: 2,
          date: '2025-11-05 18:46:45',
          modified: '2025-11-05 18:46:45',
          menu_order: 0,
          mime_type: 'image/svg+xml',
          type: 'image',
          subtype: 'svg+xml',
          icon: '/website-assets/media/default.png',
          width: 0,
          height: 0,
          sizes: {
            thumbnail:
              '/website-assets/media/2025/11/Homepage_Logos_BasisSet-1.svg',
            'thumbnail-width': 1,
            'thumbnail-height': 1,
            medium:
              '/website-assets/media/2025/11/Homepage_Logos_BasisSet-1.svg',
            'medium-width': 1,
            'medium-height': 1,
            medium_large:
              '/website-assets/media/2025/11/Homepage_Logos_BasisSet-1.svg',
            'medium_large-width': 1,
            'medium_large-height': 1,
            large:
              '/website-assets/media/2025/11/Homepage_Logos_BasisSet-1.svg',
            'large-width': 1,
            'large-height': 1,
            '1536x1536':
              '/website-assets/media/2025/11/Homepage_Logos_BasisSet-1.svg',
            '1536x1536-width': 1,
            '1536x1536-height': 1,
            '2048x2048':
              '/website-assets/media/2025/11/Homepage_Logos_BasisSet-1.svg',
            '2048x2048-width': 1,
            '2048x2048-height': 1,
          },
        },
      },
      {
        logo: {
          ID: 440,
          id: 440,
          title: 'Homepage_Logos_Barracuda',
          filename: 'Homepage_Logos_Barracuda-1.svg',
          filesize: 7450,
          url: '/website-assets/media/2025/11/Homepage_Logos_Barracuda-1.svg',
          link: '/home/homepage_logos_barracuda-2/',
          alt: 'Barracuda Networks logo',
          author: '6',
          description: '',
          caption: '',
          name: 'homepage_logos_barracuda-2',
          status: 'inherit',
          uploaded_to: 2,
          date: '2025-11-05 18:46:45',
          modified: '2025-11-05 18:46:45',
          menu_order: 0,
          mime_type: 'image/svg+xml',
          type: 'image',
          subtype: 'svg+xml',
          icon: '/website-assets/media/default.png',
          width: 0,
          height: 0,
          sizes: {
            thumbnail:
              '/website-assets/media/2025/11/Homepage_Logos_Barracuda-1.svg',
            'thumbnail-width': 1,
            'thumbnail-height': 1,
            medium:
              '/website-assets/media/2025/11/Homepage_Logos_Barracuda-1.svg',
            'medium-width': 1,
            'medium-height': 1,
            medium_large:
              '/website-assets/media/2025/11/Homepage_Logos_Barracuda-1.svg',
            'medium_large-width': 1,
            'medium_large-height': 1,
            large:
              '/website-assets/media/2025/11/Homepage_Logos_Barracuda-1.svg',
            'large-width': 1,
            'large-height': 1,
            '1536x1536':
              '/website-assets/media/2025/11/Homepage_Logos_Barracuda-1.svg',
            '1536x1536-width': 1,
            '1536x1536-height': 1,
            '2048x2048':
              '/website-assets/media/2025/11/Homepage_Logos_Barracuda-1.svg',
            '2048x2048-width': 1,
            '2048x2048-height': 1,
          },
        },
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<ContentResourceFeatured
  fields={{
    heading: 'Build an application search engine that works',
    heading_tag: 'h2',
    paragraph:
      'Guides and examples to learn more about introducing application search with Spice.',
    mode: 'default',
    resources: [
      {
        source: 'picker',
        resource: [
          {
            title:
              'True Hybrid Search: Vector, Full-Text, and SQL in One Runtime',
            slug: '/blog/true-hybrid-search',
            excerpt:
              "TL;DR&nbsp; Show Me the (Data)! It&#8217;s well established (and maybe even trite) to say that enterprises are going all-in on artificial intelligence, with more than $40 billion directed toward generative AI projects in recent years. The initial results have been underwhelming. A&nbsp;recent study&nbsp;from the Massachusetts Institute of Technology's&nbsp;NANDA&nbsp;initiative concluded that despite the enormous allocation of [&hellip;]",
            image: '/website-assets/media/2025/09/image-33.png',
            type: 'Blog',
            taxonomy: [],
          },
        ],
        resource_manual: {
          eyebrow: '',
          title: null,
          description: '',
          image: false,
        },
      },
      {
        source: 'picker',
        resource: [
          {
            title:
              'Real-Time Hybrid Search Using RRF: A Hands-On Guide with Spice',
            slug: '/blog/real-time-hybrid-search-using-rrf',
            excerpt:
              'Surfacing relevant answers to searches across datasets has historically meant navigating significant tradeoffs.&nbsp;Keyword (or lexical) search&nbsp;is fast, cheap, and commoditized, but limited by the constraints of exact matching.&nbsp;Vector (or semantic) search&nbsp;captures nuance and intent, but can be slower, harder to debug, and expensive to run at scale. Combining both usually entails standing up multiple engines [&hellip;]',
            image:
              '/website-assets/media/2025/11/68fa4fdfded26b3b6472a172_image-8.png',
            type: 'Blog',
            taxonomy: ['Search', 'Spice AI'],
          },
        ],
        resource_manual: {
          eyebrow: '',
          title: null,
          description: '',
          image: false,
        },
      },
      {
        source: 'picker',
        resource: [
          {
            title:
              'Making Object Storage Operational for Real-Time and AI Workloads',
            slug: '/blog/making-object-storage-operational',
            excerpt:
              'TLDR Introduction Although legacy systems and workflows remain common, many enterprises are re-evaluating their architectures to meet new demands&nbsp; &#8211; driven in part, but not exclusively, by AI &#8211; that require support for more data-intensive and real-time applications. The underlying storage needs for these novel workloads are generally outside the bounds of a traditional operational [&hellip;]',
            image:
              '/website-assets/media/2025/11/68e42f8a5daa71c139c95512_Version-2.png',
            type: 'Blog',
            taxonomy: [],
          },
        ],
        resource_manual: {
          eyebrow: '',
          title: null,
          description: '',
          image: false,
        },
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<AccordionFaq
  fields={{
    heading: 'FAQs',
    heading_tag: 'h2',
    paragraph:
      'Answers to common questions about building application search with Spice',
    items: [
      {
        title: 'What is hybrid search?',
        paragraph:
          '<p>Hybrid search combines keyword, full-text, and vector similarity methods in a single query so results capture both exact matches and semantic meaning. Spice runs these methods in one runtime and merges the results into a single ranked list using Reciprocal Rank Fusion (RRF). Explore <a href="/platform/hybrid-sql-search">hybrid vector and full-text search</a> for how this works in the Spice platform.</p>\n',
      },
      {
        title: 'Do I need a separate vector database for application search?',
        paragraph:
          '<p>No. Spice unifies vector, full-text, and keyword search in one SQL runtime, so you can add semantic search without standing up a separate engine or ETL pipeline. Search results behave like SQL tables, which means you can filter, join, and aggregate them alongside your application data.</p>\n',
      },
      {
        title: 'How do I tune search relevance for different queries?',
        paragraph:
          '<p>Spice blends result sets with Reciprocal Rank Fusion and supports per-query weights, filters, and recency boosts. This lets you weight keyword precision for exact lookups, semantic matches for natural-language queries, and newer content where freshness matters, all expressed in SQL.</p>\n',
      },
      {
        title: 'Can I enrich search results with AI?',
        paragraph:
          '<p>Yes. Spice includes SQL AI functions that apply categorization, classification, labeling, summarization, and sentiment analysis directly to search results within a query. The models run through the <a href="/platform/llm-inference">LLM inference and AI model serving</a> layer in the same runtime, so no separate enrichment pipeline is required.</p>\n',
      },
      {
        title:
          'How does application search stay fast as data and traffic grow?',
        paragraph:
          '<p>Spice materializes hot data locally using DuckDB, SQLite, or Spice Cayenne acceleration and offloads large vector workloads to object store indexes such as Amazon S3 Vectors. Index-only reads and filter pushdown keep performance predictable for common queries under high concurrency.</p>\n',
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<TalkToAnEngineerCta />

---

## Datalake Accelerator
URL: https://spice.ai/use-case/datalake-accelerator
Date: 2025-11-21T16:44:36
Description: Accelerate query performance in your data lake with Spice. Run SQL locally on federated datasets for up to 100x faster performance.

<HeroTextImageFiftyFifty
  fields={{
    variant: 'variant-1',
    eyebrow: 'Datalake Accelerator',
    heading_tag: 'h1',
    heading: 'Turn your data lake into a real-time engine',
    paragraph:
      'Bring data closer to your app. Spice accelerates queries on your data lake for up to 100x faster performance.',
    cta: [
      {
        type: 'filled',
        cta: {
          title: 'Get a demo',
          url: 'https://meetings.hubspot.com/vladi-semenov',
          target: '_blank',
        },
      },
      {
        type: 'bordered',
        cta: {
          title: 'View the docs',
          url: 'https://spiceai.org/docs/features/data-acceleration',
          target: '_blank',
        },
      },
    ],
    media_type: 'image',
    media_image: {
      ID: 1561,
      id: 1561,
      title: 'use_case_datalake_header',
      filename: 'use_case_datalake_header.png',
      filesize: 242404,
      url: '/website-assets/media/2025/12/use_case_datalake_header.png',
      link: '/use-case/datalake-accelerator/attachment/use_case_datalake_header/',
      alt: '',
      author: '6',
      description: '',
      caption: '',
      name: 'use_case_datalake_header',
      status: 'inherit',
      uploaded_to: 1062,
      date: '2025-12-01 22:57:03',
      modified: '2025-12-01 22:57:03',
      menu_order: 0,
      mime_type: 'image/png',
      type: 'image',
      subtype: 'png',
      icon: '/website-assets/media/default.png',
      width: 1488,
      height: 840,
      sizes: {
        thumbnail: '/website-assets/media/2025/12/use_case_datalake_header.png',
        'thumbnail-width': 150,
        'thumbnail-height': 150,
        medium: '/website-assets/media/2025/12/use_case_datalake_header.png',
        'medium-width': 300,
        'medium-height': 169,
        medium_large:
          '/website-assets/media/2025/12/use_case_datalake_header.png',
        'medium_large-width': 768,
        'medium_large-height': 434,
        large: '/website-assets/media/2025/12/use_case_datalake_header.png',
        'large-width': 1024,
        'large-height': 578,
        '1536x1536':
          '/website-assets/media/2025/12/use_case_datalake_header.png',
        '1536x1536-width': 1488,
        '1536x1536-height': 840,
        '2048x2048':
          '/website-assets/media/2025/12/use_case_datalake_header.png',
        '2048x2048-width': 1488,
        '2048x2048-height': 840,
      },
    },
    media_video: '',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<ContentStats
  fields={{
    heading: 'Do more with your data',
    heading_tag: 'h2',
    stats: [
      {
        media_type: 'image',
        image: false,
        lottie: false,
        amount: '100',
        suffix: 'x',
        after_text: 'up to 100x faster queries',
      },
      {
        media_type: 'image',
        image: false,
        lottie: false,
        amount: '80',
        suffix: '%',
        after_text: 'up to 80% cost savings on data lakehouse spend',
      },
      {
        media_type: 'image',
        image: false,
        lottie: false,
        amount: '2',
        suffix: 'x',
        after_text: 'increase in data reliability for critical workloads',
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<ContentImageVideo
  fields={{
    variant: 'variant-2',
    heading: "Data lakes weren't designed for operational workloads",
    heading_tag: 'h2',
    paragraph:
      "Modern data lakes are great for scale and cost, but they weren't built for interactive workloads. Every query triggers a network round-trip or a cluster spin-up. Teams often overpay for compute or wait minutes for results. What if you could make your lake behave like a local database, without moving the data?",
    cta: false,
    media_type: 'image',
    media_image: {
      ID: 1048,
      id: 1048,
      title: 'use_case_challenge',
      filename: 'use_case_challenge.png',
      filesize: 4349638,
      url: '/website-assets/media/2025/11/use_case_challenge.png',
      link: '/use-case/application-search/attachment/use_case_challenge/',
      alt: '',
      author: '6',
      description: '',
      caption: '',
      name: 'use_case_challenge',
      status: 'inherit',
      uploaded_to: 1044,
      date: '2025-11-21 16:21:07',
      modified: '2025-11-21 16:21:07',
      menu_order: 0,
      mime_type: 'image/png',
      type: 'image',
      subtype: 'png',
      icon: '/website-assets/media/default.png',
      width: 2720,
      height: 1824,
      sizes: {
        thumbnail: '/website-assets/media/2025/11/use_case_challenge.png',
        'thumbnail-width': 150,
        'thumbnail-height': 150,
        medium: '/website-assets/media/2025/11/use_case_challenge.png',
        'medium-width': 300,
        'medium-height': 201,
        medium_large: '/website-assets/media/2025/11/use_case_challenge.png',
        'medium_large-width': 768,
        'medium_large-height': 515,
        large: '/website-assets/media/2025/11/use_case_challenge.png',
        'large-width': 1024,
        'large-height': 687,
        '1536x1536': '/website-assets/media/2025/11/use_case_challenge.png',
        '1536x1536-width': 1536,
        '1536x1536-height': 1030,
        '2048x2048': '/website-assets/media/2025/11/use_case_challenge.png',
        '2048x2048-width': 2048,
        '2048x2048-height': 1373,
      },
    },
    graphic_overlay: false,
    media_video: '',
    padding_top: 'st-lg',
    padding_bottom: 'sb-lg',
  }}
/>

<CarouselHorizontalCards
  fields={{
    heading: 'Operationalize and accelerate your data lake',
    heading_tag: 'h2',
    paragraph:
      'Run sub-second SQL directly on Parquet, Iceberg, S3, and more with local acceleration and real-time sync.',
    item: [
      {
        title: 'Accelerate your data lake locally',
        paragraph:
          'Spice pulls frequently queried datasets from your data lake into a local Data Accelerator, reducing latency by eliminating network overhead. Data stays synced in real-time or on schedule, so queries always see the latest state. ',
        cta: {
          title: 'Explore Spice Cayenne Data Accelerator',
          url: '/blog/introducing-spice-cayenne-data-accelerator',
          target: '',
        },
        image: {
          ID: 1610,
          id: 1610,
          title: 'use_case_datalake_accelerate_locally',
          filename: 'use_case_datalake_accelerate_locally.png',
          filesize: 259404,
          url: '/website-assets/media/2025/12/use_case_datalake_accelerate_locally.png',
          link: '/use-case/datalake-accelerator/attachment/use_case_datalake_accelerate_locally/',
          alt: '',
          author: '6',
          description: '',
          caption: '',
          name: 'use_case_datalake_accelerate_locally',
          status: 'inherit',
          uploaded_to: 1062,
          date: '2025-12-02 23:33:28',
          modified: '2025-12-02 23:33:28',
          menu_order: 0,
          mime_type: 'image/png',
          type: 'image',
          subtype: 'png',
          icon: '/website-assets/media/default.png',
          width: 1388,
          height: 620,
          sizes: {
            thumbnail:
              '/website-assets/media/2025/12/use_case_datalake_accelerate_locally.png',
            'thumbnail-width': 150,
            'thumbnail-height': 150,
            medium:
              '/website-assets/media/2025/12/use_case_datalake_accelerate_locally.png',
            'medium-width': 300,
            'medium-height': 134,
            medium_large:
              '/website-assets/media/2025/12/use_case_datalake_accelerate_locally.png',
            'medium_large-width': 768,
            'medium_large-height': 343,
            large:
              '/website-assets/media/2025/12/use_case_datalake_accelerate_locally.png',
            'large-width': 1024,
            'large-height': 457,
            '1536x1536':
              '/website-assets/media/2025/12/use_case_datalake_accelerate_locally.png',
            '1536x1536-width': 1388,
            '1536x1536-height': 620,
            '2048x2048':
              '/website-assets/media/2025/12/use_case_datalake_accelerate_locally.png',
            '2048x2048-width': 1388,
            '2048x2048-height': 620,
          },
        },
      },
      {
        title: 'Lower cost, higher reliability',
        paragraph:
          'Spice increases reliability and reduces expenses by materializing frequently accessed data in the runtime. If data is not available locally, queries automatically fall back to your underlying lakehouse or data warehouse source. Consistent access and increased reliability, even during service outages.',
        cta: {
          title: 'Read how Spice makes object storage operational',
          url: '/blog/making-object-storage-operational',
          target: '',
        },
        image: {
          ID: 1611,
          id: 1611,
          title: 'use_case_datalake_low_cost',
          filename: 'use_case_datalake_low_cost.png',
          filesize: 210443,
          url: '/website-assets/media/2025/12/use_case_datalake_low_cost.png',
          link: '/use-case/datalake-accelerator/attachment/use_case_datalake_low_cost/',
          alt: '',
          author: '6',
          description: '',
          caption: '',
          name: 'use_case_datalake_low_cost',
          status: 'inherit',
          uploaded_to: 1062,
          date: '2025-12-02 23:33:30',
          modified: '2025-12-02 23:33:30',
          menu_order: 0,
          mime_type: 'image/png',
          type: 'image',
          subtype: 'png',
          icon: '/website-assets/media/default.png',
          width: 1388,
          height: 620,
          sizes: {
            thumbnail:
              '/website-assets/media/2025/12/use_case_datalake_low_cost.png',
            'thumbnail-width': 150,
            'thumbnail-height': 150,
            medium:
              '/website-assets/media/2025/12/use_case_datalake_low_cost.png',
            'medium-width': 300,
            'medium-height': 134,
            medium_large:
              '/website-assets/media/2025/12/use_case_datalake_low_cost.png',
            'medium_large-width': 768,
            'medium_large-height': 343,
            large:
              '/website-assets/media/2025/12/use_case_datalake_low_cost.png',
            'large-width': 1024,
            'large-height': 457,
            '1536x1536':
              '/website-assets/media/2025/12/use_case_datalake_low_cost.png',
            '1536x1536-width': 1388,
            '1536x1536-height': 620,
            '2048x2048':
              '/website-assets/media/2025/12/use_case_datalake_low_cost.png',
            '2048x2048-width': 1388,
            '2048x2048-height': 620,
          },
        },
      },
      {
        title: 'Any source, one runtime',
        paragraph:
          'Accelerate and unify over 30 data sources in one SQL runtime. Automatic schema detection, indexing, and retention are built in.',
        cta: {
          title: 'See 40+ supported connectors',
          url: '/integrations',
          target: '',
        },
        image: {
          ID: 1612,
          id: 1612,
          title: 'use_case_datalake_any_source',
          filename: 'use_case_datalake_any_source.png',
          filesize: 178168,
          url: '/website-assets/media/2025/12/use_case_datalake_any_source.png',
          link: '/use-case/datalake-accelerator/attachment/use_case_datalake_any_source/',
          alt: '',
          author: '6',
          description: '',
          caption: '',
          name: 'use_case_datalake_any_source',
          status: 'inherit',
          uploaded_to: 1062,
          date: '2025-12-02 23:33:32',
          modified: '2025-12-02 23:33:32',
          menu_order: 0,
          mime_type: 'image/png',
          type: 'image',
          subtype: 'png',
          icon: '/website-assets/media/default.png',
          width: 1388,
          height: 620,
          sizes: {
            thumbnail:
              '/website-assets/media/2025/12/use_case_datalake_any_source.png',
            'thumbnail-width': 150,
            'thumbnail-height': 150,
            medium:
              '/website-assets/media/2025/12/use_case_datalake_any_source.png',
            'medium-width': 300,
            'medium-height': 134,
            medium_large:
              '/website-assets/media/2025/12/use_case_datalake_any_source.png',
            'medium_large-width': 768,
            'medium_large-height': 343,
            large:
              '/website-assets/media/2025/12/use_case_datalake_any_source.png',
            'large-width': 1024,
            'large-height': 457,
            '1536x1536':
              '/website-assets/media/2025/12/use_case_datalake_any_source.png',
            '1536x1536-width': 1388,
            '1536x1536-height': 620,
            '2048x2048':
              '/website-assets/media/2025/12/use_case_datalake_any_source.png',
            '2048x2048-width': 1388,
            '2048x2048-height': 620,
          },
        },
      },
      {
        title: 'Reduce cold start times',
        paragraph:
          'Go from zero to ready with zero ETL. Acceleration snapshots bootstrap local tables from object storage like S3.',
        cta: {
          title: 'Read about operationalizing S3 for AI',
          url: '/blog/operationalizing-amazon-s3-for-ai',
          target: '',
        },
        image: {
          ID: 1613,
          id: 1613,
          title: 'use_case_datalake_speed',
          filename: 'use_case_datalake_speed.png',
          filesize: 201485,
          url: '/website-assets/media/2025/12/use_case_datalake_speed.png',
          link: '/use-case/datalake-accelerator/attachment/use_case_datalake_speed/',
          alt: '',
          author: '6',
          description: '',
          caption: '',
          name: 'use_case_datalake_speed',
          status: 'inherit',
          uploaded_to: 1062,
          date: '2025-12-02 23:33:34',
          modified: '2025-12-02 23:33:34',
          menu_order: 0,
          mime_type: 'image/png',
          type: 'image',
          subtype: 'png',
          icon: '/website-assets/media/default.png',
          width: 1388,
          height: 620,
          sizes: {
            thumbnail:
              '/website-assets/media/2025/12/use_case_datalake_speed.png',
            'thumbnail-width': 150,
            'thumbnail-height': 150,
            medium: '/website-assets/media/2025/12/use_case_datalake_speed.png',
            'medium-width': 300,
            'medium-height': 134,
            medium_large:
              '/website-assets/media/2025/12/use_case_datalake_speed.png',
            'medium_large-width': 768,
            'medium_large-height': 343,
            large: '/website-assets/media/2025/12/use_case_datalake_speed.png',
            'large-width': 1024,
            'large-height': 457,
            '1536x1536':
              '/website-assets/media/2025/12/use_case_datalake_speed.png',
            '1536x1536-width': 1388,
            '1536x1536-height': 620,
            '2048x2048':
              '/website-assets/media/2025/12/use_case_datalake_speed.png',
            '2048x2048-width': 1388,
            '2048x2048-height': 620,
          },
        },
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<ContentThreeAcrossIconText
  fields={{
    heading: 'Transform your data lake into a low-latency operational engine',
    heading_tag: 'h2',
    paragraph:
      'Federate, accelerate, and query in one engine, without standing up clusters or pipelines.',
    items: [
      {
        icon: {
          ID: 1183,
          id: 1183,
          title: 'Local Acceleration',
          filename: 'Local-Acceleration.svg',
          filesize: 12551,
          url: '/website-assets/media/2025/11/Local-Acceleration.svg',
          link: '/use-case/datalake-accelerator/attachment/local-acceleration/',
          alt: '',
          author: '6',
          description: '',
          caption: '',
          name: 'local-acceleration',
          status: 'inherit',
          uploaded_to: 1062,
          date: '2025-11-22 01:08:21',
          modified: '2025-11-22 01:08:21',
          menu_order: 0,
          mime_type: 'image/svg+xml',
          type: 'image',
          subtype: 'svg+xml',
          icon: '/website-assets/media/default.png',
          width: 0,
          height: 0,
          sizes: {
            thumbnail: '/website-assets/media/2025/11/Local-Acceleration.svg',
            'thumbnail-width': 1,
            'thumbnail-height': 1,
            medium: '/website-assets/media/2025/11/Local-Acceleration.svg',
            'medium-width': 1,
            'medium-height': 1,
            medium_large:
              '/website-assets/media/2025/11/Local-Acceleration.svg',
            'medium_large-width': 1,
            'medium_large-height': 1,
            large: '/website-assets/media/2025/11/Local-Acceleration.svg',
            'large-width': 1,
            'large-height': 1,
            '1536x1536': '/website-assets/media/2025/11/Local-Acceleration.svg',
            '1536x1536-width': 1,
            '1536x1536-height': 1,
            '2048x2048': '/website-assets/media/2025/11/Local-Acceleration.svg',
            '2048x2048-width': 1,
            '2048x2048-height': 1,
          },
        },
        title: 'Local Acceleration',
        description:
          'Execute queries with in-memory or on-disk acceleration for sub-second results.',
      },
      {
        icon: {
          ID: 1186,
          id: 1186,
          title: 'Snapshots',
          filename: 'Snapshots.svg',
          filesize: 5256,
          url: '/website-assets/media/2025/11/Snapshots.svg',
          link: '/use-case/datalake-accelerator/attachment/snapshots/',
          alt: '',
          author: '6',
          description: '',
          caption: '',
          name: 'snapshots',
          status: 'inherit',
          uploaded_to: 1062,
          date: '2025-11-22 01:08:24',
          modified: '2025-11-22 01:08:24',
          menu_order: 0,
          mime_type: 'image/svg+xml',
          type: 'image',
          subtype: 'svg+xml',
          icon: '/website-assets/media/default.png',
          width: 0,
          height: 0,
          sizes: {
            thumbnail: '/website-assets/media/2025/11/Snapshots.svg',
            'thumbnail-width': 1,
            'thumbnail-height': 1,
            medium: '/website-assets/media/2025/11/Snapshots.svg',
            'medium-width': 1,
            'medium-height': 1,
            medium_large: '/website-assets/media/2025/11/Snapshots.svg',
            'medium_large-width': 1,
            'medium_large-height': 1,
            large: '/website-assets/media/2025/11/Snapshots.svg',
            'large-width': 1,
            'large-height': 1,
            '1536x1536': '/website-assets/media/2025/11/Snapshots.svg',
            '1536x1536-width': 1,
            '1536x1536-height': 1,
            '2048x2048': '/website-assets/media/2025/11/Snapshots.svg',
            '2048x2048-width': 1,
            '2048x2048-height': 1,
          },
        },
        title: 'Snapshots',
        description:
          'Restore local tables instantly using versioned acceleration snapshots.',
      },
      {
        icon: {
          ID: 1181,
          id: 1181,
          title: 'Source Agnostic',
          filename: 'Source-Agnostic.svg',
          filesize: 7822,
          url: '/website-assets/media/2025/11/Source-Agnostic.svg',
          link: '/use-case/datalake-accelerator/attachment/source-agnostic/',
          alt: '',
          author: '6',
          description: '',
          caption: '',
          name: 'source-agnostic',
          status: 'inherit',
          uploaded_to: 1062,
          date: '2025-11-22 01:08:20',
          modified: '2025-11-22 01:08:20',
          menu_order: 0,
          mime_type: 'image/svg+xml',
          type: 'image',
          subtype: 'svg+xml',
          icon: '/website-assets/media/default.png',
          width: 0,
          height: 0,
          sizes: {
            thumbnail: '/website-assets/media/2025/11/Source-Agnostic.svg',
            'thumbnail-width': 1,
            'thumbnail-height': 1,
            medium: '/website-assets/media/2025/11/Source-Agnostic.svg',
            'medium-width': 1,
            'medium-height': 1,
            medium_large: '/website-assets/media/2025/11/Source-Agnostic.svg',
            'medium_large-width': 1,
            'medium_large-height': 1,
            large: '/website-assets/media/2025/11/Source-Agnostic.svg',
            'large-width': 1,
            'large-height': 1,
            '1536x1536': '/website-assets/media/2025/11/Source-Agnostic.svg',
            '1536x1536-width': 1,
            '1536x1536-height': 1,
            '2048x2048': '/website-assets/media/2025/11/Source-Agnostic.svg',
            '2048x2048-width': 1,
            '2048x2048-height': 1,
          },
        },
        title: 'Source Agnostic',
        description:
          'Accelerate data from S3, RDS, Snowflake, and more, all with SQL.',
      },
      {
        icon: {
          ID: 1184,
          id: 1184,
          title: 'Governed and Reliable',
          filename: 'Governed-and-Reliable.svg',
          filesize: 16119,
          url: '/website-assets/media/2025/11/Governed-and-Reliable.svg',
          link: '/use-case/datalake-accelerator/attachment/governed-and-reliable/',
          alt: '',
          author: '6',
          description: '',
          caption: '',
          name: 'governed-and-reliable',
          status: 'inherit',
          uploaded_to: 1062,
          date: '2025-11-22 01:08:22',
          modified: '2025-11-22 01:08:22',
          menu_order: 0,
          mime_type: 'image/svg+xml',
          type: 'image',
          subtype: 'svg+xml',
          icon: '/website-assets/media/default.png',
          width: 0,
          height: 0,
          sizes: {
            thumbnail:
              '/website-assets/media/2025/11/Governed-and-Reliable.svg',
            'thumbnail-width': 1,
            'thumbnail-height': 1,
            medium: '/website-assets/media/2025/11/Governed-and-Reliable.svg',
            'medium-width': 1,
            'medium-height': 1,
            medium_large:
              '/website-assets/media/2025/11/Governed-and-Reliable.svg',
            'medium_large-width': 1,
            'medium_large-height': 1,
            large: '/website-assets/media/2025/11/Governed-and-Reliable.svg',
            'large-width': 1,
            'large-height': 1,
            '1536x1536':
              '/website-assets/media/2025/11/Governed-and-Reliable.svg',
            '1536x1536-width': 1,
            '1536x1536-height': 1,
            '2048x2048':
              '/website-assets/media/2025/11/Governed-and-Reliable.svg',
            '2048x2048-width': 1,
            '2048x2048-height': 1,
          },
        },
        title: 'Governed and Reliable',
        description:
          'Schema validation, key constraints, retention policies, and predictable refresh behavior ensure that accelerated data remains consistent with its source.',
      },
      {
        icon: {
          ID: 1185,
          id: 1185,
          title: 'Automatic Source Fallback',
          filename: 'Automatic-Source-Fallback.svg',
          filesize: 5827,
          url: '/website-assets/media/2025/11/Automatic-Source-Fallback.svg',
          link: '/use-case/datalake-accelerator/attachment/automatic-source-fallback/',
          alt: '',
          author: '6',
          description: '',
          caption: '',
          name: 'automatic-source-fallback',
          status: 'inherit',
          uploaded_to: 1062,
          date: '2025-11-22 01:08:23',
          modified: '2025-11-22 01:08:23',
          menu_order: 0,
          mime_type: 'image/svg+xml',
          type: 'image',
          subtype: 'svg+xml',
          icon: '/website-assets/media/default.png',
          width: 0,
          height: 0,
          sizes: {
            thumbnail:
              '/website-assets/media/2025/11/Automatic-Source-Fallback.svg',
            'thumbnail-width': 1,
            'thumbnail-height': 1,
            medium:
              '/website-assets/media/2025/11/Automatic-Source-Fallback.svg',
            'medium-width': 1,
            'medium-height': 1,
            medium_large:
              '/website-assets/media/2025/11/Automatic-Source-Fallback.svg',
            'medium_large-width': 1,
            'medium_large-height': 1,
            large:
              '/website-assets/media/2025/11/Automatic-Source-Fallback.svg',
            'large-width': 1,
            'large-height': 1,
            '1536x1536':
              '/website-assets/media/2025/11/Automatic-Source-Fallback.svg',
            '1536x1536-width': 1,
            '1536x1536-height': 1,
            '2048x2048':
              '/website-assets/media/2025/11/Automatic-Source-Fallback.svg',
            '2048x2048-width': 1,
            '2048x2048-height': 1,
          },
        },
        title: 'Automatic Source Fallback',
        description:
          "If data isn't cached locally, Spice routes to the original data source or lakehouse, ensuring reliability and business continuity. ",
      },
      {
        icon: {
          ID: 1182,
          id: 1182,
          title: 'Deployment Flexibility',
          filename: 'Deployment-Flexibility.svg',
          filesize: 5255,
          url: '/website-assets/media/2025/11/Deployment-Flexibility.svg',
          link: '/use-case/datalake-accelerator/attachment/deployment-flexibility/',
          alt: '',
          author: '6',
          description: '',
          caption: '',
          name: 'deployment-flexibility',
          status: 'inherit',
          uploaded_to: 1062,
          date: '2025-11-22 01:08:21',
          modified: '2025-11-22 01:08:21',
          menu_order: 0,
          mime_type: 'image/svg+xml',
          type: 'image',
          subtype: 'svg+xml',
          icon: '/website-assets/media/default.png',
          width: 0,
          height: 0,
          sizes: {
            thumbnail:
              '/website-assets/media/2025/11/Deployment-Flexibility.svg',
            'thumbnail-width': 1,
            'thumbnail-height': 1,
            medium: '/website-assets/media/2025/11/Deployment-Flexibility.svg',
            'medium-width': 1,
            'medium-height': 1,
            medium_large:
              '/website-assets/media/2025/11/Deployment-Flexibility.svg',
            'medium_large-width': 1,
            'medium_large-height': 1,
            large: '/website-assets/media/2025/11/Deployment-Flexibility.svg',
            'large-width': 1,
            'large-height': 1,
            '1536x1536':
              '/website-assets/media/2025/11/Deployment-Flexibility.svg',
            '1536x1536-width': 1,
            '1536x1536-height': 1,
            '2048x2048':
              '/website-assets/media/2025/11/Deployment-Flexibility.svg',
            '2048x2048-width': 1,
            '2048x2048-height': 1,
          },
        },
        title: 'Deployment Flexibility',
        description:
          'Run Spice anywhere: as a sidecar, microservice, cluster, or on the managed Spice Cloud Platform.',
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<Testimonials
  heading="Deployed in production"
  headingTag="h2"
  paragraph="Run data-intensive workloads on a high-performance engine trusted by teams building real-time systems at scale."
  items={['twilio', 'barracuda', 'nrc-tim', 'basisset']}
/>

<CarouselLogos
  fields={{
    heading: 'Trusted by global enterprises',
    logos: [
      {
        logo: {
          ID: 443,
          id: 443,
          title: 'Homepage_Logos_Twilio',
          filename: 'Homepage_Logos_Twilio-1.svg',
          filesize: 4020,
          url: '/website-assets/media/2025/11/Homepage_Logos_Twilio-1.svg',
          link: '/home/homepage_logos_twilio-2/',
          alt: 'Twilio logo',
          author: '6',
          description: '',
          caption: '',
          name: 'homepage_logos_twilio-2',
          status: 'inherit',
          uploaded_to: 2,
          date: '2025-11-05 18:46:45',
          modified: '2025-11-05 18:46:45',
          menu_order: 0,
          mime_type: 'image/svg+xml',
          type: 'image',
          subtype: 'svg+xml',
          icon: '/website-assets/media/default.png',
          width: 0,
          height: 0,
          sizes: {
            thumbnail:
              '/website-assets/media/2025/11/Homepage_Logos_Twilio-1.svg',
            'thumbnail-width': 1,
            'thumbnail-height': 1,
            medium: '/website-assets/media/2025/11/Homepage_Logos_Twilio-1.svg',
            'medium-width': 1,
            'medium-height': 1,
            medium_large:
              '/website-assets/media/2025/11/Homepage_Logos_Twilio-1.svg',
            'medium_large-width': 1,
            'medium_large-height': 1,
            large: '/website-assets/media/2025/11/Homepage_Logos_Twilio-1.svg',
            'large-width': 1,
            'large-height': 1,
            '1536x1536':
              '/website-assets/media/2025/11/Homepage_Logos_Twilio-1.svg',
            '1536x1536-width': 1,
            '1536x1536-height': 1,
            '2048x2048':
              '/website-assets/media/2025/11/Homepage_Logos_Twilio-1.svg',
            '2048x2048-width': 1,
            '2048x2048-height': 1,
          },
        },
      },
      {
        logo: {
          ID: 442,
          id: 442,
          title: 'Homepage_Logos_NRC',
          filename: 'Homepage_Logos_NRC-1.svg',
          filesize: 1030,
          url: '/website-assets/media/2025/11/Homepage_Logos_NRC-1.svg',
          link: '/home/homepage_logos_nrc-2/',
          alt: 'NRC Health logo',
          author: '6',
          description: '',
          caption: '',
          name: 'homepage_logos_nrc-2',
          status: 'inherit',
          uploaded_to: 2,
          date: '2025-11-05 18:46:45',
          modified: '2025-11-05 18:46:45',
          menu_order: 0,
          mime_type: 'image/svg+xml',
          type: 'image',
          subtype: 'svg+xml',
          icon: '/website-assets/media/default.png',
          width: 0,
          height: 0,
          sizes: {
            thumbnail: '/website-assets/media/2025/11/Homepage_Logos_NRC-1.svg',
            'thumbnail-width': 1,
            'thumbnail-height': 1,
            medium: '/website-assets/media/2025/11/Homepage_Logos_NRC-1.svg',
            'medium-width': 1,
            'medium-height': 1,
            medium_large:
              '/website-assets/media/2025/11/Homepage_Logos_NRC-1.svg',
            'medium_large-width': 1,
            'medium_large-height': 1,
            large: '/website-assets/media/2025/11/Homepage_Logos_NRC-1.svg',
            'large-width': 1,
            'large-height': 1,
            '1536x1536':
              '/website-assets/media/2025/11/Homepage_Logos_NRC-1.svg',
            '1536x1536-width': 1,
            '1536x1536-height': 1,
            '2048x2048':
              '/website-assets/media/2025/11/Homepage_Logos_NRC-1.svg',
            '2048x2048-width': 1,
            '2048x2048-height': 1,
          },
        },
      },
      {
        logo: {
          ID: 441,
          id: 441,
          title: 'Homepage_Logos_BasisSet',
          filename: 'Homepage_Logos_BasisSet-1.svg',
          filesize: 2629,
          url: '/website-assets/media/2025/11/Homepage_Logos_BasisSet-1.svg',
          link: '/home/homepage_logos_basisset-2/',
          alt: 'Basis Set Ventures logo',
          author: '6',
          description: '',
          caption: '',
          name: 'homepage_logos_basisset-2',
          status: 'inherit',
          uploaded_to: 2,
          date: '2025-11-05 18:46:45',
          modified: '2025-11-05 18:46:45',
          menu_order: 0,
          mime_type: 'image/svg+xml',
          type: 'image',
          subtype: 'svg+xml',
          icon: '/website-assets/media/default.png',
          width: 0,
          height: 0,
          sizes: {
            thumbnail:
              '/website-assets/media/2025/11/Homepage_Logos_BasisSet-1.svg',
            'thumbnail-width': 1,
            'thumbnail-height': 1,
            medium:
              '/website-assets/media/2025/11/Homepage_Logos_BasisSet-1.svg',
            'medium-width': 1,
            'medium-height': 1,
            medium_large:
              '/website-assets/media/2025/11/Homepage_Logos_BasisSet-1.svg',
            'medium_large-width': 1,
            'medium_large-height': 1,
            large:
              '/website-assets/media/2025/11/Homepage_Logos_BasisSet-1.svg',
            'large-width': 1,
            'large-height': 1,
            '1536x1536':
              '/website-assets/media/2025/11/Homepage_Logos_BasisSet-1.svg',
            '1536x1536-width': 1,
            '1536x1536-height': 1,
            '2048x2048':
              '/website-assets/media/2025/11/Homepage_Logos_BasisSet-1.svg',
            '2048x2048-width': 1,
            '2048x2048-height': 1,
          },
        },
      },
      {
        logo: {
          ID: 440,
          id: 440,
          title: 'Homepage_Logos_Barracuda',
          filename: 'Homepage_Logos_Barracuda-1.svg',
          filesize: 7450,
          url: '/website-assets/media/2025/11/Homepage_Logos_Barracuda-1.svg',
          link: '/home/homepage_logos_barracuda-2/',
          alt: 'Barracuda Networks logo',
          author: '6',
          description: '',
          caption: '',
          name: 'homepage_logos_barracuda-2',
          status: 'inherit',
          uploaded_to: 2,
          date: '2025-11-05 18:46:45',
          modified: '2025-11-05 18:46:45',
          menu_order: 0,
          mime_type: 'image/svg+xml',
          type: 'image',
          subtype: 'svg+xml',
          icon: '/website-assets/media/default.png',
          width: 0,
          height: 0,
          sizes: {
            thumbnail:
              '/website-assets/media/2025/11/Homepage_Logos_Barracuda-1.svg',
            'thumbnail-width': 1,
            'thumbnail-height': 1,
            medium:
              '/website-assets/media/2025/11/Homepage_Logos_Barracuda-1.svg',
            'medium-width': 1,
            'medium-height': 1,
            medium_large:
              '/website-assets/media/2025/11/Homepage_Logos_Barracuda-1.svg',
            'medium_large-width': 1,
            'medium_large-height': 1,
            large:
              '/website-assets/media/2025/11/Homepage_Logos_Barracuda-1.svg',
            'large-width': 1,
            'large-height': 1,
            '1536x1536':
              '/website-assets/media/2025/11/Homepage_Logos_Barracuda-1.svg',
            '1536x1536-width': 1,
            '1536x1536-height': 1,
            '2048x2048':
              '/website-assets/media/2025/11/Homepage_Logos_Barracuda-1.svg',
            '2048x2048-width': 1,
            '2048x2048-height': 1,
          },
        },
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<ContentResourceFeatured
  fields={{
    heading: 'Build an accelerated data lake',
    heading_tag: 'h2',
    paragraph:
      'Guides and examples to learn more about querying data, building apps, and integrating AI with Spice.',
    mode: 'default',
    resources: [
      {
        source: 'manual',
        resource: null,
        resource_manual: {
          eyebrow: 'Recipe',
          title: {
            title: 'Data acceleration with DuckDB',
            url: 'https://github.com/spiceai/cookbook/blob/trunk/duckdb/accelerator/README.md',
            target: '',
          },
          description:
            'This recipe will walkthrough how to accelerate a local copy of the taxi trips dataset stored in S3 using DuckDB as the data accelerator engine.',
          image: {
            ID: 1659,
            id: 1659,
            title: 'cookbooks jpeg',
            filename: 'cookbooks-jpeg.png',
            filesize: 2171698,
            url: '/website-assets/media/2025/12/cookbooks-jpeg.png',
            link: '/cookbooks-jpeg/',
            alt: '',
            author: '9',
            description: '',
            caption: '',
            name: 'cookbooks-jpeg',
            status: 'inherit',
            uploaded_to: 0,
            date: '2025-12-05 04:13:34',
            modified: '2025-12-05 04:13:34',
            menu_order: 0,
            mime_type: 'image/png',
            type: 'image',
            subtype: 'png',
            icon: '/website-assets/media/default.png',
            width: 1832,
            height: 1036,
            sizes: {
              thumbnail:
                '/website-assets/media/2025/12/cookbooks-jpeg-150x150.png',
              'thumbnail-width': 150,
              'thumbnail-height': 150,
              medium:
                '/website-assets/media/2025/12/cookbooks-jpeg-300x170.png',
              'medium-width': 300,
              'medium-height': 170,
              medium_large:
                '/website-assets/media/2025/12/cookbooks-jpeg-768x434.png',
              'medium_large-width': 768,
              'medium_large-height': 434,
              large:
                '/website-assets/media/2025/12/cookbooks-jpeg-1024x579.png',
              'large-width': 1024,
              'large-height': 579,
              '1536x1536':
                '/website-assets/media/2025/12/cookbooks-jpeg-1536x869.png',
              '1536x1536-width': 1536,
              '1536x1536-height': 869,
              '2048x2048': '/website-assets/media/2025/12/cookbooks-jpeg.png',
              '2048x2048-width': 1832,
              '2048x2048-height': 1036,
            },
          },
        },
      },
      {
        source: 'manual',
        resource: null,
        resource_manual: {
          eyebrow: 'Docs',
          title: {
            title: 'Spice Acceleration docs',
            url: 'https://spiceai.org/docs/features/data-acceleration',
            target: '',
          },
          description:
            'Datasets and views can be locally accelerated by the Spice runtime, pulling data from any Data Connector and storing it locally in a Data Accelerator for faster access',
          image: {
            ID: 1661,
            id: 1661,
            title: 'Docs jpeg',
            filename: 'Docs-jpeg.jpeg',
            filesize: 103192,
            url: '/website-assets/media/2025/12/Docs-jpeg.jpeg',
            link: '/docs-jpeg/',
            alt: '',
            author: '9',
            description: '',
            caption: '',
            name: 'docs-jpeg',
            status: 'inherit',
            uploaded_to: 0,
            date: '2025-12-05 04:13:53',
            modified: '2025-12-05 04:13:53',
            menu_order: 0,
            mime_type: 'image/jpeg',
            type: 'image',
            subtype: 'jpeg',
            icon: '/website-assets/media/default.png',
            width: 1832,
            height: 1036,
            sizes: {
              thumbnail: '/website-assets/media/2025/12/Docs-jpeg-150x150.jpeg',
              'thumbnail-width': 150,
              'thumbnail-height': 150,
              medium: '/website-assets/media/2025/12/Docs-jpeg-300x170.jpeg',
              'medium-width': 300,
              'medium-height': 170,
              medium_large:
                '/website-assets/media/2025/12/Docs-jpeg-768x434.jpeg',
              'medium_large-width': 768,
              'medium_large-height': 434,
              large: '/website-assets/media/2025/12/Docs-jpeg-1024x579.jpeg',
              'large-width': 1024,
              'large-height': 579,
              '1536x1536':
                '/website-assets/media/2025/12/Docs-jpeg-1536x869.jpeg',
              '1536x1536-width': 1536,
              '1536x1536-height': 869,
              '2048x2048': '/website-assets/media/2025/12/Docs-jpeg.jpeg',
              '2048x2048-width': 1832,
              '2048x2048-height': 1036,
            },
          },
        },
      },
      {
        source: 'picker',
        resource: [
          {
            title:
              'Making Object Storage Operational for Real-Time and AI Workloads',
            slug: '/blog/making-object-storage-operational',
            excerpt:
              'TLDR Introduction Although legacy systems and workflows remain common, many enterprises are re-evaluating their architectures to meet new demands&nbsp; &#8211; driven in part, but not exclusively, by AI &#8211; that require support for more data-intensive and real-time applications. The underlying storage needs for these novel workloads are generally outside the bounds of a traditional operational [&hellip;]',
            image:
              '/website-assets/media/2025/11/68e42f8a5daa71c139c95512_Version-2.png',
            type: 'Blog',
            taxonomy: [],
          },
        ],
        resource_manual: {
          eyebrow: '',
          title: null,
          description: '',
          image: false,
        },
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<AccordionFaq
  fields={{
    heading: 'FAQs',
    heading_tag: 'h2',
    paragraph:
      'Answers to common questions about accelerating data lake queries with Spice',
    items: [
      {
        title: 'What is a data lake accelerator?',
        paragraph:
          '<p>A data lake accelerator materializes frequently queried datasets from object storage into a fast local engine so queries avoid network round-trips to the lake. Spice pulls hot data into local Data Accelerators, keeps it synced, and serves sub-second SQL directly on formats like Parquet and Iceberg. It builds on the <a href="/platform/sql-federation-acceleration">SQL federation and acceleration</a> engine in the Spice runtime.</p>\n',
      },
      {
        title: 'How does accelerated data stay in sync with the source?',
        paragraph:
          '<p>Spice refreshes accelerated datasets in real time or on a configurable schedule, so queries always see the latest state. Schema validation, key constraints, retention policies, and predictable refresh behavior keep accelerated data consistent with its source. For streaming sources, <a href="/feature/real-time-change-data-capture">real-time change data capture</a> applies changes as they occur.</p>\n',
      },
      {
        title: 'What happens when data is not available locally?',
        paragraph:
          '<p>Queries automatically fall back to the underlying lakehouse or data warehouse source when data is not cached locally. This automatic source fallback maintains consistent access and business continuity, even during service outages.</p>\n',
      },
      {
        title: 'How does acceleration reduce data lake costs?',
        paragraph:
          '<p>Materializing frequently accessed data in the Spice runtime avoids repeated network round-trips and cluster spin-ups against the data lake, which lowers compute spend. Spice reports up to 80% cost savings on data lakehouse spend and up to 100x faster queries for accelerated workloads.</p>\n',
      },
      {
        title: 'Do I need to build ETL pipelines to accelerate my data lake?',
        paragraph:
          '<p>No. Acceleration snapshots bootstrap local tables directly from object storage like S3 with zero ETL, reducing cold start times. Spice runs as a sidecar, microservice, or cluster, or as a fully managed service on the Spice Cloud Platform.</p>\n',
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<TalkToAnEngineerCta />

---

## Operational Data Lakehouse
URL: https://spice.ai/use-case/operational-data-lakehouse
Date: 2025-11-21T18:54:05
Description: Federate, accelerate, and serve data-intensive apps and AI agents directly from object storage with millisecond performance.

<HeroTextImageFiftyFifty
  fields={{
    variant: 'variant-1',
    eyebrow: 'Operational Data Lakehouse',
    heading_tag: 'h1',
    heading: 'Serve real-time data and AI from object storage',
    paragraph:
      'Retain the scalability of object storage and the governance of open table formats. Add Spice to federate, accelerate, and power operational and AI workloads with millisecond query performance.',
    cta: [
      {
        type: 'filled',
        cta: {
          title: 'Get a demo',
          url: 'https://meetings.hubspot.com/vladi-semenov',
          target: '_blank',
        },
      },
      {
        type: 'bordered',
        cta: {
          title: 'View the docs',
          url: 'https://spiceai.org/docs/use-cases/data/object-store-data-engine',
          target: '_blank',
        },
      },
    ],
    media_type: 'image',
    media_image: {
      ID: 1564,
      id: 1564,
      title: 'use_case_operational_data_header',
      filename: 'use_case_operational_data_header.png',
      filesize: 257017,
      url: '/website-assets/media/2025/12/use_case_operational_data_header.png',
      link: '/use-case/operational-data-lakehouse/attachment/use_case_operational_data_header/',
      alt: '',
      author: '6',
      description: '',
      caption: '',
      name: 'use_case_operational_data_header',
      status: 'inherit',
      uploaded_to: 1086,
      date: '2025-12-01 22:59:29',
      modified: '2025-12-01 22:59:29',
      menu_order: 0,
      mime_type: 'image/png',
      type: 'image',
      subtype: 'png',
      icon: '/website-assets/media/default.png',
      width: 1584,
      height: 540,
      sizes: {
        thumbnail:
          '/website-assets/media/2025/12/use_case_operational_data_header.png',
        'thumbnail-width': 150,
        'thumbnail-height': 150,
        medium:
          '/website-assets/media/2025/12/use_case_operational_data_header.png',
        'medium-width': 300,
        'medium-height': 102,
        medium_large:
          '/website-assets/media/2025/12/use_case_operational_data_header.png',
        'medium_large-width': 768,
        'medium_large-height': 262,
        large:
          '/website-assets/media/2025/12/use_case_operational_data_header.png',
        'large-width': 1024,
        'large-height': 349,
        '1536x1536':
          '/website-assets/media/2025/12/use_case_operational_data_header.png',
        '1536x1536-width': 1584,
        '1536x1536-height': 540,
        '2048x2048':
          '/website-assets/media/2025/12/use_case_operational_data_header.png',
        '2048x2048-width': 1584,
        '2048x2048-height': 540,
      },
    },
    media_video: '',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<ContentStats
  fields={{
    heading: 'Do more with your data',
    heading_tag: 'h2',
    stats: [
      {
        media_type: 'image',
        image: false,
        lottie: false,
        amount: '100',
        suffix: 'x',
        after_text: 'up to 100x faster queries',
      },
      {
        media_type: 'image',
        image: false,
        lottie: false,
        amount: '80',
        suffix: '%',
        after_text: 'up to 80% cost savings on data lakehouse spend',
      },
      {
        media_type: 'image',
        image: false,
        lottie: false,
        amount: '2',
        suffix: 'x',
        after_text: 'increase in data reliability for critical workloads',
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<ContentImageVideo
  fields={{
    variant: 'variant-2',
    heading: "Lakehouses weren't built for operational workloads",
    heading_tag: 'h2',
    paragraph:
      'Traditional data lakehouses handle analytics well but lag for modern apps and AI agents that need sub-second responses and federated access. The result is slow queries, complex pipelines, and high costs when serving real-time operational data.',
    cta: false,
    media_type: 'image',
    media_image: {
      ID: 1048,
      id: 1048,
      title: 'use_case_challenge',
      filename: 'use_case_challenge.png',
      filesize: 4349638,
      url: '/website-assets/media/2025/11/use_case_challenge.png',
      link: '/use-case/application-search/attachment/use_case_challenge/',
      alt: '',
      author: '6',
      description: '',
      caption: '',
      name: 'use_case_challenge',
      status: 'inherit',
      uploaded_to: 1044,
      date: '2025-11-21 16:21:07',
      modified: '2025-11-21 16:21:07',
      menu_order: 0,
      mime_type: 'image/png',
      type: 'image',
      subtype: 'png',
      icon: '/website-assets/media/default.png',
      width: 2720,
      height: 1824,
      sizes: {
        thumbnail: '/website-assets/media/2025/11/use_case_challenge.png',
        'thumbnail-width': 150,
        'thumbnail-height': 150,
        medium: '/website-assets/media/2025/11/use_case_challenge.png',
        'medium-width': 300,
        'medium-height': 201,
        medium_large: '/website-assets/media/2025/11/use_case_challenge.png',
        'medium_large-width': 768,
        'medium_large-height': 515,
        large: '/website-assets/media/2025/11/use_case_challenge.png',
        'large-width': 1024,
        'large-height': 687,
        '1536x1536': '/website-assets/media/2025/11/use_case_challenge.png',
        '1536x1536-width': 1536,
        '1536x1536-height': 1030,
        '2048x2048': '/website-assets/media/2025/11/use_case_challenge.png',
        '2048x2048-width': 2048,
        '2048x2048-height': 1373,
      },
    },
    graphic_overlay: false,
    media_video: '',
    padding_top: 'st-lg',
    padding_bottom: 'sb-lg',
  }}
/>

<CarouselHorizontalCards
  fields={{
    heading: 'Turn your lakehouse into an operational data layer',
    heading_tag: 'h2',
    paragraph:
      'Make your data lakehouse fast, federated, and AI-ready-serving live workloads at millisecond latency.',
    item: [
      {
        title: 'Federate across sources',
        paragraph:
          'Query databases, APIs, and object storage using standard SQL. Combine transactional and analytical data in a single query with zero ETL.',
        cta: {
          title: 'Explore SQL federation and acceleration',
          url: '/platform/sql-federation-acceleration',
          target: '',
        },
        image: {
          ID: 1615,
          id: 1615,
          title: 'use_case_operational_data_federation',
          filename: 'use_case_operational_data_federation.png',
          filesize: 220801,
          url: '/website-assets/media/2025/12/use_case_operational_data_federation.png',
          link: '/use-case/operational-data-lakehouse/attachment/use_case_operational_data_federation/',
          alt: '',
          author: '6',
          description: '',
          caption: '',
          name: 'use_case_operational_data_federation',
          status: 'inherit',
          uploaded_to: 1086,
          date: '2025-12-02 23:36:45',
          modified: '2025-12-02 23:36:45',
          menu_order: 0,
          mime_type: 'image/png',
          type: 'image',
          subtype: 'png',
          icon: '/website-assets/media/default.png',
          width: 1388,
          height: 768,
          sizes: {
            thumbnail:
              '/website-assets/media/2025/12/use_case_operational_data_federation.png',
            'thumbnail-width': 150,
            'thumbnail-height': 150,
            medium:
              '/website-assets/media/2025/12/use_case_operational_data_federation.png',
            'medium-width': 300,
            'medium-height': 166,
            medium_large:
              '/website-assets/media/2025/12/use_case_operational_data_federation.png',
            'medium_large-width': 768,
            'medium_large-height': 425,
            large:
              '/website-assets/media/2025/12/use_case_operational_data_federation.png',
            'large-width': 1024,
            'large-height': 566,
            '1536x1536':
              '/website-assets/media/2025/12/use_case_operational_data_federation.png',
            '1536x1536-width': 1388,
            '1536x1536-height': 768,
            '2048x2048':
              '/website-assets/media/2025/12/use_case_operational_data_federation.png',
            '2048x2048-width': 1388,
            '2048x2048-height': 768,
          },
        },
      },
      {
        title: 'Accelerate object storage performance',
        paragraph:
          'Use data accelerators like Spice Cayenne, DuckDB, or SQLite to materialize and cache hot datasets locally. Reduce query latency from seconds to milliseconds while maintaining the scale and economics of object storage.',
        cta: {
          title: 'Explore Spice Cayenne Data Accelerator',
          url: '/blog/introducing-spice-cayenne-data-accelerator',
          target: '',
        },
        image: {
          ID: 1616,
          id: 1616,
          title: 'use_case_operational_data_accelerate',
          filename: 'use_case_operational_data_accelerate.png',
          filesize: 291812,
          url: '/website-assets/media/2025/12/use_case_operational_data_accelerate.png',
          link: '/use-case/operational-data-lakehouse/attachment/use_case_operational_data_accelerate/',
          alt: '',
          author: '6',
          description: '',
          caption: '',
          name: 'use_case_operational_data_accelerate',
          status: 'inherit',
          uploaded_to: 1086,
          date: '2025-12-02 23:36:48',
          modified: '2025-12-02 23:36:48',
          menu_order: 0,
          mime_type: 'image/png',
          type: 'image',
          subtype: 'png',
          icon: '/website-assets/media/default.png',
          width: 1388,
          height: 768,
          sizes: {
            thumbnail:
              '/website-assets/media/2025/12/use_case_operational_data_accelerate.png',
            'thumbnail-width': 150,
            'thumbnail-height': 150,
            medium:
              '/website-assets/media/2025/12/use_case_operational_data_accelerate.png',
            'medium-width': 300,
            'medium-height': 166,
            medium_large:
              '/website-assets/media/2025/12/use_case_operational_data_accelerate.png',
            'medium_large-width': 768,
            'medium_large-height': 425,
            large:
              '/website-assets/media/2025/12/use_case_operational_data_accelerate.png',
            'large-width': 1024,
            'large-height': 566,
            '1536x1536':
              '/website-assets/media/2025/12/use_case_operational_data_accelerate.png',
            '1536x1536-width': 1388,
            '1536x1536-height': 768,
            '2048x2048':
              '/website-assets/media/2025/12/use_case_operational_data_accelerate.png',
            '2048x2048-width': 1388,
            '2048x2048-height': 768,
          },
        },
      },
      {
        title: 'Serve operational and AI workloads',
        paragraph:
          'SQL federation, acceleration, and AI inference in one runtime means you can support disparate workloads directly from your data lakehouse, all in real time.',
        cta: {
          title: 'Explore LLM inference in Spice',
          url: '/platform/llm-inference',
          target: '',
        },
        image: {
          ID: 1617,
          id: 1617,
          title: 'use_case_operational_data_ai',
          filename: 'use_case_operational_data_ai.png',
          filesize: 268338,
          url: '/website-assets/media/2025/12/use_case_operational_data_ai.png',
          link: '/use-case/operational-data-lakehouse/attachment/use_case_operational_data_ai/',
          alt: '',
          author: '6',
          description: '',
          caption: '',
          name: 'use_case_operational_data_ai',
          status: 'inherit',
          uploaded_to: 1086,
          date: '2025-12-02 23:36:50',
          modified: '2025-12-02 23:36:50',
          menu_order: 0,
          mime_type: 'image/png',
          type: 'image',
          subtype: 'png',
          icon: '/website-assets/media/default.png',
          width: 1388,
          height: 768,
          sizes: {
            thumbnail:
              '/website-assets/media/2025/12/use_case_operational_data_ai.png',
            'thumbnail-width': 150,
            'thumbnail-height': 150,
            medium:
              '/website-assets/media/2025/12/use_case_operational_data_ai.png',
            'medium-width': 300,
            'medium-height': 166,
            medium_large:
              '/website-assets/media/2025/12/use_case_operational_data_ai.png',
            'medium_large-width': 768,
            'medium_large-height': 425,
            large:
              '/website-assets/media/2025/12/use_case_operational_data_ai.png',
            'large-width': 1024,
            'large-height': 566,
            '1536x1536':
              '/website-assets/media/2025/12/use_case_operational_data_ai.png',
            '1536x1536-width': 1388,
            '1536x1536-height': 768,
            '2048x2048':
              '/website-assets/media/2025/12/use_case_operational_data_ai.png',
            '2048x2048-width': 1388,
            '2048x2048-height': 768,
          },
        },
      },
      {
        title: 'Native open table format support',
        paragraph:
          'Connect to Apache Iceberg, Delta Lake, or Parquet for schema management, ACID transactions, and optimized query planning.',
        cta: {
          title: 'Read about Apache Iceberg at Spice AI',
          url: '/blog/apache-iceberg-at-spice-ai',
          target: '',
        },
        image: {
          ID: 1618,
          id: 1618,
          title: 'Operational Data Lakehouse_ 5',
          filename: 'Operational-Data-Lakehouse_-5.png',
          filesize: 207097,
          url: '/website-assets/media/2025/12/Operational-Data-Lakehouse_-5.png',
          link: '/use-case/operational-data-lakehouse/attachment/operational-data-lakehouse_-5/',
          alt: '',
          author: '6',
          description: '',
          caption: '',
          name: 'operational-data-lakehouse_-5',
          status: 'inherit',
          uploaded_to: 1086,
          date: '2025-12-02 23:36:53',
          modified: '2025-12-02 23:36:53',
          menu_order: 0,
          mime_type: 'image/png',
          type: 'image',
          subtype: 'png',
          icon: '/website-assets/media/default.png',
          width: 1254,
          height: 800,
          sizes: {
            thumbnail:
              '/website-assets/media/2025/12/Operational-Data-Lakehouse_-5-150x150.png',
            'thumbnail-width': 150,
            'thumbnail-height': 150,
            medium:
              '/website-assets/media/2025/12/Operational-Data-Lakehouse_-5-300x191.png',
            'medium-width': 300,
            'medium-height': 191,
            medium_large:
              '/website-assets/media/2025/12/Operational-Data-Lakehouse_-5-768x490.png',
            'medium_large-width': 768,
            'medium_large-height': 490,
            large:
              '/website-assets/media/2025/12/Operational-Data-Lakehouse_-5-1024x653.png',
            'large-width': 1024,
            'large-height': 653,
            '1536x1536':
              '/website-assets/media/2025/12/Operational-Data-Lakehouse_-5.png',
            '1536x1536-width': 1254,
            '1536x1536-height': 800,
            '2048x2048':
              '/website-assets/media/2025/12/Operational-Data-Lakehouse_-5.png',
            '2048x2048-width': 1254,
            '2048x2048-height': 800,
          },
        },
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<ContentThreeAcrossIconText
  fields={{
    heading: 'Why enterprises operationalize their lakehouse with Spice',
    heading_tag: 'h2',
    paragraph:
      'Spice bridges the gap between analytical and operational workloads.  Combine federation, acceleration, and AI in one lightweight, portable runtime.',
    items: [
      {
        icon: {
          ID: 1093,
          id: 1093,
          title: 'UseCase_OperationalDataLakehouse_SQL-First Engine',
          filename: 'UseCase_OperationalDataLakehouse_SQL-First-Engine.svg',
          filesize: 6121,
          url: '/website-assets/media/2025/11/UseCase_OperationalDataLakehouse_SQL-First-Engine.svg',
          link: '/use-case/operational-data-lakehouse/attachment/usecase_operationaldatalakehouse_sql-first-engine/',
          alt: '',
          author: '6',
          description: '',
          caption: '',
          name: 'usecase_operationaldatalakehouse_sql-first-engine',
          status: 'inherit',
          uploaded_to: 1086,
          date: '2025-11-21 18:51:47',
          modified: '2025-11-21 18:51:47',
          menu_order: 0,
          mime_type: 'image/svg+xml',
          type: 'image',
          subtype: 'svg+xml',
          icon: '/website-assets/media/default.png',
          width: 0,
          height: 0,
          sizes: {
            thumbnail:
              '/website-assets/media/2025/11/UseCase_OperationalDataLakehouse_SQL-First-Engine.svg',
            'thumbnail-width': 1,
            'thumbnail-height': 1,
            medium:
              '/website-assets/media/2025/11/UseCase_OperationalDataLakehouse_SQL-First-Engine.svg',
            'medium-width': 1,
            'medium-height': 1,
            medium_large:
              '/website-assets/media/2025/11/UseCase_OperationalDataLakehouse_SQL-First-Engine.svg',
            'medium_large-width': 1,
            'medium_large-height': 1,
            large:
              '/website-assets/media/2025/11/UseCase_OperationalDataLakehouse_SQL-First-Engine.svg',
            'large-width': 1,
            'large-height': 1,
            '1536x1536':
              '/website-assets/media/2025/11/UseCase_OperationalDataLakehouse_SQL-First-Engine.svg',
            '1536x1536-width': 1,
            '1536x1536-height': 1,
            '2048x2048':
              '/website-assets/media/2025/11/UseCase_OperationalDataLakehouse_SQL-First-Engine.svg',
            '2048x2048-width': 1,
            '2048x2048-height': 1,
          },
        },
        title: 'SQL-First Hybrid Search',
        description:
          'Bring hybrid search - keyword, full-text, and vector - directly to your lakehouse to surface insights and relationships using simple SQL.',
      },
      {
        icon: {
          ID: 1091,
          id: 1091,
          title: 'UseCase_OperationalDataLakehouse_Operational and Analytical',
          filename:
            'UseCase_OperationalDataLakehouse_Operational-and-Analytical.svg',
          filesize: 11251,
          url: '/website-assets/media/2025/11/UseCase_OperationalDataLakehouse_Operational-and-Analytical.svg',
          link: '/use-case/operational-data-lakehouse/attachment/usecase_operationaldatalakehouse_operational-and-analytical/',
          alt: '',
          author: '6',
          description: '',
          caption: '',
          name: 'usecase_operationaldatalakehouse_operational-and-analytical',
          status: 'inherit',
          uploaded_to: 1086,
          date: '2025-11-21 18:51:45',
          modified: '2025-11-21 18:51:45',
          menu_order: 0,
          mime_type: 'image/svg+xml',
          type: 'image',
          subtype: 'svg+xml',
          icon: '/website-assets/media/default.png',
          width: 0,
          height: 0,
          sizes: {
            thumbnail:
              '/website-assets/media/2025/11/UseCase_OperationalDataLakehouse_Operational-and-Analytical.svg',
            'thumbnail-width': 1,
            'thumbnail-height': 1,
            medium:
              '/website-assets/media/2025/11/UseCase_OperationalDataLakehouse_Operational-and-Analytical.svg',
            'medium-width': 1,
            'medium-height': 1,
            medium_large:
              '/website-assets/media/2025/11/UseCase_OperationalDataLakehouse_Operational-and-Analytical.svg',
            'medium_large-width': 1,
            'medium_large-height': 1,
            large:
              '/website-assets/media/2025/11/UseCase_OperationalDataLakehouse_Operational-and-Analytical.svg',
            'large-width': 1,
            'large-height': 1,
            '1536x1536':
              '/website-assets/media/2025/11/UseCase_OperationalDataLakehouse_Operational-and-Analytical.svg',
            '1536x1536-width': 1,
            '1536x1536-height': 1,
            '2048x2048':
              '/website-assets/media/2025/11/UseCase_OperationalDataLakehouse_Operational-and-Analytical.svg',
            '2048x2048-width': 1,
            '2048x2048-height': 1,
          },
        },
        title: 'Mixed Workload Execution',
        description:
          'Serve both operational applications and analytical queries from one runtime.',
      },
      {
        icon: {
          ID: 1090,
          id: 1090,
          title: 'UseCase_OperationalDataLakehouse_Open Table Support',
          filename: 'UseCase_OperationalDataLakehouse_Open-Table-Support.svg',
          filesize: 2612,
          url: '/website-assets/media/2025/11/UseCase_OperationalDataLakehouse_Open-Table-Support.svg',
          link: '/use-case/operational-data-lakehouse/attachment/usecase_operationaldatalakehouse_open-table-support/',
          alt: '',
          author: '6',
          description: '',
          caption: '',
          name: 'usecase_operationaldatalakehouse_open-table-support',
          status: 'inherit',
          uploaded_to: 1086,
          date: '2025-11-21 18:51:44',
          modified: '2025-11-21 18:51:44',
          menu_order: 0,
          mime_type: 'image/svg+xml',
          type: 'image',
          subtype: 'svg+xml',
          icon: '/website-assets/media/default.png',
          width: 0,
          height: 0,
          sizes: {
            thumbnail:
              '/website-assets/media/2025/11/UseCase_OperationalDataLakehouse_Open-Table-Support.svg',
            'thumbnail-width': 1,
            'thumbnail-height': 1,
            medium:
              '/website-assets/media/2025/11/UseCase_OperationalDataLakehouse_Open-Table-Support.svg',
            'medium-width': 1,
            'medium-height': 1,
            medium_large:
              '/website-assets/media/2025/11/UseCase_OperationalDataLakehouse_Open-Table-Support.svg',
            'medium_large-width': 1,
            'medium_large-height': 1,
            large:
              '/website-assets/media/2025/11/UseCase_OperationalDataLakehouse_Open-Table-Support.svg',
            'large-width': 1,
            'large-height': 1,
            '1536x1536':
              '/website-assets/media/2025/11/UseCase_OperationalDataLakehouse_Open-Table-Support.svg',
            '1536x1536-width': 1,
            '1536x1536-height': 1,
            '2048x2048':
              '/website-assets/media/2025/11/UseCase_OperationalDataLakehouse_Open-Table-Support.svg',
            '2048x2048-width': 1,
            '2048x2048-height': 1,
          },
        },
        title: 'Open Table Support',
        description:
          'Built-in support for Iceberg, Delta Lake, and Parquet for structured governance.',
      },
      {
        icon: {
          ID: 1092,
          id: 1092,
          title: 'UseCase_OperationalDataLakehouse_Reliability and Continuity',
          filename:
            'UseCase_OperationalDataLakehouse_Reliability-and-Continuity.svg',
          filesize: 12607,
          url: '/website-assets/media/2025/11/UseCase_OperationalDataLakehouse_Reliability-and-Continuity.svg',
          link: '/use-case/operational-data-lakehouse/attachment/usecase_operationaldatalakehouse_reliability-and-continuity/',
          alt: '',
          author: '6',
          description: '',
          caption: '',
          name: 'usecase_operationaldatalakehouse_reliability-and-continuity',
          status: 'inherit',
          uploaded_to: 1086,
          date: '2025-11-21 18:51:46',
          modified: '2025-11-21 18:51:46',
          menu_order: 0,
          mime_type: 'image/svg+xml',
          type: 'image',
          subtype: 'svg+xml',
          icon: '/website-assets/media/default.png',
          width: 0,
          height: 0,
          sizes: {
            thumbnail:
              '/website-assets/media/2025/11/UseCase_OperationalDataLakehouse_Reliability-and-Continuity.svg',
            'thumbnail-width': 1,
            'thumbnail-height': 1,
            medium:
              '/website-assets/media/2025/11/UseCase_OperationalDataLakehouse_Reliability-and-Continuity.svg',
            'medium-width': 1,
            'medium-height': 1,
            medium_large:
              '/website-assets/media/2025/11/UseCase_OperationalDataLakehouse_Reliability-and-Continuity.svg',
            'medium_large-width': 1,
            'medium_large-height': 1,
            large:
              '/website-assets/media/2025/11/UseCase_OperationalDataLakehouse_Reliability-and-Continuity.svg',
            'large-width': 1,
            'large-height': 1,
            '1536x1536':
              '/website-assets/media/2025/11/UseCase_OperationalDataLakehouse_Reliability-and-Continuity.svg',
            '1536x1536-width': 1,
            '1536x1536-height': 1,
            '2048x2048':
              '/website-assets/media/2025/11/UseCase_OperationalDataLakehouse_Reliability-and-Continuity.svg',
            '2048x2048-width': 1,
            '2048x2048-height': 1,
          },
        },
        title: 'Reliability and Continuity',
        description:
          'Failover to object storage if local acceleration is unavailable.',
      },
      {
        icon: {
          ID: 1089,
          id: 1089,
          title:
            'UseCase_OperationalDataLakehouse_Governance and Observability',
          filename:
            'UseCase_OperationalDataLakehouse_Governance-and-Observability.svg',
          filesize: 4611,
          url: '/website-assets/media/2025/11/UseCase_OperationalDataLakehouse_Governance-and-Observability.svg',
          link: '/use-case/operational-data-lakehouse/attachment/usecase_operationaldatalakehouse_governance-and-observability/',
          alt: '',
          author: '6',
          description: '',
          caption: '',
          name: 'usecase_operationaldatalakehouse_governance-and-observability',
          status: 'inherit',
          uploaded_to: 1086,
          date: '2025-11-21 18:51:44',
          modified: '2025-11-21 18:51:44',
          menu_order: 0,
          mime_type: 'image/svg+xml',
          type: 'image',
          subtype: 'svg+xml',
          icon: '/website-assets/media/default.png',
          width: 0,
          height: 0,
          sizes: {
            thumbnail:
              '/website-assets/media/2025/11/UseCase_OperationalDataLakehouse_Governance-and-Observability.svg',
            'thumbnail-width': 1,
            'thumbnail-height': 1,
            medium:
              '/website-assets/media/2025/11/UseCase_OperationalDataLakehouse_Governance-and-Observability.svg',
            'medium-width': 1,
            'medium-height': 1,
            medium_large:
              '/website-assets/media/2025/11/UseCase_OperationalDataLakehouse_Governance-and-Observability.svg',
            'medium_large-width': 1,
            'medium_large-height': 1,
            large:
              '/website-assets/media/2025/11/UseCase_OperationalDataLakehouse_Governance-and-Observability.svg',
            'large-width': 1,
            'large-height': 1,
            '1536x1536':
              '/website-assets/media/2025/11/UseCase_OperationalDataLakehouse_Governance-and-Observability.svg',
            '1536x1536-width': 1,
            '1536x1536-height': 1,
            '2048x2048':
              '/website-assets/media/2025/11/UseCase_OperationalDataLakehouse_Governance-and-Observability.svg',
            '2048x2048-width': 1,
            '2048x2048-height': 1,
          },
        },
        title: 'Governance and Observability',
        description:
          'Enterprise access control, metrics, and auditability included.',
      },
      {
        icon: {
          ID: 1050,
          id: 1050,
          title: 'UseCase_ApplicationSearch_Deploy Anywhere',
          filename: 'UseCase_ApplicationSearch_Deploy-Anywhere.svg',
          filesize: 5668,
          url: '/website-assets/media/2025/11/UseCase_ApplicationSearch_Deploy-Anywhere.svg',
          link: '/use-case/application-search/attachment/usecase_applicationsearch_deploy-anywhere/',
          alt: '',
          author: '6',
          description: '',
          caption: '',
          name: 'usecase_applicationsearch_deploy-anywhere',
          status: 'inherit',
          uploaded_to: 1044,
          date: '2025-11-21 16:21:09',
          modified: '2025-11-21 16:21:09',
          menu_order: 0,
          mime_type: 'image/svg+xml',
          type: 'image',
          subtype: 'svg+xml',
          icon: '/website-assets/media/default.png',
          width: 0,
          height: 0,
          sizes: {
            thumbnail:
              '/website-assets/media/2025/11/UseCase_ApplicationSearch_Deploy-Anywhere.svg',
            'thumbnail-width': 1,
            'thumbnail-height': 1,
            medium:
              '/website-assets/media/2025/11/UseCase_ApplicationSearch_Deploy-Anywhere.svg',
            'medium-width': 1,
            'medium-height': 1,
            medium_large:
              '/website-assets/media/2025/11/UseCase_ApplicationSearch_Deploy-Anywhere.svg',
            'medium_large-width': 1,
            'medium_large-height': 1,
            large:
              '/website-assets/media/2025/11/UseCase_ApplicationSearch_Deploy-Anywhere.svg',
            'large-width': 1,
            'large-height': 1,
            '1536x1536':
              '/website-assets/media/2025/11/UseCase_ApplicationSearch_Deploy-Anywhere.svg',
            '1536x1536-width': 1,
            '1536x1536-height': 1,
            '2048x2048':
              '/website-assets/media/2025/11/UseCase_ApplicationSearch_Deploy-Anywhere.svg',
            '2048x2048-width': 1,
            '2048x2048-height': 1,
          },
        },
        title: 'Deployment Flexibility',
        description:
          'Run Spice anywhere: as a sidecar, microservice, cluster, or on the managed Spice Cloud Platform.',
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<Testimonials
  heading="Proven in production"
  headingTag="h2"
  paragraph="Run data-intensive workloads on a high-performance engine trusted by teams building real-time systems at scale."
  items={['twilio', 'barracuda', 'nrc-tim']}
/>

<CarouselLogos
  fields={{
    heading: 'Trusted by global enterprises',
    logos: [
      {
        logo: {
          ID: 443,
          id: 443,
          title: 'Homepage_Logos_Twilio',
          filename: 'Homepage_Logos_Twilio-1.svg',
          filesize: 4020,
          url: '/website-assets/media/2025/11/Homepage_Logos_Twilio-1.svg',
          link: '/home/homepage_logos_twilio-2/',
          alt: 'Twilio logo',
          author: '6',
          description: '',
          caption: '',
          name: 'homepage_logos_twilio-2',
          status: 'inherit',
          uploaded_to: 2,
          date: '2025-11-05 18:46:45',
          modified: '2025-11-05 18:46:45',
          menu_order: 0,
          mime_type: 'image/svg+xml',
          type: 'image',
          subtype: 'svg+xml',
          icon: '/website-assets/media/default.png',
          width: 0,
          height: 0,
          sizes: {
            thumbnail:
              '/website-assets/media/2025/11/Homepage_Logos_Twilio-1.svg',
            'thumbnail-width': 1,
            'thumbnail-height': 1,
            medium: '/website-assets/media/2025/11/Homepage_Logos_Twilio-1.svg',
            'medium-width': 1,
            'medium-height': 1,
            medium_large:
              '/website-assets/media/2025/11/Homepage_Logos_Twilio-1.svg',
            'medium_large-width': 1,
            'medium_large-height': 1,
            large: '/website-assets/media/2025/11/Homepage_Logos_Twilio-1.svg',
            'large-width': 1,
            'large-height': 1,
            '1536x1536':
              '/website-assets/media/2025/11/Homepage_Logos_Twilio-1.svg',
            '1536x1536-width': 1,
            '1536x1536-height': 1,
            '2048x2048':
              '/website-assets/media/2025/11/Homepage_Logos_Twilio-1.svg',
            '2048x2048-width': 1,
            '2048x2048-height': 1,
          },
        },
      },
      {
        logo: {
          ID: 442,
          id: 442,
          title: 'Homepage_Logos_NRC',
          filename: 'Homepage_Logos_NRC-1.svg',
          filesize: 1030,
          url: '/website-assets/media/2025/11/Homepage_Logos_NRC-1.svg',
          link: '/home/homepage_logos_nrc-2/',
          alt: 'NRC Health logo',
          author: '6',
          description: '',
          caption: '',
          name: 'homepage_logos_nrc-2',
          status: 'inherit',
          uploaded_to: 2,
          date: '2025-11-05 18:46:45',
          modified: '2025-11-05 18:46:45',
          menu_order: 0,
          mime_type: 'image/svg+xml',
          type: 'image',
          subtype: 'svg+xml',
          icon: '/website-assets/media/default.png',
          width: 0,
          height: 0,
          sizes: {
            thumbnail: '/website-assets/media/2025/11/Homepage_Logos_NRC-1.svg',
            'thumbnail-width': 1,
            'thumbnail-height': 1,
            medium: '/website-assets/media/2025/11/Homepage_Logos_NRC-1.svg',
            'medium-width': 1,
            'medium-height': 1,
            medium_large:
              '/website-assets/media/2025/11/Homepage_Logos_NRC-1.svg',
            'medium_large-width': 1,
            'medium_large-height': 1,
            large: '/website-assets/media/2025/11/Homepage_Logos_NRC-1.svg',
            'large-width': 1,
            'large-height': 1,
            '1536x1536':
              '/website-assets/media/2025/11/Homepage_Logos_NRC-1.svg',
            '1536x1536-width': 1,
            '1536x1536-height': 1,
            '2048x2048':
              '/website-assets/media/2025/11/Homepage_Logos_NRC-1.svg',
            '2048x2048-width': 1,
            '2048x2048-height': 1,
          },
        },
      },
      {
        logo: {
          ID: 441,
          id: 441,
          title: 'Homepage_Logos_BasisSet',
          filename: 'Homepage_Logos_BasisSet-1.svg',
          filesize: 2629,
          url: '/website-assets/media/2025/11/Homepage_Logos_BasisSet-1.svg',
          link: '/home/homepage_logos_basisset-2/',
          alt: 'Basis Set Ventures logo',
          author: '6',
          description: '',
          caption: '',
          name: 'homepage_logos_basisset-2',
          status: 'inherit',
          uploaded_to: 2,
          date: '2025-11-05 18:46:45',
          modified: '2025-11-05 18:46:45',
          menu_order: 0,
          mime_type: 'image/svg+xml',
          type: 'image',
          subtype: 'svg+xml',
          icon: '/website-assets/media/default.png',
          width: 0,
          height: 0,
          sizes: {
            thumbnail:
              '/website-assets/media/2025/11/Homepage_Logos_BasisSet-1.svg',
            'thumbnail-width': 1,
            'thumbnail-height': 1,
            medium:
              '/website-assets/media/2025/11/Homepage_Logos_BasisSet-1.svg',
            'medium-width': 1,
            'medium-height': 1,
            medium_large:
              '/website-assets/media/2025/11/Homepage_Logos_BasisSet-1.svg',
            'medium_large-width': 1,
            'medium_large-height': 1,
            large:
              '/website-assets/media/2025/11/Homepage_Logos_BasisSet-1.svg',
            'large-width': 1,
            'large-height': 1,
            '1536x1536':
              '/website-assets/media/2025/11/Homepage_Logos_BasisSet-1.svg',
            '1536x1536-width': 1,
            '1536x1536-height': 1,
            '2048x2048':
              '/website-assets/media/2025/11/Homepage_Logos_BasisSet-1.svg',
            '2048x2048-width': 1,
            '2048x2048-height': 1,
          },
        },
      },
      {
        logo: {
          ID: 440,
          id: 440,
          title: 'Homepage_Logos_Barracuda',
          filename: 'Homepage_Logos_Barracuda-1.svg',
          filesize: 7450,
          url: '/website-assets/media/2025/11/Homepage_Logos_Barracuda-1.svg',
          link: '/home/homepage_logos_barracuda-2/',
          alt: 'Barracuda Networks logo',
          author: '6',
          description: '',
          caption: '',
          name: 'homepage_logos_barracuda-2',
          status: 'inherit',
          uploaded_to: 2,
          date: '2025-11-05 18:46:45',
          modified: '2025-11-05 18:46:45',
          menu_order: 0,
          mime_type: 'image/svg+xml',
          type: 'image',
          subtype: 'svg+xml',
          icon: '/website-assets/media/default.png',
          width: 0,
          height: 0,
          sizes: {
            thumbnail:
              '/website-assets/media/2025/11/Homepage_Logos_Barracuda-1.svg',
            'thumbnail-width': 1,
            'thumbnail-height': 1,
            medium:
              '/website-assets/media/2025/11/Homepage_Logos_Barracuda-1.svg',
            'medium-width': 1,
            'medium-height': 1,
            medium_large:
              '/website-assets/media/2025/11/Homepage_Logos_Barracuda-1.svg',
            'medium_large-width': 1,
            'medium_large-height': 1,
            large:
              '/website-assets/media/2025/11/Homepage_Logos_Barracuda-1.svg',
            'large-width': 1,
            'large-height': 1,
            '1536x1536':
              '/website-assets/media/2025/11/Homepage_Logos_Barracuda-1.svg',
            '1536x1536-width': 1,
            '1536x1536-height': 1,
            '2048x2048':
              '/website-assets/media/2025/11/Homepage_Logos_Barracuda-1.svg',
            '2048x2048-width': 1,
            '2048x2048-height': 1,
          },
        },
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<ContentResourceFeatured
  fields={{
    heading: 'Use Spice as an operational data lakehouse',
    heading_tag: 'h2',
    paragraph:
      'Guides and examples to learn more about building an operational data lakehouse with Spice.',
    mode: 'default',
    resources: [
      {
        source: 'picker',
        resource: [
          {
            title:
              'Making Object Storage Operational for Real-Time and AI Workloads',
            slug: '/blog/making-object-storage-operational',
            excerpt:
              'TLDR Introduction Although legacy systems and workflows remain common, many enterprises are re-evaluating their architectures to meet new demands&nbsp; &#8211; driven in part, but not exclusively, by AI &#8211; that require support for more data-intensive and real-time applications. The underlying storage needs for these novel workloads are generally outside the bounds of a traditional operational [&hellip;]',
            image:
              '/website-assets/media/2025/11/68e42f8a5daa71c139c95512_Version-2.png',
            type: 'Blog',
            taxonomy: [],
          },
        ],
        resource_manual: {
          eyebrow: '',
          title: null,
          description: '',
          image: false,
        },
      },
      {
        source: 'manual',
        resource: null,
        resource_manual: {
          eyebrow: 'Recipe',
          title: {
            title: 'Federated SQL Query Cookbook',
            url: 'https://github.com/spiceai/cookbook/blob/trunk/federation/README.md',
            target: '_blank',
          },
          description:
            'Learn how to fetch combined data from S3 Parquet, PostgreSQL, and Dremio in a single query.',
          image: {
            ID: 1659,
            id: 1659,
            title: 'cookbooks jpeg',
            filename: 'cookbooks-jpeg.png',
            filesize: 2171698,
            url: '/website-assets/media/2025/12/cookbooks-jpeg.png',
            link: '/cookbooks-jpeg/',
            alt: '',
            author: '9',
            description: '',
            caption: '',
            name: 'cookbooks-jpeg',
            status: 'inherit',
            uploaded_to: 0,
            date: '2025-12-05 04:13:34',
            modified: '2025-12-05 04:13:34',
            menu_order: 0,
            mime_type: 'image/png',
            type: 'image',
            subtype: 'png',
            icon: '/website-assets/media/default.png',
            width: 1832,
            height: 1036,
            sizes: {
              thumbnail:
                '/website-assets/media/2025/12/cookbooks-jpeg-150x150.png',
              'thumbnail-width': 150,
              'thumbnail-height': 150,
              medium:
                '/website-assets/media/2025/12/cookbooks-jpeg-300x170.png',
              'medium-width': 300,
              'medium-height': 170,
              medium_large:
                '/website-assets/media/2025/12/cookbooks-jpeg-768x434.png',
              'medium_large-width': 768,
              'medium_large-height': 434,
              large:
                '/website-assets/media/2025/12/cookbooks-jpeg-1024x579.png',
              'large-width': 1024,
              'large-height': 579,
              '1536x1536':
                '/website-assets/media/2025/12/cookbooks-jpeg-1536x869.png',
              '1536x1536-width': 1536,
              '1536x1536-height': 869,
              '2048x2048': '/website-assets/media/2025/12/cookbooks-jpeg.png',
              '2048x2048-width': 1832,
              '2048x2048-height': 1036,
            },
          },
        },
      },
      {
        source: 'manual',
        resource: null,
        resource_manual: {
          eyebrow: 'Recipe',
          title: {
            title: 'Data Acceleration with DuckDB',
            url: 'https://github.com/spiceai/cookbook/blob/trunk/duckdb/accelerator/README.md',
            target: '_blank',
          },
          description:
            'This recipe walks through how to accelerate a local copy of the taxi trips dataset stored in S3 using DuckDB as the data accelerator engine.',
          image: {
            ID: 1659,
            id: 1659,
            title: 'cookbooks jpeg',
            filename: 'cookbooks-jpeg.png',
            filesize: 2171698,
            url: '/website-assets/media/2025/12/cookbooks-jpeg.png',
            link: '/cookbooks-jpeg/',
            alt: '',
            author: '9',
            description: '',
            caption: '',
            name: 'cookbooks-jpeg',
            status: 'inherit',
            uploaded_to: 0,
            date: '2025-12-05 04:13:34',
            modified: '2025-12-05 04:13:34',
            menu_order: 0,
            mime_type: 'image/png',
            type: 'image',
            subtype: 'png',
            icon: '/website-assets/media/default.png',
            width: 1832,
            height: 1036,
            sizes: {
              thumbnail:
                '/website-assets/media/2025/12/cookbooks-jpeg-150x150.png',
              'thumbnail-width': 150,
              'thumbnail-height': 150,
              medium:
                '/website-assets/media/2025/12/cookbooks-jpeg-300x170.png',
              'medium-width': 300,
              'medium-height': 170,
              medium_large:
                '/website-assets/media/2025/12/cookbooks-jpeg-768x434.png',
              'medium_large-width': 768,
              'medium_large-height': 434,
              large:
                '/website-assets/media/2025/12/cookbooks-jpeg-1024x579.png',
              'large-width': 1024,
              'large-height': 579,
              '1536x1536':
                '/website-assets/media/2025/12/cookbooks-jpeg-1536x869.png',
              '1536x1536-width': 1536,
              '1536x1536-height': 869,
              '2048x2048': '/website-assets/media/2025/12/cookbooks-jpeg.png',
              '2048x2048-width': 1832,
              '2048x2048-height': 1036,
            },
          },
        },
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<AccordionFaq
  fields={{
    heading: 'FAQs',
    heading_tag: 'h2',
    paragraph:
      'Answers to common questions about running operational workloads on a lakehouse',
    items: [
      {
        title: 'What is an operational data lakehouse?',
        paragraph:
          '<p>An operational data lakehouse serves live applications and AI workloads directly from object storage with low-latency queries, instead of limiting the lakehouse to batch analytics. Spice adds federation, acceleration, and AI inference on top of open table formats, so one runtime answers both operational and analytical queries in real time.</p>\n',
      },
      {
        title: 'How does Spice achieve millisecond queries on object storage?',
        paragraph:
          '<p>Spice materializes and caches hot datasets locally using data accelerators such as Spice Cayenne, DuckDB, or SQLite. This reduces query latency from seconds to milliseconds while maintaining the scale and economics of object storage. The same approach powers <a href="/use-case/datalake-accelerator">data lake acceleration</a> for interactive workloads.</p>\n',
      },
      {
        title: 'Which open table formats does Spice support?',
        paragraph:
          '<p>Spice natively supports Apache Iceberg, Delta Lake, and Parquet. Open table format support provides schema management, ACID transactions, and optimized query planning while keeping data governed in open formats on your own object storage.</p>\n',
      },
      {
        title:
          'Can I combine lakehouse data with databases and APIs in one query?',
        paragraph:
          '<p>Yes. Spice federates queries across databases, APIs, and object storage using standard SQL, so transactional and analytical data combine in a single query with zero ETL. The <a href="/platform/sql-federation-acceleration">SQL federation and acceleration</a> engine plans and executes the query across sources.</p>\n',
      },
      {
        title: 'What happens if local acceleration is unavailable?',
        paragraph:
          '<p>Queries fail over to the underlying object storage source automatically. This keeps applications available and results consistent even when locally accelerated data cannot be served.</p>\n',
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<TalkToAnEngineerCta />

---

## Retrieval-Augmented Generation
URL: https://spice.ai/use-case/retrieval-augmented-generation
Date: 2025-11-21T18:37:26
Description: Build more accurate and trustworthy RAG systems. Spice unifies SQL federation, vector search, and model inference for data-grounded AI responses.

<HeroTextImageFiftyFifty
  fields={{
    variant: 'variant-1',
    eyebrow: 'Retrieval-Augmented Generation',
    heading_tag: 'h1',
    heading: 'Ground AI in enterprise data',
    paragraph:
      'Build RAG pipelines that combine live, structured, and unstructured data with SQL and hybrid search. Retrieve, rank, and feed real-time context directly to your models. ',
    cta: [
      {
        type: 'filled',
        cta: {
          title: 'Get a demo',
          url: 'https://meetings.hubspot.com/vladi-semenov',
          target: '_blank',
        },
      },
      {
        type: 'bordered',
        cta: {
          title: 'View the docs',
          url: 'https://spiceai.org/docs/use-cases/rag/applications',
          target: '_blank',
        },
      },
    ],
    media_type: 'image',
    media_image: {
      ID: 1569,
      id: 1569,
      title: 'use_case_rag_header',
      filename: 'use_case_rag_header.png',
      filesize: 271623,
      url: '/website-assets/media/2025/12/use_case_rag_header.png',
      link: '/use-case/retrieval-augmented-generation/attachment/use_case_rag_header/',
      alt: '',
      author: '6',
      description: '',
      caption: '',
      name: 'use_case_rag_header',
      status: 'inherit',
      uploaded_to: 1094,
      date: '2025-12-02 00:21:48',
      modified: '2025-12-02 00:21:48',
      menu_order: 0,
      mime_type: 'image/png',
      type: 'image',
      subtype: 'png',
      icon: '/website-assets/media/default.png',
      width: 1360,
      height: 652,
      sizes: {
        thumbnail: '/website-assets/media/2025/12/use_case_rag_header.png',
        'thumbnail-width': 150,
        'thumbnail-height': 150,
        medium: '/website-assets/media/2025/12/use_case_rag_header.png',
        'medium-width': 300,
        'medium-height': 166,
        medium_large: '/website-assets/media/2025/12/use_case_rag_header.png',
        'medium_large-width': 768,
        'medium_large-height': 425,
        large: '/website-assets/media/2025/12/use_case_rag_header.png',
        'large-width': 1024,
        'large-height': 566,
        '1536x1536': '/website-assets/media/2025/12/use_case_rag_header.png',
        '1536x1536-width': 1536,
        '1536x1536-height': 652,
        '2048x2048': '/website-assets/media/2025/12/use_case_rag_header.png',
        '2048x2048-width': 2048,
        '2048x2048-height': 652,
      },
    },
    media_video: '',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<ContentStats
  fields={{
    heading: 'Do more with your data',
    heading_tag: 'h2',
    stats: [
      {
        media_type: 'image',
        image: false,
        lottie: false,
        amount: '100',
        suffix: 'x',
        after_text: 'up to 100x faster queries',
      },
      {
        media_type: 'image',
        image: false,
        lottie: false,
        amount: '80',
        suffix: '%',
        after_text: 'up to 80% cost savings on data lakehouse spend',
      },
      {
        media_type: 'image',
        image: false,
        lottie: false,
        amount: '2',
        suffix: 'x',
        after_text: 'Increase in data reliability',
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<ContentImageVideo
  fields={{
    variant: 'variant-2',
    heading: 'RAG breaks down without unified, real-time data',
    heading_tag: 'h2',
    paragraph:
      'Fragmented RAG pipelines force developers to manage multiple search engines, connectors, and model APIs. Models are grounded in incomplete or outdated data, leading to hallucinations, inconsistencies, and production risks.',
    cta: false,
    media_type: 'image',
    media_image: {
      ID: 1048,
      id: 1048,
      title: 'use_case_challenge',
      filename: 'use_case_challenge.png',
      filesize: 4349638,
      url: '/website-assets/media/2025/11/use_case_challenge.png',
      link: '/use-case/application-search/attachment/use_case_challenge/',
      alt: '',
      author: '6',
      description: '',
      caption: '',
      name: 'use_case_challenge',
      status: 'inherit',
      uploaded_to: 1044,
      date: '2025-11-21 16:21:07',
      modified: '2025-11-21 16:21:07',
      menu_order: 0,
      mime_type: 'image/png',
      type: 'image',
      subtype: 'png',
      icon: '/website-assets/media/default.png',
      width: 2720,
      height: 1824,
      sizes: {
        thumbnail: '/website-assets/media/2025/11/use_case_challenge.png',
        'thumbnail-width': 150,
        'thumbnail-height': 150,
        medium: '/website-assets/media/2025/11/use_case_challenge.png',
        'medium-width': 300,
        'medium-height': 201,
        medium_large: '/website-assets/media/2025/11/use_case_challenge.png',
        'medium_large-width': 768,
        'medium_large-height': 515,
        large: '/website-assets/media/2025/11/use_case_challenge.png',
        'large-width': 1024,
        'large-height': 687,
        '1536x1536': '/website-assets/media/2025/11/use_case_challenge.png',
        '1536x1536-width': 1536,
        '1536x1536-height': 1030,
        '2048x2048': '/website-assets/media/2025/11/use_case_challenge.png',
        '2048x2048-width': 2048,
        '2048x2048-height': 1373,
      },
    },
    graphic_overlay: false,
    media_video: '',
    padding_top: 'st-lg',
    padding_bottom: 'sb-lg',
  }}
/>

<CarouselHorizontalCards
  fields={{
    heading: 'Build data-grounded AI faster',
    heading_tag: 'h2',
    paragraph:
      'Deliver accurate, context-rich results by combining SQL federation, hybrid search, and LLM inference in one governed runtime.',
    item: [
      {
        title: 'Federate structured data',
        paragraph:
          'Query operational and analytical data across databases, object stores, and APIs using standard SQL. All in real time with zero ETL.',
        cta: {
          title: 'Learn more about Spice federation',
          url: '/platform/sql-federation-acceleration',
          target: '',
        },
        image: {
          ID: 1625,
          id: 1625,
          title: 'use_case_rag_federate',
          filename: 'use_case_rag_federate.png',
          filesize: 256684,
          url: '/website-assets/media/2025/12/use_case_rag_federate.png',
          link: '/use-case/retrieval-augmented-generation/attachment/use_case_rag_federate/',
          alt: '',
          author: '6',
          description: '',
          caption: '',
          name: 'use_case_rag_federate',
          status: 'inherit',
          uploaded_to: 1077,
          date: '2025-12-03 00:15:03',
          modified: '2025-12-03 00:15:03',
          menu_order: 0,
          mime_type: 'image/png',
          type: 'image',
          subtype: 'png',
          icon: '/website-assets/media/default.png',
          width: 1388,
          height: 940,
          sizes: {
            thumbnail:
              '/website-assets/media/2025/12/use_case_rag_federate.png',
            'thumbnail-width': 150,
            'thumbnail-height': 150,
            medium: '/website-assets/media/2025/12/use_case_rag_federate.png',
            'medium-width': 300,
            'medium-height': 191,
            medium_large:
              '/website-assets/media/2025/12/use_case_rag_federate.png',
            'medium_large-width': 768,
            'medium_large-height': 490,
            large: '/website-assets/media/2025/12/use_case_rag_federate.png',
            'large-width': 1024,
            'large-height': 653,
            '1536x1536':
              '/website-assets/media/2025/12/use_case_rag_federate.png',
            '1536x1536-width': 1388,
            '1536x1536-height': 940,
            '2048x2048':
              '/website-assets/media/2025/12/use_case_rag_federate.png',
            '2048x2048-width': 1388,
            '2048x2048-height': 940,
          },
        },
      },
      {
        title: 'Search and embed unstructured data',
        paragraph:
          'Create embeddings from text, documents, or logs using local or hosted models. Run vector similarity search directly inside Spice to find relevant context, semantic matches, and related insights instantly.',
        cta: {
          title: 'Explore hybrid SQL search',
          url: '/platform/hybrid-sql-search',
          target: '',
        },
        image: {
          ID: 1626,
          id: 1626,
          title: 'use_case_rag_unstructured',
          filename: 'use_case_rag_unstructured.png',
          filesize: 284689,
          url: '/website-assets/media/2025/12/use_case_rag_unstructured.png',
          link: '/use-case/retrieval-augmented-generation/attachment/use_case_rag_unstructured/',
          alt: '',
          author: '6',
          description: '',
          caption: '',
          name: 'use_case_rag_unstructured',
          status: 'inherit',
          uploaded_to: 1077,
          date: '2025-12-03 00:15:05',
          modified: '2025-12-03 00:15:05',
          menu_order: 0,
          mime_type: 'image/png',
          type: 'image',
          subtype: 'png',
          icon: '/website-assets/media/default.png',
          width: 1388,
          height: 940,
          sizes: {
            thumbnail:
              '/website-assets/media/2025/12/use_case_rag_unstructured.png',
            'thumbnail-width': 150,
            'thumbnail-height': 150,
            medium:
              '/website-assets/media/2025/12/use_case_rag_unstructured.png',
            'medium-width': 300,
            'medium-height': 191,
            medium_large:
              '/website-assets/media/2025/12/use_case_rag_unstructured.png',
            'medium_large-width': 768,
            'medium_large-height': 490,
            large:
              '/website-assets/media/2025/12/use_case_rag_unstructured.png',
            'large-width': 1024,
            'large-height': 653,
            '1536x1536':
              '/website-assets/media/2025/12/use_case_rag_unstructured.png',
            '1536x1536-width': 1388,
            '1536x1536-height': 940,
            '2048x2048':
              '/website-assets/media/2025/12/use_case_rag_unstructured.png',
            '2048x2048-width': 1388,
            '2048x2048-height': 940,
          },
        },
      },
      {
        title: 'Retrieve and augment intelligently ',
        paragraph:
          'Blend structured SQL results and semantic search results in one query using hybrid search. Deliver precise, context-rich data to your LLMs without manual data engineering or pipeline maintenance.',
        cta: {
          title: 'Learn about real-time hybrid search using RRF',
          url: '/blog/real-time-hybrid-search-using-rrf',
          target: '',
        },
        image: {
          ID: 1627,
          id: 1627,
          title: 'use_case_rag_intelligence',
          filename: 'use_case_rag_intelligence.png',
          filesize: 271700,
          url: '/website-assets/media/2025/12/use_case_rag_intelligence.png',
          link: '/use-case/retrieval-augmented-generation/attachment/use_case_rag_intelligence/',
          alt: '',
          author: '6',
          description: '',
          caption: '',
          name: 'use_case_rag_intelligence',
          status: 'inherit',
          uploaded_to: 1077,
          date: '2025-12-03 00:15:08',
          modified: '2025-12-03 00:15:08',
          menu_order: 0,
          mime_type: 'image/png',
          type: 'image',
          subtype: 'png',
          icon: '/website-assets/media/default.png',
          width: 1388,
          height: 940,
          sizes: {
            thumbnail:
              '/website-assets/media/2025/12/use_case_rag_intelligence.png',
            'thumbnail-width': 150,
            'thumbnail-height': 150,
            medium:
              '/website-assets/media/2025/12/use_case_rag_intelligence.png',
            'medium-width': 300,
            'medium-height': 191,
            medium_large:
              '/website-assets/media/2025/12/use_case_rag_intelligence.png',
            'medium_large-width': 768,
            'medium_large-height': 490,
            large:
              '/website-assets/media/2025/12/use_case_rag_intelligence.png',
            'large-width': 1024,
            'large-height': 653,
            '1536x1536':
              '/website-assets/media/2025/12/use_case_rag_intelligence.png',
            '1536x1536-width': 1388,
            '1536x1536-height': 940,
            '2048x2048':
              '/website-assets/media/2025/12/use_case_rag_intelligence.png',
            '2048x2048-width': 1388,
            '2048x2048-height': 940,
          },
        },
      },
      {
        title: 'Generate insights with the AI Gateway',
        paragraph:
          'Invoke and run models like OpenAI, Anthropic, or local LLMs directly in SQL queries. Feed retrieved context into the model and generate accurate, compliant, and contextual results within the same SQL workflow.',
        cta: {
          title: 'Explore LLM inference and AI model serving',
          url: '/platform/llm-inference',
          target: '',
        },
        image: {
          ID: 1628,
          id: 1628,
          title: 'use_case_rag_ai_gateway',
          filename: 'use_case_rag_ai_gateway.png',
          filesize: 287058,
          url: '/website-assets/media/2025/12/use_case_rag_ai_gateway.png',
          link: '/use-case/retrieval-augmented-generation/attachment/use_case_rag_ai_gateway/',
          alt: '',
          author: '6',
          description: '',
          caption: '',
          name: 'use_case_rag_ai_gateway',
          status: 'inherit',
          uploaded_to: 1077,
          date: '2025-12-03 00:15:10',
          modified: '2025-12-03 00:15:10',
          menu_order: 0,
          mime_type: 'image/png',
          type: 'image',
          subtype: 'png',
          icon: '/website-assets/media/default.png',
          width: 1388,
          height: 940,
          sizes: {
            thumbnail:
              '/website-assets/media/2025/12/use_case_rag_ai_gateway.png',
            'thumbnail-width': 150,
            'thumbnail-height': 150,
            medium: '/website-assets/media/2025/12/use_case_rag_ai_gateway.png',
            'medium-width': 300,
            'medium-height': 191,
            medium_large:
              '/website-assets/media/2025/12/use_case_rag_ai_gateway.png',
            'medium_large-width': 768,
            'medium_large-height': 490,
            large: '/website-assets/media/2025/12/use_case_rag_ai_gateway.png',
            'large-width': 1024,
            'large-height': 653,
            '1536x1536':
              '/website-assets/media/2025/12/use_case_rag_ai_gateway.png',
            '1536x1536-width': 1388,
            '1536x1536-height': 940,
            '2048x2048':
              '/website-assets/media/2025/12/use_case_rag_ai_gateway.png',
            '2048x2048-width': 1388,
            '2048x2048-height': 940,
          },
        },
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<ContentThreeAcrossIconText
  fields={{
    heading: 'Why choose Spice for RAG',
    heading_tag: 'h2',
    paragraph:
      'Spice unifies data retrieval, semantic search, and AI generation in a single, high-performance runtime-no pipelines, no orchestration, no drift.',
    items: [
      {
        icon: {
          ID: 1083,
          id: 1083,
          title: 'UseCase_RAG_Real-Time Federation',
          filename: 'UseCase_RAG_Real-Time-Federation.svg',
          filesize: 3051,
          url: '/website-assets/media/2025/11/UseCase_RAG_Real-Time-Federation.svg',
          link: '/use-case/retrieval-augmented-generation/attachment/usecase_rag_real-time-federation/',
          alt: '',
          author: '6',
          description: '',
          caption: '',
          name: 'usecase_rag_real-time-federation',
          status: 'inherit',
          uploaded_to: 1077,
          date: '2025-11-21 18:33:24',
          modified: '2025-11-21 18:33:24',
          menu_order: 0,
          mime_type: 'image/svg+xml',
          type: 'image',
          subtype: 'svg+xml',
          icon: '/website-assets/media/default.png',
          width: 0,
          height: 0,
          sizes: {
            thumbnail:
              '/website-assets/media/2025/11/UseCase_RAG_Real-Time-Federation.svg',
            'thumbnail-width': 1,
            'thumbnail-height': 1,
            medium:
              '/website-assets/media/2025/11/UseCase_RAG_Real-Time-Federation.svg',
            'medium-width': 1,
            'medium-height': 1,
            medium_large:
              '/website-assets/media/2025/11/UseCase_RAG_Real-Time-Federation.svg',
            'medium_large-width': 1,
            'medium_large-height': 1,
            large:
              '/website-assets/media/2025/11/UseCase_RAG_Real-Time-Federation.svg',
            'large-width': 1,
            'large-height': 1,
            '1536x1536':
              '/website-assets/media/2025/11/UseCase_RAG_Real-Time-Federation.svg',
            '1536x1536-width': 1,
            '1536x1536-height': 1,
            '2048x2048':
              '/website-assets/media/2025/11/UseCase_RAG_Real-Time-Federation.svg',
            '2048x2048-width': 1,
            '2048x2048-height': 1,
          },
        },
        title: 'Real-Time Federation',
        description:
          'Query all your sources with federated SQL. No data movement or batch syncs.',
      },
      {
        icon: {
          ID: 1079,
          id: 1079,
          title: 'UseCase_RAG_Built-in Vector Search',
          filename: 'UseCase_RAG_Built-in-Vector-Search.svg',
          filesize: 3093,
          url: '/website-assets/media/2025/11/UseCase_RAG_Built-in-Vector-Search.svg',
          link: '/use-case/retrieval-augmented-generation/attachment/usecase_rag_built-in-vector-search/',
          alt: '',
          author: '6',
          description: '',
          caption: '',
          name: 'usecase_rag_built-in-vector-search',
          status: 'inherit',
          uploaded_to: 1077,
          date: '2025-11-21 18:33:20',
          modified: '2025-11-21 18:33:20',
          menu_order: 0,
          mime_type: 'image/svg+xml',
          type: 'image',
          subtype: 'svg+xml',
          icon: '/website-assets/media/default.png',
          width: 0,
          height: 0,
          sizes: {
            thumbnail:
              '/website-assets/media/2025/11/UseCase_RAG_Built-in-Vector-Search.svg',
            'thumbnail-width': 1,
            'thumbnail-height': 1,
            medium:
              '/website-assets/media/2025/11/UseCase_RAG_Built-in-Vector-Search.svg',
            'medium-width': 1,
            'medium-height': 1,
            medium_large:
              '/website-assets/media/2025/11/UseCase_RAG_Built-in-Vector-Search.svg',
            'medium_large-width': 1,
            'medium_large-height': 1,
            large:
              '/website-assets/media/2025/11/UseCase_RAG_Built-in-Vector-Search.svg',
            'large-width': 1,
            'large-height': 1,
            '1536x1536':
              '/website-assets/media/2025/11/UseCase_RAG_Built-in-Vector-Search.svg',
            '1536x1536-width': 1,
            '1536x1536-height': 1,
            '2048x2048':
              '/website-assets/media/2025/11/UseCase_RAG_Built-in-Vector-Search.svg',
            '2048x2048-width': 1,
            '2048x2048-height': 1,
          },
        },
        title: 'Built-in Vector Search',
        description:
          'Embed and retrieve semantic context alongside SQL filters and full-text search.',
      },
      {
        icon: {
          ID: 1084,
          id: 1084,
          title: 'UseCase_RAG_SQL LLM Inference',
          filename: 'UseCase_RAG_SQL-LLM-Inference.svg',
          filesize: 14633,
          url: '/website-assets/media/2025/11/UseCase_RAG_SQL-LLM-Inference.svg',
          link: '/use-case/retrieval-augmented-generation/attachment/usecase_rag_sql-llm-inference/',
          alt: '',
          author: '6',
          description: '',
          caption: '',
          name: 'usecase_rag_sql-llm-inference',
          status: 'inherit',
          uploaded_to: 1077,
          date: '2025-11-21 18:33:24',
          modified: '2025-11-21 18:33:24',
          menu_order: 0,
          mime_type: 'image/svg+xml',
          type: 'image',
          subtype: 'svg+xml',
          icon: '/website-assets/media/default.png',
          width: 0,
          height: 0,
          sizes: {
            thumbnail:
              '/website-assets/media/2025/11/UseCase_RAG_SQL-LLM-Inference.svg',
            'thumbnail-width': 1,
            'thumbnail-height': 1,
            medium:
              '/website-assets/media/2025/11/UseCase_RAG_SQL-LLM-Inference.svg',
            'medium-width': 1,
            'medium-height': 1,
            medium_large:
              '/website-assets/media/2025/11/UseCase_RAG_SQL-LLM-Inference.svg',
            'medium_large-width': 1,
            'medium_large-height': 1,
            large:
              '/website-assets/media/2025/11/UseCase_RAG_SQL-LLM-Inference.svg',
            'large-width': 1,
            'large-height': 1,
            '1536x1536':
              '/website-assets/media/2025/11/UseCase_RAG_SQL-LLM-Inference.svg',
            '1536x1536-width': 1,
            '1536x1536-height': 1,
            '2048x2048':
              '/website-assets/media/2025/11/UseCase_RAG_SQL-LLM-Inference.svg',
            '2048x2048-width': 1,
            '2048x2048-height': 1,
          },
        },
        title: 'SQL LLM Inference',
        description:
          'Call, prompt, and evaluate models in SQL via the AI() SQL function',
      },
      {
        icon: {
          ID: 1082,
          id: 1082,
          title: 'UseCase_RAG_Hybrid Ranking',
          filename: 'UseCase_RAG_Hybrid-Ranking.svg',
          filesize: 10143,
          url: '/website-assets/media/2025/11/UseCase_RAG_Hybrid-Ranking.svg',
          link: '/use-case/retrieval-augmented-generation/attachment/usecase_rag_hybrid-ranking/',
          alt: '',
          author: '6',
          description: '',
          caption: '',
          name: 'usecase_rag_hybrid-ranking',
          status: 'inherit',
          uploaded_to: 1077,
          date: '2025-11-21 18:33:23',
          modified: '2025-11-21 18:33:23',
          menu_order: 0,
          mime_type: 'image/svg+xml',
          type: 'image',
          subtype: 'svg+xml',
          icon: '/website-assets/media/default.png',
          width: 0,
          height: 0,
          sizes: {
            thumbnail:
              '/website-assets/media/2025/11/UseCase_RAG_Hybrid-Ranking.svg',
            'thumbnail-width': 1,
            'thumbnail-height': 1,
            medium:
              '/website-assets/media/2025/11/UseCase_RAG_Hybrid-Ranking.svg',
            'medium-width': 1,
            'medium-height': 1,
            medium_large:
              '/website-assets/media/2025/11/UseCase_RAG_Hybrid-Ranking.svg',
            'medium_large-width': 1,
            'medium_large-height': 1,
            large:
              '/website-assets/media/2025/11/UseCase_RAG_Hybrid-Ranking.svg',
            'large-width': 1,
            'large-height': 1,
            '1536x1536':
              '/website-assets/media/2025/11/UseCase_RAG_Hybrid-Ranking.svg',
            '1536x1536-width': 1,
            '1536x1536-height': 1,
            '2048x2048':
              '/website-assets/media/2025/11/UseCase_RAG_Hybrid-Ranking.svg',
            '2048x2048-width': 1,
            '2048x2048-height': 1,
          },
        },
        title: 'Hybrid Ranking',
        description:
          'Blend multiple result sets with Reciprocal Rank Fusion for per-query weighting and tunable relevance.',
      },
      {
        icon: {
          ID: 1081,
          id: 1081,
          title: 'UseCase_RAG_Governed & Secure',
          filename: 'UseCase_RAG_Governed-Secure.svg',
          filesize: 59336,
          url: '/website-assets/media/2025/11/UseCase_RAG_Governed-Secure.svg',
          link: '/use-case/retrieval-augmented-generation/attachment/usecase_rag_governed-secure/',
          alt: '',
          author: '6',
          description: '',
          caption: '',
          name: 'usecase_rag_governed-secure',
          status: 'inherit',
          uploaded_to: 1077,
          date: '2025-11-21 18:33:22',
          modified: '2025-11-21 18:33:22',
          menu_order: 0,
          mime_type: 'image/svg+xml',
          type: 'image',
          subtype: 'svg+xml',
          icon: '/website-assets/media/default.png',
          width: 0,
          height: 0,
          sizes: {
            thumbnail:
              '/website-assets/media/2025/11/UseCase_RAG_Governed-Secure.svg',
            'thumbnail-width': 1,
            'thumbnail-height': 1,
            medium:
              '/website-assets/media/2025/11/UseCase_RAG_Governed-Secure.svg',
            'medium-width': 1,
            'medium-height': 1,
            medium_large:
              '/website-assets/media/2025/11/UseCase_RAG_Governed-Secure.svg',
            'medium_large-width': 1,
            'medium_large-height': 1,
            large:
              '/website-assets/media/2025/11/UseCase_RAG_Governed-Secure.svg',
            'large-width': 1,
            'large-height': 1,
            '1536x1536':
              '/website-assets/media/2025/11/UseCase_RAG_Governed-Secure.svg',
            '1536x1536-width': 1,
            '1536x1536-height': 1,
            '2048x2048':
              '/website-assets/media/2025/11/UseCase_RAG_Governed-Secure.svg',
            '2048x2048-width': 1,
            '2048x2048-height': 1,
          },
        },
        title: 'Governed & Secure',
        description:
          'Enterprise-grade access control ensures compliance and auditability.',
      },
      {
        icon: {
          ID: 1080,
          id: 1080,
          title: 'UseCase_RAG_Developer-First Design',
          filename: 'UseCase_RAG_Developer-First-Design.svg',
          filesize: 4996,
          url: '/website-assets/media/2025/11/UseCase_RAG_Developer-First-Design.svg',
          link: '/use-case/retrieval-augmented-generation/attachment/usecase_rag_developer-first-design/',
          alt: '',
          author: '6',
          description: '',
          caption: '',
          name: 'usecase_rag_developer-first-design',
          status: 'inherit',
          uploaded_to: 1077,
          date: '2025-11-21 18:33:21',
          modified: '2025-11-21 18:33:21',
          menu_order: 0,
          mime_type: 'image/svg+xml',
          type: 'image',
          subtype: 'svg+xml',
          icon: '/website-assets/media/default.png',
          width: 0,
          height: 0,
          sizes: {
            thumbnail:
              '/website-assets/media/2025/11/UseCase_RAG_Developer-First-Design.svg',
            'thumbnail-width': 1,
            'thumbnail-height': 1,
            medium:
              '/website-assets/media/2025/11/UseCase_RAG_Developer-First-Design.svg',
            'medium-width': 1,
            'medium-height': 1,
            medium_large:
              '/website-assets/media/2025/11/UseCase_RAG_Developer-First-Design.svg',
            'medium_large-width': 1,
            'medium_large-height': 1,
            large:
              '/website-assets/media/2025/11/UseCase_RAG_Developer-First-Design.svg',
            'large-width': 1,
            'large-height': 1,
            '1536x1536':
              '/website-assets/media/2025/11/UseCase_RAG_Developer-First-Design.svg',
            '1536x1536-width': 1,
            '1536x1536-height': 1,
            '2048x2048':
              '/website-assets/media/2025/11/UseCase_RAG_Developer-First-Design.svg',
            '2048x2048-width': 1,
            '2048x2048-height': 1,
          },
        },
        title: 'Deployment Flexibility',
        description:
          'Run Spice anywhere: as a sidecar, microservice, cluster, or on the managed Spice Cloud Platform.',
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<Testimonials
  heading="Trusted by teams building intelligent applications"
  headingTag="h2"
  paragraph="Run data-intensive workloads on a high-performance engine trusted by teams building real-time systems at scale."
  items={['nrc-tim', 'basisset']}
/>

<CarouselLogos
  fields={{
    heading: 'Trusted by global enterprises',
    logos: [
      {
        logo: {
          ID: 443,
          id: 443,
          title: 'Homepage_Logos_Twilio',
          filename: 'Homepage_Logos_Twilio-1.svg',
          filesize: 4020,
          url: '/website-assets/media/2025/11/Homepage_Logos_Twilio-1.svg',
          link: '/home/homepage_logos_twilio-2/',
          alt: 'Twilio logo',
          author: '6',
          description: '',
          caption: '',
          name: 'homepage_logos_twilio-2',
          status: 'inherit',
          uploaded_to: 2,
          date: '2025-11-05 18:46:45',
          modified: '2025-11-05 18:46:45',
          menu_order: 0,
          mime_type: 'image/svg+xml',
          type: 'image',
          subtype: 'svg+xml',
          icon: '/website-assets/media/default.png',
          width: 0,
          height: 0,
          sizes: {
            thumbnail:
              '/website-assets/media/2025/11/Homepage_Logos_Twilio-1.svg',
            'thumbnail-width': 1,
            'thumbnail-height': 1,
            medium: '/website-assets/media/2025/11/Homepage_Logos_Twilio-1.svg',
            'medium-width': 1,
            'medium-height': 1,
            medium_large:
              '/website-assets/media/2025/11/Homepage_Logos_Twilio-1.svg',
            'medium_large-width': 1,
            'medium_large-height': 1,
            large: '/website-assets/media/2025/11/Homepage_Logos_Twilio-1.svg',
            'large-width': 1,
            'large-height': 1,
            '1536x1536':
              '/website-assets/media/2025/11/Homepage_Logos_Twilio-1.svg',
            '1536x1536-width': 1,
            '1536x1536-height': 1,
            '2048x2048':
              '/website-assets/media/2025/11/Homepage_Logos_Twilio-1.svg',
            '2048x2048-width': 1,
            '2048x2048-height': 1,
          },
        },
      },
      {
        logo: {
          ID: 442,
          id: 442,
          title: 'Homepage_Logos_NRC',
          filename: 'Homepage_Logos_NRC-1.svg',
          filesize: 1030,
          url: '/website-assets/media/2025/11/Homepage_Logos_NRC-1.svg',
          link: '/home/homepage_logos_nrc-2/',
          alt: 'NRC Health logo',
          author: '6',
          description: '',
          caption: '',
          name: 'homepage_logos_nrc-2',
          status: 'inherit',
          uploaded_to: 2,
          date: '2025-11-05 18:46:45',
          modified: '2025-11-05 18:46:45',
          menu_order: 0,
          mime_type: 'image/svg+xml',
          type: 'image',
          subtype: 'svg+xml',
          icon: '/website-assets/media/default.png',
          width: 0,
          height: 0,
          sizes: {
            thumbnail: '/website-assets/media/2025/11/Homepage_Logos_NRC-1.svg',
            'thumbnail-width': 1,
            'thumbnail-height': 1,
            medium: '/website-assets/media/2025/11/Homepage_Logos_NRC-1.svg',
            'medium-width': 1,
            'medium-height': 1,
            medium_large:
              '/website-assets/media/2025/11/Homepage_Logos_NRC-1.svg',
            'medium_large-width': 1,
            'medium_large-height': 1,
            large: '/website-assets/media/2025/11/Homepage_Logos_NRC-1.svg',
            'large-width': 1,
            'large-height': 1,
            '1536x1536':
              '/website-assets/media/2025/11/Homepage_Logos_NRC-1.svg',
            '1536x1536-width': 1,
            '1536x1536-height': 1,
            '2048x2048':
              '/website-assets/media/2025/11/Homepage_Logos_NRC-1.svg',
            '2048x2048-width': 1,
            '2048x2048-height': 1,
          },
        },
      },
      {
        logo: {
          ID: 441,
          id: 441,
          title: 'Homepage_Logos_BasisSet',
          filename: 'Homepage_Logos_BasisSet-1.svg',
          filesize: 2629,
          url: '/website-assets/media/2025/11/Homepage_Logos_BasisSet-1.svg',
          link: '/home/homepage_logos_basisset-2/',
          alt: 'Basis Set Ventures logo',
          author: '6',
          description: '',
          caption: '',
          name: 'homepage_logos_basisset-2',
          status: 'inherit',
          uploaded_to: 2,
          date: '2025-11-05 18:46:45',
          modified: '2025-11-05 18:46:45',
          menu_order: 0,
          mime_type: 'image/svg+xml',
          type: 'image',
          subtype: 'svg+xml',
          icon: '/website-assets/media/default.png',
          width: 0,
          height: 0,
          sizes: {
            thumbnail:
              '/website-assets/media/2025/11/Homepage_Logos_BasisSet-1.svg',
            'thumbnail-width': 1,
            'thumbnail-height': 1,
            medium:
              '/website-assets/media/2025/11/Homepage_Logos_BasisSet-1.svg',
            'medium-width': 1,
            'medium-height': 1,
            medium_large:
              '/website-assets/media/2025/11/Homepage_Logos_BasisSet-1.svg',
            'medium_large-width': 1,
            'medium_large-height': 1,
            large:
              '/website-assets/media/2025/11/Homepage_Logos_BasisSet-1.svg',
            'large-width': 1,
            'large-height': 1,
            '1536x1536':
              '/website-assets/media/2025/11/Homepage_Logos_BasisSet-1.svg',
            '1536x1536-width': 1,
            '1536x1536-height': 1,
            '2048x2048':
              '/website-assets/media/2025/11/Homepage_Logos_BasisSet-1.svg',
            '2048x2048-width': 1,
            '2048x2048-height': 1,
          },
        },
      },
      {
        logo: {
          ID: 440,
          id: 440,
          title: 'Homepage_Logos_Barracuda',
          filename: 'Homepage_Logos_Barracuda-1.svg',
          filesize: 7450,
          url: '/website-assets/media/2025/11/Homepage_Logos_Barracuda-1.svg',
          link: '/home/homepage_logos_barracuda-2/',
          alt: 'Barracuda Networks logo',
          author: '6',
          description: '',
          caption: '',
          name: 'homepage_logos_barracuda-2',
          status: 'inherit',
          uploaded_to: 2,
          date: '2025-11-05 18:46:45',
          modified: '2025-11-05 18:46:45',
          menu_order: 0,
          mime_type: 'image/svg+xml',
          type: 'image',
          subtype: 'svg+xml',
          icon: '/website-assets/media/default.png',
          width: 0,
          height: 0,
          sizes: {
            thumbnail:
              '/website-assets/media/2025/11/Homepage_Logos_Barracuda-1.svg',
            'thumbnail-width': 1,
            'thumbnail-height': 1,
            medium:
              '/website-assets/media/2025/11/Homepage_Logos_Barracuda-1.svg',
            'medium-width': 1,
            'medium-height': 1,
            medium_large:
              '/website-assets/media/2025/11/Homepage_Logos_Barracuda-1.svg',
            'medium_large-width': 1,
            'medium_large-height': 1,
            large:
              '/website-assets/media/2025/11/Homepage_Logos_Barracuda-1.svg',
            'large-width': 1,
            'large-height': 1,
            '1536x1536':
              '/website-assets/media/2025/11/Homepage_Logos_Barracuda-1.svg',
            '1536x1536-width': 1,
            '1536x1536-height': 1,
            '2048x2048':
              '/website-assets/media/2025/11/Homepage_Logos_Barracuda-1.svg',
            '2048x2048-width': 1,
            '2048x2048-height': 1,
          },
        },
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<ContentResourceFeatured
  fields={{
    heading: 'Build a scalable RAG app',
    heading_tag: 'h2',
    paragraph:
      'Guides and examples to learn more about building RAG applications with Spice.',
    mode: 'default',
    resources: [
      {
        source: 'manual',
        resource: null,
        resource_manual: {
          eyebrow: 'Docs',
          title: {
            title: 'Hybrid Search Docs',
            url: 'https://spiceai.org/docs/features/search',
            target: '',
          },
          description:
            'Spice provides robust search capabilities enabling developers to query datasets beyond traditional SQL, including semantic (vector-based) search, full-text keyword search, and hybrid search methods.',
          image: {
            ID: 1661,
            id: 1661,
            title: 'Docs jpeg',
            filename: 'Docs-jpeg.jpeg',
            filesize: 103192,
            url: '/website-assets/media/2025/12/Docs-jpeg.jpeg',
            link: '/docs-jpeg/',
            alt: '',
            author: '9',
            description: '',
            caption: '',
            name: 'docs-jpeg',
            status: 'inherit',
            uploaded_to: 0,
            date: '2025-12-05 04:13:53',
            modified: '2025-12-05 04:13:53',
            menu_order: 0,
            mime_type: 'image/jpeg',
            type: 'image',
            subtype: 'jpeg',
            icon: '/website-assets/media/default.png',
            width: 1832,
            height: 1036,
            sizes: {
              thumbnail: '/website-assets/media/2025/12/Docs-jpeg-150x150.jpeg',
              'thumbnail-width': 150,
              'thumbnail-height': 150,
              medium: '/website-assets/media/2025/12/Docs-jpeg-300x170.jpeg',
              'medium-width': 300,
              'medium-height': 170,
              medium_large:
                '/website-assets/media/2025/12/Docs-jpeg-768x434.jpeg',
              'medium_large-width': 768,
              'medium_large-height': 434,
              large: '/website-assets/media/2025/12/Docs-jpeg-1024x579.jpeg',
              'large-width': 1024,
              'large-height': 579,
              '1536x1536':
                '/website-assets/media/2025/12/Docs-jpeg-1536x869.jpeg',
              '1536x1536-width': 1536,
              '1536x1536-height': 869,
              '2048x2048': '/website-assets/media/2025/12/Docs-jpeg.jpeg',
              '2048x2048-width': 1832,
              '2048x2048-height': 1036,
            },
          },
        },
      },
      {
        source: 'picker',
        resource: [
          {
            title:
              'True Hybrid Search: Vector, Full-Text, and SQL in One Runtime',
            slug: '/blog/true-hybrid-search',
            excerpt:
              "TL;DR&nbsp; Show Me the (Data)! It&#8217;s well established (and maybe even trite) to say that enterprises are going all-in on artificial intelligence, with more than $40 billion directed toward generative AI projects in recent years. The initial results have been underwhelming. A&nbsp;recent study&nbsp;from the Massachusetts Institute of Technology's&nbsp;NANDA&nbsp;initiative concluded that despite the enormous allocation of [&hellip;]",
            image: '/website-assets/media/2025/09/image-33.png',
            type: 'Blog',
            taxonomy: [],
          },
        ],
        resource_manual: {
          eyebrow: '',
          title: null,
          description: '',
          image: false,
        },
      },
      {
        source: 'picker',
        resource: [
          {
            title:
              'Real-Time Hybrid Search Using RRF: A Hands-On Guide with Spice',
            slug: '/blog/real-time-hybrid-search-using-rrf',
            excerpt:
              'Surfacing relevant answers to searches across datasets has historically meant navigating significant tradeoffs.&nbsp;Keyword (or lexical) search&nbsp;is fast, cheap, and commoditized, but limited by the constraints of exact matching.&nbsp;Vector (or semantic) search&nbsp;captures nuance and intent, but can be slower, harder to debug, and expensive to run at scale. Combining both usually entails standing up multiple engines [&hellip;]',
            image:
              '/website-assets/media/2025/11/68fa4fdfded26b3b6472a172_image-8.png',
            type: 'Blog',
            taxonomy: ['Search', 'Spice AI'],
          },
        ],
        resource_manual: {
          eyebrow: '',
          title: null,
          description: '',
          image: false,
        },
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<AccordionFaq
  fields={{
    heading: 'FAQs',
    heading_tag: 'h2',
    paragraph:
      'Answers to common questions about building RAG pipelines with Spice',
    items: [
      {
        title: 'How does retrieval-augmented generation reduce hallucinations?',
        paragraph:
          '<p>RAG reduces hallucinations by grounding model responses in data retrieved at query time instead of relying only on training data. Models grounded in incomplete or outdated data are more likely to hallucinate, so retrieval quality and freshness matter as much as the model itself. Spice retrieves live, governed data with SQL and hybrid search so the context passed to the model stays accurate.</p>\n',
      },
      {
        title: 'Do I need a separate vector database for RAG with Spice?',
        paragraph:
          '<p>No. Spice creates embeddings using local or hosted models and runs vector similarity search directly inside the runtime. You can blend semantic results with SQL filters and full-text search using <a href="/platform/hybrid-sql-search">hybrid vector and full-text search</a>, so no separate vector database or synchronization pipeline is needed.</p>\n',
      },
      {
        title: 'Can RAG pipelines use structured data as context?',
        paragraph:
          '<p>Yes. Spice federates queries across databases, object stores, and APIs with standard SQL, so structured records can be retrieved and combined with semantic search results in one query. This grounds model responses in operational data without manual data engineering.</p>\n',
      },
      {
        title: 'Which models can I use for generation?',
        paragraph:
          '<p>Spice invokes models from providers like OpenAI and Anthropic, or local LLMs, through its AI Gateway. Models are called directly in SQL, so retrieved context feeds into generation within the same query workflow. See <a href="/platform/llm-inference">LLM inference and AI model serving</a> for how model serving works in Spice.</p>\n',
      },
      {
        title: 'How is retrieved context ranked before generation?',
        paragraph:
          '<p>Spice blends multiple result sets with Reciprocal Rank Fusion (RRF), with per-query weighting and tunable relevance. This ranks the most relevant structured and semantic matches highest, so the model receives precise, context-rich input.</p>\n',
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<TalkToAnEngineerCta />

---

## Secure AI Agents
URL: https://spice.ai/use-case/secure-ai-agents
Date: 2025-11-21T19:01:05
Description: Build and deploy AI agents that are secure by design. Federate-governed context, enforce policy inline, and route to any model with full auditability.

<HeroTextImageFiftyFifty
  fields={{
    variant: 'variant-1',
    eyebrow: 'Secure AI Agents',
    heading_tag: 'h1',
    heading: 'Build secure, governed AI agents',
    paragraph:
      'Provision short-lived, least-privilege sandboxes for every agent. Federate the right context and enforce policy at query time.',
    cta: [
      {
        type: 'filled',
        cta: {
          title: 'Get a demo',
          url: 'https://meetings.hubspot.com/vladi-semenov',
          target: '_blank',
        },
      },
      {
        type: 'bordered',
        cta: {
          title: 'View the docs',
          url: 'https://spiceai.org/docs/use-cases/ai',
          target: '_blank',
        },
      },
    ],
    media_type: 'image',
    media_image: {
      ID: 1567,
      id: 1567,
      title: 'use_case_secure_ai_agents_header',
      filename: 'use_case_secure_ai_agents_header.png',
      filesize: 327248,
      url: '/website-assets/media/2025/12/use_case_secure_ai_agents_header.png',
      link: '/use-case/secure-ai-agents/attachment/use_case_secure_ai_agents_header/',
      alt: '',
      author: '6',
      description: '',
      caption: '',
      name: 'use_case_secure_ai_agents_header',
      status: 'inherit',
      uploaded_to: 1094,
      date: '2025-12-02 00:21:40',
      modified: '2025-12-02 00:21:40',
      menu_order: 0,
      mime_type: 'image/png',
      type: 'image',
      subtype: 'png',
      icon: '/website-assets/media/default.png',
      width: 1360,
      height: 676,
      sizes: {
        thumbnail:
          '/website-assets/media/2025/12/use_case_secure_ai_agents_header.png',
        'thumbnail-width': 150,
        'thumbnail-height': 150,
        medium:
          '/website-assets/media/2025/12/use_case_secure_ai_agents_header.png',
        'medium-width': 300,
        'medium-height': 166,
        medium_large:
          '/website-assets/media/2025/12/use_case_secure_ai_agents_header.png',
        'medium_large-width': 768,
        'medium_large-height': 425,
        large:
          '/website-assets/media/2025/12/use_case_secure_ai_agents_header.png',
        'large-width': 1024,
        'large-height': 566,
        '1536x1536':
          '/website-assets/media/2025/12/use_case_secure_ai_agents_header.png',
        '1536x1536-width': 1536,
        '1536x1536-height': 676,
        '2048x2048':
          '/website-assets/media/2025/12/use_case_secure_ai_agents_header.png',
        '2048x2048-width': 2048,
        '2048x2048-height': 676,
      },
    },
    media_video: '',
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<ContentStats
  fields={{
    heading: 'Do more with your data',
    heading_tag: 'h2',
    stats: [
      {
        media_type: 'image',
        image: false,
        lottie: false,
        amount: '100',
        suffix: 'x',
        after_text: 'up to 100x faster queries',
      },
      {
        media_type: 'image',
        image: false,
        lottie: false,
        amount: '80',
        suffix: '%',
        after_text: 'up to 80% cost savings on data lakehouse spend',
      },
      {
        media_type: 'image',
        image: false,
        lottie: false,
        amount: '2',
        suffix: 'x',
        after_text: 'Increase in data reliability',
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<ContentImageVideo
  fields={{
    variant: 'variant-2',
    heading: 'Agents need context - without risking your data',
    heading_tag: 'h2',
    paragraph:
      'Generic agent frameworks over-permission access, leading to sensitive data exposure and limited audit trails.  Security teams need least-privilege context, inline policy enforcement, and full traces.',
    cta: false,
    media_type: 'image',
    media_image: {
      ID: 1048,
      id: 1048,
      title: 'use_case_challenge',
      filename: 'use_case_challenge.png',
      filesize: 4349638,
      url: '/website-assets/media/2025/11/use_case_challenge.png',
      link: '/use-case/application-search/attachment/use_case_challenge/',
      alt: '',
      author: '6',
      description: '',
      caption: '',
      name: 'use_case_challenge',
      status: 'inherit',
      uploaded_to: 1044,
      date: '2025-11-21 16:21:07',
      modified: '2025-11-21 16:21:07',
      menu_order: 0,
      mime_type: 'image/png',
      type: 'image',
      subtype: 'png',
      icon: '/website-assets/media/default.png',
      width: 2720,
      height: 1824,
      sizes: {
        thumbnail: '/website-assets/media/2025/11/use_case_challenge.png',
        'thumbnail-width': 150,
        'thumbnail-height': 150,
        medium: '/website-assets/media/2025/11/use_case_challenge.png',
        'medium-width': 300,
        'medium-height': 201,
        medium_large: '/website-assets/media/2025/11/use_case_challenge.png',
        'medium_large-width': 768,
        'medium_large-height': 515,
        large: '/website-assets/media/2025/11/use_case_challenge.png',
        'large-width': 1024,
        'large-height': 687,
        '1536x1536': '/website-assets/media/2025/11/use_case_challenge.png',
        '1536x1536-width': 1536,
        '1536x1536-height': 1030,
        '2048x2048': '/website-assets/media/2025/11/use_case_challenge.png',
        '2048x2048-width': 2048,
        '2048x2048-height': 1373,
      },
    },
    graphic_overlay: false,
    media_video: '',
    padding_top: 'st-lg',
    padding_bottom: 'sb-lg',
  }}
/>

<CarouselHorizontalCards
  fields={{
    heading: 'Security is the foundation, not an afterthought',
    heading_tag: 'h2',
    paragraph:
      'Spice sandboxes, governs, and accelerates agent context in one runtime.',
    item: [
      {
        title: 'Data-centric isolation',
        paragraph:
          'Provision short-lived, scoped datasets per task or session. Apply least-privilege access to only the data an agent needs.',
        cta: {
          title: 'Explore secure AI sandboxing',
          url: '/feature/secure-ai-sandboxing',
          target: '',
        },
        image: {
          ID: 1620,
          id: 1620,
          title: 'use_case_secure_ai_agents_data_isolation',
          filename: 'use_case_secure_ai_agents_data_isolation.png',
          filesize: 260815,
          url: '/website-assets/media/2025/12/use_case_secure_ai_agents_data_isolation.png',
          link: '/use-case/secure-ai-agents/attachment/use_case_secure_ai_agents_data_isolation/',
          alt: '',
          author: '6',
          description: '',
          caption: '',
          name: 'use_case_secure_ai_agents_data_isolation',
          status: 'inherit',
          uploaded_to: 1094,
          date: '2025-12-03 00:06:49',
          modified: '2025-12-03 00:06:49',
          menu_order: 0,
          mime_type: 'image/png',
          type: 'image',
          subtype: 'png',
          icon: '/website-assets/media/default.png',
          width: 1360,
          height: 872,
          sizes: {
            thumbnail:
              '/website-assets/media/2025/12/use_case_secure_ai_agents_data_isolation.png',
            'thumbnail-width': 150,
            'thumbnail-height': 150,
            medium:
              '/website-assets/media/2025/12/use_case_secure_ai_agents_data_isolation.png',
            'medium-width': 300,
            'medium-height': 191,
            medium_large:
              '/website-assets/media/2025/12/use_case_secure_ai_agents_data_isolation.png',
            'medium_large-width': 768,
            'medium_large-height': 490,
            large:
              '/website-assets/media/2025/12/use_case_secure_ai_agents_data_isolation.png',
            'large-width': 1024,
            'large-height': 653,
            '1536x1536':
              '/website-assets/media/2025/12/use_case_secure_ai_agents_data_isolation.png',
            '1536x1536-width': 1536,
            '1536x1536-height': 872,
            '2048x2048':
              '/website-assets/media/2025/12/use_case_secure_ai_agents_data_isolation.png',
            '2048x2048-width': 2048,
            '2048x2048-height': 872,
          },
        },
      },
      {
        title: 'Federated context with security controls',
        paragraph:
          'Spice presents a single SQL layer over databases, object storage, APIs, and catalogs so applications operate on federated context rather than isolated pipelines.',
        cta: {
          title: 'Explore SQL federation and acceleration',
          url: '/platform/sql-federation-acceleration',
          target: '',
        },
        image: {
          ID: 1621,
          id: 1621,
          title: 'use_case_secure_ai_agents_federation',
          filename: 'use_case_secure_ai_agents_federation.png',
          filesize: 310540,
          url: '/website-assets/media/2025/12/use_case_secure_ai_agents_federation.png',
          link: '/use-case/secure-ai-agents/attachment/use_case_secure_ai_agents_federation/',
          alt: '',
          author: '6',
          description: '',
          caption: '',
          name: 'use_case_secure_ai_agents_federation',
          status: 'inherit',
          uploaded_to: 1094,
          date: '2025-12-03 00:06:52',
          modified: '2025-12-03 00:06:52',
          menu_order: 0,
          mime_type: 'image/png',
          type: 'image',
          subtype: 'png',
          icon: '/website-assets/media/default.png',
          width: 1360,
          height: 872,
          sizes: {
            thumbnail:
              '/website-assets/media/2025/12/use_case_secure_ai_agents_federation.png',
            'thumbnail-width': 150,
            'thumbnail-height': 150,
            medium:
              '/website-assets/media/2025/12/use_case_secure_ai_agents_federation.png',
            'medium-width': 300,
            'medium-height': 191,
            medium_large:
              '/website-assets/media/2025/12/use_case_secure_ai_agents_federation.png',
            'medium_large-width': 768,
            'medium_large-height': 490,
            large:
              '/website-assets/media/2025/12/use_case_secure_ai_agents_federation.png',
            'large-width': 1024,
            'large-height': 653,
            '1536x1536':
              '/website-assets/media/2025/12/use_case_secure_ai_agents_federation.png',
            '1536x1536-width': 1536,
            '1536x1536-height': 872,
            '2048x2048':
              '/website-assets/media/2025/12/use_case_secure_ai_agents_federation.png',
            '2048x2048-width': 2048,
            '2048x2048-height': 872,
          },
        },
      },
      {
        title: 'Inline policy and guardrails',
        paragraph:
          'Apply role-based access controls, redact sensitive fields, and restrict tool access by role, dataset, or environment before the prompt ever reaches a model.',
        cta: {
          title: 'Explore the MCP server gateway',
          url: '/feature/mcp-server-gateway',
          target: '',
        },
        image: {
          ID: 1622,
          id: 1622,
          title: 'use_case_secure_ai_agents_guardrails',
          filename: 'use_case_secure_ai_agents_guardrails.png',
          filesize: 310140,
          url: '/website-assets/media/2025/12/use_case_secure_ai_agents_guardrails.png',
          link: '/use-case/secure-ai-agents/attachment/use_case_secure_ai_agents_guardrails/',
          alt: '',
          author: '6',
          description: '',
          caption: '',
          name: 'use_case_secure_ai_agents_guardrails',
          status: 'inherit',
          uploaded_to: 1094,
          date: '2025-12-03 00:06:55',
          modified: '2025-12-03 00:06:55',
          menu_order: 0,
          mime_type: 'image/png',
          type: 'image',
          subtype: 'png',
          icon: '/website-assets/media/default.png',
          width: 1360,
          height: 872,
          sizes: {
            thumbnail:
              '/website-assets/media/2025/12/use_case_secure_ai_agents_guardrails.png',
            'thumbnail-width': 150,
            'thumbnail-height': 150,
            medium:
              '/website-assets/media/2025/12/use_case_secure_ai_agents_guardrails.png',
            'medium-width': 300,
            'medium-height': 191,
            medium_large:
              '/website-assets/media/2025/12/use_case_secure_ai_agents_guardrails.png',
            'medium_large-width': 768,
            'medium_large-height': 490,
            large:
              '/website-assets/media/2025/12/use_case_secure_ai_agents_guardrails.png',
            'large-width': 1024,
            'large-height': 653,
            '1536x1536':
              '/website-assets/media/2025/12/use_case_secure_ai_agents_guardrails.png',
            '1536x1536-width': 1536,
            '1536x1536-height': 872,
            '2048x2048':
              '/website-assets/media/2025/12/use_case_secure_ai_agents_guardrails.png',
            '2048x2048-width': 2048,
            '2048x2048-height': 872,
          },
        },
      },
      {
        title: 'LLM gateway with distributed tracing',
        paragraph:
          'Route to hosted or local models through the AI Gateway. Capture prompts, retrieve context, tool calls, and outputs for evaluation, red-teaming, and compliance audits.',
        cta: {
          title: 'Explore LLM inference in Spice',
          url: '/platform/llm-inference',
          target: '',
        },
        image: {
          ID: 1623,
          id: 1623,
          title: 'use_case_secure_ai_agents_tracing',
          filename: 'use_case_secure_ai_agents_tracing.png',
          filesize: 310061,
          url: '/website-assets/media/2025/12/use_case_secure_ai_agents_tracing.png',
          link: '/use-case/secure-ai-agents/attachment/use_case_secure_ai_agents_tracing/',
          alt: '',
          author: '6',
          description: '',
          caption: '',
          name: 'use_case_secure_ai_agents_tracing',
          status: 'inherit',
          uploaded_to: 1094,
          date: '2025-12-03 00:06:57',
          modified: '2025-12-03 00:06:57',
          menu_order: 0,
          mime_type: 'image/png',
          type: 'image',
          subtype: 'png',
          icon: '/website-assets/media/default.png',
          width: 1360,
          height: 872,
          sizes: {
            thumbnail:
              '/website-assets/media/2025/12/use_case_secure_ai_agents_tracing.png',
            'thumbnail-width': 150,
            'thumbnail-height': 150,
            medium:
              '/website-assets/media/2025/12/use_case_secure_ai_agents_tracing.png',
            'medium-width': 300,
            'medium-height': 191,
            medium_large:
              '/website-assets/media/2025/12/use_case_secure_ai_agents_tracing.png',
            'medium_large-width': 768,
            'medium_large-height': 490,
            large:
              '/website-assets/media/2025/12/use_case_secure_ai_agents_tracing.png',
            'large-width': 1024,
            'large-height': 653,
            '1536x1536':
              '/website-assets/media/2025/12/use_case_secure_ai_agents_tracing.png',
            '1536x1536-width': 1536,
            '1536x1536-height': 872,
            '2048x2048':
              '/website-assets/media/2025/12/use_case_secure_ai_agents_tracing.png',
            '2048x2048-width': 2048,
            '2048x2048-height': 872,
          },
        },
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<ContentThreeAcrossIconText
  fields={{
    heading: 'Why teams trust Spice for secure, production-grade AI agents',
    heading_tag: 'h2',
    paragraph:
      'Spice unifies federated context, least-privilege sandboxes, policy enforcement, and LLM governance so agents are both useful and secure.',
    items: [
      {
        icon: {
          ID: 1100,
          id: 1100,
          title: 'UseCase_SecureAIAgents_Native Sandboxing',
          filename: 'UseCase_SecureAIAgents_Native-Sandboxing.svg',
          filesize: 14568,
          url: '/website-assets/media/2025/11/UseCase_SecureAIAgents_Native-Sandboxing.svg',
          link: '/use-case/secure-ai-agents/attachment/usecase_secureaiagents_native-sandboxing/',
          alt: '',
          author: '6',
          description: '',
          caption: '',
          name: 'usecase_secureaiagents_native-sandboxing',
          status: 'inherit',
          uploaded_to: 1094,
          date: '2025-11-21 19:47:17',
          modified: '2025-11-21 19:47:17',
          menu_order: 0,
          mime_type: 'image/svg+xml',
          type: 'image',
          subtype: 'svg+xml',
          icon: '/website-assets/media/default.png',
          width: 0,
          height: 0,
          sizes: {
            thumbnail:
              '/website-assets/media/2025/11/UseCase_SecureAIAgents_Native-Sandboxing.svg',
            'thumbnail-width': 1,
            'thumbnail-height': 1,
            medium:
              '/website-assets/media/2025/11/UseCase_SecureAIAgents_Native-Sandboxing.svg',
            'medium-width': 1,
            'medium-height': 1,
            medium_large:
              '/website-assets/media/2025/11/UseCase_SecureAIAgents_Native-Sandboxing.svg',
            'medium_large-width': 1,
            'medium_large-height': 1,
            large:
              '/website-assets/media/2025/11/UseCase_SecureAIAgents_Native-Sandboxing.svg',
            'large-width': 1,
            'large-height': 1,
            '1536x1536':
              '/website-assets/media/2025/11/UseCase_SecureAIAgents_Native-Sandboxing.svg',
            '1536x1536-width': 1,
            '1536x1536-height': 1,
            '2048x2048':
              '/website-assets/media/2025/11/UseCase_SecureAIAgents_Native-Sandboxing.svg',
            '2048x2048-width': 1,
            '2048x2048-height': 1,
          },
        },
        title: 'Native Sandboxing',
        description:
          'Scope datasets per agent/task and auto-expire to limit blast radius.',
      },
      {
        icon: {
          ID: 1102,
          id: 1102,
          title: 'UseCase_SecureAIAgents_Policy Enforcement',
          filename: 'UseCase_SecureAIAgents_Policy-Enforcement.svg',
          filesize: 104283,
          url: '/website-assets/media/2025/11/UseCase_SecureAIAgents_Policy-Enforcement.svg',
          link: '/use-case/secure-ai-agents/attachment/usecase_secureaiagents_policy-enforcement/',
          alt: '',
          author: '6',
          description: '',
          caption: '',
          name: 'usecase_secureaiagents_policy-enforcement',
          status: 'inherit',
          uploaded_to: 1094,
          date: '2025-11-21 19:47:18',
          modified: '2025-11-21 19:47:18',
          menu_order: 0,
          mime_type: 'image/svg+xml',
          type: 'image',
          subtype: 'svg+xml',
          icon: '/website-assets/media/default.png',
          width: 0,
          height: 0,
          sizes: {
            thumbnail:
              '/website-assets/media/2025/11/UseCase_SecureAIAgents_Policy-Enforcement.svg',
            'thumbnail-width': 1,
            'thumbnail-height': 1,
            medium:
              '/website-assets/media/2025/11/UseCase_SecureAIAgents_Policy-Enforcement.svg',
            'medium-width': 1,
            'medium-height': 1,
            medium_large:
              '/website-assets/media/2025/11/UseCase_SecureAIAgents_Policy-Enforcement.svg',
            'medium_large-width': 1,
            'medium_large-height': 1,
            large:
              '/website-assets/media/2025/11/UseCase_SecureAIAgents_Policy-Enforcement.svg',
            'large-width': 1,
            'large-height': 1,
            '1536x1536':
              '/website-assets/media/2025/11/UseCase_SecureAIAgents_Policy-Enforcement.svg',
            '1536x1536-width': 1,
            '1536x1536-height': 1,
            '2048x2048':
              '/website-assets/media/2025/11/UseCase_SecureAIAgents_Policy-Enforcement.svg',
            '2048x2048-width': 1,
            '2048x2048-height': 1,
          },
        },
        title: 'Policy Enforcement',
        description:
          'Apply guardrails at query time. Restrict tools and enforce roles dynamically. ',
      },
      {
        icon: {
          ID: 1098,
          id: 1098,
          title: 'UseCase_SecureAIAgents_End-to-End Audit',
          filename: 'UseCase_SecureAIAgents_End-to-End-Audit.svg',
          filesize: 4882,
          url: '/website-assets/media/2025/11/UseCase_SecureAIAgents_End-to-End-Audit.svg',
          link: '/use-case/secure-ai-agents/attachment/usecase_secureaiagents_end-to-end-audit/',
          alt: '',
          author: '6',
          description: '',
          caption: '',
          name: 'usecase_secureaiagents_end-to-end-audit',
          status: 'inherit',
          uploaded_to: 1094,
          date: '2025-11-21 19:47:15',
          modified: '2025-11-21 19:47:15',
          menu_order: 0,
          mime_type: 'image/svg+xml',
          type: 'image',
          subtype: 'svg+xml',
          icon: '/website-assets/media/default.png',
          width: 0,
          height: 0,
          sizes: {
            thumbnail:
              '/website-assets/media/2025/11/UseCase_SecureAIAgents_End-to-End-Audit.svg',
            'thumbnail-width': 1,
            'thumbnail-height': 1,
            medium:
              '/website-assets/media/2025/11/UseCase_SecureAIAgents_End-to-End-Audit.svg',
            'medium-width': 1,
            'medium-height': 1,
            medium_large:
              '/website-assets/media/2025/11/UseCase_SecureAIAgents_End-to-End-Audit.svg',
            'medium_large-width': 1,
            'medium_large-height': 1,
            large:
              '/website-assets/media/2025/11/UseCase_SecureAIAgents_End-to-End-Audit.svg',
            'large-width': 1,
            'large-height': 1,
            '1536x1536':
              '/website-assets/media/2025/11/UseCase_SecureAIAgents_End-to-End-Audit.svg',
            '1536x1536-width': 1,
            '1536x1536-height': 1,
            '2048x2048':
              '/website-assets/media/2025/11/UseCase_SecureAIAgents_End-to-End-Audit.svg',
            '2048x2048-width': 1,
            '2048x2048-height': 1,
          },
        },
        title: 'End-to-End Audit',
        description:
          'Trace all prompt inputs, context, and model invocations for every agent.',
      },
      {
        icon: {
          ID: 1099,
          id: 1099,
          title: 'UseCase_SecureAIAgents_Federated and Governed Context',
          filename: 'UseCase_SecureAIAgents_Federated-and-Governed-Context.svg',
          filesize: 3039,
          url: '/website-assets/media/2025/11/UseCase_SecureAIAgents_Federated-and-Governed-Context.svg',
          link: '/use-case/secure-ai-agents/attachment/usecase_secureaiagents_federated-and-governed-context/',
          alt: '',
          author: '6',
          description: '',
          caption: '',
          name: 'usecase_secureaiagents_federated-and-governed-context',
          status: 'inherit',
          uploaded_to: 1094,
          date: '2025-11-21 19:47:16',
          modified: '2025-11-21 19:47:16',
          menu_order: 0,
          mime_type: 'image/svg+xml',
          type: 'image',
          subtype: 'svg+xml',
          icon: '/website-assets/media/default.png',
          width: 0,
          height: 0,
          sizes: {
            thumbnail:
              '/website-assets/media/2025/11/UseCase_SecureAIAgents_Federated-and-Governed-Context.svg',
            'thumbnail-width': 1,
            'thumbnail-height': 1,
            medium:
              '/website-assets/media/2025/11/UseCase_SecureAIAgents_Federated-and-Governed-Context.svg',
            'medium-width': 1,
            'medium-height': 1,
            medium_large:
              '/website-assets/media/2025/11/UseCase_SecureAIAgents_Federated-and-Governed-Context.svg',
            'medium_large-width': 1,
            'medium_large-height': 1,
            large:
              '/website-assets/media/2025/11/UseCase_SecureAIAgents_Federated-and-Governed-Context.svg',
            'large-width': 1,
            'large-height': 1,
            '1536x1536':
              '/website-assets/media/2025/11/UseCase_SecureAIAgents_Federated-and-Governed-Context.svg',
            '1536x1536-width': 1,
            '1536x1536-height': 1,
            '2048x2048':
              '/website-assets/media/2025/11/UseCase_SecureAIAgents_Federated-and-Governed-Context.svg',
            '2048x2048-width': 1,
            '2048x2048-height': 1,
          },
        },
        title: 'Federated and Governed Context',
        description:
          'Retrieve only permitted structured and unstructured data.',
      },
      {
        icon: {
          ID: 1101,
          id: 1101,
          title: 'UseCase_SecureAIAgents_Operational Performance',
          filename: 'UseCase_SecureAIAgents_Operational-Performance.svg',
          filesize: 12719,
          url: '/website-assets/media/2025/11/UseCase_SecureAIAgents_Operational-Performance.svg',
          link: '/use-case/secure-ai-agents/attachment/usecase_secureaiagents_operational-performance/',
          alt: '',
          author: '6',
          description: '',
          caption: '',
          name: 'usecase_secureaiagents_operational-performance',
          status: 'inherit',
          uploaded_to: 1094,
          date: '2025-11-21 19:47:17',
          modified: '2025-11-21 19:47:17',
          menu_order: 0,
          mime_type: 'image/svg+xml',
          type: 'image',
          subtype: 'svg+xml',
          icon: '/website-assets/media/default.png',
          width: 0,
          height: 0,
          sizes: {
            thumbnail:
              '/website-assets/media/2025/11/UseCase_SecureAIAgents_Operational-Performance.svg',
            'thumbnail-width': 1,
            'thumbnail-height': 1,
            medium:
              '/website-assets/media/2025/11/UseCase_SecureAIAgents_Operational-Performance.svg',
            'medium-width': 1,
            'medium-height': 1,
            medium_large:
              '/website-assets/media/2025/11/UseCase_SecureAIAgents_Operational-Performance.svg',
            'medium_large-width': 1,
            'medium_large-height': 1,
            large:
              '/website-assets/media/2025/11/UseCase_SecureAIAgents_Operational-Performance.svg',
            'large-width': 1,
            'large-height': 1,
            '1536x1536':
              '/website-assets/media/2025/11/UseCase_SecureAIAgents_Operational-Performance.svg',
            '1536x1536-width': 1,
            '1536x1536-height': 1,
            '2048x2048':
              '/website-assets/media/2025/11/UseCase_SecureAIAgents_Operational-Performance.svg',
            '2048x2048-width': 1,
            '2048x2048-height': 1,
          },
        },
        title: 'Operational Performance',
        description:
          'Local acceleration delivers ms latency context for agents, even with full controls.',
      },
      {
        icon: {
          ID: 1097,
          id: 1097,
          title: 'UseCase_SecureAIAgents_Developer-First Design',
          filename: 'UseCase_SecureAIAgents_Developer-First-Design.svg',
          filesize: 4959,
          url: '/website-assets/media/2025/11/UseCase_SecureAIAgents_Developer-First-Design.svg',
          link: '/use-case/secure-ai-agents/attachment/usecase_secureaiagents_developer-first-design/',
          alt: '',
          author: '6',
          description: '',
          caption: '',
          name: 'usecase_secureaiagents_developer-first-design',
          status: 'inherit',
          uploaded_to: 1094,
          date: '2025-11-21 19:47:14',
          modified: '2025-11-21 19:47:14',
          menu_order: 0,
          mime_type: 'image/svg+xml',
          type: 'image',
          subtype: 'svg+xml',
          icon: '/website-assets/media/default.png',
          width: 0,
          height: 0,
          sizes: {
            thumbnail:
              '/website-assets/media/2025/11/UseCase_SecureAIAgents_Developer-First-Design.svg',
            'thumbnail-width': 1,
            'thumbnail-height': 1,
            medium:
              '/website-assets/media/2025/11/UseCase_SecureAIAgents_Developer-First-Design.svg',
            'medium-width': 1,
            'medium-height': 1,
            medium_large:
              '/website-assets/media/2025/11/UseCase_SecureAIAgents_Developer-First-Design.svg',
            'medium_large-width': 1,
            'medium_large-height': 1,
            large:
              '/website-assets/media/2025/11/UseCase_SecureAIAgents_Developer-First-Design.svg',
            'large-width': 1,
            'large-height': 1,
            '1536x1536':
              '/website-assets/media/2025/11/UseCase_SecureAIAgents_Developer-First-Design.svg',
            '1536x1536-width': 1,
            '1536x1536-height': 1,
            '2048x2048':
              '/website-assets/media/2025/11/UseCase_SecureAIAgents_Developer-First-Design.svg',
            '2048x2048-width': 1,
            '2048x2048-height': 1,
          },
        },
        title: 'Deployment Flexibility',
        description:
          'Run Spice anywhere: as a sidecar, microservice, cluster, or on the managed Spice Cloud Platform.',
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<Testimonials
  heading="Deployed in production"
  headingTag="h2"
  paragraph="Run data-intensive workloads on a high-performance engine trusted by teams building real-time systems at scale."
  items={['twilio', 'barracuda', 'nrc-tim', 'basisset']}
/>

<CarouselLogos
  fields={{
    heading: 'Trusted by global enterprises',
    logos: [
      {
        logo: {
          ID: 443,
          id: 443,
          title: 'Homepage_Logos_Twilio',
          filename: 'Homepage_Logos_Twilio-1.svg',
          filesize: 4020,
          url: '/website-assets/media/2025/11/Homepage_Logos_Twilio-1.svg',
          link: '/home/homepage_logos_twilio-2/',
          alt: 'Twilio logo',
          author: '6',
          description: '',
          caption: '',
          name: 'homepage_logos_twilio-2',
          status: 'inherit',
          uploaded_to: 2,
          date: '2025-11-05 18:46:45',
          modified: '2025-11-05 18:46:45',
          menu_order: 0,
          mime_type: 'image/svg+xml',
          type: 'image',
          subtype: 'svg+xml',
          icon: '/website-assets/media/default.png',
          width: 0,
          height: 0,
          sizes: {
            thumbnail:
              '/website-assets/media/2025/11/Homepage_Logos_Twilio-1.svg',
            'thumbnail-width': 1,
            'thumbnail-height': 1,
            medium: '/website-assets/media/2025/11/Homepage_Logos_Twilio-1.svg',
            'medium-width': 1,
            'medium-height': 1,
            medium_large:
              '/website-assets/media/2025/11/Homepage_Logos_Twilio-1.svg',
            'medium_large-width': 1,
            'medium_large-height': 1,
            large: '/website-assets/media/2025/11/Homepage_Logos_Twilio-1.svg',
            'large-width': 1,
            'large-height': 1,
            '1536x1536':
              '/website-assets/media/2025/11/Homepage_Logos_Twilio-1.svg',
            '1536x1536-width': 1,
            '1536x1536-height': 1,
            '2048x2048':
              '/website-assets/media/2025/11/Homepage_Logos_Twilio-1.svg',
            '2048x2048-width': 1,
            '2048x2048-height': 1,
          },
        },
      },
      {
        logo: {
          ID: 442,
          id: 442,
          title: 'Homepage_Logos_NRC',
          filename: 'Homepage_Logos_NRC-1.svg',
          filesize: 1030,
          url: '/website-assets/media/2025/11/Homepage_Logos_NRC-1.svg',
          link: '/home/homepage_logos_nrc-2/',
          alt: 'NRC Health logo',
          author: '6',
          description: '',
          caption: '',
          name: 'homepage_logos_nrc-2',
          status: 'inherit',
          uploaded_to: 2,
          date: '2025-11-05 18:46:45',
          modified: '2025-11-05 18:46:45',
          menu_order: 0,
          mime_type: 'image/svg+xml',
          type: 'image',
          subtype: 'svg+xml',
          icon: '/website-assets/media/default.png',
          width: 0,
          height: 0,
          sizes: {
            thumbnail: '/website-assets/media/2025/11/Homepage_Logos_NRC-1.svg',
            'thumbnail-width': 1,
            'thumbnail-height': 1,
            medium: '/website-assets/media/2025/11/Homepage_Logos_NRC-1.svg',
            'medium-width': 1,
            'medium-height': 1,
            medium_large:
              '/website-assets/media/2025/11/Homepage_Logos_NRC-1.svg',
            'medium_large-width': 1,
            'medium_large-height': 1,
            large: '/website-assets/media/2025/11/Homepage_Logos_NRC-1.svg',
            'large-width': 1,
            'large-height': 1,
            '1536x1536':
              '/website-assets/media/2025/11/Homepage_Logos_NRC-1.svg',
            '1536x1536-width': 1,
            '1536x1536-height': 1,
            '2048x2048':
              '/website-assets/media/2025/11/Homepage_Logos_NRC-1.svg',
            '2048x2048-width': 1,
            '2048x2048-height': 1,
          },
        },
      },
      {
        logo: {
          ID: 441,
          id: 441,
          title: 'Homepage_Logos_BasisSet',
          filename: 'Homepage_Logos_BasisSet-1.svg',
          filesize: 2629,
          url: '/website-assets/media/2025/11/Homepage_Logos_BasisSet-1.svg',
          link: '/home/homepage_logos_basisset-2/',
          alt: 'Basis Set Ventures logo',
          author: '6',
          description: '',
          caption: '',
          name: 'homepage_logos_basisset-2',
          status: 'inherit',
          uploaded_to: 2,
          date: '2025-11-05 18:46:45',
          modified: '2025-11-05 18:46:45',
          menu_order: 0,
          mime_type: 'image/svg+xml',
          type: 'image',
          subtype: 'svg+xml',
          icon: '/website-assets/media/default.png',
          width: 0,
          height: 0,
          sizes: {
            thumbnail:
              '/website-assets/media/2025/11/Homepage_Logos_BasisSet-1.svg',
            'thumbnail-width': 1,
            'thumbnail-height': 1,
            medium:
              '/website-assets/media/2025/11/Homepage_Logos_BasisSet-1.svg',
            'medium-width': 1,
            'medium-height': 1,
            medium_large:
              '/website-assets/media/2025/11/Homepage_Logos_BasisSet-1.svg',
            'medium_large-width': 1,
            'medium_large-height': 1,
            large:
              '/website-assets/media/2025/11/Homepage_Logos_BasisSet-1.svg',
            'large-width': 1,
            'large-height': 1,
            '1536x1536':
              '/website-assets/media/2025/11/Homepage_Logos_BasisSet-1.svg',
            '1536x1536-width': 1,
            '1536x1536-height': 1,
            '2048x2048':
              '/website-assets/media/2025/11/Homepage_Logos_BasisSet-1.svg',
            '2048x2048-width': 1,
            '2048x2048-height': 1,
          },
        },
      },
      {
        logo: {
          ID: 440,
          id: 440,
          title: 'Homepage_Logos_Barracuda',
          filename: 'Homepage_Logos_Barracuda-1.svg',
          filesize: 7450,
          url: '/website-assets/media/2025/11/Homepage_Logos_Barracuda-1.svg',
          link: '/home/homepage_logos_barracuda-2/',
          alt: 'Barracuda Networks logo',
          author: '6',
          description: '',
          caption: '',
          name: 'homepage_logos_barracuda-2',
          status: 'inherit',
          uploaded_to: 2,
          date: '2025-11-05 18:46:45',
          modified: '2025-11-05 18:46:45',
          menu_order: 0,
          mime_type: 'image/svg+xml',
          type: 'image',
          subtype: 'svg+xml',
          icon: '/website-assets/media/default.png',
          width: 0,
          height: 0,
          sizes: {
            thumbnail:
              '/website-assets/media/2025/11/Homepage_Logos_Barracuda-1.svg',
            'thumbnail-width': 1,
            'thumbnail-height': 1,
            medium:
              '/website-assets/media/2025/11/Homepage_Logos_Barracuda-1.svg',
            'medium-width': 1,
            'medium-height': 1,
            medium_large:
              '/website-assets/media/2025/11/Homepage_Logos_Barracuda-1.svg',
            'medium_large-width': 1,
            'medium_large-height': 1,
            large:
              '/website-assets/media/2025/11/Homepage_Logos_Barracuda-1.svg',
            'large-width': 1,
            'large-height': 1,
            '1536x1536':
              '/website-assets/media/2025/11/Homepage_Logos_Barracuda-1.svg',
            '1536x1536-width': 1,
            '1536x1536-height': 1,
            '2048x2048':
              '/website-assets/media/2025/11/Homepage_Logos_Barracuda-1.svg',
            '2048x2048-width': 1,
            '2048x2048-height': 1,
          },
        },
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<ContentResourceFeatured
  fields={{
    heading: 'Build more performant and secure AI agents',
    heading_tag: 'h2',
    paragraph:
      'Guides and examples to learn more about deploying secure, high-performance AI agents with Spice.',
    mode: 'default',
    resources: [
      {
        source: 'manual',
        resource: null,
        resource_manual: {
          eyebrow: 'Docs',
          title: {
            title: 'AI Agent Docs',
            url: 'https://spiceai.org/docs/use-cases/ai',
            target: '_blank',
          },
          description:
            'Explore the docs for examples and guidance on building AI agents with Spice.',
          image: {
            ID: 1661,
            id: 1661,
            title: 'Docs jpeg',
            filename: 'Docs-jpeg.jpeg',
            filesize: 103192,
            url: '/website-assets/media/2025/12/Docs-jpeg.jpeg',
            link: '/docs-jpeg/',
            alt: '',
            author: '9',
            description: '',
            caption: '',
            name: 'docs-jpeg',
            status: 'inherit',
            uploaded_to: 0,
            date: '2025-12-05 04:13:53',
            modified: '2025-12-05 04:13:53',
            menu_order: 0,
            mime_type: 'image/jpeg',
            type: 'image',
            subtype: 'jpeg',
            icon: '/website-assets/media/default.png',
            width: 1832,
            height: 1036,
            sizes: {
              thumbnail: '/website-assets/media/2025/12/Docs-jpeg-150x150.jpeg',
              'thumbnail-width': 150,
              'thumbnail-height': 150,
              medium: '/website-assets/media/2025/12/Docs-jpeg-300x170.jpeg',
              'medium-width': 300,
              'medium-height': 170,
              medium_large:
                '/website-assets/media/2025/12/Docs-jpeg-768x434.jpeg',
              'medium_large-width': 768,
              'medium_large-height': 434,
              large: '/website-assets/media/2025/12/Docs-jpeg-1024x579.jpeg',
              'large-width': 1024,
              'large-height': 579,
              '1536x1536':
                '/website-assets/media/2025/12/Docs-jpeg-1536x869.jpeg',
              '1536x1536-width': 1536,
              '1536x1536-height': 869,
              '2048x2048': '/website-assets/media/2025/12/Docs-jpeg.jpeg',
              '2048x2048-width': 1832,
              '2048x2048-height': 1036,
            },
          },
        },
      },
      {
        source: 'manual',
        resource: null,
        resource_manual: {
          eyebrow: 'Recipe',
          title: {
            title: 'Intelligent Security Copilot Cookbook',
            url: 'https://github.com/spiceai/cookbook/blob/trunk/guides/security-analyzer/README.md',
            target: '_blank',
          },
          description:
            'Follow this step-by-step recipe to stream query logs into Spice, apply AI-driven pattern analysis, and surface alerts for suspicious database activity.',
          image: {
            ID: 1659,
            id: 1659,
            title: 'cookbooks jpeg',
            filename: 'cookbooks-jpeg.png',
            filesize: 2171698,
            url: '/website-assets/media/2025/12/cookbooks-jpeg.png',
            link: '/cookbooks-jpeg/',
            alt: '',
            author: '9',
            description: '',
            caption: '',
            name: 'cookbooks-jpeg',
            status: 'inherit',
            uploaded_to: 0,
            date: '2025-12-05 04:13:34',
            modified: '2025-12-05 04:13:34',
            menu_order: 0,
            mime_type: 'image/png',
            type: 'image',
            subtype: 'png',
            icon: '/website-assets/media/default.png',
            width: 1832,
            height: 1036,
            sizes: {
              thumbnail:
                '/website-assets/media/2025/12/cookbooks-jpeg-150x150.png',
              'thumbnail-width': 150,
              'thumbnail-height': 150,
              medium:
                '/website-assets/media/2025/12/cookbooks-jpeg-300x170.png',
              'medium-width': 300,
              'medium-height': 170,
              medium_large:
                '/website-assets/media/2025/12/cookbooks-jpeg-768x434.png',
              'medium_large-width': 768,
              'medium_large-height': 434,
              large:
                '/website-assets/media/2025/12/cookbooks-jpeg-1024x579.png',
              'large-width': 1024,
              'large-height': 579,
              '1536x1536':
                '/website-assets/media/2025/12/cookbooks-jpeg-1536x869.png',
              '1536x1536-width': 1536,
              '1536x1536-height': 869,
              '2048x2048': '/website-assets/media/2025/12/cookbooks-jpeg.png',
              '2048x2048-width': 1832,
              '2048x2048-height': 1036,
            },
          },
        },
      },
      {
        source: 'picker',
        resource: [
          {
            title:
              'Real-Time Hybrid Search Using RRF: A Hands-On Guide with Spice',
            slug: '/blog/real-time-hybrid-search-using-rrf',
            excerpt:
              'Surfacing relevant answers to searches across datasets has historically meant navigating significant tradeoffs.&nbsp;Keyword (or lexical) search&nbsp;is fast, cheap, and commoditized, but limited by the constraints of exact matching.&nbsp;Vector (or semantic) search&nbsp;captures nuance and intent, but can be slower, harder to debug, and expensive to run at scale. Combining both usually entails standing up multiple engines [&hellip;]',
            image:
              '/website-assets/media/2025/11/68fa4fdfded26b3b6472a172_image-8.png',
            type: 'Blog',
            taxonomy: ['Search', 'Spice AI'],
          },
        ],
        resource_manual: {
          eyebrow: '',
          title: null,
          description: '',
          image: false,
        },
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<AccordionFaq
  fields={{
    heading: 'FAQs',
    heading_tag: 'h2',
    paragraph:
      'Answers to common questions about securing AI agent deployments',
    items: [
      {
        title: 'How do you prevent AI agents from accessing sensitive data?',
        paragraph:
          '<p>Restrict each agent to least-privilege, task-scoped access instead of granting broad permissions. Spice provisions short-lived, scoped datasets per task or session, applies role-based access controls, redacts sensitive fields, and restricts tool access by role, dataset, or environment before a prompt ever reaches a model.</p>\n',
      },
      {
        title: 'What is an agent sandbox?',
        paragraph:
          '<p>An agent sandbox is a short-lived, isolated data environment scoped to a single agent task or session. In Spice, sandboxes contain only the datasets an agent needs, and they expire automatically to limit the blast radius if an agent is compromised or misbehaves.</p>\n',
      },
      {
        title: 'How do AI agents query enterprise data through Spice?',
        paragraph:
          '<p>Agents query a single federated SQL layer that spans databases, object storage, APIs, and catalogs, rather than integrating with each system separately. Agents and tools can also connect through the <a href="/feature/mcp-server-gateway">MCP server gateway</a>, which provides governed data access over the Model Context Protocol.</p>\n',
      },
      {
        title: 'Can I audit what an AI agent did?',
        paragraph:
          '<p>Yes. Spice captures prompts, retrieved context, tool calls, and model outputs for every agent, with distributed tracing through its AI Gateway. These traces support evaluation, red-teaming, and compliance audits across hosted and local models served via <a href="/platform/llm-inference">LLM inference in Spice</a>.</p>\n',
      },
      {
        title: 'Do security controls slow down AI agents?',
        paragraph:
          '<p>No. Spice enforces policy at query time while local data acceleration delivers millisecond-latency context to agents, even with full controls enabled. Agents get fast, governed data access from the same runtime that applies the security controls.</p>\n',
      },
    ],
    padding_top: 'unset',
    padding_bottom: 'unset',
  }}
/>

<TalkToAnEngineerCta />

---
