À propos des domaines de confidentialité

Dans la confidentialité différentielle de Snowflake, un domaine de confidentialité définit les valeurs possibles dans une colonne, de manière similaire à un domaine mathématique. Un domaine de confidentialité est soit une plage de valeurs avec un minimum et un maximum, soit une liste de valeurs.

Le domaine de confidentialité est un facteur que Snowflake utilise pour calculer la quantité de bruit qui doit être ajoutée pour préserver la confidentialité. Pour cette raison, la plupart des domaines devraient avoir un domaine de confidentialité fini, sinon, la quantité de bruit ajoutée devrait être infinie. Par défaut, les champs sans domaines de confidentialité sont supposés avoir un domaine infini.

Quelles colonnes ont besoin d’un domaine de confidentialité ?

À l’exception d’une fonction COUNT, une requête ne peut pas agréger une colonne à moins que la colonne n’ait un domaine de confidentialité. De même, une requête ne peut pas utiliser une colonne dans une clause GROUP BY sauf si la colonne possède un domaine de confidentialité. Par exemple, les colonnes score et age de l’exemple suivant doivent avoir des domaines de confidentialité.

SELECT AVG(age) FROM t1
  GROUP BY score;
Copy

Ces exigences ne s’appliquent pas aux sous-requêtes. Par exemple, dans la requête suivante, la colonne mean_age doit avoir un domaine de confidentialité, mais les colonnes score et age n’en ont pas, même si elles sont utilisées dans une agrégation.

SELECT AVG(mean_age)
  FROM (SELECT AVG(age) AS mean_age FROM t1 GROUP BY score)
  WHERE mean_age >= 20 AND mean_age <= 80;
Copy

Définition d’un domaine de confidentialité

Bien que les administrateurs et les analystes qui exécutent des requêtes puissent définir un domaine de confidentialité pour une colonne, ils le font de différentes manières :

  • Un administrateur utilise les commandes CREATE TABLE et ALTER TABLE pour définir un domaine de confidentialité pour une colonne. Un administrateur du fournisseur de données définit les domaines de confidentialité avant de donner l’accès aux analystes. Dans certaines circonstances, un administrateur de l’analyste peut également avoir besoin de définir des domaines de confidentialité sur les tables jointes aux tables protégées du fournisseur de données. Si vous êtes un administrateur qui doit définir des domaines de confidentialité, voir Utilisation des domaines de confidentialité en tant qu’administrateur.

  • Un analyste façonne une requête pour spécifier implicitement un domaine de confidentialité à l’aide d’éléments de requête tels que des filtres et des transformations de colonnes. Ces domaines de confidentialité peuvent être spécifiés pour les colonnes sans domaine de confidentialité ou peuvent restreindre un domaine de confidentialité défini par le fournisseur de données. Si vous êtes un analyste qui doit spécifier ou restreindre un domaine de confidentialité, voir Utilisation des domaines de confidentialité en tant qu’analyste.

Interactions entre les domaines de confidentialité

Plusieurs domaines de confidentialité peuvent être impliqués dans une requête. Il peut y avoir un domaine de confidentialité spécifié par l’administrateur et un domaine de confidentialité spécifié par l’analyste sur la même colonne. Alternativement, une requête peut joindre deux tables sur une colonne qui possède un domaine de confidentialité dans les deux tables.

Snowflake évalue tous les domaines de confidentialité et calcule le domaine de confidentialité à utiliser pendant la durée de la requête. Pour plus d’informations sur la manière dont ce domaine de confidentialité au moment de la requête est déterminé, voir :

Interaction entre les domaines de confidentialité spécifiés par l’administrateur et ceux spécifiés par l’analyste

Un analyste utilise des éléments de requête pour spécifier implicitement un domaine de confidentialité pour une colonne. Par exemple, le filtrage sur une colonne définit un domaine de confidentialité pour celle-ci. Ce domaine de confidentialité spécifié par l’analyste existe uniquement pendant la durée de la requête ; il ne modifie pas le domaine de confidentialité défini par un administrateur sur la colonne.

Un domaine de confidentialité spécifié par un analyste peut restreindre un domaine de confidentialité spécifié par un administrateur, mais ne peut jamais l’étendre. Le domaine de confidentialité au moment de la requête est l’intersection entre le domaine de confidentialité spécifié par la requête et le domaine de confidentialité défini par l’administrateur. Par exemple, si le fournisseur de données définit le domaine de confidentialité comme une plage (5, 15) et que la requête utilise des filtres pour spécifier le domaine de confidentialité comme une plage (0, 10), alors le domaine de confidentialité effectif au moment de la requête est (5, 10).

De même, si l’administrateur définit le domaine de confidentialité sous forme de liste (“bleu”, “jaune”) et que la requête utilise des filtres pour spécifier un domaine de confidentialité (“orange”, “bleu”), le domaine de confidentialité au moment de la requête est (“bleu”).

Domaines et jointures de confidentialité

Lorsqu’un analyste joint deux tables sur une colonne comportant un domaine de confidentialité dans les deux tables, le type de jointure détermine le domaine de confidentialité au moment de la requête. Pendant la durée de la requête, le domaine de confidentialité effectif peut être l’intersection des deux domaines de confidentialité, l’union des deux domaines de confidentialité ou simplement l’un des domaines de confidentialité.

Dans le tableau suivant, domainL fait référence au domaine de confidentialité sur la colonne de jointure dans la table de gauche et domainR fait référence au domaine de confidentialité sur la colonne de jointure dans la table de droite.

Type de jonction

Domaine de confidentialité au moment de la requête

INNER

Intersection de domainL et domainR

OUTER

Union de domainL et domainR

LEFT

domainL

RIGHT

domainR

LEFT SEMI

Intersection de domainL et domainR

LEFT ANTI

domainL

Par exemple, supposons que la colonne day dans t1 a un domaine de confidentialité de (1, 100) et que la colonne day dans t2 a un domaine de confidentialité de (0, 90). Lorsqu’un analyste rejoint t1 et t2 sur day, le domaine de confidentialité au moment de la requête est (1, 90), qui est l’intersection des deux domaines de confidentialité.

Valeurs en dehors d’un domaine de confidentialité

Un domaine de confidentialité définit des valeurs possibles dans une colonne, pas nécessairement des valeurs réelles. Ce qui suit résume ce qui se passe pour les valeurs qui ne sont pas incluses dans la liste ou la plage du domaine de confidentialité.

Chaînes

Les valeurs d’une colonne de chaîne qui se situent en dehors du domaine de confidentialité sont toujours traitées comme NULL pendant la durée de la requête. Cela est vrai qu’il s’agisse d’un domaine de confidentialité spécifié par l’administrateur, d’un domaine de confidentialité spécifié par l’analyste ou d’une intersection de domaines de confidentialité.

Par exemple, supposons que le fournisseur de données définisse un domaine de confidentialité sur une colonne state de ('california', 'oregon') et l’analyste a écrit une requête qui filtre la colonne state sur ('nevada', 'oregon'). Si la requête utilise la colonne state dans une clause GROUP BY, alors le résultat contient deux groupes : OREGON et NULL. Le groupe NULL inclut tous les enregistrements où la valeur de la colonne state n’est pas OREGON ainsi que des enregistrements où la valeur de la colonne state est littéralement NULL.

Numérique, date et heure

Snowflake traite les valeurs numériques, de date ou d’heure qui se situent en dehors de la plage d’un domaine de confidentialité différemment selon que le domaine de confidentialité a été défini par un administrateur ou un analyste.

Spécifié par l’administrateur:

Lorsque le fournisseur de données définit un domaine de confidentialité de plage qui contient un sous-ensemble des valeurs réelles de la colonne, les valeurs en dehors du domaine de confidentialité sont limitées, ce qui signifie qu’elles sont traitées comme si elles étaient la valeur la plus proche du domaine (la valeur minimale ou maximale). Par exemple, si le domaine de confidentialité d’une colonne se compose d’entiers compris entre 1 et 100, un enregistrement avec une valeur réelle de 105 est traité comme s’il avait une valeur de 100 lors du calcul des agrégations. Les analystes ne peuvent pas accéder aux valeurs en dehors du domaine de confidentialité.

Lorsqu’une jointure de deux tables protégées par la confidentialité entraîne l’intersection des domaines de confidentialité, les valeurs en dehors du domaine de confidentialité au moment de la requête sont bloquées.

Spécifié par l’analyste:

Lorsqu’un analyste spécifie un domaine de confidentialité pour une colonne qui n’en a pas ou restreint un domaine de confidentialité spécifié par l’administrateur, la requête elle-même détermine ce qui arrive aux valeurs qui se trouvent en dehors du domaine de confidentialité.

  • Si la requête utilise un filtre (clause WHERE), les valeurs en dehors du domaine de confidentialité sont ignorées lors du calcul des agrégations.

  • Si la requête utilise une transformation de colonne, les valeurs de la colonne qui sont en dehors du domaine de confidentialité sont limitées comme un domaine de confidentialité spécifié par l’administrateur.

Comment les éléments de requête intermédiaires affectent les domaines de confidentialité

La manière dont une requête est écrite peut avoir une incidence sur la modification de la plage d’un domaine de confidentialité ou même sur l’existence ou non d’un domaine de confidentialité sur une colonne. Cette section vous aide à comprendre comment les parties intermédiaires d’une requête, c’est-à-dire les parties de la requête avant l’agrégation finale, peuvent affecter le domaine de confidentialité d’une colonne.

Ajout de nouvelles colonnes

Si une requête ajoute une nouvelle colonne basée sur une colonne existante, la spécification ou la restriction d’un domaine de confidentialité sur la colonne d’origine n’a aucun effet sur la nouvelle colonne.

Dans l’exemple suivant, supposons que le fournisseur de données a défini le domaine de confidentialité sur la colonne score sous forme de plage comprise entre 0 et 100. Lorsque la requête spécifie le domaine de confidentialité de score en tant que plage comprise entre 1 et 2, elle n’a aucun effet sur le domaine de confidentialité de la colonne score_derived.

SELECT AVG(score_derived)
  FROM (SELECT score, score_derived FROM t1 WHERE score <= 2);
Copy

Par exemple, le résultat pourrait être :

--------------------------
|"avg(""SCORE_DERIVED"")"|
--------------------------
|31.8196209349           |
--------------------------
Utilisation d’une clause GROUP BY dans les agrégations intermédiaires

Pour les parties intermédiaires d’une requête, l’utilisation d’une clause GROUP BY lors de l’agrégation d’une colonne supprime le domaine de confidentialité de la colonne. Par conséquent, vous devez spécifier un nouveau domaine de confidentialité sur la colonne si elle est utilisée dans l’agrégation finale de la requête.

Dans l’exemple suivant, l’agrégation initiale supprime tout domaine de confidentialité qui a été défini sur la colonne score. La requête réussit uniquement parce qu’elle définit un domaine de confidentialité sur l’alias de la colonne avant l’agrégation finale.

SELECT AVG(num_scores)
  FROM (SELECT COUNT(score) AS num_scores
    FROM t1
    GROUP BY age)
  WHERE num_scores >= 0 AND num_scores <= 100;
Copy