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

Komplexe Abfragen mit MyScaleDB: Wenn leistungsstarke SQL-Abfragen auf Vektor-Suche treffen

Die Vektor-Suche sucht nach ähnlichen Vektoren oder Datenpunkten in einem Datensatz basierend auf ihren Vektorrepräsentationen. Im Gegensatz zu proprietären Vektor-Datenbanken wie Pinecone, Milvus, Qdrant und Weaviate basiert MyScaleDB auf der Open-Source, SQL-kompatiblen Datenbank ClickHouse.

Structured Query Language (SQL) ist ein effektives Werkzeug zur Verwaltung relationaler Datenbanken. MyScaleDB kombiniert die Leistungsfähigkeit von SQL und Vektoren, um einen leistungsstarken Ansatz zur Bewältigung komplexer KI-bezogener Fragen zu bieten. Benutzer können traditionelle SQL- und Vektorabfragen auf strukturierten Daten und Vektor-Einbettungen (Daten) ausführen, um komplexe Abfragen zu bearbeiten und hochdimensionale Daten auf eine einheitliche und effiziente Weise zu analysieren.

In diesem Blog diskutieren wir zunächst einige der beliebtesten fortgeschrittenen SQL-Techniken. Anschließend geben wir Beispiele, indem wir zeigen, wie MyScaleDB komplexe SQL-Abfragen mit Vektor-Suche in einer einzigen Abfrage kombiniert, um vektorbezogene Suchen durchzuführen und die Abfrageausführung zusammen mit ClickHouse zu optimieren, um Daten schneller und effizienter abzurufen.

# Fortgeschrittene SQL-Techniken für komplexe Abfragen

Einfache SQL-Abfragen sind Befehle, die eine einfache Datenabfrage durchführen, normalerweise nur von einer Tabelle zu einem Zeitpunkt. Komplexe SQL-Abfragen gehen über Standardanfragen hinaus, indem sie Daten aus mehreren Tabellen abrufen und das Ergebnis mit mehreren Bedingungen einschränken.

Eine komplexe Abfrage kann folgende Merkmale aufweisen:

  • Common Table Expressions (CTEs)
  • Unterabfragen (Subqueries)
  • Verknüpfung mehrerer Tabellen und Verwendung verschiedener Verknüpfungstypen

# Common Table Expressions (CTEs)

Eine Common Table Expression (CTE) ist ein Name, den Sie einer Unterabfrage in Ihrer Hauptabfrage geben. Der Hauptgrund dafür ist die Vereinfachung Ihrer Abfrage, um sie leichter lesbar und debugbar zu machen. Es kann manchmal die Leistung verbessern, was ein weiterer Vorteil ist, aber es geht hauptsächlich um Lesbarkeit und Vereinfachung.

Nehmen wir an, Sie möchten das Durchschnittsalter der Kunden ermitteln, die ein bestimmtes Produkt gekauft haben. Sie haben eine Tabelle mit Kundendaten, einschließlich ihres Namens, Alters und der von ihnen gekauften Produkte.

Hier ist ein Beispiel für eine Abfrage, um diese Berechnung mit einer CTE durchzuführen:

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

Diese Abfrage verwendet eine CTE, die ein temporäres benanntes Ergebnis (Unterabfrage) ist, auf das in einer einzigen Abfrage verwiesen werden kann.

Die CTE ist als product_customers benannt. Sie wird mit einer SELECT-Anweisung erstellt, die die Spalten Name und Alter aus der Tabelle customer_data für Kunden abruft, die das Produkt 'widget' gekauft haben.

Indem Sie die Unterabfrage an den Anfang der Abfrage verschieben und ihr einen Namen geben, wird es einfacher zu verstehen, was die Abfrage tut. Wenn Ihre Unterabfrage einen Beispiel-Einbettungsvektor auswählt, könnten Sie Ihre Unterabfrage beispielsweise target_vector_embed nennen. Wenn Sie in der Hauptabfrage darauf verweisen, sehen Sie diesen Namen und wissen, worauf er sich bezieht.

Es ist auch hilfreich, wenn Sie eine lange Abfrage haben und die gleiche Logik an mehreren Stellen benötigen. Sie können sie oben in der Abfrage definieren und an mehreren Stellen in Ihrer Hauptabfrage darauf verweisen.

Verwenden Sie also CTEs, wann immer Sie eine Unterabfrage haben, um die Lesbarkeit Ihrer Abfrage zu verbessern.

# Unterabfragen (Subqueries)

Eine Unterabfrage ist ein einfacher SQL-Befehl, der in eine andere Abfrage eingebettet ist. Durch das Verschachteln von Abfragen können Sie größere Einschränkungen für die in das Ergebnis einbezogenen Daten festlegen.

Unterabfragen können an mehreren Stellen in einer Abfrage verwendet werden, aber es ist am einfachsten, mit der FROM-Anweisung zu beginnen. Hier ist ein Beispiel für eine grundlegende Unterabfrage:

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

Lassen Sie uns analysieren, was passiert, wenn Sie die obige Abfrage ausführen:

Zunächst führt die Datenbank die "innere Abfrage" aus - den Teil zwischen den Klammern. Wenn Sie dies unabhängig ausführen, erhalten Sie ein Ergebnis, das genauso aussieht wie bei jeder anderen Abfrage. Sobald die innere Abfrage ausgeführt wurde, wird die äußere Abfrage mit den Ergebnissen der inneren Abfrage als zugrunde liegender Tabelle ausgeführt:

SELECT sub.*
FROM (
  << Ergebnisse der inneren Abfrage hier einfügen >>
) sub
WHERE sub.column_1 = 'MyScaleDB';

Unterabfragen müssen Namen haben, die nach den Klammern hinzugefügt werden, ähnlich wie Sie einem regulären Tisch einen Alias hinzufügen würden. Diese Abfrage verwendet den Namen sub.

# Verwendung von Unterabfragen in bedingter Logik

Sie können Unterabfragen in bedingter Logik verwenden (in Verbindung mit WHERE, JOIN/ON oder CASE). Die folgende Abfrage gibt alle Einträge vom selben Datum wie der angegebene Eintrag im Datensatz zurück:

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

Diese Abfrage funktioniert, weil das Ergebnis der Unterabfrage nur eine Zelle ist. Die meisten bedingten Logiken funktionieren mit Unterabfragen, die Ergebnisse mit einer Zelle enthalten. Allerdings ist IN der einzige Typ von bedingter Logik, der funktioniert, wenn die innere Abfrage mehrere Ergebnisse enthält:

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

Beachten Sie, dass Sie beim Schreiben einer Unterabfrage in einer bedingten Anweisung keinen Alias angeben sollten. Dies liegt daran, dass die Unterabfrage als einzelner Wert (oder als Wertesatz in der IN-Klausel) behandelt wird und nicht als Tabelle.

# Tabellen verknüpfen (Joins)

Eine Verknüpfung erzeugt eine neue Tabelle, indem Spalten aus einer oder mehreren Tabellen kombiniert werden, indem gemeinsame Werte verwendet werden. Verschiedene Arten von Verknüpfungen sind wie folgt:

  • INNER JOIN: Es werden nur übereinstimmende Datensätze zurückgegeben.
  • LEFT JOIN: Gibt alle Datensätze aus der linken Tabelle und die übereinstimmenden Datensätze aus der rechten Tabelle zurück.
  • RIGHT JOIN: Gibt alle Datensätze aus der rechten Tabelle und die übereinstimmenden Datensätze aus der linken Tabelle zurück.
  • FULL JOIN: Gibt alle Datensätze aus beiden Tabellen zurück, wenn eine Übereinstimmung in der linken oder rechten Tabelle vorliegt.
  • CROSS JOIN: Erzeugt das kartesische Produkt ganzer Tabellen, da "Verknüpfungsschlüssel" nicht angegeben sind.
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

# Verwendung von komplexen SQL- und Vektor-Abfragen in MyScaleDB

Die SQL-Vektor-Datenbank MyScaleDB bietet mehrere Funktionen, die Ihnen bei komplexen SQL- und Vektor-Abfragen helfen. Schauen wir uns einige Beispiele an, die zeigen, wozu komplexe Abfragen in MyScaleDB in der Lage sind.

# Common Table Expressions (CTEs)

MyScaleDB unterstützt CTEs und ersetzt den im WITH-Klausel definierten Code für den Rest der SELECT-Abfrage. Benannte Unterabfragen können im aktuellen und im Kind-Abfragekontext überall dort verwendet werden, wo Tabellenobjekte erlaubt sind.

Die Vektor-Suche ist eine Suchmethode, bei der Daten als Vektoren dargestellt werden. Sie wird häufig in Anwendungen wie Bildsuche, Videosuche und Textsuche verwendet. MyScaleDB verwendet die Funktion distance(), um Vektor-Suchen durchzuführen. Sie berechnet den Abstand zwischen einem angegebenen Vektor und allen Vektordaten in einer angegebenen Spalte und liefert die besten Kandidaten zurück.

In einigen Fällen, wenn der angegebene Vektor aus einer anderen Tabelle stammt oder die Dimension des angegebenen Vektors groß ist und es umständlich ist, ihn darzustellen, können Sie CTE oder Unterabfrage verwenden.

Angenommen, Sie haben eine Vektortabelle namens photo, die Metadateninformationen enthält, die mit den Bildern der Fotobibliothek verknüpft sind, mit id, photo_id und photo_embed für den Merkmalsvektor.

Das folgende Beispiel behandelt das Ergebnis der Auswahl in einer CTE als Zielvektor, um eine Vektor-Suche auszuführen:

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;

# Verknüpfungen und Unterabfragen

Die Unterstützung für Verknüpfungen ist begrenzt, und es wird empfohlen, Unterabfragen als Workaround zu verwenden. In MyScaleDB basiert die Vektor-Suche auf dem Vektorindex in einer Tabelle mit einer Vektorspalte. Obwohl die distance()-Funktion in der SELECT-Klausel erscheint, wird ihr Wert während der Vektor-Suche in der Tabelle berechnet und nicht nach der Verknüpfung. Das Ergebnis der Verknüpfung entspricht möglicherweise nicht dem erwarteten Ergebnis.

Hier sind mögliche Workarounds:

  • Sie können das Abfrage-Muster distance()...WHERE...ORDER BY...LIMIT in Unterabfragen verwenden, die Vektorindizes nutzen, und auf Vektortabellen die erwarteten Ergebnisse erhalten.

  • Sie können auch Unterabfragen in der WHERE-Klausel verwenden, um die Verknüpfung umzuschreiben.

Angenommen, Sie haben eine weitere Tabelle photo_meta, die Informationen über die Bilder der Fotobibliothek enthält, mit photo_id, photo_author, year und title. Das folgende Beispiel ruft relevante Fotos aus einer Sammlung von Bildern ab, die 2023 aufgenommen wurden:

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;

Das passiert, wenn Sie die obige Abfrage ausführen:

  • Zuerst führt MyScaleDB eine Vektor-Suche in der Tabelle photos aus, um die erforderliche Spalte photo_id und den Wert der distance()-Funktion für die fünf relevantesten Datensätze zu erhalten:
SELECT photo_id, distance(photo_embed,[0.0269, 0.0316,...]) as dist
FROM photos
ORDER BY dist
LIMIT 5;
  • Dann wird die JOIN-Anweisung mit den Ergebnissen der Vektortabelle als zugrunde liegender Tabelle ausgeführt:
SELECT t1.photo_id, t1.dist
FROM (<< Ergebnisse der Vektortabelle hier einfügen >>) t1
JOIN photo_meta t2 ON t1.photo_id = t2.photo_id
WHERE t2.year = 2023;

Da die Vektor-Suche das Jahr, in dem die Fotos aufgenommen wurden, nicht berücksichtigt, kann das Ergebnis inkorrekt sein. Um das richtige Ergebnis zu erhalten, müssen wir die Verknüpfungsabfrage durch Verwendung einer Unterabfrage umschreiben:

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

# Verbessern Sie die Datenanalyse

Fortgeschrittene SQL-Techniken wie CTEs, Unterabfragen und Verknüpfungen können Ihnen helfen, komplexe Datenanalysen und -manipulationen mit größerer Präzision und Effizienz durchzuführen. MyScaleDB kombiniert die Leistungsfähigkeit von SQL und Vektoren, um einen leistungsstarken Ansatz zur Bewältigung komplexer KI-bezogener Fragen zu bieten. Mit MyScaleDB können Sie effizient traditionelle SQL- und Vektorabfragen auf strukturierten Daten und Vektordaten ausführen, um komplexe Abfragen zu bearbeiten und hochdimensionale Daten auf eine einheitliche und effiziente Weise zu analysieren.

Wenn Sie mehr erfahren möchten, folgen Sie uns auf X (Twitter) (opens new window) oder treten Sie unserer Discord (opens new window)-Community bei. Lassen Sie uns gemeinsam die Zukunft von Daten und KI gestalten!

Keep Reading

Start building your Al projects with MyScale today

Free Trial
Contact Us