Erläuterungen zum Beseitigen redundanter Join-Verknüpfungen durch Snowflake

In einigen Fällen kann eine Verknüpfung über eine Schlüsselspalte auf Tabellen verweisen, die für den Join nicht benötigt werden. Wenn Ihre Tabellen über Schlüsselspalten verfügen und Sie die Einschränkungen UNIQUE, PRIMARY KEY und FOREIGN KEY verwenden und durchsetzen, kann Snowflake die Abfrageleistung verbessern, indem unnötige Joins auf Schlüsselspalten vermieden werden.

Diese Optimierungen werden nur ausgeführt, wenn Sie die Einschränkungseigenschaft RELY verwenden, um anzugeben, dass die Daten in Ihren Tabellen den Einschränkungen hinsichtlich Primär- und Fremdschlüssel entsprechen.

Unter diesem Thema:

Einstellen der RELY-Einschränkungseigenschaft zum Beseitigen unnötiger Join-Verknüpfungen

Snowflake führt diese Optimierung bei Joins nur dann durch, wenn Sie angeben, dass die Daten in Ihren Tabellen den Einschränkungen UNIQUE, PRIMARY KEY und FOREIGN KEY entsprechen.

Wie unter Unterstützte Einschränkungstypen erwähnt, erzwingt Snowflake die UNIQUE-, PRIMARY KEY- und FOREIGN KEY-Einschränkungen nicht. Für die Durchsetzung dieser Einschränkungen auf den Daten der Tabelle sind Sie verantwortlich.

Wenn Sie sichergestellt haben, dass die Daten diesen Einschränkungen entsprechen, und Sie möchten, dass Snowflake unnötige Verknüpfungen beseitigt, setzen Sie die Einschränkungseigenschaft RELY auf die Einschränkungen UNIQUE, PRIMARY KEY und FOREIGN KEY.

Bemerkung

Sie sind für die Wahrung der Integrität Ihrer Einschränkungen (UNIQUE, PRIMARY KEY und FOREIGN KEY) verantwortlich. Wenn die Integrität Ihrer Einschränkungen nicht aufrechterhalten wird, können die Abfrageergebnisse bei Einstellung der Einschränkungseigenschaft RELY abweichend sein (im Vergleich zu Ergebnissen mit NORELY).

Beispiele für das Beseitigen unnötiger Join-Verknüpfungen

Die folgenden Beispiele zeigen, in welchen Fällen Snowflake nicht benötigte Joins und Verweise auf Tabellen beseitigt:

Weitere Beispiele:

  • dim_products ist eine Tabelle, die für jedes zum Kauf angebotene Produkt eine Zeile enthält.

    In dieser Tabelle ist product_id die Spalte, die ein Produkt eindeutig identifiziert.

  • fact_sales ist eine Tabelle, die für jeden Verkauf eines Produkts eine Zeile enthält.

    In dieser Tabelle ist product_id die Spalte, die das verkaufte Produkt identifiziert. Die IDs in dieser Spalte entsprechen den IDs in der Spalte product_id der Tabelle dim_products.

Beispiel 1: Beseitigen einer unnötigen linken äußeren Verknüpfung (Left Outer Join)

Im Folgenden finden Sie ein Beispiel für eine unnötige linke äußere Verknüpfung, die von Snowflake optimiert werden kann:

SELECT f.*
FROM fact_sales f
LEFT OUTER JOIN dim_products p
ON f.product_id = p.product_id;
Copy

Die Verknüpfung ist unnötig, da sich die Anweisung auf keine der Spalten in der Tabelle dim_products auf der rechten Seite bezieht (außer der Primärschlüsselspalte für die Verknüpfung).

Wenn die dim_products.product_id-Spalte die UNIQUE- oder PRIMARY KEY-Einschränkung mit RELY-Eigenschaft hat, kann Snowflake diese Verknüpfung als unnötig identifizieren und den Verweis auf die dim_products-Tabelle auf der rechten Seite entfernen.

Beispiel 2: Beseitigen einer unnötigen Selbstverknüpfung

Im folgenden Beispiel liegt eine unnötige Selbstverknüpfung (Self-Join) vor, die von Snowflake optimiert werden kann:

SELECT p1.product_id, p2.product_name
FROM dim_products p1, dim_products p2
WHERE p1.product_id = p2.product_id;
Copy

Die Anweisung verknüpft unnötigerweise die Tabelle dim_products mit sich selbst und wählt Spalten in dieser Tabelle aus.

Wenn die dim_products.product_id-Spalte die UNIQUE- oder PRIMARY KEY-Einschränkung mit RELY-Eigenschaft hat, kann Snowflake diese Verknüpfung als unnötig identifizieren und den Verweis auf die dim_products-Tabelle auf der rechten Seite entfernen.

Beispiel 3: Beseitigen einer unnötigen Join-Verknüpfung auf einem Primärschlüssel und Fremdschlüssel

Im Folgenden finden Sie ein Beispiel für eine unnötige innere Verknüpfung, die von Snowflake optimiert werden kann.

SELECT p.product_id, f.units_sold
FROM   fact_sales f, dim_products p
WHERE  f.product_id = p.product_id;
Copy

Die Anweisung verweist auf der rechten Seite auf kein der Spalten der Tabelle dim_products, mit Ausnahme der Primärschlüsselspalte für die Verknüpfung.

Wenn die Spalte dim_products.product_id die PRIMARY KEY-Einschränkung und die Spalte fact_sales.product_id die FOREIGN KEY-Einschränkung hat, kann Snowflake diese Verknüpfung als unnötig erkennen und den Verweis auf die Tabelle dim_products auf der rechten Seite entfernen.