Identifizieren von Abfragen, die von der Suchoptimierung profitieren

Die Suchoptimierung kann die Performance vieler Abfragen verbessern. Unter diesem Thema werden die Merkmale der Arten von Abfragen beschrieben, bei denen die Suchoptimierung die meisten Vorteile bietet, und umgekehrt die Arten von Abfragen, von die nicht profitieren.

Allgemeine Abfragemerkmale

Die Suchoptimierung eignet sich am besten zur Verbesserung der Performance von Abfragen mit folgenden Merkmalen:

  • Die Abfrage bezieht sich auf eine oder mehrere Spalten, die keine primären Gruppierungsschlüssel sind.

  • Eine Abfrage, die normalerweise einige Sekunden oder länger dauert (ohne Anwendung der Suchoptimierung). In den meisten Fällen wird die Suchoptimierung die Leistung einer Abfrage mit einer Ausführungszeit von weniger als einer Sekunde nicht wesentlich verbessern.

  • Mindestens eine der Spalten, auf die die Filteroperation der Abfrage zugreift, hat 100.000 diskrete Werte oder mehr.

    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;
      
      Copy
    • Verwenden Sie COUNT(DISTINCT <Spaltenname>), um die tatsächliche Anzahl unterschiedlicher Werte zu erhalten:

      SELECT COUNT(DISTINCT c1), COUNT(DISTINCT c2) FROM test_table;
      
      Copy

    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.

Unterstützte Datentypen

Der Suchoptimierungsdienst unterstützt derzeit die folgenden Datentypen:

Abfragen, die andere Werte anderer Datentypen beinhalten (z. B. FLOAT oder GEOMETRY ), profitieren nicht davon.

Unterstützte Prädikattypen

Die Suchoptimierung kann die Performance von Abfragen mit folgenden Arten von Prädikaten verbessern:

Unterstützung für Sortierung

Die Suchoptimierung kann die Leistung von Abfragen auf Spalten, die mit einer COLLATE-Klausel definiert sind, je nach Suchmethode verbessern:

  • Wenn die Suchoptimierung für eine Spalte mit der Suchmethode EQUALITY aktiviert ist, wird jede Sortierungsspezifikation unterstützt.

  • Wenn die Suchoptimierung für eine Spalte mit der Suchmethode FULL_TEXT oder SUBSTRING aktiviert ist, werden die Sortierungsspezifikationen 'utf8' oder 'bin' unterstützt.

Weitere Informationen über Suchmethoden finden Sie unter ALTER TABLE … ADD SEARCH OPTIMIZATION.

Die Suchoptimierung unterstützt keine Prädikate, die die Sortierungsspezifikation einer Spalte mithilfe der Funktion COLLATE ändern.

Erstellen Sie zum Beispiel eine Tabelle mit Spalten, die Sortierungspezifikatione haben, und fügen Sie eine Zeile ein:

CREATE OR REPLACE TABLE search_optimization_collation_demo (
  en_ci_col VARCHAR COLLATE 'en-ci',
  utf_8_col VARCHAR COLLATE 'utf8');

INSERT INTO search_optimization_collation_demo VALUES (
  'test_collation_1',
  'test_collation_2');
Copy

Aktivieren Sie die Suchoptimierung für Gleichheitsprädikate für beide Spalten der Tabelle:

ALTER TABLE search_optimization_collation_demo
  ADD SEARCH OPTIMIZATION ON EQUALITY(en_ci_col, utf_8_col);
Copy

Die folgende Abfrage kann von der Suchoptimierung profitieren:

SELECT *
  FROM search_optimization_collation_demo
  WHERE utf_8_col = 'test_collation_2';
Copy

Die folgende Abfrage kann nicht von der Suchoptimierung profitieren, da sie die Sortierungsspezifikation der Spalte utf_8_col mithilfe der Funktion COLLATE ändert:

SELECT *
  FROM search_optimization_collation_demo
  WHERE utf_8_col COLLATE 'de-ci' = 'test_collation_2';
Copy

Die folgende Abfrage kann ebenfalls nicht von der Suchoptimierung profitieren. Basierend auf den Sortierregeln der Rangfolge wendet die Abfrage die 'de-ci' Sortierungsspezifikation auf die Spalte utf_8_col mit der Funktion COLLATE an.

SELECT *
  FROM search_optimization_collation_demo
  WHERE utf_8_col = 'test_collation_2' COLLATE 'de-ci';
Copy

Unterstützung für Apache Iceberg™-Tabellen

Die Suchoptimierung kann die Leistung von Abfragen auf Apache Iceberg™ Tabellen verbessern. Informationen zur Konfiguration der Suchoptimierung für Iceberg-Tabellen finden Sie unter ALTER ICEBERG TABLE.

Die folgenden Beschränkungen gelten für die Unterstützung der Suchoptimierung für Iceberg-Tabellen:

  • Die Suchoptimierung kann nicht für Spalten mit Datentypen hinzugefügt werden, die von Iceberg-Tabellen nicht unterstützt werden. Dazu gehören semistrukturierte Daten und geospatiale Datentypen. Weitere Informationen dazu finden Sie unter Datentypen für Apache Iceberg™-Tabellen.

  • Der Suchoptimierungsdienst unterstützt keine Spalten mit strukturierten Datentypen.

  • Wenn Apache Parquet™-Dateien zu groß sind (z. B. Hunderte von Megabytes komprimiert), können Abfragen in einigen Szenarien nicht in vollem Umfang vom Suchoptimierungsdienst profitieren.

Andere Beschränkungen, die für die Suchoptimierung für Snowflake-Tabellen gelten, gelten auch für Iceberg-Tabellen. Weitere Informationen dazu finden Sie unter Abfragen, die nicht von der Suchoptimierung profitieren.

Mögliche Verbesserungen für 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. Siehe Unterstützte Prädikattypen.

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

Abfragen, die nicht von der Suchoptimierung profitieren

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

Weiterhin unterstützt der Suchoptimierungsdienst Folgendes nicht:

  • Externe Tabellen

  • Materialisierte Ansichten

  • 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;
    
    Copy

    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';
    
    Copy

    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 angegeben, 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'
Copy

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