Amazon Redshiftでよく使うけど忘れがちなコマンド(クエリ）まとめ

# 追記
## 2014-10-29
"実行中のクエリをキャンセル"するの項に追記しました

# コマンド（クエリ）

## ディスクのスペースを確認する
```sql
SELECT owner, host, diskno, used, capacity,
(used-tossed)/capacity::numeric * 100 AS pctused 
FROM stv_partitions ORDER BY owner;
```

[本家ドキュメント:STV_PARTITIONS](http://docs.aws.amazon.com/ja_jp/redshift/latest/dg/r_STV_PARTITIONS.html)


## ロードのエラー原因を探る
```sql
CREATE VIEW loadview AS
  (SELECT DISTINCT tbl, TRIM(name) as table_name, query, starttime,
  TRIM(filename) AS input, line_number, colname, err_code,
  TRIM(err_reason) AS reason
  FROM stl_load_errors sl, stv_tbl_perm sp
WHERE sl.tbl = sp.id);
```
にて、viewテーブルを作成しておき、

```sql
SELECT * FROM loadview WHERE table_name = 'table_name';
```

[本家ドキュメント:STL_LOAD_ERRORS](http://docs.aws.amazon.com/ja_jp/redshift/latest/dg/r_STL_LOAD_ERRORS.html)


## 実行中のクエリをキャンセルする
```sql
SELECT pid, TRIM(user_name), starttime, SUBSTRING(query,1,20) 
  FROM stv_recents
WHERE status = 'Running';
```
にて、該当のクエリのPIDを調べ、

```sql
CANCEL PID;
```

※ctrl + cでも可能だが正常に終了しないこともあるため、CANCELコマンドを使っておいたほうが吉

[本家ドキュメント:CANCEL](http://docs.aws.amazon.com/ja_jp/redshift/latest/dg/r_CANCEL.html)

**2014-10-29 追記**
Management Consoleからもキャンセルが可能になりました。[Release: Amazon Redshift on 2014-10-28](http://aws.amazon.com/releasenotes/9591314202499644)
これは地味に嬉しいですね。詳細は@con_mameさんの記事、[RedshiftのクエリとLoadをManagement Consoleからキャンセルする
](http://qiita.com/con_mame/items/c7a65e40d3f5d6032903)を見ると良いと思います。

## テーブル構成を確認する
```sql
SELECT "column", type, encoding, distkey, sortkey FROM pg_table_def WHERE tablename = 'table_name';
```

[本家ドキュメント:PG_TABLE_DEF](http://docs.aws.amazon.com/ja_jp/redshift/latest/dg/r_PG_TABLE_DEF.html)


## S3からテーブルへのインポート
```sql
COPY hoge FROM 's3://table/hoge/import/20140101' CREDENTIALS 'aws_access_key_id=XXXXXXXXXX;aws_secret_access_key=XXXXXXXXXX' DELIMITER '|' GZIP;
```

[本家ドキュメント:COPY](http://docs.aws.amazon.com/ja_jp/redshift/latest/dg/r_COPY.html)


## S3へテーブルのエクスポート
```sql
UNLOAD ('SELECT id,txt FROM hoge WHERE created_at = \'2014-01-01 00:00:00\'') TO 's3://backup/hoge_140101' CREDENTIALS 'aws_access_key_id=XXXXXXXXXX;aws_secret_access_keyXXXXXXXXXX' delimiter '|' GZIP;
```

[本家ドキュメント:UNLOAD](http://docs.aws.amazon.com/ja_jp/redshift/latest/dg/r_UNLOAD.html)


## sortkeyに絞ってvacuumをかける
```sql
VACUUM SORT ONLY table_name;
```

[本家ドキュメント:VACUUM](http://docs.aws.amazon.com/ja_jp/redshift/latest/dg/r_VACUUM_command.html)


## 統計情報を更新する
```sql
ANALYZE table_name;
```

[本家ドキュメント: ANALYZE](http://docs.aws.amazon.com/ja_jp/redshift/latest/dg/r_ANALYZE.html)


## JSON要素をパースして取得する
```sql
SELECT
  json_extract_path_text(json, 'relationship', 'target', 'screen_name')
FROM
  test_json;
```

[本家ドキュメント:JSON_EXTRACT_PATH_TEXT function](http://docs.aws.amazon.com/ja_jp/redshift/latest/dg/JSON_EXTRACT_PATH_TEXT.html)


## (MySQLの)REPLACE文
、、、に相当する構文は残念ながら現時点(2014/4/16現在)ではサポートされていないので、以下を参考にしてやります。

[本家ドキュメント:Updating and inserting new data](http://docs.aws.amazon.com/ja_jp/redshift/latest/dg/t_updating-inserting-using-staging-tables-.html
)


## コマンドラインからのクエリ実行
```bash
export PGPASSWORD=XXXXXXXXXX;psql -h redshift.abcdefg.us-west-2.redshift.amazonaws.com hoge -p 5439 -U user -c "SELECT COUNT(*) FROM hoge"
````


## 実行時間表示を有効にする
```sql
\timing on
```


## スキーマの移動
```sql
SET SEARCH_PATH TO hoge;
```