Sign In
Free Sign Up
  • English
  • Español
  • 简体中文
  • Deutsch
  • 日本語
Sign In
Free Sign Up
  • English
  • Español
  • 简体中文
  • Deutsch
  • 日本語

Consultas complejas con MyScaleDB: cuando las potentes consultas SQL se encuentran con la búsqueda vectorial

La búsqueda vectorial busca vectores o puntos de datos similares en un conjunto de datos basándose en sus representaciones vectoriales. A diferencia de las bases de datos vectoriales propietarias como Pinecone, Milvus, Qdrant y Weaviate, MyScaleDB se basa en la base de datos de código abierto compatible con SQL, ClickHouse.

El lenguaje de consulta estructurado (SQL) es una herramienta eficaz para gestionar bases de datos relacionales. MyScaleDB combina el poder de SQL y los vectores para proporcionar un enfoque potente para abordar preguntas complejas relacionadas con la inteligencia artificial. Los usuarios pueden ejecutar consultas SQL tradicionales y consultas vectoriales en datos estructurados y vectores de incrustación (datos) para abordar consultas complejas y analizar datos de alta dimensionalidad de manera unificada y eficiente.

En este blog, primero discutiremos algunas de las técnicas SQL avanzadas más populares. Luego, proporcionaremos ejemplos considerando cómo MyScaleDB une consultas SQL complejas con búsqueda vectorial en una sola consulta para realizar búsquedas relacionadas con vectores y optimizar la ejecución de consultas junto con ClickHouse, recuperando datos de manera más rápida y eficiente.

# Técnicas SQL avanzadas para consultas complejas

Las consultas SQL simples son comandos que realizan una recuperación de datos sencilla, generalmente de una sola tabla a la vez. Las consultas SQL complejas van más allá de las solicitudes estándar al recuperar datos de varias tablas y limitar el conjunto de resultados con múltiples condiciones.

Una consulta compleja podría incluir características como:

  • Expresiones de tabla comunes
  • Subconsultas
  • Unión de muchas tablas y uso de diferentes tipos de uniones

# Expresiones de tabla comunes

Una expresión de tabla común (CTE, por sus siglas en inglés) es un nombre que le das a una subconsulta dentro de tu consulta principal. La razón principal para hacer esto es simplificar tu consulta, haciéndola más fácil de leer y depurar. A veces puede mejorar el rendimiento, lo cual es otra ventaja, pero principalmente se trata de legibilidad y simplificación.

Considera un escenario en el que deseas determinar la edad promedio de los clientes que han comprado un producto en particular. Tienes una tabla de datos de clientes que incluye su nombre, edad y los productos que han comprado.

Aquí tienes un ejemplo de consulta para realizar este cálculo utilizando una CTE:

WITH product_customers AS (
  SELECT name, age
  FROM customer_data
  WHERE product = 'widget'
)
SELECT AVG(age) AS avg_age
FROM product_customers;

Esta consulta utiliza una CTE, que es un conjunto de resultados con nombre temporal (subconsulta) que se puede referenciar dentro de una sola consulta.

La CTE se llama product_customers. Se crea utilizando una declaración SELECT que recupera las columnas de nombre y edad de la tabla customer_data para los clientes que han comprado el producto 'widget'.

Mover la subconsulta al principio de la consulta y darle un nombre significa que será más fácil entender qué hace la consulta. Si tu subconsulta selecciona un vector de incrustación de muestra, podrías nombrar tu subconsulta como target_vector_embed. Cuando te refieras a esto en la consulta principal, verás este nombre y sabrás a qué se refiere.

También es útil si tienes una consulta larga y necesitas la misma lógica en varios lugares. Puedes definirla al principio de la consulta y referirte a ella varias veces a lo largo de tu consulta principal.

Por lo tanto, considera utilizar CTE siempre que tengas una subconsulta como una forma de mejorar la legibilidad de tu consulta.

# Subconsultas

Una subconsulta es un comando SQL simple incrustado dentro de otra consulta. Al anidar consultas, puedes establecer restricciones más amplias en los datos incluidos en el conjunto de resultados.

Las subconsultas se pueden utilizar en varios lugares dentro de una consulta, pero es más fácil comenzar con la declaración FROM. Aquí tienes un ejemplo de una subconsulta básica:

SELECT sub.*
FROM (
  SELECT *
  FROM table
  WHERE conditions
) sub
WHERE sub.column_1 = 'MyScaleDB';

Veamos qué sucede cuando ejecutas la consulta anterior:

Primero, la base de datos ejecuta la "consulta interna", la parte entre paréntesis. Si ejecutas esto de forma independiente, produce un conjunto de resultados como cualquier otra consulta. Una vez que se ejecuta la consulta interna, la consulta externa se ejecutará utilizando los resultados de la consulta interna como su tabla subyacente:

SELECT sub.*
FROM (
  << aquí van los resultados de la consulta interna >>
) sub
WHERE sub.column_1 = 'MyScaleDB';

Las subconsultas deben tener nombres, que se agregan después de los paréntesis de la misma manera que agregarías un alias a una tabla regular. Esta consulta utiliza el nombre sub.

# Uso de subconsultas en lógica condicional

Puedes utilizar subconsultas en lógica condicional (en conjunto con WHERE, JOIN/ON o CASE). La siguiente consulta devuelve todas las entradas de la misma fecha que la entrada especificada en el conjunto de datos:

SELECT *
FROM table
WHERE Date = (SELECT Date
              FROM table
              WHERE id='00001');

Esta consulta funciona porque el resultado de la subconsulta es solo una celda. La mayoría de las lógicas condicionales funcionarán con subconsultas que contienen resultados de una sola celda. Sin embargo, IN es el único tipo de lógica condicional que funcionará cuando la subconsulta interna contiene múltiples resultados:

SELECT *
FROM table
WHERE Date IN (SELECT Date
              FROM table
              ORDER BY Date
              LIMIT 5);

Ten en cuenta que no debes incluir un alias cuando escribas una subconsulta en una declaración condicional. Esto se debe a que la subconsulta se trata como un valor individual (o conjunto de valores en la cláusula IN) en lugar de como una tabla.

# Unión de tablas

La unión produce una nueva tabla combinando columnas de una o varias tablas utilizando valores comunes en cada una. Los diferentes tipos de uniones son los siguientes:

  • INNER JOIN: Solo se devuelven los registros coincidentes.
  • LEFT JOIN: Devuelve todos los registros de la tabla izquierda y los registros coincidentes de la tabla derecha.
  • RIGHT JOIN: Devuelve todos los registros de la tabla derecha y los registros coincidentes de la tabla izquierda.
  • FULL JOIN: Devuelve todos los registros de ambas tablas cuando hay una coincidencia en cualquiera de las tablas izquierda o derecha.
  • CROSS JOIN: Produce el producto cartesiano de todas las tablas, ya que no se especifican "claves de unión".
Boost Your AI App Efficiency now
Sign up for free to benefit from 150+ QPS with 5,000,000 vectors
Free Trial
Explore our product

# Uso de consultas SQL complejas y de vectores en MyScaleDB

La base de datos vectorial SQL MyScaleDB incluye varias características que te ayudan con consultas SQL complejas y de vectores. Veamos algunos ejemplos que resalten las capacidades de las consultas complejas de MyScaleDB.

# Expresiones de tabla comunes

MyScaleDB admite CTE y sustituye el código definido en la cláusula WITH por el resto de la consulta SELECT. Las subconsultas con nombres se pueden incluir en el contexto de consulta actual e hijo en cualquier lugar donde se permitan objetos de tabla.

La búsqueda vectorial es un método de búsqueda que representa datos como vectores. Se utiliza comúnmente en aplicaciones como búsqueda de imágenes, búsqueda de videos y búsqueda de texto. MyScaleDB utiliza la función distance() para realizar búsquedas vectoriales. Calcula la distancia entre un vector especificado y todos los datos vectoriales en una columna especificada, y devuelve los candidatos principales.

En algunos casos, si el vector especificado se obtiene de otra tabla o la dimensión del vector especificado es grande y resulta incómodo de representar, puedes utilizar CTE o subconsulta.

Supongamos que tienes una tabla de vectores llamada photo que almacena información de metadatos vinculada a las imágenes de la biblioteca de fotos, con id, photo_id y photo_embed para el vector de características.

El siguiente ejemplo trata el resultado de la selección en CTE como un vector objetivo para ejecutar una búsqueda vectorial:

WITH target_photo_embed AS (
  SELECT photo_embed
  FROM photos
  LIMIT 1)
SELECT id, photo_id, distance(photo_embed, target_photo_embed) as dist
FROM photos
ORDER BY dist
LIMIT 10;

# Uniones y subconsultas

El soporte para uniones es limitado, y se recomienda utilizar subconsultas como solución alternativa. En MyScaleDB, la búsqueda vectorial se basa en el índice vectorial de una tabla con una columna vectorial. Aunque la función distance() aparece en la cláusula SELECT, su valor se calcula durante la búsqueda vectorial en la tabla, no después de la unión. El resultado de la unión puede no ser el resultado esperado.

Estas son posibles soluciones alternativas:

  • Puedes utilizar el patrón de consulta distance()...WHERE...ORDER BY...LIMIT en subconsultas que utilizan índices vectoriales y obtener resultados esperados en tablas vectoriales.

  • También puedes utilizar subconsultas en la cláusula WHERE para reescribir la unión.

Supongamos que tienes otra tabla photo_meta que almacena información sobre las imágenes de la biblioteca de fotos, con photo_id, photo_author, year y title. El siguiente ejemplo recupera fotos relevantes tomadas en 2023 de una colección de imágenes:

SELECT t1.photo_id, distance(t1.photo_embed,[0.0269, 0.0316,...]) as dist
FROM photos t1
JOIN photo_meta t2 ON t1.photo_id = t2.photo_id
WHERE t2.year = 2023
ORDER BY dist
LIMIT 5;

Esto es lo que sucede cuando ejecutas la consulta anterior:

  • Primero, MyScaleDB ejecuta la búsqueda vectorial en la tabla photos para obtener la columna requerida photo_id y el valor de la función distance() para los cinco registros relevantes principales:
SELECT photo_id, distance(photo_embed,[0.0269, 0.0316,...]) as dist
FROM photos
ORDER BY dist
LIMIT 5;
  • Luego, se ejecuta la join utilizando los resultados de la tabla vectorial como su tabla subyacente:
SELECT t1.photo_id, t1.dist
FROM (<< aquí van los resultados de la tabla vectorial >>) t1
JOIN photo_meta t2 ON t1.photo_id = t2.photo_id
WHERE t2.year = 2023;

Debido a que la búsqueda vectorial no tiene en cuenta el año en que se tomaron las fotos, el resultado puede ser incorrecto. Para obtener el resultado correcto, debemos reescribir la consulta de unión utilizando una subconsulta:

SELECT t1.photo_id, t1.dist
FROM (
  SELECT photo_id, distance(photo_embed,[0.0269, 0.0316,...]) as dist
  FROM photos
  WHERE photo_id IN (
    SELECT t1.photo_id
    FROM photos t1 JOIN photo_meta t2 ON t1.photo_id = t2.photo_id
    WHERE t2.year = 2023)
  ORDER BY dist
  LIMIT 5
) t1
ORDER BY dist
LIMIT 5;
Join Our Newsletter

# Mejora del análisis de datos

Las técnicas SQL avanzadas como CTE, subconsultas y uniones pueden ayudarte a realizar análisis y manipulaciones de datos complejos con mayor precisión y eficiencia. MyScaleDB combina el poder de SQL y los vectores para proporcionar un enfoque potente para abordar preguntas complejas relacionadas con la inteligencia artificial. Con MyScaleDB, puedes ejecutar de manera eficiente consultas SQL tradicionales y consultas vectoriales en datos estructurados y datos vectoriales para abordar consultas complejas y analizar datos de alta dimensionalidad de manera unificada y eficiente.

Si estás interesado en obtener más información, síguenos en X (Twitter) (opens new window) o únete a nuestra comunidad de Discord (opens new window). ¡Construyamos juntos el futuro de los datos y la inteligencia artificial!

Keep Reading

Start building your Al projects with MyScale today

Free Trial
Contact Us