Décorateurs de table en ancien SQL

Ce document explique en détail comment utiliser les décorateurs de table dans une syntaxe de requête en ancien SQL. La syntaxe de requête privilégiée pour BigQuery est le langage SQL standard. Actuellement, les décorateurs de table ne sont pas disponibles en SQL standard. Toutefois, vous pouvez en obtenir la sémantique en utilisant un filtre sur la pseudo-colonne _TABLE_SUFFIX. Pour en savoir plus, consultez la section Décorateurs de table et fonctions de caractère générique dans le guide de migration SQL standard.

En temps normal, BigQuery effectue une analyse complète des colonnes lors de l'exécution d'une requête. Vous pouvez utiliser des décorateurs de table en ancien SQL pour effectuer une requête plus économique sur un sous-ensemble de vos données. Cela est possible chaque fois qu'une table est lue, par exemple lorsque vous copiez une table, exportez une table ou répertoriez des données à l'aide de tabledata.list.

Les décorateurs de table acceptent les valeurs <time> relatives et absolues. Les valeurs relatives sont indiquées par un nombre négatif et les valeurs absolues par un nombre positif. Par exemple, -3600000 indique la dernière heure écoulée en millisecondes, par rapport à l'heure actuelle, et 3600000 indique une heure en millisecondes après le 01/01/1970.

Décorateurs d'instantané

Syntaxe

@<time>
  • Renvoie un instantané de la table à <time>, en millisecondes depuis l'époque.
  • La valeur de <time> doit être comprise dans les sept derniers jours et supérieure ou égale à l'heure de création de la table.
  • @0 est un cas particulier qui renvoie l'instantané le plus ancien de la table : soit sept jours en arrière, soit à l'heure de création de la table si elle a été créée il y a moins de sept jours.
  • Les décorateurs d'instantanés ne sont disponibles que pour les opérations de copie de table. Pour les opérations de requête, vous devez utiliser FOR SYSTEM_TIME AS OF.

Vous pouvez utiliser des décorateurs d'instantanés pour annuler la suppression d'une table dans les sept jours suivant sa suppression.

Exemples

Pour obtenir un instantané de la table lors de la dernière heure écoulée :

Exemple de valeur relative

#legacySQL
SELECT COUNT(*) FROM [PROJECT_ID:DATASET.TABLE@-3600000]

Exemple de valeur absolue

  1. Obtenez <time> pour la dernière heure écoulée :

    #legacySQL
    SELECT INTEGER(DATE_ADD(USEC_TO_TIMESTAMP(NOW()), -1, 'HOUR')/1000)
    
  2. Remplacez ensuite <time> dans la requête suivante :

    #legacySQL
    SELECT COUNT(*) FROM [PROJECT_ID:DATASET.TABLE@time]
    

Pour annuler la suppression d'une table à l'aide d'un décorateur d'instantané et de l'outil de ligne de commande bq, procédez comme suit :

Exemple d'annulation de suppression d'une table

Tout d'abord, déterminez un horodatage avant la suppression de la table (en millisecondes depuis l'époque). Copiez ensuite la table à cet horodatage dans une nouvelle table. La nouvelle table doit avoir un nom différent de celui de la table supprimée.

# Create a table "dataset1.table1"
$ bq query --destination_table=dataset1.table1 "select 1"

# Get current timestamp
$ date +%s%3N
1573060348222

# Delete table1
$ bq rm dataset1.table1

# Undelete table
$ bq cp dataset1.table1@1573060348222 dataset1.table1_restore

Exemple d'annulation de suppression d'un ensemble de données

Tout d'abord, déterminez un horodatage avant la suppression de l'ensemble de données (en millisecondes depuis l'époque). Copiez ensuite les tables de l'ensemble de données à cet horodatage dans la table.

# Create a table "dataset1.table1"
$ bq query --destination_table=dataset1.table1 "select 1"

# Get current timestamp
$ date +%s%3N
1573060348222

# Remove the dataset
$ bq rm -f -r dataset1

# Restore step1: re-create the dataset with same name
$ bq mk dataset1

# Restore step2: undelete the table.
$ bq cp dataset1.table1@1573060348222 dataset1.table_new

Décorateurs de plage

Syntaxe

@<time1>-<time2>
  • Renvoie les données de la table ajoutées entre <time1> et <time2>, en millisecondes depuis l'époque.
  • Les valeurs de <time1> et <time2> doivent être comprises dans les sept derniers jours.
  • La valeur de <time2> est facultative et utilise par défaut "maintenant".

Exemples

Exemples de valeurs relatives

Pour obtenir des données de table ajoutées entre la dernière heure et la dernière demi-heure écoulées :

#legacySQL
SELECT COUNT(*) FROM [PROJECT_ID:DATASET.TABLE@-3600000--1800000]

Pour obtenir les données des 10 dernières minutes :

#legacySQL
SELECT COUNT(*) FROM [PROJECT_ID:DATASET.TABLE@-600000-]

Exemple de valeur absolue

Pour obtenir des données de table ajoutées entre la dernière heure et la dernière demi-heure écoulées :

  1. Obtenez <time1> pour la dernière heure écoulée :

    #legacySQL
    SELECT INTEGER(DATE_ADD(USEC_TO_TIMESTAMP(NOW()), -1, 'HOUR')/1000)
    
  2. Obtenez <time2> pour la dernière demi-heure écoulée :

    #legacySQL
    SELECT INTEGER(DATE_ADD(USEC_TO_TIMESTAMP(NOW()), -30, 'MINUTE')/1000)
    
  3. Remplacez <time1> et <time2> dans la requête suivante :

    #legacySQL
    SELECT COUNT(*) FROM [PROJECT_ID:DATASET.TABLE@time1-time2]