ablog

不器用で落着きのない技術者のメモ

AWS

Parquet はファイルでカラムの型を持っているため、Glue カタログだけ変更しても型を変えることはできない

S3 にある Parquet ファイルを Glue の Crawler でクロールしてテーブルを作成し、文字列型のカラムを数値型に変更するとエラーになるという当たりまり前(Parquet は項目定義に型を持っているバイナリファイルのため)のことを検証した。型を変えたい場合は…

Spark on EMR から Glue カタログにアクセスできない

事象 Spark on EMR で Glue カタログのデータベース名を表示しようとすると、"because no identity-based policy allows the glue:GetDatabase action" で AccessDeniedException が発生する。 $ pyspark >>> from pyspark.sql import SparkSession >>> spar…

クロスアカウントの s3 cp で "An error occurred (AccessDenied) when calling the GetObjectTagging operation: Access Denied"

AWS

事象 AWS CLI v2 でクロスアカウントでaws s3 cp を実行すると "An error occurred (AccessDenied) when calling the GetObjectTagging operation" で失敗する。 AWS CLI は v2 % aws --version aws-cli/2.5.8 Python/3.9.11 Darwin/21.6.0 exe/x86_64 promp…

AWS

* AWS Open Data の New York City Taxi のデータを自アカウントの S3 バケットにコピーする。 S3 バケット作成 $ aws s3 mb s3://nyc-tlc-az/ --region us-east-1 ファイルコピー $ aws s3 cp --recursive "s3://nyc-tlc/trip data/" "s3://nyc-tlc-az/trip…

Amazon Redshift でテーブルの列のデフォルト値を指定する

AWS

Amazon Redshift で列のデフォルト値を指定する。 dev awsuser 20230517_17:43:39 =# create table test_default_col( name varchar(10), updated timestamp DEFAULT sysdate ); CREATE TABLE Time: 632.178 ms dev awsuser 20230517_17:43:55 =# insert int…

Amazon Redshift RA3 の手動スナップショットのコストについて

AWS

Amazon Redshift RA3 の手動スナップショットの料金について 自動スナップショットは、 無料、最大35日間保持できる。 デフォルトで8時間ごとか、1ノードあたり 5GB 変更されると自動でスナップショットが作成される。 自動、手動ともに前回からの増分のみス…

Aurora の IO サイズ

AWS

Read は MySQL が 16KB、PostgreSQL が 8KB、Write は MySQL、PostgreSQL とも 4KB。 Each database page is 16 KB in Aurora MySQL-Compatible Edition and 8 KB in Aurora PostgreSQL-Compatible Edition.Aurora was designed to eliminate unnecessary I/…

Amazon Redshift でクエリテキストから SVL_QUERY_METRICS_SUMMARY を取得する

AWS

SQL elect b.database, substring(b.querytxt,1,30) sql, a.* from svl_query_metrics_summary a, stl_query b where a. query = b.query and b.querytxt like '%/* TPC-H Q%' order by substring(b.querytxt,1,30); 結果 database | sql | userid | query |…

Amazon Redshift でゾーンマップがあってもソートキーが必要な理由

AWS

Amazon Redshift はゾーンマップで 1MB ブロックの最小値と最大値を保持しているので、クエリのフィルタ条件などに合致しないブロックを読み飛ばすことができる。ソートキーでソートされていないと同じ値のデータがあちこちのブロックに散らばるため、ソート…

Amazon Redshift で結合キーでKEY分散 vs EVEN 分散

AWS

計測 EVEN分散 =# select count(l_orderkey) from lineitem join orders on o_orderkey = l_orderkey and l_shipdate > '1996-01-01'; count ------------ 7518747994 (1 row) Time: 150000.148 ms (02:30.000) クエリID取得 =# select pg_last_query_id(); …

Amazon Redshift のスライス毎の行の偏りを確認する

AWS

svv_table_info.skew_rows (スライス単位での最大行数/最小行数)の値が大きいと偏っている。 =# select * from svv_table_info where "table" = 'lineitem_dk_shipdate1'; -[ RECORD 1 ]----------+--------------------------------- database | tpch_3tb…

Amazon Redshift で2列で内部結合しているクエリで分散キー指定列の違いによる比較

AWS

Amazon Redshift で2列で内部結合しているクエリで、分散キーが2列のうち偏りのある列にした場合と偏りのない列にした場合の比較。 検証結果 偏りのある列(l_shipdate)が分散キー select sum(a.l_quantity), count(a.l_orderkey), min(a.l_shipdate), max(…

Amazon Redshift で結合キーに関数を使うとソートマージ結合にならないパターン

AWS

Amazon Redshift で結合キーに関数を使うとソートマージ結合にならないパターン。 検証結果 結合キーに collate 関数を使用 クライアントからみた実行時間は25分47秒。 select a.l_linenumber, avg(a.l_quantity) from lineitem a, lineitem b where collate…

Amazon Redshift のソートマージ結合とハッシュ結合を比較する

AWS

ソートマージ結合になる条件 両テーブルの結合キーが分散キーとソートキーに指定されている 結合対象表の未ソート率が20%未満 Merge Join Typically the fastest join, a merge join is used for inner joins and outer joins. The merge join is not used f…

Amazon Redshift でソートキーの順番による IO 量の差を見る

AWS

前提 Cloud Data Warehouse Benchmark Derived from TPC-H のテーブル・データを使用 環境: ue-east-1 に Amazon Redshift クラスター(ra3.4xlarge x 4 node)を作成 計測結果 効率的なソートキー 実行時間(クライアント側): 2.8 秒 =# select min(l_ship…

Amazon Redshift で Cloud Data Warehouse Benchmark Derived from TPC-H を実行してみる

AWS

Amazon Redshift で Cloud Data Warehouse Benchmark Derived from TPC-H を実行してみる。 ue-east-1 に Amazon Redshift クラスターを作成する ra3.4xlarge x 4 node Cloud Data Warehouse Benchmark Derived from TPC-H の 100GB のデータセットをロード…

Amazon Redshift でクエリを実行しても SVL_QUERY_METRICS に記録されない場合

AWS

SVL_QUERY_METRICS は STL_QUERY_METRICS を参照しており、STL_QUERY_METRICS は1 秒未満で実行されるクエリセグメントは記録されない場合があるためと思われる。 STL_QUERY_METRICS Contains metrics information, such as the number of rows processed, C…

Amazon Redshift のソートキー指定による IO量の削減

AWS

計測 分散キー・ソートキーなし # set search_path to ssbgz_no_sortkey; # show search_path; # set enable_result_cache_for_session=off; -- 分散キー・ソートキーは設定されていない # select * from pg_table_def where (distkey = true or sortkey <> …

Amazon Redshift でソートキーによる IO 削減ができているかどうかを確認する

AWS

svl_query_summary.is_rrscan では判断できない。rows_pre_filter - rows で判断する。 ソートキーがないとき テーブルを作成する CREATE TABLE lineorder ( lo_orderkey integer not null, lo_linenumber integer not null, lo_custkey integer not null, l…

Amazon Redshift の AUTO COPY を試す

AWS

手順 prefix を作成する aws s3api put-object --bucket awssampledb --key "auto-copy-lineorder/" テーブルを作成する CREATE TABLE public.lineorder ( lo_orderkey INTEGER NOT NULL, lo_linenumber INTEGER NOT NULL, lo_custkey INTEGER NOT NULL, lo_…

Amazon Redshift で Commit/Rollback せずにセッションを閉じた場合の動作

AWS

Amazon Redshift で Commit/Rollback せずにセッションを閉じた場合に commit されているか rollback されているか。psql などの SQL クライアントで autocommit が有効な場合は DML を発行すると自動的に commit を発行するので、commit が発行する前に閉じ…

シンプルでシステマチックな Amazon Redshift クエリチューニング

AWS

AWS Analytics Advent Calendar 2022 の 20 日目のエントリーです。 Amazon Redshift のシステムテーブル・ビューからデータドリブンで遅いクエリのボトルネック(どこに時間がかかっているか)を分析する方法を紹介します。 クエリを実行して情報を収集する…

RDS Oracle の Performance Insights は AWR や ASH を使っていない

AWS

RDS Oracle の Performance Insights(PIs) は AWR や ASH を使っていない。なぜなら、AWR や ASH のない SE2 でも使える This post discusses the Oracle performance analysis offerings available within Oracle SE. We can use Oracle Statspack, an opti…

Redshift の Snapshot Isolation の挙動

AWS

Delete + Insertをトランザクション(begin/end)で囲んで実行中に他セッションからの Insert はブロックされ(待たされ)る。 Delete + Insertするセッション % psql -a "host=redshift-cluster-poc-central.********.ap-northeast-1.redshift.amazonaws.co…

シンプルでシステマチックな Amazon Redshift クエリチューニング

AWS

クエリのボトルネック分析の流れ STL_WLM_QUERY でクエリのキュー待ち時間と実行時間を確認する。 子クエリに分割されている場合は子クエリ別に確認できる。 SVL_QUERY_METRICS でクエリの実行時間の内訳と仕事量(CPU時間、IO量、中間結果の書出しサイズ)…

Redshift で WLM キュー待ち時間に上限があるか

AWS

Redshift のパラメータ statement_timeout が 0 だとクエリはタイムアウトしない。statement_timeout はWLMでのキュー待ち時間と実行時間の両方を含む。キュー待ち時間に上限を設定したい場合は QMR で query_queue_time を使用する。 The statement_timeout…

Redshift の Concurrency Scaling の料金を計算する

AWS

マネジメントコンソールから [Amazon Redshift]-[Clusters]-[クラスターを選択]-[Query Monitoring]-[Workload concurrency]-[Concurrency scaling usage] で確認できる。 sampledb=# select * from SVCS_CONCURRENCY_SCALING_USAGE limit 10; start_time | …

Redshift でユーザーが使用可能なストレージ容量を制限する

AWS

容量制限つきのスキーマを作成して、ユーザーが利用できるようにする。 superuser でスキーマ作成権限を持つユーザーを作成する。 $ psql -a "host=redshift-cluster-poc-ads.********.ap-northeast-1.redshift.amazonaws.com user=awsuser dbname=sampledb …

Redshift でユーザーに CREATE SCEMA 権限を付与する

AWS

Redshift でユーザーに CREATE SCEMA 権限を付与するには、CREATE SCEMA 権限を持つ Role を作成して、ユーザーに Role を付与する。 $ psql -a "host=redshift-cluster-poc-ads.********.ap-northeast-1.redshift.amazonaws.com user=awsuser dbname=sample…

Redshift でテーブルの制約を調べる

AWS

SELECT con.* FROM pg_catalog.pg_constraint con INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = connamespace WHERE nsp.nspname = '<schema name>' AND rel.relname = '<table name>'; ... # \d+ observation</table></schema>…