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;
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 alsCOUNT(DISTINCT <Spaltenname>)
ist.
Unterstützte Datentypen¶
Der Suchoptimierungsdienst unterstützt derzeit die folgenden Datentypen:
Datentypen für Festkommazahlen (zum Beispiel INTEGER und NUMERIC)
Zeichenfolgen- und Binärdatentypen (zum Beispiel VARCHAR und BINARY)
Datentypen für Datum und Uhrzeit (zum Beispiel DATE, TIME und TIMESTAMP)
Semistrukturierte Datentypen (zum Beispiel VARIANT, OBJECT und ARRAY)
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
oderSUBSTRING
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');
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);
Die folgende Abfrage kann von der Suchoptimierung profitieren:
SELECT *
FROM search_optimization_collation_demo
WHERE utf_8_col = 'test_collation_2';
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';
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';
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;
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 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'
Die Suchoptimierung verbessert nicht die Leistung von Abfragen, die Time Travel verwenden, da die Suchoptimierung nur für aktive Daten funktioniert.