2017-07-08 1 views
0

Y at-il un inconvénient à utiliser l'affichage partitionné? Exemple ce que je veux dire comme ci-dessous.Vue partitionnée (union vue) dans google grosse requête ou n'importe quelle base de données

https://sqlsunday.com/2014/08/31/partitioned-views/

Cependant, au lieu d'utiliser la date, je veux diviser par un autre type de champ. par exemple. Type de produit ou pays.

, la vue sera

Select '1' as Prod_type, 'USA' as Country , * 
from fact_Sales_1_USA 
union all 
Select '2' as Prod_type, 'UK' as Country , * 
from fact_Sales_2_UK 

De cette façon, il empêchera la requête de lecture de la table ensemble et limiter juste à particulier Type de produit et de la région.

Un inconvénient est notre cours la mise à jour des données légèrement plus complexe? Va-t-il ralentir une requête où je n'utilise pas le champ ci-dessus?

Répondre

2

BigQuery ne prend actuellement pas en charge partitioning by non-date columns. La seule façon d'émuler ceci est d'avoir une table distincte pour chaque type de produit ou région, par exemple, puis d'utiliser un table wildcard to enable filtering on them.

Si vos tables ont les noms suivants, par exemple:

MyTable_USA_1 
MyTable_USA_3 
MyTable_UK_2 
MyTable_France_1 
... 

Vous pouvez créer une vue logique que:

#standardSQL 
SELECT 
    *, 
    _TABLE_SUFFIX AS country_and_product 
FROM `MyTable_*`; 

Maintenant lorsque vous interrogez, vous pouvez filtrer le pays (et éventuellement numéro de produit):

#standardSQL 
SELECT 
    * EXCEPT (country_and_product) 
FROM CountryAndProductView 
WHERE country_and_product LIKE 'UK_%' 
    -- AND country_and_product LIKE '%_2' 

Une chose à garder à l'esprit est qu'il y a une limite de 1000 t Cette méthode ne fonctionnera pas si vous avez trop de combinaisons de pays et de produits. Si c'est le cas, vous devrez peut-être «partitionner» juste par l'un d'entre eux plutôt que par les deux.

+0

Comment voulez-vous combiner ce qui précède avec la partition de date dans une grande requête? –

+0

Vous ne pouvez pas actuellement utiliser _PARTITIONTIME du caractère générique de table si les tables sous-jacentes sont partitionnées par date, mais il existe [une demande de fonctionnalité ouverte] (https://issuetracker.google.com/issues/35905833). –