こんにちは、GMOアドマーケティングのmizkichです。アドテクなマイクロサービスをGCPのKubernetesで運用しています。最近、私が扱っているBigQueryのテーブル数が1万を超えてしまいました。これらのテーブルから、レコード変更があったテーブルだけを抽出する業務があります。公式に書かれたテーブル最終更新日の取得方法だと、1テーブルあたり2秒ほど掛かります。1万テーブルだと約6時間です。この取得方法を変更することで、全テーブルの最終更新日を1秒未満で完了できるようになりました。本記事では、テーブルのメタ情報を取得するための、三つの方法を紹介させて頂きます。bqコマンドでの取得bqコマンドにはテーブル情報を知る方法が二つあります。lsでは、全テーブルの概要情報を取得することが出来ます。取れる情報は、「テーブル作成日」「テーブル失効日」だけで、使い道があまりないです。showでは、各テーブル個別に詳細情報を取得することが出来ます。取れる情報は、「テーブル作成日」「テーブル最終更新日」「テーブルバイト数」「90日経過バイト数」「テーブル行数」「スキーマ定義」などです。目的の「テーブル最終更新日」を取得することが出来ますが、このコマンドの実行にはテーブル名の指定が必須です。show一回あたり2秒ほどかかります。1万テーブルに対するテーブル更新日の取得は、約6時間ほど掛かってしまっていました。特殊なテーブル、INFORMATION_SCHEMAテーブルを使ってもメタ情報を取得することが出来ます。INFORMATION_SCHEMAには5つのテーブルが有りますが、どのテーブルにもテーブル最終更新日は含まれていません。テーブル情報に関して取れるのはテーブル作成日のみでした。データセットの名称、オプション設定(失効日時設定など)。データセットの名称、オプション設定(失効日時設定など)。テーブルの名称、オプション設定(失効日時設定など)。テーブルの名称、オプション設定(失効日時設定など)。showにも匹敵する情報を全テーブル一括で取得することが出来ます。取れる情報は「テーブル作成日」「テーブル最終更新日」「テーブル行数」「テーブルバイト数」です。このSQLを使えば、ミリ秒でテーブル最終更新日の一覧が取得できます。`dataset_name.__TABLES__`;最終更新日はミリ秒で格納されていますので、以下のSQLで年月日に変換できます。`dataset_name.__TABLES__`;過去1週間に変更のあったテーブルだけを抜粋したい場合は、以下のSQLで抽出できます。DAY));テーブル名だけをファイル化したい場合などは、以下のbqコマンドと組み合わせると楽にテーブル名だけ抽出できます。./table_list.txtファイルに抽出したテーブルだけをコピーするには、以下のシェルを使いました。./copy_command_list.sh./copy_command_list.sh複製したテーブルの接尾句(YYYYMMDD)から94日経過でテーブルを削除するには、以下のシェルを使いました。showで一つずつ調べるしかありませんでした。__TABLES__があれば、実際に更新があったかどうかを一瞬で判断することができます。__TABLES__を使うようになってから、レプリケーション元への更新情報を、漏らさずレプリケーション先へ複製することができるようになりました。この__TABLES__、BigQueryのドキュメントにはどこにも記載が見当たらず、大はまりしました。他にも隠れコマンドがあるかも知れず、見つかったらまた共有させて頂きます。@gmoap_engineer本ブログで発信される情報は、各エンジニア個人の見解であり、弊社の公式見解ではありません。本ブログに掲載、引用等をしている商品またはサービス等の名称は、各社の商標または登録商標です。その他の事項について一切責任を負いかねます。発表する情報には注意を払っておりますが、公式発表、見解については、弊社WEBサイトおよびプレスリリースなどをご確認ください。GMOインターネットグループにおけるソーシャルメディア運用ポリシーについては次のページをご確認ください。本ブログに掲載のあるソフトウェアのダウンロードは自己責任で御願い致します。ソフトウェアのダウンロードの結果、ご利用者に何らかの損失・損害が生じたといえども、当社ではその責任を負いかねます。本ブログに掲載のあるソフトウェアを扱う際は、各ソフトウェアの公式リファレンスを参照のもとご使用下さい。ソフトウェアの実行の結果、ご利用者に何らかの損失・損害が生じたといえども、当社ではその責任を負いかねます。