Requêtes prises en charge pour les tables dynamiques¶
Les tables dynamiques prennent en charge les expressions SQL standard et les fonctions supportées par Snowflake, notamment les opérations mathématiques, les fonctions de chaîne, les fonctions de date, etc. Ce sujet décrit les expressions, les constructions, les fonctions, les opérateurs et les clauses que les tables dynamiques prennent en charge dans les modes d’actualisation incrémentielle et complète.
SSi une requête utilise des expressions, des mots-clés, des opérateurs ou des clauses qui ne sont pas pris en charge par l’actualisation incrémentielle, le processus d’actualisation automatisé utilise à la place une actualisation complète, , ce qui peut entraîner un coût supplémentaire.
Types de données pris en charge¶
Les tables dynamiques prennent en charge tous les types de données SQL Snowflake pour les actualisations incrémentielles et complètes, à l’exception de ce qui suit :
Types de données structurés
Types de données géospatiales (actualisation complète uniquement)
Prise en charge des requêtes en modes d’actualisation incrémentiel et complet¶
Mot clé |
Mode d’actualisation incrémentielle |
Mode d’actualisation complète |
|---|---|---|
Pris en charge |
Pris en charge |
|
Non pris en charge |
Non pris en charge |
|
Tables sources, vues, tables Apache Iceberg™ gérées par Snowflake et autres tables dynamiques. Les sous-requêtes en dehors des clauses FROM (par exemple, WHERE EXISTS) ne sont pas prises en charge. |
Pris en charge |
|
Pris en charge |
Pris en charge |
|
Pris en charge. Vous pouvez spécifier un nombre quelconque de tables dans la jointure, et les mises à jour de toutes les tables de la jointure sont reflétées dans les résultats de la requête. |
Pris en charge |
|
Pris en charge. Vous pouvez spécifier un nombre quelconque de tables dans la jointure, et les mises à jour de toutes les tables de la jointure sont reflétées dans les résultats de la requête. |
Pris en charge |
|
LATERAL JOIN |
Non pris en charge. Toutefois, vous pouvez utiliser LATERAL avec FLATTEN(). Par exemple : CREATE TABLE persons
AS
SELECT column1 AS id, parse_json(column2) AS entity
FROM values
(12712555,
'{ name: { first: "John", last: "Smith"},
contact: [
{ business:[
{ type: "phone", content:"555-1234" },
{ type: "email", content:"j.smith@example.com" } ] } ] }'),
(98127771,
'{ name: { first: "Jane", last: "Doe"},
contact: [
{ business:[
{ type: "phone", content:"555-1236" },
{ type: "email", content:"j.doe@example.com" } ] } ] }');
CREATE DYNAMIC TABLE my_dynamic_table
TARGET_LAG = DOWNSTREAM
WAREHOUSE = mywh
AS
SELECT p.id, f.value, f.path
FROM persons p,
LATERAL FLATTEN(input => p.entity) f;
Notez le comportement suivant lors de l’utilisation de l’aplatissement latéral avec le rafraîchissement incrémentiel :
|
Pris en charge. |
OUTER-EQUI JOIN. |
Pris en charge. Vous pouvez spécifier un nombre quelconque de tables dans la jointure, et les mises à jour de toutes les tables de la jointure sont reflétées dans les résultats de la requête. |
Pris en charge |
[{LEFT | RIGHT | FULL }] OUTER JOIN |
Ceci n’est pas pris en charge :
Autrement, vous pouvez spécifier un nombre quelconque de tables dans une jointure externe, et les mises à jour de toutes les tables de la jointure sont reflétées dans les résultats de la requête. |
Pris en charge |
Prises en charge dans la clause SELECT. |
Pris en charge |
|
Non pris en charge |
Non pris en charge |
|
Non pris en charge |
Non pris en charge |
|
Agrégats scalaires |
Pris en charge |
Pris en charge |
Expressions, y compris celles qui utilisent des fonctions intégrées déterministes et des fonctions définies par l’utilisateur immuables. |
Pris en charge |
|
Définir les opérateurs (UNION, MINUS, EXCEPT, INTERSECT) |
Non pris en charge, sauf pour UNION. Dans le cas d’une actualisation incrémentielle, l’opérateur d’ensemble UNION fonctionne comme une combinaison des opérateurs UNION ALL et SELECT DISTINCT. |
Pris en charge |
Non pris en charge |
Non pris en charge |
|
Tous les opérateurs de sous-requête. |
Non pris en charge |
Pris en charge |
Pris en charge |
Pris en charge |
|
Pris en charge, à l’exception des limites suivantes :
|
Pris en charge |
|
Pris en charge, à l’exception des limites suivantes :
|
Pris en charge |
|
Les filtres contenant les mêmes expressions que celles valables dans SELECT sont pris en charge. Les filtres utilisant les fonctions CURRENT_TIMESTAMP, CURRENT_TIME et CURRENT_DATE et leurs alias sont pris en charge. |
Pris en charge. Les filtres utilisant les fonctions CURRENT_TIMESTAMP, CURRENT_TIME et CURRENT_DATE et leurs alias sont pris en charge. |
|
Pris en charge, à l’exception des limites suivantes :
|
Pris en charge |
|
Les expressions de table communes (CTEs) qui utilisent des fonctionnalités d’actualisation incrémentielle dans la sous-requête sont prises en charge. WITH RECURSIVE n’est pas pris en charge. |
Pris en charge |
Prise en charge des fonctions non déterministes dans les modes d’actualisation incrémentielle et complète¶
Fonction non déterministe |
Mode d’actualisation incrémentielle |
Mode d’actualisation complète |
|---|---|---|
Non pris en charge |
Non pris en charge |
|
Prise en charge dans la clause SELECT. |
Pris en charge |
|
Prise en charge dans la clause SELECT. |
Pris en charge |
|
Non pris en charge |
Pris en charge |
|
CURRENT_DATE (et alias) |
Prise en charge uniquement dans le cadre d’une clause WHERE/HAVING/QUALIFY. |
Prise en charge uniquement dans le cadre d’une clause WHERE/HAVING/QUALIFY. |
Non pris en charge |
Pris en charge |
|
Non pris en charge |
Pris en charge |
|
CURRENT_TIME (et alias) |
Prise en charge uniquement dans le cadre d’une clause WHERE/HAVING/QUALIFY. |
Prise en charge uniquement dans le cadre d’une clause WHERE/HAVING/QUALIFY. |
CURRENT_TIMESTAMP (et alias) |
Prise en charge uniquement dans le cadre d’une clause WHERE/HAVING/QUALIFY. |
Prise en charge uniquement dans le cadre d’une clause WHERE/HAVING/QUALIFY. |
Des fonctions qui s’appuient sur CURRENT_USER. |
Non pris en charge. Les actualisations des tables dynamiques jouent le rôle de leur propriétaire avec un utilisateur SYSTEM spécial. |
Non pris en charge. Les actualisations des tables dynamiques jouent le rôle de leur propriétaire avec un utilisateur SYSTEM spécial. |
Non pris en charge |
Pris en charge |
|
Pris en charge |
Pris en charge |
|
Prise en charge dans la clause SELECT. |
Pris en charge |
|
Prise en charge dans la clause SELECT. |
Pris en charge |
|
Prise en charge dans la clause SELECT. |
Pris en charge |
|
Prise en charge dans la clause SELECT. |
Pris en charge |
|
Pris en charge |
Pris en charge |
|
Pris en charge |
Pris en charge |
|
Pris en charge |
Pris en charge |
|
Pris en charge |
Pris en charge |
|
Pris en charge |
Pris en charge |
|
Prise en charge dans la clause SELECT. |
Pris en charge |
|
Fonctions séquentielles (par exemple |
Non pris en charge |
Pris en charge |
Prise en charge dans la clause SELECT. |
Pris en charge |
|
Fonctions définies par l’utilisateur VOLATILE |
Non pris en charge |
Pris en charge |
Fonctions Snowflake Cortex AISQL prises en charge¶
Vous pouvez utiliser Snowflake Cortex AISQL (y compris les fonctions LLM) dans la clause SELECT pour les tables dynamiques en mode actualisation incrémentielle. Les mêmes restrictions de disponibilité que celles décrites dans Fonctions AISQL s’appliquent.
Cortex AISQL vous permet d’ajouter des informations alimentées par l’AI directement dans vos tables dynamiques, afin d’analyser automatiquement les données au fur et à mesure de leur mise à jour. Par exemple, il peut catégoriser les avis des clients, les tickets d’assistance ou les réponses aux enquêtes comme positifs ou négatifs, ou attribuer des catégories.
Dans l’exemple suivant, review_sentiment utilise AI_FILTER pour évaluer chaque avis avec un LLM. Cortex AISQL combine l’invite The reviewer enjoyed the restaurant avec le texte de l’avis. La colonne de sortie enjoyed correspond à la classification générée à l’aide de Cortex AISQL en fonction de l’invite et indique si le client a apprécié le restaurant.
CREATE OR REPLACE TABLE reviews AS
SELECT 'Wow... Loved this place.' AS review
UNION ALL
SELECT 'The pizza is not good.' AS review;
CREATE OR REPLACE DYNAMIC TABLE review_sentiment
TARGET_LAG = DOWNSTREAM
WAREHOUSE = mywh
REFRESH_MODE = INCREMENTAL
AS
SELECT review, AI_FILTER(CONCAT('The reviewer enjoyed the restaurant', review), {'model': 'llama3.1-70b'}) AS enjoyed FROM reviews;