Verwenden des Suchoptimierungsdienstes

Der Suchoptimierungsdienst kann die Leistung bestimmter Typen von Such- und Analyseabfragen, die einen umfangreichen Satz von Prädikaten zur Filterung verwenden, erheblich verbessern.

Unter diesem Thema:

Grundlegendes zum Suchoptimierungsdienst

Der Suchoptimierungsdienst zielt darauf ab, die Leistung bestimmter Typen von Abfragen auf Tabellen erheblich zu verbessern. Dazu zählen:

  • Selektive Punktsuchabfragen auf Tabellen. Eine Punktsuchabfrage gibt nur eine oder eine geringe Anzahl unterschiedlicher Zeilen zurück. Typische Anwendungsfälle sind z. B.:

    • Geschäftsanwender, die schnelle Antwortzeiten bei kritischen Dashboards mit hochselektiven Filtern benötigen.

    • Datenwissenschaftler, die große Datenmengen untersuchen und nach bestimmten Teilmengen von Daten suchen.

    • Datenanwendungen, die eine kleine Ergebnismenge auf der Grundlage eines umfangreichen Satzes von Filterprädikaten abrufen.

  • Suche nach Teilzeichenfolgen und regulären Ausdrücken (z. B. LIKE, ILIKE, RLIKE usw.).

  • Abfragen von Feldern in Spalten vom Typ VARIANT, OBJECT oder ARRAY, die bestimmte Typen von Prädikaten verwenden (Gleichheitsprädikate, IN-Prädikate, Prädikate, die ARRAY_CONTAINS und ARRAYS_OVERLAP verwenden, und Prädikate, die auf NULL-Werte prüfen).

  • Abfragen, die ausgewählte Geodatenfunktionen mit GEOGRAPHY-Werten verwenden.

Sobald Sie die Abfragen identifiziert haben, die vom Suchoptimierungsdienst profitieren können, können Sie die Suchoptimierung für die in diesen Abfragen verwendeten Spalten und Tabellen konfigurieren.

Wie funktioniert der Suchoptimierungsdienst?

Um die Leistung bei der Punktsuche zu verbessern, stützt sich der Suchoptimierungsdienst auf eine persistente Datenstruktur, die als optimierter Suchzugriffspfad dient.

Ein im Hintergrund ausgeführter Wartungsdienst ist für die Erstellung und Pflege des Suchzugriffspfads verantwortlich:

  • Wenn Sie für eine Tabelle die Suchoptimierung konfigurieren, erstellt der Wartungsdienst den Suchzugriffspfad und füllt ihn mit den Daten, die zum Ausführen der Suchläufe erforderlich sind.

    Das Auffüllen von Daten kann abhängig von der Größe der Tabelle einige Zeit dauern. Der Dienst führt diese Arbeit im Hintergrund aus und blockiert keine gleichzeitigen Operationen in der Tabelle.

  • Wenn Daten in der Tabelle aktualisiert werden (z. B. durch Laden neuer Datasets oder durch DML-Operationen), aktualisiert der Wartungsdienst automatisch den Suchzugriffspfad, um die Änderungen an den Daten widerzuspiegeln.

    Wenn Abfragen ausgeführt werden, aber der Suchzugriffspfad noch nicht aktualisiert wurde, werden die Abfragen zwar möglicherweise langsamer ausgeführt, aber es werden immer aktuelle Ergebnisse zurückgegeben.

Suchzugriffspfad und Wartungsdienst sind für den Benutzer transparent. Sie müssen kein Warehouse für den Dienst erstellen, der den Suchzugriffspfad verwaltet.

Beachten Sie jedoch, dass bei diesem Dienst Kosten für Speicher- und Computeressourcen anfallen. Weitere Details dazu finden Sie unter Verwalten der Kosten des Suchoptimierungsdienstes (unter diesem Thema).

Berücksichtigung anderer Lösungen zur Optimierung der Abfrageleistung

Der Suchoptimierungsdienst ist eine von mehreren Möglichkeiten zur Optimierung der Abfrageleistung. Verwandte Techniken sind:

  • Clustering von Tabellen

  • Erstellen von materialisierten Ansichten (gruppiert oder nicht gruppiert)

Jede dieser Optionen hat unterschiedliche Vorteile, wie die folgende Tabelle zeigt:

Feature

Unterstützte Abfragetypen

Andere Anwendungsfälle

Suchoptimierungsdienst

Der Suchoptimierungsdienst kann die Performance dieser Suchtypen für die unterstützten Datentypen verbessern.

Materialisierte Ansicht

  • Gleichheitssuche

  • Bereichssuche

  • Sort operations.

Hinweis: Die Performance kann nur für die Teilmenge der Zeilen und Spalten verbessert werden, die in der materialisierten Ansicht enthalten sind.

Materialisierte Ansichten können auch verwendet werden, um verschiedene Gruppierungsschlüssel in derselben Quelltabelle (oder einer Teilmenge dieser Tabelle) oder in Verbindung mit dem Vereinfachen (Flattening) von JSON-/Variant-Daten zu definieren.

Clustering der Tabelle

  • Gleichheitssuche

  • Bereichssuche

Hinweis: Eine Tabelle kann jedoch nur auf einem einzigen Schlüssel gruppiert werden (der eine oder mehrere Spalten oder Ausdrücke umfassen kann).

In der folgenden Tabelle wird zeigt, welche dieser drei Optimierungsverfahren Speicher- oder Computekosten verursachen:

Speicherkosten

Computekosten

Suchoptimierungsdienst

Materialisierte Ansicht

Clustering der Tabelle

1

1

Der Reclustering-Prozess kann die Größe des Fail-safe-Speichers erhöhen, da bestehende Partitionen in neue Partitionen umgeschrieben werden. (Beachten Sie, dass bei diesem Prozess keine neuen Zeilen eingefügt werden. Es werden lediglich die vorhandenen Zeilen umorganisiert.) Weitere Details dazu finden Sie unter Auswirkung von Reclustering auf Credit- und Speicherverbrauch.

Welche Zugriffssteuerungsrechte sind für den Suchoptimierungsdienst erforderlich?

Um die Suchoptimierung einer Tabelle hinzuzufügen, zu konfigurieren oder zu entfernen, müssen Sie über die folgenden Berechtigungen verfügen:

  • Berechtigung OWNERSHIP für die Tabelle

  • Berechtigung ADD SEARCH OPTIMIZATION für das Schema, das die Tabelle enthält

    GRANT ADD SEARCH OPTIMIZATION ON SCHEMA <schema_name> TO ROLE <role>
    

Um den Suchoptimierungsdienst für eine Abfrage zu verwenden, benötigen Sie nur die SELECT-Berechtigung für die Tabelle.

Sie benötigen keine zusätzlichen Berechtigungen. Da SEARCH OPTIMIZATION eine Tabelleneigenschaft ist, wird sie beim Abfragen einer Tabelle automatisch erkannt und (falls zutreffend) verwendet.

Identifizieren der Tabellen, die von der Suchoptimierung profitieren

Die Suchoptimierung ist besonders wirkungsvoll bei der Verbesserung der Leistung von Abfragen, die häufig auf anderen Spalten als dem primären Clusterschlüssel der Tabelle ausgeführt werden.

Vom Suchoptimierungsdienst unterstützte Datentypen ermitteln

Der Suchoptimierungsdienst unterstützt derzeit bestimmte Typen von Abfragen für die folgenden Datentypen:

  • Festkommazahlen (z. B. INTEGER, NUMERIC)

  • DATE, TIME und TIMESTAMP

  • VARCHAR

  • BINARY

  • VARIANT, OBJECT und ARRAY (Dieses Feature befindet sich in der Vorschau.)

  • GEOGRAPHY. (Dieses Feature befindet sich in der Vorschau.)

Derzeit unterstützt der Suchoptimierungsdienst keine Gleitkomma-Datentypen oder andere Datentypen, die oben nicht aufgeführt sind. Snowflake bietet möglicherweise in Zukunft Unterstützung von weiteren Datentypen.

Der Suchoptimierungsdienst unterstützt auch keine Sortierungen.

Abfragen identifzieren, die von der Suchoptimierung profitieren

Die Suchoptimierung eignet sich am besten zur Verbesserung der Leistung bei folgenden Abfragetypen:

  • Eine Abfrage, die normalerweise einige Sekunden oder länger dauert.

  • Mindestens eine der Spalten, auf die über die Abfragefilteroperation zugegriffen wird, weist mindestens 100.000–200.000 diskrete Werte auf.

    Um die Anzahl der unterschiedlichen Werte zu bestimmen, können Sie eine der folgenden Methoden verwenden:

    • Verwenden Sie APPROX_COUNT_DISTINCT, um die ungefähre Anzahl unterschiedlicher Werte zu erhalten:

      select approx_count_distinct(column1) from table1;
      
    • Verwenden Sie COUNT(DISTINCT <Spaltenname>), um die tatsächliche Anzahl unterschiedlicher Werte zu erhalten:

      select count(distinct c1), count (distinct c2)  from test_table;
      

    Da Sie nur eine Annäherung an die Anzahl der unterschiedlichen Werte benötigen, sollten Sie APPROX_COUNT_DISTINCT verwenden, das im Allgemeinen schneller und kostengünstiger als COUNT(DISTINCT <Spaltenname>) ist.

Die Suchoptimierung kann die Leistung bei folgender Typen von Abfragen verbessern:

Gleichheits- oder IN-Prädikate

Der Suchoptimierungsdienst kann die Leistung von Abfragen verbessern, die Folgendes verwenden:

  • Gleichheitsprädikate (z. B. <Spaltenname> = <Konstante>).

  • Prädikate, die IN verwenden (siehe Beispiel).

Teilzeichenfolgen und reguläre Ausdrücke

Der Suchoptimierungsdienst kann die Leistung von Abfragen mit Prädikaten verbessern, die nach Teilzeichenfolgen suchen oder reguläre Ausdrücke verwenden. Dazu zählen Prädikate, die Folgendes verwenden:

Der Suchoptimierungsdienst kann die Leistung bei der Suche nach Teilzeichenfolgen verbessern, die 5 oder mehr Zeichen lang sind. (Selektivere Teilzeichenfolgen können zu einer besseren Leistung führen.)

Der Suchoptimierungsdienst verwendet beispielsweise keine Suchzugriffspfade für das folgende Prädikat, da die Teilzeichenfolge kürzer als 5 Zeichen ist:

LIKE '%TEST%'

Für das folgende Prädikat kann der Suchoptimierungsdienst die Abfrage optimieren, indem für die Suche nach den Teilzeichenfolgen für SEARCH und OPTIMIZED Suchzugriffspfade verwendet werden. Die Suchzugriffspfade werden jedoch nicht für IS verwendet, da die Teilzeichenfolge kürzer als 5 Zeichen ist.

LIKE '%SEARCH%IS%OPTIMIZED%'

Bei Abfragen, die RLIKE, REGEXP und REGEXP_LIKE verwenden:

  • Das Argument subject muss eine TEXT-Spalte in einer Tabelle sein, bei der die Suchoptimierung aktiviert ist.

  • Das Argument pattern muss eine Zeichenfolgenkonstante sein.

Bei regulären Ausdrücken funktioniert der Suchoptimierungsdienst in folgenden Fällen am besten:

  • Das Muster enthält mindestens ein Teilzeichenfolgen-Literal, das 5 oder mehr Zeichen lang ist.

  • Das Muster gibt an, dass die Teilzeichenfolge mindestens einmal vorkommen muss.

Das folgende Muster legt zum Beispiel fest, dass string ein oder mehrere Male im „subject“ vorkommen soll:

RLIKE '(string)+'

Der Suchoptimierungsdienst kann die Leistung von Abfragen mit den folgenden Mustern verbessern, da jedes Prädikat angibt, dass eine Teilzeichenfolge aus 5 oder mehr Zeichen mindestens einmal vorkommen muss. (Beachten Sie, dass im ersten Beispiel eine Zeichenfolgenkonstanten in Dollarzeichen verwendet wird, damit die Backslash-Zeichen nicht mit Escapezeichen umschlossen werden müssen.)

RLIKE $$.*email=[\w\.]+@snowflake\.com.*$$
RLIKE '.*country=(Germany|France|Spain).*'
RLIKE '.*phone=[0-9]{3}-?[0-9]{3}-?[0-9]{4}.*'

Im Gegensatz dazu verwendet der Suchoptimierungsdienst keine Suchzugriffspfade bei Abfragen mit den folgenden Mustern:

  • Muster ohne Teilzeichenfolgen:

    RLIKE '.*[0-9]{3}-?[0-9]{3}-?[0-9]{4}.*'
    
  • Muster, die nur Teilzeichenfolgen enthalten, die weniger als 5 Zeichen enthalten:

    RLIKE '.*tel=[0-9]{3}-?[0-9]{3}-?[0-9]{4}.*'
    
  • Muster, die den Optionsoperator verwenden, wobei eine Option eine Teilzeichenfolge ist, die weniger als 5 Zeichen enthält:

    RLIKE '.*(option1|option2|opt3).*'
    
  • Muster, bei denen die Teilzeichenfolge optional ist:

    RLIKE '.*[a-zA-z]+(string)?[0-9]+.*'
    

Auch wenn die Teilzeichenfolgen-Literale weniger als 5 Zeichen enthalten, kann der Suchoptimierungsdienst die Abfrageleistung verbessern, wenn die Erweiterung des regulären Ausdrucks ein Teilzeichenfolgen-Literal ergibt, das 5 Zeichen oder mehr enthält.

Betrachten Sie beispielsweise folgendes Muster:

.*st=(CA|AZ|NV).*(-->){2,4}.*

Bei diesem Beispiel ist Folgendes zu beachten:

  • Obwohl die Teilzeichenfolgen-Literale (z. B. st=, CA usw.) kürzer als 5 Zeichen sind, erkennt der Suchoptimierungsdienst, dass die Teilzeichenfolgen st=CA, st=AZ oder st=NV (die jeweils 5 Zeichen lang sind) im Text vorkommen müssen.

  • Auch wenn das Teilzeichenfolgen-Literal --> kürzer als 5 Zeichen ist, stellt der Suchoptimierungsdienst fest, dass die Teilzeichenfolge -->--> (die länger als 5 Zeichen ist) im Text auftreten muss.

Der Suchoptimierungsdienst kann Suchzugriffspfade verwenden, um diese Teilzeichenfolgen abzugleichen, was die Leistung der Abfrage verbessern kann.

Felder in VARIANT-Spalten

Der Suchoptimierungsdienst kann die Leistung von Punktsuchabfragen auf semistrukturierten Daten von Snowflake-Tabellen (Daten in VARIANT-, OBJECT- und ARRAY- Spalten) verbessern.

Wenn bei Spalten einer Tabelle die VARIANT-Unterstützung für den Suchoptimierungsdienst konfiguriert ist, schließt der Suchoptimierungsdienst automatisch VARIANT-, OBJECT- und ARRAY-Spalten in einen Suchzugriffspfad ein. Dies gilt sogar für Spalten, deren Struktur tief verschachtelt ist und sich häufig ändert.

In den nächsten Abschnitten finden Sie weitere Details dazu:

Unterstützte Datentypen für Konstanten und Umwandlungen in Prädikaten für VARIANT-Typen

Der Suchoptimierungsdienst kann die Leistung von Abfragen von semistrukturierten Daten verbessern, bei denen die folgenden Typen für Konstanten und für die implizite oder explizite Umwandlung von Elementen verwendet werden:

  • FIXED (einschließlich Umwandlungen, die eine gültige Genauigkeit und Skalierung angeben)

  • INTEGER

  • TEXT

  • DATE (einschließlich Umwandlungen, die eine Skalierung angeben)

  • TIME (einschließlich Umwandlungen, die eine Skalierung angeben)

  • TIMESTAMP TIMESTAMP_LTZ, TIMESTAMP_NTZ, TIMESTAMP_TZ (einschließlich Umwandlungen, die eine Skalierung angeben)

Der Suchoptimierungsdienst unterstützt die Umwandlung von Typen mit:

Unterstützung der Umwandlung von VARIANT-Werten in TEXT

Der Suchoptimierungsdienst kann auch die Leistung von Abfragen verbessern, bei denen VARIANT-Spalten in TEXT umgewandelt und mit in TEXT umgewandelten Konstanten verglichen werden.

Angenommen, src ist eine VARIANT-Spalte, die Boolesche, Datums- und Zeit-Werte enthält, die in VARIANT konvertiert worden sind:

create or replace TABLE test_table
(
    ID INTEGER,
    SRC VARIANT
);

insert into test_table select 1, to_variant('true'::boolean);          -- BOOLEAN
insert into test_table select 2, to_variant('2020-01-09'::date);       -- DATE
insert into test_table select 3, to_variant('01:02:03.899213'::time);  -- TIME

Bei dieser Tabelle kann der Suchoptimierungsdienst die folgenden Abfragen verbessern, bei denen die VARIANT-Spalte in TEXT umgewandelt und die Spalte mit Zeichenfolgenkonstante verglichen wird:

select * from test_table where src::TEXT = 'true';
select * from test_table where src::TEXT = '2020-01-09';
select * from test_table where src::TEXT = '01:02:03.899213';

Unterstützte Prädikate für VARIANT-Typen

Der Suchoptimierungsdienst kann Abfragen mit den unten aufgeführten Typen von Prädikaten verbessern. In den folgenden Beispielen ist src die VARIANT-Spalte und path_to_variant_field ist ein Pfad zu einem Feld in der VARIANT-Spalte.

  • Gleichheitsprädikate im folgenden Format:

    where path_to_variant_field[::target_data_type] = constant


    target_data_type (falls angegeben) und der Datentyp von constant müssen einen der oben aufgeführten unterstützten Typen aufweisen.

    Beachten Sie, dass :: nur ein Beispiel für eine der unterstützten Möglichkeiten zur Umwandlung des Werts in einen bestimmten Typ ist.

    Der Suchoptimierungsdienst unterstützt beispielsweise Folgendes:

    • Abgleich eines Elements mit einer NUMBER-Konstante ohne explizite Umwandlung des Elements.

      where src:person.age = 42;
      
    • Explizite Umwandlung eines Elements in NUMBER mit einer bestimmten Genauigkeit und Skalierung.

      where src:location.temperature::NUMBER(8, 6) = 23.456789;
      
    • Abgleich eines Elements mit einer TEXT-Konstante ohne explizite Umwandlung des Elements.

      where src:sender_info.ip_address = '123.123.123.123';
      
    • Explizite Umwandlung eines Elements in TEXT.

      where src:salesperson.name::TEXT = 'John Appleseed';
      
    • Explizite Umwandlung eines Elements in DATE.

      where src:events.date::DATE = '2021-03-26';
      
    • Explizite Umwandlung eines Elements in TIME mit einer bestimmten Skalierung.

      where src:events.time_info::TIME(6) = '01:02:03.456789';
      
    • Explizite Umwandlung eines Elements in TIMESTAMP mit einer bestimmten Skalierung.

      where src:event_logs.exceptions.timestamp_info(3) = '2021-03-26 15:00:00.123 -0800';
      
  • Prädikate, die ARRAY-Funktionen verwenden, wie z. B.:


    • where ARRAY_CONTAINS(constant::VARIANT, path_to_variant_field)

      constant darf nicht NULL sein, und der Datentyp von constant muss einen der oben aufgeführten unterstützten Typen aufweisen.

      Beachten Sie, dass :: nur ein Beispiel für eine der unterstützten Möglichkeiten zur Umwandlung des Werts in einen bestimmten Typ ist.

      Beispiel:

      where ARRAY_CONTAINS('77.146.211.88'::VARIANT, src:logs.ip_addresses)
      
    • where ARRAYS_OVERLAP(ARRAY_CONSTRUCT(constant_1, constant_2, .., constant_N), path_to_variant_field)

      Der Datentyp jeder Konstanten (constant_1, constant_2 usw.) muss einer der oben aufgeführten unterstützten Typen sein. Das konstruierte ARRAY kann NULL-Konstanten enthalten.

      Beispiel:

      where ARRAYS_OVERLAP(
          ARRAY_CONSTRUCT('122.63.45.75', '89.206.83.107'), src:senders.ip_addresses)
      
  • Die folgenden Prädikate, die auf NULL-Werte prüfen:

    • where IS_NULL_VALUE(path_to_variant_field)

      Beachten Sie, dass IS_NULL_VALUE für JSON-Nullwerte und nicht für SQL-NULL-Werte gilt.

    • where path_to_variant_field IS NOT NULL

    • where variant_column IS NULL

      wobei sich variant_column auf die Spalte und nicht auf einen Pfad zu einem Element in den semistrukturierten Daten bezieht.

      So unterstützt der Suchoptimierungsdienst beispielsweise die Verwendung der VARIANT-Spalte src, nicht aber den Pfad zum Feld src:person:age in dieser VARIANT-Spalte.

Aktuelle Einschränkungen bei der Unterstützung von VARIANT-Typen

Die Unterstützung von VARIANT-Typen im Suchoptimierungsdienst unterliegt derzeit den folgenden Einschränkungen:

  • Prädikate, die XMLGET verwenden, werden nicht unterstützt.

  • Prädikate der Form variant_field IS NULL werden nicht unterstützt.

  • Prädikate, bei denen die Konstanten die Ergebnisse von skalaren Unterabfragen sind, werden nicht unterstützt.

  • Prädikate, die Pfade zu Elementen angeben, die Unterelemente enthalten, werden nicht unterstützt.

Die aktuell für den Suchoptimierungsdienst geltenden Einschränkungen gelten auch für dieses Feature.

Geodatenfunktionen

Der Suchoptimierungsdienst kann die Leistung von Abfragen mit Prädikaten verbessern, bei denen Geodatenfunktionen mit GEOGRAPHY-Objekten verwendet werden. Weitere Details dazu finden Sie in den folgenden Abschnitten:

Bemerkung

GEOMETRY-Objekte werden noch nicht unterstützt.

Unterstützte Prädikate mit Geodatenfunktionen

Für Abfragen mit Prädikaten, die die folgenden Funktionen verwenden:

Der Suchoptimierungsdienst kann die Leistung verbessern, wenn Folgendes gilt:

  • Ein Eingabeausdruck ist eine GEOGRAPHY-Spalte in einer Tabelle.

  • Der andere Eingabeausdruck ist eine GEOGRAPHY-Konstante (die durch eine Konvertierung oder eine Konstruktorfunktion erstellt wird).

  • Für ST_DWITHIN ist das Distanzargument eine nicht negative REAL-Konstante.

Da der Suchoptimierungsdienst für Prädikate konzipiert ist, die sehr selektiv sind, und da Prädikate nach der Nähe zwischen Geodatenobjekten filtern, kann das Clustering von Geodatenobjekten nach Nähe in der Tabelle zu einer besseren Leistung führen. So können Sie beispielsweise die GEOGRAPHY-Werte nach ihren ST_GEOHASH-Werten oder nach einer Kombination der Koordinaten des Zentroids oder des Begrenzungsrahmens der Objekte gruppieren.

Beachten Sie, dass für dieses Feature die gleichen Einschränkungen gelten wie für den Suchoptimierungsdienst.

Beispiele für die Verwendung von Geodatenfunktionen

Mit den folgenden Anweisungen wird die Tabelle erstellt und konfiguriert, die in den Beispielen dieses Abschnitts verwendet wird:

CREATE OR REPLACE TABLE geospatial_table (id NUMBER, g1 GEOGRAPHY);
INSERT INTO geospatial_table VALUES
  (1, 'POINT(-122.35 37.55)'),
  (2, 'LINESTRING(-124.20 42.00, -120.01 41.99)'),
  (3, 'POLYGON((0 0, 2 0, 2 2, 0 2, 0 0))');
ALTER TABLE geospatial_table ADD SEARCH OPTIMIZATION;
Beispiele für unterstützte Prädikate

Die folgende Abfrage ist ein Beispiel für eine vom Suchoptimierungsdienst unterstützte Abfrage. Der Suchoptimierungsdienst kann Suchzugriffspfade verwenden, um die Leistung dieser Abfrage zu verbessern:

SELECT id FROM geospatial_table WHERE
  ST_INTERSECTS(
    g1,
    TO_GEOGRAPHY('POLYGON((0 0, 1 0, 1 1, 0 1, 0 0))'));

Im Folgenden finden Sie Beispiele für zusätzliche Prädikate, die vom Suchoptimierungsdienst unterstützt werden:

...
  ST_INTERSECTS(
    TO_GEOGRAPHY('POLYGON((0 0, 1 0, 1 1, 0 1, 0 0))'),
    g1)
...
  ST_CONTAINS(
    TO_GEOGRAPHY('POLYGON((-74.17 40.64, -74.1796875 40.58, -74.09 40.58, -74.09 40.64, -74.17 40.64))'),
    g1)
...
  ST_CONTAINS(
    g1,
    TO_GEOGRAPHY('MULTIPOINT((0 0), (1 1))'))
...
  ST_WITHIN(
   TO_GEOGRAPHY('{"type" : "MultiPoint","coordinates" : [[-122.30, 37.55], [-122.20, 47.61]]}'),
   g1)
...
  ST_WITHIN(
    g1,
    TO_GEOGRAPHY('POLYGON((0 0, 1 0, 1 1, 0 1, 0 0))'))
...
  ST_COVERS(
    TO_GEOGRAPHY('POLYGON((-1 -1, -1 4, 4 4, 4 -1, -1 -1))'),
    g1)
...
  ST_COVERS(
    g1,
    TO_GEOGRAPHY('POINT(0 0)'))
...
  ST_COVEREDBY(
    TO_GEOGRAPHY('POLYGON((1 1, 2 1, 2 2, 1 2, 1 1))'),
    g1)
...
  ST_COVEREDBY(
    g1,
    TO_GEOGRAPHY('POINT(-122.35 37.55)'))
...
  ST_DWITHIN(
    TO_GEOGRAPHY('POLYGON((0 0, 1 0, 1 1, 0 1, 0 0))'),
    g1,
    100000)
...
  ST_DWITHIN(
    g1,
    TO_GEOGRAPHY('POLYGON((0 0, 1 0, 1 1, 0 1, 0 0))'),
    100000)
Beispiele für die Konstruktion von GEOGRAPHY-Konstanten

Im Folgenden sind Beispiele für Prädikate aufgeführt, die verschiedene Umwandlungs- und Konstruktorfunktionen für die GEOGRAPHY-Konstante verwenden.

...
  ST_INTERSECTS(
    g1,
    ST_GEOGRAPHYFROMWKT('POLYGON((0 0, 1 0, 1 1, 0 1, 0 0))'))
...
  ST_INTERSECTS(
    ST_GEOGFROMTEXT('POLYGON((0 0, 1 0, 1 1, 0 1, 0 0))'),
    g1)
...
  ST_CONTAINS(
    ST_GEOGRAPHYFROMEWKT('POLYGON((-74.17 40.64, -74.1796875 40.58, -74.09 40.58, -74.09 40.64, -74.17 40.64))'),
    g1)
...
  ST_WITHIN(
    ST_GEOGRAPHYFROMWKB('01010000006666666666965EC06666666666C64240'),
    g1)
...
  ST_COVERS(
    g1,
    ST_MAKEPOINT(0.2, 0.8))
...
  ST_INTERSECTS(
    g1,
    ST_MAKELINE(
      TO_GEOGRAPHY('MULTIPOINT((0 0), (1 1))'),
      TO_GEOGRAPHY('POINT(0.8 0.2)')))
...
  ST_INTERSECTS(
    ST_POLYGON(
      TO_GEOGRAPHY('SRID=4326;LINESTRING(0.0 0.0, 1.0 0.0, 1.0 2.0, 0.0 2.0, 0.0 0.0)')),
    g1)
...
  ST_WITHIN(
    g1,
    TRY_TO_GEOGRAPHY('POLYGON((-1 -1, -1 4, 4 4, 4 -1, -1 -1))'))
...
  ST_COVERS(
    g1,
    ST_GEOGPOINTFROMGEOHASH('s00'))

Konjunktionen von unterstützten Prädikaten (AND)

Bei Abfragen, die Konjunktionen von Prädikaten (d. h. AND) verwenden, kann die Abfrageleistung durch Suchoptimierung verbessert werden, wenn eines der Prädikate die oben genannten Bedingungen erfüllt.

Angenommen, eine Abfrage ist wie folgt definiert:

where condition_x and condition_y

Die Suchoptimierung kann die Leistung verbessern, wenn eine der Bedingungen einige Zeilen separat zurückgibt (d. h. condition_x gibt einige Zeilen zurück oder condition_y gibt einige Zeilen zurück).

Wenn condition_x einige Zeilen zurückgibt, aber condition_y viele Zeilen zurückgibt, kann die Abfrageleistung von der Suchoptimierung profitieren.

Siehe diese zusätzlichen Beispiele.

Disjunktionen von unterstützten Prädikaten (OR)

Bei Abfragen, die Disjunktionen von Prädikaten (d. h. OR) verwenden, kann die Abfrageleistung durch Suchoptimierung verbessert werden, wenn alle Prädikate die oben genannten Bedingungen erfüllt.

Angenommen, eine Abfrage ist wie folgt definiert:

where condition_x or condition_y

Die Suchoptimierung kann die Leistung verbessern, wenn jede Bedingung separat einige Zeilen zurückgibt (d. h. condition_x gibt einige Zeilen zurück und condition_y gibt einige Zeilen zurück).

Wenn condition_x einige Zeilen zurückgibt, aber condition_y viele Zeilen zurückgibt, profitiert die Abfrageleistung nicht von der Suchoptimierung.

Bei Disjunktionen ist jedes isolierte Prädikat für sich nicht entscheidend für die Abfrage. Die anderen Prädikate müssen ausgewertet werden, bevor festgestellt werden kann, ob die Suchoptimierung die Leistung verbessern kann.

Joins

Der Suchoptimierungsdienst kann die Leistung von Abfragen verbessern, bei denen eine kleine Tabelle mit einer großen Tabelle verknüpft wird. Weitere Details dazu finden Sie unter Aktivieren des Suchoptimierungsdienstes zur Verbesserung der Leistung von Verknüpfungen (Joins).

Ansichten

Der Suchoptimierungsdienst kann indirekt die Leistung von Ansichten (inkl. sichere Ansichten) verbessern. Wenn für die Basistabelle einer Ansicht die Suchoptimierung aktiviert ist und die Abfrage ein selektives Prädikat für diese Tabelle verwendet, kann der Suchoptimierungsdienst die Leistung beim Filtern von Zeilen verbessern.

Die Suchoptimierung muss nicht für alle Tabellen in der Ansicht aktiviert sein. Die Suchoptimierung wird für jede Tabelle unabhängig durchgeführt.

Tabellen mit Maskierungsrichtlinien und Zeilenzugriffsrichtlinien

Der Suchoptimierungsdienst kann die Performance von Abfragen auf Tabellen verbessern, die Maskierungsrichtlinien und Zeilenzugriffsrichtlinien verwenden.

Beachten Sie, dass bei einer Zeilenzugriffsrichtlinie, die einen Filter verwendet, der vom Suchoptimierungsdienst nicht unterstützt wird, der Suchoptimierungsdienst diesen Filter nicht für das Pruning (Verkürzen) verwendet, sondern dafür alle anderen unterstützten Filter in der Abfrage verwendet. In solchen Fällen kann die Effizienz des Prunings (Verkürzens) auf das Vorhandensein der im Abfragefilter angegebenen Werte verweisen, selbst wenn die Abfrage aufgrund der Zeilenzugriffsrichtlinie keine Ergebnisse liefert.

Vom Suchoptimierungsdienst nicht unterstützte Abfragen

Der Suchoptimierungsdienst unterstützt Folgendes nicht:

  • Externe Tabellen

  • Materialisierte Ansichten

  • Spalten, die mit einer COLLATE-Klausel definiert sind

  • Verketten von Spalten

  • Analytische Ausdrücke

  • Umwandlungen auf Tabellenspalten (außer für Festkommazahlen, die in Zeichenfolgen umgewandelt werden).

    Obwohl die Suchoptimierung Prädikate mit impliziten und expliziten Umwandlungen auf Konstantenwerten unterstützt, werden keine Prädikate unterstützt, die Werte in der tatsächlichen Tabellenspalte umwandeln (außer für Umwandlungen von INTEGER und NUMBER in VARCHAR).

    Die folgenden Prädikate werden beispielsweise unterstützt, da sie die implizite und explizite Umwandlung von Konstantenwerten verwenden (nicht Werten in der Tabellenspalte):

    -- Supported predicate
    -- (where the string '2020-01-01' is implicitly cast to a date)
    WHERE timestamp1 = '2020-01-01';
    
    
    -- Supported predicate
    -- (where the string '2020-01-01' is explicitly cast to a date)
    WHERE timestamp1 = '2020-01-01'::date;
    

    Das folgende Prädikat wird nicht unterstützt, da es eine Umwandlung von Werten in der Tabellenspalte verwendet:

    -- Unsupported predicate
    -- (where values in a VARCHAR column are cast to DATE)
    WHERE to_date(varchar_column) = '2020-01-01';
    

    Der Suchoptimierungsdienst berücksichtigt die ursprünglichen Spaltenwerte und nicht die Werte nach der Umwandlung. Daher wird der Suchoptimierungsdienst nicht für Abfragen mit diesen Prädikaten verwendet.

Wie bereits erwähnt, ist die Ausnahme von dieser Regel das Umwandeln von NUMBER- oder INTEGER-Werten in VARCHAR-Werte in der Tabellenspalte. Der Suchoptimierungsdienst unterstützt diesen Typ von Prädikat:

-- Supported predicate
-- (where values in a numeric column are cast to a string)
WHERE cast(numeric_column as varchar) = '2'

Die Suchoptimierung verbessert nicht die Leistung von Abfragen, die Time Travel verwenden, da die Suchoptimierung nur für aktive Daten funktioniert.

Der Abfragebeschleunigungsdienst beschleunigt keine Abfragen auf Tabellen, für die der Suchoptimierungsdienst aktiviert ist.

Konfigurieren der Suchoptimierung für eine Tabelle

Bemerkung

Das Hinzufügen einer Suchoptimierung zu einer großen Tabelle (mit Terabytes (TB) oder mehr an Daten) kann zu einem sofortigen Anstieg des Credit-Verbrauchs über einen kurzen Zeitraum führen.

Wenn Sie einer Tabelle eine Suchoptimierung hinzufügen, beginnt der Wartungsdienst sofort im Hintergrund mit dem Aufbau der Suchzugriffspfade für die Tabelle. Wenn die Tabelle groß ist, kann der Wartungsdienst diese Arbeit massiv parallelisieren, was in kurzer Zeit zu erhöhten Kosten führen kann.

Bevor Sie die Suchoptimierung einer großen Tabelle hinzufügen, führen Sie eine Kostenschätzung durch, damit Sie wissen, was Sie zu erwarten haben.

Um die Suchoptimierung zu einer Tabelle hinzuzufügen, verwenden Sie den Befehl ALTER TABLEADD SEARCH OPTIMIZATION. Dadurch werden Suchzugriffspfade eingerichtet, um die Leistung von Gleichheits- und IN-Prädikatsabfragen für alle Spalten zu verbessern, die die unterstützten Datentypen verwenden.

Wenn Sie die Leistung für andere Abfragetypen verbessern möchten oder mehr Kontrolle darüber benötigen, welche Spalten für die Suchoptimierung konfiguriert werden, verwenden Sie die ON-Klausel im Befehl ALTER TABLE … ADD SEARCH OPTIMIZATION.

In der ON-Klausel in ADD SEARCH OPTIMIZATION geben Sie an, welche Spalten für die Suchoptimierung aktiviert werden sollen. Wenn Sie die Suchoptimierung für eine bestimmte Spalte aktivieren, können Sie auch eine Abfragemethode angeben (z. B. Gleichheits- oder IN-Suche).

Um die Kosten für die Suchoptimierung zu verwalten, können Sie die Suchoptimierung von bestimmten Spalten entfernen, für die keine Suchoptimierung erforderlich ist.

Da der Suchoptimierungsdienst zusätzliche Typen von Prädikaten und Datentypen unterstützt (z. B. Teilzeichenfolgen und reguläre Ausdrücke, GEOGRAPHY, Felder in VARIANTs), können Sie angeben, welche Spalten so konfiguriert werden sollen, dass sie von dieser Unterstützung profitieren.

In den nächsten Abschnitten wird erläutert, wie Sie die Suchoptimierung für eine Tabelle konfigurieren:

Konfigurieren der Suchoptimierung für bestimmte Spalten

Um die Suchoptimierung für eine bestimmte Spalte zu konfigurieren, verwenden Sie den Befehl ALTER TABLEADD SEARCH OPTIMIZATION mit der ON-Klausel.

Bemerkung

Zum Ausführen dieses Befehls müssen Sie die Rolle verwenden, die über Berechtigungen zum Hinzufügen der Suchoptimierung zu der Tabelle verfügt.

Die ON-Klausel gibt an, dass Sie die Suchoptimierung für bestimmte Spalten konfigurieren möchten. Weitere Informationen zur Syntax finden Sie im Abschnitt zu ALTER TABLE … ADD SEARCH OPTIMIZATION.

Bemerkung

Wenn Sie nur die Suchoptimierung für Gleichheits- und IN-Prädikate auf allen anwendbaren Spalten der Tabelle anwenden möchten, finden Sie unter Hinzufügen der Suchoptimierung zur gesamten Tabelle weitere Informationen.

Nachdem Sie diesen Befehl ausgeführt haben, können Sie überprüfen, ob die Spalten für die Suchoptimierung konfiguriert wurden.

Die nächsten Abschnitte enthalten Beispiele, die zeigen, wie Sie die Konfiguration für die Suchoptimierung angeben:

Beispiel: Unterstützung von Gleichheits- und IN-Prädikaten für bestimmte Spalten

Um die Suche mit Gleichheitsprädikaten für die Spalten c1, c2 und c3 in der Tabelle t1 zu optimieren, führen Sie die folgende Anweisung aus:

ALTER TABLE t1 ADD SEARCH OPTIMIZATION ON EQUALITY(c1, c2, c3);

Sie können dieselbe Suchmethode auch mehrmals in der ON-Klausel angeben:

-- This statement is equivalent to the previous statement.
ALTER TABLE t1 ADD SEARCH OPTIMIZATION ON EQUALITY(c1), EQUALITY(c2, c3);

Beispiel: Unterstützung von Gleichheits- und IN-Prädikaten für alle anwendbaren Spalten

Um die Suche mit Gleichheitsprädikaten für die alle anwendbaren Spalten der Tabelle zu optimieren, führen Sie die folgende Anweisung aus:

ALTER TABLE t1 ADD SEARCH OPTIMIZATION ON EQUALITY(*);

Beachten Sie Folgendes:

Beispiel: Unterstützung unterschiedlicher Typen von Prädikaten

Um die Suche mit Gleichheitsprädikaten für die Spalten c1 und c2 und die Teilzeichenfolge-Suche für die Spalte c3 zu optimieren, führen Sie die folgende Anweisung aus:

ALTER TABLE t1 ADD SEARCH OPTIMIZATION ON EQUALITY(c1, c2), SUBSTRING(c3);

Beispiel: Unterstützung von Gleichheits- und IN-Prädikaten für ein VARIANT-Feld

Um die Suche mit Gleichheitsprädikaten auf dem VARIANT-Feld uuid zu optimieren, das im Feld user der VARIANT-Spalte c4 verschachtelt ist, führen Sie die folgende Anweisung aus:

ALTER TABLE t1 ADD SEARCH OPTIMIZATION ON EQUALITY(c4:user:uuid);

Hinzufügen der Suchoptimierung zur gesamten Tabelle

Wenn Sie nur EQUALITY für alle Spalten der unterstützten Datentypen (außer VARIANT) angeben möchten, verwenden Sie den Befehl ALTER TABLEADD SEARCH OPTIMIZATION ohne ON-Klausel.

Bemerkung

Zum Ausführen dieses Befehls müssen Sie die Rolle verwenden, die über Berechtigungen zum Hinzufügen der Suchoptimierung zu der Tabelle verfügt.

Beispiel:

alter table test_table add search optimization;

Weitere Informationen dazu finden Sie im Abschnitt zur Suchoptimierung in ALTER TABLE.

Nachdem Sie diesen Befehl ausgeführt haben, können Sie überprüfen, ob die Spalten für die Suchoptimierung konfiguriert wurden.

Beachten Sie Folgendes:

  • Nachdem Sie diesen Befehl ausgeführt haben, werden alle Spalten, die der Tabelle später hinzugefügt werden, ebenfalls für EQUALITY konfiguriert.

  • Wenn Sie ALTER TABLE … { ADD | DROP } SEARCH OPTIMIZATION mit der ON-Klausel auf derselben Tabelle ausführen, werden alle Spalten, die der Tabelle später hinzugefügt werden, nicht automatisch für EQUALITY konfiguriert.

    Sie müssen ALTER TABLE … ADD SEARCH OPTIMIZATION ON … ausführen, um diese neu hinzugefügten Spalten für EQUALITY zu konfigurieren.

Überprüfen, ob Tabelle für Suchoptimierung konfiguriert ist

So überprüfen Sie, ob die Tabelle und deren Spalten für die Suchoptimierung konfiguriert wurden:

  1. Geben Sie die Konfiguration der Suchoptimierung für die Tabelle und deren Spalten aus.

  2. Führen Sie den SHOW TABLES-Befehl aus, um zu überprüfen, ob die Suchoptimierung hinzugefügt wurde, und um festzustellen, in welchem Umfang die Tabelle optimiert wurde:

    Beispiel:

    SHOW TABLES LIKE '%test_table%';
    

    In der Ausgabe dieses Befehls:

    • Prüfen Sie, ob SEARCH_OPTIMIZATION auf ON gesetzt ist, was darauf hinweist, dass die Suchoptimierung hinzugefügt wurde.

    • Überprüfen Sie den Wert von SEARCH_OPTIMIZATION_PROGRESS. Dieser gibt den Prozentsatz der Tabelle an, der bisher optimiert wurde.

      Wenn die Suchoptimierung zum ersten Mal zu einer Tabelle hinzugefügt wird, zeigen sich die Leistungsvorteile nicht sofort. Der Suchoptimierungsdienst beginnt mit dem Auffüllen von Daten im Hintergrund. Die Vorteile zeigen sich nach und nach, bis die Wartung den aktuellen Stand der Tabelle erreicht.

      Bevor Sie eine Abfrage ausführen, um zu überprüfen, ob die Suchoptimierung funktioniert, warten Sie, bis dieser Wert anzeigt, dass die Tabelle vollständig optimiert wurde.

  3. Führen Sie eine Abfrage aus, um zu überprüfen, ob die Suchoptimierung funktioniert.

    Beachten Sie, dass das Snowflake-Optimierungsprogramm automatisch entscheidet, ob der Suchoptimierungsdienst für eine bestimmte Abfrage verwendet wird. Benutzer können nicht steuern, für welche Abfragen die Suchoptimierung verwendet wird.

    Wählen Sie eine Abfrage aus, die der Suchoptimierungsdienst optimieren soll. Siehe Identifizieren der Tabellen, die von der Suchoptimierung profitieren.

  4. Zeigen Sie auf der Web-UI den Abfrageplan für diese Abfrage an, und stellen Sie sicher, dass der Abfrageknoten „Search Optimization Access“-Teil des Abfrageplans ist.

Aktivieren des Suchoptimierungsdienstes zur Verbesserung der Leistung von Verknüpfungen (Joins)

Bemerkung

Dieses Feature wird in verschiedenen Regionen eingeführt. Eine Liste der Regionen, in denen dieses Feature aktiviert ist, finden Sie unter Feature-Rollout: Unterstützung von Verknüpfungen (Joins) im Suchoptimierungsdienst.

Der Suchoptimierungsdienst kann die Leistung von Abfragen verbessern, bei denen eine große Tabelle mit einer oder mehreren kleinen Tabellen verknüpft wird (z. B. eine Faktentabelle mit mehreren Dimensionstabellen).

Angenommen, product ist eine Tabelle, die eine Zeile für jedes Produkt enthält, und sales eine Tabelle, die eine Zeile für jeden Verkauf eines Produkts enthält. product enthält weniger Zeilen und ist kleiner als sales. Um alle Verkäufe eines bestimmten Produkts zu ermitteln, verknüpfen Sie die Tabelle sales (die größere Tabelle) mit der Tabelle product (die kleinere Tabelle). Der Suchoptimierungsdienst kann die Leistung dieses Typs von Verknüpfung verbessern.

Bemerkung

Im Data Warehousing wird die große Tabelle häufig als Faktentabelle bezeichnet. Die kleine Tabelle wird als Dimensionstabelle bezeichnet. Im Folgenden werden unter diesem Thema diese Begriffe verwendet, wenn in der Verknüpfung auf die große Tabelle und die kleine Tabelle Bezug genommen wird.

Damit der Suchoptimierungsdienst die Leistung von Verknüpfungen verbessern kann, wird der Faktentabelle (der größeren der beiden Tabellen) die Suchoptimierung hinzugefügt.

Um die Vorteile der Suchoptimierung zu nutzen, muss die Dimensionstabelle (die kleinere der beiden Tabellen) nur wenige diskrete Werte haben. Die Kosten für die Suchoptimierung einer Abfrage sind proportional zur Anzahl der diskreten Werte, nach denen in der Faktentabelle gesucht werden muss. Wenn die Anzahl der diskreten Werte in der Dimensionstabelle zu groß ist, entscheidet sich Snowflake möglicherweise gegen die Verwendung des Suchzugriffspfads und verwendet stattdessen den regulären Tabellenzugriffspfad.

Unterstützte Verknüpfungsprädikate

Der Suchoptimierungsdienst kann die Leistung von Abfragen mit den folgenden Typen von Verknüpfungsprädikaten verbessern:

  • Gleichheitsprädikate der Form dimension_table.column = fact_table.column.

  • Transformationen auf der Seite des Prädikats mit der Dimension (z. B. Zeichenfolgenverkettung, Addition usw.).

  • Konjunktionen (AND) von mehreren Gleichheitsprädikaten.

Beispiele für unterstützte Abfragen mit Verknüpfungen (Joins)

In diesem Abschnitt werden Beispiele für Abfragen aufgeführt, die von einer Suchoptimierung bei Verknüpfungen (Joins) profitieren können.

Beispiel: Einfaches Gleichheitsprädikat als Verknüpfungsprädikat

Es folgt ein Beispiel für eine unterstützte Abfrage, die ein einfaches Gleichheitsprädikat als Verknüpfungsprädikat verwendet. Bei dieser Abfrage wird die Faktentabelle sales mit der Dimensionstabelle product verknüpft. Für die sehr große Faktentabelle ist die Suchoptimierung aktiviert. Die Datenmenge, die aus der Dimensionstabelle stammt, ist aufgrund des Auswahlfilters auf der Spalte category sehr gering.

SELECT sales.date, product.name
FROM sales JOIN product ON (sales.product_id = product.id)
WHERE product.category = 'Cutlery';

Beispiel: Verknüpfungsprädikat, das auf Dimensionsseite transformiert wird

Abfragen, die die Seite des Prädikats mit der Dimension transformieren (z. B. Multiplizieren), können ebenfalls von der Suchoptimierung profitieren:

SELECT sales.date, product.name
FROM sales JOIN product ON (sales.product_id = product.old_id * 100)
WHERE product.category = 'Cutlery';

Beispiel: Verknüpfungsprädikat, das sich über mehrere Spalten erstreckt

Abfragen, bei denen sich ein Verknüpfungsprädikat über mehrere Spalten erstreckt, werden ebenfalls unterstützt:

SELECT sales.date, product.name
FROM sales JOIN product ON (sales.product_id = product.id and sales.location = product.place_of_production)
WHERE product.category = 'Cutlery';

Beispiel: Abfrage mit Point-Lookup-Filtern und Verknüpfungsprädikaten

Bei einer Abfrage, die sowohl reguläre Point-Lookup-Filter als auch Verknüpfungsprädikate verwendet, kann der Suchoptimierungsdienst die Leistung von beiden verbessern. In der folgenden Abfrage verbessert der Suchoptimierungsdienst das Point-Lookup-Prädikat sales.location sowie das Verknüpfungsprädikat product_id.

SELECT sales.date, product.name
FROM sales JOIN product ON (sales.product_id = product.id)
WHERE product.category = 'Cutlery'
AND sales.location = 'Buenos Aires';

Einschränkungen bei der Unterstützung von Verknüpfungen (Joins)

  • Disjunktionen (OR) werden in Verknüpfungsprädikaten derzeit nicht unterstützt.

  • Verknüpfungsprädikate LIKE/ILIKE/RLIKE werden derzeit nicht unterstützt.

  • Verknüpfungsprädikate auf Variant-Spalten werden derzeit nicht unterstützt.

  • EQUAL_NULL-Gleichheitsprädikate werden nicht unterstützt.

  • Die aktuell für den Suchoptimierungsdienst geltenden Einschränkungen gelten auch für dieses Feature.

Anzeigen der Suchoptimierungskonfiguration für eine Tabelle

Um die Konfiguration der Suchoptimierung für eine Tabelle anzuzeigen, verwenden Sie den Befehl DESCRIBE SEARCH OPTIMIZATION.

Angenommen, Sie führen die folgende Anweisung aus, um die Suchoptimierung für eine Spalte zu konfigurieren:

ALTER TABLE t1 ADD SEARCH OPTIMIZATION ON EQUALITY(c1);

Das Ausführen von DESCRIBE SEARCH OPTIMIZATION ergibt die folgende Ausgabe:

DESCRIBE SEARCH OPTIMIZATION ON t1;

+---------------+----------+--------+------------------+--------+
| expression_id |  method  | target | target_data_type | active |
+---------------+----------+--------+------------------+--------+
| 1             | EQUALITY | C1     | NUMBER(38,0)     | true   |
+---------------+----------+--------+------------------+--------+

Verwalten der Kosten des Suchoptimierungsdienstes

Der Suchoptimierungsdienst wirkt sich auf die Kosten für Speicher- und Computeressourcen aus:

  • Speicherressourcen: Der Suchoptimierungsdienst erstellt eine Datenstruktur für den Suchzugriffspfad, die Platz bei jeder Tabelle benötigt, für die die Suchoptimierung aktiviert ist. Die Speicherkosten für den Suchzugriffspfad hängen von mehreren Faktoren ab, darunter:

    • Anzahl unterschiedlicher Werte (NDVs) in der Tabelle. Im Extremfall, wenn alle Spalten Datentypen haben, die den Suchzugriffspfad verwenden, und alle Datenwerte in jeder Spalte eindeutig sind, kann der erforderliche Speicher so groß sein wie die Größe der Originaltabelle.

      In der Regel beträgt die Größe jedoch ungefähr 1/4 der ursprünglichen Tabellengröße.

  • Computeressourcen:

    • Das Hinzufügen einer Suchoptimierung zu einer Tabelle verbraucht Ressourcen.

    • Die Wartung des Suchoptimierungsdienstes erfordert ebenfalls Ressourcen. Der Ressourcenverbrauch ist höher, wenn eine hohe Änderungsrate vorliegt (d. h. wenn sich große Datenmengen in der Tabelle ändern). Diese Kosten sind in etwa proportional zur Menge der aufgenommenen (hinzugefügten oder geänderten) Daten. Löschungen verursachen ebenfalls einige Kosten.

      Mit Automatic Clustering kann zwar die Latenz von Abfragen auf Tabellen mit Suchoptimierung verbessert werden, aber die Wartungskosten für die Suchoptimierung werden weiter erhöht. Wenn eine Tabelle eine hohe Änderungsrate hat, kann das Aktivieren des automatischen Clusterings und das Konfigurieren der Suchoptimierung für die Tabelle zu höheren Wartungskosten führen, als wenn die Tabelle nur für die Suchoptimierung konfiguriert ist.

      Snowflake stellt jedoch eine effiziente Credit-Nutzung sicher, indem nur die tatsächlich verwendeten Ressourcen in Rechnung gestellt werden. Die Abrechnung erfolgt in Schritten von 1 Sekunde.

      Die Kosten pro Computestunde finden Sie in der Tabelle „Serverless Feature Credits Table“ unter Snowflake Service Consumption Table.

      Sobald Sie den Suchoptimierungsdienst aktiviert haben, können Sie die Kosten für Ihre Nutzung des Dienstes anzeigen.

Tipp

Snowflake empfiehlt, dieses Feature langsam einzuführen (d. h. die Suchoptimierung zunächst nur für wenige Tabellen hinzuzufügen) und Kosten und Nutzen genau zu überwachen.

Abschätzen der Kosten

Verwenden Sie die Funktion SYSTEM$ESTIMATE_SEARCH_OPTIMIZATION_COSTS, um die Kosten für das Hinzufügen der Suchoptimierung zu einer Tabelle und das Konfigurieren bestimmter Spalten für die Suchoptimierung abzuschätzen.

Im Allgemeinen sind die Kosten proportional zur:

  • Anzahl der Tabellen, für die das Feature aktiviert ist, und Anzahl der diskreten Werte in diesen Tabellen.

  • Datenmenge, die sich in diesen Tabellen ändert.

Anzeigen der Kosten

Sie können die Abrechnungskosten für den Suchoptimierungsdienst über die Weboberfläche oder mit SQL anzeigen. Siehe Untersuchen der Computekosten.

Senken der Kosten

Sie können die Kosten des Suchoptimierungsdienstes steuern, indem Sie sorgfältig die Tabellen auswählen, für die die Suchoptimierung aktiviert werden soll.

Außerdem können Sie die Kosten des Suchoptimierungsdienstes wie folgt senken:

  • Snowflake empfiehlt für DML-Operationen auf der Tabelle die Verwendung von Batches:

    • DELETE: Wenn in Tabellen Daten für den letzten Zeitraum (z. B. den letzten Tag, die letzte Woche oder den letzten Monat) gespeichert sind und Sie die Tabelle durch Löschen alter Daten verkleinern, muss der Suchoptimierungsdienst die Aktualisierungen berücksichtigen. In einigen Fällen können Sie Kosten ggf. senken, indem Sie Löschoperationen seltener ausführen (z. B. täglich anstatt stündlich).

    • INSERT, UPDATE und MERGE: Durch Verwenden von Batches für diese DML-Anweisungen auf der Tabelle können die Kosten zur Wartung des Suchoptimierungsdienstes gesenkt werden.

  • Wenn Sie ein Reclustering der gesamten Tabelle durchführen möchten, müssen Sie vor dem Reclustering erst die SEARCH OPTIMIZATION-Eigenschaft für diese Tabelle löschen und nach dem Reclustering die SEARCH OPTIMIZATION-Eigenschaft wieder zu der Tabelle hinzufügen.

Entfernen der Suchoptimierung aus bestimmten Spalten oder aus der gesamten Tabelle

Sie können die Suchoptimierungskonfiguration für bestimmte Spalten entfernen, oder Sie können die SEARCH OPTIMIZATION-Eigenschaft für die gesamte Tabelle entfernen.

Löschen der Suchoptimierung für bestimmte Spalten

Um die Konfiguration der Suchoptimierung für bestimmte Spalten zu löschen, verwenden Sie den folgenden Befehl: ALTER TABLEDROP SEARCH OPTIMIZATION mit ON-Klausel.

Angenommen, die Ausführung des Befehls DESCRIBE SEARCH OPTIMIZATION gibt die folgenden Ausdrücke aus:

DESCRIBE SEARCH OPTIMIZATION ON t1;

+---------------+-----------+-----------+-------------------+--------+
| expression_id |  method   | target    | target_data_type  | active |
+---------------+-----------+-----------+-------------------+--------+
|             1 | EQUALITY  | C1        | NUMBER(38,0)      | true   |
|             2 | EQUALITY  | C2        | VARCHAR(16777216) | true   |
|             3 | EQUALITY  | C4        | NUMBER(38,0)      | true   |
|             4 | EQUALITY  | C5        | VARCHAR(16777216) | true   |
|             5 | EQUALITY  | V1        | VARIANT           | true   |
|             6 | SUBSTRING | C2        | VARCHAR(16777216) | true   |
|             7 | SUBSTRING | C5        | VARCHAR(16777216) | true   |
|             8 | GEO       | G1        | GEOGRAPHY         | true   |
|             9 | EQUALITY  | V1:"key1" | VARIANT           | true   |
|            10 | EQUALITY  | V1:"key2" | VARIANT           | true   |
+---------------+-----------+-----------+-------------------+--------+

Um die Suchoptimierung für Teilzeichenfolgen auf Spalte c2 zu löschen, führen Sie die folgende Anweisung aus:

ALTER TABLE t1 DROP SEARCH OPTIMIZATION ON SUBSTRING(c2);

Um die Suchoptimierung für alle Methoden auf Spalte c5 zu löschen, führen Sie die folgende Anweisung aus:

ALTER TABLE t1 DROP SEARCH OPTIMIZATION ON c5;

Da die Spalte c5 für die Optimierung von Gleichheits- und Teilzeichenfolgen-Suche konfiguriert ist, wird mit der obigen Anweisung die Konfiguration für Gleichheits- und Teilzeichenfolgen-Suche für c5 gelöscht.

Um die Suchoptimierung für Gleichheit auf Spalte c1 und auch die durch die Ausdrucks-IDs 6 und 8 angegebene Konfiguration zu löschen, führen Sie die folgende Anweisung aus:

ALTER TABLE t1 DROP SEARCH OPTIMIZATION ON EQUALITY(c1), 6, 8;

Weitere Informationen dazu finden Sie im Abschnitt zu ALTER TABLE … DROP SEARCH OPTIMIZATION.

Entfernen der Suchoptimierung aus der Tabelle

So entfernen Sie die SEARCH OPTIMIZATION-Eigenschaft aus einer Tabelle:

  1. Wechseln Sie zu einer Rolle mit Berechtigungen zum Entfernen der Suchoptimierung aus der Tabelle.

  2. Führen Sie den Befehl ALTER TABLEDROP SEARCH OPTIMIZATION ohne ON-Klausel aus:

    ALTER TABLE [IF EXISTS] <table_name> DROP SEARCH OPTIMIZATION;
    

    Beispiel:

    alter table test_table drop search optimization;
    

    Weitere Informationen dazu finden Sie im Abschnitt zu ALTER TABLE … DROP SEARCH OPTIMIZATION.

Beispiele

Der folgende Code zeigt die Erstellung und Verwendung eines Suchoptimierungsdienstes.

Beginnen Sie, indem Sie eine Tabelle mit Daten erstellen:

create or replace table test_table (id int, c1 int, c2 string, c3 date) as
select * from values
  (1, 3, '4',  '1985-05-11'),
  (2, 4, '3',  '1996-12-20'),
  (3, 2, '1',  '1974-02-03'),
  (4, 1, '2',  '2004-03-09'),
  (5, null, null,  null);

Fügen Sie die SEARCH OPTIMIZATION-Eigenschaft zur Tabelle hinzu.

alter table test_table add search optimization;

Die folgenden Abfragen können den Suchoptimierungsdienst verwenden:

select * from test_table where id = 2;
select * from test_table where c2 = '1';
select * from test_table where c3 = '1985-05-11';
select * from test_table where c1 is null;
select * from test_table where c1 = 4 and c3 = '1996-12-20';

Bei der folgenden Abfrage kann der Suchoptimierungsdienst verwendet werden, da die implizite Umwandlung auf der Konstante und nicht auf der Spalte erfolgt:

select * from test_table where c2 = 2;

Im Folgenden kann der Suchoptimierungsdienst nicht verwendet werden, da die Umwandlung auf der Tabellenspalte erfolgt:

select * from test_table where cast(c2 as number) = 2;

Eine IN-Klausel wird vom Suchoptimierungsdienst unterstützt:

select id, c1, c2, c3
    from test_table
    where id IN (2, 3)
    order by id;

Wenn einzelne Prädikate vom Suchoptimierungsdienst unterstützt werden, können sie mit der Konjunktion AND verknüpft werden und werden dennoch vom Suchoptimierungsdienst unterstützt:

select id, c1, c2, c3
    from test_table
    where c1 = 1
       and
          c3 = TO_DATE('2004-03-09')
    order by id;

DELETE und UPDATE (und MERGE) sind ebenfalls mit dem Suchoptimierungsdienst kompatibel:

delete from test_table where id = 3;
update test_table set c1 = 99 where id = 4;
Zurück zum Anfang