2016-12-19 13 views
0

2つの列を持つ日付パーティションテーブル(sample_tableと呼んでいます)が1つあり、日付時間をUTCで保存します。私はこのテーブルの上にビューを持っています(sample_viewと呼んでください)。このビューはテーブルから_partitiontimeを取り込み、partitionDateカラムとして表示します。また、別のカラムcustomerDateTimeがあり、timeTimeOffsetでdateTimeが追加されます。ビューを使用しているときにGoogle BigQueryが正しくパーティション日付を使用しない理由

_partitiontimeを使用して直接sample_tableに照会すると、bigqueryスキャンでデータ(131 MB)が大幅に少なくなります。

select 
    containerName, 
    count(*) 
from 
    [sample_project.sample_table] 
where 
    _partitiontime between timestamp('2016-12-12') and timestamp('2016-12-19') 
    and customer = 'X' 
    and containerName = 'XXX' 
group by containerName 
; 

しかし、私はより多くの顧客の現地日時大きなクエリスキャン(211メガバイト)に応じてスキャンするdateTime列を持つテーブルで同じクエリを実行します。私は131MB未満または131MBに等しいと予想しました。

select 
    containerName, 
    count(*) 
from 
    [sample_project.sample_table] 
where 
    _partitiontime between timestamp('2016-12-12') and timestamp('2016-12-19') 
    and DATE_ADD(dateTime, 3600, 'SECOND') between timestamp('2016-12-12 08:00:00') and timestamp('2016-12-19 15:00:00') 
    and customer = 'X' 
    and containerName = 'XXX' 
group by containerName 
; 

私はもっとsample_viewpartitionDateとBigQueryのスキャン(399メガバイト)

select 
    containerName, 
    count(*) 
from 
    [sample_project.sample_view] 
where 
    partitionDate between timestamp('2016-12-12') and timestamp('2016-12-19') 
    and customer = 'X' 
    and containerName = 'XXX' 
group by containerName 
; 

そして、私はpartitionDateとビューに対してクエリを実行し、さらに、同様のBigQueryスキャンをcustomerDateTime列を使用に対して同様のクエリを実行します(879MB)

select 
    containerName, 
    count(*) 
from 
    [sample_project.sample_view] 
where 
    partitionDate between timestamp('2016-12-12') and timestamp('2016-12-19') and customerDateTime between timestamp('2016-12-12 08:00:00') and timestamp('2016-12-19 15:00:00') 
    and customer = 'X' 
    and containerName = 'XXX' 
group by containerName 
; 

私が正しいパーティションをスキャンしているかどうかはわかりません上記のクエリのこれらのクエリの違いはどうしてわかりますか? _partitiontimeを新しい列として公開していますpartitionDate悪い戦略ですか?私は他のクエリを書くことなく、Tableau内のパーティション日付をどのように使うべきかわかりません。詳細が必要な場合はお知らせください。

+0

テーブルに繰り返しフィールドがありますか? –

+0

@MikhailBerlyantはいそうです。 – opensourcegeek

答えて

0

レガシーSQLにはフィルタのプッシュダウンに関していくつかの制限があるため、代わりにstandard SQLをクエリに使用する必要があります。私はTableauにはあまり慣れていませんが、従来のSQLと標準SQLの切り替えについてはhelp page for BigQueryがあります。

+0

これは興味深いことですが、標準のSQLをサポートするようにビューを変更した後、スキャンされたバイト数は314MBにまで減少しましたが、若干実行するのに時間がかかります。従来のSQLでは、標準SQLとは異なる日付でパーティション化されるのはなぜですか。私は彼らのドキュメントを通過しようとしましたが、十分な詳細を得ることはできません。 – opensourcegeek

+0

これは、パーティション日付のビューを使用するためには、レガシーSQLを使用する必要がありますか? – opensourcegeek

+0

標準SQLはパーティション表をサポートしています。それ以外はどこで見たのですか? –

0

ちょっと推測すると、フィールドが繰り返されているために表示される問題です。レガシーSQLとスタンダードSQLでは、結果が平坦化されて別々に処理されます。レガシーSQLは結果を平坦化します。したがって、元のレコードの数ではなく、繰り返し値の数が表示されます。一方、標準SQLは元の構造を保持します。レガシーSQLでは、フラット化の効果を排除するために特別な注意を払う必要がありますが、標準SQLではすでに処理されています

+0

ありがとうございます - 私のクエリでパーティション日付を効果的に使用できるように標準SQLを使用する必要がありますか? – opensourcegeek

+0

私は私の答えにポイントを作ろうとしました - あなたが見る問題は、実際にはパーティション化されたテーブルのためではないでしょう!レガシーSQLと標準SQLはどちらもパーティション表をサポートしています。標準SQLは、ARRAYS(繰り返しフィールド)をより効果的に扱うため、役立ちます。 –

+0

Ok - ありがとうございます。しかし、ビューに対してレガシーSQLを使用すると、少ないデータをスキャンするためにクエリに対してクエリを取得できません。実際には、ビューを使用しているときにパーティション日付を全く使用していないように見えます。 – opensourcegeek

関連する問題