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:
Festkommazahlen (z. B. INTEGER, NUMERIC)
DATE, TIME und TIMESTAMP
VARCHAR
BINARY
VARIANT, OBJECT und ARRAY
GEOGRAPHY.
Abfragen, die andere Typen von Werten beinhalten (z. B. FLOAT, GEOMETRY), profitieren nicht davon.
Unterstützte Prädikattypen¶
Die Suchoptimierung kann die Performance von Abfragen mit folgenden Arten von Prädikaten verbessern:
Weitere potenzielle Verbesserungen¶
Die Suchoptimierung kann auch die Leistung von Ansichten und Abfragen verbessern, die JOIN verwenden.
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.
Joins¶
Der Suchoptimierungsdienst verbessert die Leistung von Joins nicht direkt. Er kann jedoch die Leistung beim Filtern von Zeilen aus beiden Tabellen vor dem Join verbessern. Diese Verbesserung kann auftreten, wenn in der Tabelle die Suchoptimierung aktiviert und das Prädikat selektiv ist, wie unter Unterstützte Prädikattypen beschrieben.
Für beide Tabellen muss die Suchoptimierung nicht aktiviert sein. Die Entscheidung für die Suchoptimierung wird für jede Tabelle unabhängig getroffen.
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
Dynamische 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 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.