Amazon Redshift
データベース開発者ガイド
API Version 2012-12-01
Amazon Redshift データベース開発者ガイド
アマゾン ウェブ サービス
Amazon Redshift データベース開発者ガイド
Amazon Redshift: データベース開発者ガイド
アマゾン ウェブ サービス
Copyright © 2014 Amazon Web Services, Inc. and/or its affiliates. All rights reserved.
The following are trademarks of Amazon Web Services, Inc.: Amazon, Amazon Web Services Design, AWS, Amazon CloudFront,
Cloudfront, Amazon DevPay, DynamoDB, ElastiCache, Amazon EC2, Amazon Elastic Compute Cloud, Amazon Glacier, Kindle, Kindle
Fire, AWS Marketplace Design, Mechanical Turk, Amazon Redshift, Amazon Route 53, Amazon S3, Amazon VPC. In addition,
Amazon.com graphics, logos, page headers, button icons, scripts, and service names are trademarks, or trade dress of Amazon in
the U.S. and/or other countries. Amazon's trademarks and trade dress may not be used in connection with any product or service that
is not Amazon's, in any manner that is likely to cause confusion among customers, or in any manner that disparages or discredits
Amazon.
All other trademarks not owned by Amazon are the property of their respective owners, who may or may not be affiliated with, connected
to, or sponsored by Amazon.
Amazon Redshift データベース開発者ガイド
ようこそ .................................................................................................................................................. 1
Amazon Redshift を初めてお使いになる方向けの情報 .......................................................................... 1
データベース開発者向けの情報 .............................................................................................................. 2
前提条件 .................................................................................................................................................. 3
Amazon Redshift システム概要 .............................................................................................................. 4
データウェアハウスシステムのアーキテクチャ ..................................................................................... 4
パフォーマンス ....................................................................................................................................... 6
列指向ストレージ ................................................................................................................................... 7
内部アーキテクチャとシステム操作 ....................................................................................................... 8
クエリ処理 ..................................................................................................................................... 9
クライアントの要求と実行 ............................................................................................................ 9
説明プラン ................................................................................................................................... 10
クエリ実行手順 ............................................................................................................................ 10
ワークロード管理 ................................................................................................................................. 11
データベースの使用開始 ....................................................................................................................... 12
ステップ 1: データベースを作成する ................................................................................................... 12
ステップ 2: データベースユーザーを作成する ..................................................................................... 13
データベースユーザーを削除する ............................................................................................... 13
ステップ 3: データベーステーブルを作成する ..................................................................................... 14
テーブルにデータ行を挿入する .................................................................................................. 14
テーブルからデータを選択する .................................................................................................. 14
ステップ 4: サンプルデータをロードする ............................................................................................ 15
ステップ 5: システムテーブルをクエリする ........................................................................................ 18
実行中のクエリのプロセス ID を調べる ...................................................................................... 20
ステップ 6: クエリをキャンセルする ................................................................................................... 20
ステップ 7: リソースをクリーンアップする ....................................................................................... 22
データベースセキュリティの管理 ........................................................................................................ 23
Amazon Redshift セキュリティの概要 ................................................................................................. 24
データベースユーザーのデフォルト特権 ............................................................................................. 24
スーパーユーザー ................................................................................................................................. 25
ユーザー ................................................................................................................................................ 25
グループ ................................................................................................................................................ 26
スキーマ ................................................................................................................................................ 26
ユーザーおよびグループのアクセス権限の管理例 ............................................................................... 27
テーブルの設計 ..................................................................................................................................... 30
テーブル設計のベストプラクティス ..................................................................................................... 30
最良のソートキーの選択 ............................................................................................................. 31
最良の分散キーの選択 ................................................................................................................. 31
制約の定義 ................................................................................................................................... 32
列の最小サイズの使用 ................................................................................................................. 32
日付列での日時データ型の使用 .................................................................................................. 32
ソート列での冗長な述語の指定 .................................................................................................. 32
列圧縮タイプの選択 .............................................................................................................................. 33
圧縮エンコード ............................................................................................................................ 34
raw エンコード ................................................................................................................... 35
バイトディクショナリエンコード ..................................................................................... 35
デルタエンコード ............................................................................................................... 36
LZO エンコード ................................................................................................................. 37
Mostly エンコード .............................................................................................................. 37
ランレングスエンコード .................................................................................................... 39
text255 および text32k エンコード .................................................................................... 39
圧縮エンコードのテスト ............................................................................................................. 40
例: CUSTOMER テーブルの圧縮エンコードの選択 ................................................................... 42
データ分散方法の選択 .......................................................................................................................... 43
分散キーの選択 ............................................................................................................................ 45
分散の例 ...................................................................................................................................... 47
データの再分散 ............................................................................................................................ 49
ソートキーの選択 ................................................................................................................................. 49
API Version 2012-12-01
4
Amazon Redshift データベース開発者ガイド
制約の定義 ............................................................................................................................................ 50
テーブル設計の分析 .............................................................................................................................. 50
データのロード ..................................................................................................................................... 53
データロードのベストプラクティス ..................................................................................................... 53
COPY コマンドを使ってデータをロードする ............................................................................ 54
単一の COPY コマンドを使用する ............................................................................................. 54
データを複数のファイルに分割する ........................................................................................... 54
GZIP または LZOP でデータファイルを圧縮する ...................................................................... 55
データのロードエラーを回避する ............................................................................................... 55
ロードの前後にデータファイルを検証する ................................................................................ 57
複数行の挿入を使用する ............................................................................................................. 57
一括挿入を使用する .................................................................................................................... 57
ソートキー順序でデータをロードする ........................................................................................ 58
順次ブロックでデータをロードする ........................................................................................... 58
時系列テーブルを使用する .......................................................................................................... 58
ステージングテーブルを使い、マージ(アップサート)を実行する ......................................... 58
保守管理の時間枠を回避したスケジュール計画 ......................................................................... 59
データベースのバキューム処理 .................................................................................................. 59
ディープコピーを実行する .......................................................................................................... 59
利用可能なメモリを増やす .......................................................................................................... 59
テーブル統計を最新の状態に維持する ........................................................................................ 60
COPY コマンドを使ってデータをロードする ...................................................................................... 60
入力データを準備する ................................................................................................................. 61
Amazon S3 からデータをロードする .......................................................................................... 61
データを複数のファイルに分割する .................................................................................. 62
ファイルをアップロードする ............................................................................................. 62
データの整合性の管理 .............................................................................................. 63
暗号化されたデータをアップロードする ................................................................. 65
必要なファイルがバケットにあることを確認する ................................................... 65
COPY コマンドを使用する ................................................................................................ 66
マニフェストを使用し、データファイルを指定する ............................................... 68
圧縮ファイルをロードする ....................................................................................... 68
固定幅データをロードする ....................................................................................... 68
マルチバイトのデータをロードする ........................................................................ 69
暗号化されたデータファイルをロードする ............................................................. 70
データが正しくロードされたことを確認する ................................................................... 70
Amazon DynamoDB からロードする .......................................................................................... 71
入力データを検証する ................................................................................................................. 73
自動圧縮 ...................................................................................................................................... 73
細長いテーブルのための最適化 .................................................................................................. 75
デフォルト値 ............................................................................................................................... 75
トラブルシューティング ............................................................................................................. 76
S3ServiceException エラー ............................................................................................... 76
データロードをトラブルシューティングするためのシステムテーブル ............................ 77
マルチバイト文字のロードエラー ..................................................................................... 78
エラー参照 ......................................................................................................................... 79
DML による更新 .................................................................................................................................... 80
更新と挿入 ............................................................................................................................................ 80
ディープコピーを実行する ................................................................................................................... 81
テーブルを分析する .............................................................................................................................. 83
ANALYZE コマンド履歴 .............................................................................................................. 85
自動分析 ...................................................................................................................................... 85
テーブルのバキューム処理 ................................................................................................................... 86
未ソートリージョンを管理する .................................................................................................. 87
同時書き込みを管理する ....................................................................................................................... 87
直列化可能分離 ............................................................................................................................ 88
書き込みおよび読み取り/書き込み操作 ....................................................................................... 89
同時書き込みの例 ........................................................................................................................ 90
API Version 2012-12-01
5
Amazon Redshift データベース開発者ガイド
データのアンロード .............................................................................................................................. 92
データを Amazon S3 にアンロードする .............................................................................................. 92
暗号化されたデータファイルをアンロードする .................................................................................. 94
区切り文字付きまたは固定幅形式でデータをアンロードする ............................................................. 95
アンロードしたデータを再ロードする ................................................................................................. 97
クエリパフォーマンスのチューニング ................................................................................................. 98
クエリプランの分析 .............................................................................................................................. 99
簡単な EXPLAIN の例 ................................................................................................................ 101
EXPLAIN の演算子 .................................................................................................................... 102
結合例 ........................................................................................................................................ 103
クエリプランのシステムビューへのマップ .............................................................................. 105
クエリによるメモリ使用の管理 .......................................................................................................... 105
クエリがディスクに書き込みを行っているかどうかの判断 ..................................................... 106
ディスクに書き込みを行っているステップの判断 ................................................................... 107
ディスクスペースのモニタリング ...................................................................................................... 109
コンパイル済みコード ........................................................................................................................ 110
JDBC フェッチサイズパラメータの設定 ........................................................................................... 110
ワークロード管理の実装 ..................................................................................................................... 111
クエリキューの定義 .................................................................................................................. 111
WLM キュー割り当てルール ..................................................................................................... 113
WLM 設定の変更 ....................................................................................................................... 114
キューへのクエリの割り当て .................................................................................................... 114
ワークロード管理のモニタリング ............................................................................................. 115
SQL リファレンス .............................................................................................................................. 117
Amazon Redshift SQL ......................................................................................................................... 117
リーダーノードでサポートされる SQL 関数 ............................................................................ 117
Amazon Redshift および PostgreSQL ....................................................................................... 119
Amazon Redshift と PostgreSQL JDBC および ODBC ................................................... 119
実装方法が異なる機能 ..................................................................................................... 119
サポートされていない PostgreSQL 機能 ........................................................................ 120
サポートされていない PostgreSQL データ型 ................................................................. 121
サポートされていない PostgreSQL 関数 ........................................................................ 122
SQL の使用 ......................................................................................................................................... 124
SQL リファレンスの規則 .......................................................................................................... 124
基本的要素 ................................................................................................................................. 125
名前と識別子 .................................................................................................................... 125
リテラル ........................................................................................................................... 127
Null ................................................................................................................................... 127
データ型 ........................................................................................................................... 127
数値型 ..................................................................................................................... 128
数値に関する計算 .......................................................................................... 131
整数リテラルと浮動小数点リテラル ............................................................. 134
数値型を使用する例 ...................................................................................... 134
文字型 ..................................................................................................................... 136
文字型を使用する例 ...................................................................................... 138
日時型 ..................................................................................................................... 139
日時型を使用する例 ...................................................................................... 140
日付およびタイムスタンプのリテラル ......................................................... 140
間隔リテラル ................................................................................................. 142
ブール型 .................................................................................................................. 143
型の互換性と変換 ................................................................................................... 145
照合順序 ........................................................................................................................... 148
式 ............................................................................................................................................... 148
複合式 ............................................................................................................................... 149
式リスト ........................................................................................................................... 150
スカラーサブクエリ ......................................................................................................... 151
関数式 ............................................................................................................................... 151
条件 ............................................................................................................................................ 152
API Version 2012-12-01
6
Amazon Redshift データベース開発者ガイド
比較条件 ........................................................................................................................... 153
論理条件 ........................................................................................................................... 155
パターンマッチング条件 .................................................................................................. 157
LIKE ........................................................................................................................ 158
SIMILAR TO ............................................................................................................ 160
POSIX 演算子 ......................................................................................................... 163
範囲条件 ........................................................................................................................... 164
Null 条件 ........................................................................................................................... 165
EXISTS 条件 .................................................................................................................... 166
IN 条件 .............................................................................................................................. 167
SQL コマンド ...................................................................................................................................... 168
ABORT ...................................................................................................................................... 169
ALTER DATABASE ................................................................................................................... 170
ALTER GROUP ......................................................................................................................... 171
ALTER SCHEMA ....................................................................................................................... 172
ALTER TABLE ........................................................................................................................... 173
ALTER TABLE の例 ......................................................................................................... 176
ALTER TABLE ADD および DROP COLUMN の例 ......................................................... 176
ALTER USER ............................................................................................................................ 178
ANALYZE .................................................................................................................................. 180
ANALYZE COMPRESSION ...................................................................................................... 181
BEGIN ........................................................................................................................................ 182
CANCEL .................................................................................................................................... 184
CLOSE ....................................................................................................................................... 185
COMMENT ................................................................................................................................ 186
COMMIT .................................................................................................................................... 187
COPY ......................................................................................................................................... 187
使用に関する注意事項 ..................................................................................................... 197
Amazon S3 からのマルチバイトデータのロード ................................................... 197
複数ファイル読み取り時のエラー .......................................................................... 197
一時的セキュリティ認証情報 ................................................................................. 197
DATEFORMAT と TIMEFORMAT の文字列 .......................................................... 198
DATEFORMAT と TIMEFORMAT で自動認識を使用する ..................................... 199
COPY の例 ....................................................................................................................... 200
ESCAPE オプションを指定する COPY 用のファイルの準備 ......................................... 207
CREATE DATABASE ................................................................................................................ 209
CREATE GROUP ...................................................................................................................... 210
CREATE SCHEMA .................................................................................................................... 210
CREATE TABLE ........................................................................................................................ 211
CREATE TABLE の使用に関する注意事項 ...................................................................... 216
CREATE TABLE の例 ...................................................................................................... 217
CREATE TABLE AS .................................................................................................................. 220
CTAS の使用に関する注意事項 ....................................................................................... 223
CTAS の例 ........................................................................................................................ 223
CREATE USER ......................................................................................................................... 225
CREATE VIEW .......................................................................................................................... 227
DEALLOCATE ........................................................................................................................... 227
DECLARE .................................................................................................................................. 228
DELETE ..................................................................................................................................... 231
DROP DATABASE .................................................................................................................... 232
DROP GROUP .......................................................................................................................... 233
DROP SCHEMA ........................................................................................................................ 233
DROP TABLE ............................................................................................................................ 234
DROP USER ............................................................................................................................. 236
DROP VIEW .............................................................................................................................. 237
END ........................................................................................................................................... 238
EXECUTE .................................................................................................................................. 239
EXPLAIN .................................................................................................................................... 240
API Version 2012-12-01
7
Amazon Redshift データベース開発者ガイド
FETCH ....................................................................................................................................... 244
GRANT ...................................................................................................................................... 245
INSERT ...................................................................................................................................... 248
INSERT の例 .................................................................................................................... 250
LOCK ......................................................................................................................................... 253
PREPARE .................................................................................................................................. 253
RESET ....................................................................................................................................... 255
REVOKE .................................................................................................................................... 255
ROLLBACK ................................................................................................................................ 258
SELECT ..................................................................................................................................... 259
WITH 句 ............................................................................................................................ 260
SELECT リスト ................................................................................................................ 263
TOP を使った例 ...................................................................................................... 265
SELECT DISTINCT の例 ........................................................................................ 265
FROM 句 .......................................................................................................................... 266
WHERE 句 ....................................................................................................................... 268
WHERE 句の Oracle スタイルの外部結合 ............................................................. 269
GROUP BY 句 .................................................................................................................. 273
HAVING 句 ....................................................................................................................... 274
UNION、INTERSECT、または EXCEPT ........................................................................ 275
UNION クエリの例 ................................................................................................. 278
UNION ALL クエリの例 .......................................................................................... 280
INTERSECT クエリの例 ......................................................................................... 281
EXCEPT クエリの例 ............................................................................................... 282
ORDER BY 句 .................................................................................................................. 283
ORDER BY の例 ..................................................................................................... 284
結合例 ............................................................................................................................... 285
サブクエリの例 ................................................................................................................ 286
相関性のあるサブクエリ .................................................................................................. 287
SELECT INTO ........................................................................................................................... 289
Set ............................................................................................................................................ 289
SET SESSION AUTHORIZATION ............................................................................................ 293
SET SESSION CHARACTERISTICS ........................................................................................ 293
SHOW ........................................................................................................................................ 294
START TRANSACTION ............................................................................................................ 294
TRUNCATE ............................................................................................................................... 294
UNLOAD .................................................................................................................................... 295
UNLOAD の例 .................................................................................................................. 299
UPDATE .................................................................................................................................... 304
UPDATE ステートメントの例 ......................................................................................... 305
VACUUM ................................................................................................................................... 308
SQL 関数リファレンス ....................................................................................................................... 310
リーダーノード専用関数 ........................................................................................................... 311
集計関数 .................................................................................................................................... 312
AVG 関数 .......................................................................................................................... 312
COUNT 関数 .................................................................................................................... 314
MAX 関数 ......................................................................................................................... 315
MIN 関数 ........................................................................................................................... 316
STDDEV_SAMP および STDDEV_POP 関数 .................................................................. 317
SUM 関数 ......................................................................................................................... 318
VAR_SAMP および VAR_POP 関数 ................................................................................ 319
ビット単位の集計関数 ............................................................................................................... 320
BIT_AND 関数 .................................................................................................................. 322
BIT_OR 関数 .................................................................................................................... 322
BOOL_AND 関数 .............................................................................................................. 323
BOOL_OR 関数 ................................................................................................................ 323
ビット単位関数の例 ......................................................................................................... 323
ウィンドウ関数 .......................................................................................................................... 325
API Version 2012-12-01
8
Amazon Redshift データベース開発者ガイド
ウィンドウ関数の構文の概要 ........................................................................................... 327
AVG ウィンドウ関数 ........................................................................................................ 329
COUNT ウィンドウ関数 .................................................................................................. 330
DENSE_RANK ウィンドウ関数 ....................................................................................... 331
FIRST_VALUE および LAST_VALUE ウィンドウ関数 .................................................... 332
LAG ウィンドウ関数 ........................................................................................................ 333
LEAD ウィンドウ関数 ...................................................................................................... 334
MAX ウィンドウ関数 ....................................................................................................... 334
MIN ウィンドウ関数 ......................................................................................................... 335
NTH_VALUE ウィンドウ関数 .......................................................................................... 336
NTILE ウィンドウ関数 ..................................................................................................... 337
RANK ウィンドウ関数 ..................................................................................................... 338
STDDEV_SAMP および STDDEV_POP ウィンドウ関数 ................................................ 338
SUM ウィンドウ関数 ....................................................................................................... 339
VAR_SAMP および VAR_POP ウィンドウ関数 .............................................................. 340
ウィンドウ関数の例 ......................................................................................................... 341
AVG ウィンドウ関数の例 ....................................................................................... 342
COUNT ウィンドウ関数の例 .................................................................................. 342
DENSE_RANK ウィンドウ関数の例 ...................................................................... 343
FIRST_VALUE および LAST_VALUE ウィンドウ関数の例 ................................... 344
LAG ウィンドウ関数の例 ....................................................................................... 346
LEAD ウィンドウ関数の例 ..................................................................................... 347
MAX ウィンドウ関数の例 ....................................................................................... 347
MIN ウィンドウ関数の例 ........................................................................................ 348
NTH_VALUE ウィンドウ関数の例 .......................................................................... 349
NTILE ウィンドウ関数の例 .................................................................................... 350
RANK ウィンドウ関数の例 ..................................................................................... 350
STDDEV_POP および VAR_POP ウィンドウ関数の例 ......................................... 352
SUM ウィンドウ関数の例 ....................................................................................... 352
ウィンドウ関数用データの一意の並び順 ............................................................... 354
条件式 ........................................................................................................................................ 355
CASE 式 ........................................................................................................................... 355
COALESCE ...................................................................................................................... 357
DECODE 式 ..................................................................................................................... 357
NVL 式 .............................................................................................................................. 359
NULLIF 式 ........................................................................................................................ 360
日付関数 .................................................................................................................................... 361
ADD_MONTHS(Oracle 互換性関数) ............................................................................ 361
AGE 関数 .......................................................................................................................... 363
CONVERT_TIMEZONE 関数 ........................................................................................... 363
CURRENT_DATE および TIMEOFDAY 関数 .................................................................. 365
CURRENT_TIME および CURRENT_TIMESTAMP 関数 ................................................ 366
DATE_CMP 関数 .............................................................................................................. 367
DATE_CMP_TIMESTAMP 関数 ....................................................................................... 368
DATE_PART_YEAR 関数 ................................................................................................. 368
DATEADD 関数 ................................................................................................................ 369
DATEDIFF 関数 ................................................................................................................ 371
DATE_PART 関数 ............................................................................................................ 372
DATE_TRUNC 関数 ......................................................................................................... 374
EXTRACT 関数 ................................................................................................................ 374
GETDATE() ...................................................................................................................... 375
INTERVAL_CMP 関数 ...................................................................................................... 376
ISFINITE 関数 .................................................................................................................. 377
LOCALTIME および LOCALTIMESTAMP 関数 ............................................................... 378
NOW 関数 ........................................................................................................................ 379
SYSDATE(Oracle 互換性関数) .................................................................................... 379
TIMESTAMP_CMP 関数 .................................................................................................. 380
TIMESTAMP_CMP_DATE 関数 ....................................................................................... 382
API Version 2012-12-01
9
Amazon Redshift データベース開発者ガイド
TRUNC(timestamp) .......................................................................................................... 383
日時指定関数の日付部分 .................................................................................................. 383
数学関数 .................................................................................................................................... 385
数学演算子の記号 ............................................................................................................. 386
ABS 関数 .......................................................................................................................... 388
ACOS 関数 ....................................................................................................................... 388
ASIN 関数 ......................................................................................................................... 389
ATAN 関数 ........................................................................................................................ 390
ATAN2 関数 ...................................................................................................................... 391
CBRT 関数 ....................................................................................................................... 391
CEILING(または CEIL)関数 ......................................................................................... 392
CHECKSUM 関数 ............................................................................................................. 392
COS 関数 ......................................................................................................................... 393
COT 関数 .......................................................................................................................... 394
DEGREES 関数 ................................................................................................................ 394
DEXP 関数 ....................................................................................................................... 395
DLOG1 関数 ..................................................................................................................... 396
DLOG10 関数 ................................................................................................................... 396
EXP 関数 .......................................................................................................................... 396
FLOOR 関数 ..................................................................................................................... 397
LN 関数 ............................................................................................................................. 398
LOG 関数 .......................................................................................................................... 399
MOD 関数 ......................................................................................................................... 400
PI 関数 .............................................................................................................................. 400
POWER 関数 .................................................................................................................... 401
RADIANS 関数 ................................................................................................................. 402
RANDOM 関数 ................................................................................................................. 402
ROUND 関数 .................................................................................................................... 404
SIN 関数 ........................................................................................................................... 405
SIGN 関数 ........................................................................................................................ 406
SQRT 関数 ....................................................................................................................... 406
TAN 関数 .......................................................................................................................... 407
TRUNC 関数 ..................................................................................................................... 408
文字列関数 ................................................................................................................................. 410
|| (連結)演算子 ............................................................................................................. 411
ASCII 関数 ........................................................................................................................ 412
BPCHARCMP 関数 .......................................................................................................... 412
BTRIM 関数 ...................................................................................................................... 414
BTTEXT_PATTERN_CMP 関数 ....................................................................................... 415
CHAR_LENGTH 関数 ....................................................................................................... 415
CHARACTER_LENGTH 関数 .......................................................................................... 415
CHARINDEX 関数 ............................................................................................................ 415
CHR 関数 ......................................................................................................................... 416
CONCAT(Oracle 互換関数) ......................................................................................... 417
CRC32 関数 ..................................................................................................................... 418
FUNC_SHA1 関数 ............................................................................................................ 419
GET_BIT 関数 .................................................................................................................. 419
GET_BYTE 関数 ............................................................................................................... 420
INITCAP 関数 ................................................................................................................... 421
LEFT 関数および RIGHT 関数 ......................................................................................... 422
LEN 関数 .......................................................................................................................... 423
LENGTH 関数 ................................................................................................................... 424
LOWER 関数 .................................................................................................................... 424
LPAD 関数および RPAD 関数 .......................................................................................... 425
LTRIM 関数 ...................................................................................................................... 426
MD5 関数 .......................................................................................................................... 427
OCTET_LENGTH 関数 ..................................................................................................... 428
POSITION 関数 ................................................................................................................ 428
API Version 2012-12-01
10
Amazon Redshift データベース開発者ガイド
QUOTE_IDENT 関数 ........................................................................................................ 429
QUOTE_LITERAL 関数 .................................................................................................... 430
REPEAT 関数 ................................................................................................................... 431
REPLACE 関数 ................................................................................................................ 432
REPLICATE 関数 ............................................................................................................. 433
REVERSE 関数 ................................................................................................................ 433
RTRIM 関数 ...................................................................................................................... 434
SET_BIT 関数 ................................................................................................................... 435
SET_BYTE 関数 ............................................................................................................... 435
SPLIT_PART 関数 ............................................................................................................ 436
STRPOS 関数 .................................................................................................................. 437
SUBSTRING 関数 ............................................................................................................ 438
TEXTLEN 関数 ................................................................................................................. 440
TO_ASCII 関数 ................................................................................................................. 441
TO_HEX 関数 ................................................................................................................... 441
TRIM 関数 ........................................................................................................................ 442
UPPER 関数 ..................................................................................................................... 442
JSON 関数 ................................................................................................................................. 443
JSON_ARRAY_LENGTH ................................................................................................. 444
JSON_EXTRACT_ARRAY_ELEMENT_TEXT ................................................................ 445
JSON_EXTRACT_PATH_TEXT ....................................................................................... 445
データ型フォーマット関数 ........................................................................................................ 446
CAST 関数および CONVERT 関数 .................................................................................. 446
TO_CHAR ........................................................................................................................ 449
TO_DATE ......................................................................................................................... 452
TO_NUMBER ................................................................................................................... 452
日時形式の文字列 ............................................................................................................. 453
数値形式の文字列 ............................................................................................................. 454
システム管理関数 ...................................................................................................................... 455
CURRENT_SETTING ...................................................................................................... 455
SET_CONFIG ................................................................................................................... 456
システム情報関数 ...................................................................................................................... 456
CURRENT_DATABASE ................................................................................................... 457
CURRENT_SCHEMA ....................................................................................................... 457
CURRENT_SCHEMAS .................................................................................................... 458
CURRENT_USER ............................................................................................................ 459
CURRENT_USER_ID ....................................................................................................... 459
HAS_DATABASE_PRIVILEGE ........................................................................................ 460
HAS_SCHEMA_PRIVILEGE ............................................................................................ 460
HAS_TABLE_PRIVILEGE ................................................................................................ 461
SESSION_USER .............................................................................................................. 462
SLICE_NUM 関数 ............................................................................................................. 463
USER ............................................................................................................................... 463
VERSION() ....................................................................................................................... 463
予約語 ................................................................................................................................................. 464
システムテーブルのリファレンス ...................................................................................................... 467
システムテーブルとビュー ................................................................................................................. 467
システムテーブルとビューのタイプ ................................................................................................... 468
システムテーブルとビューのデータの可視性 .................................................................................... 468
ログ記録のための STL テーブル ........................................................................................................ 469
STL_AGGR ................................................................................................................................ 470
STL_BCAST .............................................................................................................................. 472
STL_CONNECTION_LOG ......................................................................................................... 473
STL_DDLTEXT .......................................................................................................................... 474
STL_DIST .................................................................................................................................. 475
STL_DELETE ............................................................................................................................ 476
STL_ERROR ............................................................................................................................. 478
STL_EXPLAIN ........................................................................................................................... 479
API Version 2012-12-01
11
Amazon Redshift データベース開発者ガイド
STL_FILE_SCAN ....................................................................................................................... 481
STL_HASH ................................................................................................................................ 482
STL_HASHJOIN ........................................................................................................................ 484
STL_INSERT ............................................................................................................................. 485
STL_LIMIT ................................................................................................................................. 486
STL_LOAD_COMMITS .............................................................................................................. 489
STL_LOAD_ERRORS ............................................................................................................... 491
STL_LOADERROR_DETAIL ..................................................................................................... 492
STL_MERGE ............................................................................................................................. 493
STL_MERGEJOIN ..................................................................................................................... 495
STL_NESTLOOP ....................................................................................................................... 496
STL_PARSE .............................................................................................................................. 497
STL_PROJECT .......................................................................................................................... 499
STL_QUERY .............................................................................................................................. 500
STL_QUERYTEXT .................................................................................................................... 502
STL_REPLACEMENTS ............................................................................................................. 503
STL_S3CLIENT ......................................................................................................................... 504
STL_S3CLIENT_ERROR .......................................................................................................... 505
STL_SCAN ................................................................................................................................ 507
STL_SESSIONS ........................................................................................................................ 508
STL_SORT ................................................................................................................................ 509
STL_STREAM_SEGS ................................................................................................................ 511
STL_TR_CONFLICT .................................................................................................................. 511
STL_UNDONE ........................................................................................................................... 512
STL_UNIQUE ............................................................................................................................ 513
STL_UNLOAD_LOG .................................................................................................................. 515
STL_USERLOG ......................................................................................................................... 516
STL_UTILITYTEXT .................................................................................................................... 517
STL_VACUUM ........................................................................................................................... 518
STL_WARNING ......................................................................................................................... 520
STL_WINDOW ........................................................................................................................... 521
STL_WLM_ERROR ................................................................................................................... 522
STL_WLM_QUERY ................................................................................................................... 522
スナップショットデータの STV テーブル .......................................................................................... 525
STV_ACTIVE_CURSORS ......................................................................................................... 526
STV_BLOCKLIST ...................................................................................................................... 526
STV_CURSOR_CONFIGURATION .......................................................................................... 529
STV_EXEC_STATE ................................................................................................................... 530
STV_INFLIGHT .......................................................................................................................... 531
STV_LOAD_STATE ................................................................................................................... 532
STV_LOCKS .............................................................................................................................. 533
STV_PARTITIONS .................................................................................................................... 534
STV_RECENTS ......................................................................................................................... 536
STV_SLICES ............................................................................................................................. 537
STV_SESSIONS ........................................................................................................................ 538
STV_TBL_PERM ....................................................................................................................... 539
STV_TBL_TRANS ..................................................................................................................... 541
STV_WLM_CLASSIFICATION_CONFIG .................................................................................. 542
STV_WLM_QUERY_QUEUE_STATE ....................................................................................... 543
STV_WLM_QUERY_STATE ...................................................................................................... 544
STV_WLM_QUERY_TASK_STATE .......................................................................................... 545
STV_WLM_SERVICE_CLASS_CONFIG ................................................................................... 546
STV_WLM_SERVICE_CLASS_STATE ..................................................................................... 547
システムビュー ................................................................................................................................... 548
SVV_DISKUSAGE ..................................................................................................................... 549
SVL_QERROR .......................................................................................................................... 551
SVL_QLOG ................................................................................................................................ 551
SVV_QUERY_INFLIGHT ........................................................................................................... 552
API Version 2012-12-01
12
Amazon Redshift データベース開発者ガイド
SVL_QUERY_REPORT ............................................................................................................. 553
SVV_QUERY_STATE ................................................................................................................ 555
SVL_QUERY_SUMMARY ......................................................................................................... 557
SVL_STATEMENTTEXT ........................................................................................................... 559
SVV_VACUUM_PROGRESS .................................................................................................... 561
SVV_VACUUM_SUMMARY ...................................................................................................... 562
SVL_VACUUM_PERCENTAGE ................................................................................................ 563
システムカタログテーブル ................................................................................................................. 563
PG_TABLE_DEF ....................................................................................................................... 564
カタログテーブルへのクエリの実行 ......................................................................................... 565
カタログクエリの例 ......................................................................................................... 566
設定リファレンス ............................................................................................................................... 569
サーバー設定の変更 ............................................................................................................................ 569
datestyle .............................................................................................................................................. 570
extra_float_digits ................................................................................................................................. 570
query_group ........................................................................................................................................ 571
search_path ......................................................................................................................................... 571
statement_timeout ............................................................................................................................... 572
wlm_query_slot_count ......................................................................................................................... 573
サンプルデータベース ........................................................................................................................ 575
CATEGORY テーブル ......................................................................................................................... 576
DATE テーブル ................................................................................................................................... 576
EVENT テーブル ................................................................................................................................. 577
VENUE テーブル ................................................................................................................................ 577
USERS テーブル ................................................................................................................................ 577
LISTING テーブル ............................................................................................................................... 578
SALES テーブル ................................................................................................................................. 578
付録: タイムゾーンの名前と省略形 .................................................................................................... 580
タイムゾーンの名前 ............................................................................................................................ 580
タイムゾーンの省略形 ........................................................................................................................ 590
ドキュメント履歴 ............................................................................................................................... 595
API Version 2012-12-01
13
Amazon Redshift データベース開発者ガイド
Amazon Redshift を初めてお使いになる方向けの情報
ようこそ
Topics
• Amazon Redshift を初めてお使いになる方向けの情報 (p. 1)
• データベース開発者向けの情報 (p. 2)
• 前提条件 (p. 3)
これは、『Amazon Redshift データベース開発者ガイド』です。
Amazon Redshift は、エンタープライズレベル、ペタバイト規模、完全マネージド型のデータウェアハ
ウスサービスです。
このガイドでは、Amazon Redshift を使用してデータウェアハウスの作成と管理を行う方法を説明しま
す。データベースに対して設計者、ソフトウェア開発者、または管理者として作業する方を対象とし
て、データウェアハウスを構成するリレーショナルデータベースの設計、構築、クエリ、および保守に
必要となる情報を示しています。
Amazon Redshift を初めてお使いになる方向けの
情報
Amazon Redshift を使用するのが初めての場合は、次に示すセクションを初めに読むことをお勧めしま
す。
• サービスの特徴と料金 – 製品詳細ページには、Amazon Redshift の利点、サービスの特徴、料金表が
掲載されています。
• 入門ガイド – 入門ガイドでは、例を通して Amazon Redshift データウェアハウスクラスターの作成、
データベーステーブルの作成、データのアップロード、およびクエリのテストのプロセスを順に説明
しています。
入門ガイドを読み終えたら、次のガイドのいずれかに進むことをお勧めします。
• Amazon Redshift Cluster Management Guide – クラスター管理ガイドでは、Amazon Redshift クラス
ターの作成と管理の方法を説明しています。
アプリケーション開発者は、Amazon Redshift Query API を使ってクラスターの管理をプログラムで
行うことができます。Amazon Redshift API をラップする AWS SDK ライブラリもあり、プログラミ
API Version 2012-12-01
1
Amazon Redshift データベース開発者ガイド
データベース開発者向けの情報
ング作業の単純化に役立ちます。クラスターをよりインタラクティブに管理したい場合は、Amazon
Redshift コンソールおよび AWS コマンドラインインターフェイス(AWS CLI)をご利用になれま
す。API および CLI の詳細については、以下のマニュアルを参照してください。
• API リファレンス
• CLI リファレンス
• Amazon Redshift データベース開発者ガイド(このドキュメント) – データベース開発者を対象とし
て、データウェアハウスを構成するデータベースの設計、構築、クエリ、保守の方法を説明していま
す。
別のリレーショナルデータベースシステムやデータウェアハウスアプリケーションから Amazon Redshift
への移行を計画している場合は、Amazon Redshift の実装方法における重要な相違点に注意してくださ
い。テーブルの設計とデータのロードに関する最重要の考慮事項の要約については、「テーブル設計の
ベストプラクティス (p. 30)」および「データロードのベストプラクティス (p. 53)」を参照してくださ
い。Amazon Redshift は PostgreSQL 8.0.2 に基づいています。Amazon Redshift と PostgreSQL の相
違の詳しいリストについては、「Amazon Redshift および PostgreSQL (p. 119)」を参照してください。
データベース開発者向けの情報
データベースユーザー、データベース設計者、データベース開発者、またはデータベース管理者向けの
情報を見つけるには、次の表を参考にしてください。
目的
推奨事項
今すぐ Amazon Redshift 初めに、入門ガイドのステップを順にたどると、すぐにクラスターをデプ
を使い始める
ロイし、データベースに接続して、クエリを実行してみることができます。
実際のデータベースの構築、テーブルへのデータのロード、およびデータ
ウェアハウス内のデータを操作するためのクエリ作成の準備ができたら、
このデータベース開発者ガイドに戻ってください。
Amazon Redshift データ 「Amazon Redshift システム概要 (p. 4)」で、Amazon Redshift の内部的
ウェアハウスの内部的な なアーキテクチャの概要を説明しています。
アーキテクチャを知る。
Amazon Redshift ウェブサービスの全体的な概要については、Amazon
Redshift の製品詳細ページを参照してください。
データベース、テーブ 「データベースの使用開始 (p. 12)」で SQL 開発の基本を紹介しています。
ル、ユーザー、およびそ
の他のデータベースオブ 「Amazon Redshift SQL (p. 117)」には、Amazon Redshift の SQL コマンド
ジェクトを作成する。 と関数およびその他の SQL 要素の構文と例があります。
「テーブル設計のベストプラクティス (p. 30)」は、ソートキー、分散キー、
および圧縮エンコーディングの選択に関する推奨事項の要約です。
パフォーマンスが最適に 「テーブルの設計 (p. 30)」で、テーブル列内のデータへの圧縮適用に関す
なるようにテーブルを設 る、および分散キーとソートキーの選択に関する考慮事項を詳しく説明し
計する方法を知る。
ています。
データをロードする。
「データのロード (p. 53)」で、大容量のデータセットを Amazon DynamoDB
のテーブルから、または Amazon S3 のバケットに格納されたフラットファ
イルからロードする手順を説明しています。
「データロードのベストプラクティス (p. 53)」には、データのロードの時
間短縮と効率向上のためのヒントがあります。
API Version 2012-12-01
2
Amazon Redshift データベース開発者ガイド
前提条件
目的
推奨事項
ユーザー、グループ、お 「データベースセキュリティの管理 (p. 23)」で、データベースのセキュリ
よびデータベースのセ ティに関するトピックを取り上げています。
キュリティを管理する。
システムのパフォーマン 「システムテーブルのリファレンス (p. 467)」で、システムテーブルおよび
スを監視して最適化す ビューについて詳しく説明しています。これらに対してクエリを実行する
る。
と、データベースのステータスが分かり、クエリやプロセスの監視を行う
ことができます。
また、『Amazon Redshift Management Guide』では、AWS マネジメント
コンソールを使用してシステムのヘルスチェック、メトリックスの監視、
およびクラスターのバックアップとリストアを行う方法を説明しています。
大容量データセットから Amazon Redshift は Jaspersoft や MicroStrategy とともに使用できることが
の情報を分析してレポー 認定されており、その他のビジネスインテリジェンスツールも近く追加さ
トを作成する。
れます。
「SQL リファレンス (p. 117)」に、Amazon Redshift でサポートされるすべ
ての SQL 式、コマンド、および関数の詳しい情報があります。
前提条件
このガイドをお使いになる前に、次の作業を完了してください。
• SQL クライアントをインストールします。
• Amazon Redshift クラスターを起動します。
• SQL クライアントをクラスターデータベースに接続します。
詳しい手順については、『Amazon Redshift 入門ガイド』を参照してください。
また、その SQL クライアントの使い方を知っていることと、SQL 言語の基本を理解していることも必
要です。
API Version 2012-12-01
3
Amazon Redshift データベース開発者ガイド
データウェアハウスシステムのアーキテクチャ
Amazon Redshift システム概要
Topics
• データウェアハウスシステムのアーキテクチャ (p. 4)
• パフォーマンス (p. 6)
• 列指向ストレージ (p. 7)
• 内部アーキテクチャとシステム操作 (p. 8)
• ワークロード管理 (p. 11)
Amazon Redshift データウェアハウスは、エンタープライズクラスのリレーショナルデータベースクエ
リおよび管理システムです。
Amazon Redshift は、ビジネスインテリジェンス(BI)、レポート、データ、分析ツールなど、多くの
種類のアプリケーションとのクライアント接続をサポートします。
分析クエリを実行するときは、大量のデータを複数のステージからなる操作で取得し、比較し、評価し
て、最終的な結果を生成します。
Amazon Redshift は、超並列処理、列指向データストレージ、および非常に効率的で対象を限定した
データ圧縮エンコードスキームの組み合わせによって、効率的なストレージと最善のクエリパフォーマ
ンスを実現します。このセクションでは、Amazon Redshift システムのアーキテクチャの概要、および
データベースを設計してクエリを作成し、アーキテクチャのパフォーマンスを最大限に活用する方法に
ついて説明します。
データウェアハウスシステムのアーキテクチャ
このセクションでは、次の図で示すような、Amazon Redshift データウェアハウスアーキテクチャの要
素について説明します。
クライアントアプリケーション
Amazon Redshift は、さまざまなデータロードおよび ETL(抽出、変換、およびロード)ツールや、ビ
ジネスインテリジェンス(BI)レポート、データマイニング、分析ツールと統合します。Amazon
Redshift は業界標準の PostgreSQL が基になっているので、既存のほとんどの SQL クライアントアプ
API Version 2012-12-01
4
Amazon Redshift データベース開発者ガイド
データウェアハウスシステムのアーキテクチャ
リケーションが最小限の変更で動作します。Amazon Redshift SQL と PostgreSQL の重要な相違点に
ついては、「Amazon Redshift および PostgreSQL (p. 119)」を参照してください。
接続
Amazon Redshift は、業界標準の PostgreSQL JDBC および ODBC ドライバを使用して、クライアン
トアプリケーションと通信します。詳細については、「Amazon Redshift と PostgreSQL JDBC および
ODBC (p. 119)」を参照してください。
クラスター
Amazon Redshift データウェアハウスの中核となるインフラストラクチャコンポーネントは、クラス
ターです。
クラスターは、1 つまたは複数のコンピューティングノードで構成されます。クラスターが 2 つ以上の
コンピューティングノードでプロビジョニングされている場合、追加のリーダーノードがコンピュー
ティングノードを調整して、外部の通信を処理します。クライアントアプリケーションはリーダーノー
ドだけと直接通信します。コンピューティングノードは外部アプリケーションからは見えません。
リーダーノード
リーダーノードは、クライアントプログラムおよびコンピューティングノードとのすべての通信を管理
します。リーダーノードは、データベース操作を遂行するための実行計画、具体的には複雑なクエリの
結果を取得するために必要な一連の手順を解析および作成します。リーダーノードは、実行計画に基づ
いて、コードをコンパイルし、コンパイル済みのコードをコンピューティングノードに配布し、データ
の一部分を各コンピューティングノードに割り当てます。
リーダーノードは、コンピューティングノードに格納されているテーブルがクエリで参照されている場
合にのみ、コンピューティングノードに SQL ステートメントを配布します。他のすべてのクエリは、
リーダーノードのみで実行されます。Amazon Redshift は、特定の SQL 機能をリーダーノードのみに
実装するように設計されています。これらの機能を使用するクエリが、コンピューティングノードに存
在するテーブルを参照する場合、エラーが返されます。詳細については、「リーダーノードでサポート
される SQL 関数 (p. 117)」を参照してください。
コンピューティングノード
リーダーノードは、実行計画の個別要素のコードをコンパイルし、コードを個々のコンピューティング
ノードに割り当てます。コンピューティングノードは、コンパイル済みのコードを実行し、中間結果を
リーダーノードに返送します。中間結果は、リーダーノードにおいて最終的に集計されます。
各コンピューティングノードの専用 CPU、メモリ、接続されているディスクストレージは、ノードの
タイプによって異なります。ワークロードが増えるに従って、ノードの数を増やすかノードの種類を
アップグレードして、または両方を行って、クラスターのコンピューティング能力とストレージ容量を
増強できます。
Amazon Redshift には 2 種類のノードがあります。XL ノードは、2 コア、15 GiB のメモリ、3 個のディ
スクドライブと 2 TB のローカル接続ストレージを備え、8XL ノードは、16 コア、120 GiB のメモリ、
24 個のディスクドライブと 16 TB のローカル接続ストレージを備えています。単一の 2 TB XL ノード
から始めて、ペタバイト以上のデータをサポートする複数の 16 TB 8XL ノードまで拡張できます。
データウェアハウスのクラスターおよびノードの詳細については、「内部アーキテクチャとシステム操
作 (p. 8)」を参照してください。
ノードスライス
コンピューティングノードはスライスに分割されていて、ノードのマルチコアプロセッサの各コアに 1
つのスライスが割り当てられます。各スライスは、ノードのメモリとディスク容量の一部を割り当てら
れて、ノードに割り当てられたワークロードの一部分を処理します。リーダーノードは、スライスへの
データの分散を管理し、クエリまたは他のデータベース操作のワークロードをスライスに分配します。
スライスは、並列処理を行って操作を完了します。
API Version 2012-12-01
5
Amazon Redshift データベース開発者ガイド
パフォーマンス
テーブルを作成するときは、必要に応じて 1 つの列を分散キーとして指定できます。テーブルにデータ
がロードされるときは、テーブルに対して定義されている分散キーに従って行がノードスライスに分配
されます。適切な分散キーを選択することにより、Amazon Redshift は並列処理を使用してデータを
ロードし、クエリを効率よく実行できます。分散キーの選択については、「最良の分散キーの選
択 (p. 31)」を参照してください。
内部ネットワーク
Amazon Redshift は、高帯域幅接続、近接性、およびカスタム通信プロトコルを利用して、リーダー
ノードとコンピューティングノードの間のプライベートで非常に高速のネットワーク通信を提供しま
す。コンピューティングノードは、クライアントアプリケーションが直接アクセスすることのない別の
独立したネットワークで動作します。
データベース
クラスターは、1 つ以上のデータベースで構成されます。ユーザーデータはコンピューティングノード
に格納されます。SQL クライアントはリーダーノードと通信し、リーダーノードはコンピューティン
グノードでのクエリの実行を調整します。
Amazon Redshift はリレーショナルデータベース管理システム(RDBMS)なので、他の RDBMS アプ
リケーションと互換性があります。Amazon Redshift は、標準的な RDBMS と同じ機能(データの挿入
や削除といったオンライントランザクション処理(OLTP)機能など)を提供しますが、非常に大きい
データセットの高パフォーマンスの分析とレポート向けに最適化されています。
Amazon Redshift は PostgreSQL 8.0.2 が基になっています。Amazon Redshift と PostgreSQL の間に
は非常に重要な相違がいくつかあり、データウェアハウスアプリケーションを設計して開発するときは
それを考慮する必要があります。Amazon Redshift SQL と PostgreSQL の違いについては、「Amazon
Redshift および PostgreSQL (p. 119)」を参照してください。
パフォーマンス
Amazon Redshift は、以下のパフォーマンス機能を採用することによって極めて高速のクエリ実行を実
現します。
•
•
•
•
超並列処理
列指向データストレージ
データ圧縮
クエリ最適化
• コンパイル済みコード
超並列処理
超並列処理(MPP)により、大量のデータに対して非常に複雑なクエリを高速で実行できます。複数
のコンピューティングノードがすべてのクエリ処理を行って、最終的に結果が集計されます。各ノード
の各コアは、同じコンパイル済みクエリセグメントをデータ全体の一部分に対して実行します。
Amazon Redshift はテーブルの行をコンピューティングノードに分配するので、データを並列処理でき
ます。各テーブルに対して適切な分散キーを選択することにより、データの分配を最適化して、ワーク
ロードを分散し、ノード間のデータの移動を最小限にできます。詳細については、「最良の分散キーの
選択 (p. 31)」を参照してください。
フラットファイルからのデータのロードでは、複数のノードにワークロードを分散させることによる並
列処理を利用して、複数のファイルから同時に読み取ります。テーブルへのデータのロード方法の詳細
については、「データロードのベストプラクティス (p. 53)」を参照してください。
列指向データストレージ
API Version 2012-12-01
6
Amazon Redshift データベース開発者ガイド
列指向ストレージ
データベーステーブルの列指向ストレージによって必要なディスク I/O の総量が大幅に減少するので、
この機能は分析クエリのパフォーマンスの最適化において重要な要因です。データベーステーブルの情
報を列指向の方式で格納すると、ディスク I/O 要求の数と、ディスクからロードする必要のあるデータ
の量が減ります。メモリにロードするデータが減少するので、Amazon Redshift はクエリを実行すると
きにより多くのメモリ内処理を実行できます。詳細な説明については、「列指向ストレージ (p. 7)」
を参照してください。
列が適切にソートされていると、クエリプロセッサは大きいデータブロックのサブセットをすばやく除
外できます。詳細については、「最良のソートキーの選択 (p. 31)」を参照してください。
データ圧縮
データ圧縮により必要なストレージが減るので、ディスク I/O が減少し、クエリのパフォーマンスが向
上します。クエリを実行すると、圧縮されたデータがメモリに読み込まれ、クエリの実行の間に圧縮解
除されます。メモリにロードするデータが少なくなると、Amazon Redshift はデータの分析に割り当て
るメモリを増やすことができます。列指向ストレージは類似したデータをシーケンシャルに格納するの
で、Amazon Redshift は列のデータ型と明示的に結び付けられた適応型圧縮エンコーディングを適用で
きます。テーブルの列でデータの圧縮を有効にする最善の方法は、テーブルにデータをロードするとき
に、Amazon Redshift が最善の圧縮エンコーディングを適用できるようにすることです。自動データ圧
縮の詳細については、「自動圧縮ありでテーブルをロードする (p. 73)」を参照してください。
クエリオプティマイザ
Amazon Redshift のクエリ実行エンジンには、MPP 対応であり、列指向データストレージも利用する
クエリオプティマイザが組み込まれています。Amazon Redshift のクエリオプティマイザでは、複数
テーブルの結合、サブクエリ、集計が含まれることが多い複雑な分析クエリを処理するための多くの強
化と拡張が実装されています。クエリの最適化の詳細については、「クエリパフォーマンスのチューニ
ング (p. 98)」を参照してください。
コンパイル済みコード
リーダーノードは、完全に最適化されたコンパイル済みコードをクラスターのすべてのノードに分配し
ます。クエリをコンパイルすると、インタープリタに伴うオーバーヘッドがなくなるので、実行速度
(特に複雑なクエリの場合)が向上します。コンパイル済みのコードはキャッシュされて、同じクラス
ターのセッション間で共有されるので、同じクエリーの 2 回目以降の実行は、パラメータが異なってい
たとしても速くなります。
実行エンジンは、JDBC 接続プロトコルと ODBC および psql(libq)接続プロトコルでは異なるコード
をコンパイルするので、異なるプロトコルを使用する 2 つのクライアントで、コードの初回コンパイル
時のコストが発生します。ただし、同じプロトコルを使用する他のクライアントには、キャッシュされ
たコードの共有によるメリットがあります。
列指向ストレージ
データベーステーブルの列指向ストレージは、必要な総ディスク I/O と、ディスクからロードする必要
のあるデータ量が大幅に減少するので、分析クエリのパフォーマンスの最適化において重要な要因で
す。
以下の一連の図では、列指向データストレージにおいて効率性がどのように実装され、データがメモリ
に読み込まれるときの効率性にどのように変換されるのかについて説明します。
この最初の図では、データベーステーブルのレコードが行ごとにディスクブロックに格納される一般的
な方法を示します。
標準的なリレーショナルデータベーステーブルでは、各行には 1 つのレコードのフィールド値が含まれ
ます。行対応のデータベースストレージでは、データブロックには、行全体を構成する連続した各列の
API Version 2012-12-01
7
Amazon Redshift データベース開発者ガイド
内部アーキテクチャとシステム操作
値がシーケンシャルに格納されます。ブロックサイズがレコードのサイズより小さい場合、1 レコード
全体のストレージに複数のブロックが使用される場合があります。ブロックサイズがレコードのサイズ
より大きい場合、1 レコード全体のストレージが 1 ブロックより小さくなり、ディスク容量の使用効率
が悪くなる場合があります。オンライントランザクション処理(OLTP)アプリケーションでは、ほと
んどのトランザクションに、通常は一度に 1 レコードまたは少数のレコードの、レコード全体の値の頻
繁な読み取りおよび書き込みが含まれます。その結果、行対応のストレージは OLTP データベースに
最適です。
次の図は、列指向ストレージにおいて、各列の値がディスクブロックにシーケンシャルに格納されるこ
とを示しています。
列指向ストレージを使用すると、各データブロックには複数の行の 1 つの列の値が格納されます。レ
コードがシステムに入ってくると、Amazon Redshift は各列のデータを列指向ストレージに透過的に変
換します。
この単純化した例では、列指向ストレージを使用することで、行ベースのストレージと比較して 3 倍の
数のレコードの列フィールド値を各データブロックに保持しています。つまり、同じ数のレコードの同
じ数の列フィールド値を読み取るのに必要な I/O 操作は、行対応ストレージの 3 分の 1 です。実際に
は、列数と行数が非常に多いテーブルでは、ストレージ効率がいっそう向上します。
利点としては、各ブロックが同じ型のデータを保持するので、ブロックデータは列のデータ型に対して
特に選択された圧縮方式を使用でき、ディスク容量と I/O がさらに減ります。データ型に基づく圧縮エ
ンコーディングの詳細については、「圧縮エンコード (p. 34)」を参照してください。
ディスクでのデータ保存容量の減少は、データの取得そしてメモリへのデータの格納にも引き継がれま
す。多くのデータベース操作では一度に 1 つまたは少数の列にのみアクセスして処理する必要があるだ
けなので、クエリに実際に必要な列のブロックだけを取得することでメモリ容量を節約できます。OLTP
トランザクションでは、通常、少数のレコードの行の大部分または全部の列が関係するのに対し、デー
タウェアハウスクエリでは、一般に、非常に多数の行のほんの数列だけが読み取られます。つまり、同
じ数の行の同じ数の列フィールド値を読み取るのに必要な I/O 操作および使用されるメモリは、行対応
ブロックを処理する必要がある場合の数分の 1 です。実際には、列数と行数が非常に多いテーブルで
は、効率が比例的に向上します。例えば、100 列のテーブルがあるとします。5 列を使用するクエリ
は、テーブルに含まれるデータの約 5 パーセントだけを読み取る必要があります。大きいデータベース
の場合、この節約は数十億または数兆のレコードに対して行われます。一方、行対応のデータベースで
は、必要のない 95 列も含まれるブロックを読み取ります。
通常、データベースブロックのサイズは 2~32 KB です。Amazon Redshift が使用するブロックサイズ
は 1 MB なので、いっそう効率的であり、クエリ実行の一部であるデータベースのロードまたは他の操
作の実行に必要な I/O 要求の数はさらに減少します。
内部アーキテクチャとシステム操作
Topics
• クエリ処理 (p. 9)
• クライアントの要求と実行 (p. 9)
• 説明プラン (p. 10)
• クエリ実行手順 (p. 10)
次の図では、Amazon Redshift データウェアハウスの内部コンポーネントと機能の概要を示します。
API Version 2012-12-01
8
Amazon Redshift データベース開発者ガイド
クエリ処理
クエリ処理
実行エンジンは、SQL クエリまたは他のデータベース操作がクラスターによって計画および実行され
て、結果またはステータスがクライアントに返送される方法を制御します。ここでは、Amazon Redshift
のクエリ処理の概要を説明します。詳細については、「クエリパフォーマンスのチューニング (p. 98)」
を参照してください。
クライアントの要求と実行
Amazon Redshift は、要求された操作(SQL クエリまたは他のデータベース操作)をパーサーおよび
オプティマイザを通過させて、操作を実行するためのクエリ実行計画を作成します。
次に示す図は、クエリの計画と実行のワークフローの概要です。
Note
これらの手順では、テーブルのデータがデータベースにロードされていて、ANALYZE コマン
ドを実行して統計情報がすでに収集されていることを想定しています。
1. パーサー SELECT、UPDATE、INSERT、または DELETE ステートメントを含む新しい要求が到着
すると、リーダーノードは要求をパーサーに渡します。パーサーも、SELECT 句を含むステートメ
ント(CREATE TABLE AS など)を処理します。
2. クエリツリー パーサーは、元のクエリまたはステートメントの論理的な表現である初期クエリツリー
を生成します。Amazon Redshift オプティマイザは、これを入力として受け取って、クエリの論理変
換を行い、クエリ実行計画の作成に使用する物理的な計画を実行します。
3. 論理変換 オプティマイザは、述語プッシュ、関連付けられているサブクエリの関連付け解除、結合
の除去、共通部分式の最適化、その他の複数の処理などの最適化を含むクエリの書き換えを実行し
ます。
4. クエリプラン 最終的なクエリツリーがクエリプランに変換されます。クエリプランの作成には、使
用する方法と処理手順(ハッシュ結合またはマージ結合、集計計画、結合順序など)の決定が含ま
れます。
クエリプランまたは説明プランを表示するには、EXPLAIN (p. 240) コマンドを使用できます。クエリ
プランは、複雑なクエリを分析およびチューニングするための基本ツールです。説明プランを使用
してクエリを最適化する方法の詳細については、「クエリプランの分析」を参照してください。
5. 実行エンジン 実行エンジンは、手順、セグメント、ストリームを組み合わせて、オプティマイザに
よって提供されたクエリプランを実行します。コンピューティングノードによって実行される C++
コードを生成してコンパイルします。コンパイル済みコードは解釈されるコードより速く、使用す
るコンピューティング能力が少なくて済みます。クエリのベンチマークを行うときは、常に、クエ
リの 2 回目の実行の時間を比較する必要があります。1 回目の実行の時間には、コードをコンパイル
するオーバーヘッドが含まれるためです。詳細については、「コンパイル済みコードによるベンチ
マーク (p. 110)」を参照してください。
6. コンピューティングノード 実行エンジンは、ストリームに対応する実行可能コードを各コンピュー
ティングノードに送ります。
Amazon Redshift クエリの実行パフォーマンスで重要なことの 1 つは、各ノードスライス内の個別
のクエリプロセスがコンパイル済みのクエリコードを並列に実行するということです。さらに、
Amazon Redshift は、最適化されたネットワーク通信、メモリ、ディスク管理を利用して、クエリプ
ランのステップ間で中間結果を受け渡すことも、クエリ実行の高速化に役立ちます。
API Version 2012-12-01
9
Amazon Redshift データベース開発者ガイド
説明プラン
説明プラン
次の例では、SQL クエリおよび Amazon Redshift がクエリの実行に必要な論理手順を示すために作成
する最終的なクエリプラン(説明プラン)を示します。説明プランを最初から読むと、クエリの実行に
必要な論理操作の詳細と、相対コストおよび処理する必要のあるデータ量がわかります。クエリプラン
を分析することで、クエリのパフォーマンス向上の機会を識別できることがよくあります。
select eventname, sum(pricepaid) from sales, event
where sales.eventid = event.eventid
group by eventname
order by 2 desc;
QUERY PLAN
XN Merge (cost=1000451920505.33..1000451920506.77 rows=576 width=27)
Merge Key: sum(sales.pricepaid)
-> XN Network (cost=1000451920505.33..1000451920506.77 rows=576 width=27)
Send to leader
-> XN Sort (cost=1000451920505.33..1000451920506.77 rows=576 width=27)
Sort Key: sum(sales.pricepaid)
-> XN HashAggregate (cost=451920477.48..451920478.92 rows=576
width=27)
->
XN Hash Join DS_DIST_INNER
(cost=47.08..451920458.65
rows=3766 width=27)
Inner Dist Key: sales.eventid
Hash Cond: ("outer".eventid = "inner".eventid)
-> XN Seq Scan on event (cost=0.00..87.98 rows=8798
width=21)
->
XN Hash (cost=37.66..37.66 rows=3766 width=14)
-> XN Seq Scan on sales (cost=0.00..37.66
rows=3766 width=14)
説明プランを読む方法の詳細については、「説明プランの分析 (p. 99)」を参照してください。
クエリ実行手順
実行計画生成の一部として、クエリオプティマイザは、データおよびクエリのワークロードをコンピュー
ティングノードに分配するための準備として、計画をストリーム、セグメント、ステップに細分化しま
す。説明プランと併せてシステムビューを見ることにより、列制約、ソートキー、分散キーをテーブル
設計の一部として指定することにより、クエリのパフォーマンスが向上するかどうかを判断できます。
説明プランを調べることで、クエリを書き直してクエリのパフォーマンスを改善できることがわかる場
合もあります。
次の図では、前の例の説明プランを使用して、クエリオプティマイザが説明プランの論理操作を、
Amazon Redshift がコンピューティングノードスライス用のコンパイル済みコードを生成するために使
用するストリーム、セグメント、ステップに変換する方法を示します。
ステップ 各ステップは、説明プランに含まれる個別の操作です。コンピューティングノードはステッ
プを組み合わせることによってクエリ、結合、または他のデータベース操作を実行できます。
API Version 2012-12-01
10
Amazon Redshift データベース開発者ガイド
ワークロード管理
セグメント 1 つのプロセスで実行できる複数のステップ。セグメントは、コンピューティングノードに
よって実行できる単一のコンパイル単位でもあります。各セグメントは、テーブルデータの SCAN で
開始し、マテリアル化ステップまたは他のネットワークアクティビティで終了します。
ストリーム 常にデータセットの SCAN で開始してマテリアル化ステップまたはブロッキングステップ
で終了するセグメントのコレクション。マテリアル化ステップまたはブロッキングステップには、
HASH、AGG、SORT、および SAVE が含まれます。
クエリの最後のセグメントはデータを返します。リターンセットが集計またはソートされている場合
は、各コンピューティングノードは中間結果をリーダーノードに送信し、リーダーノードは最終結果を
要求元クライアントに返送できるようにデータをマージします。
説明プランで使用される演算子の詳細については、「EXPLAIN の演算子 (p. 102)」を参照してくださ
い。
ワークロード管理
Amazon Redshift のワークロード管理(WLM)を使用すると、ユーザーは、ワークロード内の優先順
位を柔軟に管理して、短くて実行速度の速いクエリが実行時間の長いクエリの後に溜まらないようにで
きます。
Amazon Redshift WLM は、サービスクラスに従って実行時にクエリキューを作成します。サービスク
ラスでは、内部システムキューやユーザーアクセス可能キューなどのさまざまな種類のキューに対する
設定パラメータが定義されています。ユーザーから見た場合、ユーザーアクセス可能サービスクラスと
キューは機能的に同じものです。一貫性を保つため、このドキュメントでは、ユーザーアクセス可能
サービスクラスとランタイムキューを表すために、キューという用語を使用します。
ユーザーがクエリを実行すると、WLM は、ユーザーのユーザーグループに従って、またはキューの設
定でリストされているキューグループと、ユーザーが実行時に設定したキューグループラベルを照合す
ることによって、クエリをキューに割り当てます。
デフォルトでは、Amazon Redshift は、同時実行レベルが 5(最大 5 個のクエリが同時に実行でき
ます)の 1 つのキューと、同時実行レベルが 1 の定義済みスーパーユーザーキューを設定します。最
大で 8 個のキューを定義できます。各キューの同時実行レベルは最大で 15 に設定できます。すべての
ユーザー定義キュー(スーパーユーザーキューは含みません)の同時実行レベルの合計の最大値は 15
です。
WLM の設定を変更する最も簡単は方法は、Amazon Redshift マネジメントコンソールを使用すること
です。Amazon Redshift のコマンドラインインターフェイス(CLI)または Amazon Redshift API を使
用することもできます。
ワークロード管理の実装と使用の詳細については、「ワークロード管理の実装 (p. 111)」を参照してく
ださい。
API Version 2012-12-01
11
Amazon Redshift データベース開発者ガイド
ステップ 1: データベースを作成する
データベースの使用開始
Topics
• ステップ 1: データベースを作成する (p. 12)
• ステップ 2: データベースユーザーを作成する (p. 13)
• ステップ 3: データベーステーブルを作成する (p. 14)
• ステップ 4: サンプルデータをロードする (p. 15)
• ステップ 5: システムテーブルをクエリする (p. 18)
• ステップ 6: クエリをキャンセルする (p. 20)
• ステップ 7: リソースをクリーンアップする (p. 22)
このセクションでは、Amazon Redshift データベースの使用を開始するための基本ステップについて説
明します。
このセクションで説明する例は、Amazon Redshift データウェアハウスへのサインアップ、クラスター
の作成、および SQL クエリツールからクラスターへの接続の確立が完了していることを前提としてい
ます。これらの作業を実行する手順については、『Amazon Redshift Getting Started Guide』を参照し
てください。
Important
この演習用にデプロイしたクラスターは、実働環境で実行されます。実行中は AWS アカウン
トに課金されます。演習が終了したらクラスターを削除してください。演習の最後のステップ
でその方法を説明します。
ステップ 1: データベースを作成する
クラスターが稼動していることを確認したら、最初のデータベースを作成します。このデータベースを
使って実際にテーブルを作成し、データをロードし、クエリを実行します。1 つのクラスターで複数の
データベースをホストすることができます。例えば、TICKIT データベースと ORDERS データベース
を 1 つのクラスターに置くことができます。
初期クラスターデータベース(クラスターを起動したときに作成したデータベース)に接続した後、新
しいデータベースを作成する際は、その初期データベースをベースにします。
例えば、tickit という名前のデータベースを作成するには、以下のコマンドを実行します。
API Version 2012-12-01
12
Amazon Redshift データベース開発者ガイド
ステップ 2: データベースユーザーを作成する
create database tickit;
この演習では、デフォルトの設定をそのまま使用します。コマンドオプションの詳細については、SQL
コマンドリファレンスの CREATE DATABASE (p. 209) を参照してください。
TICKIT データベースを作成した後、SQL クライアントからこのデータベースに接続します。データ
ベースに接続する方法は、使用している SQL クライアントによって異なります。詳細については
「Connecting to a Cluster」およびクライアントのマニュアルを参照してください。
TICKIT データベースに接続しない場合は、デフォルトデータベースを使用して残りの例を実行してく
ださい。
ステップ 2: データベースユーザーを作成する
デフォルトでは、クラスターを起動したときに作成したマスターユーザーのみがクラスター内の初期
データベースにアクセスできます。他のユーザーにもアクセス権を与えるには、ユーザーアカウントを
作成する必要があります。データベースユーザーアカウントは、クラスター内のすべてのデータベース
で共通のアカウントです。個々のデータベースに固有のものではありません。
新しいデータベースユーザーを作成するには、CREATE USER コマンドを使用します。新しいユーザー
を作成する際は、ユーザー名とパスワードを指定します。パスワードは必須です。パスワードは 8~64
文字で、大文字、小文字、数字をそれぞれ少なくとも 1 つずつ含める必要があります。
例えば、GUEST という名前と ABCd4321 というパスワードでユーザーを作成するには、以下のコマン
ドを実行します。
create user guest password 'ABCd4321';
他のコマンドオプションについては、SQL コマンドリファレンスの CREATE USER (p. 225) を参照し
てください。
データベースユーザーを削除する
このチュートリアルでは GUEST ユーザーアカウントは必要ないので、削除してかまいません。データ
ベースユーザーアカウントを削除すると、そのユーザーはどのクラスターデータベースにもアクセスで
きなくなります。
GUEST ユーザーを削除するには以下のコマンドを実行します。
drop user guest;
クラスターを起動したときに作成したマスターユーザーは、引き続きデータベースにアクセス権を持っ
ています。
Important
Amazon Redshift では、マスターユーザーを削除しないことを強くお勧めします。
コマンドオプションについては、SQL リファレンスの DROP USER (p. 236) を参照してください。
API Version 2012-12-01
13
Amazon Redshift データベース開発者ガイド
ステップ 3: データベーステーブルを作成する
ステップ 3: データベーステーブルを作成する
新しいデータベースを作成した後、データベースデータを格納するためのテーブルを作成します。テー
ブルを作成する際は、テーブルの列情報を指定します。
例えば、testtable というテーブルを作成し、列を 1 つ作成して testcol という列名を付け、デー
タタイプを整数に指定するには、以下のコマンドを実行します。
create table testtable (testcol int);
PG_TABLE_DEF システムテーブルには、クラスター内のすべてのテーブルに関する情報が含まれてい
ます。結果を確認するには、以下の SELECT コマンドを実行して、PG_TABLE_DEF システムテーブ
ルをクエリします。
select * from pg_table_def where tablename = 'testtable';
以下のようなクエリ結果が表示されます。
schemaname|tablename|column | type |encoding|distkey|sortkey | notnull
----------+---------+-------+-------+--------+-------+--------+--------public
|testtable|testcol|integer|none
|f
|
0 | f
(1 row)
デフォルトでは、テーブルなどの新しいデータベースオブジェクトは、「public」というスキーマで作
成されます。スキーマの詳細については、「データベースセキュリティの管理」セクションの スキー
マ (p. 26) を参照してください。
encoding、distkey、および sortkey 列は、Amazon Redshift が並列処理のために使用します。こ
れらの要素を含むテーブルの設計については、テーブル設計のベストプラクティス (p. 30) を参照して
ください。
テーブルにデータ行を挿入する
テーブルを作成した後、テーブル内にデータ行を挿入できます。
Note
データベーステーブル内に個々の行を挿入するには、INSERT (p. 248) コマンドを実行します。
標準的なバルクロードを実行するには、COPY (p. 187) コマンドを使用します。詳細について
は、「COPY コマンドを使ってデータをロードする (p. 54)」を参照してください。
例えば、列を 1 つだけ含む testtable テーブルに 100 という値を挿入するには、以下のコマンドを
実行します。
insert into testtable values (100);
テーブルからデータを選択する
テーブルを作成してデータを挿入した後、テーブル内にあるデータを表示するには、SELECT ステー
トメントを使用します。SELECT * ステートメントは、テーブル内のすべてのデータについて、すべて
の列名と行の値を返します。新しく追加したデータがテーブルに正しく入力されたかどうかを確認する
には良い方法です。
API Version 2012-12-01
14
Amazon Redshift データベース開発者ガイド
ステップ 4: サンプルデータをロードする
testtable テーブルに入力したデータを表示するには、以下のコマンドを実行します。
select * from testtable;
結果は以下のようになります。
testcol
--------100
(1 row)
クエリテーブルでの SELECT ステートメントの使用について詳しくは、SQL コマンドリファレンスの
SELECT (p. 259) を参照してください。
ステップ 4: サンプルデータをロードする
このガイドの例のほとんどは、TICKIT サンプルデータベースを使用しています。SQL クエリツールを
使用して例を実行するには、TICKIT データベースのサンプルデータをロードする必要があります。
これらの例のサンプルデータは、Amazon S3 バケット awssampledb にあります。有効なすべての AWS
アカウントにこのデータファイルへのアクセス権が与えられています。
Note
『Amazon Redshift Getting Started Guide』の手順を実行した場合は、これらのテーブルが
すでに存在しています。
TICKIT データベース用のサンプルデータをロードするには、まずテーブルを作成し、次に COPY コマ
ンドを使って、Amazon S3 バケットに格納されているサンプルデータを使ってテーブルをロードしま
す。詳細については、「Amazon S3 からデータをロードする (p. 61)」を参照してください。
CREATE TABLE コマンドを使用し、列とデータタイプのペアのリストを指定してテーブルを作成しま
す。この例で実行するテーブル作成ステートメントでは多くの場合、データタイプに加え列のオプショ
ンを指定します。例: not null、distkey、sortkey。これらは、クエリのパフォーマンスを高める
ようテーブルを最適化するための列属性です。テーブルの構造を設計する際のこれらのオプションの選
び方については、テーブルの設計 (p. 30) を参照してください。
1. データベースのテーブルを作成します。
テーブルを作成する SQL には、USERS、VENUE、CATEGORY、DATE、EVENT、LISTING、
SALES があります。
create table users(
userid integer not null distkey sortkey,
username char(8),
firstname varchar(30),
lastname varchar(30),
city varchar(30),
state char(2),
email varchar(100),
phone char(14),
likesports boolean,
liketheatre boolean,
API Version 2012-12-01
15
Amazon Redshift データベース開発者ガイド
ステップ 4: サンプルデータをロードする
likeconcerts boolean,
likejazz boolean,
likeclassical boolean,
likeopera boolean,
likerock boolean,
likevegas boolean,
likebroadway boolean,
likemusicals boolean);
create table venue(
venueid smallint not null distkey sortkey,
venuename varchar(100),
venuecity varchar(30),
venuestate char(2),
venueseats integer);
create table category(
catid smallint not null distkey sortkey,
catgroup varchar(10),
catname varchar(10),
catdesc varchar(50));
create table date(
dateid smallint not null distkey sortkey,
caldate date not null,
day character(3) not null,
week smallint not null,
month character(5) not null,
qtr character(5) not null,
year smallint not null,
holiday boolean default('N'));
create table event(
eventid integer not null distkey,
venueid smallint not null,
catid smallint not null,
dateid smallint not null sortkey,
eventname varchar(200),
starttime timestamp);
create table listing(
listid integer not null distkey,
sellerid integer not null,
eventid integer not null,
dateid smallint not null sortkey,
numtickets smallint not null,
priceperticket decimal(8,2),
totalprice decimal(8,2),
listtime timestamp);
create table sales(
salesid integer not null,
listid integer not null distkey,
sellerid integer not null,
buyerid integer not null,
eventid integer not null,
dateid smallint not null sortkey,
qtysold smallint not null,
API Version 2012-12-01
16
Amazon Redshift データベース開発者ガイド
ステップ 4: サンプルデータをロードする
pricepaid decimal(8,2),
commission decimal(8,2),
saletime timestamp);
2. データとともにテーブルをロードします。
このステップでは COPY コマンドを実行し、Amazon S3 バケットからのデータを使用してテーブル
をロードします。Amazon S3 バケット awssampledb には、これらの例で使用するためのサンプル
データがあります。バケットにはパブリック READ アクセス権が設定されているため、すべての有
効な AWS アカウントからこのデータにアクセスすることができます。これらの COPY コマンドを
実行するには、<your-access-key-id> と <your-secret-access-key> を有効な AWS アカウント認証情
報で置き換えます。
Important
この例では、米国東部(バージニア北部)リージョンにある Amazon S3 バケットを使用し
ます。COPY コマンドを使用してデータをロードするときは、データを格納しているバケッ
トが、クラスターと同じリージョンにある必要があります。クラスターが米国東部以外の
リージョンにある場合は、別のバケットを使用してください。別のリージョンからサンプル
データをロードする方法については、『Amazon Redshift Getting Started Guide』にある
「Create Tables, Upload Data, and Try Example Queries」を参照してください。
copy users from 's3://awssampledb/tickit/allusers_pipe.txt'
credentials 'aws_access_key_id=<access-key-id>;aws_secret_access_key=<secretaccess-key>'
delimiter '|';
copy venue from 's3://awssampledb/tickit/venue_pipe.txt'
credentials 'aws_access_key_id=<access-key-id>;aws_secret_access_key=<secretaccess-key>'
delimiter '|';
copy category from 's3://awssampledb/tickit/category_pipe.txt'
credentials 'aws_access_key_id=<access-key-id>;aws_secret_access_key=<secretaccess-key>'
delimiter '|';
copy date from 's3://awssampledb/tickit/date2008_pipe.txt'
credentials 'aws_access_key_id=<access-key-id>;aws_secret_access_key=<secretaccess-key>'
delimiter '|';
copy event from 's3://awssampledb/tickit/allevents_pipe.txt'
credentials 'aws_access_key_id=<access-key-id>;aws_secret_access_key=<secretaccess-key>'
delimiter '|' timeformat 'YYYY-MM-DD HH:MI:SS';
copy listing from 's3://awssampledb/tickit/listings_pipe.txt'
credentials 'aws_access_key_id=<access-key-id>;aws_secret_access_key=<secretaccess-key>'
delimiter '|';
copy sales from 's3://awssampledb/tickit/sales_tab.txt'
credentials 'aws_access_key_id=<access-key-id>;aws_secret_access_key=<secretaccess-key>'
delimiter '\t' timeformat 'MM/DD/YYYY HH:MI:SS';
3. ロード結果を確認します。
以下の SELECT ステートメントを使用して、テーブルが作成されデータがロードされていることを
確認してください。select count(*) ステートメントは、テーブル内にある行の数を返します。
API Version 2012-12-01
17
Amazon Redshift データベース開発者ガイド
ステップ 5: システムテーブルをクエリする
select
select
select
select
select
select
select
count(*)
count(*)
count(*)
count(*)
count(*)
count(*)
count(*)
from
from
from
from
from
from
from
users;
venue;
category;
date;
event;
listing;
sales;
ステップ 5: システムテーブルをクエリする
作成したテーブルに加え、データベースにはいくつかのシステムテーブルが含まれています。これらの
システムテーブルには、インストールに関する情報と、システムで実行されている各種のクエリや処理
に関する情報が格納されます。これらのシステムテーブルに対してクエリを実行して、データベースに
関する情報を収集することができます。
Note
『System Tables Reference』にある各テーブルの説明には、テーブルがスーパーユーザーま
たはユーザーのどちらから表示できるかが示されています。スーパーユーザーから表示可能な
テーブルに対してクエリを実行するには、スーパーユーザーとしてログインする必要がありま
す。
Amazon Redshift では、以下のタイプのシステムテーブルに対するアクセス権を提供しています。
• ログ記録のための STL テーブル (p. 469)
これらのシステムテーブルは、システムの履歴を提供するために Amazon Redshift ログファイルか
ら生成されます。ログテーブルには STL プレフィックスが付けられています。
• スナップショットデータの STV テーブル (p. 525)
これらのテーブルは、現在のシステムデータのスナップショットを格納した仮想システムテーブルで
す。スナップショットテーブルには STV プレフィックスが付けられています。
• システムビュー (p. 548)
システムビューには、複数の STL および STV システムテーブルから集めたデータのサブセットが含
まれます。システムビューには SVV または SVL プレフィックスが付けられています。
• システムカタログテーブル (p. 563)
システムカタログテーブルには、テーブルや列に関する情報などのスキーマメタデータが格納されて
います。システムカタログテーブルには PG プレフィックスが付けられています。
クエリに関するシステムテーブル情報を取得するには、そのクエリに関連付けられたプロセス ID を指
定しなければならない場合があります。詳細については、「実行中のクエリのプロセス ID を調べ
る (p. 20)」を参照してください。
テーブル名のリストを表示する
例えば、パブリックスキーマ内のすべてのテーブルのリストを表示するには、PG_TABLE_DEF システ
ムカタログテーブルをクエリします。
select tablename from pg_table_def where schemaname = 'public';
API Version 2012-12-01
18
Amazon Redshift データベース開発者ガイド
データベースユーザーを表示する
結果は以下のようになります。
tablename
--------category
date
event
listing
sales
testtable
users
venue
データベースユーザーを表示する
すべてのデータベースユーザーとそのユーザー ID(USESYSID)およびユーザー権限のリストを表示
するには、PG_USER カタログをクエリします。
select * from pg_user;
結果は以下のようになります。
usename | usesysid | usecreatedb | usesuper | usecatupd | passwd | valuntil
| useconfig
-----------+----------+-------------+----------+-----------+----------+---------+---------masteruser|
100 | t
| t
| f
| ******** |
|
rdsdb
|
1 | t
| t
| t
| ******** |
|
(2 rows)
最近のクエリを表示する
先の例では、マスターユーザーのユーザー ID(USESYSID)が 100 であることがわかりました。マス
ターユーザーが最も最近実行した 5 つのクエリをリストするには、STL_QLOG ビューをクエリします。
SVL_QLOG ビューには、STL_QUERY テーブルの情報のサブセットがわかりやすく表示されていま
す。このビューを使用して、最近実行されたクエリのクエリ ID(QUERY)やプロセス ID(PID)を調
べたり、クエリの完了にかかった時間を調べたりできます。クエリを特定しやすくするため、SVL_QLOG
には、クエリ文字列(SUBSTRING)の最初の 60 文字が含まれています。SELECT ステートメントで
LIMIT 句を使用すると、結果を 5 行に制限することができます。
select query, pid, elapsed, substring from svl_qlog
where userid = 100
order by starttime desc
limit 5;
結果は以下のようになります。
query | pid | elapsed |
substring
--------+-------+----------+-------------------------------------------------------------
API Version 2012-12-01
19
Amazon Redshift データベース開発者ガイド
実行中のクエリのプロセス ID を調べる
187752 | 18921
order by query
204168 | 5117
187561 | 17046
'testtable';
187549 | 17046
187468 | 17046
'public';
(5 rows)
| 18465685 | select query, elapsed, substring from svl_qlog
|
|
59603 | insert into testtable values (100);
1003052 | select * from pg_table_def where tablename =
|
|
1108584 | select * from STV_WLM_SERVICE_CLASS_CONFIG
5670661 | select * from pg_table_def where schemaname =
実行中のクエリのプロセス ID を調べる
先の例では、完了したクエリのクエリ ID とプロセス ID(PID)を SVL_QLOG ビューから調べる方法
を学びました。
しかし、実行中のクエリの PID を調べたいときもあります。例えば、実行に時間がかかりすぎている
クエリをキャンセルしたい場合などに、PID が必要となります。STV_RECENTS システムテーブルに
対してクエリを実行すると、実行中のクエリのプロセス ID とそれに対応するクエリ文字列のリストを
取得することができます。クエリに複数の PID がある場合は、クエリテキストを参照して、どれが目
的の PID かを判断することができます。
実行中のクエリの PID を調べるには、以下の STATEMENT ステートメントを実行します。
select pid, user_name, starttime, query
from stv_recents
where status='Running';
ステップ 6: クエリをキャンセルする
ユーザーが実行したクエリの実行に時間がかかりすぎている場合や、そのクエリによってクラスターの
リソースが大量に消費されている場合、クエリをキャンセルしなければならないことがあります。例え
ば、チケット販売者の名前と販売済みのチケット数を記載したリストを作成しようとしているような場
合です。以下のクエリでは、SALES テーブルと USERS テーブルからデータを選択し、WHERE 句内
で SELLERID と USERID を一致させることで 2 つのテーブルを結合しています。
select sellerid, firstname, lastname, sum(qtysold)
from sales, users
where sales.sellerid = users.userid
group by sellerid, firstname, lastname
order by 4 desc;
Note
これは複雑なクエリです。このチュートリアルでは、このクエリの構造を理解する必要はあり
ません。
前のクエリは数秒間で実行され、2,102 行を返しました。
ここでは、ユーザーが WHERE 句を挿入し忘れたとします。
API Version 2012-12-01
20
Amazon Redshift データベース開発者ガイド
他のセッションからクエリをキャンセルする
select sellerid, firstname, lastname, sum(qtysold)
from sales, users
group by sellerid, firstname, lastname
order by 4 desc;
その場合、結果セットには、SALES テーブルのすべての行と、USERS テーブルのすべての行を掛け
合わせた数(49989×3766)が含まれることになります。これはデカルト結合と呼ばれ、推奨されませ
ん。この例の場合は結果が 1 億 8800 万行を超えてしまい、実行に時間がかかりすぎます。
実行中のクエリをキャンセルするには、CANCEL コマンドにクエリの PID を指定して実行します。
プロセス ID を見つけるには、前のステップで見たように、STV_RECENTS テーブルを使用します。以
下の例は、結果を読みやすくする方法を示しています。TRIM 関数を使用して末尾部分のスペースを削
除し、クエリ文字列の最初の 20 文字だけを表示しています。
select pid, trim(user_name), starttime, substring(query,1,20)
from stv_recents
where status='Running';
結果は以下のようになります。
pid |
btrim
|
starttime
|
substring
-------+------------+----------------------------+---------------------18764 | masteruser | 2013-03-28 18:39:49.355918 | select sellerid, fir
(1 row)
PID 18764 のクエリをキャンセルするには、以下のコマンドを実行します。
cancel 18764;
Note
CANCEL コマンドはトランザクションを中止させることはありません。トランザクションを中
止またはロールバックするには、ABORT や ROLLBACK コマンドを使用します。トランザク
ションに関連付けられたクエリをキャンセルするには、まずクエリをキャンセルしてからトラ
ンザクションを中止します。
キャンセルしたクエリがトランザクションに関連付けられている場合は、ABORT または ROLLBACK
コマンドを使用してトランザクションをキャンセルし、データに加えられた変更をすべて破棄してくだ
さい。
abort;
スーパーユーザー以外でサインしている場合は、自分のクエリのみをキャンセルできます。スーパー
ユーザーはすべてのクエリをキャンセルできます。
他のセッションからクエリをキャンセルする
お使いのクエリツールがクエリの同時実行をサポートしていない場合、クエリをキャンセルするには別
のセッションを開始する必要があります。例えば、『Amazon Redshift 入門ガイド』で使用している
SQL Workbench では、複数クエリの同時実行をサポートしていません。SQL Workbench で別のセッ
ションを開始するには、[File]、[New Window] の順に選択し、同じ接続パラメータを使って接続しま
す。その後、PID を見つけてクエリをキャンセルすることができます。
API Version 2012-12-01
21
Amazon Redshift データベース開発者ガイド
Superuser キューを使ってクエリをキャンセルする
Superuser キューを使ってクエリをキャンセルする
現在のセッションで同時に実行されているキューの数が非常に多い場合、他のクエリが完了するまで、
CANCEL コマンドを実行できないことがあります。そのような場合、別のワークロード管理クエリ
キューを使用して CANCEL コマンドを実行することができます。
ワークロード管理を使用すると、クエリを別のクエリキューで実行できるため、他のキューが完了する
のを待つ必要がなくなります。ワークロード管理は、Superuser キューと呼ばれる個別のキューを作成
します。このキューはトラブルシューティングに使用できます。Superuser キューを使用するには、
スーパーユーザーとしてログインし、SET コマンドを使用してクエリグループを「superuser」に設定
する必要があります。コマンドを実行したあと、RESET コマンドを使用してクエリグループをリセッ
トします。
Superuser キューを使用してクエリをキャンセルするには、以下のコマンドを実行します。
set query_group to 'superuser';
cancel 18764;
reset query_group;
クエリキューの管理については、ワークロード管理の実装 (p. 111) を参照してください。
ステップ 7: リソースをクリーンアップする
この演習を実行するためにクラスターをデプロイした場合、演習の完了後にクラスターを削除する必要
があります。削除しないと、AWS アカウントへの課金が続行されます。
クラスターを削除するには、『Amazon Redshift Management Guide』の「Deleting a Cluster」に記載
されたステップを実行してください。
クラスターを維持する場合は、後で参照するためにサンプルデータを保管しておくほうがよいでしょ
う。このガイドの例のほとんどは、この演習で作成したテーブルを使用します。データのサイズは、利
用可能なストレージに大きな影響を与えるほど大きくありません。
クラスターは維持したいがサンプルデータは消去したい場合は、以下のコマンドを実行して TICKIT
データベースを削除できます。
drop database tickit;
TICKIT データベースを作成しなかった場合、またはデータベースを削除したくない場合は、以下のコ
マンドを実行してテーブルだけを削除することができます。
drop
drop
drop
drop
drop
drop
drop
drop
table
table
table
table
table
table
table
table
testtable;
users;
venue;
category;
date;
event;
listing;
sales;
API Version 2012-12-01
22
Amazon Redshift データベース開発者ガイド
データベースセキュリティの管理
Topics
• Amazon Redshift セキュリティの概要 (p. 24)
• データベースユーザーのデフォルト特権 (p. 24)
• スーパーユーザー (p. 25)
• ユーザー (p. 25)
• グループ (p. 26)
• スキーマ (p. 26)
• ユーザーおよびグループのアクセス権限の管理例 (p. 27)
データベースセキュリティは、各データベースオブジェクトに対するアクセス権限を付与するユーザー
を制御することによって管理します。
データベースオブジェクトに対するアクセス権限は、ユーザーアカウントまたはグループに付与した特
権に応じて異なります。データベースセキュリティの機能方法について、以下のガイドラインにまとめ
てあります。
• デフォルトでは、特権はオブジェクト所有者のみに付与されます。
• Amazon Redshift データベースユーザーは、データベースに接続できる名前付きユーザーアカウント
です。ユーザーアカウントに付与される特権は、明示的に付与される(アカウントに直接特権が割り
当てられる)場合と、暗黙的に付与される(特権が付与されたグループにメンバーとして属する)場
合があります。
• グループはユーザーの集合であり、セキュリティを容易に維持するために、特権をまとめて割り当て
ることができます。
• スキーマは、データベーステーブルおよびその他のデータベースオブジェクトの集合です。スキーマ
は、オペレーティングシステムディレクトリに似ていますが、ネストできない点が異なります。ユー
ザーには、単一のスキーマまたは複数のスキーマに対するアクセス権限を付与できます。
セキュリティ実装の例については、「ユーザーおよびグループのアクセス権限の管理例 (p. 27)」を参
照してください。
API Version 2012-12-01
23
Amazon Redshift データベース開発者ガイド
Amazon Redshift セキュリティの概要
Amazon Redshift セキュリティの概要
Amazon Redshift データベースセキュリティは、他のタイプの Amazon Redshift セキュリティと異なり
ます。Amazon Redshift には、このセクションで説明しているデータベースセキュリティに加えて、以
下のセキュリティ管理機能が用意されています。
• サインイン認証情報 – Amazon Redshift マネジメントコンソールへのアクセスが、AWS アカウント
特権によって管理されます。詳細については、「Sign-In Credentials」を参照してください。
• アクセス管理 – 特定の Amazon Redshift リソースへのアクセスを管理するため、AWS Identity and
Access Management(IAM)アカウントを定義します。詳細については、「Controlling Access to
Amazon Redshift Resources」を参照してください。
• クラスターセキュリティグループ – 他のユーザーに Amazon Redshift クラスターへのインバウンド
アクセス権限を付与するには、クラスターセキュリティグループを定義し、それをクラスターに関連
付けます。詳細については、「Amazon Redshift Cluster Security Groups」を参照してください。
• VPC – 仮想ネットワーキング環境を使用してクラスターへのアクセスを保護するには、Virtual Private
Cloud(VPC)でクラスターを起動します。詳細については、「Managing Clusters in Virtual Private
Cloud (VPC)」を参照してください。
• クラスター暗号化 – ユーザーが作成したすべてのテーブル内のデータを暗号化するには、クラスター
の起動時にクラスターの暗号化を有効にします。詳細については、「Amazon Redshift Clusters」を
参照してください。
• SSL 接続 – SQL クライアントとクラスター間の接続を暗号化するには、Secure Sockets Layer(SSL)
暗号化を使用します。詳細については、「Connect to Your Cluster Using SSL」を参照してくださ
い。
• ロードデータ暗号化 – テーブルロードデータファイルを Amazon S3 にアップロードするときに暗号
化するには、Amazon S3 クライアント側の暗号化を使用します。Amazon S3 からデータをロードす
ると、テーブルのロード時に COPY コマンドによってデータが復号化されます。詳細については、
「暗号化されたデータを Amazon S3 にアップロードする (p. 65)」を参照してください。
• 送信中のデータ – AWS クラウド内の送信中のデータを保護するために、Amazon Redshift は、COPY、
UNLOAD、バックアップ、および復元操作を実行する際、ハードウェアによる SSL を使用して、
Amazon S3 または Amazon DynamoDB と通信します。
データベースユーザーのデフォルト特権
データベースオブジェクトを作成したユーザーは、その所有者になります。デフォルトでは、スーパー
ユーザーまたはオブジェクトの所有者のみが、オブジェクトに対する特権を照会、変更、または付与で
きます。ユーザーがオブジェクトを使用するには、そのユーザー、またはそのユーザーが属するグルー
プに、必要な特権を付与する必要があります。データベースのスーパーユーザーは、データベースの所
有者と同じ特権を持ちます。
Amazon Redshift でサポートされる特権は、SELECT、INSERT、UPDATE、DELETE、REFERENCES、
CREATE、TEMPORARY、EXECUTE、および USAGE です。異なるタイプのオブジェクトには、それ
ぞれ異なる特権が関連付けられます。Amazon Redshift でサポートされるデータベースオブジェクトに
ついては、GRANT (p. 245) コマンドを参照してください。
オブジェクトを変更または破棄する権限は、常に所有者のみの特権です。
以前付与した特権を取り消すには、REVOKE (p. 255) コマンドを使用します。オブジェクト所有者の特
権(DROP、GRANT、REVOKE など)は暗黙的であり、付与したり取り消したりすることはできませ
ん。オブジェクト所有者は、自らが持つ通常の特権(例えば、テーブルを所有者の読み取り専用にする
特権など)を取り消すことができます。スーパーユーザーは、GRANT コマンドや REVOKE コマンド
に関係なく、すべての特権を保持します。
API Version 2012-12-01
24
Amazon Redshift データベース開発者ガイド
スーパーユーザー
スーパーユーザー
データベースのスーパーユーザーは、すべてのデータベースのデータベース所有者と同じ特権を持ちま
す。
クラスターの起動時に作成したマスターユーザーと呼ばれるユーザーは、スーパーユーザーです。
スーパーユーザーを作成できるのは、スーパーユーザーのみです。
Amazon Redshift のシステムテーブルおよびシステムビューは、「スーパーユーザーが表示できる
ビュー」または「ユーザーが表示できるビュー」のいずれかに指定されています。「スーパーユーザー
が表示できるビュー」として指定されているシステムテーブルおよびシステムビューを照会できるの
は、スーパーユーザーのみです。詳細については、「システムテーブルとビュー (p. 467)」を参照して
ください。
スーパーユーザーは、すべての PostgreSQL カタログテーブルを照会できます。詳細については、「シ
ステムカタログテーブル (p. 563)」を参照してください。
データベーススーパーユーザーは、すべての許可チェックをバイパスします。スーパーユーザーロール
を使用するときには、細心の注意が必要です。ほとんどの作業をスーパーユーザー以外のロールで行う
ことをお勧めします。スーパーユーザーは、GRANT コマンドや REVOKE コマンドに関係なく、すべ
ての特権を保持します。
新規データベーススーパーユーザーを作成するには、スーパーユーザーとしてデータベースにログオン
し、CREATEUSER 特権で CREATE ROLE コマンドまたは ALTER USER コマンドを発行します。
create user adminuser createuser password '1234Admin';
alter user adminuser createuser;
ユーザー
Amazon Redshift ユーザーアカウントを作成できるのは、データベーススーパーユーザーのみです。
ユーザーは、Amazon Redshift へのログイン時に認証されます。ユーザーは、データベースおよびデー
タベースオブジェクト(例えば、テーブル)を所有でき、それらのオブジェクトに対する特権をユー
ザー、グループ、およびスキーマに付与して、各オブジェクトに対するアクセス権限を付与するユー
ザーを管理できます。CREATE DATABASE 権限を持つユーザーは、データベースを作成でき、特権を
それらのデータベースに付与できます。スーパーユーザーは、すべてのデータベースのデータベース所
有者特権を持ちます。
ユーザーの作成、変更、および削除
データベースユーザーアカウントは、データウェアハウスクラスターに対してグローバルです(個別の
データベースに対するアカウントではありません)。
• ユーザーを作成するには、CREATE USER (p. 225) コマンドを使用します。
• 既存のユーザーを削除するには、DROP USER (p. 236) コマンドを使用します。
• ユーザーアカウントを変更するには(パスワードの変更など)、ALTER USER (p. 178) コマンドを使
用します。
• ユーザーのリストを表示するには、次のように PG_USER カタログテーブルを照会します。
select * from pg_user;
API Version 2012-12-01
25
Amazon Redshift データベース開発者ガイド
グループ
グループ
グループは、グループに関連付けられている特権が付与されているユーザーの集合です。グループを使
用すると、ロール別に特権を割りてることができます。例えば、営業、管理、サポートなど、さまざま
なグループを作成して、各グループ内のユーザーに、その業務に必要なデータへの適切なアクセス権限
を付与できます。特権はグループレベルで付与または取り消すことができ、その変更はグループのすべ
てのメンバー(スーパーユーザーを除く)に適用されます。
すべてのユーザーグループを表示するには、次のように PG_GROUP システムカタログテーブルを照
会します。
select * from pg_group;
グループの作成、変更、および削除
あらゆるユーザーがグループを作成でき、所有するグループを変更または削除できます。
以下のアクションを実行できます。
• グループを作成するには、CREATE GROUP (p. 210) コマンドを使用します。
• ユーザーを既存のグループに追加するには、または既存のグループから削除するには、ALTER
GROUP (p. 171) コマンドを使用します。
• グループを削除するには、DROP GROUP (p. 233) コマンドを使用します。このコマンドはグループ
のみを削除し、そのメンバーユーザーは削除しません。
スキーマ
データベースには、1 つ以上の名前付きスキーマが含まれています。データベース内の各スキーマに
は、テーブルや、その他の種類の名前付きオブジェクトが含まれています。デフォルトでは、データ
ベースに、PUBLIC という名前の 1 つのスキーマが含まれています。スキーマを使用すると、共通の名
前でデータベースオブジェクトをグループ化できます。スキーマは、オペレーティングシステムディレ
クトリに似ていますが、ネストできない点が異なります。
同じデータベース内の異なるスキーマ内で同一のデータベースオブジェクト名を使用でき、競合は生じ
ません。例えば、MY_SCHEMA と YOUR_SCHEMA の両方に、MYTABLE という名前のテーブルを含
めることができます。必要な特権を持つユーザーは、データベース内の複数のスキーマにおいてオブ
ジェクトにアクセスできます。
デフォルトでは、オブジェクトは、データベースの検索パスに含まれる最初のスキーマ内に作成されま
す。詳細については、このセクションで後述する「検索パス (p. 27)」を参照してください。
スキーマは、組織において、また、マルチユーザー環境での並行処理問題において、以下の方法で役立
ちます。
• 多数の開発者が相互に妨害せずに同じデータベース内で作業できる。
• データベースオブジェクトの論理グループを編成して、より管理しやすくする。
• アプリケーションで使用されるオブジェクトを専用のスキーマに入れる機能をアプリケーションに追
加する。これにより、それらのオブジェクトの名前と、別のアプリケーションで使用されるオブジェ
クトの名前とが競合しなくなる。
API Version 2012-12-01
26
Amazon Redshift データベース開発者ガイド
スキーマの作成、変更、および削除
スキーマの作成、変更、および削除
あらゆるユーザーがグループを作成でき、所有するグループを変更または削除できます。
以下のアクションを実行できます。
• スキーマを作成するには、CREATE SCHEMA (p. 210) コマンドを使用します。
• スキーマの所有者を変更するには、ALTER SCHEMA (p. 172) コマンドを使用します。
• スキーマおよびそのオブジェクトを削除するには、DROP SCHEMA (p. 233) コマンドを使用します。
• スキーマ内にテーブルを作成するには、schema_name.table_name という形式でテーブルを作成し
ます。
すべてのユーザーグループを表示するには、次のように PG_NAMESPACE システムカタログテーブル
を照会します。
select * from pg_namespace;
検索パス
検索パスは search_path パラメータで定義します。このパラメータに、スキーマ名をカンマで区切って
リストします。検索パスは、オブジェクト(テーブルや関数など)がスキーマ修飾子なしの簡潔な名前
で参照されたときにスキーマを検索する順序を指定します。
ターゲットスキーマを指定せずにオブジェクトを作成した場合は、検索パスにリストされている最初の
スキーマにオブジェクトが追加されます。同じ名前の複数のオブジェクトが異なるスキーマ内に存在す
る場合、スキーマが指定されていないオブジェクト名は、その名前のオブジェクトを含む検索パス内の
最初のスキーマを参照します。
現行セッションのデフォルトスキーマを変更するには、SET (p. 289) コマンドを使用します。
詳細については、「設定リファレンス」の「search_path (p. 571)」の説明を参照してください。
スキーマベースの特権
スキーマベースの特権は、スキーマ所有者が以下のように決定します。
• デフォルトでは、データベースの PUBLIC スキーマに対して、すべてのユーザーが CREATE 特権お
よび USAGE 特権を持ちます。データベースの PUBLIC スキーマ内でのオブジェクト作成をユーザー
に対して禁止するには、REVOKE (p. 255) コマンドを使用して、その特権を削除します。
• オブジェクト所有者がそれらのユーザーに USAGE 特権を付与しない限り、ユーザーは、自らが所有
していないスキーマに含まれるオブジェクトにアクセスできません。
• 別のユーザーが作成したスキーマに対する CREATE 特権をユーザーに付与した場合、それらのユー
ザーは、そのスキーマ内にオブジェクトを作成できます。
ユーザーおよびグループのアクセス権限の管理例
この例では、ユーザーグループおよびユーザーアカウントを作成してから、ウェブアプリケーションク
ライアントに接続されている Amazon Redshift データベースに対する各種特権を、それらのユーザー
グループおよびユーザーアカウントに付与します。この例では、3 つのユーザーグループが想定されて
います。ウェブアプリケーションの一般ユーザー、ウェブアプリケーションのパワーユーザー、および
ウェブ開発者の 3 グループです。
API Version 2012-12-01
27
Amazon Redshift データベース開発者ガイド
ユーザーおよびグループのアクセス権限の管理例
1. ユーザーアカウントに割り当てるグループを作成します。以下の一連のコマンドで、3 つのユーザー
グループを作成します。
create group webappusers;
create group webpowerusers;
create group webdevusers;
2. 複数のデータベースユーザーアカウントを作成し、それぞれに異なる特権を付与してから、グルー
プに追加します。
a. 2 つのユーザーを作成し、それらを WEBAPPUSERS グループに追加します。
create user webappuser1 password 'webAppuser1pass'
in group webappusers;
create user webappuser2 password 'webAppuser2pass'
in group webappusers;
b. ウェブ開発者のアカウントを作成し、それを WEBDEVUSERS グループに追加します。
create user webdevuser1 password 'webDevuser2pass'
in group webdevusers;
c. スーパーユーザーアカウントを作成します。このユーザーには、他のユーザーを作成できる管理
権限が与えられます。
create user webappadmin
createuser;
password 'webAppadminpass1'
3. スキーマを作成し、ウェブアプリケーションで使用されるデータベーステーブルに関連付けてから、
そのスキーマに対するアクセス権限をさまざまなユーザーグループに付与します。
a. WEBAPP スキーマを作成します。
create schema webapp;
b. WEBAPPUSERS グループに USAGE 特権を付与します。
grant usage on schema webapp to group webappusers;
c. WEBPOWERUSERS グループに USAGE 特権を付与します。
grant usage on schema webapp to group webpowerusers;
d. WEBDEVUSERS グループに ALL 特権を付与します。
grant all on schema webapp to group webdevusers;
API Version 2012-12-01
28
Amazon Redshift データベース開発者ガイド
ユーザーおよびグループのアクセス権限の管理例
これで、基本的なユーザーおよびグループがセットアップされました。ユーザーおよびグループを
変更できるようになりました。
4. 例えば、次のコマンドは、WEBAPPUSER1 の search_path パラメータを変更します。
alter user webappuser1 set search_path to webapp, public;
SEARCH_PATH は、データベースオブジェクト(テーブルや関数など)がスキーマが指定されてい
ない簡潔な名前で参照されたときにスキーマを検索する順序を指定します。
5. また、グループを作成した後で、ユーザーをグループに追加することもできます。例えば、次のよ
うに WEBAPPUSER2 を WEBPOWERUSERS グループに追加します。
alter group webpowerusers add user webappuser2;
API Version 2012-12-01
29
Amazon Redshift データベース開発者ガイド
テーブル設計のベストプラクティス
テーブルの設計
Topics
• テーブル設計のベストプラクティス (p. 30)
• 列圧縮タイプの選択 (p. 33)
• データ分散方法の選択 (p. 43)
• ソートキーの選択 (p. 49)
• 制約の定義 (p. 50)
• テーブル設計の分析 (p. 50)
データウェアハウスシステムは、通常のトランザクション指向のリレーショナルデータベースシステム
と比べて、設計目標が大きく異なります。オンライントランザクション処理(OLTP)アプリケーショ
ンでは、主に単一行のトランザクション、挿入、および更新に焦点が当てられます。Amazon Redshift
は、大量のデータセットに対して複雑な分析クエリを非常に高速に実行するために最適化されていま
す。データウェアハウスには膨大なデータが関与しているので、すべての利用可能なパフォーマンス最
適化の利点を最大限に活用するために、データベースを明確に設計する必要があります。
このセクションでは、圧縮エンコード、データ分散キー、ソートキー、およびテーブル制約を選択およ
び実装する方法について説明し、これらの設計上の決定を行う際のベストプラクティスを示します。
テーブル設計のベストプラクティス
Topics
• 最良のソートキーの選択 (p. 31)
• 最良の分散キーの選択 (p. 31)
• プライマリキーおよび外部キーの制約の定義 (p. 32)
• 列の最小サイズの使用 (p. 32)
• 日付列での日時データ型の使用 (p. 32)
• ソート列での冗長な述語の指定 (p. 32)
データベースをプランニングする際には、全体的なクエリパフォーマンスに大きな影響を与える主要な
決定を行う必要があります。これらの設計上の選択により、ストレージ要件にも重大な影響がありま
す。その結果、I/O 操作の数が減少し、クエリの処理に必要なメモリが最小限に抑えられるので、クエ
リパフォーマンスにも影響します。
API Version 2012-12-01
30
Amazon Redshift データベース開発者ガイド
最良のソートキーの選択
テーブルの作成時にクエリパフォーマンスに最大の影響を与える決定事項は、次のとおりです。
• 最良のソートキーの選択
• 最良の分散キーの選択
• 最良の圧縮戦略の選択
• 制約の定義
何を選択するかは、データベースが実行している作業の種類によって異なります。例えば、すべての状
況にとって最良である唯一のソートキーというものは存在しません。
このセクションでは、最も重要な設計上の決定の概要を示し、クエリパフォーマンスの最適化のベスト
プラクティスを示します。その後のセクションでは、テーブル設計オプションについて詳細に説明し、
その例を示します。
最良のソートキーの選択
Amazon Redshift は、ソートキーに応じたソート順でデータをディスクに格納します。Amazon Redshift
クエリオプティマイザは、最適なクエリプランを決定する際にソート順を使用します。
最新のデータが最も頻繁にクエリ処理される場合は、タイムスタンプ列をソートキーの主要な列として
指定します。クエリは時間範囲外のブロック全体をスキップできるので、効率性が高まります。
1 つの列に対して範囲フィルタリングまたは等価性フィルタリングを頻繁に実行する場合は、その列を
ソートキーとして指定します。Amazon Redshift は、各ブロックに格納された列の最小値と最大値を追
跡し、述語範囲に当てはまらないブロックをスキップできるので、その列のブロック全体のデータを読
み込む必要がなくなります。
テーブルを頻繁に結合する場合は、結合列をソートキーと分散キーの両方として指定します。これによ
り、クエリオプティマイザは、より時間のかかるハッシュ結合ではなくソートマージ結合を選択できる
ようになります。データが結合キーですでにソートされているので、クエリオプティマイザはソート
マージ結合のソートフェーズをバイパスできます。
ソートキーの選択と指定の詳細については、「ソートキーの選択 (p. 49)」を参照してください。
最良の分散キーの選択
分散キーは、コンピューティングノード間でテーブルのデータをどのように分散させるかを決定しま
す。
適切なデータ分散では、次の 2 つの目標が設定されます。
• クラスター内のノード間およびスライス間でデータを均等に分散させる。
不均等な分散が行われると(データ分散スキュー)、一部のノードの作業量が他のノードよりも多く
なり、プロセス全体の速度が低下します。
• 結合と集計のためにデータをコロケーションする。
結合または集計に関与する行が、異なるノード上にある場合は、ノード間でより多くのデータが移動
する必要があります。
テーブルを頻繁に結合する場合は、結合列を分散キーとして指定します。テーブルが他の複数のテーブ
ルと結合される場合は、テーブルが結合される最大ディメンションの外部キーで分散を行います。結合
の一環としてディメンションテーブルがフィルタリングされる場合、最大ディメンションを選択する際
には、フィルタリング後のデータのサイズを比較します。これにより、最大の結合に関与する行が、通
常は同じ物理ノードに分散されます。ローカル結合ではデータの移動はないので、ネットワーク結合よ
りもパフォーマンスが向上します。
API Version 2012-12-01
31
Amazon Redshift データベース開発者ガイド
制約の定義
列に対して主に等価性フィルタリングを行う場合は、事実上、すべての一致データが単一ノードに格納
されるので、その列を分散キーとして選択しないでください。
テーブルの大部分が非正規化されていて結合に関与しない場合は、分散キーを指定する必要はありませ
ん。デフォルトでは、Amazon Redshift はラウンドロビン方式によりノード間でデータを均等に分散さ
せます(均等な分散)。
分散キーの選択と指定の詳細については、「データ分散方法の選択 (p. 43)」を参照してください。
プライマリキーおよび外部キーの制約の定義
必要に応じて、テーブル間でのプライマリキーおよび外部キーの制約を定義します。これらの制約は情
報提供のみを目的としているものの、クエリオプティマイザはこれらを使用して、より効率的なクエリ
プランを生成します。
Amazon Redshift は、一意性、プライマリキー、および外部キーの制約を強要することはありません。
一意性の確保および DML 操作の冪等性の管理は、アプリケーションが行います。
Amazon Redshift が制約を使用する方法の詳細については、「制約の定義 (p. 50)」を参照してくださ
い。
列の最小サイズの使用
列を最小サイズに縮小すると、クエリパフォーマンスが向上します。Amazon Redshift は列データを非
常に効果的に圧縮するので、必要なサイズよりかなり大きな列を作成しても、データテーブルのサイズ
にはあまり影響を与えません。ただし、複雑なクエリの処理中に、一時テーブルに中間クエリ結果を格
納しなければならない場合があります。一時テーブルは圧縮されないので、不必要に大きな列がメモリ
および一時ディスク領域を過剰に消費して、クエリパフォーマンスに影響を与える可能性があります。
便宜上の理由で列の最大サイズを使用しないようにしてください。代わりに、例えば VARCHAR 列に
格納する可能性が高い最大値を考慮し、それに応じて列のサイズを決定します。
日付列での日時データ型の使用
必要な解決策に応じて、日時情報を格納するときに文字型の代わりに DATE または TIMESTAMP デー
タ型を使用します。Amazon Redshift は、DATE および TIMESTAMP データを CHAR または VARCHAR
よりも効率的に格納するので、クエリパフォーマンスが向上します。詳細については、「日時型(p.139)」
を参照してください。
ソート列での冗長な述語の指定
結合において、ファクトテーブル(最大テーブル)の主要なソート列で述語を使用します。述語が冗長
な場合にも述語をフィルタに追加して、結合に関与する他のテーブルをフィルタリングします。
大きなファクトテーブルが複数のディメンションテーブルに結合される最も優れたスキーマまたは同様
の設計では、WHERE 句に述語を追加して最大テーブルのソート列に対してフィルタリングを行うとき
に、多数のディスクブロックのスキャンをクエリプランナーがスキップできるようにします。フィルタ
リングを行わない場合、クエリ実行エンジンはテーブル全体をスキャンする必要があるので、テーブル
が大きくなるにつれて時間とともにクエリパフォーマンスが低下します。
結合クエリ内のテーブルに述語がすでに適用されているが、述語の列でソートされるクエリ内の別の
テーブルに述語が他動詞的に適用される場合でも、冗長な述語を指定することにより、パフォーマンス
を向上させることができます。このようにして、Amazon Redshift は別のテーブルをスキャンするとき
に、そのテーブルのブロックも効率的にスキップすることができます。
API Version 2012-12-01
32
Amazon Redshift データベース開発者ガイド
列圧縮タイプの選択
例えば、TAB1 と TAB2 を結合するとします。TAB1 のソートキーは tab1.timestamp、TAB2 のソー
トキーは tab2.timestamp です。次のクエリは、共通キーでテーブルを結合し、tab1.timestamp
> '1/1/2013' をフィルタリングします。
SELECT * FROM tab1, tab2
WHERE tab1.key = tab2.key
AND tab1.timestamp > '1/1/2013';
tab2.timestamp の述語が WHERE 句に含まれない場合、実行エンジンはテーブル全体をスキャンし
なければならなくなります。結合によって tab2.timestamp2 からも 1/1/2013 より大きい値が得られ
る場合は、冗長ではあるもののそのフィルタも追加します。
SELECT * FROM tab1, tab2
WHERE tab1.key = tab2.key
AND tab1.timestamp > '1/1/2013'
AND tab2.timestamp > '1/1/2013';
列圧縮タイプの選択
Topics
• 圧縮エンコード (p. 34)
• 圧縮エンコードのテスト (p. 40)
• 例: CUSTOMER テーブルの圧縮エンコードの選択 (p. 42)
圧縮は、データの格納時にそのサイズを小さくする列レベルの操作です。圧縮によってストレージス
ペースが節約され、ストレージから読み込まれるデータのサイズが小さくなり、ディスク I/O の量が減
少するので、クエリパフォーマンスが向上します。
デフォルトでは、Amazon Redshift は非圧縮の raw 形式でデータを格納します。Amazon Redshift デー
タベースでテーブルを作成するときに、いずれかまたはすべての列に対して圧縮タイプ(エンコード)
を定義できます。圧縮により、ディスクから読み込まれるデータのサイズが小さくなるので、処理中の
ディスク I/O の量が減少します。
テーブルの作成時に圧縮エンコードをテーブルの列に手動で適用するか、または COPY コマンドを使
用して圧縮を自動的に分析して適用することができます。自動圧縮の適用の詳細については、「自動圧
縮ありでテーブルをロードする (p. 73)」を参照してください。
Note
COPY コマンドを使用して自動圧縮を適用することを強くお勧めします。
新しいテーブルが別のテーブルと同じデータ特性を共有しているか、または自動圧縮中に適用される圧
縮エンコードがデータにとって最適ではないことがテストで判明した場合は、圧縮エンコードを手動で
適用できます。圧縮エンコードを手動で適用する場合は、すでに入力されているテーブルに対して
ANALYZE COMPRESSION (p. 181) コマンドを再実行し、その結果を使用して圧縮エンコードを選択す
ることができます。
圧縮を手動で適用するには、CREATE TABLE ステートメントの一部として個々の列に対して圧縮エン
コードを指定します。構文は次のとおりです。
API Version 2012-12-01
33
Amazon Redshift データベース開発者ガイド
圧縮エンコード
CREATE TABLE table_name (column_name
data_type ENCODE encoding-type)[, ...]
ここで、encoding-type には次のセクションのキーワード表から選択します。
例えば、次のステートメントは 2 列のテーブル PRODUCT を作成します。データがテーブルにロード
されるときに、PRODUCT_ID 列は圧縮されませんが、PRODUCT_NAME 列はバイトディクショナリ
エンコード(BYTEDICT)を使用して圧縮されます。
create table product(
product_id int,
product_name char(20) encode bytedict);
テーブルの作成後に列の圧縮エンコードを変更することはできません。ALTER TABLE コマンドを使用
して列をテーブルに追加する際には、列のエンコードを指定できます。
ALTER TABLE table-name ADD [ COLUMN ] column_name column_type
圧縮エンコード
Topics
• raw エンコード (p. 35)
• バイトディクショナリエンコード (p. 35)
• デルタエンコード (p. 36)
• LZO エンコード (p. 37)
• Mostly エンコード (p. 37)
• ランレングスエンコード (p. 39)
• text255 および text32k エンコード (p. 39)
圧縮エンコードは、行がテーブルに追加されるときにデータ値の列に適用される圧縮のタイプを指定し
ます。
次の表は、サポートされる圧縮エンコード、およびエンコードをサポートするデータ型を示していま
す。
エンコードタイプ
CREATE TABLE および
ALTER TABLE のキーワード
データ型
raw(非圧縮)
RAW
すべて
バイトディクショナリ
BYTEDICT
BOOLEAN 以外のすべて
デルタ
DELTA
SMALLINT、INT、BIGINT、DATE、
TIMESTAMP、DECIMAL
DELTA32K
INT、BIGINT、DATE、TIMESTAMP、
DECIMAL
LZO
BOOLEAN、REAL、および DOUBLE
PRECISION 以外のすべて
LZO
API Version 2012-12-01
34
Amazon Redshift データベース開発者ガイド
圧縮エンコード
エンコードタイプ
CREATE TABLE および
ALTER TABLE のキーワード
データ型
mostlyn
MOSTLY8
SMALLINT、INT、BIGINT、DECIMAL
MOSTLY16
INT、BIGINT、DECIMAL
MOSTLY32
BIGINT、DECIMAL
ランレングス
RUNLENGTH
すべて
テキスト
TEXT255
VARCHAR のみ
TEXT32K
VARCHAR のみ
raw エンコード
raw エンコードでは、データは非圧縮の raw 形式で格納されます。raw エンコードはデフォルトのスト
レージ方法です。
バイトディクショナリエンコード
バイトディクショナリエンコードでは、ディスク上の列値のブロックごとに、一意の値の個別のディク
ショナリが作成されます(Amazon Redshift ディスクブロックは 1 MB)。ディクショナリには、元の
データ値のインデックスとして格納されている最大 256 個の 1 バイト値が含まれます。単一のブロッ
クに 256 個を超える値が格納されている場合は、余分な値が非圧縮の raw 形式でブロックに書き込ま
れます。ディスクブロックごとに、このプロセスが繰り返されます。
このエンコードは、列に含まれる一意の値の数が制限されている場合に非常に効果的です。このエン
コードは、列のデータドメインが一意の値 256 個未満である場合に最適です。バイトディクショナリ
エンコードは、列に長い文字列が含まれる場合に特に空間効率が高まります。
テーブルに、CHAR(30) データ型の COUNTRY 列があるとします。データがロードされると、Amazon
Redshift はディクショナリを作成し、COUNTRY 列にインデックス値を入力します。ディクショナリ
には、インデックス作成された一意の値が含まれ、テーブル自体には、対応する値の 1 バイトのサブス
クリプトのみが含まれます。
Note
固定長文字の列には末尾の空白が格納されます。したがって CHAR(30) 列では、バイトディク
ショナリエンコードを使用すると、圧縮値ごとに 29 バイトのストレージが節約されます。
次の表は、COUNTRY 列のディクショナリを示しています。
一意のデータ値
ディクショナリインデックス
サイズ(固定長、30 バイト/値)
England
0
30
United States of America
1
30
Venezuela
2
30
Sri Lanka
3
30
Argentina
4
30
Japan
5
30
API Version 2012-12-01
35
Amazon Redshift データベース開発者ガイド
圧縮エンコード
一意のデータ値
ディクショナリインデックス
合計
サイズ(固定長、30 バイト/値)
180
次の表は、COUNTRY 列の値を示しています。
元のデータ値
元のサイズ(固定長、
30 バイト/値)
圧縮値(インデックス) 新しいサイズ(バイト)
England
30
0
1
England
30
0
1
United States of
America
30
1
1
United States of
America
30
1
1
Venezuela
30
2
1
Sri Lanka
30
3
1
Argentina
30
4
1
Japan
30
5
1
Sri Lanka
30
3
1
Argentina
30
2
1
合計
300
10
この例の合計圧縮サイズは、次のように計算されます。ディクショナリに 6 つの異なるエントリが格納
され(6 * 30 = 180)、テーブルに 10 個の 1 バイト圧縮値が含まれて、合計 190 バイトとなります。
デルタエンコード
デルタエンコードは、日時列にとって非常に有用です。
デルタエンコードは、列内の連続する値間の差を記録することにより、データを圧縮します。この差
は、ディスク上の列値の各ブロックに対する個別のディクショナリに記録されます(Amazon Redshift
ディスクブロックは 1 MB)。例えば、連続する 10 個の整数 1~10 が列に含まれる場合、最初の整数
は 4 バイト整数(+ 1 バイトのフラグ)として格納され、次の 9 個の整数は、前の値よりも 1 大きい
ことを示す値 1 の単一バイトとしてそれぞれ格納されます。
デルタエンコードには、次の 2 つのバージョンがあります。
• 差を 1 バイト値(8 ビット整数)として記録する DELTA
• 差を 2 バイト値(16 ビット整数)として記録する DELTA32K
単一バイトを使用して列のほとんどの値を圧縮できる場合は、1 バイトバージョンが非常に効果的で
す。ただし、デルタがより大きい場合、このエンコードは非圧縮データを格納する場合よりも多少効果
が低くなる可能性もあります。16 ビットバージョンにも同様の論理が当てはまります。
API Version 2012-12-01
36
Amazon Redshift データベース開発者ガイド
圧縮エンコード
2 つの値間の差が 1 バイトの範囲(DELTA)または 2 バイトの範囲(DELTA32K)を超える場合は、
先頭に 1 バイトのフラグが付けられて元の完全な値が格納されます。1 バイトの範囲は -127~127、2
バイトの範囲は -32K~32K です。
次の表は、デルタエンコードが数値列に対してどのように機能するかを示しています。
元のデータ値
元のサイズ(バイ
ト)
1
4
5
4
50
差(デルタ)
圧縮値
圧縮サイズ(バイ
ト)
1
1+4(フラグ + 実
際の値)
4
4
1
4
45
45
1
200
4
150
150
1+4(フラグ + 実
際の値)
185
4
-15
-15
1
220
4
35
35
1
221
4
1
1
1
合計
28
15
LZO エンコード
LZO エンコードは、非常に高い圧縮率と良好なパフォーマンスを実現します。LZO エンコードは、非
常に長い文字列を格納する CHAR および VARCHAR 列、特に製品説明、ユーザーコメント、JSON 文
字列などの自由形式テキストに適しています。
Note
現在、自動圧縮による COPY は CHAR および VARCHAR に対してのみ LZO エンコードをサ
ポートしていますが、ANALYZE COMPRESSION (p. 181) は LZO エンコードを完全にサポート
しています。詳細については、「自動圧縮ありでテーブルをロードする (p. 73)」を参照してく
ださい。
Mostly エンコード
Mostly エンコードは、列のデータ型が、格納された大部分の値で必要なサイズより大きい場合に有用
です。このタイプの列に Mostly エンコードを指定して、列内の大部分の値を、より小さい標準ストレー
ジサイズに圧縮することができます。圧縮できない残りの値は、raw 形式で格納されます。例えば、
INT2 列などの 16 ビット列を 8 ビットストレージに圧縮できます。
一般的に、Mostly エンコードは次のデータ型に対して使用します。
• SMALLINT/INT2(16 ビット)
• INTEGER/INT(32 ビット)
• BIGINT/INT8(64 ビット)
• DECIMAL/NUMERIC(64 ビット)
API Version 2012-12-01
37
Amazon Redshift データベース開発者ガイド
圧縮エンコード
列のデータ型のサイズに見合う Mostly エンコードの適切なバージョンを選択します。例えば、16 ビッ
ト整数列として定義された列に MOSTLY8 を適用します。MOSTLY16 を 16 ビットデータ型の列に適
用したり、MOSTLY32 を 32 ビットデータ型の列に適用したりすることはできません。
列内の比較的多くの値を圧縮できない場合、Mostly エンコードは非圧縮の場合よりも効果が低くなり
ます。これらのいずれかのエンコードを列に適用する前に、現在ロードしようとしている(および今後
ロードする可能性が高い)ほとんどの値が、次の表に示す範囲内にあることを確認してください。
エンコード
圧縮ストレージサイズ
圧縮できる値の範囲(範囲外の値は raw と
して格納される)
MOSTLY8
1 バイト(8 ビット)
-128~127
MOSTLY16
2 バイト(16 ビット)
-32768~32767
MOSTLY32
4 バイト(32 ビット)
-2147483648~+2147483647
Note
10 進値では、値が範囲内にあるかどうかを判断する場合に小数点を無視します。例えば、
1,234.56 は 123,456 として扱われ、MOSTLY32 列で圧縮できます。
例えば、VENUE テーブルの VENUEID 列が raw 整数列として定義されている場合は、その値が 4 バイ
トのストレージを消費することを意味します。しかし、列の値の現在の範囲は 0~309 です。したがっ
て、VENUEID に対して MOSTLY16 エンコードを使用してこのテーブルを再作成および再ロードする
と、その列の各値のストレージが 2 バイトに減少します。
別のテーブルで参照される VENUEID 値のほとんどが 0~127 の範囲内にある場合、その外部キー列を
MOSTLY8 としてエンコードすることは妥当と言えます。選択を行う前に、参照テーブルデータに対し
ていくつかのクエリを実行して、ほとんどの値が 8 ビット、16 ビット、または 32 ビットの範囲内に
あるかどうかを確認する必要があります。
次の表は、MOSTLY8、MOSTLY16、および MOSTLY32 エンコードが使用される場合の特定の数値の
圧縮サイズを示しています。
元の値
元の INT または
BIGINT(バイ
ト)
MOSTLY8 圧縮 MOSTLY16 圧縮サイズ MOSTLY32 圧縮サイズ
サイズ(バイ
(バイト)
(バイト)
ト)
1
4
1
2
4
10
4
1
2
4
100
4
1
2
4
1,000
4
4
10000
4
raw データサイ 2
ズと同じ
2
20000
4
2
4
40000
8
4
100000
8
raw データサイズと同
じ
2000000000
8
4
4
4
API Version 2012-12-01
38
Amazon Redshift データベース開発者ガイド
圧縮エンコード
ランレングスエンコード
ランレングスエンコードは、連続して繰り返される値を、値と連続発生数(実行の長さ)から成るトー
クンに置き換えます。ディスク上の列値のブロックごとに、一意の値の個別のディクショナリが作成さ
れます(Amazon Redshift ディスクブロックは 1 MB)。このエンコードは、データ値が連続して頻繁
に繰り返されるテーブル(例えば、テーブルがこれらの値でソートされる場合)に最も適しています。
例えば、大きなディメンションテーブルの列に、予測どおりに小さなドメイン(10 個未満の可能値を
持つ COLOR 列など)がある場合、データがソートされなくても、これらの値はテーブル全体にわたっ
て長いシーケンスになる可能性が高くなります。
ソートキーとして指定された列に、ランレングスエンコードを適用することは推奨されません。範囲が
制限されたスキャンは、ブロックに同様の数の行が含まれる場合にパフォーマンスが向上します。ソー
トキー列が、同じクエリ内の他の列よりもかなり高度に圧縮される場合、範囲が制限されたスキャンは
パフォーマンスが低下する可能性があります。
次の表は、COLOR 列の例を使用して、ランレングスエンコードがどのように機能するかを示していま
す。
元のデータ値
元のサイズ(バイト)
圧縮値(トークン)
圧縮サイズ(バイト)
Blue
4
{2,Blue}
5
Blue
4
Green
5
Green
5
0
Green
5
0
Blue
4
{1,Blue}
5
Yellow
6
{4,Yellow}
7
Yellow
6
0
Yellow
6
0
Yellow
6
0
合計
51
23
0
{3,Green}
6
text255 および text32k エンコード
text255 および text32k エンコードは、同じ単語が頻繁に出現する VARCHAR 列を圧縮する場合に有用
です。ディスク上の列値のブロックごとに、一意の単語の個別のディクショナリが作成されます(Amazon
Redshift ディスクブロックは 1 MB)。ディクショナリには、列内の最初の 245 個の一意の単語が含ま
れます。これらの単語は、ディスク上で、245 個の値の 1 つを表す 1 バイトインデックス値に置き換
えられ、ディクショナリに表されていないすべての単語は非圧縮で格納されます。このプロセスは、1
MB のディスクブロックごとに繰り返されます。インデックス作成された単語が列内に頻繁に出現する
場合、列の圧縮率は非常に高くなります。
text32k エンコードでも原理は同じですが、各ブロックのディクショナリは特定数の単語をキャプチャ
することはありません。代わりにディクショナリは、結合されたエントリが、32K から多少のオーバー
ヘッドを減算した長さに達するまで、検出した一意の各単語のインデックスを作成します。インデック
ス値は 2 バイトで格納されます。
API Version 2012-12-01
39
Amazon Redshift データベース開発者ガイド
圧縮エンコードのテスト
例えば、VENUE テーブルの VENUENAME 列を考えてみます。この列には Arena、Center、Theatre
などの単語が繰り返し出現し、text255 圧縮が適用された場合、各ブロックに出現する最初の 245 個の
単語内にこれらが含まれると考えられます。その場合、これらの単語が出現するたびに 1 バイトのスト
レージ(それぞれ 5、6、または 7 バイトではなく)を占めるにすぎないので、この列は圧縮からメリッ
トを得られます。
圧縮エンコードのテスト
列のエンコードを手動で指定する場合は、データに対してさまざまなエンコードをテストできます。
Note
できる限り COPY コマンドを使用してデータをロードし、データに基づいて最適なエンコード
を COPY コマンドが選択できるようにすることをお勧めします。または、ANALYZE
COMPRESSION (p. 181) コマンドを使用して、既存のデータに対して提案されるエンコードを
表示できます。自動圧縮の適用の詳細については、「自動圧縮ありでテーブルをロードす
る (p. 73)」を参照してください。
データ圧縮の有意義なテストを実行するには、多数の行が必要になります。この例では、2 つのテーブ
ル VENUE と LISTING から選択を行う CREATE TABLE AS ステートメントを使用して、テーブルを作
成します。2 つのテーブルを通常結合する WHERE 句は除外します。その結果、VENUE テーブルの各
行が LISTING テーブルのすべての行に結合されて、合計 3200 万以上の行になります。これはデカル
ト結合と呼ばれ、通常は推奨されませんが、この目的においては、多数の行を作成する便利な方法で
す。テストするデータを含む既存のテーブルがある場合は、このステップをスキップできます。
サンプルデータを含むテーブルを作成したら、6 つの列を含むテーブルを作成します。これらの列に
は、それぞれ異なる圧縮エンコード: raw、bytedict、lzo、runlength、text255、および text32k が適用さ
れます。最初のテーブルからデータを選択する INSERT コマンドを実行することにより、各列に全く
同じデータを入力します。
圧縮エンコードをテストするには、以下の手順を実行します。
1. (オプションテスト)最初に、多数の行を含むテーブルを作成します。既存のテーブルをテストす
る場合は、このステップをスキップします。
create table reallybigvenue as
select venueid, venuename, venuecity, venuestate, venueseats
from venue, listing;
2. 次に、比較する各エンコードを含むテーブルを作成します。
create table encodingvenue (
venueraw varchar(100) encode raw,
venuebytedict varchar(100) encode bytedict,
venuelzo varchar(100) encode lzo,
venuerunlength varchar(100) encode runlength,
venuetext255 varchar(100) encode text255,
venuetext32k varchar(100) encode text32k);
3. INSERT ステートメントを SELECT 句とともに使用して、すべての列に同じデータを挿入します。
insert into encodingvenue
select venuename as venueraw, venuename as venuerunlength, venuename as
API Version 2012-12-01
40
Amazon Redshift データベース開発者ガイド
圧縮エンコードのテスト
venuetext32k, venuename as
from reallybigvenue;
venuetext255
4. 新しいテーブルの行数を確認します。
select count(*) from encodingvenue
count
---------38884394
(1 row)
5. STV_BLOCKLIST (p. 526) システムテーブルをクエリ処理して、各列で使用される 1 MB のディスク
ブロックの数と比較します。
MAX 集計関数が、各列のブロックの最高数を返します。STV_BLOCKLIST テーブルには、3 つのシ
ステム生成列の詳細が含まれます。この例では、WHERE 句で col < 6 を使用して、システム生成
列を除外します。
select col, max(blocknum)
from stv_blocklist b, stv_tbl_perm p
where (b.tbl=p.id) and name ='encodingvenue'
and col < 6
group by name, col
order by col;
クエリは次の結果を返します。列には 0 から始まる番号が付けられています。クラスターの設定方
法によっては結果の数が異なる場合がありますが、相対的なサイズは同様のものになります。この
データセットについては、2 つ目の列の BYTEDICT エンコードから、圧縮率が 20:1 を超える最良の
結果が得られました。LZO エンコードからも良好な結果が得られました。当然ながら、異なるデー
タセットからは異なる結果が得られます。より長い文字列が列に含まれる場合は、LZO から最良の
圧縮結果が得られることが多くなります。
col | max
-----+----0 | 203
1 | 10
2 | 22
3 | 204
4 | 56
5 | 72
(6 rows)
既存のテーブルにデータが存在する場合は、ANALYZE COMPRESSION (p. 181) コマンドを使用して、
テーブルに対して提案されるエンコードを表示できます。例えば、次の例は、3800 万行を含む VENUE
テーブル REALLYBIGVENUE のコピーに対して推奨されるエンコードを示しています。ANALYZE
COMPRESSION は VENUENAME 列に対して BYTEDICT エンコードを推奨しており、これは前のテス
トの結果と同じであることに注意してください。
analyze compression reallybigvenue;
Column
| Encoding
API Version 2012-12-01
41
Amazon Redshift データベース開発者ガイド
例: CUSTOMER テーブルの圧縮エンコードの選択
---------------+----------venueid
| lzo
venuename
| bytedict
venuecity
| lzo
venuestate
| lzo
venueseats
| lzo
(5 rows)
例: CUSTOMER テーブルの圧縮エンコードの選択
次のステートメントは、さまざまなデータ型の列を含む CUSTOMER テーブルを作成します。この
CREATE TABLE ステートメントは、これらの列に対する圧縮エンコードの数ある可能な組み合わせの
1 つを示しています。
create table customer(
custkey int encode delta,
custname varchar(30) encode raw,
gender varchar(7) encode text255,
address varchar(200) encode text255,
city varchar(30) encode text255,
state char(2) encode raw,
zipcode char(5) encode bytedict,
start_date date encode delta32k);
次の表は、CUSTOMER テーブルに対して選択された列エンコードを示し、それぞれの選択内容につい
て説明しています。
列
データ型
エンコード
説明
CUSTKEY
int
delta
CUSTKEY は、連続した
一意の整数値から成りま
す。差は 1 バイトとな
るので、DELTA を選択
するのが適切です。
CUSTNAME
varCHAR(30)
raw
CUSTNAME には、繰り
返し値がほとんどない大
きなドメインがありま
す。いずれの圧縮エン
コードも効果的でないと
考えられます。
GENDER
varchar(7)
text255
GENDER は、多数の繰
り返し値を含む非常に小
さなドメインです。同じ
単語が繰り返し出現する
VARCHAR 列には、
text255 が適していま
す。
API Version 2012-12-01
42
Amazon Redshift データベース開発者ガイド
データ分散方法の選択
列
データ型
エンコード
説明
ADDRESS
varchar(200)
text255
ADDRESS は大きなド
メインですが、Street
Avenue、North、South
など、繰り返しの単語が
多数含まれます。同じ単
語が繰り返し出現する
VARCHAR 列を圧縮す
るには、text255 と
text32k が有用です。列
が短いので、text255 を
選択するのが適切です。
CITY
varCHAR(30)
text255
CITY は、いくつかの繰
り返し値を含む大きなド
メインです。特定の市の
名前が、他の市の名前よ
りもかなり頻繁に使用さ
れます。ADDRESS と
同じ理由により、
text255 を選択するのが
適切です。
STATE
char(2)
raw
米国では、STATE は 50
個の 2 文字値の正確な
ドメインです。bytedict
エンコードによって多少
圧縮されるものの、列サ
イズが 2 文字のみなの
で、データの解凍時の
オーバーヘッドを考慮す
ると圧縮する必要はそれ
ほどないと考えられま
す。
ZIPCODE
char(5)
bytedict
ZIPCODE は、50,000
個未満の一意の値を含む
既知のドメインです。特
定の郵便番号が、他の郵
便番号よりもかなり頻繁
に出現します。bytedict
エンコードは、数に制限
のある一意の値が列に含
まれる場合に非常に効果
的です。
START_DATE
date
delta32k
デルタエンコードは、特
に行が日付順にロードさ
れる場合に、日時列に
とって非常に有用です。
データ分散方法の選択
Topics
• 分散キーの選択 (p. 45)
API Version 2012-12-01
43
Amazon Redshift データベース開発者ガイド
データ分散方法の選択
• 分散の例 (p. 47)
• データの再分散 (p. 49)
Amazon Redshift が超並列処理(MPP)から得るクエリパフォーマンスは、クラスター内のすべての
ノードおよびスライスにわたってデータが均等に分散されているかどうかに左右されます。データが均
等に分散されている場合、リーダーノードは、スライス間で処理負荷をより均等に分散させることがで
きます。
このセクションでは、並列処理におけるノードおよびスライスの役割について説明するとともに、デー
タベースで並列処理を活用するために最適な分散手法を選択および実装する方法について説明します。
ノードとスライス
クラスターを並列マシンと考えてください。Amazon Redshift クラスターは、ノードのセットで構成さ
れています。クラスター内の各ノードには、独自のオペレーティングシステム、メモリ、および直接取
り付けられたストレージ(ディスク)が備わっています。これらのリソースは共有されません。ノード
の 1 つはリーダーノードであり、コンピューティングノードへのデータの分散およびクエリ処理タスク
を管理します。各コンピューティングノードは、さらに多数のスライスに分割されます。
スライスの数は、ノード上のプロセッサコアの数と同じです。例えば、各 XL コンピューティングノー
ドには 2 つのスライスがあり、各 8XL コンピューティングノードには 16 個のスライスがあります。す
べてのスライスは並列クエリ実行に関与し、ノード間でできるだけ均等に分散されたデータを処理しま
す。「データウェアハウスシステムのアーキテクチャ (p. 4)」セクションには、Amazon Redshift クラ
スター内のリーダーノード、コンピューティングノード、およびスライスの関係図が示されています。
分散方法
テーブルにデータを追加すると、Amazon Redshift は次の 2 つの方法のいずれかを使用して、テーブル
の行をクラスタースライスに分散させます。
• 均等な分散
• キー分散
均等な分散
均等な分散はデフォルトの分散方法です。均等な分散では、リーダーノードは特定の列に存在する値に
関係なく、ラウンドロビン方式によりスライス間でデータ行を分散させます。このアプローチは、分散
キーの明確な選択肢がない場合に選択するのが適切です。
テーブルの大部分が非正規化されていて結合に関与しない場合は、均等な分散を使用します。
均等な分散を指定するには、次の例に示すように、DISTSTYLE EVEN オプションを CREATE TABLE
ステートメントとともに使用します。
create table newusers diststyle even as
select * from users;
キー分散
テーブルの作成時に分散キーを指定した場合、リーダーノードは、分散キー列の値に基づいてデータ行
をスライスに分散させます。分散キー列の一致する値が一緒に格納されます。
テーブルのデータ値を評価し、分散キーを選択したときにクエリによってどのように行が選択されるか
を考慮します。
以下の目標を念頭に置いて、分散キーを選択します。
API Version 2012-12-01
44
Amazon Redshift データベース開発者ガイド
分散キーの選択
• クラスター内のスライス間でデータを均等に分散させる。不均等な分散が行われると(データ分散ス
キュー)、一部のスライスの作業量が他のスライスよりも多くなり、プロセス全体の速度が低下しま
す。
• データ移動を最小限に抑えるように、結合のためにデータをコロケーションする。
結合に関与する行のすべてのデータが同じノード上に配置されている場合、クエリエンジンは、ネット
ワーク全体で多くのデータを移動させる必要がありません。
Important
列に対して分散方法を指定すると、Amazon Redshift はクラスターレベルでデータ分散を処理
します。Amazon Redshift は、データベースオブジェクト内でのデータのパーティション化の
概念を必要とせず、また、サポートもしていません。テーブルスペースを作成したり、テーブ
ルのパーティション化方式を定義したりする必要はありません。
分散キーの選択
分散キーとソートキーに対して適切な選択を行うために、Amazon Redshift アプリケーションのクエリ
パターンを理解しておく必要があります。
結合列での分散
テーブルのプライマリキーが結合列としてあまり頻繁に使用されない場合は、プライマリキーを分散
キーとして指定しないことを考慮します。代わりに、結合キーとして頻繁に使用される外部キーまたは
別の列がテーブルにある場合は、その列を分散キーとして指定することを考慮します。この選択を行う
際には、結合されたテーブルのペアを考慮に入れます。両方のテーブルで結合列を分散キーおよびソー
トキーとして指定すると、より良好な結果が得られる可能性があります。これにより、クエリオプティ
マイザは、クエリの実行時にハッシュ結合ではなく、より迅速なマージ結合を選択できます。
集計およびグループ化操作も、同じ列を分散キーとソートキーの両方として指定することからメリット
を得られる可能性があります。例えば、分散キーとソートキーの両方として指定された列でソートベー
スの集計を行った場合、ハッシュベースの集計よりもかなり時間が短縮されると考えられます。ソート
キーについては、「最良のソートキーの選択 (p. 31)」を参照してください。
例えば、SALESID という名前の単一列のプライマリキーを持つ、TICKIT データベースの SALES テー
ブルのスキーマを考えてみます。SALESID では均等な分散が行われるものの、JOIN 操作を頻繁に実行
する場合、分散キーとして選択するのは最良の方法ではありません。SALESID は、SALES から選択さ
れる行を制限するのに使用される場合はあるものの、他のテーブルへの結合列として使用されることは
ありません。多くの場合、SALES テーブルは LISTID 列でデータベース内の他のテーブル、特に LISTING
に結合されます。したがって、SALES テーブルと LISTING テーブルの両方にとって、LISTID が最良
の分散キーおよびソートキーとなります。
この例では、コロケーテッド結合によってクエリを最適化するために、分散キーおよびソートキーの選
択に焦点を当てています。コロケーテッド結合では、結合操作に必要なデータがクエリの送信時にすで
に適切に分散されているので、クエリ処理のデータ移動が減少します。ただし、結合のコストは、テー
ブルに対して分散キーとソートキーを選択する際に考慮すべき唯一の要因ではありません。
テーブルの詳細の表示
PG_TABLE_DEF カタログテーブルを使用して、テーブルの列の詳細を表示することができます。次の
例は、SALES テーブルと LISTING テーブルに対するエンコードを示しています。SELECT リスト内の
"column" は予約語なので、二重引用符で囲む必要があることに注意してください。
API Version 2012-12-01
45
Amazon Redshift データベース開発者ガイド
分散キーの選択
select "column", type, encoding, distkey, sortkey
from pg_table_def where tablename = 'sales';
column
|
type
| encoding | distkey | sortkey
------------+----------------------+----------+---------+--------salesid
| integer
| none
| f
|
0
listid
| integer
| none
| t
|
1
sellerid
| integer
| none
| f
|
2
buyerid
| integer
| none
| f
|
0
eventid
| integer
| mostly16 | f
|
0
dateid
| smallint
| none
| f
|
0
qtysold
| smallint
| mostly8 | f
|
0
pricepaid | numeric(8,2)
| delta32k | f
|
0
commission | numeric(8,2)
| delta32k | f
|
0
saletime
| timestamp without... | none
| f
|
0
(10 rows)
select "column", type, encoding, distkey, sortkey
from pg_table_def where tablename = 'listing';
column
|
type
| encoding | distkey | sortkey
----------------+----------------------+----------+---------+--------listid
| integer
| none
| t
|
1
sellerid
| integer
| none
| f
|
0
eventid
| integer
| mostly16 | f
|
0
dateid
| smallint
| none
| f
|
0
numtickets
| smallint
| mostly8 | f
|
0
priceperticket | numeric(8,2)
| bytedict | f
|
0
totalprice
| numeric(8,2)
| mostly32 | f
|
0
listtime
| timestamp without... | none
| f
|
0
(8 rows)
フィルタリング要件
特定の列を指定する WHERE 句によってほとんどのクエリが制限される場合は、その列をソートキー
として指定することを考慮する必要があります。例えば、アプリケーションが日付、顧客名、または市
を制限する多数のクエリを実行するとします。このような列をソートキーとして定義した場合、異なる
種類の最適化が役に立ちます。値によってクエリのスコープが制限される列に対してデータが事前に
ソートされれば、クエリ処理中の行のスキャンプロセスの時間が短縮されます。特に、制限の結果、非
常に大きなドメイン内の小さな値範囲(例えば、5 年間にわたるデータを含むテーブル内の 30 日間の
日付範囲)が得られる場合に効果的です。アプリケーションがこのようなクエリを定期的に実行する場
合は、スキャン最適化の方がコロケーテッド結合最適化よりも重要となる可能性があります。
例えば、DATE テーブルの CALDATE 列は、次のような範囲制限を定期的に含めるクエリにとって、適
切な代替ソートキーです。
where caldate between '2008-01-01' and '2008-02-28'
適切な分散キーを選択するためのガイドラインについては、「最良の分散キーの選択 (p. 31)」を参照
してください。
API Version 2012-12-01
46
Amazon Redshift データベース開発者ガイド
分散の例
分散キーを使用しないテーブル
作成したほとんどのテーブルでは、分散キーを宣言する必要があります。または、テーブルで特定の分
散列について明確な選択肢が提供されない場合は、キー分散ではなく均等な分散を選択することがあり
ます。分散キーを宣言しない別のケースとしては、既存のテーブルのデータに基づいて新しいテーブル
を作成する場合が挙げられます。例えば、CREATE TABLE AS ステートメントを記述するときに、着
信データに依存して分散の動作を設定できる場合があります。詳細については、「CREATE TABLE
AS (p. 220)」の説明と例を参照してください。
ソートキーを使用しないテーブル
CREATE TABLE または CREATE TABLE AS ステートメントで SORTKEY 列を指定しない場合、テー
ブルはソートされません。最初および増分的にロードするデータが事前にソートされることがわかって
いる場合、SORTKEY は必要でないと考えられます。例えば、毎日または毎週更新されるテーブルがあ
るとします。テーブルがそのまま時間でソートされるように、新しい日付またはタイムスタンプを含む
行のみが追加されます。ソートキーを使用しないテーブルは、日付範囲に対して範囲が制限されたス
キャンなど、クエリ最適化からメリットを得られます。詳細については、「ソートキーの選択 (p. 49)」
を参照してください。
このようなテーブルを作成する利点の 1 つは、増分的ロードの後に行を再ソートするために、テーブル
に対してバキューム操作を実行する必要がない点です。DELETE または UPDATE 操作の後に、テーブ
ルに対してより迅速な VACUUM DELETE ONLY 操作を実行できます。完全なバキュームまたは SORT
ONLY バキュームを実行する必要はありません。詳細については、「テーブルのバキューム処
理 (p. 86)」、および「VACUUM (p. 308)」のコマンドの説明を参照してください。
分散の例
次の例は、CREATE TABLE ステートメントで定義したオプションに応じてデータがどのように分散さ
れるかを示しています。
DISTKEY の例
プライマリキー列 USERID が DISTKEY 列として定義されている、TICKIT データベースの USERS テー
ブルのスキーマを見てみます。
select "column", type, encoding, distkey, sortkey
from pg_table_def where tablename = 'users';
column
|
type
| encoding | distkey | sortkey
---------------+------------------------+----------+---------+--------userid
| integer
| none
| t
|
1
username
| character(8)
| none
| f
|
0
firstname
| character varying(30) | text32k | f
|
0
...
このテーブルの分散列として USERID を選択するのは適切です。SVV_DISKUSAGE システムビュー
(スーパーユーザーとしてログインする必要がある)をクエリ処理すると、テーブルが次のように非常
に均等に分散されているのがわかります。
select slice, col, num_values, minvalue, maxvalue
from svv_diskusage
where name='users' and col =0
order by slice, col;
API Version 2012-12-01
47
Amazon Redshift データベース開発者ガイド
分散の例
slice| col | num_values | minvalue | maxvalue
-----+-----+------------+----------+---------0
| 0
| 12496
| 4
| 49987
1
| 0
| 12498
| 1
| 49988
2
| 0
| 12497
| 2
| 49989
3
| 0
| 12499
| 3
| 49990
(4 rows)
テーブルには 49,990 行が含まれます。num_values 列は、4 つの各スライス上の行数を示しています。
各スライスには、ほぼ同じ行数が含まれます。
この例は、小規模なテストシステムでの分散を示しています。通常、スライスの合計数はこれよりかな
り多くなります。
USERS テーブルと同じデータを含む新しいテーブルを作成し、DISTKEY を STATE 列に指設定した場
合、分散は均等ではなくなります。スライス 2(13,587 行)には、スライス 3(10,150 行)よりも約
30% 多く行が含まれます。これよりかなり大きなテーブルでは、この量の分散スキューがあるとクエ
リ処理に悪影響を及ぼす可能性があります。
create table newusers distkey(state) as select * from users;
select slice, col, num_values, minvalue, maxvalue from svv_diskusage
where name = 'newusers' and col=0 order by slice, col;
slice | col | num_values | minvalue | maxvalue
------+-----+------------+----------+---------0 |
0 |
13587 |
5 |
49989
1 |
0 |
11245 |
2 |
49990
2 |
0 |
15008 |
1 |
49976
3 |
0 |
10150 |
4 |
49986
(4 rows)
DISTSTYLE EVEN の例
USERS テーブルと同じデータを含む新しいテーブルを作成し、DISTSTYLE を EVEN に設定した場
合、行はスライス間で常に均等に分散されます。
create table newusers diststyle even as
select * from users;
select slice, col, num_values, minvalue, maxvalue from svv_diskusage
where name = 'newusers' and col=0 order by slice, col;
slice | col | num_values | minvalue | maxvalue
------+-----+------------+----------+---------0 |
0 |
12497 |
4 |
49990
1 |
0 |
12498 |
8 |
49984
2 |
0 |
12498 |
2 |
49988
3 |
0 |
12497 |
1 |
49989
(4 rows)
ただし、分散が特定の列に基づいて行われないので、特にテーブルが他のテーブルに結合される場合
に、クエリ処理の質が低下する可能性があります。結合列で分散が行われないと、多くの場合、効率的
API Version 2012-12-01
48
Amazon Redshift データベース開発者ガイド
データの再分散
に実行できるタイプの結合操作に影響を及ぼします。結合、集計、およびグループ化操作は、両方の
テーブルがそれぞれの結合列で分散およびソートされる場合に最適化されます。
データの再分散
テーブルのデータをロード後に手動で再分散させることはできません。ただし、クエリプランの生成時
に、データブロードキャストまたは再分散指示を含めることはよくあります。オプティマイザは、特定
のクエリプランを最適に実行するためにデータのスライスまたは列をどこに配置すべきかを判断し、実
行時にデータが物理的に移動されます。このようなデータ移動は、マルチノードシステムでのクエリ処
理のルーチン部分です。
再分散では、テーブル全体がすべてのノードにブロードキャストされるか、または結合のために特定の
行がノードに送信されます。
結合されるテーブルが、クエリで指定された結合列で分散されない場合は、スライスをすべてのコン
ピューティングノードに再分散またはブロードキャストする必要があります。結合されるテーブルが結
合列で分散される場合は、コロケーテッド結合が実行され、それぞれのノード上で各テーブルのスライ
スが個別に結合されます。
ソートキーの選択
データのソートは、クエリパフォーマンスを最適化するためのメカニズムです。
テーブルの作成時に、その 1 つ以上の列をソートキーとして定義することができます。データが空の
テーブルに最初にロードされると、ソートキー列の値がディスク上にソート順に格納されます。ソート
キー列に関する情報がクエリプランナーに渡され、プランナはこの情報を使用して、データのソート方
法を利用するプランを構築します。例えば、データが結合列で分散および事前にソートされる場合は、
ハッシュ結合よりも迅速なことの多いマージ結合が適しています。新しいデータを多量に追加し、バ
キュームを実行してデータを再ソートした後、ANALYZE コマンドを実行してクエリプランナー用の統
計メタデータを更新します。詳細については、「テーブルを分析する (p. 83)」を参照してください。
ソートされたデータに依存するもう 1 つの最適化としては、範囲が制限された述語を効率的に処理する
ことが挙げられます。Amazon Redshift は、列データを 1 MB のディスクブロックに格納します。各ブ
ロックの最小値と最大値がメタデータの一部として格納されます。範囲が制限された列がソートキーで
ある場合、クエリプロセッサは最小値と最大値を使用して、テーブルスキャン中に多数のブロックをす
ばやくスキップすることができます。例えば、日付でソートされた 5 年間のデータがテーブルに格納さ
れ、クエリによって 1 か月間の日付範囲が指定される場合、最大 98% のディスクブロックをスキャン
から除外できます。データがソートされない場合は、より多くの(場合によっては、すべての)ディス
クブロックをスキャンする必要があります。これらの最適化の詳細については、「分散キーの選
択 (p. 45)」を参照してください。
また、ソートされた列データは、全般的なクエリ処理(GROUP BY および ORDER BY 操作)やウィ
ンドウ関数(PARTITION BY および ORDER BY 操作)にとって、および圧縮の最適化手段としても重
要です。選択されたソートキーがクエリパフォーマンスに与える影響を把握するには、EXPLAIN (p. 240)
コマンドを使用します。詳細については、「説明プランの分析 (p. 99)」を参照してください。
新しい行がテーブルに増分的にロードされると、これらの新しい行はソートされますが、ディスク上の
個別のリージョンに一時的に保管されます。完全にソートされたテーブルを維持するには、VACUUM
コマンドを定期的に実行する必要があります。詳細については、「テーブルのバキューム処理 (p. 86)」
を参照してください。
API Version 2012-12-01
49
Amazon Redshift データベース開発者ガイド
制約の定義
制約の定義
一意性、プライマリキー、および外部キーの制約は情報提供のみを目的としており、Amazon Redshift
によって強要されることはありません。それでもなお、プライマリキーと外部キーはプランニング時の
ヒントとして使用されます。アプリケーションの ETL プロセスまたは他の何らかのプロセスによって
これらのキーの整合性が強要される場合は、これらのキーを宣言する必要があります。
例えば、クエリプランナーは特定の統計計算でプライマリキーと外部キーを使用して、サブクエリの非
相関技術に影響を与える一意性および参照関係を推論したり、多数の結合を指示したり、冗長な結合を
回避したりします。
プランナはこれらのキーの関係を活用しますが、Amazon Redshift テーブルのすべてのキーがロード時
に有効であることが前提となります。アプリケーションが無効な外部キーまたはプライマリキーを許可
する場合、いくつかのクエリが不正な結果を返す可能性があります。例えば、プライマリキーが一意で
ない場合、SELECT DISTINCT クエリが重複した行を返すことがあります。有効かどうかわからない場
合は、テーブルに対してキーの制約を定義しないでください。一方、有効だとわかっている場合は、プ
ライマリキー、外部キー、および一意性の制約を必ず宣言してください。
Amazon Redshift は、NOT NULL 列の制約を適用します。
テーブル設計の分析
前のセクションで示したように、ソートキー、分散キー、および列エンコードを指定することにより、
ストレージ、I/O、およびクエリパフォーマンスが大幅に改善される可能性があります。このセクショ
ンでは、これらのオプションがないか、または低レベルのパフォーマンスを示すテーブルを識別するた
めに実行できる SQL スクリプトを紹介します。
次のコードをコピーして貼り付け、table_inspector.sql という名前の SQL スクリプトを作成して
から、スーパーユーザーとして SQL クライアントアプリケーションでスクリプトを実行します。スク
リプトが、TEMP_TABLES_REPORT という名前の一時テーブルを生成します。スクリプト内の最初の
数行のステートメントが、スクリプトによって作成されたテーブルをドロップするので、これらのド
ロップテーブルステートメントを削除するか、またはスクリプトを最初に実行するときにこれらを無視
する必要があります。
DROP TABLE temp_staging_tables_1;
DROP TABLE temp_staging_tables_2;
DROP TABLE temp_tables_report;
CREATE TEMP TABLE temp_staging_tables_1
(schemaname TEXT,
tablename TEXT,
tableid BIGINT,
size_in_megabytes BIGINT);
INSERT INTO temp_staging_tables_1
SELECT n.nspname, c.relname, c.oid,
(SELECT COUNT(*) FROM STV_BLOCKLIST b WHERE b.tbl = c.oid)
FROM pg_namespace n, pg_class c
WHERE n.oid = c.relnamespace
AND nspname NOT IN ('pg_catalog', 'pg_toast', 'information_schema')
AND c.relname <> 'temp_staging_tables_1';
CREATE TEMP TABLE temp_staging_tables_2
(tableid BIGINT,
min_blocks_per_slice BIGINT,
API Version 2012-12-01
50
Amazon Redshift データベース開発者ガイド
テーブル設計の分析
max_blocks_per_slice BIGINT,
slice_count BIGINT);
INSERT INTO temp_staging_tables_2
SELECT tableid, MIN(c), MAX(c), COUNT(DISTINCT slice)
FROM (SELECT t.tableid, slice, COUNT(*) AS c
FROM temp_staging_tables_1 t, STV_BLOCKLIST b
WHERE t.tableid = b.tbl
GROUP BY t.tableid, slice)
GROUP BY tableid;
CREATE TEMP TABLE temp_tables_report
(schemaname TEXT,
tablename TEXT,
tableid BIGINT,
size_in_mb BIGINT,
has_dist_key INT,
has_sort_key INT,
has_col_encoding INT,
pct_skew_across_slices FLOAT,
pct_slices_populated FLOAT);
INSERT INTO temp_tables_report
SELECT t1.*,
CASE WHEN EXISTS (SELECT *
FROM pg_attribute a
WHERE t1.tableid = a.attrelid
AND a.attnum > 0
AND NOT a.attisdropped
AND a.attisdistkey = 't')
THEN 1 ELSE 0 END,
CASE WHEN EXISTS (SELECT *
FROM pg_attribute a
WHERE t1.tableid = a.attrelid
AND a.attnum > 0
AND NOT a.attisdropped
AND a.attsortkeyord > 0)
THEN 1 ELSE 0 END,
CASE WHEN EXISTS (SELECT *
FROM pg_attribute a
WHERE t1.tableid = a.attrelid
AND a.attnum > 0
AND NOT a.attisdropped
AND a.attencodingtype <> 0)
THEN 1 ELSE 0 END,
100 * CAST(t2.max_blocks_per_slice - t2.min_blocks_per_slice AS FLOAT)
/ CASE WHEN (t2.min_blocks_per_slice = 0)
THEN 1 ELSE t2.min_blocks_per_slice END,
CAST(100 * t2.slice_count AS FLOAT) / (SELECT COUNT(*) FROM STV_SLICES)
FROM temp_staging_tables_1 t1, temp_staging_tables_2 t2
WHERE t1.tableid = t2.tableid;
SELECT * FROM temp_tables_report
ORDER BY schemaname, tablename;
次のサンプルは、データスキューの影響を示す 2 つのサンプルテーブル: SKEW と SKEW2 とともにス
クリプトを実行した際の結果を示しています。
API Version 2012-12-01
51
Amazon Redshift データベース開発者ガイド
テーブル設計の分析
|
|
|
|has_ |has_ |has_
|pct_skew_|pct_
|
|
|size_|dist_ |sort_|col_
|across_ |slices_
schemaname|tablename|tableid|in_mb|key
|key |encoding|slices
|populated
----------+---------+-------+-----+------+-----+--------+---------+--------public
|category |100553 | 28 |
1 |
1 |
0 |
0 |
100
public
|date
|100555 | 44 |
1 |
1 |
0 |
0 |
100
public
|event
|100558 | 36 |
1 |
1 |
1 |
0 |
100
public
|listing |100560 | 44 |
1 |
1 |
1 |
0 |
100
public
|nation
|100563 | 175 |
0 |
0 |
0 |
0 |
39.06
public
|region
|100566 | 30 |
0 |
0 |
0 |
0 |
7.81
public
|sales
|100562 | 52 |
1 |
1 |
0 |
0 |
100
public
|skew
|100547 |18978|
0 |
0 |
0 |
15.12 |
50
public
|skew2
|100548 | 353 |
1 |
0 |
0 |
0 |
1.56
public
|venue
|100551 | 32 |
1 |
1 |
0 |
0 |
100
public
|users
|100549 | 82 |
1 |
1 |
1 |
0 |
100
public
|venue
|100551 | 32 |
1 |
1 |
0 |
0 |
100
次のリストは、TEMP_TABLES_REPORT の列についての説明です。
has_dist_key
テーブルに分散キーが存在するかどうかを示します。1 はキーが存在することを示し、0 はキーが
存在しないことを示します。例えば、nation には分散キーがありません。
has_sort_key
テーブルにソートキーが存在するかどうかを示します。1 はキーが存在することを示し、0 はキー
が存在しないことを示します。例えば、nation にはソートキーがありません。
has_column_encoding
テーブルのいずれかの列に対して圧縮エンコードが定義されているかどうかを示します。1 は、少
なくとも 1 つの列にエンコードが定義されていることを示します。0 は、エンコードが定義されて
いないことを示します。例えば、region には圧縮エンコードが定義されていません。
pct_skew_across_slices
データ分散スキューの割合。値が小さいほど結果は良好です。
pct_slices_populated
入力されているスライスの割合。値が大きいほど結果は良好です。
重大なデータ分散スキューが存在するテーブルでは、pct_skew_across_slices 列の値が大きいか、また
は pct_slices_populated 列の値が小さくなっています。そのような場合は、適切な分散キー列を選択し
ていないことを意味します。上記の例では、SKEW テーブルのスライス全体に 15.12% のスキューが
存在しますが、必ずしも問題とは限りません。もっと重大なのは、SKEW2 テーブルについて、入力さ
れているスライスの値が 1.56% であることです。このように小さな値は、SKEW2 テーブルの分散キー
が正しくないことを意味します。
新しいテーブルをデータベースに追加したか、またはテーブルを大きく変更した場合は、必ず
table_inspector.sql スクリプトを実行してください。
API Version 2012-12-01
52
Amazon Redshift データベース開発者ガイド
データロードのベストプラクティス
データのロード
Topics
• データロードのベストプラクティス (p. 53)
• COPY コマンドを使ってデータをロードする (p. 60)
• DML コマンドによるテーブルの更新 (p. 80)
• 新しいデータの更新と挿入 (p. 80)
• ディープコピーを実行する (p. 81)
• テーブルを分析する (p. 83)
• テーブルのバキューム処理 (p. 86)
• 同時書き込み操作を管理する (p. 87)
Amazon S3 バケットに保存されているフラットファイルと Amazon DynamoDB テーブルのいずれかか
らテーブルに大量のデータをロードすることができます。
COPY コマンドは、テーブルをロードする最も効率的な方法です。Amazon S3 からデータをロードす
るとき、COPY コマンドを利用すれば、複数のデータファイルを同時に読み込むことができます。
Amazon S3 のデータファイルと DynamoDB テーブルのいずれかからデータをロードする場合でも、
Amazon Redshift はワークロードをクラスターノードに分散し、ロードプロセスを並列で実行します。
COPY コマンドを使ってデータをロードするとき、一時的セキュリティ認証情報を使用して、ロード
データへのユーザーアクセスを制限できます。
INSERT コマンドを使ってデータをテーブルに追加することもできます。ただし、COPY コマンドを
使ったほうが効率的です。
初回のデータロードの後、大量のデータを追加、変更、削除した場合、VACUUM コマンドを実行して
データを再編成し、削除後の領域を利用可能な状態に戻してください。また、ANALYZE コマンドを実
行し、テーブル統計を更新します。
このセクションでは、データのロード方法とデータロードのトラブルシューティング方法を説明し、
データロードのベストプラクティスを紹介します。
データロードのベストプラクティス
Topics
• COPY コマンドを使ってデータをロードする (p. 54)
API Version 2012-12-01
53
Amazon Redshift データベース開発者ガイド
COPY コマンドを使ってデータをロードする
• 単一の COPY コマンドを使用する (p. 54)
• データを複数のファイルに分割する (p. 54)
• GZIP または LZOP でデータファイルを圧縮する (p. 55)
• データのロードエラーを回避する (p. 55)
• ロードの前後にデータファイルを検証する (p. 57)
• 複数行の挿入を使用する (p. 57)
• 一括挿入を使用する (p. 57)
• ソートキー順序でデータをロードする (p. 58)
• 順次ブロックでデータをロードする (p. 58)
• 時系列テーブルを使用する (p. 58)
• ステージングテーブルを使い、マージ(アップサート)を実行する (p. 58)
• 保守管理の時間枠を回避したスケジュール計画 (p. 59)
• データベースのバキューム処理 (p. 59)
• ディープコピーを使い、長時間のバキューム処理を回避する (p. 59)
• 利用可能なメモリを増やす (p. 59)
• テーブル統計を最新の状態に維持する (p. 60)
大量のデータセットのロードには時間がかかり、大量のコンピューティングリソースを消費する場合が
あります。データのロード方法はクエリパフォーマンスにも影響を与える可能性があります。このセク
ションでは、COPY コマンド、一括挿入、ステージングテーブルを使って効率的にデータをロードする
ベストプラクティスを紹介します。
データのロードには、あらゆる状況で使える唯一のベストプラクティスは存在しません。後のセクショ
ンでは、テーブル設計オプションの詳細と例を示します。
COPY コマンドを使ってデータをロードする
COPY コマンドを使って Amazon S3 または Amazon DynamoDB からデータを並列でロードします。
COPY コマンドは INSERT ステートメントを使う場合よりもはるかに効率的に大量のデータをロード
し、データを保存します。
COPY コマンドの使用に関する詳細については、「Amazon S3 からデータをロードする (p. 61)」と
「Amazon DynamoDB テーブルからデータをロードする (p. 71)」を参照してください。
COPY コマンドを実行し、ソートキーを使う空のテーブルにデータをロードするとき、Amazon Redshift
はディスクに保存する前にデータをソートします。これにより、クエリパフォーマンスが改善します。
「最良のソートキーの選択 (p. 31)」を参照してください。
単一の COPY コマンドを使用する
単一の COPY コマンドを使い、複数のファイルから 1 つのテーブルにデータをロードします。その後、
Amazon Redshift が自動的にデータを並列でロードします。
同時に複数の COPY コマンドを使い、複数のファイルから 1 つのテーブルにロードしないでください。
複数の COPY コマンドを使うとロードが直列化されるために遅くなり、テーブルにソート列が定義さ
れている場合、最後に VACUUM が必要になります。COPY の使用によるデータのロードの詳細につい
ては、「Amazon S3 からデータをロードする (p. 61)」を参照してください。
データを複数のファイルに分割する
COPY コマンドを使って Amazon S3 からデータをロードするとき、1 つの大容量ファイルからすべて
のデータをロードするのではなく、最初に複数のファイルにデータを分割します。
API Version 2012-12-01
54
Amazon Redshift データベース開発者ガイド
GZIP または LZOP でデータファイルを圧縮する
次に、COPY コマンドにより複数のファイルからデータが並列でロードされます。クラスターのノード
間でワークロードが分散されます。データをファイルに分割する方法と COPY を使ってデータをロー
ドする例の詳細については、「Amazon S3 からデータをロードする (p. 61)」を参照してください。
GZIP または LZOP でデータファイルを圧縮する
データセットが大きいとき、GZIP または LZOP を使ってロードファイルを個別に圧縮することをお勧
めします。
COPY コマンドとともに GZIP または LZOP オプションを指定します。この例では、パイプで区切ら
れた LZOP ファイルから TIME テーブルをロードしています。
copy time
from 's3://mybucket/data/timerows.lzo'
credentials 'aws_access_key_id=<access-key-id>;aws_secret_access_key=<secretaccess-key>'
lzop
delimiter '|';
データのロードエラーを回避する
Amazon S3 の一部の操作の整合性は結果整合性です。そのため、アップロードの直後に新しいデータ
が利用できない場合があります。その場合、データのロードが不完全になったり、古いデータがロード
されたりします。マニフェストファイルを使ってデータをロードし、米国スタンダードリージョンで
Amazon S3 バケットに指定エンドポイントを使うことで、データの整合性を管理できます。詳細につ
いては、「
Amazon S3 の一部の操作の整合性は結果整合性です。そのため、アップロードの直後に新しいデータ
が利用できない場合があります。その場合、データのロードが不完全になったり、古いデータがロード
されたりします。米国スタンダードリージョンのバケットにアップロードした場合、結果的に整合性が
取れます。その他のリージョンでは、一意のオブジェクトキーを持つ新しいオブジェクトをアップロー
ドした場合の整合性はリードアフターライト整合性になります。データの整合性に関する詳細は、
Amazon Simple Storage Service 開発者ガイドの「Amazon S3 Data Consistency Model」を参照してく
ださい。
お使いのアプリケーションで正しいデータがロードされるように、次のプラクティスをお勧めします。
• 新しいオブジェクトキーを作成します。
Amazon S3 はすべてのリージョンの書き込み操作に対して結果整合性を提供します。データのロー
ド操作のたびに Amazon S3 で新しいファイル名またはオブジェクトキーを作成した場合、米国スタ
ンダードを除き、すべてのリージョンでデータの整合力が強化されます。
• COPY 操作でマニフェストファイルを使用します。
マニフェストにより、ロードするファイルに明示的に名前が付けられます。マニフェストファイルを
使うとデータの整合力が強化されます。そのため、米国スタンダードリージョンのバケットにとって
特に重要ですが、あらゆるリージョンでも優れたプラクティスとなります。
• 指名エンドポイントを使用します。
クラスターが米国東部(バージニア北部)リージョンにある場合、Amazon S3 バケットの作成時に
指名エンドポイントを使うことでデータの整合性を改善し、レイテンシーを短縮することができま
す。
このセクションの残りではこれらのステップについて詳しく説明します。
API Version 2012-12-01
55
Amazon Redshift データベース開発者ガイド
データのロードエラーを回避する
新しいオブジェクトキーを作成する
データの整合性には問題が潜在するため、データのロード操作のたびに一意の Amazon S3 オブジェク
トキーで新しいファイルを作成することをお勧めします。既存のファイルを新しいデータで上書きし、
その後、アップロードの直後に COPY コマンドを発行した場合、その COPY 操作では、すべての新し
いデータが利用可能になる前に古いファイルからのロードを開始する可能性があります。結果整合性に
関する詳細は、Amazon S3 開発者ガイドの「Amazon S3 Data Consistency Model」を参照してくださ
い。
マニフェストファイルを使用する
マニフェストファイルを使い、ロードするファイルを明示的に指定できます。マニフェストファイルを
使うと、COPY により強力な整合性が適用されます。リストに指定されているファイルがプライマリ
サーバーに見つからない場合、セカンダリサーバーが検索されます。マニフェストファイルは任意の
mandatory フラグで構成できます。mandatory が true であり、ファイルが見つからない場合、COPY
を実行するとエラーが返されます。
マニフェストファイルの使用に関する詳細は、COPY コマンドの MANIFEST file (p. 190) オプションと
COPY 例の マニフェストを使用し、データファイルを指定する (p. 200) を参照してください。
マニフェストファイルの使用では、米国スタンダードリージョンで新しいデータファイルからロードす
るとき、整合性が結果整合性になります。ただし、Amazon S3 ではすべてのリージョンの上書きの整
合性が結果整合性になるため、既存のオブジェクトを新しいデータで上書きする場合、古いデータが
ロードされる可能性があります。ベストプラクティスとしては、決して既存のファイルを新しいデータ
で上書きしないでください。
指名エンドポイントを使用する
米国東部(バージニア北部)リージョンでクラスターを作成し、オブジェクトプレフィックスを使って
ロードファイルを識別する場合、バケットの作成時には米国スタンダードリージョンを指定しないでく
ださい。Amazon S3 では、米国スタンダードリージョンのすべての操作の整合性が結果整合性になり
ます。クラスターが米国東部(バージニア北部)リージョンにある場合、Amazon S3 バケットの作成
時に指名エンドポイントを使うことでデータの整合性を改善できます。Amazon S3 は、米国スタンダー
ドリージョンを指定するリクエストを自動的にバージニア北部または太平洋北西部の施設に送信しま
す。US 東部リージョンでクラスターを作成し、Amazon S3 バケットの作成時に米国スタンダードリー
ジョンを指定する場合、データがクラスターの近くに置かれない可能性があります。指名エンドポイン
トを使い、Amazon S3 バケットの作成時に US 東部リージョンを指定する場合、AWS は可能な限り
データをバージニア北部に送信します。指名エンドポイントを使用した場合もデータのレイテンシーが
短縮されます。
ロードするファイルをマニフェストファイルに指定した場合、COPY コマンドを実行すると、リストに
指定されているファイルの整合性が適用されます。詳細については、「マニフェストファイルを使用す
る (p. 64)」を参照してください。
その他のリージョンには指名エンドポイントを使う必要がありません。
US 東部リージョンに指名エンドポイントを使用するには、Amazon S3 へのアクセスに使用するホスト
名のサブストリングの s3.amazonaws.com を s3-external-1.amazonaws.com に置換します。例
えば、次の文字列を、
http://mybucket.s3.amazonaws.com/somekey.ext
次の文字列で置換します。
http://mybucket.s3-external-1.amazonaws.com/somekey.ext
API Version 2012-12-01
56
Amazon Redshift データベース開発者ガイド
ロードの前後にデータファイルを検証する
指名エンドポイントは Amazon S3 API または CLI でのみ使用できます。Amazon S3 コンソールで指
名エンドポイントを使用することはできません。
Amazon S3 リージョンに関する詳細は、『Amazon Simple Storage Service 開発者ガイド』の「Buckets
and Regions」を参照してください。
(p. 63)」を参照してください。
ロードの前後にデータファイルを検証する
Amazon S3 からデータをロードするとき、最初に Amazon S3 バケットにファイルをアップロードし、
次にバケットに正しいファイルのみが全部含まれることを確認します。詳細については、「必要なファ
イルがバケットにあることを確認する (p. 65)」を参照してください。
ロード操作が完了したら、STL_LOAD_COMMITS (p. 489) システムテーブルにクエリし、ファイルが予
定どおりロードされたことを確認します。詳細については、「データが正しくロードされたことを確認
する (p. 70)」を参照してください。
複数行の挿入を使用する
COPY コマンドを選択できないときに SQL 挿入が必要な場合、可能であれば、複数行の挿入を使用し
ます。一度にたった 1 行または数行ずつデータを追加するとき、データ圧縮は効率的ではありません。
複数行の挿入を使用すれば、一連の挿入を一括処理することでパフォーマンスが改善します。次の例で
は、シングル INSERT ステートメントを使い、3 つの行を 4 列のテーブルに挿入しています。これは、
複数行の挿入の構文を図示するためだけの小規模な挿入例にすぎません。
insert into category_stage values
(default, default, default, default),
(20, default, 'Country', default),
(21, 'Concerts', 'Rock', default);
詳細と例については、「INSERT (p. 248)」を参照してください。
一括挿入を使用する
SELECT 句とともに一括挿入操作を使用すれば、データ挿入のパフォーマンスが向上します。
テーブル間でデータまたはデータのサブセットを移動する必要があるとき、INSERT (p. 248) および
CREATE TABLE AS (p. 220) コマンドを使用します。
例えば、次の INSERT ステートメントでは、CATEGORY テーブルからすべての行が選択され、
CATEGORY_STAGE テーブルに挿入されます。
insert into category_stage
(select * from category);
次の例では、CATEGORY_STAGE が CATEGORY のコピーとして作成され、CATEGORY のすべての
行が CATEGORY_STAGE に挿入されます。
create table category_stage as
select * from category;
API Version 2012-12-01
57
Amazon Redshift データベース開発者ガイド
ソートキー順序でデータをロードする
ソートキー順序でデータをロードする
ソートキー順序でデータをロードし、バキュームの必要性をなくします。
新しいデータの各バッチがテーブルの既存の行に続く限り、データはソート順序で適切に保存され、バ
キュームを実行する必要がありません。COPY により入ってくるデータの各バッチがロード時にソート
されるため、各ロードの行を事前にソートする必要はありません。
例えば、本日のアクティビティに基づいて毎日データをロードするとします。ソートキーがタイムスタ
ンプ列の場合、本日のデータは常に前日のデータの終わりに追加されるため、データはソート順序で保
存されます。
順次ブロックでデータをロードする
大量のデータを追加する必要がある場合、ソート順序に基づいて順次ブロックでデータをロードすれば
バキュームの必要性がなくなります。
例えば、2012 年 1 月から 2012 年 12 月までのイベントのあるテーブルをロードする必要があるとしま
す。1 月の行をロードし、次に 2 月の行をロードします。以降、同様に続けます。ロードが完了したと
き、テーブルは完全にソートされています。バキュームを実行する必要はありません。詳細について
は、「時系列テーブルを使用する (p. ?)」を参照してください。
非常に大量のデータセットをロードするとき、ソートに必要な領域が利用可能な領域の合計を超えるこ
とがあります。小さなブロックでデータをロードすれば、各ロードの際、中間のソート領域が少なくて
済みます。また、小さなブロックをロードする場合、COPY が失敗してロールバックされるときに簡単
に再開できます。
時系列テーブルを使用する
データの保存期間が固定されている場合、時系列テーブルの順序でデータを整理することをお勧めしま
す。各テーブルは同じであっても、異なる時間範囲のデータが含まれるようにします。
該当するテーブルで DROP TABLE を実行することで古いデータを簡単に削除できます。大規模な
DELETE を実行するよりもはるかに高速であり、その後、VACUUM を実行して領域を再利用する必要
がありません。UNION ALL ビューを作成し、データが異なるテーブルに保存されているという事実を
隠すことができます。古いデータを削除するとき、UNION ALL ビューを微調整し、ドロップしたテー
ブルを削除します。同様に、新しい期間を新しいテーブルにロードするとき、新しいテーブルをこの
ビューに追加します。
ソートキーのタイムスタンプ列のある時系列テーブルを使用する場合、ソートキー順序でデータを効果
的にロードします。それにより、バキュームでデータを再ソートする必要がなくなります。詳細につい
ては、「ソートキー順序でデータをロードする (p. 58)ソートキー順序でデータをロードする」を参照
してください。
ステージングテーブルを使い、マージ(アップサー
ト)を実行する
データを最初にステージングテーブルにロードすることで、効率的に新しいデータを更新し、挿入でき
ます。
データを最初にステージングテーブルにロードすることで、効率的に新しいデータを更新し、挿入でき
ます。Amazon Redshift では単一の MERGE ステートメント(UPDATE、INSERT、または UPSERT
とも呼ばれる)がサポートされませんが、データをステージングテーブルにロードし、UPDATE ステー
トメントおよび INSERT ステートメントでステージングテーブルとターゲットテーブルを結合するこ
API Version 2012-12-01
58
Amazon Redshift データベース開発者ガイド
保守管理の時間枠を回避したスケジュール計画
とで、マージ操作を効果的に実行できます。手順については、「新しいデータの更新と挿入 (p. 80)」
を参照してください。
保守管理の時間枠を回避したスケジュール計画
スケジュール計画された保守管理がクエリの実行中に発生した場合、クエリは中止となり、ロールバッ
クされます。クエリをやり直す必要があります。大量のデータのロードや VACUUM 操作など、長時間
実行の操作は、保守管理の時間枠を回避してスケジュールを計画します。小規模の増分でデータをロー
ドし、VACUUM 操作の規模を管理することで、リスクを最小限に抑え、やり直しが必要な場合、簡単
にやり直すこともできます。詳細については、「順次ブロックでデータをロードする (p. 58)」および
「テーブルのバキューム処理 (p. 86)」を参照してください。
データベースのバキューム処理
大量の行数を追加、削除、変更した場合、データをソートキー順序でロードしていなければ、VACUUM
コマンドを実行します。VACUUM コマンドを実行すると、データが再編成され、ソート順序が維持さ
れ、パフォーマンスが復旧されます。
COPY コマンドを実行し、ソートキーを使うテーブルにデータをロードするとき、Amazon Redshift は
ディスクにデータを保存する前にデータをソートします。後にかなりの数の新しい行をテーブルに追加
した場合、新しい行が既存の行に対してソートされないため、パフォーマンスが低下する可能性があり
ます。
ソートキー順序でデータをロードし、順次ブロックでデータをロードすることで、バキューム処理の必
要性を減らすか、なくすことができます。詳細については、「ソートキー順序でデータをロードす
る (p. 58)」と「順次ブロックでデータをロードする (p. 58)」を参照してください。
バキューム処理の頻度に関する詳細については、「テーブルのバキューム処理 (p. 86)」を参照してく
ださい。
ディープコピーを使い、長時間のバキューム処理を
回避する
ディープコピーでは、一括挿入を使用してテーブルが再作成され、再設定されます。これにより、テー
ブルが自動的に再ソートされます。テーブルにソートされていない大規模なリージョンがある場合、
ディープコピーの方がバキューム処理より高速です。欠点としては、ディープコピー処理中は同時更新
を実行できません。バキューム処理では実行できます。詳細については、「ディープコピーを実行す
る (p. 81)」を参照してください。
利用可能なメモリを増やす
データのロードまたはバキューム処理にかかる時間が長すぎる場合、wlm_query_slot_count を増やすこ
とで COPY または VACUUM に利用できるメモリを増やします。
データのロードまたはバキューム処理はメモリを集中的に使用する場合があります。COPY ステートメ
ントまたは VACUUM ステートメントを使用する場合は、wlm_query_slot_count パラメータの値を一時
的に増やすことで、追加のメモリを割り当て、パフォーマンスを上げることができます。ただし、
wlm_query_slot_count を増やすと、クラスターで実行できるその他の同時クエリの数が減ります。この
パラメータの設定方法とパラメータを設定した場合の結果に関する詳細については、
「wlm_query_slot_count (p. 573)」の指示を参照してください。
API Version 2012-12-01
59
Amazon Redshift データベース開発者ガイド
テーブル統計を最新の状態に維持する
テーブル統計を最新の状態に維持する
テーブル統計を最新の状態にするために、データに大規模な変更を行ったとき、ANALYZE コマンドを
実行します。
Amazon Redshift のクエリオプティマイザは、統計メタデータに基づいて最適なクエリプランを決定し
ます。最初に COPY コマンド(STATUPDATE OFF)、INSERT INTO SELECT コマンド、または
CREATE TABLE AS コマンドを使ってテーブルをロードするとき、Amazon Redshift はロードの最後
でテーブルの統計を自動的に生成します。ただし、データを追加、変更、削除すると、テーブルの統計
は現在のデータの特性を反映しなくなります。
詳細と例については、「テーブルを分析する (p. 83)」を参照してください。
COPY コマンドを使ってデータをロードする
Topics
• 入力データを準備する (p. 61)
• Amazon S3 からデータをロードする (p. 61)
• Amazon DynamoDB テーブルからデータをロードする (p. 71)
• 入力データを検証する (p. 73)
• 自動圧縮ありでテーブルをロードする (p. 73)
• 細長いテーブルのストレージの最適化 (p. 75)
• デフォルトの列値をロードする (p. 75)
• データロードのトラブルシューティング (p. 76)
COPY コマンドは Amazon Redshift の超並列処理(MPP)アーキテクチャを活用し、Amazon S3 の
ファイルと DynamoDB テーブルのいずれかから並列でデータをロードします。
Note
大量のデータをロードする場合、COPY コマンドを使うことをお勧めします。個々に INSERT
ステートメントを使ってテーブルにデータを入力すると著しく時間がかかる場合があります。
代替的に、データが他の Amazon Redshift データベーステーブルに存在する場合、INSERT
INTO ... SELECT または CREATE TABLE AS を使うとパフォーマンスが向上します。詳細に
ついては、「INSERT (p. 248)」または「CREATE TABLE AS (p. 220)」を参照してください。
COPY コマンドを使ってデータをテーブルにロードするための権限を与えるか、取り消すには、INSERT
権限を与えるか、取り消します。
データの形式を Amazon Redshift テーブルにロードするための適切な形式にする必要があります。こ
のセクションでは、ロードする前にデータを準備し、検証するための指針と、COPY ステートメントを
実行する前に文を検証するための指針を紹介します。
Amazon S3 バケットにアップロードするデータファイルの情報を保護するには、事前に暗号化してお
きます。COPY を実行すると、ロード時にデータが復号化されます。一時的セキュリティ認証情報を
ユーザーに与えることで、データロードのアクセスを制限することもできます。一時的セキュリティ認
証情報はセキュリティを強化します。使用期限が短く、期限が切れた後は再利用できないためです。
GZIP または LZOP を使ってファイルを圧縮し、ファイルのアップロードにかかる時間を短縮できま
す。その後、COPY を使えば、読み込み時にファイルが解凍され、ロードプロセスが高速化されます。
API Version 2012-12-01
60
Amazon Redshift データベース開発者ガイド
入力データを準備する
AWS クラウド内での送信時にデータの安全を守るために、Amazon Redshift はハードウェア加速化
SSL を利用し、Amazon S3 または Amazon DynamoDB と通信し、COPY、UNLOAD、バックアップ、
復旧操作を行います。
Amazon DynamoDB テーブルからデータを直接ロードするとき、Amazon DynamoDB がプロビジョニ
ングするスループットの消費量を制御するオプションがあります。
任意で COPY を使い、入力データを分析したり、ロードプロセスの一部として最適な圧縮エンコーディ
ングをテーブルに自動的に適用したりできます。
入力データを準備する
入力データとそれを受け取るテーブル列の間に互換性がない場合、COPY コマンドは失敗します。
次の指針を利用し、入力データの妥当性を確認してください。
• データには最大 4 バイトの UTF-8 文字のみを含めることができます。
• CHAR 文字列と VARCHAR 文字列がそれに対応する列の長さを超えないことを確認してください。
VARCHAR 文字列は文字数ではなく、バイト数でカウントされます。そのため、例えば、4 バイトを
使う漢字が 4 文字集まった文字列は VARCHAR(16) 列を必要とします。
• マルチバイト文字は VARCHAR 列との連動でのみ使用できます。マルチバイト文字が 4 バイトを超
えないことを確認します。
• CHAR 列のデータにシングルバイトの文字のみが含まれることを確認します。
• レコードの最後のフィールドを示すために特殊な文字や構文を含めないでください。このフィールド
は区切り文字にすることができます。
• NUL(UTF-8 0000)またはバイナリゼロ(0x000)とも呼ばれる null ターミネーターをデータに含
める場合、これらの文字は NULLS として CHAR または VARCHAR 列にロードすることができます。
その際、NULL AS オプションを COPY コマンドで使用します(null '\0' として、または null
'\000' として)。NULL AS を使用しない場合、null ターミネーターが原因となり、COPY が失
敗します。
• 文字列に、区切り文字や埋め込み改行など、特殊文字が含まれる場合、COPY (p. 187) コマンドとと
もに ESCAPE オプションを使用します。
• 一重引用符と二重引用符がすべて適切に一致していることを確認してください。
• 浮動小数点の文字列が 12.123 のような標準浮動小数点形式と 1.0E4 のような指数形式のいずれかに
なっていることを確認してください。
• すべてのタイムスタンプおよび日付文字列が DATEFORMAT と TIMEFORMAT の文字列 (p. 198) の
仕様に従っていることを確認してください。デフォルトのタイムスタンプ形式は YYYY-MM-DD
hh:mm:ss であり、デフォルトの日付形式は YYYY-MM-DD です。
• 個々のデータ型の制約に関する詳細は、「データ型 (p. 127)」を参照してください。マルチバイト文
字のエラーに関する詳細は、「マルチバイト文字のロードエラー (p. 78)」を参照してください。
Amazon S3 からデータをロードする
Topics
• データを複数のファイルに分割する (p. 62)
• Amazon S3 にファイルをアップロードする (p. 62)
• COPY コマンドを使用し、Amazon S3 からロードする (p. 66)
• データが正しくロードされたことを確認する (p. 70)
COPY コマンドは Amazon Redshift の超並列処理(MPP)アーキテクチャを利用し、Amazon S3 バ
ケットのファイルからデータを並列でロードします。データを複数のファイルに分割し、テーブルに分
API Version 2012-12-01
61
Amazon Redshift データベース開発者ガイド
Amazon S3 からデータをロードする
散キーを設定すれば、並列処理の長所を最大限に活用できます。分散キーの詳細については、「データ
分散方法の選択 (p. 43)」を参照してください。
ファイルからのデータはターゲットテーブルに 1 行ずつロードします。データファイルのフィールドは
左から右の順でテーブル列に一致します。データファイルのフィールドは固定幅か文字区切りになりま
す。デフォルトの区切り文字はパイプ(|)です。デフォルトでは、すべてのテーブル列がロードされ
ますが、任意の列のリストをカンマ区切りで指定することもできます。COPY コマンドに指定された列
リストに含まれていない列については、デフォルト値がロードされます。詳細については、「デフォル
トの列値をロードする (p. 75)」を参照してください。
Amazon S3 からデータをロードするには、次の一般プロセスに従います。
1. データを複数のファイルに分割します。
2. ファイルを Amazon S3 にアップロードします。
3. COPY コマンドを実行し、テーブルをロードします。
4. データが正しくロードされたことを確認します。
このセクションの残りではこれらのステップについて詳しく説明します。
データを複数のファイルに分割する
テーブルには 1 つのファイルからデータをロードすることも、複数に分割されたファイルからデータを
ロードすることができます。COPY コマンドを実行すると、複数のファイルから並列でデータをロード
することができます。セットに共通プレフィックスまたはプレフィックスキーを指定するか、マニフェ
ストファイルにファイルのリストを明示的に指定することで、複数のファイルをロードできます。
Note
データを複数のファイルに分割し、並列処理の長所を最大限に活用することをお勧めします。
ファイルの数がクラスターのスライスの数の倍数になるようにデータをファイルに分割します。そうす
ることで、Amazon Redshift はスライス間でデータを均等に分割できます。例えば、各 XL コンピュー
ティングノードには 2 つのスライスがあり、各 8XL コンピューティングノードには 16 個のスライスが
あります。クラスターに XL ノードが 2 つある場合、データを 4 つのファイルまたは 4 の倍数のファイ
ルに分割します。Amazon Redshift はワークロードを分割するときにファイルサイズを考慮しません。
そのため、ファイルを大体同じサイズにする必要があります。
オブジェクトプレフィックスを使ってロードファイルを識別する場合、各ファイルの名前に共通のプレ
フィックスを付けます。例えば、venue.txt ファイルを次のように 4 つのファイルに分割します。
venue.txt.1
venue.txt.2
venue.txt.3
venue.txt.4
複数のファイルをバケットのフォルダーに置く場合、プレフィックスとしてフォルダー名を指定できま
す。COPY を実行すると、フォルダー内のすべてのファイルがロードされます。ロードするファイルが
複数のバケットまたはフォルダーに分散している場合は、それらのファイルのリストをマニフェスト
ファイルに明示的に指定します。
Amazon S3 にファイルをアップロードする
Topics
• データの整合性の管理 (p. 63)
API Version 2012-12-01
62
Amazon Redshift データベース開発者ガイド
Amazon S3 からデータをロードする
• 暗号化されたデータを Amazon S3 にアップロードする (p. 65)
• 必要なファイルがバケットにあることを確認する (p. 65)
ファイルを分割したら、バケットにアップロードできます。ロード前に任意でファイルを圧縮したり、
暗号化したりできます。
データファイルを入れる Amazon S3 バケットを作成し、データファイルをバケットにアップロードし
ます。バケットの作成とファイルのアップロードに関する詳細は、Amazon Simple Storage Service 開
発者ガイドの「Working with Amazon S3 Buckets」を参照してください。
Amazon S3 の一部の操作の整合性は結果整合性です。そのため、アップロードの直後に新しいデータ
が利用できない場合があります。詳細については、「データの整合性の管理 (p. 63)」を参照してくだ
さい。
Important
データファイルを保持する Amazon S3 バケットはクラスターと同じリージョンで作成する必
要があります。
Amazon S3 コンソールを利用してバケットを作成するときにリージョンを選択するか、Amazon S3
API または CLI を利用してバケットを作成するときにエンドポイントを指定することで、特定のリー
ジョンに Amazon S3 バケットを作成できます。
データのロード後、Amazon S3 に正しいファイルが存在することを確認します。
データの整合性の管理
Amazon S3 の一部の操作の整合性は結果整合性です。そのため、アップロードの直後に新しいデータ
が利用できない場合があります。その場合、データのロードが不完全になったり、古いデータがロード
されたりします。米国スタンダードリージョンのバケットにアップロードした場合、結果的に整合性が
取れます。その他のリージョンでは、一意のオブジェクトキーを持つ新しいオブジェクトをアップロー
ドした場合の整合性はリードアフターライト整合性になります。データの整合性に関する詳細は、
Amazon Simple Storage Service 開発者ガイドの「Amazon S3 Data Consistency Model」を参照してく
ださい。
お使いのアプリケーションで正しいデータがロードされるように、次のプラクティスをお勧めします。
• 新しいオブジェクトキーを作成します。
Amazon S3 はすべてのリージョンの書き込み操作に対して結果整合性を提供します。データのロー
ド操作のたびに Amazon S3 で新しいファイル名またはオブジェクトキーを作成した場合、米国スタ
ンダードを除き、すべてのリージョンでデータの整合力が強化されます。
• COPY 操作でマニフェストファイルを使用します。
マニフェストにより、ロードするファイルに明示的に名前が付けられます。マニフェストファイルを
使うとデータの整合力が強化されます。そのため、米国スタンダードリージョンのバケットにとって
特に重要ですが、あらゆるリージョンでも優れたプラクティスとなります。
• 指名エンドポイントを使用します。
クラスターが米国東部(バージニア北部)リージョンにある場合、Amazon S3 バケットの作成時に
指名エンドポイントを使うことでデータの整合性を改善し、レイテンシーを短縮することができま
す。
このセクションの残りではこれらのステップについて詳しく説明します。
API Version 2012-12-01
63
Amazon Redshift データベース開発者ガイド
Amazon S3 からデータをロードする
新しいオブジェクトキーを作成する
データの整合性には問題が潜在するため、データのロード操作のたびに一意の Amazon S3 オブジェク
トキーで新しいファイルを作成することをお勧めします。既存のファイルを新しいデータで上書きし、
その後、アップロードの直後に COPY コマンドを発行した場合、その COPY 操作では、すべての新し
いデータが利用可能になる前に古いファイルからのロードを開始する可能性があります。結果整合性に
関する詳細は、Amazon S3 開発者ガイドの「Amazon S3 Data Consistency Model」を参照してくださ
い。
マニフェストファイルを使用する
マニフェストファイルを使い、ロードするファイルを明示的に指定できます。マニフェストファイルを
使うと、COPY により強力な整合性が適用されます。リストに指定されているファイルがプライマリ
サーバーに見つからない場合、セカンダリサーバーが検索されます。マニフェストファイルは任意の
mandatory フラグで構成できます。mandatory が true であり、ファイルが見つからない場合、COPY
を実行するとエラーが返されます。
マニフェストファイルの使用に関する詳細は、COPY コマンドの MANIFEST file (p. 190) オプションと
COPY 例の マニフェストを使用し、データファイルを指定する (p. 200) を参照してください。
マニフェストファイルの使用では、米国スタンダードリージョンで新しいデータファイルからロードす
るとき、整合性が結果整合性になります。ただし、Amazon S3 ではすべてのリージョンの上書きの整
合性が結果整合性になるため、既存のオブジェクトを新しいデータで上書きする場合、古いデータが
ロードされる可能性があります。ベストプラクティスとしては、決して既存のファイルを新しいデータ
で上書きしないでください。
指名エンドポイントを使用する
米国東部(バージニア北部)リージョンでクラスターを作成し、オブジェクトプレフィックスを使って
ロードファイルを識別する場合、バケットの作成時には米国スタンダードリージョンを指定しないでく
ださい。Amazon S3 では、米国スタンダードリージョンのすべての操作の整合性が結果整合性になり
ます。クラスターが米国東部(バージニア北部)リージョンにある場合、Amazon S3 バケットの作成
時に指名エンドポイントを使うことでデータの整合性を改善できます。Amazon S3 は、米国スタンダー
ドリージョンを指定するリクエストを自動的にバージニア北部または太平洋北西部の施設に送信しま
す。US 東部リージョンでクラスターを作成し、Amazon S3 バケットの作成時に米国スタンダードリー
ジョンを指定する場合、データがクラスターの近くに置かれない可能性があります。指名エンドポイン
トを使い、Amazon S3 バケットの作成時に US 東部リージョンを指定する場合、AWS は可能な限り
データをバージニア北部に送信します。指名エンドポイントを使用した場合もデータのレイテンシーが
短縮されます。
ロードするファイルをマニフェストファイルに指定した場合、COPY コマンドを実行すると、リストに
指定されているファイルの整合性が適用されます。詳細については、「マニフェストファイルを使用す
る (p. 64)」を参照してください。
その他のリージョンには指名エンドポイントを使う必要がありません。
US 東部リージョンに指名エンドポイントを使用するには、Amazon S3 へのアクセスに使用するホスト
名のサブストリングの s3.amazonaws.com を s3-external-1.amazonaws.com に置換します。例
えば、次の文字列を、
http://mybucket.s3.amazonaws.com/somekey.ext
次の文字列で置換します。
http://mybucket.s3-external-1.amazonaws.com/somekey.ext
API Version 2012-12-01
64
Amazon Redshift データベース開発者ガイド
Amazon S3 からデータをロードする
指名エンドポイントは Amazon S3 API または CLI でのみ使用できます。Amazon S3 コンソールで指
名エンドポイントを使用することはできません。
Amazon S3 リージョンに関する詳細は、『Amazon Simple Storage Service 開発者ガイド』の「Buckets
and Regions」を参照してください。
暗号化されたデータを Amazon S3 にアップロードする
クライアント側の暗号化を使って Amazon S3 バケットにデータをアップロードし、その後、COPY コ
マンド(ENCRYPTED オプション)とプライベート暗号化キーを使ってデータをロードすることがで
きます。
エンベロープ暗号化を使い、データを暗号化します。エンベロープ暗号化を使うと、アプリケーション
ですべての暗号化が排他的に処理されます。プライベート暗号化キーと暗号化されていないデータは
AWS には送信されません。したがって、暗号化キーを安全に管理することが重要です。暗号化キーを
なくした場合、データを復号化できません。AWS から暗号化キーを復元することはできません。エン
ベロープ暗号化では、非同期キーのようにキーを安全に管理しながら、高速の同期暗号化のパフォーマ
ンスを実現します。Amazon S3 暗号化クライアントはデータを暗号化するためにワンタイム使用の同
期キー(エンベロープ同期キー)を生成します。その後、そのキーはマスターキーにより暗号化され、
Amazon S3 のデータとともに保存されます。Amazon Redshift がロード時にデータにアクセスすると
き、暗号化された同期キーが取得され、本物のキーで復号化され、その後、データが復号化されます。
以上は、暗号化されたファイルを Amazon S3 にアップロードするためのステップです。
1.
2.
3.
4.
5.
ワンタイム使用のエンベロープ同期キーを生成します。
このエンベロープキーを使い、ファイルデータを暗号化します。
マスターのパブリックキーまたは同期キーを使い、そのエンベロープキーを暗号化します。
この暗号化されたエンベロープキーを暗号化されたファイルとともに保存します。
マスターキーの説明をエンベロープキーとともに保存し、エンベロープキーの暗号化に使用される
キーを識別します。
クライアント暗号化を構成するとき、以下の指針
• 同期暗号化メカニズムを使用する
• 256 ビットの AES 同期キーを AWS S3 暗号化クライアントに提供する
• オブジェクトメタデータのストレージモードを使用する
暗号化されたファイルを Amazon S3 にアップロードする方法については、「Using Client-Side
Encryption」を参照してください。
COPY コマンドを使い、暗号化されたファイルを Amazon Redshift テーブルにロードするステップに
ついては、「暗号化されたデータファイルを Amazon S3 からロードする (p. 70)」を参照してくださ
い。
必要なファイルがバケットにあることを確認する
Amazon S3 バケットにファイルをアップロードした後に、バケットの内容を一覧表示し、必要なすべ
てのファイルが揃っており、不必要なファイルがないことを確認します。例えば、バケット mybucket
に「venue.txt.back」という名前のファイルがある場合、そのファイルは、おそらくは意図しなく
ても、次のコマンドによりロードされます。
copy venue from 's3://mybucket/venue' … ;
ロードするファイルを厳密に制御したいのであれば、マニフェストファイルを使用し、データファイル
をリストに明示的に指定します。マニフェストファイルの使用に関する詳細は、COPY コマンドの
API Version 2012-12-01
65
Amazon Redshift データベース開発者ガイド
Amazon S3 からデータをロードする
MANIFEST file (p. 190) オプションと COPY 例の マニフェストを使用し、データファイルを指定す
る (p. 200) を参照してください。
バケットのコンテンツの一覧表示に関する詳細は、『Amazon S3 開発者ガイド』の「Listing Object
Keys」を参照してください。
COPY コマンドを使用し、Amazon S3 からロードする
Topics
• マニフェストを使用し、データファイルを指定する (p. 68)
• Amazon S3 から GZIP または LZOP 圧縮データファイルをロードする (p. 68)
• Amazon S3 から固定幅データをロードする (p. 68)
• Amazon S3 からマルチバイトをロードする (p. 69)
• 暗号化されたデータファイルを Amazon S3 からロードする (p. 70)
COPY (p. 187) コマンドを使い、Amazon S3 のデータファイルからテーブルを並列でロードします。
Amazon S3 オブジェクトプレフィックスまたはマニフェストファイルを利用し、ロードするファイル
を指定できます。
プレフィックスを使ってロードするファイルを指定するための構文は次のようになります。
copy <table_name> from 's3://<bucket_name>/<object_prefix>'
credentials 'aws_access_key_id=<access-key-id>;aws_secret_access_key=<secretaccess-key>'
[<options>];
マニフェストファイルは、ロードするデータファイルのリストを指定する JSON 形式のファイルです。
マニフェストファイルを使ってロードするファイルを指定するための構文は次のようになります。
copy <table_name> from 's3://<bucket_name>/<manifest_file>'
credentials 'aws_access_key_id=<access-key-id>;aws_secret_access_key=<secretaccess-key>'
[<options>]
manifest;
Note
aws_access_credentials 文字列には改行やスペースを含めないでください。
ロードするテーブルはデータベースに存在している必要があります。テーブルの作成に関する詳細は、
SQL リファレンスの「CREATE TABLE (p. 211)」を参照してください。
<access-key-id> および <secret-access-key> の値は、Amazon S3 オブジェクトへのアクセス
に必要な AWS 認証情報です。この認証情報は、ロードされる Amazon S3 オブジェクトを GET およ
び LIST する権限を持つ AWS アカウントユーザーまたは IAM ユーザーに対応する必要があります。
Amazon S3 IAM ユーザーに関する詳細は、『Amazon Simple Storage Service 開発者ガイド』の「Access
Control」を参照してください。
一時的セキュリティ認証情報を使い、ロードデータへのユーザーアクセスを制限できます。一時的セ
キュリティ認証情報はセキュリティを強化します。使用期限が短く、期限が切れた後は再利用できない
ためです。このような一時的セキュリティ認証情報を与えられたユーザーは、その認証情報の有効期限
API Version 2012-12-01
66
Amazon Redshift データベース開発者ガイド
Amazon S3 からデータをロードする
の間だけリソースにアクセスできます。詳細については、「一時的セキュリティ認証情報 (p. 197)」を
参照してください。一時的アクセス認証情報を使ってデータをロードするには、次の構文を使います。
copy <table_name> from 's3://<bucket_name>/<object_prefix>'
credentials 'aws_access_key_id=<temporary-access-key-id>;aws_secret_ac
cess_key=<temporary-secret-access-key>;token=<temporary-token>'
[<options>];
Important
一時的セキュリティ認証情報は、COPY ステートメントの期間全体で有効にする必要がありま
す。一時的セキュリティ認証情報の期限がロードプロセス中に切れた場合、COPY は失敗し、
処理はロールバックされます。例えば、一時的セキュリティ認証情報の期限が 15 分後に切れ
るときに COPY に 1 時間かかる場合、COPY は完了前に失敗します。
テーブルを実際にロードせずにデータを検証する場合、COPY (p. 187) コマンドに NOLOAD オプション
を指定します。
次の例では、「venue.txt」という名前のファイルのパイプ区切りデータの最初の数行を示していま
す。
1|Toyota Park|Bridgeview|IL|0
2|Columbus Crew Stadium|Columbus|OH|0
3|RFK Stadium|Washington|DC|0
Amazon S3 にファイルをアップロードする前に、ファイルを複数のファイルに分割します。分割され
たファイルは COPY コマンドで並列処理を使ってロードされます。詳細については、「データを複数
のファイルに分割する (p. 62)」を参照してください。
例えば、venue.txt ファイルを次のように 4 つのファイルに分割します。
venue.txt.1
venue.txt.2
venue.txt.3
venue.txt.4
次の COPY コマンドは Amazon S3 バケット mybucket でプレフィックスが「venue」になっている
データファイルのパイプ区切りデータを使って VENUE テーブルをロードします。
Note
次の例の Amazon S3 バケット mybucket は存在しません。既存の Amazon S3 バケットの実
データを使うサンプルの COPY コマンドについては、「 ステップ 4: サンプルデータをロード
する (p. 15)」を参照してください。
copy venue from 's3://mybucket/venue'
credentials 'aws_access_key_id=<access-key-id>;aws_secret_access_key=<secretaccess-key>'
delimiter '|';
「venue」というキープレフィックスのある Amazon S3 オブジェクトが存在しない場合、ロードは失
敗します。
API Version 2012-12-01
67
Amazon Redshift データベース開発者ガイド
Amazon S3 からデータをロードする
マニフェストを使用し、データファイルを指定する
COPY コマンドにより必要なすべてのファイルのみがロードされるように、データロードにマニフェス
トを使用できます。この場合、COPY コマンドにオブジェクトパスを指定する代わりに、ロードする
ファイルのリストを JSON 形式のテキストファイルに明示的に指定します。マニフェストを使用し、
異なるバケットからファイルをロードしたり、同じプレフィックスを共有しないファイルをロードした
りできます。次の例では、バケットが異なり、ファイル名が日付スタンプで始まるファイルをロードす
る JSON を示しています。
{
"entries": [
{"url":"s3://mybucket-alpha/2013-10-04-custdata", "mandatory":true},
{"url":"s3://mybucket-alpha/2013-10-05-custdata", "mandatory":true},
{"url":"s3://mybucket-beta/2013-10-04-custdata", "mandatory":true},
{"url":"s3://mybucket-beta/2013-10-05-custdata", "mandatory":true}
]
}
ファイルが見つからない場合に、オプションの mandatory フラグによって COPY コマンドがエラー
を返すかどうかを指定します。mandatory のデフォルトは false です。
次の例では、前の例にあった「cust.manifest」という名前のマニフェストで COPY コマンドを実行
しています。
copy customer
from 's3://mybucket/cust.manifest'
credentials 'aws_access_key_id=<access-key-id>;aws_secret_access_key=<secretaccess-key>'
manifest;
詳細については、「マニフェストを使用し、データファイルを指定する (p. 200)」を参照してください。
Amazon S3 バケットが米国スタンダードリージョンにある場合、マニフェストを使用することで結果
整合性の問題を回避できます。詳細については、「データの整合性の管理 (p. 63)」を参照してくださ
い。
Amazon S3 から GZIP または LZOP 圧縮データファイルをロードする
GZIP を使って圧縮されたデータファイルをロードするには、GZIP オプションを含めます。LZOP を
使って圧縮されたデータファイルをロードするには、LZOP オプションを含めます。
copy customer from 's3://mybucket/customer.lzo'
credentials 'aws_access_key_id=<access-key-id>;aws_secret_access_key=<secretaccess-key>'
delimiter '|' lzop;
GZIP オプションまたは LZOP オプションを使用する場合、ロードされるすべてのデータファイルが
GZIP または LZOP 圧縮になります。COPY では、LZOP --filter オプションを使って圧縮されたファイ
ルはサポートされません。
Amazon S3 から固定幅データをロードする
固定幅データファイルでは、データの各列の長さが統一されています。固定幅データファイルの各フィー
ルドでは、長さと位置がまったく同じです。固定幅データファイルの文字データ(CHAR と VARCHAR)
については、幅を統一するために、プレースホルダーとして先行または後続スペースを含める必要があ
API Version 2012-12-01
68
Amazon Redshift データベース開発者ガイド
Amazon S3 からデータをロードする
ります。整数については、プレースホルダーとして先行ゼロを含める必要があります。固定幅データ
ファイルには列を分割する区切り文字がありません。
固定幅データファイルを既存のテーブルにロードするには、COPY コマンドで FIXEDWIDTH パラメー
タを使用します。データを正しくロードするには、テーブル仕様が fixedwidth_spec の値に一致する必
要があります。
ファイルからテーブルに固定幅データをロードするには、次のコマンドを発行します。
copy table_name from 's3://mybucket/prefix'
credentials 'aws_access_key_id=<access-key-id>;aws_secret_access_key=<secretaccess-key>'
fixedwidth 'fixedwidth_spec';
fixedwidth_spec パラメータは、各列の ID と各列の幅がコロンで区切られて指定されている文字列で
す。column:width ペアはカンマで区切られています。ID には数字、文字、またはその 2 つの組み合
わせを自由に選択できます。ID とテーブル自体の間には何の関係もありません。そのため、仕様にテー
ブルと同じ順序で列を含める必要があります。
次の 2 つの例では同じ仕様を示していますが、最初の例では数字の ID を使用し、2 つ目の例では文字
列の ID を使用しています。
'0:3,1:25,2:12,3:2,4:6'
'venueid:3,venuename:25,venuecity:12,venuestate:2,venueseats:6'
次の例では、上記の仕様を利用して VENUE テーブルにロードするサンプルの固定幅データを示してい
ます。
1
2
3
4
5
Toyota Park
Bridgeview
Columbus Crew Stadium
Columbus
RFK Stadium
Washington
CommunityAmerica BallparkKansas City
Gillette Stadium
Foxborough
IL0
OH0
DC0
KS0
MA68756
次の COPY コマンドではこのデータセットが VENUE テーブルにロードされます。
copy venue
from 's3://mybucket/data/venue_fw.txt'
credentials 'aws_access_key_id=<access-key-id>;aws_secret_access_key=<secretaccess-key>'
fixedwidth 'venueid:3,venuename:25,venuecity:12,venuestate:2,venueseats:6';
Amazon S3 からマルチバイトをロードする
データに ASCII 以外のマルチバイト文字(漢字やキリル文字)が含まれる場合、データを VARCHAR
列にロードする必要があります。VARCHAR データ型は 4 バイトの UTF-8 文字をサポートしますが、
CHAR データ型はシングルバイトの ASCII 文字のみを受け取ります。5 バイト以上の文字を Amazon
Redshift テーブルにロードすることはできません。CHAR と VARCHAR に関する詳細は、「データ
型 (p. 127)」を参照してください。
入力ファイルで使用されるエンコーディングを確認するには、Linux file コマンドを使用します:
API Version 2012-12-01
69
Amazon Redshift データベース開発者ガイド
Amazon S3 からデータをロードする
$ file ordersdata.txt
ordersdata.txt: ASCII English text
$ file uni_ordersdata.dat
uni_ordersdata.dat: UTF-8 Unicode text
暗号化されたデータファイルを Amazon S3 からロードする
COPY コマンドを使い、クライアント側の暗号化を使用して Amazon S3 にアップロードされたデータ
ファイルをロードすることができます。
ファイルは base64 でエンコーディングされた AES 256 ビットキーで暗号化されています。暗号化さ
れたファイルをロードするとき、そのキー値を入力する必要があります。「暗号化されたデータを
Amazon S3 にアップロードする (p. 65)」を参照してください。
暗号化されたデータファイルをロードするには、マスターキー値を認証情報文字列に追加し、
ENCRYPTED オプションを含めます。
copy customer from 's3://mybucket/encrypted/customer'
credentials 'aws_access_key_id=<access-key-id>;aws_secret_access_key=<secretaccess-key>;master_symmetric_key=<master_key>'
delimiter '|' encrypted;
GZIP 圧縮された暗号化データファイルをロードするには、マスターキー値とともに GZIP オプション
を含め、ENCRYPTED オプションを含めます。
copy customer from 's3://mybucket/encrypted/customer'
credentials 'aws_access_key_id=<access-key-id>;aws_secret_access_key=<secretaccess-key>;master_symmetric_key=<master_key>'
delimiter '|' encrypted gzip;
データが正しくロードされたことを確認する
ロード操作が完了したら、STL_LOAD_COMMITS (p. 489) システムテーブルにクエリし、ファイルが予
定どおりロードされたことを確認します。ロードに問題が発生した場合にトランザクション全体をロー
ルバックできるように、COPY コマンドとロード検証は同じトランザクションで実行する必要がありま
す。
Important
US 東部リージョンを含む米国スタンダードリージョンでは、すべての Amazon S3 リクエスト
の整合性が結果整合性になります。そのため、ファイルを Amazon S3 にアップロードした時
間とそれを Amazon Redshift にロードできるようになる時間との間にタイムラグが生じる可能
性があります。データ整合性の詳細については、「データの整合性の管理 (p. 63)」を参照して
ください。
次のクエリでは、TICKIT データベースのテーブルをロードするためのエントリが返されます。
select query, trim(filename) as filename, curtime, status
from stl_load_commits
where filename like '%tickit%' order by query;
query |
btrim
|
curtime
| status
-------+---------------------------+----------------------------+-------22475 | tickit/allusers_pipe.txt | 2013-02-08 20:58:23.274186 |
1
API Version 2012-12-01
70
Amazon Redshift データベース開発者ガイド
Amazon DynamoDB からロードする
22478 |
22480 |
22482 |
22485 |
22487 |
22489 |
(6 rows)
tickit/venue_pipe.txt
tickit/category_pipe.txt
tickit/date2008_pipe.txt
tickit/allevents_pipe.txt
tickit/listings_pipe.txt
tickit/sales_tab.txt
|
|
|
|
|
|
2013-02-08
2013-02-08
2013-02-08
2013-02-08
2013-02-08
2013-02-08
20:58:25.070604
20:58:27.333472
20:58:28.608305
20:58:29.99489
20:58:37.632939
20:58:37.632939
|
|
|
|
|
|
1
1
1
1
1
1
Amazon DynamoDB テーブルからデータをロードす
る
COPY コマンドを使い、1 つの Amazon DynamoDB テーブルからデータをテーブルにロードすること
ができます。
COPY コマンドは Amazon Redshift の超並列処理(MPP)アーキテクチャを活用し、Amazon DynamoDB
テーブルからデータを並列でロードします。Amazon Redshift テーブルに分散キーを設定すれば、並列
処理を最大限に活用できます。詳細については、「データ分散方法の選択 (p. 43)」を参照してくださ
い。
Important
COPY コマンドで Amazon DynamoDB テーブルからデータを読み込むとき、結果として起こ
るデータ転送はそのテーブルにプロビジョニングされるスループットの一部になります。
プロビジョニングされた読み取りスループットの過度の消費を避けるために、本稼働環境にある Amazon
DynamoDB テーブルからはデータをロードしないことをお勧めします。本稼働テーブルからデータを
ロードする場合、プロビジョニングされ、使用されていないスループットの平均パーセントよりかなり
低く READRATIO オプションを設定することをお勧めします。READRATIO を低く設定すると、スロッ
トルの問題が最小限に抑えられます。Amazon DynamoDB テーブルにプロビジョニングされるスルー
プット全体を使用するには、READRATIO を 100 に設定します。
COPY コマンドは次のルールを使用し、Amazon DynamoDB テーブルから取得された項目の属性名と
既存の Amazon Redshift テーブルの列名を照合します。
• Amazon Redshift テーブルの列と Amazon DynamoDB 項目の属性が大文字と小文字を区別せずに照
合されます。DynamoDB テーブルの項目に、Price と PRICE のように、大文字/小文字だけが異なる
複数の属性が含まれる場合、COPY コマンドは失敗します。
• Amazon DynamoDB テーブルの属性と一致しない Amazon Redshift テーブル列は、COPY (p. 187) コ
マンドの EMPTYASNULL オプションで指定された値に基づき、NULL または空としてロードされま
す。
• Amazon Redshift テーブルの列に一致しない Amazon DynamoDB 属性は破棄されます。属性は照合
の前に読み込まれます。そのため、破棄された属性もそのテーブルにプロビジョニングされたスルー
プットの一部を消費します。
• データ型がスカラー STRING と NUMBER の Amazon DynamoDB 属性のみがサポートされます。
Amazon DynamoDB BINARY および SET データ型はサポートされません。COPY コマンドがサポー
トされないデータ型を持つ属性をロードしようとすると失敗します。属性が Amazon Redshift テー
ブル列に一致しない場合、COPY はロードを試行せず、エラーを発行しません。
COPY コマンドは次の構文を使用し、Amazon DynamoDB テーブルからデータをロードします。
copy <redshift_tablename> from 'dynamodb://<dynamodb_table_name>'
credentials 'aws_access_key_id=<access-key-id>;aws_secret_access_key=<secret-
API Version 2012-12-01
71
Amazon Redshift データベース開発者ガイド
Amazon DynamoDB からロードする
access-key>'
readratio '<integer>' [options ];
<your-access-key-id> と <your-secret-access-key> の値は、Amazon DynamoDB テーブルにアクセス
するために必要な AWS 認証情報です。これらの認証情報が IAM ユーザーに一致する場合、その IAM
ユーザーにはロードされる Amazon DynamoDB テーブルに SCAN と DESCRIBE を実行する権限を与
える必要があります。
一時的セキュリティ認証情報を使い、データにアクセスするユーザーを制限できます。一時的セキュリ
ティ認証情報はセキュリティを強化します。使用期限が短く、期限が切れた後は再利用できないためで
す。このような一時的セキュリティ認証情報を与えられたユーザーは、その認証情報の有効期限の間だ
けリソースにアクセスできます。詳細については、「一時的セキュリティ認証情報 (p. 197)」を参照し
てください。一時的アクセス認証情報を使ってデータをロードするには、次の構文を使います。
copy <redshift_tablename> from 'dynamodb://<dynamodb_table_name>'
credentials 'aws_access_key_id=<temporary-access-key-id>;aws_secret_ac
cess_key=<temporary-secret-access-key>;token=<temporary-token>'
[<options>];
Important
一時的セキュリティ認証情報は、COPY ステートメントの期間全体で有効にする必要がありま
す。一時的セキュリティ認証情報の期限がロードプロセス中に切れた場合、COPY は失敗し、
処理はロールバックされます。例えば、一時的セキュリティ認証情報の期限が 15 分後に切れ
るときに COPY に 1 時間かかる場合、COPY は完了前に失敗します。
テーブルを実際にロードせずにデータを検証する場合、COPY (p. 187) コマンドに NOLOAD オプション
を指定します。
次の例では、「my-favorite-movies-table」という名前の Amazon DynamoDB テーブルから
FAVORITEMOVIES テーブルにデータをロードします。読み取りアクティビティでは、プロビジョニ
ングされたスループットの最大 50% が消費されます。
copy favoritemovies from 'dynamodb://my-favorite-movies-table'
credentials 'aws_access_key_id=<access-key-id>;aws_secret_access_key=<secretaccess-key>'
readratio 50;
スループットを最大化するために、COPY コマンドはクラスターのコンピューティングノード全体で並
列で Amazon DynamoDB テーブルからデータをロードします。
自動圧縮のあるプロビジョニングされたスループット
デフォルトでは、圧縮エンコーディングなしで空のターゲットテーブルを指定したとき、COPY コマン
ドは自動圧縮を適用します。自動圧縮分析は、最初に Amazon DynamoDB テーブルから大量の行をサ
ンプリングします。サンプルサイズは、COMPROWS パラメータの値に基づきます。デフォルトはス
ライスごとに 100,000 行です。
サンプリングの後、サンプル行は破棄され、テーブル全体がロードされます。結果として、多くの行が
2 回読み取られます。自動圧縮の仕組みについては、「自動圧縮ありでテーブルをロードする (p. 73)」
を参照してください。
API Version 2012-12-01
72
Amazon Redshift データベース開発者ガイド
入力データを検証する
Important
COPY コマンドで Amazon DynamoDB テーブルからサンプリングで使われる行を含むデータ
を読み取ると、結果として起こるデータ転送はそのテーブルにプロビジョニングされるスルー
プットの一部になります。
Amazon DynamoDB からマルチバイトのデータをロードする
データに ASCII 以外のマルチバイト文字(漢字やキリル文字)が含まれる場合、データを VARCHAR
列にロードする必要があります。VARCHAR データ型は 4 バイトの UTF-8 文字をサポートしますが、
CHAR データ型はシングルバイトの ASCII 文字のみを受け取ります。5 バイト以上の文字を Amazon
Redshift テーブルにロードすることはできません。CHAR と VARCHAR に関する詳細は、「データ
型 (p. 127)」を参照してください。
入力データを検証する
実際にデータをロードする前に Amazon S3 入力ファイルまたは Amazon DynamoDB テーブルのデー
タを検証するには、COPY (p. 187) コマンドとともに NOLOAD オプションを使用します。実際にデータ
をロードする際に使用するものと同じ COPY コマンドおよびオプションとともに NOLOAD を使用し
ます。NOLOAD はデータベースにロードすることなくすべてのデータの完全性をチェックします。
NOLOAD オプションは、データのロードを試行した場合に発生する可能性のあるエラーがあればそれ
を表示します。
例えば、入力ファイルに間違った Amazon S3 パスを指定した場合、Amazon Redshift は次のエラーを
表示します:
ERROR: No such file or directory
DETAIL:
----------------------------------------------Amazon Redshift error: The specified key does not exist
code:
2
context:
S3 key being read :
location: step_scan.cpp:1883
process:
xenmaster [pid=22199]
-----------------------------------------------
エラーメッセージをトラブルシューティングする方法については、「ロードエラー参照 (p. 79)」を参
照してください。
自動圧縮ありでテーブルをロードする
Topics
• 自動圧縮の仕組み (p. 74)
• 自動圧縮の例 (p. 74)
データの自己評価に基づき、テーブルの列に圧縮エンコーディングを手動で適用できます。または、
COPY コマンドを使用し、分析し、自動的に圧縮を適用できます。COPY コマンドを使用して自動圧
縮を適用することを強くお勧めします。
新しいテーブルを作成し、ロードするときに自動圧縮を利用できます。COPY コマンドは圧縮分析を実
行します。また、すでに入力されているテーブルに ANALYZE COMPRESSION (p. 181) コマンドを実行
すれば、データをロードしたり、テーブルの圧縮を変更したりすることなく圧縮分析を実行できます。
例えば、既存の DDL を維持しながら、将来の利用のためにテーブルの圧縮を分析するときに ANALYZE
COMPRESSION コマンドを実行できます。
API Version 2012-12-01
73
Amazon Redshift データベース開発者ガイド
自動圧縮
自動圧縮の仕組み
COPY コマンドは、デフォルトでは、空のターゲットテーブルで COPY コマンドを実行し、すべての
テーブル列で RAW エンコーディングかエンコーディングなしが設定されている場合に、自動圧縮を適
用します。
現在の圧縮エンコーディングに関係なく、空のテーブルに自動圧縮を適用するには、COMPUPDATE
オプションを ON に設定して COPY コマンドを実行します。自動圧縮を無効にするには、COMPUPDATE
オプションを OFF に設定して COPY コマンドを実行します。
すでにデータが含まれているテーブルには自動圧縮を適用できません。
Note
自動圧縮分析を実行するには、サンプリングを可能にするために十分な行(少なくともスライ
スごとに 100,000 行)がロードデータに含まれている必要があります。
自動圧縮では、ロード処理の一部として次の操作がバックグラウンドで実行されます。
1. 行の初回サンプルが入力ファイルからロードされます。サンプルサイズは COMPROWS パラメータ
の値に基づきます。デフォルトは 100,000 です。
2. 圧縮オプションは列ごとに選択されます。
3. サンプル行がテーブルから削除されます。
4. 意味のあるサンプルを提供するために十分なデータがロードされている場合、選択した圧縮エンコー
ディングでテーブルが再作成されます。
5. 入力ファイル全体がロードされ、新しいエンコーディングで圧縮されます。
COPY コマンドを実行すると、テーブルが完全にロードされ、圧縮され、使用する準備ができます。そ
の後、追加でデータをロードする場合、追加された行は既存のエンコーディングに基づいて圧縮されま
す。
圧縮分析のみを実行する場合、ANALYZE COMPRESSION を実行します。完全な COPY を実行するよ
りも効率的です。その後、結果を評価し、自動圧縮を使用するのか、またはテーブルを手動で再作成す
るのかを決定できます。
自動圧縮は COPY コマンドでのみサポートされます。代わりに、テーブルを作成するときに圧縮エン
コーディングを手動で適用できます。手動圧縮エンコーディングに関する詳細は、「列圧縮タイプの選
択 (p. 33)」を参照してください。
自動圧縮の例
この例では、TICKIT データベースに「BIGLIST」という名前の LISTING テーブルのコピーが含まれて
おり、約 300 万行をロードするときにこのテーブルに自動圧縮を適用するものと仮定します。
テーブルをロードし、自動的に圧縮するには、次の操作を実行します。
1. テーブルが空であることを確認します。空のテーブルにのみ自動圧縮を適用できます:
truncate biglist;
2. 単一の COPY コマンドでテーブルをロードします。テーブルは空であっても、以前のエンコーディ
ングが指定されている可能性があります。Amazon Redshift が圧縮分析を実行するように、
COMPUPDATE パラメータを ON に設定します。
API Version 2012-12-01
74
Amazon Redshift データベース開発者ガイド
細長いテーブルのための最適化
copy biglist from 's3://mybucket/biglist.txt'
credentials 'aws_access_key_id=<access-key-id>;aws_secret_access_key=<secretaccess-key>'
delimiter '|' COMPUPDATE ON;
COMPROWS オプションを指定していないため、デフォルトであり、推奨のサンプルサイズである
100,000 行(スライスごとに)が使用されます。
3. BIGLIST テーブルの新しいスキーマを見て、自動的に選択されたエンコーディングスキームを確認
します。
select "column", type, encoding
from pg_table_def where tablename = 'biglist';
Column
|
Type
| Encoding
---------------+-----------------------------+---------listid
| integer
| delta
sellerid
| integer
| delta32k
eventid
| integer
| delta32k
dateid
| smallint
| delta
+numtickets
| smallint
| delta
priceperticket | numeric(8,2)
| delta32k
totalprice
| numeric(8,2)
| mostly32
listtime
| timestamp without time zone | none
4. 予想どおりの数の行がロードされたことを確認します。
select count(*) from biglist;
count
--------3079952
(1 row)
後に COPY または INSERT ステートメントを使用してこのテーブルに行が追加されるとき、同じ圧縮
エンコーディングが適用されます。
細長いテーブルのストレージの最適化
列の数が非常に少なく、行の数が非常に多いテーブルがある場合、3 つの非表示メタデータ ID 列
(INSERT_XID、DELETE_XID、ROW_ID)がテーブルのディスク領域を過度に消費します。
非表示列の圧縮を最適化するには、可能な限り、1 回の COPY 処理でテーブルをロードします。複数
の別個の COPY コマンドでテーブルをロードする場合、INSERT_XID 列は十分に圧縮されません。複
数の COPY コマンドを使用する場合、バキューム操作を実行する必要があります。ただし、INSERT_XID
の圧縮は改善されません。
デフォルトの列値をロードする
任意で COPY コマンドに列のリストを定義できます。このリストに含まれていないテーブルの列につ
いては、COPY を実行すると、CREATE TABLE コマンドで指定された DEFAULT オプションにより提
供される値か、DEFAULT オプションが指定されていない場合は NULL がロードされます。
API Version 2012-12-01
75
Amazon Redshift データベース開発者ガイド
トラブルシューティング
COPY を実行し、NOT NULL として定義されている列に NULL を割り当てようとすると、COPY コマ
ンドは失敗します。DEFAULT オプションの割り当てに関する詳細は、「CREATE TABLE (p. 211)」を
参照してください。
Amazon S3 のデータファイルからロードするとき、リストの列がデータファイルのフィールドと同じ
順序になっている必要があります。リストに指定された列に該当するフィールドがデータファイルにな
い場合、COPY コマンドは失敗します。
Amazon DynamoDB テーブルからロードするときは、順序は関係ありません。Amazon Redshift テー
ブルの列に一致しない Amazon DynamoDB 属性のフィールドは破棄されます。
COPY コマンドを使って DEFAULT 値をテーブルにロードするとき、次の制限が適用されます。
• IDENTITY (p. 214) 列がリストに含まれる場合、EXPLICIT_IDS オプションも COPY (p. 187) コマンド
に指定する必要があります。指定しない場合、COPY コマンドは失敗します。同様に、IDENTITY 列
をリストから除外し、EXPLICIT_IDS オプションを指定すると、COPY 操作は失敗します。
• 指定の列に対して評価される DEFAULT 式はロードされるすべての行で同じであるため、RANDOM()
関数を使用する DEFAULT 式はすべての行に同じ値を割り当てます。
• CURRENT_DATE または SYSDATE を含む DEFAULT 式は現在の処理のタイムスタンプに設定され
ます。
例えば、「COPY の例 (p. 200)」の「デフォルト値を使用してファイルのデータをロードする」を参照
してください。
データロードのトラブルシューティング
Topics
• S3ServiceException エラー (p. 76)
• データロードをトラブルシューティングするためのシステムテーブル (p. 77)
• マルチバイト文字のロードエラー (p. 78)
• ロードエラー参照 (p. 79)
このセクションでは、データロードエラーの特定と解決に関する情報を提供します。
S3ServiceException エラー
最も一般的な s3ServiceException エラーは不適切にフォーマットされた認証情報文字列、異なるリー
ジョンに存在するクラスターとバケット、不十分な Amazon S3 権限により引き起こされます。
このセクションでは、各種エラーのトラブルシューティング情報を提供します。
認証情報文字列が不適切にフォーマットされた場合、次のエラーメッセージを受け取ります。
ERROR: Invalid credentials. Must be of the format: credentials
'aws_access_key_id=<access-key-id>;aws_secret_access_key=<secret-access-key>
[;token=<temporary-session-token>]'
認証情報文字列にスペースまたは改行が含まれておらず、一重引用符で囲まれていることを確認してく
ださい。
API Version 2012-12-01
76
Amazon Redshift データベース開発者ガイド
トラブルシューティング
バケットが異なるリージョンにある
COPY コマンドに指定された Amazon S3 バケットはクラスターと同じリージョンに存在する必要があ
ります。Amazon S3 バケットとクラスターが異なるリージョンにある場合、次のようなエラーを受け
取ります。
ERROR: S3ServiceException:The bucket you are attempting to access must be ad
dressed using the specified endpoint.
Amazon S3 マネジメントコンソールを使用してバケットを作成するときにリージョンを選択するか、
Amazon S3 API または CLI を使用してバケットを作成するときにエンドポイントを指定することで、
特定のリージョンに Amazon S3 バケットを作成できます。詳細については、「Amazon S3 にファイ
ルをアップロードする (p. 62)」を参照してください。
Amazon S3 リージョンに関する詳細は、『Amazon Simple Storage Service 開発者ガイド』の「Buckets
and Regions」を参照してください。
アクセスが拒否される
認証情報により識別されるユーザーアカウントには、Amazon S3 バケットへの LIST および GET アク
セスが必要です。ユーザーに十分な権限がない場合、次のエラーメッセージを受け取ります。
ERROR: S3ServiceException:Access Denied,Status 403,Error AccessDenied
バケットへのユーザーアクセスの管理については、『Amazon S3 開発者ガイド』の「Access Control」
を参照してください。
データロードをトラブルシューティングするためのシステム
テーブル
次の Amazon Redshift システムテーブルはデータロード問題のトラブルシューティングに役立ちます。
• 特定のロード中に発生したエラーを見つけるには、STL_LOAD_ERRORS (p. 491) にクエリします。
• 特定のファイルのロード時間を参照したり、特定のファイルが読み取られたかどうかを確認するに
は、STL_FILE_SCAN (p. 481) にクエリします。
ロードエラーを検出し、診断するには、次の操作を実行します。
1. ロードエラーに関する詳細を返すビューを作成するか、クエリを定義します。次の例では、
STL_LOAD_ERRORS テーブルが STV_TBL_PERM テーブルと結合し、テーブル ID と実際のテーブ
ル名が照合されます。
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);
2. COPY コマンドの MAXERRORS オプションを十分な大きさの値に設定し、データに関する役に立
つ情報を COPY で返せるようにします。COPY でエラーが発生した場合、エラーメッセージにより
STL_LOAD_ERRORS テーブルで詳細を確認するように指示されます。
3. LOADVIEW ビューにクエリし、エラー詳細を確認します。以下に例を示します。
API Version 2012-12-01
77
Amazon Redshift データベース開発者ガイド
トラブルシューティング
select * from loadview where table_name='venue';
tbl
| table_name | query |
starttime
--------+------------+-------+---------------------------100551 | venue
| 20974 | 2013-01-29 19:05:58.365391
|
input
| line_number | colname | err_code |
reason
+----------------+-------------+-------+----------+--------------------| venue_pipe.txt |
1 |
0 |
1214 | Delimiter not found
4. ビューが返す情報に基づいて、入力ファイルまたはロードスクリプトの問題を修正します。注意す
るべき一般的なロードエラーには次のものがあります。
• テーブルのデータ型と入力データフィールドの値の不一致。
• テーブルの列数と入力データのフィールド数の不一致。
• 引用符の不一致。Amazon Redshift は一重引用符と二重引用符の両方をサポートします。ただし、
引用符は対になっている必要があります。
• 正しくない入力ファイルの日付/時刻形式。
• 入力ファイルの値が範囲外(数値列に関して)。
• 列の値の数がその圧縮エンコーディングの制限を超えている。
マルチバイト文字のロードエラー
CHAR データ型の列はシングルバイト UTF-8 文字のみを最大 127 バイトまで、または 16 進数の 7F ま
で受け取ります。これは ASCII 文字セットでもあります。VARCHAR 列はマルチバイト UTF-8 文字を
最大 4 バイトまで受け取ります。詳細については、「文字型 (p. 136)」を参照してください。
ロードデータの行に列のデータ型として無効な文字が含まれる場合、COPY はエラーを返し、
STL_LOAD_ERRORS システムログテーブルの行にエラー番号 1220 がログ記録されます。ERR_REASON
フィールドには無効な文字のバイトシーケンスが 16 進数で含まれます。
ロードデータの無効な文字を修正する代替策は、ロードプロセス中に無効な文字を置換することです。
無効な UTF-8 文字を置換するには、COPY コマンドに ACCEPTINVCHARS オプション付けて実行し
ます。詳細については、「ACCEPTINVCHARS (p. 193)」を参照してください。
次の例は、COPY で UTF-8 文字の e0 a1 c7a4 を CHAR 列にロードしようとしたときのエラーの理由
を示しています。
Multibyte character not supported for CHAR
(Hint: Try using VARCHAR). Invalid char: e0 a1 c7a4
エラーが VARCHAR データ型に関連する場合、エラー理由にはエラーコードと、無効な UTF-8 16 進
数シーケンスが含まれます。次の例は、COPY で UTF-8 a4 を VARCHAR フィールドにロードしよう
としたときのエラーの理由を示しています。
String contains invalid or unsupported UTF-8 codepoints.
Bad UTF-8 hex sequence: a4 (error 3)
次のテーブルには、VARCHAR ロードエラーの説明と回避策提案を記載しています。これらのエラー
の 1 つが発生した場合、文字を有効な UTF-8 コードシーケンスで置換するか、文字を削除します。
API Version 2012-12-01
78
Amazon Redshift データベース開発者ガイド
トラブルシューティング
エラーコード 説明
1
UTF-8 バイトシーケンスが VARCHAR でサポートされる 4 バイトの上限を超えてい
ます。
2
UTF-8 バイトシーケンスが不完全です。COPY を実行したが、文字列の終わりの前に
あるマルチバイト文字の連続バイトが予想された数ではありませんでした。
3
UTF-8 シングルバイト文字が範囲外です。開始バイトを 254、255、または 128 から
191 までの間の任意の文字(128 と 191 を含む)にすることはできません。
4
バイトシーケンスの後続バイトの値が範囲外です。連続バイトは 128 から 191 まで
(128 と 191 を含む)にする必要があります。
5
UTF-8 文字が代理として予約されています。代理コードポイント(U+D800~U+DFFF)
は無効です。
6
文字が有効な UTF-8 文字ではありません(コードポイント 0xFDD0~0xFDEF)。
7
文字が有効な UTF-8 文字ではありません(コードポイント 0xFFFE および 0xFFFF)。
8
バイトシーケンスが最大 UTF-8 コードポイントを超えています。
9
UTF-8 バイトシーケンスに一致するコードポイントがありません。
ロードエラー参照
ファイルからデータをロードしている間にエラーが発生した場合、STL_LOAD_ERRORS (p. 491) テー
ブルにクエリし、エラーを特定し、考えられる説明を確認します。次のテーブルは、データロード中に
発生する可能性があるすべてのエラーコードの一覧です。
ロードエラーコード
エラーコード 説明
1200
未知の解析エラー。サポートにお問い合わせください。
1201
入力ファイルでフィールド区切り文字が見つかりませんでした。
1202
DDL に定義されているよりも多い列が入力データに含まれていました。
1203
DDL に定義されているよりも少ない列が入力データに含まれていました。
1204
入力データがデータ型で受入可能な範囲を超過していました。
1205
日付形式が無効です。有効な形式については、「 DATEFORMAT と TIMEFORMAT
の文字列 (p. 198)」を参照してください。
1206
タイムスタンプ形式が無効です。有効な形式については、「 DATEFORMAT と
TIMEFORMAT の文字列 (p. 198)」を参照してください。
1207
期待される 0~9 の範囲外の値がデータに含まれています。
1208
FLOAT データ型の形式エラー。
1209
DECIMAL データ型の形式エラー。
1210
BOOLEAN データ型の形式エラー。
1211
入力行にデータがありません。
API Version 2012-12-01
79
Amazon Redshift データベース開発者ガイド
DML による更新
エラーコード 説明
1212
ロードファイルが見つかりませんでした。
1213
NOT NULL として指定されたフィールドにデータが含まれていませんでした。
1214
VARCHAR フィールドエラー。
1215
CHAR フィールドエラー。
1220
文字列に含まれる UTF-8 コードポイントが無効であるか、サポートされていません。
DML コマンドによるテーブルの更新
Amazon Redshift は、テーブルの行の変更に利用できる標準の DML(Data Manipulation Language/デー
タ操作言語)コマンド(INSERT、UPDATE、DELETE)をサポートします。TRUNCATE コマンドを
使用し、高速一括削除を実行することもできます。
Note
大量のデータをロードする場合は COPY (p. 187) コマンドを使用することを強くお勧めします。
個々に INSERT ステートメントを使ってテーブルにデータを入力すると著しく時間がかかる場
合があります。または、データがすでに他の Amazon Redshift データベーステーブルに存在す
る場合、SELECT INTO ... INSERT または CREATE TABLE AS を使用するとパフォーマンス
が改善します。詳細については、「INSERT (p. 248)」または「CREATE TABLE AS (p. 220)」を
参照してください。
テーブルで行を挿入、更新、削除するとき、それが変更前と比較して相当な数になる場合、完了時に
テーブルに ANALYZE および VACUUM コマンドを実行します。アプリケーションの小さな変更の数が
時間とともに累積される場合、定期的に ANALYZE および VACUUM コマンドを実行するように日程を
計画することもできます。詳細については、「テーブルを分析する (p. 83)」および「テーブルのバ
キューム処理 (p. 86)」を参照してください。
新しいデータの更新と挿入
ステージングテーブルを利用し、更新と挿入を組み合わせることで、効率的に新しいデータを既存の
テーブルに追加できます(マージまたはアップサートとも呼ばれています)。
単一のマージコマンドで単一のデータソースのデータを挿入および更新する操作は Amazon Redshift
ではサポートされませんが、データをステージングテーブルにロードし、UPDATE ステートメントお
よび INSERT ステートメントでそのステージングテーブルとターゲットテーブルを結合することで効
率的にマージ操作を実行できます。
ステージングテーブルを利用してアップサート操作を実行するには、次のステップに従います。
1. 新しいデータを入れるステージングテーブルを作成します。
2. ステージングテーブルには、ターゲットテーブルで使用するものと同じ分散キーを指定します。そ
の方法により、2 つのテーブルがコロケーションされます。例えば、ターゲットテーブルで分散キー
としてプライマリキー列を使用する場合、それに対応するプライマリキーをステージングテーブル
の分散キーとして指定します。
3. UPDATE ステートメントおよび INSERT ステートメントでは、プライマリキーの結合に加え、外部
キー列の間に冗長結合述語を追加し、コロケーテッド結合を実現します。ただし、これが機能する
のは、コロケーションに使用する列がアップサート操作の一部として更新されない場合のみです。
例えば、WHERE 句が通常は primaryKey 列で結合するとします。
API Version 2012-12-01
80
Amazon Redshift データベース開発者ガイド
ディープコピーを実行する
WHERE target.primaryKey = staging.primaryKey
次の例で示すように、分散キーの結合にも冗長結合を追加します。
WHERE target.primaryKey = staging.primaryKey AND target.distKey = staging.dis
tKey
4. ターゲットテーブルがタイムスタンプでソートされ、更新が特定のしきい値よりも古くない場合、
述語(target.timestamp > threshold)を追加し、ターゲットテーブルの範囲限定スキャンを活用しま
す。
次の例はマージ操作を図示したものです。TARGET が更新するテーブルであり、STAGING がマージす
るデータを含むテーブルであると仮定します。両方のテーブルの分散キーの冗長結合述語(AND
target.distKey = s.distKey)に注意してください。
最初のステートメントにより、TARGET テーブルと STAGING テーブルで一致するすべての行に関し
て、TARGET テーブルの既存レコードが STAGING テーブルからの新しい値で更新されます。
UPDATE target SET col1 = s.col1, col2 = s.col2
FROM staging s
WHERE target.primaryKey = s.primaryKey AND target.distKey = s.distKey;
次のステートメントにより、TARGET テーブルにまだ存在しない新しい行が STAGING テーブルから
挿入されます。
INSERT INTO target
SELECT s.* FROM staging s LEFT JOIN target t
ON s.primaryKey = t.primaryKey AND s.distKey = t.distKey
WHERE t.primaryKey IS NULL;
ディープコピーを実行する
ディープコピーでは、テーブルを自動的にソートする一括挿入を利用し、テーブルを再作成し、データ
を入力します。テーブルにソートされていない大規模なリージョンがある場合、ディープコピーの方が
バキューム処理より高速です。欠点は、ディープコピー操作中、同時更新を実行できないことです。バ
キュームでは実行できます。
4 つの方法の 1 つを選択し、元のテーブルのコピーを作成できます:
• 元のテーブル DDL を使用します。
CREATE TABLE DDL が利用できる場合、これが最良の方法になります。
• CREATE TABLE AS(CTAS)を使用します。
元の DDL が利用できない場合、CREATE TABLE AS を使用して現在のテーブルのコピーを作成しま
す。次に、そのコピーの名前を変更します。ただし、新しいテーブルは親テーブルのエンコーディン
グ、分散キー、ソートキー、Not Null、プライマリキー、外部キーの属性を継承しません。元の DDL
が利用できず、テーブル属性を維持する必要がない場合、これが最速の方法になります。
• CREATE TABLE LIKE を使用します。
元の DDL が利用できない場合、CREATE TABLE LIKE を使用してターゲットテーブルを再作成しま
す。ただし、新しいテーブルは親テーブルのプライマリキーと外部キーの属性を継承しません。新し
API Version 2012-12-01
81
Amazon Redshift データベース開発者ガイド
ディープコピーを実行する
いテーブルは親テーブルのエンコーディング、分散キー、ソートキー、Not Null 属性を継承しませ
ん。この方法は挿入ステートメントを 1 つしか使わないため、一時テーブルを作成し、元のテーブル
のデータを削除する次の方法よりも速くなります。
• 一時テーブルを作成し、元のテーブルの全データを削除します。
親テーブルのプライマリキーおよび外部キーの属性を維持する場合、CTAS を使用して一時テーブル
を作成し、元のテーブルの全データを削除し、一時テーブルからのデータを入力します。この方法
は、2 つの挿入ステートメントを必要とするため、CREATE TABLE LIKE よりも遅くなります。
元のテーブル DDL を使用してディープコピーを実行するには、次のように実行します。
1. 元の CREATE TABLE DDL を使い、テーブルのコピーを作成します。
2. INSERT INTO … SELECT ステートメントを使い、元のテーブルのデータをコピーに入力します。
3. 元のテーブルを削除(Drop)します。
4. ALTER TABLE ステートメントを使用し、コピーの名前を元のテーブル名に変更します。
次の例では、「SALESCOPY」という名前の SALES の複製を利用し、SALES テーブルにディープコ
ピーが実行されます。
create table salescopy ( … );
insert into salescopy (select * from sales);
drop table sales;
alter table salescopy rename to sales;
CREATE TABLE AS(CTAS)を使用し、ディープコピーを実行するには、次のように実行します。
1. CREATE TABLE AS を使用して元のテーブルのコピーを作成し、ターゲットテーブルから行を選択
します。
2. 元のテーブルを削除(Drop)します。
3. ALTER TABLE ステートメントを使用し、新しいテーブルの名前を元のテーブル名に変更します。
次の例では、CREATE TABLE AS を使用して SALES テーブルにディープコピーを実行します。
create table as salesas (select * from sales);
drop table sales;
alter table salesas rename to sales;
CREATE TABLE LIKE を使用してディープコピーを実行するには、次のように実行します。
1. CREATE TABLE LIKE を使用して新しいテーブルを作成します。
2. INSERT INTO … SELECT ステートメントを使用し、現在のテーブルから新しいテーブルに行をコ
ピーします。
3. 現在のテーブルを削除(Drop)します。
4. ALTER TABLE ステートメントを使用し、新しいテーブルの名前を元のテーブル名に変更します。
次の例では、CREATE TABLE LIKE を使用して SALES テーブルにディープコピーを実行します。
create table likesales (like sales);
insert into likesales (select * from sales);
drop table sales;
alter table likesales rename to sales;
API Version 2012-12-01
82
Amazon Redshift データベース開発者ガイド
テーブルを分析する
一時テーブルを作成し、元のテーブルの全データを削除する方法でディープコピーを実行するには、次
のように実行します。
1. CREATE TABLE AS を使用し、元のテーブルの行を使用して一時テーブルを作成します。
2. 現在のテーブルの全データを削除します。
3. INSERT INTO … SELECT ステートメントを使用し、一時テーブルから元のテーブルに行をコピー
します。
4. 一時テーブルを削除(Drop)します。
次の例では、一時テーブルを作成し、元のテーブルの全データを削除することによって、SALES テー
ブルにディープコピーが実行されます。
create temp table salestemp as select * from sales;
truncate sales;
insert into sales (select * from salestemp);
drop table tempsales;
テーブルを分析する
Topics
• ANALYZE コマンド履歴 (p. 85)
• 新しいテーブルの自動分析 (p. 85)
クエリプランナーで最適な計画の構築と選択に使用される統計メタデータを定期的に更新する必要があ
ります。それを行うには、テーブルを分析します。
ANALYZE (p. 180) コマンドを明示的に実行することで、テーブルを分析できます。COPY コマンドで
データをロードするとき、STATUPDATE オプションを ON に設定し、分析を自動的に実行できます。
デフォルトでは、COPY コマンドは空のテーブルにデータをロードした後に分析を実行します。
STATUPDATE を ON に設定すれば、テーブルが空であるかどうかに関係なく、分析を強制できます。
STATUPDATE に OFF を指定した場合、分析は実行されません。
テーブルの所有者とスーパーユーザーのみが ANALYZE コマンドまたは STATUPDATE を ON に設定
した COPY コマンドを実行できます。
データの初回ロード後に分析されなかった新しいテーブルにクエリを実行する場合、警告メッセージが
表示されます。ただし、後続の更新またはロード後にテーブルにクエリを実行した場合、警告は発生し
ません。分析されていないテーブルを含むクエリに EXPLAIN コマンドを実行すると、同じ動作が発生
します。
空ではないテーブルにデータを追加し、テーブルのサイズが大幅に変わった場合、ANALYZE コマンド
を実行するか、STATUPDATE オプションを ON に設定して COPY コマンドを実行することで統計を
更新することをお勧めします。
非効率なデータストレージまたはデータの統計プロファイルの大幅な変更の結果としてパフォーマンス
が低下した場合、分析を実行し、統計を更新すれば問題が解消されるかどうかを確認します。
統計を構築または更新するには、次に対して ANALYZE (p. 180) コマンドを実行します。
• 現在のデータベース全体
• 1 つのテーブル
• 1 つのテーブルの 1 つまたは複数の特定の列
API Version 2012-12-01
83
Amazon Redshift データベース開発者ガイド
テーブルを分析する
ANALYZE コマンドを実行すると、テーブルからサンプルの行が取得され、いくつかの計算が行われ、
結果的に生成される列の統計が保存されます。デフォルトでは、Amazon Redshift は DISTKEY 列にサ
ンプルパスを実行し、テーブルのその他すべての列に別のサンプルパスを実行します。列のサブセット
の統計を生成するには、カンマ区切りの列リストを指定します。
ANALYZE 操作はリソースを集中的に使います。そのため、実際に統計更新を必要とするテーブルと列
にのみ実行します。定期的に、または同じスケジュールですべてのテーブルのすべての行を分析する必
要はありません。データが大幅に変更される場合、次で頻繁に使用される列を分析します。
• ソートおよびグループ化の操作
• 結合
• クエリ述語
頻繁に分析する必要のない列は、大きな VARCHAR 列など、実際に問い合わされることがない事実、
単位、関連属性を表す列です。例えば、TICKIT データベースの LISTING テーブルについて考えてみま
す。
select "column", type, encoding, distkey, sortkey
from pg_table_def where tablename = 'listing';
column
|
type
| encoding | distkey | sortkey
---------------+--------------------+----------+---------+--------listid
| integer
| none
| t
| 1
sellerid
| integer
| none
| f
| 0
eventid
| integer
| mostly16 | f
| 0
dateid
| smallint
| none
| f
| 0
numtickets
| smallint
| mostly8 | f
| 0
priceperticket | numeric(8,2)
| bytedict | f
| 0
totalprice
| numeric(8,2)
| mostly32 | f
| 0
listtime
| timestamp with... | none
| f
| 0
このテーブルに大量の新しいレコードが毎日ロードされる場合、結合キーとしてクエリで頻繁に使用さ
れる LISTID 列を定期的に分析する必要があります。TOTALPRICE と LISTTIME が頻繁に使用される
クエリの制約である場合、平日は毎日、それらの列と分散キーを分析することがあります。
analyze listing(listid, totalprice, listtime);
アプリケーションの販売者とイベントが非常に静的であり、日付 ID がわずか 2 年または 3 年をカバー
する固定日数セットを参照する場合、一意の値別のインスタンス数が徐々に増えるとしても、それらの
列の一意の値が大幅に変更されることはありません。また、TOTALPRICE 列に比べて、NUMTICKETS
および PRICEPERTICKET 単位に頻繁にクエリが実行される場合、週末ごとに 1 回、テーブル全体に
ANALYZE コマンドを実行し、毎日は分析されない 5 つの列の統計を更新することがあります。
analyze listing;
テーブルの現在の統計を保守管理するには、次のように実行します。
• クエリを実行する前に ANALYZE コマンドを実行します。
• 定期的なロードまたは更新サイクルが終わるたびに、データベースに ANALYZE コマンドを定期的に
実行します。
• 作成した新しいテーブルと大幅に変更された既存のテーブルまたは列に ANALYZE コマンドを実行し
ます。
• クエリでの使用と変更傾向に基づき、異なるタイプのテーブルおよび列に対し、異なるスケジュール
で ANALYZE 操作を実行することを考慮します。
API Version 2012-12-01
84
Amazon Redshift データベース開発者ガイド
ANALYZE コマンド履歴
ANALYZE コマンド履歴
最後の ANALYZE コマンドがテーブルまたはデータベースで実行された日時を知っておくと役立ちま
す。ANALYZE コマンドが実行されると、Amazon Redshift は次のような複数のクエリを実行します。
redshift_fetch_sample: select * from table_name
ANALYZE コマンドが実行された日時を知るには、STL_QUERY や SVL_STATEMENTTEXT のように、
システムのテーブルとビューにクエリを実行し、padb_fetch_sample に制約を追加できます。例え
ば、SALES テーブルが最後に分析された日時を知るには、次のクエリを実行します。
select query, rtrim(querytxt), starttime
from stl_query
where querytxt like 'padb_fetch_sample%' and querytxt like '%sales%'
order by query desc;
query |
rtrim
|
starttime
------+------------------------------------------------+---------------------81 | redshift_fetch_sample: select * from sales
| 2012-04-18 12:...
80 | redshift_fetch_sample: select * from sales
| 2012-04-18 12:...
79 | redshift_fetch_sample: select count(*) from sales | 2012-04-18 12:...
(3 rows)
または、ANALYZE コマンドが含まれたすべての完了トランザクションで実行されたすべてのステート
メントを返す、より複雑なクエリを実行できます:
select xid, to_char(starttime, 'HH24:MM:SS.MS') as starttime,
date_diff('sec',starttime,endtime ) as secs, substring(text, 1, 40)
from svl_statementtext
where sequence = 0
and xid in (select xid from svl_statementtext s where s.text like 'red
shift_fetch_sample%' )
order by xid desc, starttime;
xid | starttime
| secs |
substring
-----+--------------+------+-----------------------------------------1338 | 12:04:28.511 |
4 | Analyze date
1338 | 12:04:28.511 |
1 | redshift_fetch_sample: select count(*) from
1338 | 12:04:29.443 |
2 | redshift_fetch_sample: select * from date
1338 | 12:04:31.456 |
1 | redshift_fetch_sample: select * from date
1337 | 12:04:24.388 |
1 | redshift_fetch_sample: select count(*) from
1337 | 12:04:24.388 |
4 | Analyze sales
1337 | 12:04:25.322 |
2 | redshift_fetch_sample: select * from sales
1337 | 12:04:27.363 |
1 | redshift_fetch_sample: select * from sales
...
新しいテーブルの自動分析
Amazon Redshift は、次のコマンドで作成できるテーブルを自動的に分析します。
• CREATE TABLE AS (CTAS)
• CREATE TEMP TABLE AS
• SELECT INTO
API Version 2012-12-01
85
Amazon Redshift データベース開発者ガイド
テーブルのバキューム処理
最初に作成したとき、これらのテーブルに ANALYZE コマンドを実行する必要はありません。変更する
場合は、他のテーブルと同じように分析する必要があります。
テーブルのバキューム処理
Topics
• 未ソートリージョンのサイズを管理する (p. 87)
大規模な削除または更新に続いて VACUUM コマンドを実行します。
Note
実質的に、テーブルの所有者またはスーパーユーザーのみがテーブルにバキューム処理を実行
できます。必要なテーブル権限なしで VACUUM が実行された場合、操作は完了しますが、効
果はありません。
更新を実行するために、Amazon Redshift は元の行を削除し、更新された行を追加します。そのため、
すべての更新は実質的に削除と挿入になります。
テーブルから行を削除したか、テーブルの行を更新したときに解放された領域を Amazon Redshift が
自動的に再利用することはありません。削除された行の数が多すぎると、不必要な処理が発生します。
VACUUM コマンドは削除に続いて領域を再利用します。それにより、パフォーマンスが改善され、利
用可能なストレージが増えます。一括削除、ロード、一連の増分更新の後にテーブルをクリーンアップ
するには、データベース全体または個々のテーブルに対して VACUUM (p. 308) コマンドを実行する必要
があります。
未使用のディスク領域を再利用するほかに、VACUUM コマンドはまた、テーブルの新しいデータがディ
スク上で完全にソートされていることを確認します。データが最初にテーブルにロードされたとき、
データは CREATE TABLE ステートメントの SORTKEY 仕様に基づいてソートされます。ただし、
COPY、INSERT、UPDATE ステートメントを使用してテーブルを更新するとき、新しい文はディスク
上の個別の未ソート領域に格納され、その後、クエリの要求に基づき、必要に応じてソートされます。
VACUUM コマンドは新しい行と既存のソートされた行をマージします。そのため、クエリ実行中の要
求に基づいて行をソートする必要はありません。大量の行がディスク上で未ソートのまま残っている場
合、マージ結合など、ソートされたデータに依存する操作でクエリパフォーマンスが低下する可能性が
あります。大きなリージョンが未ソートの状態であれば、バキューム処理の時間が長くなります。
一貫性のあるクエリパフォーマンスを維持するために、必要な頻度でバキューム処理を行います。
VACUUM コマンドの実行頻度を決めるときは、これらの要因を考慮します。
• バキューム処理を遅らせる場合、再整理しなければならないデータが増えるのでバキューム処理にか
かる時間が長くなります。
• VACUUM は I/O 集約型な操作です。そのため、バキューム処理の完了にかかる時間が長ければ、同
時クエリとクラスターで実行されている他のデータベース操作に与える影響が大きくなります。
• クラスターでのアクティビティが最も少ないと予想される保守管理時間枠で VACUUM を実行しま
す。
バキューム操作の進行中に、クエリおよび書き込み操作を実行できます。バキューム処理されている
テーブルを含む、データベースのすべてのテーブルにユーザーはアクセスできます。バキューム処理中
のテーブルでブロックされる唯一の操作は DDL 操作です。例えば、ALTER TABLE コマンドでバキュー
ム処理中のテーブルの名前を変更しようとすると失敗します。
バキューム操作は増分ステップで進行します。何らかの理由で操作が失敗した場合、あるいは Amazon
Redshift がバキューム中にオフラインになった場合、部分的にバキューム処理されたテーブルまたは
API Version 2012-12-01
86
Amazon Redshift データベース開発者ガイド
未ソートリージョンを管理する
データベースは一貫性のある状態にあります。バキューム操作を手動で再開する必要がありますが、バ
キューム操作を完全に繰り返す必要はありません。失敗する前にすでにコミットされたマージ済みの行
は再度バキューム処理する必要はありません。
完全バキューム、削除のみのバキューム、ソートのみのバキュームを実行できます。
• 完全バキューム 領域を再利用し、行をソートします。領域の再利用と行の再ソートが同じくらい重
要な場合、ほとんどのアプリケーションに完全バキュームをお勧めします。完全バキュームを実行す
る場合、DELETE ONLY と SORT ONLY のバキューム操作を連続して実行するより、すべてを 1 つ
の操作で実行するほうが効率的です。
• DELETE ONLY 領域の再利用のみを行います。ディスク領域の再利用は重要であるが、新しい行の
再ソートは重要でないとき、DELETE ONLY バキュームを実行すれば、バキューム操作にかかる時
間を短縮できます。例えば、行を再ソートしてクエリパフォーマンスを最適化する必要がない場合、
DELETE ONLY バキューム操作を実行します。
• SORT ONLY 行のソートのみを行います。ディスク領域の再利用は重要でないが、新しい行の再ソー
トは重要であるとき、SORT ONLY バキュームを実行すれば、バキューム操作にかかる時間を短縮で
きます。例えば、アプリケーションにディスク領域制約がないが、テーブル行のソートによるクエリ
の最適化に依存する場合、SORT ONLY バキューム操作を実行します。
未ソートリージョンのサイズを管理する
(新しく作成されたか、全データが削除された)空のテーブルに初回ロードを実行するとき、すべての
データがソート済みリージョンに直接ロードされます。そのため、バキュームは必要ありません。デー
タがすでに含まれているテーブルに大量の新しいデータをロードするか、定期的な保守管理操作の一環
としてテーブルのバキューム処理を実行しないとき、未ソートのリージョンが増えます。長時間のバ
キューム操作を避けるために、次のテクニックを利用します。
• 定期的なスケジュールでバキューム操作を実行します。(テーブルの合計行数の少ないパーセンテー
ジを表す毎日の更新など)少ない増分でテーブルをロードする場合、VACUUM を定期的に実行する
と、個別のバキューム操作が短時間で終了します。
• 複数の COPY 操作で同じテーブルをロードする必要がある場合、最も大きなロードを最初に実行し
ます。
• テスト目的で少ない数の行をテーブルにロードする場合、完了時に、テーブルの全データを削除し、
後続の本稼働のロード操作の一環としてこれらの行を再ロードします。または、テーブルを削除し
(Drop)、再作成します。
• すべての行を削除するのではなく、テーブルの全データを削除します(Truncate)。テーブルから行
を削除した場合、その行が占有していた領域はバキューム操作を実行するまで再利用されません。た
だし、テーブルの全データを削除した(Truncate)場合、テーブルが空になり、ディスク領域が再利
用されます。そのため、バキュームは必要ありません。
• ディープコピーを実行します。ディープコピーでは、一括挿入を使用してテーブルが再作成され、再
設定されます。これにより、テーブルが自動的に再ソートされます。テーブルにソートされていない
大規模なリージョンがある場合、ディープコピーの方がバキューム処理より高速です。欠点は、ディー
プコピー操作中、同時更新を実行できないことです。バキュームでは実行できます。詳細について
は、「ディープコピーを使い、長時間のバキューム処理を回避する (p. 59)」を参照してください。
同時書き込み操作を管理する
Topics
• 直列化可能分離 (p. 88)
• 書き込みおよび読み取り/書き込み操作 (p. 89)
• 同時書き込みの例 (p. 90)
API Version 2012-12-01
87
Amazon Redshift データベース開発者ガイド
直列化可能分離
Amazon Redshift では、増分ロードまたは増分変更の実行中にテーブルを読み取ることができます。
一部の従来のデータウェアハウジングおよびビジネスインテリジェンスアプリケーションでは、毎日の
夜間のロードが完了したときにのみデータベースが利用可能になります。そのような場合、分析クエリ
が実行され、レポートが生成される通常の作業時間の間は更新が許可されません。ただし、増え続ける
アプリケーションは日中ずっと、あるいは 1 日中稼動状態を維持し、ロード時間枠という概念は古いも
のになります。
Amazon Redshift では増分ロードまたは増分変更の実行中にテーブル読み取りができるので、これらの
アプリケーションがサポートされます。クエリは、コミットする次のバージョンの待機ではなく、デー
タの最新コミットバージョンまたはスナップショットだけを確認します。特定のクエリに別の書き込み
操作からのコミットを待機させる場合、それを適宜スケジュールする必要があります。
次のトピックでは、トランザクション、データベーススナップショット、更新、同時動作など、主要な
概念とユースケースの一部を紹介します。
直列化可能分離
一部のアプリケーションでは、クエリとロードを同時に行うだけでなく、複数のテーブルまたは同じ
テーブルに同時に書き込む能力を必要とします。この文脈では、同時とは、厳密に同じ時間に実行する
ようにスケジュールするという意味ではなく、重複するという意味です。最初のトランザクションがコ
ミットする前に 2 つ目のトランザクションが開始する場合、2 つのトランザクションは同時であると考
えられます。同時操作は、同じユーザーまたは異なるユーザーが制御する異なるセッションから発生す
る可能性があります。
Note
Amazon Redshift はデフォルトの自動コミット動作がサポートされます。この動作では、個別
に実行された SQL コマンドが個別にコミットします。(BEGIN (p. 182) および END (p. 238) ス
テートメントにより定義された)トランザクションブロックに一連のコマンドを含めた場合、
そのブロックは 1 つのトランザクションとしてコミットされます。そのため、必要に応じて
ロールバックできます。この動作の例外は TRUNCATE コマンドです。このコマンドは、END
ステートメントを必要とせず、現在のトランザクションで行われたすべての未処理変更が自動
的にコミットされます。
Amazon Redshift では、同時書き込み操作がテーブルの書き込みロックと直列化分離を利用して安全に
サポートされます。直列化分離では、テーブルに対して実行されるトランザクションは、そのテーブル
に対して実行される唯一のトランザクションであるという錯覚が守られます。例えば、T1 と T2 とい
う 2 つの同時実行トランザクションで次の少なくとも 1 つとして同じ結果が生成されます。
• T1 と T2 がこの順序で連続して実行されます
• T2 と T1 がこの順序で連続して実行されます
同時トランザクションは互いに認識されません。互いの変更を検出できません。各同時トランザクショ
ンにより、トランザクションの始めにデータベースのスナップショットが作成されます。データベース
スナップショットは、ほとんどの SELECT ステートメント、COPY、DELETE、INSERT、UPDATE、
TRUNCATE などの DML コマンド、次の DDL コマンドの最初の発生時にトランザクション内で作成さ
れます。
• ALTER TABLE(列を追加または削除する)
• CREATE TABLE
• DROP TABLE
• TRUNCATE TABLE
API Version 2012-12-01
88
Amazon Redshift データベース開発者ガイド
書き込みおよび読み取り/書き込み操作
同時トランザクションの任意の直列実行でその同時実行と同じ結果が生成された場合、そのようなトラ
ンザクションは「直列化可能」とみなされ、安全に実行できます。そのようなトランザクションの直列
実行で同じ結果が生成されない場合、直列化可能性を壊すステートメントを実行するトランザクション
が中止となり、ロールバックされます。
システムカタログテーブル(PG)と他の Amazon Redshift システムテーブル(STL と STV)はトラン
ザクションでロックされません。そのため、DDL および TRUNCATE 操作から発生したデータベース
オブジェクトに対する変更は同時トランザクションに対するコミットで表示されます。
例えば、T1 と T2 という 2 つの同時トランザクションが開始するとき、テーブル A がデータベースに
存在します。PG_TABLES カタログテーブルから選択することで T2 がテーブルの一覧を返し、T1 が
テーブル A を削除してコミットし、T2 がテーブルを再度一覧表示する場合、テーブル A は一覧に表示
されなくなります。T2 が削除されたテーブルのクエリを試行すると、Amazon Redshift は「関係が存
在しません」というエラーを返します。T2 にテーブルの一覧を返す、またはテーブル A が存在するこ
とをチェックするカタログクエリは、ユーザーテーブルに対する操作と同じ分離ルールには準拠しませ
ん。
これらのテーブルに対する更新のトランザクションはコミット済み読み取り分離モードで実行されま
す。PG プレフィックスカタログテーブルではスナップショット分離がサポートされません。
システムテーブルとカタログテーブルの直列化分離
データベーススナップショットは、ユーザーが作成したテーブルまたは Amazon Redshift システムテー
ブル(STL または STV)を参照する SELECT クエリのトランザクションでも作成されます。テーブル
を参照しない SELECT クエリは新しいトランザクションのデータベーススナップショットを作成しま
せん。システムカタログテーブル(PG)でだけ実行される INSERT、DELETE、UPDATE ステートメ
ントも同様です。
書き込みおよび読み取り/書き込み操作
異なるタイプのコマンドを実行するタイミングと方法を決定することで、同時書き込み操作の特定の動
作を管理できます。次のコマンドがこの話題に関連します。
•
•
•
•
COPY コマンド、(初回または増分)ロードを実行します
INSERT コマンド、1 つまたは複数の行を 1 回で追加します
UPDATE コマンド、既存の行を変更します
DELETE コマンド、行を削除します
COPY および INSERT 操作は純粋な書き込み操作ですが、DELETE および UPDATE 操作は読み取り/
書き込み操作です。(行を削除または更新するには、最初に読み取る必要があります。)同時書き込み
操作の結果は、同時に実行されている特定のコマンドに依存します。同じテーブルに対する COPY お
よび INSERT 操作はロックが解除されるまで待機状態に置かれます。その後、通常どおり進められま
す。
UPDATE および DELETE 操作は、書き込み前に初回テーブル読み込みに依存するため、異なる動作を
します。同時トランザクションが互いに表示されるとすれば、UPDATE と DELETE は最後のコミット
からデータのスナップショットを読み取る必要があります。最初の UPDATE または DELETE がその
ロックを解除するとき、2 つ目の UPDATE または DELETE はそれがこれから処理するデータが古く
なっている可能性がないか決定する必要があります。最初のトランザクションでそのロックが解除され
るまで 2 つ目のトランザクションでデータのスナップショットが取得されないため、データは古くなり
ません。
同時書き込みトランザクションの考えられるデッドロック状況
トランザクションに複数のテーブルの更新が関連するとき、両方が同じテーブルセットに書き込もうと
すると、同時実行トランザクションにデッドロックが発生する可能性があります。コミットまたはロー
API Version 2012-12-01
89
Amazon Redshift データベース開発者ガイド
同時書き込みの例
ルバックするとき、トランザクションはそのすべてのテーブルロックを一度に解除します。1 つずつ
ロックを解除することはありません。
例えば、T1 と T2 というトランザクションが大体同じ時間に開始します。T1 がテーブル A に書き込み
を開始し、T2 がテーブル B に書き込みを開始する場合、両方のトランザクションは競合なく進行しま
す。ただし、T1 がテーブル A への書き込みを終了し、テーブル B への書き込みを開始する必要がある
場合、T2 が以前として B をロックしているため、T1 は進行できません。反対に、T2 がテーブル B へ
の書き込みを終了し、テーブル A への書き込みを開始する必要がある場合、T1 が以前として A をロッ
クしているため、T2 は進行できません。その書込操作がコミットされるまでいずれのトランザクショ
ンもそのロックを解除できないため、いずれのトランザクションも進行できません。
この種のデッドロックを回避するには、同時書き込み操作の日程を注意深く計画する必要があります。
例えば、常にトランザクションと同じ順序でテーブルを更新する必要があります。ロックを指定する場
合、DML 操作を実行する前に同じ順序でテーブルをロックします。
同時書き込みの例
次の例は、同時に実行されたときに、トランザクションが進行または中止およびロールバックする仕組
みを示しています。
同じテーブルへの同時 COPY 操作
トランザクション 1 は LISTING テーブルに行をコピーします:
begin;
copy listing from ...;
end;
トランザクション 2 は別のセッションで同時に開始され、さらに多くの行を LISTING テーブルにコピー
しようとします。トランザクション 2 は、トランザクション 1 が LISTING テーブルの書き込みロック
を解除するまで待機する必要があります。その後、続行できます。
begin;
[waits]
copy listing from ;
end;
片方または両方のトランザクションに COPY コマンドの代わりに INSERT コマンドが含まれる場合、
同じ動作が起こることがあります。
同じテーブルへの同時 DELETE 操作
トランザクション 1 がテーブルから行を削除します:
begin;
delete from listing where ...;
end;
トランザクション 2 が同時に開始され、同じテーブルから行を削除しようとします。行の削除を試行す
る前にトランザクション 1 の完了を待つため、トランザクション 2 は成功します。
begin
[waits]
API Version 2012-12-01
90
Amazon Redshift データベース開発者ガイド
同時書き込みの例
delete from listing where ;
end;
片方または両方のトランザクションに DELETE コマンドの代わりに同じテーブルへの UPDATE コマン
ドが含まれる場合、同じ動作が起こることがあります。
読み取り操作と書き込み操作がミックスされた同時トランザク
ション
この例では、トランザクション 1 は USERS テーブルから行を削除し、テーブルを再ロードし、COUNT(*)
クエリを実行し、ANALYZE を実行してからコミットします。
begin;
delete one row from USERS table;
copy ;
select count(*) from users;
analyze ;
end;
その間、トランザクション 2 が開始します。このトランザクションは USERS テーブルへの追加行のコ
ピー、テーブルの分析、最初のトランザクションと同じ COUNT(*) クエリの実行を試行します。
begin;
[waits]
copy users from ...;
select count(*) from users;
analyze;
end;
2 つ目のトランザクションは最初のトランザクションの完了を待つため、成功します。その COUNT ク
エリはそれが完了したロードに基づいてカウントを返します。
API Version 2012-12-01
91
Amazon Redshift データベース開発者ガイド
データを Amazon S3 にアンロードする
データのアンロード
Topics
• データを Amazon S3 にアンロードする (p. 92)
• 暗号化されたデータファイルをアンロードする (p. 94)
• 区切り文字付きまたは固定幅形式でデータをアンロードする (p. 95)
• アンロードしたデータを再ロードする (p. 97)
データベーステーブルからデータをアンロードして Amazon S3 バケット上の一連のファイルに出力す
るには、UNLOAD (p. 295) コマンドを SELECT ステートメントとともに使用します。テキストデータ
は、ロード時に使用されたデータ形式にかかわらず、区切り文字付き形式と固定幅形式のどちらでもア
ンロードできます。圧縮された GZIP ファイルを作成するかどうかを指定することもできます。
Amazon S3 バケットに対するユーザーのアクセスを制限するには、一時的なセキュリティ認証情報を
使用します。
Important
Amazon Redshift が出力ファイルを書き込む Amazon S3 バケットを、クラスターと同じ領域
に作成する必要があります。
データを Amazon S3 にアンロードする
Amazon Redshift には、select ステートメントの結果を分割して一連のファイルに出力する機能があり
ます。ノードスライスごとに 1 つ以上のファイルが作成されるので、データの並列再ロードが容易にな
ります。
Amazon Redshift がサポートする UNLOAD コマンドでは、任意の select ステートメントを使用できま
す(ただし、外側の select で LIMIT 句を使用するものを除きます)。例えば、select ステートメント
の中で特定の列を選択することや、where 句を使用して複数のテーブルを結合することができます。ク
エリの中に引用符がある(例えば、リテラル値を囲むため)場合は、クエリテキスト内でエスケープす
る(\')必要があります。詳細については、SELECT (p. 259) コマンドのリファレンスを参照してくださ
い。LIMIT 句の使用方法の詳細については、UNLOAD コマンドの使用に関する注意事項を参照してく
ださい。
例えば、次に示す UNLOAD コマンドを実行すると、VENUE テーブルの内容が Amazon S3 バケット
s3://mybucket/tickit/venue/ に送信されます。
API Version 2012-12-01
92
Amazon Redshift データベース開発者ガイド
データを Amazon S3 にアンロードする
unload ('select * from venue')
to 's3://mybucket/tickit/venue_'
credentials 'aws_access_key_id=<access-key-id>;aws_secret_access_key=<secretaccess-key>';
一時的セキュリティ認証情報を使い、データにアクセスするユーザーを制限できます。一時的セキュリ
ティ認証情報はセキュリティを強化します。使用期限が短く、期限が切れた後は再利用できないためで
す。このような一時的セキュリティ認証情報を与えられたユーザーは、その認証情報の有効期限の間だ
けリソースにアクセスできます。詳細については、「一時的セキュリティ認証情報 (p. 197)」を参照し
てください。一時的なアクセス認証情報を使用してデータをアンロードするには、次の構文を使用しま
す。
unload ('select * from venue')
to 's3://mybucket/tickit/venue_'
credentials 'aws_access_key_id=<temporary-access-key-id>;aws_secret_ac
cess_key=<temporary-secret-access-key>;token=<temporary-token>'
[<options>];
Important
一時的セキュリティ認証情報は、COPY ステートメントの期間全体で有効にする必要がありま
す。一時的セキュリティ認証情報の期限がロードプロセス中に切れた場合、COPY は失敗し、
処理はロールバックされます。例えば、一時的セキュリティ認証情報の期限が 15 分後に切れ
るときに COPY に 1 時間かかる場合、COPY は完了前に失敗します。
UNLOAD 操作が完了したら、データが正しくアンロードされたことを確認します。確認するには、
UNLOAD でファイルを出力した Amazon S3 バケットに移動します。スライスごとに 1 つ以上のファ
イルがあり、ファイルには 0 から始まる番号が付けられています。以下に例を示します。
venue_0000_part_00
venue_0001_part_00
venue_0002_part_00
venue_0003_part_00
Amazon S3 に出力されたファイルのリストをプログラムで取得するには、UNLOAD 完了後に Amazon
S3 リスト操作を呼び出します。ただし、この呼び出しの早さによっては、リストが不完全になること
があります。Amazon S3 リスト操作は結果整合であるからです。完成した正式のリストをすぐに取得
するには、STL_UNLOAD_LOG をクエリします。
次のクエリは、ID 2320 のクエリに対する UNLOAD によって作成されたファイルのパス名を返します。
select query, substring(path,0,40) as path
from stl_unload_log
where query=2320
order by path;
このコマンドは、次のサンプル出力を返します。
query |
path
-------+-------------------------------------2320 | s3://my-bucket/venue0000_part_00
2320 | s3://my-bucket/venue0001_part_00
2320 | s3://my-bucket/venue0002_part_00
API Version 2012-12-01
93
Amazon Redshift データベース開発者ガイド
暗号化されたデータファイルをアンロードする
2320 | s3://my-bucket/venue0003_part_00
(4 rows)
データ量が非常に多い場合は、ファイルが 1 つのスライスにつき複数の部分に分割されることがありま
す。以下に例を示します。
0000_part_00
0000_part_01
0000_part_02
0001_part_00
0001_part_01
0001_part_02
...
次に示す UNLOAD コマンドでは、select ステートメントの中に引用符で囲まれた文字列があるので、
その引用符はエスケープされています(=\'OH\' ')。
unload ('select venuename, venuecity from venue where venuestate=\'OH\' ')
to 's3://mybucket/tickit/venue/ '
credentials 'aws_access_key_id=<access-key-id>;aws_secret_access_key=<secretaccess-key>';
s3 パス文字列の中にプレフィックスがある場合は、UNLOAD 実行時にそのプレフィックスがファイル
名に使用されます。
unload ('select venuename, venuecity from venue where venuestate=\'OH\' ')
to 's3://mybucket/tickit/venue/OH_'
credentials 'aws_access_key_id=<access-key-id>;aws_secret_access_key=<secretaccess-key>';
前の例で作成されたファイル名には、'OH' というプレフィックスが付いています。
OH_0000_part_00
OH_0001_part_00
OH_0002_part_00
OH_0003_part_00
デフォルトでは、出力先のバケットにすでにファイルがある場合はファイルが上書きされるのではなく
UNLOAD が異常終了します。既存のファイルを上書きするには、ALLOWOVERWRITE オプションを
指定します。
unload ('select * from venue') to 's3://mybucket/venue_pipe_'
credentials 'aws_access_key_id=<access-key-id>;aws_secret_access_key=<secretaccess-key>'
allowoverwrite;
暗号化されたデータファイルをアンロードする
暗号化されたデータファイルを Amazon S3 上に作成するには、UNLOAD コマンドとともに ENCRYPTED
オプションを使用します。UNLOAD で使用されるエンベロープ暗号化プロセスは、Amazon S3 のクラ
API Version 2012-12-01
94
Amazon Redshift データベース開発者ガイド
区切り文字付きまたは固定幅形式でデータをアンロードす
る
イアント側暗号化で使用されているものと同じです。この暗号化されたファイルをロードするには、
COPY コマンドとともに ENCRYPTED オプションを使用します。
このプロセスの動作は次のようになります。
1. 開発者は base64 で暗号化した 256 ビット AES キーを作成します。これを、プライベート暗号化
キー(マスター対称キー)として使用します。
2. 開発者は UNLOAD コマンドを実行します。このときに、マスター対称キーと ENCRYPTED オプショ
ンを指定します。
3. UNLOAD により、1 回限り使用の対称キー(エンベロープ対称キーと呼ばれます)と初期化ベクター
(IV)が生成され、これが UNLOAD でのデータの暗号化に使用されます。
4. 開発者が作成したマスター対称キーを使用してエンベロープ対称キーが暗号化されます。
5. 暗号化されたデータファイルが Amazon S3 に保存され、暗号化されたエンベロープキーと IV がオ
ブジェクトメタデータとして各ファイルとともに保存されます。暗号化されたエンベロープキーは
オブジェクトメタデータ x-amz-meta-x-amz-key として、IV はオブジェクトメタデータ
x-amz-meta-x-amz-iv として保存されます。
エンベロープ暗号化プロセスの詳細については、「Client-Side Data Encryption with the AWS SDK for
Java and Amazon S3」の記事を参照してください。
暗号化されたデータファイルをアンロードするには、マスターキー値を認証情報文字列に追加するとと
もに、ENCRYPTED オプションを指定します。
unload ('select venuename, venuecity from venue')
to 's3://mybucket/encrypted/venue_'
credentials 'aws_access_key_id=<access-key-id>;aws_secret_access_key=<secretaccess-key>;master_symmetric_key=<master_key>'
encrypted;
アンロードしようとする暗号化済みデータファイルが GZIP 圧縮されている場合は、GZIP オプション
をマスターキー値および ENCRYPTED オプションとともに指定します。
unload ('select venuename, venuecity from venue')
to 's3://mybucket/encrypted/venue_'
credentials 'aws_access_key_id=<access-key-id>;aws_secret_access_key=<secretaccess-key>;master_symmetric_key=<master_key>'
encrypted gzip;
暗号化されたデータファイルをロードするには、同じマスターキー値を認証情報文字列に追加するとと
もに、ENCRYPTED オプションを指定します。
copy venue from 's3://mybucket/encrypted/venue_'
credentials 'aws_access_key_id=<access-key-id>;aws_secret_access_key=<secretaccess-key>;master_symmetric_key=<master_key>'
encrypted;
区切り文字付きまたは固定幅形式でデータをアン
ロードする
データのアンロードは、区切り文字付き形式と固定幅形式のどちらでも可能です。デフォルトでは、出
力はパイプ文字(|)で区切られます。
API Version 2012-12-01
95
Amazon Redshift データベース開発者ガイド
区切り文字付きまたは固定幅形式でデータをアンロードす
る
次に示す例では、カンマを区切り文字として指定しています。
unload ('select * from venue')
to 's3://mybucket/tickit/venue/comma'
credentials 'aws_access_key_id=<access-key-id>;aws_secret_access_key=<secretaccess-key>'
delimiter ',';
生成される出力ファイルは次のようになります。
20,Air Canada Centre,Toronto,ON,0
60,Rexall Place,Edmonton,AB,0
100,U.S. Cellular Field,Chicago,IL,40615
200,Al Hirschfeld Theatre,New York City,NY,0
240,San Jose Repertory Theatre,San Jose,CA,0
300,Kennedy Center Opera House,Washington,DC,0
...
同じ結果セットをアンロードしてタブ区切りファイルに出力するには、次のコマンドを実行します。
unload ('select * from venue')
to 's3://mybucket/tickit/venue/tab'
credentials 'aws_access_key_id=<access-key-id>;aws_secret_access_key=<secretaccess-key>'
delimiter as '\t';
代わりに、FIXEDWIDTH 指定を使用することもできます。この指定は、各テーブル列の識別子と、そ
の列の幅(文字数)で構成されます。幅が不足している場合は、データが切り捨てられるのではなく
UNLOAD コマンドが異常終了するので、指定する幅は、その列の最も長いエントリの長さ以上となる
ようにしてください。固定幅データのアンロードの動作は、区切り文字付きのデータのアンロードに似
ています。異なるのは、生成される出力の中に区切り文字が含まれていない点です。以下に例を示しま
す。
unload ('select * from venue')
to 's3://mybucket/tickit/venue/fw'
credentials 'aws_access_key_id=<access-key-id>;aws_secret_access_key=<secretaccess-key>'
fixedwidth '0:3,1:100,2:30,3:2,4:6';
固定幅出力は次のようになります。
20 Air Canada Centre
Toronto
ON0
60 Rexall Place
Edmonton
AB0
100U.S. Cellular Field
Chicago
IL40615
200Al Hirschfeld Theatre
New York CityNY0
240San Jose Repertory TheatreSan Jose
CA0
300Kennedy Center Opera HouseWashington
DC0
FIXEDWIDTH 指定の詳細については、COPY (p. 187) コマンドの説明を参照してください。
API Version 2012-12-01
96
Amazon Redshift データベース開発者ガイド
アンロードしたデータを再ロードする
アンロードしたデータを再ロードする
アンロード操作の結果を再ロードするには、COPY コマンドを使用します。
次に示す単純な例では、VENUE テーブルからデータをアンロードし、テーブルの全データを削除して
から、データを再ロードしています。
unload ('select * from venue order by venueid')
to 's3://mybucket/tickit/venue/reload_'
credentials 'aws_access_key_id=<access-key-id>;aws_secret_access_key=<secretaccess-key>'
delimiter '|';
truncate venue;
copy venue from 's3://mybucket/tickit/venue/reload_'
credentials 'aws_access_key_id=<access-key-id>;aws_secret_access_key=<secretaccess-key>'
delimiter '|';
再ロードの後の VENUE テーブルは次のようになります。
select * from venue order by venueid limit 5;
venueid |
venuename
| venuecity | venuestate | venueseats
---------+---------------------------+-------------+------------+----------1 | Toyota Park
| Bridgeview | IL
|
0
2 | Columbus Crew Stadium
| Columbus
| OH
|
0
3 | RFK Stadium
| Washington | DC
|
0
4 | CommunityAmerica Ballpark | Kansas City | KS
|
0
5 | Gillette Stadium
| Foxborough | MA
|
68756
(5 rows)
API Version 2012-12-01
97
Amazon Redshift データベース開発者ガイド
クエリパフォーマンスのチューニン
グ
Topics
• 説明プランの分析 (p. 99)
• クエリによるメモリ使用の管理 (p. 105)
• ディスクスペースのモニタリング (p. 109)
• コンパイル済みコードによるベンチマーク (p. 110)
• JDBC フェッチサイズパラメータの設定 (p. 110)
• ワークロード管理の実装 (p. 111)
Amazon Redshift データウェアハウスから有益な情報を取得するには、極めて大量のデータに対して非
常に複雑なクエリを実行する必要があります。その結果、多くのクエリで、実行に非常に長い時間がか
かります。Amazon Redshift では、超並列処理とともに高度なクエリプランナーを使用して、各段に高
速な分析クエリの実行を可能にしています。このガイドの「テーブルの設計 (p. 30)」セクションの原
則に従ってデータベースを設計して作成すれば、クエリは並列処理の利点を十分に活かし、大幅なチュー
ニングを必要とすることなく効率的に実行されます。一部のクエリの実行に時間がかかる場合、クエリ
パフォーマンスを最適化するために実行できるステップがあります。
低速なクエリの問題の原因を特定するには、EXPLAIN コマンドを使って、クエリのクエリ実行プラン
または説明プランを生成します。次に、そのプランを分析して、最も多くのリソースを使用する操作を
見つけます。この情報を基にして、パフォーマンスを改善する方法を探し始めることができます。
非常に複雑なクエリに対して利用可能なメモリが十分ない場合、一時的に中間データをディスクに書き
込む必要が生じることがあり、長い時間がかかります。多くの場合、クエリがディスクに書き込みを
行っているかどうかを確認し、メモリの使用方法を改善するステップを実行するか、利用可能なメモリ
の容量を増やすことで、パフォーマンスを改善できます。
パフォーマンスの問題を確認したら、テーブル設計に再び戻り、ソートキーまたは分散キーの変更に
よって低速なクエリが改善されるかどうかを検討できます。
場合によっては、通常は高速に実行されるクエリが、実行時間が長い他のクエリが終了するのを待機し
ていることがあります。この場合は、クエリキューを作成し、別の種類のクエリを適切なキューに割り
当てることで、システムの全体的なパフォーマンスを改善できる可能性があります。
API Version 2012-12-01
98
Amazon Redshift データベース開発者ガイド
クエリプランの分析
ここでは、クエリの実行プランの検査、クエリによるディスクストレージ使用のモニタリング、および
キューを使用したクエリワークロードの管理により、クエリのパフォーマンスを最適化するのに役立つ
情報と例を示します。
説明プランの分析
Topics
• 簡単な EXPLAIN の例 (p. 101)
• EXPLAIN の演算子 (p. 102)
• 結合例 (p. 103)
• クエリプランのシステムビューへのマップ (p. 105)
処理に異常に時間がかかるクエリがある場合、説明プランを検査することで、そのパフォーマンスを改
善する可能性が見つかることがあります。ここでは、説明プランを確認する方法と、説明プランを使用
して Amazon Redshift クエリを最適化する可能性を見つける方法について説明します。
説明プランを作成するには、EXPLAIN (p. 240) コマンドに続いて実際のクエリテキストを指定します。
以下に例を示します。
explain select avg(datediff(day, listtime, saletime)) as avgwait
from sales, listing where sales.listid = listing.listid;
QUERY PLAN
XN Aggregate (cost=6350.30..6350.31 rows=1 width=16)
-> XN Hash Join DS_DIST_NONE (cost=47.08..6340.89 rows=3766 width=16)
Hash Cond: ("outer".listid = "inner".listid)
-> XN Seq Scan on listing (cost=0.00..1924.97 rows=192497 width=12)
-> XN Hash (cost=37.66..37.66 rows=3766 width=12)
-> XN Seq Scan on sales (cost=0.00..37.66 rows=3766 width=12)
説明プランから、次の情報が提供されます。
• 実行エンジンが実行するステップ(下から順に読み取る)。
• 各ステップで実行される操作の種類。この例では、操作は、下から順に Seq Scan、Hash、Seq Scan、
Hash Join、Aggregate です。操作については、このセクションの後で説明します。
• 各ステップで使用されるテーブルと列。
• 各ステップで処理されるデータの量(行数とバイト単位のデータの幅)
• 操作の相対的なコスト。
最初に考慮するのは、各ステップのコストです。コストは、プラン内のステップの相対的な実行回数を
比較する評価基準です。コストは、実際の実行回数やメモリの消費に関する正確な情報を提供したり、
実行プラン間の意味のある比較を提供したりするものではありませんが、クエリで最も多くのリソース
を消費しているステップを知ることができます。最もコストが高いステップを特定することは、コスト
を下げる可能性を探し始めるための開始点となります。
EXPLAIN コマンドでは実際にクエリは実行されません。出力には、クエリが現在の動作条件で実行さ
れた場合に Amazon Redshift が実行するプランのみが含まれます。何らかの方法でテーブルのスキー
マを変更するか、テーブルのデータを変更し、ANALYZE (p. 180) を再度実行して統計メタデータを更新
する場合、説明プランは異なるものになる可能性があります。
API Version 2012-12-01
99
Amazon Redshift データベース開発者ガイド
クエリプランの分析
Note
EXPLAIN は、必ずデータ操作言語(DML)とともに使用する必要があります。データ定義言
語(DDL)やデータベース操作など、他の SQL コマンドに EXPLAIN を使用すると、EXPLAIN
操作は失敗します。
EXPLAIN は次のコマンドのみに使用できます。
• SELECT
• SELECT INTO
• CREATE TABLE AS (CTAS)
• INSERT
• UPDATE
• DELETE
EXPLAIN の出力には、データ分散および並列クエリ実行のその他の側面に関する限定された情報が含
まれます。次の操作を行うには、システムテーブルとビュー(特に一部の STL テーブルと
SVL_QUERY_SUMMARY (p. 557) ビュー)を使用します。
•
•
•
•
実際の実行統計情報を返す
クエリプラン内のステップの動作を分離する
クエリアクティビティをモニタリングする
データ分散スキューを検出する
説明プランによるシステムビューの使用の詳細については、「クエリプランのシステムビューへのマッ
プ (p. 105)」を参照してください。
データ定義言語(DDL)やデータベース操作などその他の SQL コマンドに EXPLAIN を使用すると、
失敗します。
クエリに対する EXPLAIN 出力は、次の 2 つの方法のいずれかで検査できます。
• 単一のクエリに対して明示的に EXPLAIN コマンドを使用する。
explain select avg(datediff(day, listtime, saletime)) as avgwait
from sales, listing where sales.listid = listing.listid;
QUERY PLAN
XN Aggregate (cost=6350.30..6350.31 rows=1 width=16)
-> XN Hash Join DS_DIST_NONE (cost=47.08..6340.89 rows=3766 width=16)
Hash Cond: ("outer".listid = "inner".listid)
-> XN Seq Scan on listing (cost=0.00..1924.97 rows=192497 width=12)
-> XN Hash (cost=37.66..37.66 rows=3766 width=12)
-> XN Seq Scan on sales (cost=0.00..37.66 rows=3766 width=12)
• STL_EXPLAIN (p. 479) テーブルに対してクエリを実行する。
前の SELECT クエリを実行し、そのクエリ ID が 10 であるとします。STL_EXPLAIN テーブルに対
してクエリを実行し、EXPLAIN コマンドが返す同じ種類の情報を確認できます。
select query,nodeid,parentid,substring(plannode from 1 for 30),
substring(info from 1 for 20) from stl_explain
where query=10 order by 1,2;
API Version 2012-12-01
100
Amazon Redshift データベース開発者ガイド
簡単な EXPLAIN の例
query | nodeid | parentid |
substring
|
substring
------+--------+----------+---------------------+--------------------10 |
1 |
0 | XN Aggregate (cost=6350.30... |
10 |
2 |
1 |
-> XN Merge Join DS_DIST_NO | Merge Cond: ("outer"
10 |
3 |
2 |
-> XN Seq Scan on lis |
10 |
4 |
2 |
-> XN Seq Scan on sal |
(4 rows
簡単な EXPLAIN の例
次の例に、EVENT テーブルに対する簡単な GROUP BY クエリの EXPLAIN 出力を示します。
explain select eventname, count(*) from event group by eventname;
QUERY PLAN
------------------------------------------------------------------XN HashAggregate (cost=131.97..133.41 rows=576 width=17)
-> XN Seq Scan on event (cost=0.00..87.98 rows=8798 width=17)
(2 rows)
実行順序は下から上の順です。最初の作業では、EVENT テーブルをスキャンします。スキャン後に、
HashAggregate 演算子が GROUP BY リクエストを適用します。EXPLAIN 出力に表示されるプランは、
クエリ実行の簡略化された高レベルの表示であり、並行クエリ処理の詳細は示されません。例えば、
Amazon Redshift はコンピューティングノードの各データスライスで並行 HashAggregate 操作を実行
し、中間結果で HashAggregate 操作を再度実行します。より詳細なレベルを表示するには、クエリ自
体を実行し、SVL_QUERY_SUMMARY ビューに対してクエリを実行します。
次の表に、前の例の説明プランの要素を示します。
コスト
コストは、プラン内で操作を比較する際に役立つ相対的な値です。クエリプランのコストはプラン
を調べる際に累積されるので、この例の HashAggregate コスト番号(133.41)は、主にその下の
Seq Scan コスト(87.98)で構成されます。コストエントリにより、次の 2 つの情報が得られま
す。
• 最初の行を返す相対コスト(開始コスト)(この例では、両方の演算子に対して 0.00)
• 操作を完了する相対コスト(この例のスキャンでは 87.98)
Note
コストは時間の予測値ではありません。また、秒またはミリ秒単位で測定されません。
rows
返されることが予期される行数。この例では、スキャンにより 8798 行が返されることが予期され
ます。HashAggregate 演算子は 576 行を返すことが予期されます(重複したイベント名が破棄さ
れた場合)。
Note
行の予測は、ANALYZE (p. 180) コマンドによって生成された、利用可能な統計情報に基づ
いています。ANALYZE が最近実行されていない場合、予測の信頼性は下がります。
API Version 2012-12-01
101
Amazon Redshift データベース開発者ガイド
EXPLAIN の演算子
幅
バイト単位の、予測される平均的な行の幅。この例では、平均的な行の幅は 17 バイトであると予
測されます。
EXPLAIN の演算子
次のリストに、EXPLAIN 出力で最もよく使用される演算子を簡単に示します。演算子の詳細なリスト
については、SQL コマンドリファレンスの「EXPLAIN (p. 240)」を参照してください。
Scan 演算子
Sequential Scan 演算子(Seq Scan)は、相対スキャン(テーブルスキャン)演算子です。Seq
Scan はテーブル全体を最初から最後まで連続的にスキャンし、各行のクエリ制約を(WHERE 句
で)評価します。Seq Scan は列ごとにテーブルをスキャンします。
Join 演算子
Amazon Redshift は、結合されるテーブルの物理的な設計、結合に必要なデータの場所、およびク
エリ自体の固有の要件に基づいて、異なる結合演算子を使用します。以下の演算子が利用可能で
す。
• Nested Loop – 最適性が最も低い Nested Loop は、主にクロス結合(デカルト積)および一部の
不等結合に使用されます。
• Hash Join および Hash – Hash Join および Hash は、通常はネストループ結合よりも高速で、内
部結合および左右の外部結合に使用されます。通常、この演算子は、両方のテーブルの結合列が
いずれも分散キーまたはソートキーではない場合に使用されます。Hash 演算子は結合の内部テー
ブルのハッシュテーブルを作成します。Hash Join 演算子は外部テーブルを読み取り、結合列を
ハッシュし、内部ハッシュテーブルで一致を検索します。
• Merge Join – この演算子も、ネストループ結合よりも通常は高速で、内部結合および外部結合に
使用されます。通常、この演算子は、両方のテーブルの結合列がいずれも分散キーとソートキー
の両方である場合に使用されます。この演算子はソートされた 2 つのテーブルを順に読み取り、
一致する行を検索します。
集計クエリ演算子
次の演算子は、集計関数および GROUP BY 操作を含むクエリで使用されます。
• Aggregate – スカラー集計関数に使用されます。
• HashAggregate – ソートされずにグループ化された集計関数に使用されます。
• GroupAggregate – ソートされてグループ化された集計関数に使用されます。
ソート演算子
次の演算子は、クエリで結果セットをソートまたは結合する必要があるときに使用されます。
• Sort – ORDER BY 句およびその他のソート操作(UNION クエリや結合、SELECT DISTINCT ク
エリ、ウィンドウ関数で必要となるソートなど)を評価します。
• Merge – 並行操作から導出される、ソートされた中間結果に従って最終的なソート結果を作成し
ます。
UNION、INTERSECT、および EXCEPT 演算子
次の演算子は、UNION, INTERSECT、および EXCEPT を使用したセット操作を含むクエリに使用
されます。
• Subquery – UNION クエリを実行するために Scan および Append が使用されます。
• Hash Intersect Distinct および Hash Intersect All – INTERSECT および INTERSECT ALL クエリ
に使用されます。
• SetOp Except – EXCEPT(または MINUS)クエリの実行に使用されます。
その他の演算子
次の演算子は分類が困難ですが、ルーチンクエリの EXPLAIN 出力に頻繁に出現します。
• Unique – SELECT DISTINCT クエリおよび UNION クエリの重複を排除します。
• Limit – LIMIT 句を評価します。
API Version 2012-12-01
102
Amazon Redshift データベース開発者ガイド
結合例
• Window – ウィンドウ関数を実行します。
• Result – テーブルアクセスを伴わないスカラー関数を実行します。
• Subplan – 特定のサブクエリに使用されます。
• Network – さらに処理するために中間結果をリーダーノードに送ります。
• Materialize – ネストループ結合および一部のマージ結合への入力のために行を保存します。
結合例
EXPLAIN 出力は、内部および外部のテーブル結合への参照を公開します。内部テーブルが最初にスキャ
ンされます。これは、一致について調査されるテーブルです。通常、このテーブルはメモリに保持され
ますが、通常はハッシュのソーステーブルであり、可能な場合は、結合される 2 つのテーブルのうち小
さい方になります。外部テーブルは、内部テーブルに対して一致させる行のソースです。通常、ディス
クからオンザフライで読み取られます。クエリの FROM 句のテーブルの順序により、どのテーブルが
内部でどのテーブルが外部かは決まりません。
結合の EXPLAIN 出力は、データを再分散する方法(結合を容易にするためにクラスター周囲にデータ
を移動する方法)も指定します。このデータの移動は、ブロードキャストまたは再分散のいずれかとす
ることができます。ブロードキャストでは、結合の一方の側からのデータ値は、各コンピューティング
ノードから他方の各コンピューティングノードにコピーされ、各コンピューティングノードはデータの
完全なコピーで終了します。再分散では、特定のデータ値は現在のスライスから新しいスライス(別の
ノードにある場合があります)に送信されます。通常、データは再分散され、結合で該当する他方の
テーブルの分散キーと一致します(その分散キーが結合する列の 1 つである場合)。いずれのテーブル
にも、結合する列の 1 つに分散キーがない場合、両方のテーブルが分散されるか、内部テーブルが各
ノードにブロードキャストされます。
結合の EXPLAIN 出力には次の属性が表示されます。
DS_BCAST_INNER
内部テーブル全体のコピーをすべてのコンピューティングノードにブロードキャストします。
DS_DIST_NONE
いずれのテーブルも分散されません。該当するスライスは、ノード間でデータを移動せずに結合さ
れるため、コロケーテッド結合が可能です。
DS_DIST_INNER
内部テーブルが分散されます。
DS_DIST_BOTH
両方のテーブルが分散されます。
結合例
以下の例は、クエリプランナーによって選択されたさまざまな結合アルゴリズムを示しています。これ
らの特定のケースでは、クエリプランでの選択はテーブルの物理的な設計によって異なります。
2 つのテーブルのハッシュ結合
次のクエリは、CATID で EVENT と CATEGORY を結合します。CATID 列は CATEGORY の分散キー
およびソートキーですが、EVENT の分散キーおよびソートキーではありません。ハッシュ結合は、
EVENT を外部テーブルとして、CATEGORY を内部テーブルとして実行されます。CATEGORY は小
さいテーブルなので、プランナーはクエリ処理(DS_BCAST_INNER)中にそのコピーをコンピュー
ティングノードにブロードキャストします。この例の結合コストは、プランの累積コストのほとんどを
占めます。
API Version 2012-12-01
103
Amazon Redshift データベース開発者ガイド
結合例
explain select * from category, event where category.catid=event.catid;
QUERY PLAN
------------------------------------------------------------------------XN Hash Join DS_BCAST_INNER (cost=0.14..6600286.07 rows=8798 width=84)
Hash Cond: ("outer".catid = "inner".catid)
-> XN Seq Scan on event (cost=0.00..87.98 rows=8798 width=35)
-> XN Hash (cost=0.11..0.11 rows=11 width=49)
-> XN Seq Scan on category (cost=0.00..0.11 rows=11 width=49)
(5 rows)
Note
EXPLAIN 出力の演算子が揃ってインデントされていることは、それらの操作が相互に依存せ
ず、並行して開始できることを示している場合があります。この場合、EVENT テーブルおよ
び Hash 操作のスキャンは揃っていませんが、EVENT スキャンは Hash 操作が完全に完了する
まで待機する必要があります。
2 つのテーブルのマージ結合
次のクエリは前の例と同じ構造を持ちますが、LISTID で SALES と LISTING を結合します。この列は、
両方のテーブルの分散キーとソートキーです。マージ結合が選択され、結合にデータの再分散は必要あ
りません(DS_DIST_NONE)。
explain select * from sales, listing where sales.listid = listing.listid;
QUERY PLAN
----------------------------------------------------------------------------XN Merge Join DS_DIST_NONE (cost=0.00..127.65 rows=3766 width=97)
Merge Cond: ("outer".listid = "inner".listid)
-> XN Seq Scan on sales (cost=0.00..37.66 rows=3766 width=53)
-> XN Seq Scan on listing (cost=0.00..1924.97 rows=192497 width=44)
(4 rows)
この例では、同じクエリ内の異なる種類の結合を示します。前の例と同じように、SALES と LISTING
はマージ結合されますが、3 番目のテーブルである EVENT は、マージ結合の結果とハッシュ結合され
る必要があります。ハッシュ結合は、ここでもブロードキャストのコストを発生させます。
explain select * from sales, listing, event
where sales.listid = listing.listid and sales.eventid = event.eventid;
QUERY PLAN
---------------------------------------------------------------------------XN Hash Join DS_DIST_OUTER (cost=2.50..414400186.40 rows=740 width=440)
Outer Dist Key: "inner".eventid
Hash Cond: ("outer".eventid = "inner".eventid)
-> XN Merge Join DS_DIST_NONE (cost=0.00..26.65 rows=740 width=104)
Merge Cond: ("outer".listid = "inner".listid)
-> XN Seq Scan on listing (cost=0.00..8.00 rows=800 width=48)
-> XN Seq Scan on sales (cost=0.00..7.40 rows=740 width=56)
-> XN Hash (cost=2.00..2.00 rows=200 width=336)
-> XN Seq Scan on event (cost=0.00..2.00 rows=200 width=336)
(11 rows)
API Version 2012-12-01
104
Amazon Redshift データベース開発者ガイド
クエリプランのシステムビューへのマップ
結合、集計、およびソートの例
次のクエリは、SALES および EVENT テーブルのハッシュ結合を実行し、続いて集計およびソート操
作を実行して、グループ化された SUM 関数および ORDER BY 句に対応します。最初の Sort 演算子は
コンピューティングノードで並行に実行され、Network 演算子は結果をリーダーノードに送ります。
リーダーノードでは、Merge 演算子がソートされた最終的な結果を作成します。
explain select eventname, sum(pricepaid) from sales, event
where sales.eventid=event.eventid group by eventname
order by 2 desc;
QUERY PLAN
-------------------------------------------------------------------------------XN Merge(cost=1000088800178.99..1000088800179.49 rows=200 width=330)
Merge Key: sum(sales.pricepaid)
->XN Network (cost=1000088800178.99..1000088800179.49 rows=200 width=330)
Send to leader
-> XN Sort(cost=1000088800178.99..1000088800179.49 rows=200 width=330)
Sort Key: sum(sales.pricepaid)
-> XN HashAggregate(cost=88800170.85..88800171.35 rows=200 width=330)
-> XN Hash Join DS_DIST_INNER(cost=9.25..880016.15 rows=740 width=330)
Inner Dist Key: sales.eventid
Hash Cond: ("outer".eventid = "inner".eventid)
-> XN Seq Scan on event(cost=0.00..2.00 rows=200 width=322)
-> XN Hash (cost=7.40..7.40 rows=740 width=16)
-> XN Seq Scan on sales(cost=0.00..7.40 rows=740 width=16)
(13 rows)
クエリプランのシステムビューへのマップ
説明プランのみには、必要なすべての詳細はありません。各クエリの実際の実行ステップと統計情報
は、システムビュー SVL_QUERY_SUMMARY (p. 557) および SVL_QUERY_REPORT (p. 553) に記録さ
れます。これらのビューは、EXPLAIN 出力よりも詳細な粒度レベルでクエリアクティビティをキャプ
チャし、クエリアクティビティをモニタリングするために使用できる指標を含みます。クエリの完全な
実行プロファイルを調べるため、最初にクエリを実行し、次にクエリに対して EXPLAIN コマンドを実
行してから、EXPLAIN の出力をシステムビューにマップします。例えば、システムビューを使用して
分散スキューを検出できます。これは、分散キーの選択の再評価が必要なことを示す場合があります。
クエリによるメモリ使用の管理
Topics
• クエリがディスクに書き込みを行っているかどうかの判断 (p. 106)
• ディスクに書き込みを行っているステップの判断 (p. 107)
Amazon Redshift は、クエリ全体をメモリで実行したり、必要に応じてクエリの中間結果をディスクに
スワップしたりする機能をサポートしています。
Amazon Redshift のクエリパフォーマンス結果が予期しているよりも低い場合、クエリは少なくともク
エリ実行の一部をディスクに書き込んでいる可能性があります。全体がメモリで実行されるクエリは、
頻繁にデータをディスクとの間で転送するクエリよりも高速です。
API Version 2012-12-01
105
Amazon Redshift データベース開発者ガイド
クエリがディスクに書き込みを行っているかどうかの判断
Amazon Redshift は DELETE ステートメントの中間結果や、SELECT ステートメントのソート、ハッ
シュ、および集計をディスクに書き込む場合があります。中間結果をディスクに書き込むと、クエリは
システムメモリの制限に達した場合でも継続して実行されますが、ディスク I/O が増えることによりパ
フォーマンスが低下する可能性があります。
最初のステップは、クエリが中間結果をメモリに保持するのではなく、ディスクに書き込むかどうかを
判断することです。次に、説明プランとシステムテーブルを使用して、ディスクに書き込みを行ってい
るステップを特定できます。
クエリがディスクに書き込みを行っているかどうか
の判断
クエリステップが特定のクエリの中間結果をディスクに書き込んだかどうかを判断するには、システム
テーブルクエリの次のセットを使用します。この方法を、SELECT および DELETE ステートメントの
両方を含め、ディスクに書き込むことができるすべての種類のクエリに使用します。
1. 調査中のクエリのクエリ ID を判断するため、次のクエリを発行します。
select query, elapsed, substring
from svl_qlog
order by query
desc limit 5;
このクエリは、次のサンプル出力に示すように、データベーステーブルに対して実行された過去 5
つのクエリのクエリ ID、実行時間、および切り捨てられたクエリテキストを表示します。
query| elapsed |
substring
-----+---------+----------------------------------------------------1026 | 9574270 | select s.seg, s.maxtime, s.label,
s.is_diskbased from query_
1025 | 18672594| select t1.c1 x1, t2.c2 x2 from tbig t1, tbig
t2 where t1.c1
1024 | 84266
| select count(*) as underrepped from ( select
count(*) as a f
1023 | 83217
| select system_status from stv_gui_status
1022 | 39236
| select * from stv_sessions
(5 rows)
2. 出力を調べ、調査中のクエリに一致するクエリ ID を判断します。
3. そのクエリ ID を使用して、次のクエリを発行し、このクエリのステップがディスクに書き込みを
行ったかどうかを判断します。次の例では、クエリ ID 1025 を使用します。
select query, step, rows, workmem, label, is_diskbased
from svl_query_summary
where query = 1025 order by workmem desc;
このクエリは次のサンプル出力を返します。
query| step| rows | workmem | label
| is_diskbased
-----+-----+--------+-----------+---------------+-------------1025 | 0 |16000000| 43205240 |scan tbl=9
| f
1025 | 2 |16000000| 43205240 |hash tbl=142
| t
1025 | 0 |16000000| 55248
|scan tbl=116536| f
API Version 2012-12-01
106
Amazon Redshift データベース開発者ガイド
ディスクに書き込みを行っているステップの判断
1025 | 2
(4 rows)
|16000000|
55248
|dist
| f
4. 出力に目を通します。IS_DISKBASED がいずれかのステップに対して true("t")の場合、そのステッ
プはディスクに書き込みを行いました。前の例では、ハッシュステップの中間結果がディスクに書
き込まれました。
ステップがディスクに書き込みを行い、パフォーマンスに影響していると思われる場合、クエリで利用
できるメモリを増やすための最も簡単なソリューションは、クエリのスロットカウントを増やすことで
す。ワークロード管理(WLM)はクラスターに対して設定された同時実行レベルに従ってクエリキュー
のスロットを予約します(例えば、同時実行レベルが 5 に設定された場合、クエリには 5 つのスロッ
トがあります)。WLM は、クエリで利用可能なメモリを各スロットに割り当てます。スロットカウン
トは wlm_query_slot_count (p. 573) パラメータで設定します。スロットカウントを増やすと、クエリで
利用できるメモリの量が増えます。
ディスクに書き込みを行っているステップの判断
ディスクに書き込みを行っているステップを確認するには、EXPLAIN コマンドとともに、いくつかの
システムテーブルクエリを使用します。
ここでは、EXPLAIN および SVL_QLOG と SVL_QUERY_SUMMARY システムテーブルを使用して、
ディスクに書き込みを行うハッシュ結合クエリを調べるプロセスについて説明します。
次のクエリを調べます。
select t1.c1 x1, t2.c2 x2
from tbig t1, tbig t2
where t1.c1 = t2.c2;
1. クエリのプランを表示するには、次の EXPLAIN コマンドを実行します。
explain select t1.c1 x1, t2.c2 x2 from tbig t1, tbig t2 where t1.c1 = t2.c2;
このコマンドは、次のサンプル出力を表示します。
QUERY PLAN
-------------------------------------------------------------XN Hash Join DS_DIST_INNER (cost=200000.00..40836025765.37
rows=90576537 width=8)
Hash Cond: ("outer".c1 = "inner".c2)
-> XN Seq Scan on tbig t1 (cost=0.00..160000.00 rows=16000000 width=4)
-> XN Hash (cost=160000.00..160000.00 rows=16000000 width=4)
-> XN Seq Scan on tbig t2 (cost=0.00..160000.00 rows=16000000 width=4)
(5 rows)
このプランは、最も内側のノードから開始してクエリが実行され、外側のノードに進むことを示し
ています。クエリはハッシュとともに実行されます。大きなデータセットでは、ハッシュ、集計、
およびソートは、システムでクエリ処理に十分なメモリが割り当てられていない場合に、ディスク
にデータを書き込む可能性が高い関係演算子です。
2. 実際にクエリを実行するには、次のクエリを発行します。
API Version 2012-12-01
107
Amazon Redshift データベース開発者ガイド
ディスクに書き込みを行っているステップの判断
select t1.c1 x1, t2.c2 x2
from tbig t1, tbig t2
where t1.c1 = t2.c2 ;
3. SVL_QLOG ビューを使用して、直前に実行したクエリのクエリ ID を取得するには、次のクエリを
発行します。
select query, elapsed, substring
from svl_qlog order by query desc limit 5;
このコマンドは、Amazon Redshift で実行した最後の 5 つのクエリを表示します。
query | elapsed | substring
-------+---------+-----------------------------------------------1033
| 4592158 | select t1.c1 x1, t2.c2 x2 from tbig t1, tbig t2
1032
| 477285 | select query, step, rows, memory, label,
1031
| 23742
| select query, elapsed, substring from svl_qlog
1030
| 900222 | select * from svl_query_summary limit 5;
1029
| 1304248 | select query, step, rows, memory, label,
(5 rows)
TBIG から選択するクエリは、クエリ 1033 であることがわかります。
4. 前のステップのクエリ ID を使用して、クエリの SVL_QUERY_SUMMARY 情報を表示し、プランの
どの関係演算子がディスクに書き込みを行ったかを確認します(書き込みが行われた場合)。この
クエリでは、ステップを連続してグループ化してから行を基準にグループ化して、処理された行数
を確認します。
select query, step, rows, workmem, label, is_diskbased
from svl_query_summary
where query = 1033
order by workmem desc;
このクエリは次のサンプル出力を返します。
query| step| rows | workmem | label | is_diskbased
-----+-----+--------+-----------+---------------+-------------1033 | 0 |16000000| 141557760 |scan tbl=9
| f
1033 | 2 |16000000| 135266304 |hash tbl=142
| t
1033 | 0 |16000000| 128974848 |scan tbl=116536| f
1033 | 2 |16000000| 122683392 |dist
| f
(4 rows)
5. svl_query_summary 出力を、EXPLAIN ステートメントによって生成されたプランと比較します。
結果を表示して、クエリステップとプランのステップの対応を確認できます。これらのいずれかの
ステップがディスクに移動する場合は、この情報を使用して、処理中の行数と使用中のメモリの量
を判断し、クエリを変更するか、ワークロード管理(WLM)の設定を変更できます。詳細について
は、「ワークロード管理の実装 (p. 111)」を参照してください。
API Version 2012-12-01
108
Amazon Redshift データベース開発者ガイド
ディスクスペースのモニタリング
ディスクスペースのモニタリング
STV_PARTITIONS、STV_TBL_PERM、および STV_BLOCKLIST システムテーブルに対してクエリを
実行して、ディスクスペースに関する情報を取得できます。
Note
これらのシステムテーブルにアクセスするには、スーパーユーザーとしてログインしている必
要があります。
STV_PARTITIONS テーブルを使用してディスクスペースをモニタリングできます。
次のクエリは、使用中の raw ディスクスペースと容量を 1 MB のディスクブロック単位で返します。
raw ディスク容量には、Amazon Redshift が内部用に予約するスペースの分も含まれます。このため、
ユーザーが利用できるディスク容量として表示される名目上のディスク容量より大きな数字になりま
す。Amazon Redshift マネジメントコンソールの [Performance] タブにある [Percentage of Disk Space
Used] メトリックスは、名目上のディスク容量中、クラスターが使用している率をパーセントで報告し
ます。使用容量をクラスターの名目上のディスク容量以内に維持するため、[Percentage of Disk Space
Used] メトリックスを監視することをお勧めします。
Important
クラスターの名目上のディスク容量は超えないようにしてください。名目上のディスク容量を
超えることは、状況によっては可能ではありますが、クラスターの耐障害性が低下し、データ
損失の可能性が増加します。
select owner as node, diskno, used, capacity
from stv_partitions
order by 1, 2, 3, 4;
このクエリは、1 つのノードクラスターに対して次の結果を返します。
node | diskno | used | capacity
-------+--------+------+---------0 |
0 | 245 |
1906185
0 |
1 | 200 |
1906185
0 |
2 | 200 |
1906185
(3 rows)
詳細については、「STV_PARTITIONS (p. 534)」を参照してください。ディスクスペースが不足した場
合は、コンピューティングノードの数を増やすか、より高い容量ノードタイプに変更できます。「クラ
スターの変更」を参照してください。
STV_BLOCKLIST および STV_TBL_PERM を使用して、データベーステーブルに割り当てられたスト
レージの量を判断できます。
STV_BLOCKLIST システムテーブルには、データウェアハウスクラスターの各テーブルに割り当てら
れたブロックの数に関する情報が含まれ、STV_TBL_PERM テーブルには、データベースのすべての永
続テーブルのテーブル ID が含まれます。
次のクエリを発行し、SALES テーブルに割り当てられたブロック数を確認します。
select tbl, count(*)
from stv_blocklist
API Version 2012-12-01
109
Amazon Redshift データベース開発者ガイド
コンパイル済みコード
where tbl in (
select id
from stv_tbl_perm
where name='sales')
group by tbl;
クエリは次の結果を返します。
tbl
| count
--------+------100597 |
100
(1 row)
各データブロックは 1 MB を占有するので、100 ブロックは 100 MB のストレージを表します。
詳細については、「STV_BLOCKLIST (p. 526)」および「STV_TBL_PERM (p. 539)」を参照してくださ
い。
コンパイル済みコードによるベンチマーク
Amazon Redshift は各実行プランに対してコードを生成し、コードをコンパイルして、コンパイル済み
コードセグメントをコンピューティングノードに送ります。コンパイル済みコードは、インタプリタを
使用するオーバーヘッドを排除するため、はるかに高速に実行されます。ただし、コードが最初に生成
およびコンパイルされるときは、最もコストが低いクエリプランであっても、必ずいくらかのオーバー
ヘッドコストが発生します。その結果、最初に実行したときのクエリのパフォーマンスは、誤解を招く
場合があります。クエリのパフォーマンスを評価するには、必ず 2 回目にクエリを実行してください。
アドホッククエリを実行するときは、オーバーヘッドコストは特に顕著になります。コンパイル済み
コードはキャッシュされ、クラスターのセッション間で共有されるので、同じクエリをそれ以降に実行
すると、クエリパラメータが異なっていたり、別のセッションであったとしても高速に実行されます。
これは、最初の生成およびコンパイルステップのスキップが可能なためです。
クエリの実行時間を比較するときは、最初にクエリを実行するときの結果を使用しないでください。そ
の代わり、各クエリの 2 回目の実行時間を比較します。同様に、異なるクライアントから送られた同じ
クエリのパフォーマンスの比較にも注意が必要です。実行エンジンは JDBC 接続プロトコルおよび
ODBC と psql(libpq)接続プロトコルに対して異なるコードを生成します。2 つのクライアントが別
のプロトコルを使用する場合、各クライアントは、対象が同じクエリであっても、コンパイル済みを生
成する最初のコストを発生させます。例えば、SQL Workbench は JDBC 接続プロトコルを使用します
が、PostgreSQL クエリユーティリティ psql は、libpq と呼ばれるライブラリ関数のセットを使用して
接続するので、実行エンジンはコンパイル済みコードの 2 つの明確なバージョンを生成します。ただ
し、同じプロトコルを使用する他のクライアントには、キャッシュされたコードの共有によるメリット
があります。ODBC を使用するクライアントと、libpq とともに psql を実行するクライアントは、コン
パイル済みの同じコードを共有できます。
JDBC フェッチサイズパラメータの設定
Note
フェッチサイズは ODBC ではサポートされません。
デフォルトでは、JDBC ドライバはクエリに対して一度にすべての結果を収集します。その結果、JDBC
接続で大きな結果セットを取得しようとすると、クライアント側のメモリ不足エラーが発生する可能性
API Version 2012-12-01
110
Amazon Redshift データベース開発者ガイド
ワークロード管理の実装
があります。クライアントが 1 つのオールオアナッシングの取得ではなくバッチで結果セットを取得で
きるようにするには、JDBC フェッチサイズパラメータをクライアントアプリケーションで設定しま
す。
Note
大きなデータセットを抽出する必要がある場合は、UNLOAD ステートメントを使用してデータ
を Amazon S3 に転送することをお勧めします。UNLOAD を使用するときは、コンピューティ
ングノードは並行してデータを直接転送します。JDBC を使用してデータを取得するときは、
データはリーダーノードを通じてクライアントにフィルタ処理されます。
最適なパフォーマンスのためには、メモリ不足エラーが発生しない最大の値にフェッチサイズを設定し
ます。フェッチサイズの値を低く設定すると、サーバートリップが増え、それにより実行時間が長くな
ります。サーバーは、クライアントが結果セット全体を取得するまで、WLM クエリスロットおよび関
連メモリを含むリソースを予約します。そうでない場合、クエリはキャンセルされます。フェッチサイ
ズを適切に調整すると、それらのリソースはより迅速に解放され、他のクエリに利用できるようになり
ます。
JDBC フェッチサイズパラメータの詳細については、PostgreSQL のドキュメントで「Getting results
based on a cursor」を参照してください。
ワークロード管理の実装
Topics
• クエリキューの定義 (p. 111)
• WLM キュー割り当てルール (p. 113)
• WLM 設定の変更 (p. 114)
• キューへのクエリの割り当て (p. 114)
• ワークロード管理のモニタリング (p. 115)
ワークロード管理(WLM)を使用して複数のクエリキューを定義し、実行時にクエリを適切なキュー
に配信することができます。
長時間実行されているクエリは、パフォーマンスのボトルネックになる場合があります。例えば、デー
タウェアハウスに 2 つのグループのユーザーがいるとします。1 つのグループは、複数の大きいテーブ
ルから行を選択してソートする、長時間実行されるクエリをときどき送信します。2 番目のグループ
は、1 つまたは 2 つのテーブルから数行のみを選択し、数秒実行される短いクエリを頻繁に送信しま
す。この状況では、実行時間が短いクエリは、実行時間が長いクエリが完了するまでキューで待機しな
ければならない場合があります。
システムパフォーマンスとユーザーエクスペリエンスを改善するには、WLM 設定を変更して、実行時
間が長いクエリと短いクエリ用に異なるキューを作成します。実行時に、ユーザーグループまたはクエ
リグループに従ってクエリをキューに配信できます。
クエリキューの定義
デフォルトでは、クラスターは、5 つのクエリを同時に実行できる 1 つのキューで設定されます。さら
に、Amazon Redshift はクラスターに 1 つの専用 Superuser キューを予約します。このキューの同時
実行レベルは 1 です。Superuser キューは設定可能ではありません。
API Version 2012-12-01
111
Amazon Redshift データベース開発者ガイド
クエリキューの定義
Note
Superuser キューの主な目的は、トラブルシューティングを支援することです。これを使用し
てルーチンクエリを実行しないでください。
クラスターの WLM 設定を変更して、Superuser キューに加えて最大 8 個のクエリキューを定義できま
す。
Amazon Redshift は、WLM 設定に定義されている各キューに対して、固定された同じ配分のサーバー
メモリを割り当てます。Amazon Redshift は、実行時にユーザーグループおよびクエリグループに基づ
いてキューにクエリを割り当てます。実行時にユーザーグループとクエリグループにクエリを割り当て
る方法の詳細については、「キューへのクエリの割り当て (p. 114)」を参照してください。
各キューに対して、以下を指定します。
•
•
•
•
•
同時実行レベル
ユーザーグループ
クエリグループ
ワイルドカード
WLM タイムアウト
同時実行レベル
キューのクエリは、キューに対して定義された同時実行レベルに達するまで、同時に実行されます。そ
の後、以降のキューはキューで待機します。各キューは、最大で同時に 15 個のクエリを実行するよう
に設定できます。ユーザー定義のすべてのキューの最大合計同時実行レベルは、予約された Superuser
キューを除き、15 です。Amazon Redshift はキューの各クエリスロットに、固定された同じ配分のメ
モリを割り当てます。
ユーザーグループ
カンマ区切りのユーザーグループのリストをキューに割り当てることができます。リストされたユー
ザーグループのメンバーがクエリを実行すると、そのクエリは対応するキューで実行されます。キュー
に割り当てることができるユーザーグループの数に設定された制限はありません。
クエリグループ
各キューには、クエリグループのカンマ区切りのリストを割り当てることができます。クエリグループ
はラベルにすぎません。実行時に、一連のクエリにクエリグループラベルを割り当てることができま
す。リストされたクエリグループに割り当てられたクエリは、対応するキューで実行されます。キュー
に割り当てることができるクエリグループの数に設定された制限はありません。
ワイルドカード
ユーザーグループとクエリグループは、個別に、またはワイルドカードを使用してキューに割り当てる
ことができます。例えば、キューのユーザーグループのリストに 'dba_*' を追加すると、'dba_' で
始まるユーザー名のユーザーによって実行されるクエリは、そのキューに割り当てられます。ワイルド
カードはデフォルトでは無効になっています。AWS マネジメントコンソールを通じてキューでワイル
ドカードの使用を有効にするには、[Workload Management Configuration] タブの [Enable User Group
Wildcards] チェックボックスまたは [Enable Query Group Wildcards] チェックボックスをオンにしま
す。API または CLI を通じてワイルドカードを有効にするには、query_group_wild_card の値また
は user_group_wild_card の値を 1 に設定します。
API Version 2012-12-01
112
Amazon Redshift データベース開発者ガイド
WLM キュー割り当てルール
WLM タイムアウト
各キューについて WLM タイムアウト値を設定することで、特定の WLM キュー内でクエリが使用でき
る時間を制限することができます。タイムアウトパラメータは、ミリ秒単位で、クエリをキャンセルす
る前に Amazon Redshift がキューでクエリの実行を待機する時間を指定します。
WLM タイムアウトの機能は statement_timeout (p. 572) 設定パラメータに似ています。ただし、
statement_timeout 設定パラメータがクラスター全体に適用される場合、WLM タイムアウトは WLM
設定の単一のキューに固有であることが異なります。
AWS マネジメントコンソールを使用して WLM タイムアウトパラメータを設定するには、[Workload
Management Configuration] タブに移動し、各キューの [Timeout] フィールドにミリ秒単位の時間を指
定します。WLM タイムアウトを無効にするには、0 を指定するか、フィールドを空にします。WLM タ
イムアウトはデフォルトでは無効になっています。
API または CLI を使用して WLM タイムアウト値を設定するには、max_execution_time パラメータ
を使用します。クラスターの statement_timeout 設定パラメータを設定するには、クラスターの
[Parameter Group] 設定を変更します。パラメータグループの変更の詳細については、「Amazon Redshift
Parameter Groups」を参照してください。
WLM タイムアウト(max_execution_time)および statement_timeout の両方を指定した場合、
短い方のタイムアウトが使用されます。
デフォルトキュー
WLM 設定で定義される最後のキューはデフォルトキューです。デフォルトキューの同時実行レベルと
タイムアウトを設定できますが、ユーザーグループまたはクエリグループを含めることはできません。
デフォルトキューは 8 個のクエリキューおよび 15 個の同時実行クエリという制限に対してカウントさ
れます。
スーパーユーザーキュー
スーパーユーザーキューでクエリを実行するには、ユーザーはスーパーユーザーとしてログインし、事
前定義された 'superuser' クエリグループ内でクエリを実行する必要があります。
WLM キュー割り当てルール
ユーザーがクエリを実行するときに、WLM は次のルールに基づいて、最初に一致するキューにクエリ
を割り当てます。
1. ユーザーがスーパーユーザーとしてログインし、'superuser' というラベルのクエリグループでクエ
リを実行する場合、クエリは Superuser キューに割り当てられます。
2. リストされているユーザーグループにユーザーが属している場合、クエリは対応する最初のキュー
に割り当てられます。
3. リストされているクエリグループ内でユーザーがクエリを実行する場合、クエリは対応する最初の
キューに割り当てられます。
4. クエリがいずれの条件にも一致しない場合、クエリは WLM 設定で定義されている最後のキューであ
るデフォルトキューに割り当てられます。
次の表に、Superuser キューと 4 つのユーザー定義キューを持つ WLM 設定を示します。
API Version 2012-12-01
113
Amazon Redshift データベース開発者ガイド
WLM 設定の変更
キュー割り当ての例
次の例に、前の例でユーザーグループとクエリグループに従ってクエリがキューに割り当てられる方法
を示します。実行時にクエリをユーザーグループとクエリグループに割り当てる方法の詳細について
は、後の「キューへのクエリの割り当て (p. 114)」を参照してください。
この例では、ステートメントの最初のセットで、ユーザーをユーザーグループに割り当てるための 3 つ
の方法を示します。ユーザー analyst1 はユーザーグループ user_group_2 に属しています。analyst1
によって実行されるクエリは、query_group_A のメンバーですが、このクエリは Queue 3 に割り当
てられます。これは、ユーザーグループのチェックが、クエリグループのチェックよりも前に発生する
ためです。
WLM 設定の変更
クエリキューは WLM 設定で定義されます。WLM 設定はパラメータグループの編集可能なパラメータ
(wlm_json_configuration)であり、1 つ以上のクラスターと関連付けることができます。
WLM 設定を作成するための最も簡単な方法は、Amazon Redshift マネジメントコンソールを使用して
キューのセットを定義することです。Amazon Redshift のコマンドラインインターフェイス(CLI)ま
たは Amazon Redshift API を使用することもできます。
WLM 設定の変更の詳細については、「Amazon Redshift Parameter Groups」を参照してください。
Important
WLM 設定を変更した後は、クラスターを再起動する必要があります。
キューへのクエリの割り当て
次の例では、ユーザーグループとクエリグループに従ってクエリをキューに割り当てます。
ユーザーグループに基づくクエリのキューへの割り当て
ユーザーグループ名がキューの定義にリストされている場合、そのユーザーグループのメンバーによっ
て実行されたキューは、対応するキューに割り当てられます。次の例では、ユーザーグループを作成
し、SQL コマンド CREATE USER (p. 225)、CREATE GROUP (p. 210)、および ALTER GROUP (p. 171)
を使用してユーザーをグループに割り当てます。
create group admin_group with user admin246, admin135, sec555;
create user vp1234 in group ad_hoc_group password 'vpPass1234';
alter group admin_group add user analyst44, analyst45, analyst46;
クエリグループへのクエリの割り当て
適切なクエリグループにクエリを割り当てることで、実行時にクエリをキューに割り当てることができ
ます。クエリグループを開始するには、SET コマンドを使用します。
SET query_group TO 'group_label'
API Version 2012-12-01
114
Amazon Redshift データベース開発者ガイド
ワークロード管理のモニタリング
ここで、'group_label' は、WLM 設定でリストされているクエリグループラベルです。
SET query_group コマンドの後で実行するすべてのクエリは、クエリグループをリセットするか、現
在のログインセッションを終了するまで、指定されたクエリグループのメンバーとして実行されます。
Amazon Redshift オブジェクトの設定とリセットの詳細については、SQL コマンドリファレンスの
「SET (p. 289)」および「RESET (p. 255)」を参照してください。
指定するクエリグループラベルは現在の WLM 設定に含まれている必要があります。それ以外の場合、
SET query_group コマンドはクエリキューに対して効果がありません。
TO 句で定義されたラベルはクエリログにキャプチャされるので、このラベルをトラブルシューティン
グに使用できます。query_group 設定パラメータの詳細については、設定リファレンスの
「query_group (p. 571)」を参照してください。
次の例では、クエリグループ 'priority' の一部として 2 つのクエリを実行し、クエリグループをリセット
します。
set query_group to 'priority';
select count(*)from stv_blocklist;
select query, elapsed, substring from svl_qlog order by query desc limit 5;
reset query_group;
Superuser キューへのクエリの割り当て
Superuser キューにクエリを割り当てるには、スーパーユーザーとして Amazon Redshift にログイン
し、'superuser' グループでクエリを実行します。終了したら、クエリグループをリセットし、以降のク
エリが Superuser キューで実行されないようにします。
この例では、2 つのコマンドを Superuser キューで実行するように割り当てます。
set query_group to 'superuser';
analyze;
vacuum;
reset query_group;
ワークロード管理のモニタリング
WLM は、内部的に定義された WLM サービスクラスに従ってクエリキューを設定します。Amazon
Redshift は、これらのサービスクラスと WLM 設定で定義されたキューに従って、いくつかの内部キュー
を作成します。キューおよびサービスクラスという用語は、しばしばシステムテーブルでは同じ意味で
使用されます。
クエリ、キュー、およびサービスクラスは、WLM に固有のシステムテーブルを使用して確認できます。
次の操作を実行するには、次のテーブルに対してクエリを実行します。
• ワークロードマネージャによって追跡されているクエリと、割り当てられているリソースを確認す
る。
• クエリの割り当て先のキューを確認する。
• 現在、ワークロードマネージャによって追跡されているクエリのステータスを確認する。
テーブル名
説明
STL_WLM_ERROR (p. 522)
WLM 関連エラーイベントのログを含みます。
API Version 2012-12-01
115
Amazon Redshift データベース開発者ガイド
ワークロード管理のモニタリング
テーブル名
説明
STL_WLM_QUERY (p. 522)
WLM によって追跡されているクエリをリストします。
STV_WLM_CLASSIFICATION_CONFIG(p.542) WLM 用の現在の分類ルールを表示します。
STV_WLM_QUERY_QUEUE_STATE(p.543) クエリキューの現在の状態を記録します。
STV_WLM_QUERY_STATE (p. 544) WLM によって追跡されているクエリの現在の状態のスナップ
ショットを提供します。
STV_WLM_QUERY_TASK_STATE(p.545) クエリタスクの現在の状態を含みます。
STV_WLM_SERVICE_CLASS_CONFIG(p.546) WLM のサービスクラス設定を記録します。
STV_WLM_SERVICE_CLASS_STATE(p.547) サービスクラスの現在の状態を表示します。
システムテーブルのクエリを追跡するには、タスク ID を使用します。次の例に、最も最近送信された
ユーザークエリのタスク ID を取得する方法を示します。
select task from stl_wlm_query where exec_start_time =(select max(ex
ec_start_time) from stl_wlm_query);
task
-----137
(1 row)
次の例では、現在実行中またはさまざまなサービスクラス(キュー)で待機中のクエリを表示します。
次のクエリは、Amazon Redshift の同時実行ワークロード全体を追跡するのに役立ちます。
select * from stv_wlm_query_state order by query;
xid |task|query|service_| wlm_start_ | state |queue_ | exec_
|
|
|class
| time
|
|time
| time
----+----+-----+--------+-------------+---------+-------+-------2645| 84 | 98 | 3
| 2010-10-... |Returning|
0
| 3438369
2650| 85 | 100 | 3
| 2010-10-... |Waiting |
0
| 1645879
2660| 87 | 101 | 2
| 2010-10-... |Executing|
0
| 916046
2661| 88 | 102 | 1
| 2010-10-... |Executing|
0
| 13291
(4 rows)
前の例では次の 4 つのクエリを示しました。
• 現在実行中のシステムテーブルクエリ(select * from stv_wlm_query_state ... ;)。
• サービスクラス 3 で結果を返すクエリ。
• サービスクラス 3 のキューで待機中のクエリ。サービスクラス 3 には 1 つのクエリタスクがあるの
で、そのサービスクラスでは一度に 1 つのクエリを実行できます。
• 現在、サービスクラス 2 で実行中のクエリ。
API Version 2012-12-01
116
Amazon Redshift データベース開発者ガイド
Amazon Redshift SQL
SQL リファレンス
Topics
• Amazon Redshift SQL (p. 117)
• SQL の使用 (p. 124)
• SQL コマンド (p. 168)
• SQL 関数リファレンス (p. 310)
• 予約語 (p. 464)
Amazon Redshift SQL
Topics
• リーダーノードでサポートされる SQL 関数 (p. 117)
• Amazon Redshift および PostgreSQL (p. 119)
Amazon Redshift は、業界標準の SQL をベースに構築され、大規模データセットを管理する機能やハ
イパフォーマンス分析および分析結果のレポートをサポートする機能が追加されています。
Note
Amazon Redshift SQL では、1 つのステートメントの最大サイズは 16 MB です。
リーダーノードでサポートされる SQL 関数
Amazon Redshift クエリには、コンピューティングノードに配布され実行されるものと、リーダーノー
ドで排他的に実行されるものがあります。
ユーザーによって作成されたテーブルまたはシステムテーブル(STL または STV プレフィックスが付
いたテーブル、SVL または SVV プレフィックスが付いたシステムビュー)をクエリが参照するたび
に、リーダーノードは SQL をコンピューティングノードに配布します。リーダーノード上の PG プレ
フィックス付きカタログ テーブル(PG_TABLE_DEF など)のみを参照するクエリや、いずれのテー
ブルも参照しないクエリは、リーダーノード上で排他的に実行されます。
API Version 2012-12-01
117
Amazon Redshift データベース開発者ガイド
リーダーノードでサポートされる SQL 関数
Amazon Redshift SQL 関数の中にはリーダーノードのみでサポートされるものがあり、コンピューティ
ングノードではサポートされません。リーダーノード専用関数を使用するクエリは、コンピューティン
グノードではなくリーダーノードのみで実行される必要があり、そうでなければエラーが返されます。
リーダーノードで排他的に実行されるべき関数がユーザー定義テーブルまたは Amazon Redshift シス
テムテーブルを参照した場合、ドキュメントにメモとして説明されているとおり、エラーが返されま
す。リーダーノードで排他的に実行される関数については、「リーダーノード専用関数 (p. 311)」を参
照してください。
例
CURRENT_SCHEMA 関数は、リーダーノード専用の関数です。この例では、クエリはテーブルを参照
しないのでリーダーノードで排他的に実行されます。
select current_schema();
結果
current_schema
--------------public
(1 row)
次の例に示すクエリは、システムカタログテーブルを参照するので、リーダーノードで排他的に実行さ
れます。
select * from pg_table_def
where schemaname = current_schema() limit 1;
結果
where schemaname = current_schema() limit 1;
schemaname | tablename | column |
type
| encoding | distkey | sortkey |
notnull
------------+-----------+--------+----------+----------+---------+---------+-------public
| category | catid | smallint | none
| t
|
1 | t
(1 row)
次の例に示すクエリは、コンピューティングノード上の Amazon Redshift システムテーブルを参照す
るので、エラーを返します。
select current_schema(), userid from users;
結果
INFO: Function "current_schema()" not supported.
ERROR: Specified types or functions (one per INFO message) not supported on
Redshift tables.
API Version 2012-12-01
118
Amazon Redshift データベース開発者ガイド
Amazon Redshift および PostgreSQL
Amazon Redshift および PostgreSQL
Topics
• Amazon Redshift と PostgreSQL JDBC および ODBC (p. 119)
• 実装方法が異なる機能 (p. 119)
• サポートされていない PostgreSQL 機能 (p. 120)
• サポートされていない PostgreSQL データ型 (p. 121)
• サポートされていない PostgreSQL 関数 (p. 122)
Amazon Redshift は PostgreSQL 8.0.2 に基づいています。Amazon Redshift と PostgreSQL にはいく
つかの大きな違いがあり、データウェアハウスアプリケーションの設計と開発時には注意が必要です。
Amazon Redshift は、具体的には、大規模データセットに対して複雑なクエリを行う必要があるオンラ
イン分析処理(OLAP)アプリケーションおよびビジネスインテリジェンス(BI)アプリケーション向
けに設計されています。Amazon Redshift は多種多様な要件に対処するので、Amazon Redshift で使用
する専用のデータストレージスキーマおよびクエリ実行エンジンは PostgreSQL の実装とは完全に異な
ります。例えば、オンライントランザクション処理(OLTP)アプリケーションが通常データを行に格
納するのに対し、Amazon Redshift ではメモリ使用およびディスク I/O の最適化を実現する専用のデー
タ圧縮エンコードを使用してデータを列に格納します。セカンダリインデックスや効率的な単一行デー
タ操作オペレーションなど小規模 OLTP 処理に適した一部の PostgreSQL 機能はパフォーマンスを向
上させるために省略されています。
Amazon Redshift データウェアハウスシステムのアーキテクチャの詳細な説明については、「Amazon
Redshift システム概要 (p. 4)」を参照してください。
PostgreSQL 9.x には、Amazon Redshift によってサポートされていない機能が一部含まれています。
さらに、Amazon Redshift SQL と PostgreSQL 8.0.2 との間には、認識しておく必要がある重要な違い
があります。このセクションでは、Amazon Redshift と PostgreSQL 8.0.2 との違いに焦点を当てると
共に、Amazon Redshift SQL 実装を十分に活用したデータウェアハウスを開発するためのガイダンス
を提供します。
Amazon Redshift と PostgreSQL JDBC および ODBC
Amazon Redshift は PostgreSQL 8.0.2 をベースにしているため、互換性を保証するために PostgreSQL
8.x の JDBC および ODBC ドライバーを使用することを強くお勧めします。PostrgreSQL 9.x の JDBC
および ODBC ドライバーの場合は、すべてのアプリケーションで適切に機能するとは限りません。
JDBC ドライバーおよび ODBC ドライバーのインストールの詳細については、「Download the Client
Tools and the Drivers」を参照してください。
JDBC を使用して大きなデータセットを取得する際にユーザー側でメモリ不足エラーが発生することを
避けるため、JDBC フェッチサイズパラメータを指定して、クライアントがデータをバッチ単位でフェッ
チするように設定できます。詳細については、「JDBC フェッチサイズパラメータの設定 (p. 110)」を
参照してください。
Amazon Redshift は JDBC maxRows パラメータを認識しません。その代わり、結果セットを制限する
には LIMIT (p. 284) 句を指定します。また、OFFSET (p. 284) 句を使用して結果セット内の特定の開始点
にスキップすることもできます。
実装方法が異なる機能
Amazon Redshift SQL の多くの言語要素は、対応する PostgreSQL 実装とはパフォーマンス特性が異
なり、使用する構文およびセマンティクスもまったく異なるものとなっています。
API Version 2012-12-01
119
Amazon Redshift データベース開発者ガイド
Amazon Redshift および PostgreSQL
Important
Redshift と PostgreSQL に含まれる共通の要素のセマンティクスは同じであるとみなさないで
ください。判断しかねる差異については、『Amazon Redshift 開発者ガイド』の「SQL コマン
ド (p. 168)」を参照して確認してください。
具体的な例として VACUUM (p. 308) コマンドが挙げられます。これはテーブルのクリーンアップおよび
再編成に使用されます。VACUUM は PostgreSQL バージョンの場合とは機能が異なり、異なるパラメー
タセットを使用します。Amazon Redshift での VACUUM の使い方の詳細については、「テーブルのバ
キューム処理 (p. 86)」を参照してください。
しばしば、データベース管理機能およびツールも異なることがあります。例えば、Amazon Redshift で
は、システムの稼働状況に関する情報を、一連のシステムテーブルおよびビューで確認できる仕組みに
なっています。詳細については、「システムテーブルとビュー (p. 467)」を参照してください。
Amazon Redshift 独自の実装を有する SQL 機能の例を以下に示します。
• CREATE TABLE (p. 211)
Amazon Redshift では、テーブルスペース、テーブル分割、継承、および特定の制約をサポートして
いません。Amazon Redshift の CREATE TABLE では、テーブルに対してソートおよび分散のアルゴ
リズムを定義することで、並列処理を最適化することができます。
• ALTER TABLE (p. 173)
ALTER COLUMN アクションはサポートされていません。
ADD COLUMN の場合、各 ALTER TABLE ステートメントで 1 つの列しか追加できません。
• COPY (p. 187)
Amazon Redshift の COPY コマンドは、Amazon S3 バケットおよび Amazon DynamoDB テーブル
からのデータのロードを可能にし、自動圧縮を容易にすることに特化されています。詳細について
は、「データのロード (p. 53)」セクションおよび COPY コマンドリファレンスを参照してください。
• SELECT (p. 259)
ORDER BY ... NULLS FIRST/LAST はサポートされていません。
• INSERT (p. 248)、UPDATE (p. 304)、および DELETE (p. 231)
WITH はサポートされていません。
• VACUUM (p. 308)
VACUUM のパラメータは完全に異なります。
サポートされていない PostgreSQL 機能
以下の PostgreSQL 機能は Amazon Redshift でサポートされていません。
Important
Redshift と PostgreSQL に含まれる共通の要素のセマンティクスは同じであるとみなさないで
ください。判断しかねる差異については、『Amazon Redshift 開発者ガイド』の「SQL コマン
ド (p. 168)」を参照して確認してください。
• PostgreSQL クエリツール psql のバージョン 8.x のみがサポートされています。
• テーブル分割(範囲およびリストの分割)
• テーブルスペース
API Version 2012-12-01
120
Amazon Redshift データベース開発者ガイド
Amazon Redshift および PostgreSQL
• 制約
• Unique
• 外部キー
• 主キー
• 検査制約
• 排他制約
一意制約、主キー制約、および外部キー制約は許可されますが、情報提供専用です。これらの制約は
システムでは実施されませんが、クエリプランナーによって使用されます。
• 継承
• Postgres システム列
Amazon Redshift SQL ではシステム列を暗黙的に定義しません。ただし、PostgreSQL システム列の
名前は、ユーザー定義の列の名前として使用できません。
http://www.postgresql.org/docs/8.0/static/ddl-system-columns.html を参照してください。
• インデックス
• ウィンドウ関数の NULLS 句
• 照合
•
•
•
•
•
•
•
•
•
Amazon Redshift では、ロケール固有の照合順序またはユーザー定義の照合順序をサポートしていま
せん。「照合順序 (p. 148)」を参照してください。
値式
• 添字付き式
• 配列コンストラクタ
• 行コンストラクタ
ユーザー定義の関数およびストアドプロシージャ
トリガー
外部データの管理(SQL/MED)
テーブル関数
定数テーブルとして使用される VALUES リスト
再帰的なテーブル共通式
シーケンス
フルテキスト検索
サポートされていない PostgreSQL データ型
一般にクエリは、サポートされていないデータ型(明示的または暗黙的なキャストなど)の使用を試み
ると、エラーを返します。ただし、サポートされていないデータ型を使用する一部のクエリはリーダー
ノードで実行されますが、コンピューティングノードでは実行されません。「リーダーノードでサポー
トされる SQL 関数 (p. 117)」を参照してください。
サポートされているデータ型のリストについては、「データ型 (p. 127)」を参照してください。
以下の PostgreSQL データ型は、Amazon Redshift でサポートされていません。
• 配列
• BIT、BIT VARYING
• BYTEA
• コンポジット型
• 日付/時刻型
• INTERVAL
API Version 2012-12-01
121
Amazon Redshift データベース開発者ガイド
Amazon Redshift および PostgreSQL
• TIME
• TIMESTAMP WITH TIMEZONE
• 列挙型
• 幾何型
• JSON
• ネットワークアドレス型
• 数値型
• SERIAL、BIGSERIAL、SMALLSERIAL
• MONEY
• オブジェクト識別子型
• 疑似型
• 範囲型
• テキスト検索型
• TXID_SNAPSHOT
• UUID
• XML
サポートされていない PostgreSQL 関数
サポートされている関数もその多くは、PostgreSQL とセマンティクスや用途が異なります。例えば、
サポートされている関数の中にはリーダーノードでしか実行されないものがあります。また、サポート
されていない関数の中には、リーダーノードで実行された場合、エラーを返さないものがあります。い
くつかのケースでこれらの関数がエラーを返さないからといって、関数が Amazon Redshift によって
サポートされていると受け取るべきではありません。
Important
Redshift と PostgreSQL に含まれる共通の要素のセマンティクスは同じであるとみなさないで
ください。判断しかねる差異については、『Amazon Redshift 開発者ガイド』の「SQL コマン
ド (p. 168)」を参照して確認してください。
詳細については、「リーダーノードでサポートされる SQL 関数 (p. 117)」を参照してください。
以下の PostgreSQL 関数は Amazon Redshift でサポートされていません。
• アクセス特権照会関数
• アドバイザリロック関数
• 集計関数
• STRING_AGG()
• ARRAY_AGG()
• EVERY()
• XML_AGG()
• CORR()
• COVAR_POP()
• COVAR_SAMP()
• REGR_AVGX()、REGR_AVGY()
• REGR_COUNT()
• REGR_INTERCEPT()
• REGR_R2()
API Version 2012-12-01
122
Amazon Redshift データベース開発者ガイド
Amazon Redshift および PostgreSQL
• REGR_SLOPE()
• REGR_SXX()、REGR_SXY()、REGR_SYY()
• VARIANCE()
• 配列関数と演算子
• バックアップ管理関数
• コメント情報関数
• データベースオブジェクト位置関数
• データベースオブジェクトサイズ関数
• 日付/時刻関数と演算子
• CLOCK_TIMESTAMP()
• JUSTIFY_DAYS()、JUSTIFY_HOURS()、JUSTIFY_INTERVAL()
• TRANSACTION_TIMESTAMP()
• データ型フォーマット関数
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
• TO_TIMESTAMP()
ENUM サポート関数
幾何関数と演算子
汎用ファイルアクセス関数
GREATEST()、LEAST()
IS DISTINCT FROM
ネットワークアドレス関数と演算子
数学関数
• DIV()
• SETSEED()
• WIDTH_BUCKET()
セットを返す関数
• GENERATE_SERIES()
• GENERATE_SUBSCRIPTS()
範囲関数と演算子
リカバリ制御関数
リカバリ情報関数
スキーマ可視性照会関数
サーバーシグナリング関数
スナップショット同期関数
シーケンス操作関数
• 文字列関数
• BIT_LENGTH()
• OVERLAY()
• CONVERT()、CONVERT_FROM()、CONVERT_TO()
• ENCODE()
• FORMAT()
• QUOTE_NULLABLE()
• REGEXP_MATCHES()
• REGEXP_REPLACE()
• REGEXP_SPLIT_TO_ARRAY()
• REGEXP_SPLIT_TO_TABLE()
• SUBSTR()
API Version 2012-12-01
123
Amazon Redshift データベース開発者ガイド
SQL の使用
• TRANSLATE()
• システムカタログ情報関数
• システム情報関数
• CURRENT_CATALOG CURRENT_QUERY()
• INET_CLIENT_ADDR()
• INET_CLIENT_PORT()
• INET_SERVER_ADDR() INET_SERVER_PORT()
• PG_CONF_LOAD_TIME()
• PG_IS_OTHER_TEMP_SCHEMA()
• PG_LISTENING_CHANNELS()
• PG_MY_TEMP_SCHEMA()
• PG_POSTMASTER_START_TIME()
• PG_TRIGGER_DEPTH()
•
•
•
•
テキスト検索関数と演算子
トランザクション ID およびスナップショット関数
トリガー関数
ウィンドウ関数
• ROW_NUMBER()
• PERCENT_RANK()
• CUME_DIST()
• XML 関数
SQL の使用
Topics
• SQL リファレンスの規則 (p. 124)
• 基本的要素 (p. 125)
• 式 (p. 148)
• 条件 (p. 152)
SQL 言語は、データベースおよびデータベースオブジェクトを操作するために使用するコマンドおよ
び関数から構成されています。SQL 言語はまた、データ型、式、およびリテラルに関するルールを適
用します。
SQL リファレンスの規則
このセクションでは、SQL リファレンスのセクションに記載されている SQL の式、コマンド、および
関数を記述する際に従うべき規則について説明します。
文字
説明
CAPS
大文字の単語はキーワードです。
[]
角括弧はオプションの引数を示します。角括弧に複数の引数が含まれる場合は、
任意の個数の引数を選択できることを示します。さらに、角括弧で囲まれた引数
の記述された行が複数存在する場合、Amazon Redshift パーサーは、それらの引
数がリストの順番どおりに出現すると予期します。例については、
「SELECT (p. 259)」を参照してください。
API Version 2012-12-01
124
Amazon Redshift データベース開発者ガイド
基本的要素
文字
説明
{}
中括弧は、括弧内の引数の 1 つを選択する必要があることを示します。
|
縦線は、どちらかの引数を選択できることを示します。
イタリック
イタリック体の単語は、プレースホルダーを示します。イタリック体の単語の場
所に適切な値を挿入する必要があります。
...
省略符号は、先行する要素の繰り返しが可能であることを示します。
'
一重引用符に囲まれた単語は、引用符の入力が必要であることを示します。
基本的要素
Topics
•
•
•
•
•
名前と識別子 (p. 125)
リテラル (p. 127)
Null (p. 127)
データ型 (p. 127)
照合順序 (p. 148)
このセクションでは、データベースオブジェクトの名前、リテラル、Null、およびデータ型を操作する
ためのルールについて説明します。
名前と識別子
名前は、データベースオブジェクト(テーブルや列など)と、ユーザーおよびパスワードを識別しま
す。名前という用語と識別子という用語は、ほとんど同じ意味で使用できます。2 種類の識別子があり
ます。標準的な識別子と、引用符で囲まれた(すなわち、区切り記号付き)識別子です。標準的な識別
子と区切り記号付き識別子は、大文字と小文字の区別がありませんが、小文字で表記されます。識別子
は ASCII 文字のみで構成する必要があります。マルチバイト文字はサポートされていません。
標準的な識別子
標準的な SQL 識別子はルールセットに準拠するものであり、以下の条件を満たしている必要がありま
す。
• ASCII 文字、数字、下線文字(_)、またはドル記号($)のみが含まれる。
• アルファベット文字または下線文字で始まる。後続の文字には、英字、数字、下線、またはドル記号
を含めることができる。
• 識別子の長さは 1~72 文字。
• 引用符とスペースは含めない。
• 予約された SQL キーワードではない。
区切り記号付き識別子
区切り記号付き識別子(引用符で囲まれた識別子とも言う)は、二重引用符(")で囲まれます。区切
り記号付き識別子を使用する場合は、そのオブジェクトへのすべての参照で二重引用符を使用する必要
があります。この識別子には、二重引用符以外の任意の文字を含めることができます。したがって、任
意の文字列(スペースやパーセント記号など本来なら無効な文字も含む)で列またはテーブルの名前を
作成できます。
API Version 2012-12-01
125
Amazon Redshift データベース開発者ガイド
基本的要素
区切り記号付き識別子は大文字と小文字の区別はありませんが、小文字で表記されます。文字列内で二
重引用符を使用するには、その二重引用符の前に別の二重引用符文字を置く必要があります。
例
次の表に、区切り記号付き識別子の例、結果として生じる出力、および説明を示します。
構文
結果
説明
"group"
group
GROUP は予約語であるため、これを識別子の中で使用する
には二重引用符が必要です。
""WHERE""
"where"
WHERE も予約語です。文字列内に引用符を含めるには、そ
の引用符を追加の引用符でエスケープします。
"This name"
this name
スペースを保持するために二重引用符が必要です。
"This ""IS IT"""
this "is it"
IS IT を囲んでいる各引用符を名前の一部とするには、その各
引用符の前にそれぞれ追加の引用符を配置する必要がありま
す。
this "is it" という名前の列を持つ group という名前のテーブルを作成するには、以下のように記述しま
す。
create table "group" (
"This ""IS IT""" char(10));
次のクエリは同じ結果を返します。
select "This ""IS IT"""
from "group";
this "is it"
-------------(0 rows)
select "this ""is it"""
from "group";
this "is it"
-------------(0 rows)
次に示す完全に修飾された table.column 構文も同じ結果を返します。
select "group"."this ""is it"""
from "group";
this "is it"
-------------(0 rows)
API Version 2012-12-01
126
Amazon Redshift データベース開発者ガイド
基本的要素
リテラル
リテラルまたは定数は固定データ値であり、一連の文字または数値定数から構成されます。Amazon
Redshift では数種類のリテラルをサポートしています。以下に例を挙げます。
• 数値リテラル。整数、10 進数、および浮動小数点数に使用されます。
• 文字リテラル。文字列、キャラクタ文字列、または文字定数とも呼ばれます。
• 日時および間隔のリテラル。日時データ型で使用されます。
Null
行内で列が見つからない場合、列が不明である場合、または列が適用できない場合、その列は Null 値
であり、または Null を含んでいるといわれます。Null は、主キー制約または NOT NULL 制約によって
制限されないデータ型のフィールドに表示される場合があります。Null は値ゼロまたは空の文字列と等
価ではありません。
Null を含む演算式の結果はいずれも常に Null になります。Null の引数またはオペランドが指定された
場合、連結を除く演算子はすべて Null を返します。
Null かどうかをテストするには、比較条件 IS NULL および IS NOT NULL を使用します。Null はデータ
が不足していることを表現するものなので、Null はいずれかの値または別の Null に等しいわけでも等
しくないわけでもありません。
データ型
Topics
• マルチバイト文字 (p. 128)
• 数値型 (p. 128)
• 文字型 (p. 136)
• 日時型 (p. 139)
• ブール型 (p. 143)
• 型の互換性と変換 (p. 145)
Amazon Redshift によって格納または取得される各値は、データ型と一定の関連するプロパティセット
を有します。データ型は、テーブルが作成されるときと、ストアドプロシージャおよび関数が作成され
るときに宣言されます。データ型は、列または引数に含めることができる値セットを制限します。
次の表に、Amazon Redshift テーブルで使用できるデータ型を一覧表示します。
データ型
別名
説明
SMALLINT
INT2
符号付き 2 バイト整数
INTEGER
INT、INT4
符号付き 4 バイト整数
BIGINT
INT8
符号付き 8 バイト整数
DECIMAL
NUMERIC
精度の選択が可能な真数
REAL
FLOAT4
単精度浮動小数点数
DOUBLE PRECISION
FLOAT8
倍精度浮動小数点数
BOOLEAN
BOOL
論理ブール演算型(true/false)
API Version 2012-12-01
127
Amazon Redshift データベース開発者ガイド
基本的要素
データ型
別名
説明
CHAR
CHARACTER
固定長のキャラクタ文字列
VARCHAR
CHARACTER VARYING
ユーザーによって定義された制限
を持つ可変長キャラクタ文字列
DATE
カレンダー日付(年、月、日)
TIMESTAMP
日付と時刻(タイムゾーンなし)
マルチバイト文字
VARCHAR データ型では、最大 4 バイトの UTF-8 マルチバイト文字をサポートします。5 バイト以上
の文字はサポートされていません。マルチバイト文字を含む VARCHAR 列のサイズを計算するには、
文字数と 1 文字当たりのバイト数を掛けます。例えば、文字列に漢字が 4 文字含まれ、各文字のサイ
ズが 3 バイトである場合は、文字列を格納するのに VARCHAR(12) 列が必要です。
VARCHAR は、次に示す無効な UTF-8 コードポイントをサポートしていません。
• 0xD800~0xDFFF
(バイトシーケンス: ED A0 80~ED BF BF)
• 0xFDD0~0xFDEF、0xFFFE、および 0xFFFF
(バイトシーケンス: EF B7 90~EF B7 AF、EF BF BE、および EF BF BF)
CHAR データ型は、マルチバイト文字をサポートしていません。
数値型
Topics
• 整数型 (p. 128)
• DECIMAL 型または NUMERIC 型 (p. 129)
• 128 ビットの DECIMAL または NUMERIC の列の使用に関する注意事項 (p. 130)
• 浮動小数点型 (p. 130)
• 数値に関する計算 (p. 131)
• 整数リテラルと浮動小数点リテラル (p. 134)
• 数値型を使用する例 (p. 134)
数値データ型には、整数型、10 進数型、および浮動小数点数型などがあります。
整数型
SMALLINT、INTEGER、および BIGINT の各データ型を使用して、各種範囲の数値全体を格納します。
各データ型の許容範囲の外にある値を格納することはできません。
名前
ストレージ
範囲
SMALLINT または INT2
2 バイト
-32768~+32767
INTEGER、INT、または INT4
4 バイト
-2147483648~
+2147483647
API Version 2012-12-01
128
Amazon Redshift データベース開発者ガイド
基本的要素
名前
ストレージ
範囲
BIGINT または INT8
8 バイト
-9223372036854775807
~
9223372036854775807
DECIMAL 型または NUMERIC 型
DECIMAL データ型または NUMERIC データ型を使用し、ユーザー定義の精度で値を格納します。
DECIMAL キーワードと NUMERIC キーワードは、ほぼ同じ意味で使用されます。このドキュメントで
は、このデータ型を表す用語として decimal を優先的に使用します。numeric という用語は一般的に整
数、10 進数、および浮動小数点のデータ型を称する場合に使用します。
ストレージ
範囲
可変。精度が 19 桁を超える未圧縮の DECIMAL
型については最大で 128 ビット。
最大で 38 桁の精度を持つ、128 ビットの符号付
き整数。
テーブル内に DECIMAL 列を定義するには、precision と scale を次のように指定します。
decimal(precision, scale)
precision
値全体での有効な桁の合計。小数点の両側の桁数。例えば、数値 48.2891 の場合は精度が 6、ス
ケールが 4 となります。指定がない場合、デフォルトの精度は 18 です。最大精度は 38 です。
入力値で小数点の左側の桁数が、列の精度から列のスケールを引いて得られた桁数を超えている場
合、入力値を列にコピー(または挿入も更新も)することはできません。このルールは、列の定義
を外れるすべての値に適用されます。例えば、numeric(5,2) 列の値の許容範囲は、-999.99~
999.99 です。
scale
小数点の右側に位置する、値の小数部における小数の桁数です。整数のスケールはゼロです。列の
仕様では、スケール値は精度値以下である必要があります。指定がなければ、デフォルトのスケー
ルは 0 です。最大スケールは 37 です。
テーブルにロードされた入力値のスケールが列のスケールより大きい場合、値は指定されたスケー
ルに丸められます。SALES テーブルの PRICEPAID 列が DECIMAL(8,2) 列である場合を例にとり
ます。DECIMAL(8,4) の値を PRICEPAID 列に挿入すると、値のスケールは 2 に丸められます。
insert into sales
values (0, 8, 1, 1, 2000, 14, 5, 4323.8951, 11.00, null);
select pricepaid, salesid from sales where salesid=0;
pricepaid | salesid
-----------+--------4323.90 |
0
(1 row)
ただし、テーブルから選択された値の明示的なキャストの結果は丸められません。
API Version 2012-12-01
129
Amazon Redshift データベース開発者ガイド
基本的要素
Note
63
DECIMAL(19,0) 列に挿入できる最大の正の値は、9223372036854775807 (2 -1) です。最大
の負の値は -9223372036854775807 です。例えば、値 9999999999999999999 (19 桁の 9
の並び) の挿入を試みると、オーバーフローエラーが発生します。小数点の位置に関係なく、
Amazon Redshift が DECIMAL 数として表現できる最大の文字列は 9223372036854775807
です。例えば、DECIMAL(19,18) 列にロードできる最大値は 9.223372036854775807 です。
これらのルールは、DECIMAL 値が内部で 8 バイト整数として格納されていることから来てい
ます。Amazon Redshift では、19 桁の精度が必要でない場合に、この精度の DECIMAL 値を定
義しないことをお勧めします。
128 ビットの DECIMAL または NUMERIC の列の使用に関する注意事項
精度が 19 桁より高い DECIMAL 列または NUMERIC 列を使用する場合は以下の制約に注意してくださ
い。
• Amazon Redshift では 64 ビットの DECIMAL 値を 128 ビット値に暗黙的に変換しません。64 ビッ
ト値をより高い精度の値に明示的に変換するには、CAST 関数および CONVERT 関数 (p. 446)のよう
な関数を使用する必要があります。
• アプリケーションで最大精度が必要でない場合、DECIMAL 列に最大精度を勝手に割り当てないでく
ださい。128 ビット値は、ディスク容量を 64 ビット値の場合の 2 倍使用するので、クエリの実行時
間が長くなる可能性があります。
浮動小数点型
可変精度の数値を格納するには、REAL および DOUBLE PRECISION のデータ型を使用します。これ
らのデータ型は非正確型です。すなわち、一部の値が近似値として格納されるため、特定の値を格納し
て返すと若干の相違が生じる場合があります。正確な格納および計算が必要な場合は(金額の場合な
ど)、DECIMAL データ型を使用します。
名前
ストレージ
範囲
REAL または FLOAT4
4 バイト
有効な精度桁数は 6 桁
DOUBLE PRECISION、FLOAT8、または FLOAT 8 バイト
有効な精度桁数は 15 桁
例えば、REAL 列への以下の挿入の結果に注目してください。
create table real1(realcol real);
insert into real1 values(12345.12345);
insert into real1 values(123456.12345);
select * from real1;
realcol
--------123456
12345.1
(2 rows)
これらの挿入値は、REAL 列の 6 桁の有効精度桁数の制限に適合するように切り捨てられます。
API Version 2012-12-01
130
Amazon Redshift データベース開発者ガイド
基本的要素
数値に関する計算
ここで、計算とは加算、減算、乗算、および除算といった 2 進算術演算を示しています。このセクショ
ンでは、このような演算の予期される戻り型について、さらに DECIMAL データ型が必要な場合に精度
とスケールを決定するのに適用される特定の計算式について説明します。
クエリ処理中に数値の計算が行われる場合には、計算が不可能であるためにクエリが数値オーバーフ
ローエラーを返すといった状況が発生することがあります。さらに、算出される値のスケールが、変化
したり予期せぬものであったりする状況が発生することもあります。一部の演算については、明示的な
キャスト(型の上位変換)または Amazon Redshift 設定パラメータを使用してこれらの問題を解決で
きます。
SQL 関数を使用した同様の計算の結果の詳細については、「集計関数 (p. 312)」を参照してください。
計算の戻り型
Amazon Redshift で一連の数値データ型がサポートされていると仮定して、次の表に加算、減算、乗
算、および除算の予期される戻り型を示します。表の左側の最初の列は計算の 1 番目のオペランドを示
し、一番上の行は 2 番目のオペランドを示します。
INT2
INT4
INT8
DECIMAL
FLOAT4
FLOAT8
INT2
INT2
INT4
INT8
DECIMAL
FLOAT8
FLOAT8
INT4
INT4
INT4
INT8
DECIMAL
FLOAT8
FLOAT8
INT8
INT8
INT8
INT8
DECIMAL
FLOAT8
FLOAT8
DECIMAL
DECIMAL
DECIMAL
DECIMAL
DECIMAL
FLOAT8
FLOAT8
FLOAT4
FLOAT8
FLOAT8
FLOAT8
FLOAT8
FLOAT4
FLOAT8
FLOAT8
FLOAT8
FLOAT8
FLOAT8
FLOAT8
FLOAT8
FLOAT8
DECIMAL の計算結果の精度とスケール
次の表に、算術演算で DECIMAL 型の結果が返されるときに算出結果の精度とスケールに適用される
ルールの概要を示します。この表で、p1 と s1 は計算における 1 番目のオペランドの精度とスケール
を示し、p2 と s2 は 2 番目のオペランドの精度とスケールを示します(これらの計算に関係なく、結
果の最大精度は 38、結果の最大スケールは 38 です)。
演算
結果の精度とスケール
+ または -
スケール = max(s1,s2)
精度 = max(p1-s1,p2-s2)+1+scale
*
スケール = s1+s2
精度 = p1+p2+1
/
スケール = max(4,s1+p2-s2+1)
精度 = p1-s1+ s2+scale
例えば、SALES テーブルの PRICEPAID 列と COMMISSION 列は両方とも DECIMAL(8,2) 列です。
PRICEPAID を COMMISSION で除算する場合(または COMMISSION を PRICEPAID で除算する場
合)、計算式は次のように適用されます。
API Version 2012-12-01
131
Amazon Redshift データベース開発者ガイド
基本的要素
Precision = 8-2 + 2 + max(4,2+8-2+1)
= 6 + 2 + 9 = 17
Scale = max(4,2+8-2+1) = 9
Result = DECIMAL(17,9)
次の計算は、UNION、INTERSECT、EXCEPT などの集合演算子および COALESCE や DECODE など
の関数を使用して DECIMAL 値に対して演算を実行した場合に、結果として生じる精度とスケールを計
算するための汎用的なルールです。
Scale = max(s1,s2)
Precision = min(max(p1-s1,p2-s2)+scale,19)
例えば、DECIMAL(7,2) 列が 1 つ含まれる DEC1 テーブルと、DECIMAL(15,3) 列が 1 つ含まれる DEC2
テーブルを結合して DEC3 テーブルを作成します。DEC3 のスキーマを確認すれば、列が NUMERIC(15,3)
列になることが分かります。
create table dec3 as select * from dec1 union select * from dec2;
結果
select "column", type, encoding, distkey, sortkey
from pg_table_def where tablename = 'dec3';
column |
type
| encoding | distkey | sortkey
-------+---------------+----------+---------+--------c1
| numeric(15,3) | none
| f
| 0
上記の例では、計算式は次のように適用されます。
Precision = min(max(7-2,15-3) + max(2,3), 19)
= 12 + 3 = 15
Scale = max(2,3) = 3
Result = DECIMAL(15,3)
除算演算に関する注意事項
除算演算の場合、ゼロ除算を行うとエラーが返されます。
精度とスケールが計算されると、スケール制限 100 が適用されます。算出された結果スケールが 100
より大きい場合、除算結果は次のようにスケーリングされます。
• 精度 = precision - (scale - max_scale)
• スケール = max_scale
算出された精度が最大精度 (38) より高い場合、精度は 38 に引き下げられ、スケールは max(scale (precision -38), min(4, 100)) で計算された結果となります。
API Version 2012-12-01
132
Amazon Redshift データベース開発者ガイド
基本的要素
オーバーフロー条件
すべての数値計算についてオーバーフローが調べられます。精度が 19 以下の DECIMAL データは 64
ビットの整数として格納されます。精度が 19 を上回る DECIMAL データは 128 ビットの整数として格
納されます。すべての DECIMAL 値の最大精度は 38 であり、最大スケールは 37 です。値がこれらの
制限を超えるとオーバーフローエラーが発生します。このルールは中間結果セットと最終結果セットの
両方に適用されます。
• 特定のデータ値がキャスト関数で指定された所定の精度またはスケールに適合していない場合、明示
的なキャストでは実行時オーバーフローエラーが生じます。例えば、SALES テーブルの PRICEPAID
列(DECIMAL(8,2) 列)からの値をすべてキャストできるとは限らないので、結果として DECIMAL(7,3)
を返すことはできません。
select pricepaid::decimal(7,3) from sales;
ERROR: Numeric data overflow (result precision)
このエラーは、PRICEPAID 列に含まれる大きな値のいくつかををキャストできないために発生しま
す。
• 乗算演算によって得られる結果では、結果スケールが各オペランドのスケールを足し算した値となり
ます。例えば、両方のオペランドとも 4 桁のスケールを持っている場合、結果としてスケールは 8
桁となり、小数点の左側には 10 桁のみが残ります。したがって、有効スケールを持つ 2 つの大きな
数値を乗算する場合は、比較的簡単にオーバーフロー状態に陥ります。
• 64 ビットの DECIMAL 値を上位の精度に暗黙的にキャストすると、数値オーバーフローエラーが発
生します。オーバーフローエラーを回避するには、CAST 関数および CONVERT 関数 (p. 446) などの
関数を使用して 64 ビットの DECIMAL 値を上位の精度に明示的にキャストします。SALES テーブ
ルの PRICEPAID 列が DECIMAL(8,2) 列である場合を例にとります。この列内の値を、精度を 19 桁
よりも上位の精度(例えば、100000000000000000000)に引き上げる値と乗算するには、式を次の
ようにキャストします。
select salesid, pricepaid::decimal(38,2) * 100000000000000000000
as value from sales where salesid=2;
salesid |
value
---------+--------------------------2 | 7600000000000000000000.00
(1 row)
INTEGER 型および DECIMAL 型での数値計算
計算式のオペランドの一方が INTEGER データ型を持っており、他方のオペランドが DECIMAL データ
型を持っている場合、INTEGER オペランドは DECIMAL として暗黙的にキャストされます。
• INT2 (SMALLINT) は、DECIMAL(5,0) としてキャストされます。
• INT4 (INTEGER) は、DECIMAL(10,0) としてキャストされます。
• INT8 (BIGINT) は、DECIMAL(19,0) としてキャストされます。
例えば、DECIMAL(8,2) 列の SALES.COMMISSION と、SMALLINT 列の SALES.QTYSOLD を乗算す
る場合、この計算は次のようにキャストされます。
DECIMAL(8,2) * DECIMAL(5,0)
API Version 2012-12-01
133
Amazon Redshift データベース開発者ガイド
基本的要素
整数リテラルと浮動小数点リテラル
数値を表現するリテラルまたは定数は、整数または浮動小数点数になり得ます。
整数リテラル
整数定数は一連の 0~9 の数字であり、この一連の数字の先頭にはオプションで正(+)符号または負
(-)符号が付けられます。
概要
[ + | - ] digit ...
例
有効な整数の例を次に示します。
23
-555
+17
浮動小数点リテラル
浮動小数点リテラル(10 進リテラル、数値リテラル、分数リテラルとも呼ばれる)は、小数点を含む
ことができるほか、必要に応じて指数マーカー(e)も含むことができる一連の数字です。
概要
[ + | - ] digit ... [ . ] [ digit ...]
[ e | E [ + | - ] digit ... ]
引数
e|E
e または E は、数値が科学的表記で指定されていることを示します。
例
有効な浮動小数点リテラルの例を次に示します。
3.14159
-37.
2.0e19
-2E-19
数値型を使用する例
CREATE TABLE ステートメント
次の CREATE TABLE ステートメントでは、さまざまな数値データ型を実際に宣言しています。
create table film (
film_id integer,
language_id smallint,
API Version 2012-12-01
134
Amazon Redshift データベース開発者ガイド
基本的要素
original_language_id smallint,
rental_duration smallint default 3,
rental_rate numeric(4,2) default 4.99,
length smallint,
replacement_cost real default 25.00);
範囲外の整数を挿入する試み
次の例では、値 33000 を INT 列に挿入しようとしています。
insert into film(language_id) values(33000);
INT の範囲は、-32768~+32767 なので、Amazon Redshift はエラーを返します。
An error occurred when executing the SQL command:
insert into film(language_id) values(33000)
ERROR: smallint out of range [SQL State=22003]
整数列への 10 進値の挿入
次の例では、10 進値を INT 列に挿入します。
insert into film(language_id) values(1.5);
この値は挿入されますが、整数値 2 に切り上げられます。
10 進値のスケールが丸められるため挿入に成功する場合
次の例では、列よりも上位の精度を持つ 10 進値を挿入します。
insert into film(rental_rate) values(35.512);
この例では、値 35.51 が列に挿入されます。
範囲外の 10 進値を挿入する試み
この場合、値 350.10 は範囲外です。DECIMAL 列内の値の桁数は、列の精度からそのスケールを引い
た結果となります(RENTAL_RATE 列の場合は 4 から 2 を引いた結果)。すなわち、DECIMAL(4,2)
列の許容範囲は、-99.99~99.99 です。
insert into film(rental_rate) values (350.10);
ERROR: numeric field overflow
DETAIL: The absolute value is greater than or equal to 10^2 for field with
precision 4, scale 2.
REAL 列への可変精度値の挿入
次の例では可変精度値を REAL 列に挿入します。
insert into film(replacement_cost) values(1999.99);
insert into film(replacement_cost) values(19999.99);
API Version 2012-12-01
135
Amazon Redshift データベース開発者ガイド
基本的要素
select replacement_cost from film;
replacement_cost
-----------------20000
1999.99
...
値 19999.99 は、列の 6 桁の精度要件を満たすために 20000 に変換されます。値 1999.99 はそのま
まロードされます。
文字型
Topics
• ストレージと範囲 (p. 136)
• CHAR または CHARACTER (p. 137)
•
•
•
•
•
VARCHAR または CHARACTER VARYING (p. 137)
NCHAR 型および NVARCHAR 型 (p. 137)
TEXT 型および BPCHAR 型 (p. 137)
末尾の空白の重要性 (p. 137)
文字型を使用する例 (p. 138)
文字データ型には、CHAR(文字)や VARCHAR(可変文字)などがあります。
ストレージと範囲
CHAR および VARCHAR のデータ型は、文字単位でなくバイト単位で定義されます。CHAR 列にはシ
ングルバイト文字のみを含めることができます。したがって、CHAR(10) 列には、最大 10 バイト長の
文字列を含めることができます。VARCHAR にはマルチバイト文字(1 文字あたり最大で 4 バイトま
で)を含めることができます。例えば、VARCHAR(12) 列には、シングルバイト文字なら 12 個、2 バ
イト文字なら 6 個、3 バイト文字なら 4 個、4 バイト文字なら 3 個含めることができます。
名前
ストレージ
範囲(列の幅)
CHAR または CHARACTER
文字列の長さ。末
尾の空白を含む
(存在する場
合)。
4096 バイト
VARCHAR または CHARACTER
VARYING
4 バイト + 文字の
合計バイト数(こ
こで、各文字は 1
~4 バイト)。
65535 バイト(64K -1)
Note
CREATE TABLE 構文では、文字データ型の MAX キーワードをサポートします。以下に例を
示します。
create table test(col1 varchar(max));
MAX 設定は列幅を定義します。CHAR の場合は 4096 バイトであり、VARCHAR の場合は
65535 となります。
API Version 2012-12-01
136
Amazon Redshift データベース開発者ガイド
基本的要素
CHAR または CHARACTER
固定長の文字列を格納するには、CHAR または CHARACTER を使用します。これらの文字列は空白で
埋められるので、CHAR(10) 列は常に 10 バイトのストレージを占有します。
char(10)
長さの指定がない場合 CHAR 列は、CHAR(1) 列になります。
VARCHAR または CHARACTER VARYING
一定の制限を持つ可変長の文字列を格納するには、VARCHAR 列または CHARACTER VARYING 列を
使用します。これらの文字列は空白で埋められないので、VARCHAR(120) 列は、最大で 120 個のシン
グルバイト文字、60 個の 2 バイト文字、40 個の 3 バイト文字、または 30 個の 4 バイト文字で構成さ
れます。
varchar(120)
長さの指定子なしで VARCHAR データ型を使用すると、デフォルト長は 256 になります。
NCHAR 型および NVARCHAR 型
NCHAR 型および NVARCHAR 型(NATIONAL CHARACTER 型および NATIONAL CHARACTER
VARYING 型と呼ぶこともある)で、列を作成できます。これらの型はそれぞれ CHAR 型と VARCHAR
型に変換され、指定されたバイト数で格納されます。
長さを指定しない場合、NCHAR 列は CHAR(1) 列に変換されます。
長さを指定しない場合、NVARCHAR 列は VARCHAR(256) 列に変換されます。
TEXT 型および BPCHAR 型
TEXT 列を使用して Amazon Redshift テーブルを作成できますが、この列は最大 256 文字の可変長値
を受け入れる VARCHAR(256) 列に変換されます。
BPCHAR(空白で埋められる文字)型を使用して Amazon Redshift 列を作成できますが、この列は
Amazon Redshift によって固定長の CHAR(256) 列に変換されます。
末尾の空白の重要性
CHAR と VARCHAR のデータ型は両方とも、最大 n バイト長の文字列を格納できます。それよりも長
い文字列をこれらの型の列に格納しようとすると、エラーが発生します。ただし、余分な文字がすべて
スペース(空白)ならば例外で、文字列は最大長に切り捨てられます。文字列の長さが最大長よりも短
い場合、CHAR 値は空白で埋められますが、VARCHAR 値では空白なしで文字列を格納します。
CHAR 値の末尾の空白はいつも意味的に重要であるとは限りません。末尾の空白は、LENGTH 計算を
含めないで 2 つの CHAR 値を比較するときは無視され、CHAR 値を別の文字列型に変換するときは削
除されます。
VARCHAR および CHAR の値の末尾の空白は、値が比較されるとき、意味的に重要でないものとして
扱われます。
長さの計算によって返される VARCHAR キャラクタ文字列の長さには末尾の空白が含められます。固
定長のキャラクタ文字列の長さを計算する場合、末尾の空白はカウントされません。
API Version 2012-12-01
137
Amazon Redshift データベース開発者ガイド
基本的要素
文字型を使用する例
CREATE TABLE ステートメント
次の CREATE TABLE ステートメントでは、VARCHAR および CHAR のデータ型を実際に使用してい
ます。
create table address(
address_id integer,
address1 varchar(100),
address2 varchar(50),
district varchar(20),
city_name char(20),
state char(2),
postal_code char(5)
);
次の例では、このテーブルを使用しています。
可変キャラクタ文字列における末尾の空白
ADDRESS1 は VARCHAR 列であるため、2 番目の挿入アドレスの末尾の空白は意味的に重要ではあり
ません。すなわち、これらの 2 つの挿入アドレスは一致します。
insert into address(address1) values('9516 Magnolia Boulevard');
insert into address(address1) values('9516 Magnolia Boulevard
');
select count(*) from address
where address1='9516 Magnolia Boulevard';
count
------2
(1 row)
もし ADDRESS1 列が CHAR 列であり、同じ値が挿入されたと仮定すると、COUNT(*) クエリはキャ
ラクタ文字列を同じものとして認識し、2 を返します。
LENGTH 関数の結果
LENGTH 関数は VARCHAR 列内の末尾の空白を認識します。
select length(address1) from address;
length
-------23
25
(2 rows)
CITY_NAME 列(CHAR 列)の Augusta の値は、入力文字列内の末尾の空白に関係なく、常に 7 文字
になります。
API Version 2012-12-01
138
Amazon Redshift データベース開発者ガイド
基本的要素
列の長さを超える値
キャラクタ文字列は、宣言された列幅に適合するように切り捨てられません。
insert into address(city_name) values('City of South San Francisco');
ERROR: value too long for type character(20)
この問題の解決策は、値を列のサイズにキャストすることです。
insert into address(city_name)
values('City of South San Francisco'::char(20));
この場合は、文字列の最初の 20 文字(City of South San Fr)が列にロードされます。
日時型
Topics
•
•
•
•
•
•
ストレージと範囲 (p. 139)
DATE (p. 139)
TIMESTAMP (p. 139)
日時型を使用する例 (p. 140)
日付とタイムスタンプのリテラル (p. 140)
間隔リテラル (p. 142)
日時データ型には DATE および TIMESTAMP があります。
ストレージと範囲
名前
ストレージ
範囲
解決
DATE
4 バイト
4713 BC~5874897 AD
1日
TIMESTAMP 8 バイト
4713 BC~5874897 AD
1 マイクロ秒
DATE
タイムスタンプなしで単純にカレンダー日付だけを格納するには DATE データ型を使用します。
TIMESTAMP
日付と時刻を含む完全なタイムスタンプ値を格納するには TIMESTAMP データ型を使用します。
TIMESTAMP 列に値を格納する場合、小数秒の精度については最大で 6 桁まで格納されます。
タイムスタンプ列に日付または部分的なタイムスタンプを持つ日付を挿入すると、値は暗黙的に完全な
タイムスタンプ値に変換され、時、分、および秒が欠落している場合はデフォルト値(00)が使用さ
れます。
ユーザーテーブルと Amazon Redshift システムテーブルでは、TIMESTAMP 値は現地時間ではなく UTC
になります。
Note
タイムゾーンを持つタイムスタンプはサポートされていません。
API Version 2012-12-01
139
Amazon Redshift データベース開発者ガイド
基本的要素
日時型を使用する例
日付の例
形式が異なる複数の日付を挿入して、出力を表示します。
create table datetable (start_date date, end_date date);
insert into datetable values ('2008-06-01','2008-12-31');
insert into datetable values ('Jun 1,2008','20081231');
select * from datetable order by 1;
start_date | end_date
-----------------------2008-06-01 | 2008-12-31
2008-06-01 | 2008-12-31
DATE 列にタイムスタンプ値を挿入しようとした場合、時間リテラルは切り捨てられ、日付自体がロー
ドされます。
タイムスタンプの例
日付を TIMESTAMP 列に挿入すると、時刻はデフォルトでは午前 0 時になります。例えば、リテラル
20081231 を挿入すると、格納される値は 2008-12-31 00:00:00 です。
形式の異なる複数のタイムスタンプを挿入して、出力を表示します。
create table tstamp(timeofday timestamp);
insert into tstamp values('20081231 09:59:59');
insert into tstamp values('20081231 18:20');
select * from tstamp order by 1;
timeofday
--------------------2008-12-31 09:59:59
2008-12-31 18:20:00
(2 rows)
日付とタイムスタンプのリテラル
日付
次に示す入力日付はすべて、Amazon Redshift テーブルにロードできる有効なリテラル日付値の例で
す。デフォルトの MDY DateStyle モードが有効であるとみなされています。すなわち、月の値が日の
値に先行します(1999-01-08 や 01/02/00 など)。
API Version 2012-12-01
140
Amazon Redshift データベース開発者ガイド
基本的要素
Note
日付またはタイムスタンプのリテラルをテーブルにロードするには、それらのリテラルを引用
符で囲む必要があります。
入力日付
完全な日付
January 8, 1999
January 8, 1999
1999-01-08
January 8, 1999
1/8/1999
January 8, 1999
01/02/00
2000 年 1 月 2 日
2000-Jan-31
2000 年 1 月 31 日
Jan-31-2000
2000 年 1 月 31 日
31-Jan-2000
2000 年 1 月 31 日
20080215
2008 年 2 月 15 日
080215
2008 年 2 月 15 日
2008.366
2008 年 12 月 31 日(日付の 3 桁部分は 001~366
である必要があります)
タイムスタンプ
次に示す入力タイムスタンプはすべて、Amazon Redshift テーブルにロードできる有効なリテラル時刻
値の例です。有効な日付リテラルはすべて、以下の時刻リテラルと結合することができます。
入力タイムスタンプ(日付と時刻が結合されてい 説明(時刻部分)
る)
20080215 04:05:06.789
午前 4 時 5 分 6.789 秒
20080215 04:05:06
午前 4 時 5 分 6 秒
20080215 04:05
午前 4 時 5 分ちょうど
20080215 040506
午前 4 時 5 分 6 秒
20080215 04:05 AM
午前 4 時 5 分ちょうど。AM はオプション
20080215 04:05 PM
午後 4 時 5 分ちょうど。時値は < 12 である必要
があります。
20080215 16:05
午後 4 時 5 分ちょうど
20080215
午前 0 時(デフォルト)
特殊な日時値
次に示す特殊な値は、日時リテラルとして、および日付関数に渡す引数として使用できます。このよう
な特殊な値は、一重引用符を必要とし、クエリの処理時に正規のタイムスタンプ値に変換されます。
API Version 2012-12-01
141
Amazon Redshift データベース開発者ガイド
基本的要素
説明
now
現在のトランザクションの開始時間に等しく、マ
イクロ秒の精度を持つタイムスタンプを返しま
す。
today
該当する日付に等しく、時刻部分がゼロのタイム
スタンプを返します。
tomorrow
yesterday
次の例では、nowおよび today が DATEADD 関数とどのように連動して動作するかを示します。
select dateadd(day,1,'today');
date_add
--------------------2009-11-17 00:00:00
(1 row)
select dateadd(day,1,'now');
date_add
---------------------------2009-11-17 10:45:32.021394
(1 row)
間隔リテラル
12 hours または 6 weeks など、特定の期間を識別するには、間隔リテラルを使用します。これらの
間隔リテラルは、日時式を必要とする条件および計算の中で使用できます。
Note
Amazon Redshift テーブル内の列に INTERVAL データ型を使用することはできません。
間隔は、INTERVAL キーワードに数量およびサポートされている日付部分を組み合わせて表現します。
例えば、INTERVAL '7 days' または INTERVAL '59 minutes' のようになります。複数の数量およ
び単位をつなぎ合わせることで、より正確な間隔を作成できます(例えば、INTERVAL '7 days, 3
hours, 59 minutes')。各単位の省略形および複数形もサポートされています。例えば、5 s、5
second、および 5 seconds は等価な間隔です。
日付部分を指定しない場合、間隔値は秒数を示します。数量値は小数として指定できます(例えば、
0.5 days)。
例
次の例に、さまざまな間隔値を使用した一連の計算を示します。
指定された日付に 1 秒を追加します。
select caldate + interval '1 second' as dateplus from date
where caldate='12-31-2008';
dateplus
---------------------
API Version 2012-12-01
142
Amazon Redshift データベース開発者ガイド
基本的要素
2008-12-31 00:00:01
(1 row)
指定された日付に 1 分を追加します。
select caldate + interval '1 minute' as dateplus from date
where caldate='12-31-2008';
dateplus
--------------------2008-12-31 00:01:00
(1 row)
指定された日付に 3 時間と 35 分を追加します。
select caldate + interval '3 hours, 35 minutes' as dateplus from date
where caldate='12-31-2008';
dateplus
--------------------2008-12-31 03:35:00
(1 row)
指定された日付に 52 週を追加します。
select caldate + interval '52 weeks' as dateplus from date
where caldate='12-31-2008';
dateplus
--------------------2009-12-30 00:00:00
(1 row)
指定された日付に 1 週、1 時間、1 分、および 1 秒を追加します。
select caldate + interval '1w, 1h, 1m, 1s' as dateplus from date
where caldate='12-31-2008';
dateplus
--------------------2009-01-07 01:01:01
(1 row)
指定された日付に 12 時間(半日)を追加します。
select caldate + interval '0.5 days' as dateplus from date
where caldate='12-31-2008';
dateplus
--------------------2008-12-31 12:00:00
(1 row)
ブール型
シングルバイト列に true 値および false 値を格納するには、BOOLEAN データ型を使用します。次の表
に、ブール値の取り得る 3 つの状態と、各状態をもたらすリテラル値について説明します。入力文字列
に関係なく、ブール列では、true の場合は「t」を、false の場合は「f」を格納および出力します。
API Version 2012-12-01
143
Amazon Redshift データベース開発者ガイド
基本的要素
状態
有効なリテラル値
ストレージ
True
TRUE 't'
'true' 'y'
'yes' '1'
1 バイト
False
FALSE 'f'
'false' 'n'
'no' '0'
1 バイト
不明
NULL
1 バイト
例
BOOLEAN 列を使用すれば、CUSTOMER テーブル内の顧客ごとに「アクティブ/非アクティブ」状態
を格納できます。
create table customer(
custid int,
active_flag boolean default true
);
insert into customer values(100, default);
select * from customer;
custid | active_flag
---------------------100 | t
CREATE TABLE ステートメントにデフォルト値(true または false)が指定されていない場合は、
デフォルト値を挿入しても Null が挿入されます。
この例では、クエリによって、スポーツは好きだが映画館は好きでないユーザーが USERS テーブルか
ら選択されます。
select firstname, lastname, likesports, liketheatre
from users
where likesports is true and liketheatre is false
order by userid limit 10;
firstname | lastname | likesports | liketheatre
-----------+------------+------------+------------Lars
| Ratliff
| t
| f
Mufutau
| Watkins
| t
| f
Scarlett | Mayer
| t
| f
Shafira
| Glenn
| t
| f
Winifred | Cherry
| t
| f
Chase
| Lamb
| t
| f
Liberty
| Ellison
| t
| f
Aladdin
| Haney
| t
| f
Tashya
| Michael
| t
| f
Lucian
| Montgomery | t
| f
(10 rows)
API Version 2012-12-01
144
Amazon Redshift データベース開発者ガイド
基本的要素
この例では、ロックミュージックを好むかどうか不明なユーザーが USERS テーブルから選択されま
す。
select firstname, lastname, likerock
from users
where likerock is unknown
order by userid limit 10;
firstname | lastname | likerock
-----------+----------+---------Rafael
| Taylor
|
Vladimir | Humphrey |
Barry
| Roy
|
Tamekah
| Juarez
|
Mufutau
| Watkins |
Naida
| Calderon |
Anika
| Huff
|
Bruce
| Beck
|
Mallory
| Farrell |
Scarlett | Mayer
|
(10 rows)
型の互換性と変換
互換性
データ型のマッチング、リテラル値および定数のデータ型とのマッチングは、以下のようなさまざまな
データベース操作で発生します。
•
•
•
•
•
•
テーブルでの DML 操作
UNION、INTERSECT、および EXCEPT のクエリ
CASE 式
LIKE や IN など、述語の評価
データの比較または抽出を行う SQL 関数の評価
算術演算子との比較
これらの操作の結果は、型変換ルールおよびデータ型の互換性に左右されます。互換性は、特定の値と
特定のデータ型との 1 対 1 のマッチングが必ずしも必要でないことを暗示しています。一部のデータ
型は互換性があるので、暗黙変換、または強制が可能です(「暗黙的な変換型 (p. 146)」を参照)。デー
タ型に互換性がない場合は、明示変換関数を使用することにより、値をあるデータ型から別のデータ型
に変換することが可能な場合があります。
互換性と変換に関する全般的なルール
次に示す互換性と変換に関するルールに注意してください。
• 一般に、同じデータ型のカテゴリに属するデータ型(各種の数値データ型)は互換性があり、暗黙的
に変換することができます。
例えば、整数列に 10 進値を挿入することができ、10 進値は整数になるように丸められます。次に、
2008 のような数値を日付から抽出し、整数列に挿入することができます。
• 数値データ型では、範囲外の値を挿入しようとしたときに発生するオーバーフロー条件を適用しま
す。例えば、精度が 5 桁の 10 進値は、4 桁の精度で定義された 10 進列に適合しません。整数また
は 10 進値の整数部は決して切り捨てられません。しかし、10 進値の小数部は、適宜、切り上げまた
は切り捨てることができます。
API Version 2012-12-01
145
Amazon Redshift データベース開発者ガイド
基本的要素
• 各種のキャラクタ文字列型には互換性があります。シングルバイトデータを含む VARCHAR 列の文
字列と CHAR 列の文字列は互換性があり、暗黙的に変換することができます。マルチバイトデータ
を含む VARCHAR 文字列は互換性がありません。また、キャラクタ文字列については、文字列が適
切なリテラル値であれば、日付、タイムスタンプ、または数値に変換することができます。先頭のス
ペースまたは末尾のスペースはいずれも無視されます。逆に、日付、タイムスタンプ、または数値
は、固定長または可変長の文字列に変換することができます。
Note
数値型にキャストするキャラクタ文字列には、数字の文字表現が含まれている必要がありま
す。例えば、文字列 '1.0' または '5.9' を 10 進値にキャストすることはできますが、文
字列 'ABC' はいずれの数値型にもキャストできません。
• キャラクタ文字列と比較される数値は、キャラクタ文字列に変換されます。反対方向の変換(キャラ
クタ文字列を数値に変換する)を実施するには、CAST や CONVERT などの明示的な関数を使用し
ます。
• 64 ビットの DECIMAL または NUMERIC の値を上位の精度に変換するには、CAST 関数および
CONVERT 関数 (p. 446) などの明示的な変換関数を使用する必要があります。
暗黙的な変換型
2 種類の暗黙変換があります。INSERT または UPDATE コマンドの設定値など、割り当てでの暗黙変
換と、WHERE 句での比較の実行など、式における暗黙変換です。下の表に、割り当ておよび式におい
て暗黙的に変換できるデータ型をリストします。これらの変換は、明示的な変換関数を使用して実行す
ることもできます。
次の表に、割り当てまたは式において暗黙的に変換できるデータ型を一覧表示します。
変換元の型
変換先の型
BIGINT(INT8)
VARCHAR
CHAR
SMALLINT(INT2)
INTEGER(INT、INT4)
DATE
VARCHAR
CHAR
DECIMAL(NUMERIC)
VARCHAR
CHAR
SMALLINT(INT2)
INTEGER(INT、INT4)
BIGINT(INT8)
API Version 2012-12-01
146
Amazon Redshift データベース開発者ガイド
基本的要素
変換元の型
変換先の型
DOUBLE PRECISION(FLOAT8)
DECIMAL(NUMERIC)
VARCHAR
CHAR
REAL(FLOAT4)
SMALLINT(INT2)
INTEGER(INT、INT4)
BIGINT(INT8)
INTEGER(INT、INT4)
VARCHAR
CHAR
SMALLINT(INT2)
REAL(FLOAT4)
DECIMAL(NUMERIC)
VARCHAR
CHAR
SMALLINT(INT2)
INTEGER(INT、INT4)
BIGINT(INT8)
SMALLINT(INT2)
VARCHAR
CHAR
TIMESTAMP
DATE
VARCHAR
CHAR
次の表に、式のみにおいて暗黙的に変換できるデータ型を一覧表示します。
変換元の型
変換先の型
BIGINT(INT8)
BOOLEAN
DECIMAL(NUMERIC)
DOUBLE PRECISION(FLOAT8)
REAL(FLOAT4)
CHAR
VARCHAR
CHAR
DATE
TIMESTAMP
API Version 2012-12-01
147
Amazon Redshift データベース開発者ガイド
式
変換元の型
変換先の型
DECIMAL(NUMERIC)
DECIMAL(NUMERIC)
DOUBLE PRECISION(FLOAT8)
REAL(FLOAT4)
INTEGER(INT、INT4)
BOOLEAN
DECIMAL(NUMERIC)
DOUBLE PRECISION(FLOAT8)
REAL(FLOAT4)
BIGINT(INT8)
REAL(FLOAT4)
DOUBLE PRECISION(FLOAT8)
SMALLINT(INT2)
BOOLEAN
DECIMAL(NUMERIC)
DOUBLE PRECISION(FLOAT8)
REAL(FLOAT4)
INTEGER(INT、INT4)
BIGINT(INT8)
TIMESTAMP
TIMESTAMP
VARCHAR
DECIMAL(NUMERIC)
VARCHAR
CHAR(シングルバイト VARCHAR からのみ)
照合順序
Amazon Redshift では、ロケール固有の照合順序またはユーザー定義の照合順序をサポートしていませ
ん。一般に、コンテキストでの述語の結果は、データ値のソートおよび比較に関するロケール固有の
ルールがないことに影響を受ける可能性があります。例えば、ORDER BY 式と、MIN、MAX、および
RANK などの関数は、ロケール固有の文字を考慮に入れないデータのバイナリ UTF8 順序付けに基づい
て結果を返します。
式
Topics
• 単純式 (p. 149)
• 複合式 (p. 149)
• 式リスト (p. 150)
• スカラーサブクエリ (p. 151)
• 関数式 (p. 151)
API Version 2012-12-01
148
Amazon Redshift データベース開発者ガイド
式
式は、1 つまたは複数の値、演算子、または関数(評価して値を返す)の組み合わせです。式のデータ
型は、一般にそのコンポーネントのデータ型と同じです。
単純式
単純式は以下のいずれかとなります。
• 定数またはリテラル値
• 列名または列参照
• スカラー関数
• 集計(set)関数
• ウィンドウ関数
• スカラーサブクエリ
単純式には次のようなものがあります。
5+12
dateid
sales.qtysold * 100
sqrt (4)
max (qtysold)
(select max (qtysold) from sales)
複合式
複合式は、一連の単純式が算術演算子によって結合されたものです。複合式内で使用される単純式は、
数値を返す必要があります。
概要
expression
operator
expression | (compound_expression)
引数
expression
評価して値を返す単純式。
operator
複合演算式は、以下の演算子(優先順位は列記順)を使用して作成することができます。
• ( ) : 評価の順番を制御する括弧
• + , - : 正および負の符号/演算子
• ^ , |/ , ||/ : 指数、平方根、立方根
• * , / , % : 乗算演算子、除算演算子、モジュロ演算子
• @ : 絶対値
• + , - : 加算および減算
• & , |, #, ~, <<, >> : AND、OR、XOR、NOT、左シフト、右シフトのビット演算子
• ||: 連結
(compound_expression)
複合式は括弧を使用して入れ子にすることができます。
API Version 2012-12-01
149
Amazon Redshift データベース開発者ガイド
式
例
複合式の例を以下に示します。
('SMITH' || 'JONES')
sum(x) / y
sqrt(256) * avg(column)
rank() over (order by qtysold) / 100
(select (pricepaid - commission) from sales where dateid = 1882) * (qtysold)
また、一部の関数は、他の関数内に入れ子にすることができます。例えば、任意のスカラー関数を別の
スカラー関数内に入れ子にすることができます。次の例では、一連の数の絶対値の合計を返します。
sum(abs(qtysold))
ウィンドウ関数は、集計関数または他のウィンドウ関数の引数として使用できません。次の式は、エ
ラーを返すことになります。
avg(rank() over (order by qtysold))
ウィンドウ関数には入れ子にした集計関数を含めることができます。次の式は、値セットの合計を出
し、ランク付けします。
rank() over (order by sum(qtysold))
式リスト
式リストは、式の組み合わせであり、メンバーシップおよび比較条件(WHERE 句)内、および GROUP
BY 句内に指定できます。
概要
expression , expression , ... | (expression, expression, ...)
引数
expression
評価して値を返す単純式。式リストには、1 つまたは複数のカンマ区切り式、または 1 つまたは複
数のカンマ区切り式セットを含めることができます。複数の式セットがある場合、各セットはそれ
ぞれ同じ個数の式を含み、括弧で区切る必要があります。各セット内の式の個数は、条件内の演算
子の前にある式の個数と一致する必要があります。
例
条件内の式リストの例を次に示します。
(1, 5, 10)
('THESE', 'ARE', 'STRINGS')
(('one', 'two', 'three'), ('blue', 'yellow', 'green'))
各セット内の式の個数は、ステートメントの最初の部分にある式の個数と一致する必要があります。
API Version 2012-12-01
150
Amazon Redshift データベース開発者ガイド
式
select * from venue
where (venuecity, venuestate) in (('Miami', 'FL'), ('Tampa', 'FL'))
order by venueid;
venueid |
venuename
| venuecity | venuestate | venueseats
---------+-------------------------+-----------+------------+-----------28 | American Airlines Arena | Miami
| FL
|
0
54 | St. Pete Times Forum
| Tampa
| FL
|
0
91 | Raymond James Stadium
| Tampa
| FL
|
65647
(3 rows)
スカラーサブクエリ
スカラーサブクエリとは、ちょうど 1 つの値(1 つの列を含む 1 つの行)を返す、括弧で囲まれた通常
の SELECT クエリです。クエリが実行され、返された値は外側のクエリで使用されます。サブクエリ
がゼロを返した場合、サブクエリ式の値は Null になります。サブクエリが複数の行を返した場合、
Amazon Redshift はエラーを返します。サブクエリは親クエリからの変数を参照することができます。
この変数はサブクエリの起動時中には定数として働きます。
式を呼び出すほとんどのステートメントでスカラーサブクエリを使用できます。次のような場合、スカ
ラーサブクエリは有効な式でなくなります。
• 式のデフォルト値として使用
• CASE 式の WHEN 条件内で使用
• GROUP BY 句および HAVING 句内に使用
例
次のサブクエリは 2008 年の 1 年を通して販売 1 回あたりに支払われた平均料金を計算します。次に、
外側のクエリが出力にその値を使用して、四半期ごとの販売 1 回あたりの平均料金と比較します。
select qtr, avg(pricepaid) as avg_saleprice_per_qtr,
(select avg(pricepaid)
from sales join date on sales.dateid=date.dateid
where year = 2008) as avg_saleprice_yearly
from sales join date on sales.dateid=date.dateid
where year = 2008
group by qtr
order by qtr;
qtr | avg_saleprice_per_qtr | avg_saleprice_yearly
-------+-----------------------+---------------------1
|
647.64 |
642.28
2
|
646.86 |
642.28
3
|
636.79 |
642.28
4
|
638.26 |
642.28
(4 rows)
関数式
構文
組み込み関数は式として使用できます。関数呼び出しの構文は、関数名の後に、その引数リストを括弧
に囲んで配置する形式をとります。
API Version 2012-12-01
151
Amazon Redshift データベース開発者ガイド
条件
function ( [expression [, expression...]] )
引数
function
組み込み関数。
expression
関数によって予期されるデータ型およびパラメータの個数と一致する式。
例
abs (variable)
select avg (qtysold + 3) from sales;
select dateadd (day,30,caldate) as plus30days from date;
条件
Topics
• 概要 (p. 152)
• 比較条件 (p. 153)
• 論理条件 (p. 155)
• パターンマッチング条件 (p. 157)
• 範囲条件 (p. 164)
• Null 条件 (p. 165)
• EXISTS 条件 (p. 166)
• IN 条件 (p. 167)
条件は、評価結果として true、false、または unknown を返す、1 つまたは複数の式および論理演算子
から成るステートメントです。条件は述語と呼ばれることもあります。
Note
すべての文字列比較および LIKE パターンマッチングでは、大文字と小文字が区別されます。
例えば、「A」と「a」は一致しません。ただし、ILIKE 述語を使用すれば、大文字小文字を区
別しないパターンマッチングを行うことができます。
概要
comparison_condition
| logical_condition
| range_condition
| pattern_matching_condition
| null_condition
| EXISTS_condition
| IN_condition
API Version 2012-12-01
152
Amazon Redshift データベース開発者ガイド
条件
比較条件
比較条件では、2 つの値の間の論理的な関係を指定します。比較条件はすべて、ブール型の戻り値を返
す 2 項演算子です。Amazon Redshift では、次の表に説明する比較演算子がサポートされています。
演算子
構文
説明
<
a < b
値 a は値 b より小さい。
>
a > b
値 a は値 b より大きい。
<=
a <= b
値 a は値 b 以下。
>=
a >= b
値 a は値 b 以上。
=
a = b
値 a は値 b と等しい。
<> または !=
a <> b or a != b
値 a は値 b と等しくない。
ANY | SOME
a = ANY(subquery)
値 a はサブクエリによって返されるいずれかの値と
等しい。
ALL
a <> ALL or !=
ALL(subquery))
値 a はサブクエリによって返されるどの値とも等し
くない。
IS TRUE |
FALSE |
UNKNOWN
a IS TRUE
値は a はブール数で TRUE。
使用に関する注意事項
= ANY | SOME
ANY と SOME のキーワードは IN 条件と同義であり、1 つまたは複数の値を返すサブクエリによっ
て返された少なくとも 1 つの値に対して比較が true である場合に true を返します。Amazon Redshift
で、ANY および SOME に対してサポートしている条件は =(等しい)のみです。不等条件はサポー
トされていません。
Note
ALL 述語はサポートされていません。
<> ALL
ALL キーワードは NOT IN(「IN 条件 (p. 167)」条件を参照)と同義であり、サブクエリの結果に
式が含まれていない場合に true を返します。Amazon Redshift で、ALL に対してサポートしてい
る条件は <> または !=(等しくない)のみです。他の比較条件はサポートされていません。
IS TRUE/FALSE/UNKNOWN
ゼロ以外の値は TRUE と等しく、0 は FALSE に等しく、Null は UNKNOWN に等しくなります。
「ブール型 (p. 143)」データ型を参照してください。
例
ここで、比較条件の簡単な例をいくつか示します。
a = 5
a < b
API Version 2012-12-01
153
Amazon Redshift データベース開発者ガイド
条件
min(x) >= 5
qtysold = any (select qtysold from sales where dateid = 1882
次のクエリは、VENUE テーブルから席数が 10000 席を超える会場を返します。
select venueid, venuename, venueseats from venue
where venueseats > 10000
order by venueseats desc;
venueid |
venuename
| venueseats
---------+--------------------------------+-----------83 | FedExField
|
91704
6 | New York Giants Stadium
|
80242
79 | Arrowhead Stadium
|
79451
78 | INVESCO Field
|
76125
69 | Dolphin Stadium
|
74916
67 | Ralph Wilson Stadium
|
73967
76 | Jacksonville Municipal Stadium |
73800
89 | Bank of America Stadium
|
73298
72 | Cleveland Browns Stadium
|
73200
86 | Lambeau Field
|
72922
...
(57 rows)
この例では、USERS テーブルからロックミュージックが好きなユーザー(USERID)を選択します。
select userid from users where likerock = 't' order by 1 limit 5;
userid
-------3
5
6
13
16
(5 rows)
この例では、USERSテーブルから、ロックミュージックを好きかどうか不明であるユーザー(USERID)
を選択します。
select firstname, lastname, likerock
from users
where likerock is unknown
order by userid limit 10;
firstname | lastname | likerock
-----------+----------+---------Rafael
| Taylor
|
Vladimir | Humphrey |
Barry
| Roy
|
Tamekah
| Juarez
|
Mufutau
| Watkins |
Naida
| Calderon |
Anika
| Huff
|
Bruce
| Beck
|
API Version 2012-12-01
154
Amazon Redshift データベース開発者ガイド
条件
Mallory
Scarlett
(10 rows
| Farrell
| Mayer
|
|
論理条件
論理条件は、2 つの条件の結果を結合して 1 つの結果を作成します。論理条件はすべて、ブール型の戻
り値を返す 2 項演算子です。
概要
expression
{ AND | OR }
expression
NOT expression
論理条件では 3 値ブール論理を使用します。この場合、Null 値は unknown 関係を表現します。次の表
で論理条件の結果について説明します。ここで、E1 と E2 は式を表します。
E1
E2
E1 AND E2
E1 OR E2
NOT E2
TRUE
TRUE
TRUE
TRUE
FALSE
TRUE
FALSE
FALSE
TRUE
TRUE
TRUE
UNKNOWN
UNKNOWN
TRUE
UNKNOWN
FALSE
TRUE
FALSE
TRUE
FALSE
FALSE
FALSE
FALSE
FALSE
UNKNOWN
FALSE
UNKNOWN
UNKNOWN
TRUE
UNKNOWN
TRUE
UNKNOWN
FALSE
FALSE
UNKNOWN
UNKNOWN
UNKNOWN
UNKNOWN
UNKNOWN
NOT 演算子は AND 演算子より先に評価され、AND 演算子は OR 演算子より先に評価されます。括弧
が使用されている場合、評価のデフォルトの順序より優先されます。
例
次の例では、USERS テーブルから、ラスベガスもスポーツも好きであるユーザーの USERID および
USERNAME を返します。
select userid, username from users
where likevegas = 1 and likesports = 1
order by userid;
userid | username
--------+---------1 | JSG99FHE
67 | TWU10MZT
87 | DUF19VXU
API Version 2012-12-01
155
Amazon Redshift データベース開発者ガイド
条件
92 | HYP36WEQ
109 | FPL38HZK
120 | DMJ24GUZ
123 | QZR22XGQ
130 | ZQC82ALK
133 | LBN45WCH
144 | UCX04JKN
165 | TEY68OEB
169 | AYQ83HGO
184 | TVX65AZX
...
(2128 rows)
次の例では、USERS テーブルから、ラスベガスが好き、スポーツが好き、または両方が好きのいずれ
かに該当するユーザーの USERID と USERNAME を返します。このクエリでは、前の例の出力と、ラ
スベガスのみ好き、またはスポーツのみ好きなユーザーとをすべて返します。
select userid, username from users
where likevegas = 1 or likesports = 1
order by userid;
userid | username
--------+---------1 | JSG99FHE
2 | PGL08LJI
3 | IFT66TXU
5 | AEB55QTM
6 | NDQ15VBM
9 | MSD36KVR
10 | WKW41AIW
13 | QTF33MCG
15 | OWU78MTR
16 | ZMG93CDD
22 | RHT62AGI
27 | KOY02CVE
29 | HUH27PKK
...
(18968 rows)
以下のクエリでは、OR 条件を括弧で囲んで、ニューヨークまたはカリフォルニアにある会場の中でマ
クベスが上演された会場を見つけます。
select distinct venuename, venuecity
from venue join event on venue.venueid=event.venueid
where (venuestate = 'NY' or venuestate = 'CA') and eventname='Macbeth'
order by 2,1;
venuename
|
venuecity
----------------------------------------+--------------Geffen Playhouse
| Los Angeles
Greek Theatre
| Los Angeles
Royce Hall
| Los Angeles
American Airlines Theatre
| New York City
August Wilson Theatre
| New York City
Belasco Theatre
| New York City
API Version 2012-12-01
156
Amazon Redshift データベース開発者ガイド
条件
Bernard B. Jacobs Theatre
...
| New York City
この例の括弧を削除して、クエリの論理および結果を変更します。
次の例では、NOT 演算子を使用します。
select * from category
where not catid=1
order by 1;
catid | catgroup | catname |
catdesc
-------+----------+-----------+-------------------------------------------2 | Sports
| NHL
| National Hockey League
3 | Sports
| NFL
| National Football League
4 | Sports
| NBA
| National Basketball Association
5 | Sports
| MLS
| Major League Soccer
...
次の例では、NOT 条件の後に AND 条件を使用しています。
select * from category
where (not catid=1) and catgroup='Sports'
order by catid;
catid | catgroup | catname |
catdesc
-------+----------+---------+--------------------------------2 | Sports
| NHL
| National Hockey League
3 | Sports
| NFL
| National Football League
4 | Sports
| NBA
| National Basketball Association
5 | Sports
| MLS
| Major League Soccer
(4 rows)
パターンマッチング条件
Topics
• LIKE (p. 158)
• SIMILAR TO (p. 160)
• POSIX 演算子 (p. 163)
パターンマッチング演算子は、条件式で指定されたパターンが存在するかどうか文字列を調べ、該当す
るパターンが見つかったかどうかに応じて true または false を返します。Amazon Redshift では、パ
ターンマッチングに次の 3 つの方法を使用します。
• LIKE 式
LIKE 演算子は、列名などの文字列式を、ワイルドカード文字 %(パーセント)および _(アンダー
スコア)を使用したパターンと比較します。LIKE パターンマッチングは常に文字列全体を網羅しま
す。LIKE は大文字小文字を区別するマッチングを実行し、ILIKE は大文字小文字を区別しないマッ
チングを実行します。
• SIMILAR TO 正規表現
SIMILAR TO 演算子は、文字列式を、SQL の標準的な正規表現パターンと突き合わせます。このパ
ターンには、LIKE 演算子でサポートされている 2 つを含む一連のパターンマッチングメタ文字を含
API Version 2012-12-01
157
Amazon Redshift データベース開発者ガイド
条件
めることができます。SIMILAR TO は、文字列全体をマッチングし、大文字小文字を区別するマッチ
ングを実行します。
• POSIX スタイルの正規表現
POSIX 正規表現は、LIKE および SIMILAR TO の演算子の場合よりも強力なパターンマッチング手段
を提供します。POSIX 正規表現パターンでは、文字列の任意の部分をマッチングすることができ、
大文字小文字を区別するマッチングを実行します。
SIMILAR TO または POSIX の演算子を使用する正規表現マッチングは、計算コストが高くなります。
非常に多くの行を処理する場合は特に、可能な限り、LIKE を使用することをお勧めします。例えば、
次に示すクエリは機能的には同じですが、LIKE を使用したクエリは、正規表現を使用したクエリより
も数倍速く実行できます。
select count(*) from event where eventname SIMILAR TO '%(Ring|Die)%';
select count(*) from event where eventname LIKE '%Ring%' OR eventname LIKE
'%Die%';
LIKE
LIKE 演算子は、列名などの文字列式を、ワイルドカード文字 %(パーセント)および _(アンダース
コア)を使用したパターンと比較します。LIKE パターンマッチングは常に文字列全体を網羅します。
文字列内の任意の場所にあるシーケンスをマッチングするには、パターンがパーセント符号で始まり
パーセント符号で終了する必要があります。
LIKE は大文字小文字を区別し、ILIKE は大文字小文字を区別しません。
概要
expression [ NOT ] LIKE | ILIKE pattern [ ESCAPE 'escape_char' ]
引数
expression
列名など、有効な UTF-8 文字式。
LIKE | ILIKE
LIKE は大文字小文字を区別するパターンマッチングを実行します。ILIKE は、シングルバイト文字
に対して大文字小文字を区別しないパターンマッチングを実行します。LIKE と ILIKE は両方とも、
マルチバイト文字に対して大文字小文字を区別しないパターンマッチングを実行します。
pattern
マッチングするパターンが含まれる有効な UTF-8 文字式。
escape_char
パターン内でワイルドカード文字をエスケープする文字式。デフォルトはバックスラッシュ(\)
です。
pattern にワイルドカードが含まれていない場合、pattern は文字列そのものを表現するにすぎません。
その場合、LIKE は等号演算子と同じ働きをします。
どちらの文字式も CHAR または VARCHAR のデータ型になることができます。文字式の型が異なる場
合、Amazon Redshift は pattern のデータ型を expression のデータ型に変換します。
LIKE では、次のパターンマッチングメタ文字をサポートしています。
API Version 2012-12-01
158
Amazon Redshift データベース開発者ガイド
条件
演算子
説明
%
ゼロ個以上の任意の文字シーケンスをマッチングします。
_
任意の 1 文字をマッチングします。
例
次の例では、LIKE を使用したパターンマッチングの例を示します。
式
結果
'abc' LIKE 'abc'
True
'abc' LIKE 'a%'
True
'abc' LIKE '_B_'
False
'abc' ILIKE '_B_'
True
'abc' LIKE 'c%'
False
次の例では、名前が「E」で始まるすべての市を見つけます。
select distinct city from users
where city like 'E%' order by city;
city
--------------East Hartford
East Lansing
East Rutherford
East St. Louis
Easthampton
Easton
Eatontown
Eau Claire
...
次の例では、姓に「ten」が含まれるユーザーを見つけます。
select distinct lastname from users
where lastname like '%ten%' order by lastname;
lastname
------------Christensen
Wooten
...
次の例では、3 番目と 4 番目の文字が「ea」になっている市を見つけます。コマンドでは ILIKE を使用
して、大文字小文字の区別なしを実演します。
select distinct city from users where city ilike '__EA%' order by city;
city
-------------
API Version 2012-12-01
159
Amazon Redshift データベース開発者ガイド
条件
Brea
Clearwater
Great Falls
Ocean City
Olean
Wheaton
(6 rows)
次の例では、デフォルトのエスケープ文字(\)を使用して「_」を含む文字列を検索します。
select tablename, "column" from pg_table_def
where "column" like '%start\_time'
limit 5;
tablename
|
column
----------------+-------------------------stl_s3client
| start_time
stl_unload_log | start_time
stl_wlm_query | service_class_start_time
stl_wlm_query | queue_start_time
stl_wlm_query | exec_start_time
(5 rows)
次の例では、エスケープ文字として '^' を指定し、エスケープ文字を使用して「_」を含む文字列を検索
します。
select tablename, "column" from pg_table_def
where "column" like '%start^_time' escape '^'
limit 5;
tablename
|
column
----------------+-------------------------stl_s3client
| start_time
stl_unload_log | start_time
stl_wlm_query | service_class_start_time
stl_wlm_query | queue_start_time
stl_wlm_query | exec_start_time
(5 rows)
SIMILAR TO
SIMILAR TO 演算子は、列名などの文字列式を、SQL の標準的な正規表現パターンと突き合わせます。
SQL の正規表現パターンには、LIKE (p. 158) 演算子によってサポートされる 2 つを含む、一連のパター
ンマッチングメタ文字を含めることができます。
SIMILAR TO 演算子の場合は、POSIX の正規表現の動作(パターンは文字列の任意の部分と一致でき
る)とは異なり、パターンが文字全体と一致した場合にのみ true を返します。
SIMILAR TO は大文字小文字を区別するマッチングを実行します。
Note
SIMILAR TO を使用する正規表現マッチングは、計算コストが高くなります。非常に多くの行
を処理する場合は特に、可能な限り、LIKE を使用することをお勧めします。例えば、次に示す
クエリは機能的には同じですが、LIKE を使用したクエリは、正規表現を使用したクエリよりも
数倍速く実行できます。
API Version 2012-12-01
160
Amazon Redshift データベース開発者ガイド
条件
select count(*) from event where eventname SIMILAR TO '%(Ring|Die)%';
select count(*) from event where eventname LIKE '%Ring%' OR eventname
LIKE '%Die%';
概要
expression [ NOT ] SIMILAR TO pattern [ ESCAPE 'escape_char' ]
引数
expression
列名など、有効な UTF-8 文字式。
SIMILAR TO
SIMILAR TO は、expression 内の文字列全体について、大文字小文字を区別するパターンマッチン
グを実行します。
pattern
SQL の標準的な正規表現パターンを表現する有効な UTF-8 文字。
escape_char
パターン内でワイルドカード文字をエスケープする文字式。デフォルトはバックスラッシュ(\)
です。
pattern にワイルドカードが含まれていない場合、pattern は文字列そのものを表現するにすぎません。
どちらの文字式も CHAR または VARCHAR のデータ型になることができます。文字式の型が異なる場
合、Amazon Redshift は pattern のデータ型を expression のデータ型に変換します。
SIMILAR TO では、次のパターンマッチングメタ文字をサポートしています。
演算子
説明
%
ゼロ個以上の任意の文字シーケンスをマッチングします。
_
任意の 1 文字をマッチングします。
|
交替を示します(2 つの選択肢のいずれか)。
*
前の項目をゼロ回以上繰り返します。
+
前の項目を 1 回以上繰り返します。
?
前の項目をゼロ回または 1 回繰り返します。
{m}
前の項目をちょうど m 回だけ繰り返します。
{m,}
前の項目を m 回またはそれ以上の回数繰り返します。
{m,n}
前の項目を少なくとも m 回、多くても n 回繰り返します。
()
グループ項目を括弧で囲んで、単一の論理項目にします。
[...]
角括弧式は、POSIX 正規表現の場合のように、文字クラスを指定します。
API Version 2012-12-01
161
Amazon Redshift データベース開発者ガイド
条件
例
次の表に、SIMILAR TO を使用したパターンマッチングの例を示します。
式
結果
'abc' SIMILAR TO 'abc'
True
'abc' SIMILAR TO '_a_'
True
'abc' SIMILAR TO '_A_'
False
'abc' SIMILAR TO '%(b|d)%'
True
'abc' SIMILAR TO '(b|c)%'
True
'AbcAbcdefgefg12efgefg12' SIMILAR TO
'((Ab)?c)+d((efg)+(12))+'
True
'aaaaaab11111xy' SIMILAR TO 'a{6}_
[0-9]{5}(x|y){2}'
True
‘$0.87’ SIMILAR TO ‘$[0-9]+(.[0-9][0-9])?’
True
次の例では、名前に「E」または「H」が含まれる市をすべて見つけます。
select distinct city from users
where city similar to '%E%|%H%' order by city;
city
----------------------Agoura Hills
Auburn Hills
Benton Harbor
Beverly Hills
Chicago Heights
Chino Hills
Citrus Heights
East Hartford
次の例では、デフォルトのエスケープ文字(\)を使用して「_」を含む文字列を検索します。
select tablename, "column" from pg_table_def
where "column" similar to '%start\_time'
limit 5;
tablename
|
column
----------------+-------------------------stl_s3client
| start_time
stl_unload_log | start_time
stl_wlm_query | service_class_start_time
stl_wlm_query | queue_start_time
stl_wlm_query | exec_start_time
(5 rows)
次の例では、エスケープ文字として '^' を指定し、エスケープ文字を使用して「_」を含む文字列を検索
します。
API Version 2012-12-01
162
Amazon Redshift データベース開発者ガイド
条件
select tablename, "column" from pg_table_def
where "column" similar to '%start^_time' escape '^'
limit 5;
tablename
|
column
----------------+-------------------------stl_s3client
| start_time
stl_unload_log | start_time
stl_wlm_query | service_class_start_time
stl_wlm_query | queue_start_time
stl_wlm_query | exec_start_time
(5 rows)
POSIX 演算子
POSIX 正規表現は、LIKE (p. 158) および SIMILAR TO (p. 160) の演算子の場合よりも強力なパターンマッ
チング手段を提供します。POSIX 正規表現のパターンは、パターンが文字列全体と一致した場合にの
み true を返す SIMILAR TO 演算子の場合とは異なり、文字列の任意の部分と一致することができます。
Note
POSIX 演算子を使用する正規表現マッチングは、計算コストが高くなります。非常に多くの行
を処理する場合は特に、可能な限り、LIKE を使用することをお勧めします。例えば、次に示す
クエリは機能的には同じですが、LIKE を使用したクエリは、正規表現を使用したクエリよりも
数倍速く実行できます。
select count(*) from event where eventname ~ '.*(Ring|Die).* ';
select count(*) from event where eventname LIKE '%Ring%' OR eventname
LIKE '%Die%';
概要
expression [ ! ] ~ pattern
引数
expression
列名など、有効な UTF-8 文字式。
SIMILAR TO
SIMILAR TO は、expression 内の文字列全体について、大文字小文字を区別するパターンマッチン
グを実行します。
pattern
SQL の標準的な正規表現パターンを表現する有効な UTF-8 文字。
pattern にワイルドカードが含まれていない場合、pattern は文字列そのものを表現するにすぎません。
どちらの文字式も CHAR または VARCHAR のデータ型になることができます。文字式の型が異なる場
合、Amazon Redshift は pattern のデータ型を expression のデータ型に変換します。
文字式はすべて CHAR または VARCHAR のデータ型にすることができます。文字式の型が異なる場
合、Amazon Redshift はそれらのデータ型を expression のデータ型に変換します。
POSIX 正規表現は SIMILAR TO (p. 160) と同じメタ文字を使用します。ただし、次の表に示すワイルド
カード文字は例外です。
API Version 2012-12-01
163
Amazon Redshift データベース開発者ガイド
条件
POSIX
SIMILAR TO
説明
.(ドット)
_(下線)
単一文字にマッチします。
.*(ドットおよ %(パーセント)
びスター)
ゼロ個以上の任意の文字シーケンスをマッチングします。
^(カレット) サポート外
文字列の先頭をマッチングします。
>=
文字列の末尾をマッチングします。
サポート外
例
次の表に、SIMILAR TO を使用したパターンマッチングの例を示します。
式
結果
'abc' ~ 'abc'
True
'abc' ~ 'a'
True
'abc' ~ 'A'
False
'abc' ~ '.*(b|d).*'
True
'abc' ~ '(b|c).*'
True
'AbcAbcdefgefg12efgefg12' ~
'((Ab)?c)+d((efg)+(12))+'
True
'aaaaaab11111xy' ~ 'a{6}.[[1]]{5}(x|y){2}'
True
‘‘$0.87’ ~ ‘$[0-9]+(\.[0-9][0-9])?’
True
範囲条件
範囲条件では、キーワード BETWEEN および AND を使用して、値が範囲内に入っているかどうか式
をテストします。
概要
expression [ NOT ] BETWEEN expression AND expression
式は、数値データ型、文字データ型、または日時データ型とすることができますが、互換性を持つ必要
があります。
例
最初の例では、2、3、または 4 のいずれかのチケットの販売を登録したトランザクション数をカウン
トします。
select count(*) from sales
where qtysold between 2 and 4;
count
API Version 2012-12-01
164
Amazon Redshift データベース開発者ガイド
条件
-------104021
(1 row)
範囲条件内の最初の式は最小値、2 番目の式は最大値である必要があります。次の例は、式の値のせい
で、常にゼロ行を返します。
select count(*) from sales
where qtysold between 4 and 2;
count
------0
(1 row)
しかし、NOT 修飾子を加えると、論理が反転し、すべての行がカウントされます。
select count(*) from sales
where qtysold not between 4 and 2;
count
-------172456
(1 row)
次のクエリは、20000~50000 席を備えた会場のリストを返します。
select venueid, venuename, venueseats from venue
where venueseats between 20000 and 50000
order by venueseats desc;
venueid |
venuename
| venueseats
---------+-------------------------------+-----------116 | Busch Stadium
|
49660
106 | Rangers BallPark in Arlington |
49115
96 | Oriole Park at Camden Yards
|
48876
...
(22 rows)
Null 条件
Null 条件は、値が見つからないか、値が不明であるときに、Null かどうかテストします。
概要
expression IS [ NOT ] NULL
引数
expression
列のような任意の式。
IS NULL
式の値が Null の場合は true で、式が値を持つ場合は false です。
API Version 2012-12-01
165
Amazon Redshift データベース開発者ガイド
条件
IS NOT NULL
式の値が Null の場合は false で、式が値を持つ場合は true です。
例
この例では、SALES テーブルの QTYSOLD フィールドで Null が何回検出されるかを示します。
select count(*) from sales
where qtysold is null;
count
------0
(1 row)
EXISTS 条件
EXISTS 条件は、サブクエリ内に行が存在するかどうかをテストし、サブクエリが少なくとも 1 つの行
を返した場合に true を返します。NOT が指定されると、条件はサブクエリが行を返さなかった場合に
true を返します。
概要
[ NOT ] EXISTS (table_subquery)
引数
EXISTS
table_subquery が少なくとも 1 つの行を返した場合に true となります。
NOT EXISTS
table_subquery が行を返さない場合に true になります。
table_subquery
評価結果として 1 つまたは複数の列と 1 つまたは複数の行を持つテーブルを返します。
例
この例では、任意の種類の販売があった日付ごとに、1 回ずつ、すべての日付識別子を返します。
select dateid from date
where exists (
select 1 from sales
where date.dateid = sales.dateid
)
order by dateid;
dateid
-------1827
1828
1829
...
API Version 2012-12-01
166
Amazon Redshift データベース開発者ガイド
条件
IN 条件
IN 条件は、一連の値の中に、またはサブクエリ内にあるメンバーシップの値をテストします。
概要
expression [ NOT ] IN (expr_list | table_subquery)
引数
expression
expr_list または table_subquery に対して評価される数値、文字、または日時であり、当該リスト
またはサブクエリのデータ型との互換性が必要です。
expr_list
1 つまたは複数のカンマ区切り式、あるいは括弧で囲まれたカンマ区切り式の 1 つまたは複数の
セット。
table_subquery
評価結果として 1 つまたは複数の行を持つテーブルを返すサブクエリですが、その選択リスト内の
列数は 1 個に制限されています。
IN | NOT IN
IN は、式が式リストまたはクエリのメンバーである場合に true を返します。NOT IN は、式がメ
ンバーでない場合に true を返します。IN と NOT IN は、次の場合には NULL を返し、行は返され
ません。それは、expression で Null がもたらされる場合、または、一致する expr_list 値または
table_subquery 値がなく、これらの比較行の少なくとも 1 つで Null がもたらされる場合です。
例
次の条件は、リストされた値の場合にのみ true を返します。
qtysold in (2, 4, 5)
date.day in ('Mon', 'Tues')
date.month not in ('Oct', 'Nov', 'Dec')
大規模 IN リストの最適化
クエリのパフォーマンスを最適化するために、10 個を超える値が含まれる IN リストは内部的にスカ
ラー配列として評価されます。10 個未満の値が含まれる IN リストは一連の OR 述語として評価されま
す。この最適化は、DECIMAL を除くすべてのデータ型に対してサポートされています。
この最適化の効果を確認するには、クエリの EXPLAIN 出力を調べてください。以下に例を示します。
explain select * from sales
where salesid in (1,2,3,4,5,6,7,8,9,10,11);
QUERY PLAN
-------------------------------------------------------------------XN Seq Scan on sales (cost=0.00..6035.96 rows=86228 width=53)
Filter: (salesid = ANY ('{1,2,3,4,5,6,7,8,9,10,11}'::integer[]))
(2 rows)
API Version 2012-12-01
167
Amazon Redshift データベース開発者ガイド
SQL コマンド
SQL コマンド
Topics
• ABORT (p. 169)
• ALTER DATABASE (p. 170)
• ALTER GROUP (p. 171)
• ALTER SCHEMA (p. 172)
• ALTER TABLE (p. 173)
• ALTER USER (p. 178)
• ANALYZE (p. 180)
• ANALYZE COMPRESSION (p. 181)
• BEGIN (p. 182)
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
CANCEL (p. 184)
CLOSE (p. 185)
COMMENT (p. 186)
COMMIT (p. 187)
COPY (p. 187)
CREATE DATABASE (p. 209)
CREATE GROUP (p. 210)
CREATE SCHEMA (p. 210)
CREATE TABLE (p. 211)
CREATE TABLE AS (p. 220)
CREATE USER (p. 225)
CREATE VIEW (p. 227)
DEALLOCATE (p. 227)
DECLARE (p. 228)
DELETE (p. 231)
DROP DATABASE (p. 232)
DROP GROUP (p. 233)
DROP SCHEMA (p. 233)
DROP TABLE (p. 234)
DROP USER (p. 236)
• DROP VIEW (p. 237)
• END (p. 238)
• EXECUTE (p. 239)
• EXPLAIN (p. 240)
• FETCH (p. 244)
• GRANT (p. 245)
• INSERT (p. 248)
• LOCK (p. 253)
• PREPARE (p. 253)
• RESET (p. 255)
• REVOKE (p. 255)
• ROLLBACK (p. 258)
• SELECT (p. 259)
• SELECT INTO (p. 289)
API Version 2012-12-01
168
Amazon Redshift データベース開発者ガイド
ABORT
• SET (p. 289)
• SET SESSION AUTHORIZATION (p. 293)
• SET SESSION CHARACTERISTICS (p. 293)
• SHOW (p. 294)
• START TRANSACTION (p. 294)
• TRUNCATE (p. 294)
• UNLOAD (p. 295)
• UPDATE (p. 304)
• VACUUM (p. 308)
SQL 言語は、データベースオブジェクトの作成と操作、クエリの実行、テーブルのロード、およびテー
ブルデータの変更に使用するコマンドから構成されます。
Note
Amazon Redshift は PostgreSQL 8.0.2 に基づいています。Amazon Redshift と PostgreSQL に
はいくつかの大きな違いがあり、データウェアハウスアプリケーションの設計と開発時には注
意が必要です。Amazon Redshift SQL と PostgreSQL の違いの詳細については、「Amazon
Redshift および PostgreSQL (p. 119)」を参照してください。
Note
単一 SQL ステートメントの最大サイズは 16 MB です。
ABORT
現在実行中のトランザクションを中止し、そのトランザクションで行われたすべての更新を破棄しま
す。ABORT はすでに完了したトランザクションに対しては影響を与えません。
このコマンドは ROLLBACK コマンドと同じ機能を実行します。詳細については、「ROLLBACK (p. 258)」
を参照してください。
概要
ABORT [ WORK | TRANSACTION ]
パラメータ
WORK
オプションキーワード
TRANSACTION
オプションキーワード。WORK と TRANSACTION は同義語です。
例
次の例では、テーブルを作成し、データがそのテーブルに挿入されるトランザクションを開始します。
次に、ABORT コマンドはデータの挿入をロールバックし、テーブルを空にします。
次のコマンドを実行すると、MOVIE_GROSS という名前のテーブルが作成されます。
API Version 2012-12-01
169
Amazon Redshift データベース開発者ガイド
ALTER DATABASE
create table movie_gross( name varchar(30), gross bigint );
次のコマンドセットを実行すると、2 つのデータ行をテーブルに挿入するトランザクションが開始され
ます。
begin;
insert into movie_gross values ( 'Raiders of the Lost Ark', 23400000);
insert into movie_gross values ( 'Star Wars', 10000000 );
その後、次のコマンドを実行すると、テーブルからデータが選択され、挿入が正常に実行されたことが
示されます。
select * from movie_gross;
コマンド出力は、両方の行が正しく挿入されたことを示します。
name
| gross
-------------------------+---------Raiders of the Lost Ark | 23400000
Star Wars
| 10000000
(2 rows)
このコマンドはデータ変更を、トランザクションの開始時点までロールバックします。
abort;
テーブルからデータを選択すると、空のテーブルが表示されます。
select * from movie_gross;
name | gross
------+------(0 rows)
ALTER DATABASE
データベースの属性を変更します。
概要
ALTER DATABASE database_name
{
RENAME TO new_name |
OWNER TO new_owner |
}
API Version 2012-12-01
170
Amazon Redshift データベース開発者ガイド
ALTER GROUP
パラメータ
database_name
変更するデータベースの名前。通常、現在接続されていないデータベースを変更します。いずれの
場合も、変更は後のセッションにのみ反映されます。現在のデータベースの所有者を変更できます
が、名前を変更することはできません。
alter database tickit rename to newtickit;
ERROR: current database may not be renamed
RENAME TO
指定したデータベースの名前を変更します。現在のデータベースの名前を変更することはできませ
ん。データベース所有者またはスーパーユーザーのみがデータベース名を変更できます。スーパー
ユーザー以外の所有者には CREATEDB 権限も必要です。
new_name
新しいデータベース名。
OWNER TO
指定したデータベースの所有者を変更します。現在のデータベースまたは他のデータベースの所有
者を変更できます。スーパーユーザーのみが所有者を変更できます。
new_owner
新しいデータベース所有者。新しい所有者は、書き込み権限を持つ既存のデータベースユーザーで
あることが必要です。ユーザー権限の詳細については、「GRANT (p. 245)」を参照してください。
使用に関する注意事項
ALTER DATABASE コマンドは現在のセッションではなく、後のセッションに適用されます。変更の反
映を確認するには、変更されたデータベースに再接続する必要があります。
例
次の例では、TICKIT_SANDBOX という名前のデータベースを TICKIT_TEST に変更します。
alter database tickit_sandbox rename to tickit_test;
次の例では、TICKIT データベース(現在のデータベース)の所有者を DWUSER に変更します。
alter database tickit owner to dwuser;
ALTER GROUP
ユーザーグループを変更します。ユーザーをグループに追加するか、グループからユーザーを削除する
か、グループ名を変更するには、このコマンドを使用します。
概要
ALTER GROUP group_name
{
ADD USER username [, ... ] |
DROP USER username [, ... ] |
API Version 2012-12-01
171
Amazon Redshift データベース開発者ガイド
ALTER SCHEMA
RENAME TO new_name
}
パラメータ
group_name
変更するユーザーグループの名前。
ADD
ユーザーをユーザーグループに追加します。
DROP
ユーザーグループからユーザーを削除します。
username
グループに追加するかグループから削除するユーザーの名前。
RENAME TO
ユーザーグループの名前を変更します。
new_name
ユーザーグループの新しい名前。
例
次の例では、DWUSER という名前のユーザーを ADMIN_GROUP グループに追加します。
alter group admin_group
add user dwuser;
次の例では、グループ名を ADMIN_GROUP から ADMINISTRATORS に変更します。
alter group admin_group
rename to administrators;
ALTER SCHEMA
既存のスキーマの定義を変更します。スキーマ名を変更するかスキーマの所有者を変更するには、この
コマンドを使用します。
例えば、既存のスキーマの新しいバージョンを作成する予定がある場合、そのスキーマの名前を変更し
て、そのスキーマのバックアップコピーを保存します。スキーマの詳細については、「CREATE
SCHEMA (p. 210)」を参照してください。
概要
ALTER SCHEMA schema_name
{
RENAME TO new_name |
OWNER TO new_owner
}
API Version 2012-12-01
172
Amazon Redshift データベース開発者ガイド
ALTER TABLE
パラメータ
schema_name
変更するデータベーススキーマの名前。
RENAME TO
スキーマ名を変更します。
new_name
スキーマの新しい名前。
OWNER TO
スキーマの所有者を変更します。
new_owner
スキーマの新しい所有者。
例
次の例では、スキーマの名前を SALES から US_SALES に変更します。
alter schema sales
rename to us_sales;
次の例では、US_SALES スキーマの所有権をユーザー DWUSER に与えます。
alter schema us_sales
owner to dwuser;
ALTER TABLE
Topics
• 概要 (p. 173)
• パラメータ (p. 174)
• ALTER TABLE の例 (p. 176)
• ALTER TABLE ADD および DROP COLUMN の例 (p. 176)
データベーステーブルの定義を変更します。このコマンドは、CREATE TABLE で設定された値とプロ
パティを更新します。
Note
ALTER TABLE の操作が完了するまで、テーブルの読み取りと書き込みはロックされます。
概要
ALTER TABLE table_name
{
ADD table_constraint |
DROP table_constraint [ RESTRICT | CASCADE ] |
OWNER TO new_owner |
RENAME TO new_name |
RENAME COLUMN column_name TO new_name |
API Version 2012-12-01
173
Amazon Redshift データベース開発者ガイド
ALTER TABLE
ADD [ COLUMN ] column_name column_type
[ DEFAULT default_expr ]
[ ENCODE encoding ]
[ NOT NULL | NULL ] |
DROP [ COLUMN ] column_name [ RESTRICT | CASCADE ] }
where table_constraint is:
[ CONSTRAINT constraint_name ]
{ UNIQUE ( column_name [, ... ] ) |
PRIMARY KEY ( column_name [, ... ] ) |
FOREIGN KEY (column_name [, ... ] )
REFERENCES reftable [ ( refcolumn ) ]}
パラメータ
table_name
変更するテーブルの名前。テーブル名のみを指定するか、schema_name.table_name 形式で特定
のスキーマを使用します。また、ALTER TABLE ステートメントを使用してビュー名かビューの所
有者を変更する場合、ビュー名を指定することもできます。
ADD table_constraint
指定した制約をテーブルに追加します。有効な table_constraint 値については、「CREATE
TABLE (p. 211)」を参照してください。
Note
プライマリキー制約を null が許容された列に追加することはできません。列が元々 NOT
NULL 制約で作成された場合、プライマリキー制約を追加できます。
DROP table_constraint
テーブルから制約を削除します。テーブルから指定した制約を削除します。有効な table_constraint
値については、「CREATE TABLE (p. 211)」を参照してください。
RESTRICT
指定の制約のみ削除します。DROP CONSTRAINT のオプション。CASCADE と共に使用すること
はできません。
CASCADE
制約およびその制約に依存するすべてを削除します。DROP CONSTRAINT のオプション。
RESTRICT と共に使用することはできません。
OWNER TO new_owner
テーブル(またはビュー)の所有者を new_owner 値に変更します。
RENAME TO new_name
テーブル(またはビュー)の名前を new_name で指定された値に変更します。テーブル名の最大
の長さは 127 文字です。それより長い名前は 127 文字まで切り捨てられます。
RENAME COLUMN column_name TO new_name
列の名前を new_name で指定された値に変更します。列名の最大の長さは 127 文字です。それよ
り長い名前は 127 文字まで切り捨てられます。
ADD [ COLUMN ] column_name
指定した名前を持つ列をテーブルに追加します。各 ALTER TABLE ステートメントでは 1 列しか
追加できません。
テーブルの分散キー(DISTKEY)またはソートキー(SORTKEY)である列は追加できません。
ALTER TABLE ADD COLUMN コマンドを使用して次のテーブルと列の属性を変更することはでき
ません。
API Version 2012-12-01
174
Amazon Redshift データベース開発者ガイド
ALTER TABLE
• UNIQUE
• PRIMARY KEY
• REFERENCES(外部キー)
• IDENTITY
列名の最大の長さは 127 文字です。それより長い名前は 127 文字まで切り捨てられます。1 つの
テーブルで定義できる列の最大数は 1,600 です。
column_type
追加する列のデータ型。CHAR および VARCHAR の列の場合、最大長を宣言する代わりに MAX
キーワードを使用できます。MAX は、最大長を CHAR では 4096 バイト、VARCHAR では 65535
バイトに設定します。Amazon Redshift では次のデータ型 (p. 127)をサポートしています。
• SMALLINT(INT2)
• INTEGER(INT、INT4)
• BIGINT(INT8)
• DECIMAL(NUMERIC)
• REAL(FLOAT4)
• DOUBLE PRECISION(FLOAT8)
• BOOLEAN(BOOL)
• CHAR(CHARACTER)
• VARCHAR(CHARACTER VARYING)
• DATE
• TIMESTAMP
DEFAULT default_expr
列のデフォルトのデータ値を割り当てます。default_expr のデータ型は列のデータ型に一致する必
要があります。
default_expr は、列の値を指定しないすべての INSERT 操作で使用されます。デフォルト値を指定
しなかった場合、列のデフォルト値は null です。
COPY 操作で、DEFAULT 値と NOT NULL 制約が設定された列に null フィールドが見つかった場
合、COPY コマンドは default_expr の値を挿入します。
ENCODE encoding
列の圧縮エンコード。圧縮が選択されていない場合、デフォルトは RAW です。次の 圧縮エンコー
ド (p. 34)がサポートされています。
• BYTEDICT
• DELTA
• DELTA32K
• MOSTLY8
• MOSTLY16
• MOSTLY32
• RAW(圧縮なし、デフォルト設定)
• RUNLENGTH
• TEXT255
• TEXT32K
NOT NULL | NULL
NOT NULL は、列に null 値を使用できないことを指定します。NULL はデフォルトであり、列で
null 値を使用できることを指定します。
DROP [ COLUMN ] column_name
テーブルから削除する列の名前。
API Version 2012-12-01
175
Amazon Redshift データベース開発者ガイド
ALTER TABLE
テーブルの分散キー(DISTKEY)またはソートキー(SORTKEY)である列は削除できません。
ビュー、プライマリキー、外部キー、UNIQUE 制約などの依存オブジェクトが列にある場合、DROP
COLUMN のデフォルト動作は RESTRICT です。
RESTRICT
DROP COLUMN と共に使用する場合に RESTRICT が意味することは、定義されたビューが削除
対象列を参照する場合、または外部キーが列を参照する場合、または列がマルチパートキーに属す
る場合、列は削除されないことです。CASCADE と共に使用することはできません。
CASCADE
DROP COLUMN と共に使用すると、指定した列およびその列に依存するすべてのものを削除しま
す。RESTRICT と共に使用することはできません。
ALTER TABLE の例
次の例は、ALTER TABLE コマンドの基本用法を示しています。
テーブル名の変更
次のコマンドはテーブル名を USERS から USERS_BKUP に変更します。
alter table users
rename to users_bkup;
この種類のコマンドを使用してビュー名を変更することもできます。
テーブルまたはビューの所有者の変更
次のコマンドは VENUE テーブルの所有者をユーザー DWUSER に変更します。
alter table venue
owner to dwuser;
次のコマンドは、ビューを作成した後、その所有者を変更します。
create view vdate as select * from date;
alter table vdate owner to vuser;
列名の変更
次のコマンドは VENUE テーブルの列名を VENUESEATS から VENUESIZE に変更します。
alter table venue
rename column venueseats to venuesize;
ALTER TABLE ADD および DROP COLUMN の例
次の例は、ALTER TABLE を使用して基本テーブル列を追加した後に削除する方法、および依存オブ
ジェクトがある列を削除する方法を示しています。
API Version 2012-12-01
176
Amazon Redshift データベース開発者ガイド
ALTER TABLE
基本列の追加と削除
次の例では、スタンドアロンの FEEDBACK_SCORE 列を USERS テーブルに追加します。この列には
1 つの整数が含まれます。この列のデフォルト値は NULL です(フィードバックスコアなし)。
最初に、PG_TABLE_DEF カタログテーブルをクエリして USERS テーブルを表示します。
select "column", type, encoding, distkey, sortkey
from pg_table_def where tablename = 'users';
column
|
type
| encoding | distkey | sortkey
---------------+------------------------+----------+---------+--------userid
| integer
| none
| t
|
1
username
| character(8)
| none
| f
|
0
firstname
| character varying(30) | text32k | f
|
0
lastname
| character varying(30) | text32k | f
|
0
city
| character varying(30) | text32k | f
|
0
state
| character(2)
| none
| f
|
0
email
| character varying(100) | text255 | f
|
0
phone
| character(14)
| none
| f
|
0
likesports
| boolean
| none
| f
|
0
liketheatre
| boolean
| none
| f
|
0
likeconcerts | boolean
| none
| f
|
0
likejazz
| boolean
| none
| f
|
0
likeclassical | boolean
| none
| f
|
0
likeopera
| boolean
| none
| f
|
0
likerock
| boolean
| none
| f
|
0
likevegas
| boolean
| none
| f
|
0
likebroadway | boolean
| none
| f
|
0
likemusicals | boolean
| none
| f
|
0
(18 rows)
次に、feedback_score 列を追加します。
alter table users
add column feedback_score int
default NULL;
USERS から FEEDBACK_SCORE 列を選択し、追加されたことを確認します。
select feedback_score from users limit 5;
feedback_score
---------------(5 rows)
列を削除して元の DDL に戻します。
alter table users drop column feedback_score;
依存オブジェクトがある列の削除
この例では、依存オブジェクトがある列を削除します。その結果、依存オブジェクトも削除されます。
API Version 2012-12-01
177
Amazon Redshift データベース開発者ガイド
ALTER USER
初めに、もう一度 FEEDBACK_SCORE 列を USERS テーブルに追加します。
alter table users
add column feedback_score int
default NULL;
次に、USERS テーブルから USERS_VIEW というビューを作成します。
create view users_view as select * from users;
次に、USERS テーブルから FEEDBACK_SCORE 列の削除を試みます。この DROP ステートメントで
はデフォルト動作(RESTRICT)を使用します。
alter table users drop column feedback_score;
列に別のオブジェクトが依存しているため、列を削除できないことを示すエラーメッセージが表示され
ます。
今度はすべての依存オブジェクトを削除するため CASCADE を指定して、FEEDBACK_SCORE 列の削
除を再度試みます。
alter table users
drop column feedback_score cascade;
ALTER USER
データベースユーザーアカウントを変更します。
概要
ALTER USER username [ WITH ] option [, ... ]
where option is
CREATEDB | NOCREATEDB |
CREATEUSER | NOCREATEUSER |
PASSWORD 'password' [ VALID UNTIL 'expiration_date' ] |
RENAME TO new_name |
SET parameter { TO | = } { value | DEFAULT } |
RESET parameter
パラメータ
username
ユーザーアカウントの名前。
WiTH
オプションキーワード
CREATEDB | NOCREATEDB
CREATEDB オプションを使用すると、ユーザーは新しいデータベースを作成できます。
NOCREATEDB がデフォルトです。
API Version 2012-12-01
178
Amazon Redshift データベース開発者ガイド
ALTER USER
CREATEUSER | NOCREATEUSER
CREATEUSER オプションは、ユーザーにアカウントを作成する権限を与えます。NOCREATEUSER
がデフォルトです。
PASSWORD
ユーザーのパスワードを変更します。
'password'
新しいパスワードの値。
制約:
• 長さは 8~64 文字。
• 少なくとも 1 つの大文字、1 つの小文字、および 1 つの数字を使用する必要があります。
• 表示可能な ASCII 文字(ASCII コード 33~126)のうち、'(一重引用符)、"(二重引用符)、
\、/、@ および空白を除く任意の文字を使用できます。
VALID UNTIL 'expiration_date'
パスワードに失効日があることを指定します。値 'infinity' を使用すると、失効日を設定しな
いようにすることができます。このパラメータの有効なデータ型はタイムゾーンのないタイムスタ
ンプです。
RENAME TO
ユーザーアカウントの名前を変更します。
new_name
ユーザーの新しい名前。
SET
指定したユーザーによって実行されるすべてのセッションに対して、設定パラメータを新しいデ
フォルト値に設定します。
RESET
指定したユーザーに対して、設定パラメータを元のデフォルト値にリセットします。
parameter
設定またはリセットするパラメータの名前。
value
パラメータの新しい値。
DEFAULT
指定したユーザーによって実行されるすべてのセッションに対して、設定パラメータをデフォルト
値に設定します。
使用に関する注意事項
ALTER USER コマンドに search_path (p. 571) パラメータを設定した場合、指定したユーザーの次のロ
グイン時に変更が反映されます。現在のユーザーとセッションの search_path を変更する場合は、SET
コマンドを使用します。
例
次の例では、ユーザー ADMIN にデータベースを作成する権限を与えます。
alter user admin createdb;
次の例では、ユーザー ADMIN のパスワードを adminPass9 に設定し、パスワードの有効期限切れの
日時を設定します。
alter user admin password 'adminPass9'
valid until '2013-12-31 23:59';
API Version 2012-12-01
179
Amazon Redshift データベース開発者ガイド
ANALYZE
次の例では、ユーザー名を ADMIN から SYSADMIN に変更します。
alter user admin rename to sysadmin;
ANALYZE
クエリプランナーで使用するテーブル統計を更新します。
概要
ANALYZE [ VERBOSE ]
[ [ table_name ]
[ ( column_name [, ...] ) ] ]
パラメータ
VERBOSE
ANALYZE 操作に関する進捗情報メッセージを返します。このオプションは、テーブルを指定しな
いときに役立ちます。
table_name
一時テーブルを含む、特定のテーブルを分析できます。テーブルをそのスキーマ名で修飾すること
ができます。また、table_name を指定して単一のテーブルを分析することもできます。1 つの
ANALYZE table_name ステートメントで複数の table_name を指定することはできません。
table_name を指定しなかった場合、システムカタログ内の永続的テーブルを含め、現在接続され
ているデータベースのテーブルがすべて分析されます。Amazon Redshift のシステムテーブル(STL
テーブルと STV テーブル)を分析する必要はありません。
column_name
table_name を指定する場合、テーブルの 1 つ以上の列を指定することもできます(括弧内に列を
カンマ区切りリストとして指定します)。
使用に関する注意事項
Amazon Redshift は、次のコマンドで作成できるテーブルを自動的に分析します。
• CREATE TABLE AS
• CREATE TEMP TABLE AS
• SELECT INTO
最初に作成したとき、これらのテーブルに ANALYZE コマンドを実行する必要はありません。変更する
場合は、他のテーブルと同じように分析する必要があります。
テーブルを分析する (p. 83)も参照してください。
例
TICKIT データベースのすべてのテーブルを分析し、進捗情報を返します。
analyze verbose;
LISTING テーブルのみを分析します。
API Version 2012-12-01
180
Amazon Redshift データベース開発者ガイド
ANALYZE COMPRESSION
analyze listing;
VENUE テーブルの VENUEID 列と VENUENAME 列を分析します。
analyze venue(venueid, venuename);
ANALYZE COMPRESSION
圧縮分析を行い、分析されたテーブルについて推奨列エンコードスキーム付きのレポートを作成しま
す。
概要
ANALYZE COMPRESSION
[ [ table_name ]
[ ( column_name [, ...] ) ] ]
[COMPROWS numrows]
パラメータ
table_name
一時テーブルを含む、特定のテーブルの圧縮を分析できます。テーブルをそのスキーマ名で修飾す
ることができます。また、table_name を指定して単一のテーブルを分析することもできます。
table_name を指定しなかった場合、現在接続されているデータベースがすべて分析されます。1
つの ANALYZE COMPRESSION ステートメントで複数の table_name を指定することはできませ
ん。
column_name
table_name を指定する場合、テーブルの 1 つ以上の列を指定することもできます(括弧内に列を
カンマ区切りリストとして指定します)。
COMPROWS
圧縮分析のサンプルサイズとして使用される行数。分析は各データスライスの行に対して実行され
ます。例えば、COMPROWS 1000000(1,000,000)を指定し、システムに合計 4 つのスライスが
含まれている場合、スライスごとに 250,000 行のみが読み取られ、分析されます。COMPROWS
を指定しない場合、サンプルサイズはデフォルトでスライスごとに 100,000 になります。
COMPROWS の値がスライスごとに 100,000 行のデフォルト値より小さい場合、自動的にデフォ
ルト値にアップグレードされます。ただし、テーブルのデータが不十分であるため有意のサンプル
を作成できない場合、圧縮分析では推奨を作成しません。COMPROWS 数がテーブルの行数より
大きい場合でも、ANALYZE COMPRESSION コマンドは続行し、利用可能なすべての行に対して
圧縮分析を実行します。
numrows
圧縮分析のサンプルサイズとして使用される行数。numrows の許容範囲は 1000~1000000000
(1,000,000,000)の数値です。
使用に関する注意事項
テーブルの内容サンプルに基づいて推奨列エンコードスキームを取得するには、ANALYZE
COMPRESSION を実行します。ANALYZE COMPRESSION はアドバイスツールであり、テーブルの
列エンコードは変更しません。推奨エンコードを適用するには、テーブルを再作成するか、同じスキー
マを持つ新しいテーブルを作成します。適切なエンコードスキームを使用して未圧縮テーブルを再作成
すると、オンディスクフットプリントを大幅に減らし、ディスクスペースを節約し、IO 関連ワークロー
ドのクエリパフォーマンスを向上させることができます。
API Version 2012-12-01
181
Amazon Redshift データベース開発者ガイド
BEGIN
ANALYZE COMPRESSION では、SORTKEY と指定されている列の ランレングスエンコード (p. 39)
エンコードを考慮に入れません。これは、SORTKEY 列が他の列より高度に圧縮された場合、範囲制限
されたスキャンのパフォーマンスが低下する可能性があるためです。
ANALYZE COMPRESSION は排他的テーブルロックを取得し、テーブルに対する同時読み取り書き込
みが防止されます。ANALYZE COMPRESSION コマンドは、テーブルがアイドル状態になっている場
合にのみ実行してください。
例
LISTING テーブルのみを分析します。
analyze compression listing;
Table |
Column
| Encoding
---------+----------------+---------listing | listid
| delta
listing | sellerid
| delta32k
listing | eventid
| delta32k
listing | dateid
| bytedict
listing | numtickets
| bytedict
listing | priceperticket | delta32k
listing | totalprice
| mostly32
listing | listtime
| raw
SALES テーブルの QTYSOLD、COMMISSION、SALETIME の各列を分析します。
analyze compression sales(qtysold, commission, saletime);
Table |
Column
| Encoding
------+------------+---------sales | salesid
| N/A
sales | listid
| N/A
sales | sellerid
| N/A
sales | buyerid
| N/A
sales | eventid
| N/A
sales | dateid
| N/A
sales | qtysold
| bytedict
sales | pricepaid | N/A
sales | commission | delta32k
sales | saletime
| raw
BEGIN
トランザクションを開始します。START TRANSACTION と同義です。
トランザクションは、1 つのコマンドまたは複数のコマンドから構成される、1 つの論理的作業単位で
す。一般に、トランザクションのすべてのコマンドはデータベースのスナップショットに対して実行さ
れます。その開始時刻は、transaction_snapshot_begin システム設定パラメータの値セットで指定され
ます。
デフォルトでは、個々の Amazon Redshift 操作(クエリ、DDL ステートメント、ロード)はデータベー
スに自動的にコミットされます。後続の作業が完了するまで操作のコミットを停止する場合、BEGIN
ステートメントでトランザクションを開き、必要なコマンドを実行し、COMMIT ステートメントでト
ランザクションを閉じます。必要に応じて、ROLLBACK ステートメントを使用して、進行中のトラン
ザクションを中止できます。この動作の例外は TRUNCATE (p. 294) コマンドです。このコマンドは実
行されているトランザクションをコミットします。ロールバックすることはできません。
API Version 2012-12-01
182
Amazon Redshift データベース開発者ガイド
BEGIN
概要
BEGIN [ WORK | TRANSACTION ] [ ISOLATION LEVEL option ] [ READ WRITE | READ
ONLY ]
START TRANSACTION [ ISOLATION LEVEL option ] [ READ WRITE | READ ONLY ]
Where option is
SERIALIZABLE
| READ UNCOMMITTED
| READ COMMITTED
| REPEATABLE READ
Note: READ UNCOMMITTED, READ COMMITTED, and REPEATABLE READ have no
operational impact and map to SERIALIZABLE in Amazon Redshift.
パラメータ
WORK
オプションキーワード
TRANSACTION
オプションキーワード。WORK と TRANSACTION は同義語です。
ISOLATION LEVEL SERIALIZABLE
デフォルトでシリアル化可能な分離がサポートされているため、この構文がステートメントに含ま
れているかどうかに関係なく、トランザクションの動作は同じです。「同時書き込み操作を管理す
る (p. 87)」を参照してください。他の分離レベルはサポートされていません。
Note
SQL 標準では、ダーティリード(トランザクションが未コミットの同時トランザクション
によって書き込まれたデータを読み取ります)、非再現リード(トランザクションが以前
に読み取ったデータを再読み取りし、初回読み取り後にコミットされた別のトランザク
ションによってデータが変更されたことを検出します)、およびファントムリード(トラ
ンザクションがクエリを再実行し、検索条件を満たす行セットを返した後、最近コミット
された別のトランザクションのために行セットが変更されていることを検出します)を避
けるため、4 つのレベルのトランザクション分離を定義しています。
• 未コミット読み取り: ダーティリード、非再現リード、およびファントムリードの可能
性があります。
• コミット済み読み取り: 非再現リードおよびファントムリードの可能性があります。
• 再現可能読み取り: ファントムリードの可能性があります。
• シリアル化可能: ダーティリード、非再現リード、およびファントムリードを防止しま
す。
4 つのトランザクション分離レベルのいずれも使用できますが、Amazon Redshift ではす
べての分離レベルをシリアル化可能として処理します。
READ WRITE
トランザクションに読み取り書き込み権限を与えます。
READ ONLY
トランザクションに読み取り専用権限を与えます。
API Version 2012-12-01
183
Amazon Redshift データベース開発者ガイド
CANCEL
例
次の例では、シリアル化可能なトランザクションブロックを開始します。
begin;
次の例では、シリアル化可能分離レベルと読み取り書き込み権限を持つトランザクションブロックを開
始します。
begin read write;
CANCEL
現在実行中のデータベースクエリをキャンセルします。
CANCEL コマンドは実行中のクエリのプロセス ID を必要とし、クエリがキャンセルされたことを確認
する確認メッセージを表示します。
概要
CANCEL process_ID [ 'message' ]
パラメータ
process_ID
キャンセルするクエリに対応するプロセス ID。
'message'
オプションの確認メッセージ。クエリのキャンセルが完了したときに表示されます。メッセージを
指定しなかった場合、確認としてデフォルトメッセージが表示されます。メッセージは一重引用符
で囲む必要があります。
使用に関する注意事項
クエリ ID を指定してクエリをキャンセルすることはできません。クエリのプロセス ID を指定する必要
があります。ユーザーによって現在実行されているクエリのみキャンセルできます。スーパーユーザー
はすべてのクエリをキャンセルできます。
例
現在実行されているクエリをキャンセルするには、キャンセルするクエリのプロセス ID を最初に取得
します。現在実行されているすべてのクエリのプロセス ID を確認するには、次のコマンドを入力しま
す。
select pid, starttime, duration,
trim(user_name) as user,
trim (query) as querytxt
from stv_recents
where status = 'Running';
pid |
starttime
| duration |
user
|
querytxt
-----+----------------------------+----------+----------+-----------------
API Version 2012-12-01
184
Amazon Redshift データベース開発者ガイド
CLOSE
802 | 2008-10-14 09:19:03.550885 |
132 | dwuser | select
venuename from venue where venuestate='FL', where venuecity not in
('Miami' , 'Orlando');
834 | 2008-10-14 08:33:49.473585 | 1250414 | dwuser | select *
from listing;
964 | 2008-10-14 08:30:43.290527 |
326179 | dwuser | select
sellerid from sales where qtysold in (8, 10);
クエリテキストをチェックし、キャンセルするクエリに対応するプロセス ID(PID)を確認します。
PID 802 を使用する次のコマンドを入力して、そのクエリをキャンセルします。
cancel 802;
クエリを実行していたセッションは次のメッセージを表示します。
ERROR:
Query (168) cancelled on user's request
ここで、168 はクエリ ID です(クエリのキャンセルに使用されるプロセス ID ではありません)。
また、デフォルトメッセージの代わりに表示するカスタム確認メッセージを指定することもできます。
カスタムメッセージを指定するには、CANCEL コマンドの最後に引用符で囲んだメッセージを付けま
す。
cancel 802 'Long-running query';
クエリが実行されていたセッションは次のメッセージを表示します。
ERROR:
Long-running query
CLOSE
(オプション)開いているカーソルと関連付けられたすべての空きリソースを閉じます。
COMMIT (p. 187)、END (p. 238)、および ROLLBACK (p. 258) は自動的にカーソルを閉じるため、CLOSE
コマンドを使用して明示的にカーソルを閉じる必要はありません。
詳細については、「DECLARE (p. 228)」および「FETCH (p. 244)」を参照してください。
概要
CLOSE cursor
パラメータ
cursor
閉じるカーソルの名前。
CLOSE の例
次のコマンドはカーソルを閉じ、コミットを実行してトランザクションを終了します。
API Version 2012-12-01
185
Amazon Redshift データベース開発者ガイド
COMMENT
close movie_cursor;
commit;
COMMENT
データベースオブジェクトに関するコメントを作成するか変更します。
概要
COMMENT ON
{
TABLE object_name |
COLUMN object_name.column_name |
CONSTRAINT constraint_name ON table_name |
DATABASE object_name |
VIEW object_name
}
IS 'text'
パラメータ
object_name
コメント対象のデータベースオブジェクトの名前。コメントは次のオブジェクトに追加できます。
• TABLE
• COLUMN(column_name も取ります)
• CONSTRAINT(constraint_name と table_name も取ります)
• DATABASE
• VIEW
IS 'text''
指定したオブジェクトに適用するコメントのテキスト。コメントは一重引用符で囲みます。
column_name
コメント対象の列の名前。COLUMN のパラメータ。object_name で指定するテーブルの後に指
定します。
constraint_name
コメント対象の制約の名前。CONSTRAINT のパラメータ。
table_name
制約を含むテーブルの名前。CONSTRAINT のパラメータ。
arg1_type, arg2_type, ...
関数の引数のデータ型。FUNCTION のパラメータ。
使用に関する注意事項
データベースに関するコメントは現在のデータベースにのみ適用できます。異なるデータベースにコメ
ントしようとすると、警告メッセージが表示されます。存在しないデータベースに関するコメントに対
しても、同じ警告が表示されます。
例
次の例では、説明的なコメントを EVENT テーブルに追加します。
API Version 2012-12-01
186
Amazon Redshift データベース開発者ガイド
COMMIT
comment on table
event is 'Contains listings of individual events.';
結果
Object descriptions
schema | name | object |
description
--------+-------+--------+----------------------------------------public | event | table | Contains listings of individual events.
(1 row)
COMMIT
現在のトランザクションをデータベースにコミットします。このコマンドはトランザクションからの
データベース更新を永続的なものにします。
概要
COMMIT [ WORK | TRANSACTION ]
パラメータ
WORK
オプションキーワード
TRANSACTION
オプションキーワード。WORK と TRANSACTION は同義語です。
例
次の各例では、現在のトランザクションをデータベースにコミットします。
commit;
commit work;
commit transaction;
COPY
Topics
• Amazon S3 からの COPY の概要 (p. 188)
• Amazon DynamoDB からの COPY の概要 (p. 188)
• パラメータ (p. 189)
• 使用に関する注意事項 (p. 197)
• COPY の例 (p. 200)
• ESCAPE オプションを指定する COPY 用のファイルの準備 (p. 207)
API Version 2012-12-01
187
Amazon Redshift データベース開発者ガイド
COPY
Amazon S3 バケットに置かれたフラットファイルから、または Amazon DynamoDB テーブルからテー
ブルにデータをロードします。COPY コマンドは、新しい入力データをテーブルの既存の行に追加しま
す。
Note
COPY コマンドを使用するには、INSERT 権限が必要です。
Amazon S3 からの COPY の概要
COPY table_name [ (column1 [,column2, ...]) ]
FROM { 's3://objectpath' | 's3://manifest_file' }
[ WITH ] CREDENTIALS [AS] 'aws_access_credentials'
[ option [ ... ] ]
where option is
{ FIXEDWIDTH 'fixedwidth_spec'
| [DELIMITER [ AS ] 'delimiter_char']
[CSV [QUOTE [ AS ] 'quote_character']}
| MANIFEST
| ENCRYPTED
| GZIP
| LZOP
| REMOVEQUOTES
| EXPLICIT_IDS
| ACCEPTINVCHARS [ AS ] ['replacement_char']
| MAXERROR [ AS ] error_count
| DATEFORMAT [ AS ] { 'dateformat_string' | 'auto' }
| TIMEFORMAT [ AS ] { 'timeformat_string' | 'auto' | 'epochsecs' | 'epochmilli
secs' }
| IGNOREHEADER [ AS ] number_rows
| ACCEPTANYDATE
| IGNOREBLANKLINES
| TRUNCATECOLUMNS
| FILLRECORD
| TRIMBLANKS
| NOLOAD
| NULL [ AS ] 'null_string'
| EMPTYASNULL
| BLANKSASNULL
| COMPROWS numrows
| COMPUPDATE [ { ON | TRUE } | { OFF | FALSE } ]
| STATUPDATE [ { ON | TRUE } | { OFF | FALSE } ]
| ESCAPE
| ROUNDEC
Amazon DynamoDB からの COPY の概要
COPY table_name [ (column1 [,column2, ...]) ]
FROM 'dynamodb://table_name'
[ WITH ] CREDENTIALS [AS] 'aws_access_credentials'
READRATIO ratio
[ option [ ... ] ]
API Version 2012-12-01
188
Amazon Redshift データベース開発者ガイド
COPY
where option is
| EXPLICIT_IDS
| MAXERROR [ AS ] error_count
| DATEFORMAT [ AS ] { 'dateformat_string' | 'auto' }
| TIMEFORMAT [ AS ] { 'timeformat_string' | 'auto' | 'epochsecs' | 'epochmilli
secs' }
| ACCEPTANYDATE
| TRUNCATECOLUMNS
| TRIMBLANKS
| NOLOAD
| EMPTYASNULL
| BLANKSASNULL
| COMPROWS numrows
| COMPUPDATE [ { ON | TRUE } | { OFF | FALSE } ]
| STATUPDATE [ { ON | TRUE } | { OFF | FALSE } ]
| ROUNDEC
パラメータ
table_name
COPY コマンドのターゲットテーブル。テーブルはすでにデータベースに存在する必要がありま
す。テーブルは一時テーブルまたは永続的テーブルです。COPY コマンドは、新しい入力データを
テーブルの既存の行に追加します。
(column1 [, column2, ...])
データフィールドを特定の列にロードするためのオプションの列リストを指定します。COPY ス
テートメントで列は任意の順序に指定できますが、Amazon S3 バケットのフラットファイルから
ロードする場合、ソースデータの順序に一致する必要があります。Amazon DynamoDB テーブル
からロードする場合、順序は関係ありません。列リストから省略された列には定義済みの DEFAULT
式が割り当てられます。また、省略された列で null が許容されており、定義済みの DEFAULT 式
がない場合は、NULL が割り当てられます。省略された列が NOT NULL だが、定義済みの DEFAULT
式がない場合、COPY コマンドは失敗します。
列リストに IDENTITY 列が含まれている場合、EXPLICIT_IDS も指定する必要があります。IDENTITY
列を省略した場合、EXPLICIT_IDS は指定できません。列リストを指定しない場合、コマンドは、
完全で順序正しい列リストが指定されたように動作します(EXPLICIT_IDS も指定しなかった場
合、IDENTITY 列は省略されます)。
FROM
ロードするデータのソースを指定します。COPY コマンドを使用して、Amazon S3 のデータファ
イルからまたは Amazon DynamoDB テーブルから Amazon Redshift テーブルにデータをロードす
ることができます。テーブルから一連のファイルにデータをエクスポートするには、UNLOAD(p.295)
コマンドを使用します。
's3://objectpath'
データが入った Amazon S3 オブジェクトのパス。例えば、 's3://mybucket/ cust.txt' で
す。s3://objectpath は 1 つのファイルを参照することができ、また同じキープレフィックスを持つ
オブジェクトまたはフォルダの集合を参照することもできます。例えば、名前 custdata.txt は
custdata.txt.1、custdata.txt.2 など、複数の物理ファイルを参照するキープレフィックス
です。キープレフィックスは複数のフォルダを参照することもできます。例え
ば、's3://mybucket/custfolder' は custfolder_1、custfolder_2 などを参照します。
キープレフィックスが複数のフォルダを参照する場合、フォルダ内のすべてのファイルがロードさ
れます。
API Version 2012-12-01
189
Amazon Redshift データベース開発者ガイド
COPY
Important
データファイルを保持する Amazon S3 バケットはクラスターと同じリージョンに置く必
要があります。
単一の入力行の最大サイズは 4 MB です。
's3://manifest_file'
ロードするデータファイルをリストするマニフェストファイルの Amazon S3 オブジェクトキー。
manifest_file は明示的に 1 つのファイルを参照する必要があります。キープレフィックスにするこ
とはできません。例えば、's3://mybucket/manifest.txt' と指定します。
マニフェストは、Amazon S3 からロードする各ファイルの URL をリストする、JSON 形式のテキ
ストファイルです。URL にはバケット名およびファイルの完全オブジェクトパスが含まれます。
マニフェストに指定するファイルの場所は異なるバケットでもかまいませんが、すべてのバケット
は Amazon Redshift クラスターと同じリージョンに置かれている必要があります。次の例は、3 つ
のファイルをロードするマニフェストの JSON を示しています。
{
"entries": [
{"url":"s3://mybucket-alpha/custdata.1","mandatory":true},
{"url":"s3://mybucket-alpha/custdata.2","mandatory":true},
{"url":"s3://mybucket-beta/custdata.1","mandatory":false}
]
}
二重引用符が必要です。マニフェストの各エントリには、オプションとして mandatory フラグを
含めることができます。mandatory が true に設定されている場合、そのエントリのファイルが
見つからなければ、COPY は終了します。ファイルが見つかれば、COPY 処理は継続します。
mandatory 設定と関係なく、どのファイルも見つからない場合、COPY は終了します。mandatory
のデフォルト値は false です。
ENCRYPTED、GZIP、または LZOP オプションを指定している場合でも、マニフェストファイル
の暗号化または圧縮は行わないでください。指定したマニフェストファイルが見つからないか、マ
ニフェストファイルの形式が適切ではない場合、COPY はエラーを返します。
マニフェストファイルを使用する場合、COPY コマンドに MANIFEST オプションを指定する必要
があります。MANIFEST オプションを指定しない場合、COPY では、FROM で指定されたファイ
ルがデータファイルであると想定します。
'dynamodb://table_name'
データが入った Amazon DynamoDB テーブルの名前。例えば、'dynamodb://ProductCatalog'
と指定します。Amazon DynamoDB 属性が Amazon Redshift 列にマップされる方法の詳細につい
ては、「Amazon DynamoDB テーブルからデータをロードする (p. 71)」を参照してください。
Amazon DynamoDB テーブル名は AWS アカウントに固有のものです。AWS アカウントは AWS
アクセス認証情報によって識別されます。
WiTH
このキーワードはオプションです。
CREDENTIALS [AS] 'aws_access_credentials'
データが入った Amazon S3 バケットまたは Amazon DynamoDB テーブルの AWS アカウントアク
セス認証情報。アクセスキーとシークレットアクセスキーが必要です。データが暗号化されている
場合、認証情報にはマスター対称キーを含める必要があります。一時的アクセス認証情報を使用す
る場合、認証情報文字列に一時的セッショントークンを含める必要があります。詳細については、
「使用に関する注意事項」の「一時的セキュリティ認証情報 (p. 197)」を参照してください。
aws_access_credentials 文字列にはスペースを入れないでください。
API Version 2012-12-01
190
Amazon Redshift データベース開発者ガイド
COPY
アクセス認証情報は、ロード対象の Amazon S3 オブジェクトを取得しリストする権限、または
ロード対象の Amazon DynamoDB テーブルをスキャンし記述する権限を持つ AWS アカウントユー
ザーまたは IAM ユーザーに属する必要があります。
アクセスキーとシークレットアクセスキーのみ必要な場合、aws_access_credentials 文字列は次の
形式になります。
'aws_access_key_id=<access-key-id>;aws_secret_access_key=<secret-accesskey>'
<access-key-id> と <secret-access-key> は有効な AWS アカウント認証情報または IAM
ユーザー認証情報と置き換える必要があります。
一時トークン認証情報を使用するには、一時アクセスキー ID、一時秘密アクセスキー、および一
時トークンを提供する必要があります。aws_access_credentials 文字列は次の形式になります。
'aws_access_key_id=<temporary-access-key-id>;aws_secret_access_key=<temporarysecret-access-key>;token=<temporary-token>'
ENCRYPTED オプションを使用する場合、aws_access_credentials 文字列は次の形式になります。
'aws_access_key_id=<access-key-id>;aws_secret_access_key=<secret-accesskey>;master_symmetric_key=<master_key>'
ここで <master_key> はファイルの暗号化に使用されたマスターキーの値です。
READRATIO [AS] ratio
データロードに使用する Amazon DynamoDB テーブルのプロビジョニングされたスループットの
比率を指定します。Amazon DynamoDB からの COPY の実行には、READRATIO が必要です。
Amazon S3 からの COPY の実行には使用できません。この割合については、未使用のプロビジョ
ニングされたスループットの平均よりも小さい値に設定することを強くお勧めします。有効な値は
1~200 の整数です。
Caution
READRATIO を 100 以上に設定すると、Amazon Redshift で Amazon DynamoDB テーブ
ルのプロビジョニングされたスループット全体を使用できるようになり、COPY セッショ
ン中に同じテーブルに対する同時読み取り操作のパフォーマンスが大きく低下します。書
き込みトラフィックは影響を受けません。Amazon Redshift がテーブルのプロビジョニン
グされたスループットを満たさないまれなシナリオをトラブルシューティングする場合に
は、100 を超える値を使用できます。Amazon DynamoDB から Amazon Redshift に継続的
にデータをロードする場合、Amazon DynamoDB テーブルを時系列テーブルとして編成
し、COPY 操作からライブトラフィックを分離することを検討してください。
'option'
ロードオプションのリスト(オプション)。
FIXEDWIDTH 'fixedwidth_spec'
列を区切り記号で区切らずに各列幅を固定長にしたファイルからデータをロードします。
fixedwidth_spec はユーザー定義の列ラベルと列幅を指定する文字列です。列ラベルには、ユーザー
の選択に従って、テキスト文字列または整数を指定できます。列ラベルは列名と関係ありません。
ラベル/幅のペアの順序はテーブルの列の順序に正確に一致する必要があります。FIXEDWIDTH と
DELIMITER を併用することはできません。fixedwidth_spec の形式を次に示します。
'colLabel1:colWidth1,colLabel:colWidth2, ...'
API Version 2012-12-01
191
Amazon Redshift データベース開発者ガイド
COPY
DELIMITER [AS] ['delimiter_char']
パイプ文字(|)、カンマ(,)、タブ(\t)など、入力ファイルのフィールドを区切るときに使用す
る単一の ASCII 文字。非表示の ASCII 文字がサポートされています。ASCII 文字は "\ddd" 形式を
使用して 8 進数で表すこともできます。ここで "d" は 8 進数の数字(0~7)です。デフォルトの区
切り記号はパイプ文字(|)です。ただし、CSV オプションを使用する場合、デフォルトの区切り
記号はカンマ(,)です。AS キーワードはオプションです。DELIMITER と FIXEDWIDTH は併用
できません。
CSV
入力データで CSV 形式の使用を有効にします。区切り記号、改行文字、およびキャリッジリター
ンを自動的にエスケープするには、QUOTE オプションで指定した文字でフィールドを囲みます。
デフォルトの引用文字は二重引用符(")です。フィールド内で引用文字が使用されている場合、
引用文字を追加してその文字をエスケープします。例えば、引用文字が二重引用符である場合、文
字列 A "quoted" word を挿入するには、入力ファイルに文字列 "A ""quoted"" word" を含め
ます。CSV オプションを使用する場合、デフォルトの区切り記号はカンマ(,)です。DELIMITER
オプションを使用して、異なる区切り記号を指定できます。
フィールドを引用符で囲んだ場合、区切り記号と引用文字との間の空白は無視されます。区切り記
号がタブなどの空白文字である場合、その区切り記号は空白として扱われません。
CSV は FIXEDWIDTH、REMOVEQUOTES、または ESCAPE と共に使用することはできません。
QUOTE [AS] 'quote_character'
CSV オプションを使用する場合に引用文字として使用する文字を指定します。デフォルトは二重
引用符(")です。QUOTEオプションを使用して二重引用符以外の引用文字を定義した場合、フィー
ルド内で二重引用符をエスケープする必要はありません。QUOTE オプションは CSV オプション
と共にしか使用できません。AS キーワードはオプションです。
MANIFEST
ロードするデータファイルの識別にマニフェストを使用することを指定します。MANIFEST オプ
ションを使用した場合、COPY は 's3://manifest_file' で参照されたマニフェストにリスト
されたファイルからデータをロードします。マニフェストファイルが見つからない場合、または形
式が正しくない場合、COPY は失敗します。
ENCRYPTED
Amazon S3 の入力ファイルが暗号化されていることを指定します。「暗号化されたデータファイ
ルを Amazon S3 からロードする (p. 70)」を参照してください。暗号化されたファイルが gzip 形
式である場合、GZIP オプションを追加してください。
GZIP
入力ファイルが圧縮された gzip 形式(.gz ファイル)であることを指定します。COPY 操作では、
圧縮されたファイルを読み取り、ロード時にデータを解凍します。
LZOP
入力ファイルが圧縮された lzop 形式(.lzo ファイル)であることを指定します。COPY 操作では、
圧縮されたファイルを読み取り、ロード時にデータを解凍します。
Note
COPY は、lzop '--filter' オプションを使用して圧縮されたファイルをサポートしていませ
ん。
REMOVEQUOTES
入力データの文字列を囲む引用符は削除されます。区切り記号を含む引用符内のすべての文字は保
持されます。文字列に開始の一重または二重引用符があるが、対応する終了引用符がない場合、
COPY コマンドはその行をロードできず、エラーを返します。次の表は、引用符を含む文字列とそ
の結果、ロードされる値の簡単な例を示しています。
API Version 2012-12-01
192
Amazon Redshift データベース開発者ガイド
COPY
入力文字列
REMOVEQUOTES オプションでロードされる
値
"区切り記号はパイプ(|)文字です"
区切り記号はパイプ(|)文字です
'黒'
黒
"白"
白
青'
青'
'青
値はロードされません: エラー状態
"青
値はロードされません: エラー状態
' ' '黒' ' '
' '黒' '
''
<空白>
EXPLICIT_IDS
自動生成される値をテーブルのソースデータファイルの明示的値でオーバーライドするには、
IDENTITY 列を持つテーブルに EXPLICIT_IDS を使用します。コマンドに列リストが含まれる場
合、そのリストにはこのオプションを使用する IDENTITY 列が含まれている必要があります。
EXPLICIT_IDS 値のデータ形式は、CREATE TABLE 定義で指定された IDENTITY 形式に一致する
必要があります。
ACCEPTINVCHARS [AS] ['replacement_char']
データに無効な UTF-8 文字がある場合でも、VARCHAR 列へのデータのロードを有効にします。
ACCEPTINVCHARS を指定した場合、COPY は replacement_char で指定されている文字列から構
成される同じ長さの文字列で、無効な各 UTF-8 文字を置き換えます。例えば、置換文字が '^' であ
る場合、無効な 3 バイト文字は '^^^' で置き換えられます。
置換文字には NULL 以外の任意の ASCII 文字を使用できます。デフォルトは疑問符(?)です。無
効な UTF-8 文字の詳細については、「マルチバイト文字のロードエラー (p. 78)」を参照してくだ
さい。
COPY は無効な UTF-8 文字を含んだ行の数を返し、対象行ごとに STL_REPLACEMENTS (p. 503)
システムテーブルにエントリを追加します(各ノードスライスで最大 100 行まで)。さらに多く
の無効な UTF-8 文字も置き換えられますが、それらの置換イベントは記録されません。
ACCEPTINVCHARS を指定しなかった場合、無効な UTF-8 文字があるごとに、COPY はエラーを
返します。
ACCEPTINVCHARS は VARCHAR 列に対してのみ有効です。
MAXERROR [AS] error_count
ロードのエラー数が error_count 以上である場合、ロードは失敗します。ロードのエラーがそれよ
り少ない場合、処理は続行され、ロードできなかった行数を示す INFO メッセージが返されます。
データの形式エラーやその他の不整合のために一部の行をテーブルにロードできないときにロード
を継続できるようにするには、このオプションを使用します。最初のエラーが発生したときにロー
ドを失敗させる場合、この値を 0 または 1 に設定します。AS キーワードはオプションです。
Amazon Redshift の並列処理のため、報告される実際のエラー数が指定された MAXERROR より
大きくなることがあります。Amazon Redshift クラスターのノードで MAXERROR を超えたこと
が検出された場合、各ノードは発生したすべてのエラーを報告します。
DATEFORMAT [AS] {'dateformat_string' | 'auto' }
DATEFORMAT を指定しない場合、デフォルト形式は 'YYYY-MM-DD' です。例えば、有効な代替
形式は 'MM-DD-YYYY' です。
API Version 2012-12-01
193
Amazon Redshift データベース開発者ガイド
COPY
Amazon Redshift でソースデータの日付形式を自動的に認識して変換する場合、'auto' を指定し
ます。'auto' キーワードでは大文字小文字を区別します。詳細については、「DATEFORMAT と
TIMEFORMAT で自動認識を使用する (p. 199)」を参照してください。
日付形式には時間情報(時、分、秒)を含めることができますが、この情報は無視されます。AS
キーワードはオプションです。詳細については、「 DATEFORMAT と TIMEFORMAT の文字
列 (p. 198)」を参照してください。
TIMEFORMAT [AS] {'timeformat_string' | 'auto' | 'epochsecs' | 'epochmillisecs' }
TIMEFORMAT を指定しない場合、デフォルト形式は YYYY-MM-DD HH:MI:SS です。
timeformat_string の詳細については、「 DATEFORMAT と TIMEFORMAT の文字列 (p. 198)」を参
照してください。
Amazon Redshift でソースデータの時間形式を自動的に認識して変換する場合、'auto' を指定し
ます。詳細については、「DATEFORMAT と TIMEFORMAT で自動認識を使用する (p. 199)」を参
照してください。
ソースデータがエポック時間(1970 年 1 月 1 日 00:00:00 UTC からの秒数またはミリ秒数)で表
されている場合、'epochsecs' または 'epochmillisecs' を指定します。
'auto'、epochsecs、epochmillisecs の各キーワードでは大文字小文字を区別します。
AS キーワードはオプションです。
IGNOREHEADER [ AS ] number_rows
指定された number_rows をファイルヘッダーとして扱い、ロードされせん。並列ロードですべて
のファイルのファイルヘッダーをスキップするには、IGNOREHEADER を使用します。
ACCEPTANYDATE
00/00/00 00:00:00 などの無効な形式を含め、任意の日付形式をエラーなしにロードできるよ
うにします。TIMESTAMP 列および DATE 列にのみ適用されます。ACCEPTANYDATE は常に
DATEFORMAT オプションと共に使用します。データの日付形式が DATEFORMAT の仕様と一致
しない場合、Amazon Redshift はそのフィールドに NULL 値を挿入します。
IGNOREBLANKLINES
データファイルでラインフィードのみ含む空白行を無視し、ロードしません。
TRUNCATECOLUMNS
列の仕様に合うよう、該当する文字数で列のデータを切り捨てます。データ型が VARCHAR か
CHAR である列にのみ適用されます。
FILLRECORD
一部のレコードの最後で連続する列が欠落している場合に、データをロードできるようにします。
欠落している列には、対象列のデータ型に合わせて、長さがゼロの文字列または NULL が記入され
ます。EMPTYASNULL オプションが COPY コマンドにあり、欠落している列が VARCHAR 列で
ある場合、NULL がロードされます。EMPTYASNULL がなく、列が VARCHAR である場合、長さ
がゼロの文字列がロードされます。NULL の置き換えは、列定義で NULL が使用できる場合にのみ
可能です。
例えば、テーブル定義に 4 つの null が許容された CHAR 列があり、レコードに値 apple, orange,
banana, mango がある場合、COPY コマンドは値 apple, orange のみを含むレコードをロー
ドし、記入できます。欠落している CHAR 値は NULL 値としてロードされます。
TRIMBLANKS
VARCHAR 文字列から末尾の空白文字を削除します。データ型が VARCHAR である列にのみ適用
できます。
NOLOAD
データを実際にロードせずにデータファイルの有効性をチェックします。実際にデータロードを実
行せずに、エラーなしでデータファイルがロードされることを確認するには、NOLOAD オプショ
ンを使用します。NOLOAD オプションと共に COPY を実行すると、ファイルを解析するだけであ
るため、データのロードよりはるかに高速になります。
API Version 2012-12-01
194
Amazon Redshift データベース開発者ガイド
COPY
NULL AS 'null_string'
null_string に一致するフィールドを NULL としてロードします。ここで null_string は任意の文字列
です。このオプションは数値列では使用できません。NULL を INT などの数値列にロードするに
は、空のフィールドを使用してください。データに null ターミネータ(NUL(UTF-8 0000)また
はバイナリゼロ(0x000)と呼ばれることもあります)が含まれる場合、COPY はレコードの終わ
り(EOR)として扱い、レコードを終了します。フィールドに NUL のみ含まれる場合、'\0' ま
たは '\000' を指定することで、NULL AS を使用して null ターミネータを NULL で置き換えるこ
とができます。例えば、NULL AS '\0' または NULL AS '\000' とします。フィールドに NUL
で終わる文字列が含まれており、NULL AS を指定した場合、文字列の最後に NUL が挿入されま
す。null_string 値に '\n'(改行)は使用しないでください。Amazon Redshift では '\n' を行区切り記
号として使用するよう予約しています。デフォルトの null_string は '\N' です。
EMPTYASNULL
Amazon Redshift で CHAR と VARCHAR の空のフィールドを NULL としてロードすることを指定
します。INT など、他のデータ型の空のフィールドは常に NULL でロードされます。データに 2 つ
の区切り記号が連続し、区切り記号の間に文字がない場合、空のフィールドになります。
EMPTYASNULL と NULL AS ''(空の文字列)は、同様の動作を行う相互に排他のオプションで
す。
BLANKSASNULL
NULL など、空白文字のみから構成される空のフィールドをロードします。このオプションは CHAR
と VARCHAR の列にのみ適用されます。INT など、他のデータ型の空のフィールドは常に NULL
でロードされます。例えば、3 つの連続するスペース文字を含む(それ以外の文字はない)文字列
は NULL としてロードされます。このオプションなしのデフォルト動作では、スペース文字をその
ままロードします。
COMPROWS numrows
圧縮分析のサンプルサイズとして使用される行数。分析は各データスライスの行に対して実行され
ます。例えば、COMPROWS 1000000(1,000,000)を指定し、システムに合計 4 つのスライスが含
まれている場合、スライスごとに 250,000 行のみが読み取られ、分析されます。
COMPROWS を指定しない場合、サンプルサイズはデフォルトでスライスごとに 100,000 になり
ます。COMPROWS の値がスライスごとに 100,000 行のデフォルト値より小さい場合、自動的に
デフォルト値にアップグレードされます。ただし、ロードされるデータの量が有意のサンプルとし
ては不十分な場合、自動圧縮は実行されません。
COMPROWS 数が入力ファイルの行数より大きい場合でも、COPY コマンドは続行し、利用可能
なすべての行に対して圧縮分析を実行します。このオプションの許容範囲は 1000~1000000000
(1,000,000,000)の数値です。
COMPUPDATE [ { ON | TRUE } | { OFF | FALSE } ]
COPY 実行中に圧縮エンコードを自動的に適用するかどうかを制御します。
COPY コマンドは、入力データのサンプルに基づいてターゲットテーブルの各列の最適な圧縮エン
コードを自動的に選択します。詳細については、「自動圧縮ありでテーブルをロードする (p. 73)」
を参照してください。
COMPUPDATE を省略した場合、ターゲットテーブルが空でありテーブルのすべての列に RAW
エンコードがあるかまったくエンコードがないときにのみ、COPY は自動圧縮を適用します。これ
がデフォルトの動作です。
COMPUPDATE ON(または TRUE)の場合、テーブル列に RAW 以外のエンコードがある場合
も、テーブルが空であれば COPY は自動圧縮を適用します。既存のエンコードは置き換えられま
す。COMPUPDATE を指定した場合、これがデフォルトです。
COMPUPDATE OFF(または FALSE)の場合、自動圧縮は無効になります。
STATUPDATE [ { ON | TRUE } | { OFF | FALSE } ]
COPY コマンドが成功したとき最後に行う自動計算とオプティマイザ統計の更新を制御します。デ
フォルトでは、STATUPDATE オプションを使用しない場合、テーブルが最初に空ならば、統計は
自動的に更新されます。テーブルを分析する (p. 83)も参照してください。
API Version 2012-12-01
195
Amazon Redshift データベース開発者ガイド
COPY
データを空ではないテーブルに入れるとテーブルのサイズが大きく変化する場合は、常に
ANALYZE (p. 180) コマンドを実行するか STATUPDATE ON オプションを使用して統計を更新する
ことをお勧めします。
STATUPDATE ON(または TRUE)の場合、テーブルが最初に空であるかどうかに関係なく、統
計は自動的に更新されます。STATUPDATE を使用する場合、現在のユーザーはテーブル所有者ま
たはスーパーユーザーであることが必要です。STATUPDATE を指定しない場合、INSERT 権限の
み必要です。
STATUPDATE OFF(または FALSE)を使用すると、統計は更新されません。
ESCAPE
このオプションを指定した場合、入力データのバックスラッシュ文字(\)はエスケープ文字とし
て扱われます。バックスラッシュ文字の直後に続く文字は、通常は特定の目的に使用される文字で
ある場合でも、現在の列の値の一部としてテーブルにロードされます。例えば、区切り文字、引用
符、埋め込まれた改行、またはエスケープ文字自体のいずれかが正当な列の値として含まれている
場合、このオプションを使用してその文字をエスケープできます。
REMOVEQUOTES オプションと組み合わせて ESCAPE オプションを使用すると、他の場合には
削除される引用符(' または ")をエスケープし保持することができます。デフォルトの null 文字
列 \N はそのまま使用できますが、入力データで \\N としてエスケープすることもできます。NULL
AS オプションで代替 null 文字列を指定しない限り、\N と \\N は同じ結果になります。
Note
制御文字 0x00(NUL)はエスケープできません。入力データから削除するか変換してく
ださい。この文字はレコードの終わり(EOR)マーカーとして扱われ、レコードの残りの
部分は切り捨てられます。
FIXEDWIDTH ロードに対して ESCAPE オプションを使用することはできません。また、エスケー
プ文字自体を指定することはできません。エスケープ文字は常にバックスラッシュ文字です。ま
た、入力データの適切な場所にエスケープ文字が含まれていることを確認する必要があります。
次に、ESCAPE オプションを指定する場合の入力データおよびその結果、ロードされるデータの
例を示します。行 4 の結果は、REMOVEQUOTES オプションも指定されていることを想定してい
ます。入力データはパイプで区切られた 2 つのフィールドで構成されています。
1|The quick brown fox\[newline]
jumped over the lazy dog.
2| A\\B\\C
3| A \| B \| C
4| 'A Midsummer Night\'s Dream'
列 2 にロードされるデータは次のようになります。
The quick brown fox
jumped over the lazy dog.
A\B\C
A|B|C
A Midsummer Night's Dream
Note
ロード用の入力データにエスケープ文字を適用する作業はユーザーが担当します。ただ
し、ESCAPE オプションを使用して以前アンロードされたデータを再ロードした場合は例
外となります。この場合、データにはすでに必要なエスケープ文字が含まれています。
API Version 2012-12-01
196
Amazon Redshift データベース開発者ガイド
COPY
ESCAPE オプションでは 8 進数、16 進数、Unicode、またはその他のエスケープシーケンス表記
を解釈しません。例えば、ソースデータに 8 進数のラインフィード値(\012)があり、ESCAPE
オプションを使用してこのデータをロードしようとすると、値 012 はテーブルにロードされます。
この値は、エスケープされているラインフィードとしては解釈されません。
Windows プラットフォームからのデータの改行をエスケープするには、2 つのエスケープ文字の使
用が必要となることがあります。1 つはキャリッジリターン用、もう 1 つはラインフィード用で
す。または、ファイルのロード前にキャリッジリターンを削除することができます(例えば、
dos2unix utility を使用)。
ROUNDEC
デフォルトで、COPY コマンドは、スケールがその列のスケールを超える数値を切り上げません。
この値を切り上げる場合、ROUNDEC オプションを使用します。例えば、ROUNDEC オプション
を使用し、20.259 の値を DECIMAL(8,2) 列にロードすると、保存される値は 20.26 です。
ROUNDEC オプションを使用しない場合、保存される値は 20.25 です。ROUNDEC オプションに
関して、INSERT コマンドは COPY コマンドと同じように動作します。
使用に関する注意事項
Topics
• Amazon S3 からのマルチバイトデータのロード (p. 197)
• 複数ファイル読み取り時のエラー (p. 197)
• 一時的セキュリティ認証情報 (p. 197)
• DATEFORMAT と TIMEFORMAT の文字列 (p. 198)
• DATEFORMAT と TIMEFORMAT で自動認識を使用する (p. 199)
Amazon S3 からのマルチバイトデータのロード
データに ASCII 以外のマルチバイト文字(漢字、キリル文字など)が含まれている場合、データは
VARCHAR 列にロードする必要があります。VARCHAR データ型は 4 バイトの UTF-8 文字をサポート
しますが、CHAR データ型はシングルバイトの ASCII 文字のみを受け取ります。5 バイト以上の文字を
Amazon Redshift テーブルにロードすることはできません。詳細については、「マルチバイト文
字 (p. 128)」を参照してください。
複数ファイル読み取り時のエラー
COPY コマンドはアトミックでトランザクショナルです。COPY コマンドが複数のファイルからデー
タを読み取る場合でも、プロセス全体は 1 つのトランザクションとして扱われます。COPY でファイ
ル読み取りにエラーが発生した場合、プロセスがタイムアウトになるまで(「statement_timeout (p. 572)」
を参照)、または長時間(15~30 分間)Amazon S3 からデータをダウンロードできないときは各ファ
イルが 1 回のみロードするようにして、自動的にファイル読み取りを再試行します。COPY コマンド
が失敗した場合、トランザクション全体が中止され、変更はすべてロールバックされます。ロードエ
ラー処理の詳細については、「データロードのトラブルシューティング (p. 76)」を参照してください。
一時的セキュリティ認証情報
一時的セキュリティ認証情報を使い、データにアクセスするユーザーを制限できます。一時的セキュリ
ティ認証情報はセキュリティを強化します。使用期限が短く、期限が切れた後は再利用できないためで
す。トークンを使用して生成されるアクセスキー ID とシークレットアクセスキーはトークンなしに使
用できません。これらの一時的セキュリティ認証情報を持つユーザーは認証情報の有効期限内のみリ
ソースにアクセスできます。
ユーザーにリソースへの一時的アクセスを許可するには、AWS Security Token Service(STS)API を
呼び出します。AWS STS API は、セキュリティトークン、アクセスキー ID、およびシークレットアク
セスキーから構成される一時的セキュリティ認証情報を返します。一時的セキュリティ認証情報は、リ
API Version 2012-12-01
197
Amazon Redshift データベース開発者ガイド
COPY
ソースへの一時的アクセスを必要とするユーザーに発行します。これらのユーザーは既存の IAM ユー
ザーであるか、非 AWS ユーザーです。一時的セキュリティ認証情報の作成の詳細については、AWS
Identity and Access Management(IAM)のドキュメントの「Using Temporary Security Credentials」
を参照してください。
COPY コマンドで一時的セキュリティ認証情報を使用するには、認証情報文字列に token=option を
含めます。トークンと共に提供されているアクセスキー ID とシークレットアクセスキーを指定する必
要があります。
Note
次の例では読みやすくするため、改行しています。aws_access_credentials 文字列には改行や
スペースを含めないでください。
一時的セキュリティ認証情報を使用する COPY コマンドの構文は次のとおりです。
copy table_name
from 's3://objectpath'
credentials 'aws_access_key_id=<temporary-access-key-id>;aws_secret_ac
cess_key=<temporary-secret-access-key>;token=<temporary-token>';
次の例では、一時的認証情報とファイル暗号化を使用して LISTING テーブルをロードします。
copy listing
from 's3://mybucket/data/listings_pipe.txt'
credentials 'aws_access_key_id=<temporary-access-key-id><aws_secret_ac
cess_key=<temporary-secret-access-key>;token=<temporary-token>;master_symmet
ric_key=<master_key>'
encrypted;
Important
一時的セキュリティ認証情報は、COPY ステートメントの期間全体で有効にする必要がありま
す。一時的セキュリティ認証情報の期限がロードプロセス中に切れた場合、COPY は失敗し、
処理はロールバックされます。例えば、一時的セキュリティ認証情報の期限が 15 分後に切れ
るときに COPY に 1 時間かかる場合、COPY は完了前に失敗します。
DATEFORMAT と TIMEFORMAT の文字列
COPY コマンドの DATEFORMAT と TIMEFORMAT オプションでは書式文字列を取ります。これらの
文字列には、日時区切り記号('-'、'/'、':' など)、および次の日付部分と時間部分を含めることがで
きます。
日付部分/時間部分
意味
YY
年(世紀なし)
YYYY
年(世紀あり)
MM
月(数字)
MON
月(名前。省略名またはフルネーム)
DD
日(数字)
HH または HH24
時(24 時間制)
API Version 2012-12-01
198
Amazon Redshift データベース開発者ガイド
COPY
日付部分/時間部分
意味
HH12
時(12 時間制)
MI
分
SS
秒
AM または PM
午前午後の指標(12 時間制用)
デフォルトのタイムスタンプ形式は YYYY-MM-DD HH:MI:SS です。デフォルトの日付形式は YYYY-MM-DD
です。秒(SS)フィールドは小数点以下の秒もサポートしています(マイクロ秒まで)。次の例に示
すように、TIMEFORMAT 文字列の日付と時間のセクションの間には 1 つのスペース文字を指定する必
要があります。
例えば、次の DATEFORMAT と TIMEFORMAT の文字列は有効です。
COPY 構文
有効な入力文字列の例
DATEFORMAT AS
'MM/DD/YYYY'
03/31/2003
DATEFORMAT AS 'MON DD,
YYYY'
March 31, 2003
TIMEFORMAT AS
'MM.DD.YYYY HH:MI:SS'
03.31.2003 18:45:05
03.31.2003 18:45:05.123456
DATEFORMAT と TIMEFORMAT で自動認識を使用する
DATEFORMAT または TIMEFORMAT オプションのパラメータとして 'auto' を指定すると、Amazon
Redshift ではソースデータの日付形式または時間形式を自動的に認識して変換します。以下に例を示し
ます。
copy favoritemovies from 'dynamodb://ProductCatalog'
credentials 'aws_access_key_id=<access-key-id>; aws_secret_access_key=<secretaccess-key>'
dateformat 'auto';
DATEFORMAT と TIMEFORMAT に 'auto' オプションを使用すると、COPY は「 DATEFORMAT と
TIMEFORMAT の文字列 (p. 198)」の表に示された日付と時間の形式を認識して変換します。また、'auto'
オプションは次の形式を認識します。
形式
有効な入力文字列の例
ユリウス日
J2451187
BC
Jan-08-95 BC
YYYYMMDD HHMISS
19960108 040809
YYMMDD HHMISS
960108 040809
YYYY.DDD
1996.008
API Version 2012-12-01
199
Amazon Redshift データベース開発者ガイド
COPY
形式
有効な入力文字列の例
YYYY.DDD YYYY-MM-DD
HH:MI:SS.SSS
1996-01-08 04:05:06.789
日付またはタイムスタンプの値が自動的に変換されるかどうかをテストするには、CAST 関数を使用し
て文字列を日付またはタイムスタンプの値に変換します。例えば、次のコマンドはタイムスタンプ値
'J2345678 04:05:06.789' をテストします。
create table formattest (test char(16);
insert into formattest values('J2345678 04:05:06.789');
select test, cast(test as timestamp) as timestamp, cast(test as date) as date
from formattest;
test
|
timestamp
| date
----------------------+---------------------+-----------J2345678 04:05:06.789
1710-02-23 04:05:06 1710-02-23
DATE 列のソースデータに時間情報が含まれる場合、時間コンポーネントは切り捨てられます。
TIMESTAMP 列のソースデータで時間情報が省略されている場合、時間コンポーネントには 00:00:00
が使用されます。
COPY の例
Note
次の例では読みやすくするため、改行しています。aws_access_credentials 文字列には改行や
スペースを含めないでください。
Amazon DynamoDB テーブルから FAVORITEMOVIES をロードする
AWS SDK には、"my-favorite-movies-table" という Amazon DynamoDB テーブルを作成する簡単な例
が含まれています(「AWS SDK for Java」を参照)。この例では、Amazon DynamoDB テーブルの
データを Amazon Redshift の FAVORITEMOVIES テーブルにロードします。Amazon Redshift テーブ
ルはすでにデータベースに存在する必要があります。
copy favoritemovies from 'dynamodb://ProductCatalog'
credentials 'aws_access_key_id=<access-key-id>;aws_secret_access_key=<secretaccess-key>'
readratio 50;
Amazon S3 バケットから LISTING をロードする
copy listing
from 's3://mybucket/data/listing/'
credentials 'aws_access_key_id=<access-key-id>;aws_secret_access_key=<secretaccess-key>;
マニフェストを使用し、データファイルを指定する
マニフェストを使用すると、COPY コマンドで必要なすべてのファイル、しかも必要なファイルのみを
Amazon S3 からロードできます。異なるバケットの複数のファイル、または同じプレフィックスを共
有しない複数のファイルをロードする必要がある場合も、マニフェストを使用できます。
API Version 2012-12-01
200
Amazon Redshift データベース開発者ガイド
COPY
例えば、3 つのファイル custdata1.txt、custdata2.txt、custdata3.txt をロードする必要が
あるとします。次のコマンドを使用し、プレフィックスを指定することで、mybucket 内で custdata
で始まるすべてのファイルをロードすることができます。
copy category
from 's3://mybucket/custdata'
credentials 'aws_access_key_id=<access-key-id>;aws_secret_access_key=<secretaccess-key>';
エラーまたは結果整合性のために 2 つのファイルしか存在しない場合、COPY はこれら 2 つのファイ
ルのみロードし、正しく終了しますが、データロードは未完了になります。バケットに
custdata.backup というファイルも含まれている場合、COPY はそのファイルもロードし、不要デー
タがロードされたことになります。
必要なファイルがすべてロードされ、不要なデータがロードされないようにするには、マニフェスト
ファイルを使用できます。マニフェストは、COPY コマンドで処理されるファイルをリストする、JSON
形式のテキストファイルです。例えば、次のマニフェストは前の例の 3 つのファイルをロードします。
{
"entries": [
{"url":"s3://mybucket/custdata.1","mandatory":true},
{"url":"s3://mybucket/custdata.2","mandatory":true},
{"url":"s3://mybucket/custdata.3","mandatory":true}
]
}
オプションの mandatory フラグは、ファイルが存在しない場合に COPY を終了することを示します。
デフォルトは false です。この例で、ファイルが見つからない場合、COPY はエラーを返します。
custdata.backup など、キープレフィックスのみ指定した場合に選択された可能性がある不要なファ
イルは、マニフェストにないため、無視されます。次の例では、前の例のマニフェスト cust.manifest
を使用します。
copy customer
from 's3://mybucket/cust.manifest'
credentials 'aws_access_key_id=<access-key-id>;aws_secret_access_key=<secretaccess-key>'
manifest;
マニフェストを使用し、異なるバケットからファイルをロードしたり、同じプレフィックスを共有しな
いファイルをロードしたりできます。次の例は、日付スタンプで始まる名前を持つファイルのデータを
ロードする JSON を示しています。
{
"entries": [
{"url":”s3://mybucket/2013-10-04-custdata.txt","mandatory":true},
{"url":”s3://mybucket/2013-10-05-custdata.txt”,"mandatory":true},
{"url":”s3://mybucket/2013-10-06-custdata.txt”,"mandatory":true},
{"url":”s3://mybucket/2013-10-07-custdata.txt”,"mandatory":true}
]
}
バケットがクラスターと同じリージョンにある限り、マニフェストは異なるバケットにあるファイルを
リストできます。
API Version 2012-12-01
201
Amazon Redshift データベース開発者ガイド
COPY
{
"entries": [
{"url":"s3://mybucket-alpha/custdata1.txt","mandatory":false},
{"url":"s3://mybucket-beta/custdata1.txt","mandatory":false},
{"url":"s3://mybucket-beta/custdata2.txt","mandatory":false}
]
}
パイプ区切りファイル(デフォルトの区切り記号)から LISTING をロードする
次の例は、オプションが指定されておらず、入力ファイルにデフォルトの区切り記号であるパイプ文字
(|)が含まれる簡単な場合を示しています。
copy listing
from 's3://mybucket/data/listings_pipe.txt'
credentials 'aws_access_key_id=<access-key-id>;aws_secret_access_key=<secretaccess-key>';
一時的認証情報を使用した LISTING のロード
次の例では、TOKEN オプションを使用して一時的セッション認証情報を指定します。
copy listing
from 's3://mybucket/data/listings_pipe.txt'
credentials 'aws_access_key_id=<temporary-access-key-id>;aws_secret_ac
cess_key=<temporary-secret-access-key>;token=<temporary-token>';
オプションを使用した EVENT のロード
次の例では、パイプ区切りデータを EVENT テーブルにロードし、次のルールを適用します。
•
•
•
•
引用符のペアを使用して文字列を囲んでいる場合、引用符は削除されます。
空の文字列と空白を含む文字列は NULL 値としてロードされます。
5 件を超えるエラーが返されると、ロードは失敗します。
タイムスタンプ値は指定された形式に準拠する必要があります。例えば、2008-09-26 05:43:12
は有効なタイムスタンプです。
copy event
from 's3://mybucket/data/allevents_pipe.txt'
credentials 'aws_access_key_id=<access-key-id>;aws_secret_access_key=<secretaccess-key>'
removequotes
emptyasnull
blanksasnull
maxerror 5
delimiter '|'
timeformat 'YYYY-MM-DD HH:MI:SS';
API Version 2012-12-01
202
Amazon Redshift データベース開発者ガイド
COPY
固定幅のデータファイルから VENUE をロードする
copy venue
from 's3://mybucket/data/venue_fw.txt'
credentials 'aws_access_key_id=<access-key-id>;aws_secret_access_key=<secretaccess-key>'
fixedwidth 'venueid:3,venuename:25,venuecity:12,venuestate:2,venueseats:6';
この例では、下のサンプルデータと同じ形式のデータファイルを想定しています。下の例では、すべて
の列が仕様に示された幅と同じになるよう、スペースがプレースホルダーの役割を果たします。
1
2
3
4
5
Toyota Park
Bridgeview
Columbus Crew Stadium
Columbus
RFK Stadium
Washington
CommunityAmerica BallparkKansas City
Gillette Stadium
Foxborough
IL0
OH0
DC0
KS0
MA68756
CSV ファイルから CATEGORY をロードする
ファイル category_csv.txt に次のテキストが含まれているとします。
12,Shows,Musicals,Musical theatre
13,Shows,Plays,All "non-musical" theatre
14,Shows,Opera,All opera, light, and "rock" opera
15,Concerts,Classical,All symphony, concerto, and choir concerts
カンマ区切り入力を指定する DELIMITER オプションを使用して category_csv.txt ファイルをロードし
た場合、一部の入力フィールドにカンマが含まれているため、COPY は失敗します。この問題を避ける
には、CSV オプションを使用し、カンマを含むフィールドを引用符で囲みます。引用符で囲んだ文字
列内に引用符がある場合、引用符を 2 つにしてエスケープする必要があります。デフォルトの引用符は
二重引用符です。したがって、二重引用符を追加して二重引用符をエスケープする必要があります。新
しい入力ファイルは次のようになります。
12,Shows,Musicals,Musical theatre
13,Shows,Plays,"All ""non-musical"" theatre"
14,Shows,Opera,"All opera, light, and ""rock"" opera"
15,Concerts,Classical,"All symphony, concerto, and choir concerts"
次の COPY コマンドを使用して、category_csv.txt をロードできます。
copy category
from 's3://mybucket/data/category_csv.txt'
credentials 'aws_access_key_id=<access-key-id>;aws_secret_access_key=<secretaccess-key>'
csv;
入力内の二重引用符をエスケープする必要をなくすため、QUOTE AS オプションを使用して異なる引
用文字を指定できます。例えば、category_csv.txt の次のバージョンでは引用文字として "%" を使
用しています。
12,Shows,Musicals,Musical theatre
13,Shows,Plays,%All "non-musical" theatre%
API Version 2012-12-01
203
Amazon Redshift データベース開発者ガイド
COPY
14,Shows,Opera,%All opera, light, and "rock" opera%
15,Concerts,Classical,%All symphony, concerto, and choir concerts%
次の COPY コマンドでは QUOTE AS を使用して category_csv.txt をロードします。
copy category
from 's3://mybucket/data/category_csv.txt'
credentials 'aws_access_key_id=<access-key-id>;aws_secret_access_key=<secretaccess-key>'
csv quote as '%';
IDENTITY 列の明示的値を使用して VENUE をロードする
この例では、VENUE テーブルの作成時に少なくとも 1 列(venueid 列など)は IDENTITY 列とする
よう指定されたと想定しています。このコマンドは IDENTITY 列の自動生成値のデフォルトの IDENTITY
動作をオーバーライドし、代わりに venue.txt ファイルから明示的値をロードします。
copy venue
from 's3://mybucket/data/venue.txt'
credentials 'aws_access_key_id=<access-key-id>;aws_secret_access_key=<secretaccess-key>'
explicit_ids;
パイプ区切りの GZIP ファイルから TIME をロードする
この例では、パイプ区切りの GZIP ファイルから TIME テーブルをロードします。
copy time
from 's3://mybucket/data/timerows.gz'
credentials 'aws_access_key_id=<access-key-id>;aws_secret_access_key=<secretaccess-key>'
gzip
delimiter '|';
タイムスタンプ/日付スタンプのロード
この例では、書式設定したタイムスタンプ付きのデータをロードします。
Note
TIMEFORMAT HH:MI:SS では、SS を超える小数点以下の秒数もマイクロ秒単位までサポート
します。この例で使用されるファイル time.txt には 2009-01-12 14:15:57.119568 とい
う 1 行が含まれています。
copy timestamp1
from 's3://mybucket/data/time.txt'
credentials 'aws_access_key_id=<access-key-id>;aws_secret_access_key=<secretaccess-key>'
timeformat 'YYYY-MM-DD HH:MI:SS';
このコピーの結果は次のとおりです。
API Version 2012-12-01
204
Amazon Redshift データベース開発者ガイド
COPY
select * from timestamp1;
c1
---------------------------2009-01-12 14:15:57.119568
(1 row)
デフォルト値を使用してファイルのデータをロードする
この例では、TICKIT データベースの VENUE テーブルのバリエーションを使用します。次のステート
メントで定義される VENUE_NEW テーブルを考えてみます。
create table venue_new(
venueid smallint not null,
venuename varchar(100) not null,
venuecity varchar(30),
venuestate char(2),
venueseats integer not null default '1000');
次の例に示すように、VENUESEATS 列に値がない venue_noseats.txt データファイルを考えてみます。
1|Toyota Park|Bridgeview|IL|
2|Columbus Crew Stadium|Columbus|OH|
3|RFK Stadium|Washington|DC|
4|CommunityAmerica Ballpark|Kansas City|KS|
5|Gillette Stadium|Foxborough|MA|
6|New York Giants Stadium|East Rutherford|NJ|
7|BMO Field|Toronto|ON|
8|The Home Depot Center|Carson|CA|
9|Dick's Sporting Goods Park|Commerce City|CO|
10|Pizza Hut Park|Frisco|TX|
次の COPY ステートメントはファイルからテーブルを正しくロードし、省略された列に DEFAULT 値
('1000')を適用します。
copy venue_new(venueid, venuename, venuecity, venuestate)
from 's3://mybucket/data/venue_noseats.txt'
credentials 'aws_access_key_id=<access-key-id>;aws_secret_access_key=<secretaccess-key>'
delimiter '|';
ロードされたテーブルを表示します。
select * from venue_new order by venueid;
venueid |
venuename
|
venuecity
| venuestate | venueseats
---------+----------------------------+-----------------+------------+----------1 | Toyota Park
| Bridgeview
| IL
|
1000
2 | Columbus Crew Stadium
| Columbus
| OH
|
1000
3 | RFK Stadium
| Washington
| DC
|
1000
4 | CommunityAmerica Ballpark | Kansas City
| KS
|
1000
5 | Gillette Stadium
| Foxborough
| MA
|
1000
6 | New York Giants Stadium
| East Rutherford | NJ
|
1000
7 | BMO Field
| Toronto
| ON
|
1000
8 | The Home Depot Center
| Carson
| CA
|
1000
API Version 2012-12-01
205
Amazon Redshift データベース開発者ガイド
COPY
9 | Dick's Sporting Goods Park | Commerce City
10 | Pizza Hut Park
| Frisco
(10 rows)
| CO
| TX
|
|
1000
1000
次の例の場合、ファイルに VENUESEATSデータが含まれていないことを想定すると共に、VENUENAME
データも含まれていないことを想定します。
1||Bridgeview|IL|
2||Columbus|OH|
3||Washington|DC|
4||Kansas City|KS|
5||Foxborough|MA|
6||East Rutherford|NJ|
7||Toronto|ON|
8||Carson|CA|
9||Commerce City|CO|
10||Frisco|TX|
同じテーブル定義を使用すると、次の COPY ステートメントは失敗します。これは、VENUENAME に
対して DEFAULT 値が指定されておらず、VENUENAME が NOT NULL 列であるためです。
copy venue(venueid, venuecity, venuestate)
from 's3://mybucket/data/venue_pipe.txt'
credentials 'aws_access_key_id=<access-key-id>;aws_secret_access_key=<secretaccess-key>'
delimiter '|';
次に、IDENTITY 列を使用する VENUE テーブルのバリエーションを考えてみます。
create table venue_identity(
venueid int identity(1,1),
venuename varchar(100) not null,
venuecity varchar(30),
venuestate char(2),
venueseats integer not null default '1000');
前の例と同じように、VENUESEATS 列にはソースファイルに対応する値がないと想定します。次の
COPY ステートメントは、IDENTITY データ値を自動生成する代わりに事前定義済みの IDENTITY デー
タ値を含め、テーブルを正しくロードします。
copy venue(venueid, venuename, venuecity, venuestate)
from 's3://mybucket/data/venue_pipe.txt'
credentials 'aws_access_key_id=<access-key-id>;aws_secret_access_key=<secretaccess-key>'
delimiter '|' explicit_ids;
次のステートメントは失敗します。これは、IDENTITY 列が含まれていない(列リストから VENUEID
が抜けています)が、EXPLICIT_IDS オプションが含まれているためです。
copy venue(venuename, venuecity, venuestate)
from 's3://mybucket/data/venue_pipe.txt'
credentials 'aws_access_key_id=<access-key-id>;aws_secret_access_key=<secret-
API Version 2012-12-01
206
Amazon Redshift データベース開発者ガイド
COPY
access-key>'
delimiter '|' explicit_ids;
次のステートメントは失敗します。これは EXPLICIT_IDS オプションが含まれていないためです。
copy venue(venueid, venuename, venuecity, venuestate)
from 's3://mybucket/data/venue_pipe.txt'
credentials 'aws_access_key_id=<access-key-id>;aws_secret_access_key=<secretaccess-key>'
delimiter '|';
ESCAPE データを使用したデータのコピー
この例は、区切り文字(この場合、パイプ文字)に一致する文字をロードする方法を示しています。入
力ファイルで、ロードするすべてのパイプ文字(|)がバックスラッシュ文字(\)でエスケープされて
いることを確認します。次に、ESCAPE オプションを使用してファイルをロードします。
$ more redshiftinfo.txt
1|public\|event\|dwuser
2|public\|sales\|dwuser
create table redshiftinfo(infoid int,tableinfo varchar(50));
copy redshiftinfo from 's3://mybucket/data/redshiftinfo.txt'
credentials 'aws_access_key_id=<access-key-id>;aws_secret_access_key=<secretaccess-key>'
delimiter '|' escape;
select * from redshiftinfo order by 1;
infoid |
tableinfo
-------+-------------------1
| public|event|dwuser
2
| public|sales|dwuser
(2 rows)
ESCAPE オプションを使用しないと、Extra column(s) found エラーが発生して、この COPY コ
マンドは失敗します。
Important
ESCAPE オプションを指定した COPY を使用してデータをロードした場合、対応する出力ファ
イルを生成するには、UNLOAD コマンドにも ESCAPE オプションを指定する必要がありま
す。同様に、ESCAPE オプションを使って UNLOAD を実行すると、同じデータを COPY する
場合に ESCAPE を使用する必要があります。
ESCAPE オプションを指定する COPY 用のファイルの準備
この例では、ESCAPE オプションを指定した COPY コマンドでデータを Amazon Redshift テーブルに
インポートする前に、データを準備して改行文字を "エスケープする" 方法について説明します。デー
タを準備して改行文字を区切らないと、Amazon Redshift は COPY コマンドの実行時にロードエラー
を返します。通常、改行文字はレコード区切り文字として使用されるためです。
API Version 2012-12-01
207
Amazon Redshift データベース開発者ガイド
COPY
例えば、ファイルまたは外部テーブルの列を Amazon Redshift テーブルにコピーするとします。その
ファイルまたは列に XML 形式のコンテンツまたは同様なデータが含まれている場合、コンテンツの一
部である改行文字(\n)はすべてバックスラッシュ文字(\)でエスケープする必要があります。
埋め込み改行文字を含むファイルまたはテーブルのよい点は、一致パターンが比較的簡単なことです。
テキストファイル nlTest1.txt の次の例に示すように、ほとんどの場合、それぞれの埋め込み改行文
字は > 文字の後に続きます。場合によっては、その間に空白文字(' ' またはタブ)が入ります。
$ cat nlTest1.txt
<xml start>
<newline characters provide>
<line breaks at the end of each>
<line in content>
</xml>|1000
<xml>
</xml>|2000
この例では、テキスト処理ユーティリティを実行してソースファイルを事前処理し、必要な場所にエス
ケープ文字を挿入できます(| 文字は、Amazon Redshift テーブルにコピーされるときに列データを区
切る区切り記号として使用されます)。
$ sed -e ':a;N;$!ba;s/>[[:space:]]*\n/>\\\n/g'
nlTest1.txt > nlTest2.txt
同様に、Perl を使用しても同じような処理を行うことができます。
cat n1Test1.txt | perl -p -e 's/\\\n//g' > n1Test2.txt
nlTest2.txt ファイルから Amazon Redshift へのデータロードに対応するため、Amazon Redshift に
2 列のテーブルを作成しました。最初の列 c1 は文字の列です。この列は nlTest2.txt ファイルから
の XML 形式のコンテンツを保持します。2 番目の列 c2 は同じファイルからロードされる整数値を保持
します。
sed コマンドを実行した後、ESCAPE オプションを使用して nlTest2.txt ファイルから Amazon
Redshift テーブルにデータを正しくロードすることができます。
Note
COPY コマンドに ESCAPE オプションを指定すると、バックスラッシュ文字を含むいくつか
の特殊文字をエスケープします(改行文字を含む)。
copy t2 from 's3://mybucket/data/nlTest2.txt'
credentials 'aws_access_key_id=<access-key-id>;aws_secret_access_key=<secretaccess-key>'
escape
delimiter as '|';
select * from t2 order by 2;
c1
| c2
-------------+-----<xml start>
<newline characters provide>
<line breaks at the end of each>
API Version 2012-12-01
208
Amazon Redshift データベース開発者ガイド
CREATE DATABASE
<line in content>
</xml>
| 1000
<xml>
</xml>
| 2000
(2 rows)
外部データベースからエクスポートされるデータファイルも同様に準備できます。例えば、Oracle デー
タベースの場合、Amazon Redshift にコピーするテーブルの各対象列に対して REPLACE 関数を使用で
きます。
SELECT c1, REPLACE(c2, \n',\\n' ) as c2 from my_table_with_xml
また、通常大量のデータを処理する多くのエクスポートツールと ETL ツールは、エスケープ文字と区
切り文字を指定するオプションを備えています。
CREATE DATABASE
新しいデータベースを作成します。
概要
CREATE DATABASE database_name [ WITH ]
[ OWNER [=] db_owner ]
パラメータ
database_name
新しいデータベースの名前。
WiTH
オプションキーワード
OWNER
データベース所有者を指定します。
=
オプションの文字。
db_owner
データベース所有者のユーザー名。
CREATE DATABASE の制限
Amazon Redshift では、データベースに次の制限が課されます。
• クラスターごとのユーザー定義データベースは最大 60 個です。
• データベース名は最大 127 文字です。
• 予約語は使用できません。
例
次の例では、TICKIT_TEST という名前のデータベースを作成し、ユーザー DWUSER に所有権を与え
ます。
API Version 2012-12-01
209
Amazon Redshift データベース開発者ガイド
CREATE GROUP
create database tickit_test
with owner dwuser;
CREATE GROUP
新しいユーザーグループを定義します。
概要
CREATE GROUP group_name
[ [ WITH ] [ USER username ] [, ...] ]
パラメータ
group_name
新しいユーザーグループ名。
WiTH
CREATE GROUP の追加のパラメータを指定するオプションの構文。
USER
1 人または複数のユーザーをグループに追加します。
username
グループに追加するユーザーの名前。
例
次の例では、1 ユーザー ADMIN が属する ADMIN_GROUP というユーザーグループを作成します。
create group admin_group with user admin;
CREATE SCHEMA
現在のデータベースの新しいスキーマを定義します。
概要
CREATE SCHEMA schema_name [ AUTHORIZATION username ] [ schema_element [ ... ]
]
CREATE SCHEMA AUTHORIZATION username [ schema_element [ ... ] ]
パラメータ
schema_name
新しいスキーマの名前。
Note
search_path (p. 571) 設定パラメータのスキーマリストによって、スキーマ名を指定せずに
同じ名前のオブジェクトが参照されたときに、優先するオブジェクトが決まります。
API Version 2012-12-01
210
Amazon Redshift データベース開発者ガイド
CREATE TABLE
AUTHORIZATION
指定したユーザーに所有権を付与します。
username
スキーマ所有者の名前。
schema_element
スキーマ内に作成する 1 つまたは複数のオブジェクトを定義します。
CREATE SCHEMA の制限
Amazon Redshift では、スキーマに次の制限があります。
• 1 つのデータベースにつき最大 256 スキーマ。
• 予約語は使用できません。
例
次の例では、US_SALES というスキーマを作成し、所有権をユーザー DWUSER に付与します。
create schema us_sales authorization dwuser;
新しいスキーマを確認するには、PG_NAMESPACE カタログテーブルに対してクエリを実行します。
select nspname as schema, usename as owner
from pg_namespace, pg_user
where pg_namespace.nspowner = pg_user.usesysid
and pg_user.usename ='dwuser';
name
| owner
----------+---------us_sales | dwuser
(1 row)
CREATE TABLE
Topics
• 概要 (p. 211)
• パラメータ (p. 212)
• CREATE TABLE の使用に関する注意事項 (p. 216)
• CREATE TABLE の例 (p. 217)
現在のデータベースに新しいテーブルを作成します。このテーブルの所有者は、CREATE TABLE コマ
ンドを発行したユーザーになります。
概要
CREATE [ [LOCAL ] { TEMPORARY | TEMP } ]
TABLE table_name
(
{column_name data_type
API Version 2012-12-01
211
Amazon Redshift データベース開発者ガイド
CREATE TABLE
[
[
[
[
[
[
|
|
[
)
[
[
[
DEFAULT default_expr ]
IDENTITY ( seed, step) ]
column_constraint ]
ENCODE encoding ]
DISTKEY ]
SORTKEY ]
table_constraint
LIKE parent_table
{ INCLUDING | EXCLUDING } DEFAULTS ] } [, ... ]
DISTSTYLE { EVEN | KEY } ]
DISTKEY ( column_name ) ]
SORTKEY ( column_name [, ...] ) ]
where column_constraint is:
[ CONSTRAINT constraint_name ]
{ NOT NULL |
NULL |
UNIQUE |
PRIMARY KEY |
REFERENCES reftable
[ ( refcolumn ) ]}
and table_constraint is:
[ CONSTRAINT constraint_name ]
{ UNIQUE ( column_name [, ... ] ) |
PRIMARY KEY ( column_name [, ... ] ) |
FOREIGN KEY (column_name [, ... ] )
REFERENCES reftable
[ ( refcolumn ) ]}
パラメータ
LOCAL
このオプションのキーワードは、ステートメントに指定できますが、Amazon Redshift では効果が
ありません。
TEMPORARY | TEMP
現在のセッション内でのみ表示可能な一時テーブルを作成します。このテーブルは、作成したセッ
ションの終了時に自動的に削除されます。Amazon Redshift では、永続テーブルと同じ名前の一時
テーブルを作成できます。一時テーブルは、別のセッション固有のスキーマに作成されます(ス
キーマ名は指定できません)。この一時スキーマは search_path の最初のスキーマになるため、永
続テーブルにアクセスするようにスキーマ名でテーブル名を修飾しなければ、一時テーブルは永続
テーブルよりも優先されます。スキーマと優先順位の詳細については、「search_path (p. 571)」を
参照してください。
Note
PUBLIC グループの自動メンバーシップのデフォルトでは、ユーザーに一時テーブルを作
成する権限が付与されます。すべてのユーザーについて、一時テーブルを作成する権限を
削除するには、PUBLIC グループの TEMP 権限を取り消し、特定のユーザーまたはユー
ザーグループに一時テーブルを作成する権限を明示的に付与します。
table_name
作成するテーブルの名前。
API Version 2012-12-01
212
Amazon Redshift データベース開発者ガイド
CREATE TABLE
Important
「#」で始まるテーブル名を指定すると、そのテーブルは一時テーブルとして作成されま
す。以下に例を示します。
create table #newtable (id int);
テーブル名の最大の長さは 127 文字です。それより長い名前は 127 文字まで切り捨てられます。
Amazon Redshift では、1 つのクラスターあたりの永続テーブル数の上限が 9,900 です。テーブル
名は、データベース名またはスキーマ名で修飾することができます。以下に例を示します。
create table tickit.public.test (c1 int);
この例では、tickit はデータベース名、public はスキーマ名です。このデータベースまたはス
キーマが存在しない場合、ステートメントはエラーを返します。
スキーマ名を指定すると、新しいテーブルはそのスキーマ内に作成されます(作成者がスキーマに
アクセス権を持っている場合)。テーブル名は、そのスキーマで一意の名前にする必要がありま
す。スキーマを指定しない場合、現在のデータベーススキーマを使用してテーブルが作成されま
す。一時テーブルを作成する場合、一時テーブルは特殊なスキーマに作成されるため、スキーマ名
は指定できません。
同じ名前の一時テーブルでも、別のセッションで作成される場合、同じデータベース内に同時に存
在することができます。このようなテーブルは別のスキーマに割り当てられます。
column_name
新しいテーブルで作成される列の名前。列名の最大の長さは 127 文字です。それより長い名前は
127 文字まで切り捨てられます。1 つのテーブルで定義できる列の最大数は 1,600 です。
Note
「横長のテーブル」を作成する場合は、ロードとクエリ処理の結果が即時に表示されるよ
うに、列リストが行幅の限度を超えないように気をつけます。「CREATE TABLE の使用
に関する注意事項 (p. 216)」を参照してください。
data_type
作成する列のデータ型。CHAR および VARCHAR の列の場合、最大長を宣言する代わりに MAX
キーワードを使用できます。MAX は、最大長を CHAR では 4096 バイト、VARCHAR では 65535
バイトに設定します。次の データ型 (p. 127)がサポートされています。
• SMALLINT(INT2)
• INTEGER(INT、INT4)
• BIGINT(INT8)
• DECIMAL(NUMERIC)
• REAL(FLOAT4)
• DOUBLE PRECISION(FLOAT8)
• BOOLEAN(BOOL)
• CHAR(CHARACTER)
• VARCHAR(CHARACTER VARYING)
• DATE
• TIMESTAMP
API Version 2012-12-01
213
Amazon Redshift データベース開発者ガイド
CREATE TABLE
DEFAULT default_expr
列のデフォルトのデータ値を割り当てます。default_expr のデータ型は列のデータ型に一致する必
要があります。DEFAULT 値は、変数を使用しない式にする必要があります。サブクエリ、現在の
テーブルに含まれる他の列の相互参照、およびシステム定義以外の関数は使用できません。
default_expr は、列の値を指定しないすべての INSERT 操作で使用されます。デフォルト値を指定
しなかった場合、列のデフォルト値は null です。
定義済み列リストの COPY 操作で、DEFAULT 値と NOT NULL の制限がある列を省略すると、
COPY コマンドで default_expr の値が挿入されます。
定義済み列リストの COPY 操作で、DEFAULT 値があり、NULL にすることができる列を省略する
と、COPY コマンドで NULL 値ではなく default_expr の値が挿入されます。
IDENTITY(seed, step)
列が IDENTITY 列であることを指定します。IDENTITY 列には、一意の自動生成値が含まれます。
これらの値は、seed として指定された値から始まり、ステップとして指定された数が増分されま
す。IDENTITY 列のデータ型は、INT または BIGINT にする必要があります。IDENTITY 列はデフォ
ルトで NOT NULL に宣言され、NULL を受けつけません。
ENCODE encoding
列の圧縮エンコード。圧縮が選択されていない場合、デフォルトは RAW です。次の 圧縮エンコー
ド (p. 34)がサポートされています。
• BYTEDICT
• DELTA
• DELTA32K
• LZO
• MOSTLY8
• MOSTLY16
• MOSTLY32
• RAW(圧縮なし、デフォルト設定)
• RUNLENGTH
• TEXT255
• TEXT32K
DISTSTYLE
テーブル全体のデータ分散の種類を定義する属性。
• KEY: データは、DISTKEY 列の値で分散されます。この方法によって、DISTKEY 列に繰り返し
出現する値は、同じノードの同じスライスにまとめて格納されます。この分散の種類は、分散さ
れたテーブルの結合の場合に効率的です。DISTSTYLE KEY を指定する場合、ここで、または列
定義の一部で、テーブルの DISTKEY 列に名前を付ける必要があります。
• EVEN: テーブルのデータは、ラウンドロビン分散方式で、クラスター内のノード全体に均等に
分散されます。行 ID は分散を決定するために使用され、およそ同じ行数が各ノードに分散され
ます。
DISTKEY
テーブル内の 1 つの列のみを分散キーに指定できます。DISTKEY 列または DISTSTYLE オプショ
ンを指定しない場合、デフォルトで DISTSTYLE EVEN の分散方式が使用されます。列を DISTKEY
列として宣言する場合、DISTSTYLE を KEY に設定するか、まったく設定しない必要があります。
同じ列を分散キーおよびソートキーとして定義できます。この方法の場合、該当する列をクエリで
結合する列にすると、結合が高速になる傾向があります。「データ分散方法の選択 (p. 43)」を参
照してください。
SORTKEY ( column_name [, ... ] )
データをテーブルにロードすると、データはソートキーとして指定された 1 つまたは複数の列に
従ってソートされます。列名の後に SORTKEY キーワードを使用して 1 列のソートキーを指定す
ることができます。または、SORTKEY (column_name [, ...]) 構文を使用して、テーブルの
ソートキーとして 1 つまたは数の列を指定することができます。
API Version 2012-12-01
214
Amazon Redshift データベース開発者ガイド
CREATE TABLE
ソートキーを指定しない場合、デフォルトでテーブルはソートされません。
1 つのテーブルで、最大 400 の SORTKEY 列を定義できます。
LIKE parent_table [ { INCLUDING | EXCLUDING } DEFAULTS ]
新しいテーブルで、列名、データ型、NOT NULL 制限を自動的にコピーする既存のテーブルを指
定します。新しいテーブルと親テーブル間に関連付けはなく、親テーブルを変更しても、新しい
テーブルに変更は適用されません。コピーした列定義のデフォルトの式は、INCLUDING DEFAULTS
を指定した場合にのみコピーされます。デフォルトでは、デフォルトの式が除外されるため、新し
いテーブルのすべての列は NULL のデフォルト値になります。
LIKE オプションを指定して作成したテーブルは、プライマリキーと外部キーの制約を継承しませ
ん。分散とソートのプロパティ、NULL のプロパティは、LIKE テーブルで継承されますが、CREATE
TABLE ステートメントで明示的に設定することはできません。
CONSTRAINT constraint_name
列またはテーブルの制約の名前。
NOT NULL | NULL
NOT NULL は、列に null 値を使用できないことを指定します。NULL はデフォルトであり、列で
null 値を使用できることを指定します。IDENTITY 列はデフォルトで NOT NULL に宣言され、NULL
を受けつけません。
UNIQUE ( column_name [, ... ] )
UNIQUE の制約では、テーブルの 1 つまたは複数の列のグループに、一意の値のみを含めること
ができることを指定します。一意のテーブル制約の動作は、列制約の動作と同じですが、さらに複
数の列に適用される点が異なります。一意の制約がある場合、NULL 値は等値と見なされません。
各一意のテーブル制約は、テーブルに定義されている他の一意のキーまたはプライマリキーで指定
された列セットとは異なる列セットを指定する必要があります。
Important
一意の制約は情報提供に使用され、システムで強制されることはありません。
PRIMARY KEY ( column_name [, ... ] )
プライマリキーの制約では、テーブルの 1 つまたは複数の列のグループに、一意の(重複しない)
NULL 以外の値のみを含めることができることを指定します。列セットをプライマリキーに指定す
ると、スキーマの設計に関するメタデータも提供されます。プライマリキーは、他のテーブルが、
行の一意の識別子としてこの列セットに依存している可能性があることを示します。列制約かテー
ブル制約かにかかわらず、テーブルに指定できるプライマリキーは 1 つです。プライマリキーの制
約は、同じテーブルに定義されている一意の制約で指定された列セットとは異なる列セットを指定
する必要があります。
Important
プライマリキーの制約は情報提供にのみ使用されます。プライマリキーの制約がシステム
に強制されることはありませんが、プランナーが使用します。
FOREIGN KEY ( column_name [, ... ] ) REFERENCES reftable [ ( refcolumn ) ]
これらの句では、外部キーの制約を指定します。外部キーの制約では、新しいテーブルの 1 つまた
は複数の列のグループに、参照テーブルのいずれかの行の参照列の値と一致する値のみを含める必
要があることを指定します。refcolumn を省略すると、reftable のプライマリキーが使用されます。
参照列は、参照テーブルの一意の制約またはプライマリキーの制約の列にする必要があります。
Important
外部キーの制約は情報提供にのみ使用されます。プライマリキーの制約がシステムに強制
されることはありませんが、プランナーが使用します。
API Version 2012-12-01
215
Amazon Redshift データベース開発者ガイド
CREATE TABLE
CREATE TABLE の使用に関する注意事項
制限
Amazon Redshift では、1 つのクラスターあたりの永続テーブル数の上限が 9,900 です。
テーブルの最大文字数は 127 です。
1 つのテーブルで定義できる列の最大数は 1,600 です。
受信データの分散
受信データのハッシュ分散スキームが、ターゲットテーブルのスキームと同じ場合、データをロードす
るときに、データを物理的に分散させる必要はありません。例えば、新しいテーブルに分散キーが設定
されており、同じキー列で分散されている別のテーブルからデータが挿入される場合、同じノードとス
ライスを使用してデータが所定の位置にロードされます。ただし、ソーステーブルとターゲットテーブ
ルの両方が EVEN 分散に設定されている場合、データはターゲットテーブルで再分散されます。
横長のテーブル
非常に横長のテーブルを作成することはできますが、データの挿入やデータの選択を実行できなくなる
可能性があります。この制限は、クエリ処理時の NULL 処理に必要なオフセットに由来しています。
テーブルの列が NULL 値を許容しているかどうかは、そのテーブルのロードとクエリの動作に影響を与
えます。
• クエリ処理を実行するには、テーブルに NULL 値を許容する列がある場合、ターゲット全体の幅が
64K(65535 バイト)を超えることはできません。以下に例を示します。
create table t (c1 varchar(30000), c2 varchar(30000),
c3 varchar(10000));
insert into t values (1,1,1);
select * from t;
ERROR: 8001
DETAIL: The combined length of columns processed in the SQL statement
exceeded the query-processing limit of 65535 characters (pid:7627)
• NOT NULL 列のみがあるテーブルの場合、最後の列の開始位置は 64K を超えることはできません。
例えば、次のテーブルのロードとクエリは実行できます。
create table t (c1 varchar(30000) not null,
c2 char(30000) not null, c3 varchar (10000) not null);
insert into t values(1,1,1);
select trim(c1), trim(c2), trim(c3) from t;
btrim | btrim | btrim
------+-------+------1
| 1
| 1
(1 row)
一方、次のテーブルでは、3 列目の開始位置が 64K を超えているため、行を挿入しようとすると、
エラーが返されます。
API Version 2012-12-01
216
Amazon Redshift データベース開発者ガイド
CREATE TABLE
create table t (c1 varchar(35000) not null,
c2 char(35000) not null, c3 varchar (10000) not null);
insert into t values (1,1,1);
ERROR: 8001
DETAIL: The combined length of columns processed in the SQL statement
exceeded the query-processing limit of 65535 characters (pid:7627)
CREATE TABLE の例
次の例は、Amazon Redshift CREATE TABLE ステートメントのさまざまな列とテーブルの属性を示し
ています。
分散キー、複数列のソートキー、圧縮を使用したテーブルの作成
TICKIT データベースに、複数の列に圧縮が定義された SALES テーブルを作成します。LISTID は分散
キーとして宣言され、LISTID と SELLERID は複数列のソートーとして宣言されています。このテーブ
ルでは、プライマリキーと外部キーの制約も定義されています。
create table sales(
salesid integer not null,
listid integer not null,
sellerid integer not null,
buyerid integer not null,
eventid integer not null encode mostly16,
dateid smallint not null,
qtysold smallint not null encode mostly8,
pricepaid decimal(8,2) encode delta32k,
commission decimal(8,2) encode delta32k,
saletime timestamp,
primary key(salesid),
foreign key(listid) references listing(listid),
foreign key(sellerid) references users(userid),
foreign key(buyerid) references users(userid),
foreign key(dateid) references date(dateid))
distkey(listid)
sortkey(listid,sellerid);
結果
select "column", type, encoding, distkey, sortkey
from pg_table_def where tablename = 'sales';
column
|
type
| encoding | distkey | sortkey
------------+-----------------------------+----------+---------+--------salesid
| integer
| none
| f
|
0
listid
| integer
| none
| t
|
1
sellerid
| integer
| none
| f
|
2
buyerid
| integer
| none
| f
|
0
eventid
| integer
| mostly16 | f
|
0
dateid
| smallint
| none
| f
|
0
qtysold
| smallint
| mostly8 | f
|
0
pricepaid | numeric(8,2)
| delta32k | f
|
0
API Version 2012-12-01
217
Amazon Redshift データベース開発者ガイド
CREATE TABLE
commission | numeric(8,2)
| delta32k | f
saletime
| timestamp without time zone | none
| f
(10 rows)
|
|
0
0
デフォルトの均等分散を指定したテーブルの作成
3 つの列がある MYEVENT というテーブルを作成します。
create table myevent(
eventid int,
eventname varchar(200),
eventcity varchar(30)
);
デフォルトで、テーブルは均等に分散され、ソートされません。このテーブルに DISTKEY 列または
SORTKEY 列は宣言されません。
select "column", type, encoding, distkey, sortkey
from pg_table_def where tablename = 'myevent';
column
|
type
| encoding | distkey | sortkey
-----------+------------------------+----------+---------+--------eventid
| integer
| none
| f
|
0
eventname | character varying(200) | none
| f
|
0
eventcity | character varying(30) | none
| f
|
0
(3 rows)
別のテーブルの LIKE である一時テーブルの作成
TEMPEVENT という一時テーブルを作成します。このテーブルは EVENT テーブルの列を継承します。
create temp table tempevent(like event);
また、このテーブルは、親テーブルの DISTKEY 属性と SORTKEY 属性も継承します。
select "column", type, encoding, distkey, sortkey
from pg_table_def where tablename = 'tempevent';
column
|
type
| encoding | distkey | sortkey
-----------+-----------------------------+----------+---------+--------eventid
| integer
| none
| t
|
1
venueid
| smallint
| none
| f
|
0
catid
| smallint
| none
| f
|
0
dateid
| smallint
| none
| f
|
0
eventname | character varying(200)
| none
| f
|
0
starttime | timestamp without time zone | none
| f
|
0
(6 rows)
IDENTITY 列があるテーブルの作成
VENUE_IDENT というテーブルを作成します。このテーブルには、VENUEID という IDENTITY 列があ
ります。この列は 0 から始まり、レコードごとに 1 ずつ増分します。VENUEID は、テーブルのプライ
マリキーとしても宣言されています。
API Version 2012-12-01
218
Amazon Redshift データベース開発者ガイド
CREATE TABLE
create table venue_ident(venueid bigint identity(0, 1),
venuename varchar(100),
venuecity varchar(30),
venuestate char(2),
venueseats integer,
primary key(venueid));
DEFAULT 列値を指定したテーブルの作成
各列のデフォルト値を宣言した CATEGORYDEF テーブルを作成します。
create table categorydef(
catid smallint not null default 0,
catgroup varchar(10) default 'Special',
catname varchar(10) default 'Other',
catdesc varchar(50) default 'Special events',
primary key(catid));
insert into categorydef values(default,default,default,default);
select * from categorydef;
catid | catgroup | catname |
catdesc
-------+----------+---------+---------------0 | Special | Other
| Special events
(1 row)
DISTSTYLE、DISTKEY、SORTKEY オプション
次のステートメントは、DISTKEY、SORTKEY、DISTSTYLE オプションがどのように機能するかを示
しています。この例で、COL1 は分散キーなので、分散方式を KEY に設定するか、何も設定しない必
要があります。デフォルトで、テーブルにはソートキーがないため、ソートされません。
create table t1(col1 int distkey, col2 int) diststyle key;
結果
select "column", type, encoding, distkey, sortkey
from pg_table_def where tablename = 't1';
column | type
| encoding | distkey | sortkey
-------+---------+----------+---------+--------col1
| integer | none
| t
| 0
col2
| integer | none
| f
| 0
この例では、同じ列が分散キーとソートキーとして定義されています。ここでも、分散方式を KEY に
設定するか、何も設定しない必要があります。
create table t2(col1 int distkey sortkey, col2 int);
結果
API Version 2012-12-01
219
Amazon Redshift データベース開発者ガイド
CREATE TABLE AS
select "column", type, encoding, distkey, sortkey
from pg_table_def where tablename = 't2';
column | type
| encoding | distkey | sortkey
-------+---------+----------+---------+--------col1
| integer | none
| t
| 1
col2
| integer | none
| f
| 0
この例では、分散キーに設定されている列はありません。また、COL2 はソートキーに設定され、分散
方式は EVEN に設定されています。
create table t3(col1 int, col2 int sortkey) diststyle even;
結果
select "column", type, encoding, distkey, sortkey
from pg_table_def where tablename = 't3';
Column | Type
| Encoding | DistKey | SortKey
-------+---------+----------+---------+-------col1
| integer | none
| f
| 0
col2
| integer | none
| f
| 1
この例では、分散キーが EVEN に設定され、ソートキーは明示的に定義されていません。そのため、
テーブルは均等に分散されますが、ソートされません。
create table t4(col1 int, col2 int) diststyle even;
結果
select "column", type, encoding, distkey, sortkey
from pg_table_def where tablename = 't4';
column | type
| encoding | distkey | sortkey
--------+---------+----------+---------+-------col1
| integer | none
| f
| 0
col2
| integer | none
| f
| 0
CREATE TABLE AS
Topics
• 概要 (p. 221)
• パラメータ (p. 221)
• CTAS の使用に関する注意事項 (p. 223)
• CTAS の例 (p. 223)
クエリに基づいて新しいテーブルを作成します。このテーブルの所有者は、このコマンドを発行した
ユーザーになります。
新しいテーブルが作成され、コマンドのクエリで定義されたデータがロードされます。テーブルの列に
は、クエリの出力列に関連付けられた名前とデータ型が指定されます。CREATE TABLE AS(CTAS)
API Version 2012-12-01
220
Amazon Redshift データベース開発者ガイド
CREATE TABLE AS
コマンドを実行すると、新しいテーブルが作成され、新しいテーブルをロードするクエリが評価されま
す。
概要
CREATE [ [LOCAL ] { TEMPORARY | TEMP } ]
TABLE table_name [ ( column_name [, ... ] ) ]
| DISTSTYLE { KEY | EVEN }
| DISTKEY ( distkey_identifier )
| SORTKEY ( sortkey_identifier [, ... ] )
AS query
パラメータ
LOCAL
このオプションのキーワードは、ステートメントに指定できますが、Amazon Redshift では効果が
ありません。
TEMPORARY または TEMP
一時テーブルを作成します。一時テーブルは、作成したセッションの終了時に削除されます。
table_name
作成するテーブルの名前。
Important
「#」で始まるテーブル名を指定すると、そのテーブルは一時テーブルとして作成されま
す。以下に例を示します。
create table #newtable (id int);
テーブル名の最大の長さは 127 文字です。それより長い名前は 127 文字まで切り捨てられます。
Amazon Redshift では、1 つのクラスターあたりの永続テーブル数の上限が 9,900 です。テーブル
名は、データベース名またはスキーマ名で修飾することができます。以下に例を示します。
create table tickit.public.test (c1 int);
この例では、tickit はデータベース名、public はスキーマ名です。このデータベースまたはス
キーマが存在しない場合、ステートメントはエラーを返します。
スキーマ名を指定すると、新しいテーブルはそのスキーマ内に作成されます(作成者がスキーマに
アクセス権を持っている場合)。テーブル名は、そのスキーマで一意の名前にする必要がありま
す。スキーマを指定しない場合、現在のデータベーススキーマを使用してテーブルが作成されま
す。一時テーブルを作成する場合、一時テーブルは特殊なスキーマに作成されるため、スキーマ名
は指定できません。
同じ名前の一時テーブルでも、別のセッションで作成される場合、同じデータベース内に同時に存
在することができます。このようなテーブルは別のスキーマに割り当てられます。
column_name
新しいテーブルの列の名前。列名を指定しない場合、列名には、クエリの出力列名が使用されま
す。式にはデフォルトの列名が使用されます。
DISTSTYLE
テーブル全体のデータ分散の種類を定義する属性。
API Version 2012-12-01
221
Amazon Redshift データベース開発者ガイド
CREATE TABLE AS
• KEY: データは、DISTKEY 列の値で分散されます(DISTSTYLE KEY を指定する場合、DISTKEY
を指定する必要があります)。この方法によって、DISTKEY 列に繰り返し出現する値は、同じ
ノードの同じスライスにまとめて格納されます。この分散方式は、分散されたテーブルの結合と
コロケーテッド結合(DISTKEY 列が、両方のテーブルの結合列になる場合)の両方に効果的で
す。
• EVEN: テーブルのデータは、ラウンドロビン分散方式で、ノードとスライス全体に均等に分散
されます。およそ同じ行数が各ノードに分散されます。DISTSTYLE オプションが EVEN に設定
されている場合、デフォルトのソートキーは定義されていません。
DISTKEY
テーブル内の 1 つの列のみを分散キーに指定できます。
• 列を DISTKEY 列として宣言する場合、DISTSTYLE を KEY に設定するか、まったく設定しない
必要があります。
• DISTKEY 列を宣言しない場合、DISTSTYLE を EVEN に設定することができます。
• DISTKEY 列と DISTSTYLE オプションのどちらも宣言しない場合、可能であれば、クエリの
CTAS ステートメントからデフォルトの動作が継承されます。例えば、次のようなクエリを指定
するとします。
select * from date
また、DATE テーブルが DATEID 列について分散されている場合、この列は、ターゲットテーブ
ルの継承された分散キーです。クエリから分散方式を継承できない場合、(DISTSTYLE EVEN
を指定した場合と同様に)テーブルは均等に分散されます。
同じ列を分散キーおよびソートキーとして定義できます。この方法の場合、該当する列をクエリで
結合する列にすると、結合が高速になる傾向があります。
distkey_identifier
分散キーの列名または位置番号。テーブルのオプションの列リストまたはクエリの選択したリスト
で指定された名前を使用します。または、位置番号を使用します。この番号は、最初に選択された
列は 1、2 番目は 2 などと続きます。
SORTKEY
Amazon Redshift は、複数列のソートキーをサポートしています。1 つのテーブルで、最大 400 の
SORTKEY 列を定義できます。
データをテーブルにロードすると、データはそれらの列に従ってソートされます。いずれのキーも
指定しない場合、可能であれば、CTAS ステートメントに定義された受信データのプロパティから
デフォルトの動作が継承されます。例えば、次のようなステートメントを指定するとします。
create table copydate as select * from date;
DATE テーブルが DATEID 列についてソートされている場合、この列は、ターゲットテーブルの継
承されたソートキーです。
受信データからソートキーを継承できない場合、テーブルはソートされません。例えば、CTAS ス
テートメントに DISTSTYLE または DISTKEY の設定がない場合、または受信データの再分散が必
要な DISTSTYLE または DISTKEY の設定が定義されている場合、新しいテーブルはソートされま
せん。
sortkey_identifier
1 つまたは複数の列名または位置番号。テーブルのオプションの列リストまたはクエリの選択した
リストで指定された名前を使用します。または、位置番号を使用します。この番号は、最初に選択
された列は 1、2 番目は 2 などと続きます。
Query
Amazon Redshift がサポートする任意のクエリ(SELECT ステートメント)。
API Version 2012-12-01
222
Amazon Redshift データベース開発者ガイド
CREATE TABLE AS
CTAS の使用に関する注意事項
制限
Amazon Redshift では、永続テーブル数の上限が 9,900 です。
テーブルの最大文字数は 127 です。
1 つのテーブルで定義できる列の最大数は 1,600 です。
列属性とテーブル属性の継承
作成元のテーブルに、圧縮のエンコーディング、制約、ID 列、デフォルトの列値、またはプライマリ
キーという特性があっても、CTAS テーブルは継承しません。CTAS ステートメントが独自の分散キー
とソートキーを定義しない場合、可能であれば、それらのキーは継承されます。
受信データの分散
受信データのハッシュ分散スキームが、ターゲットテーブルのスキームと同じ場合、データをロードす
るときに、データを物理的に分散させる必要はありません。例えば、新しいテーブルに分散キーが設定
されており、同じキー列で分散されている別のテーブルからデータが挿入される場合、同じノードとス
ライスを使用してデータが所定の位置にロードされます。ただし、ソーステーブルとターゲットテーブ
ルの両方が EVEN 分散に設定されている場合、データはターゲットテーブルで再分散されます。
自動 ANALYZE 操作
Amazon Redshift は、CTAS コマンドで作成したテーブルを自動的に分析します。最初に作成したと
き、これらのテーブルに ANALYZE コマンドを実行する必要はありません。変更する場合は、他のテー
ブルと同じように分析する必要があります。
CTAS の例
次の例では、EVENT テーブルに対して EVENT_BACKUP というテーブルを作成します。
create table event_backup as select * from event;
結果のテーブルは、EVENT テーブル(EVENTID)から分散キーとソートキーを継承します。
select "column", type, encoding, distkey, sortkey
from pg_table_def where tablename = 'event_backup';
column
|
type
| encoding | distkey | sortkey
---------+------------------------+----------+---------+--------eventid | integer
| none
| t
| 1
venueid | smallint
| none
| f
| 0
...
次のコマンドでは、EVENT テーブルから 4 つの列を選択して、EVENTDISTSORT という新しいテー
ブルを作成します。新しいテーブルは EVENTID によって分散され、EVENTID と DATEID によって
ソートされます。
create table eventdistsort
distkey (1)
sortkey (1,3)
as
API Version 2012-12-01
223
Amazon Redshift データベース開発者ガイド
CREATE TABLE AS
select eventid, venueid, dateid, eventname
from event;
結果
select "column", type, encoding, distkey, sortkey
from pg_table_def where tablename = 'eventdistsort';
column
|
type
| encoding | distkey | sortkey
---------+------------------------+----------+---------+------eventid
| integer
| none
| t
| 1
venueid
| smallint
| none
| f
| 0
dateid
| smallint
| none
| f
| 2
eventname | character varying(200)| none
| f
| 0
分散キーとソートキーの列名を使用することで、まったく同じテーブルを作成できます。以下に例を示
します。
create table eventdistsort1
distkey (eventid)
sortkey (eventid, dateid)
as
select eventid, venueid, dateid, eventname
from event;
次のステートメントは、テーブルに均等分散を適用しますが、明示的なソートキーを定義しません。
create table eventdisteven
diststyle even
as
select eventid, venueid, dateid, eventname
from event;
新しいテーブルには EVEN 分散が指定されているため、このテーブルは EVENT テーブル(EVENTID)
からソートキーを継承できません。新しいテーブルにはソートキーと分散キーがありません。
select "column", type, encoding, distkey, sortkey
from pg_table_def where tablename = 'eventdisteven';
column
|
type
| encoding | distkey | sortkey
----------+------------------------+----------+---------+--------eventid
| integer
| none
| f
| 0
venueid
| smallint
| none
| f
| 0
dateid
| smallint
| none
| f
| 0
eventname | character varying(200) | none
| f
| 0
次のステートメントでは、均等分散を適用し、ソートキーを定義します。
create table eventdistevensort diststyle even sortkey (venueid)
as select eventid, venueid, dateid, eventname from event;
結果のテーブルにはソートキーはありますが、分散キーはありません。
API Version 2012-12-01
224
Amazon Redshift データベース開発者ガイド
CREATE USER
select "column", type, encoding, distkey, sortkey
from pg_table_def where tablename = 'eventdistevensort';
column
|
type
| encoding | distkey | sortkey
----------+------------------------+----------+---------+------eventid
| integer
| none
| f
| 0
venueid
| smallint
| none
| f
| 1
dateid
| smallint
| none
| f
| 0
eventname | character varying(200) | none
| f
| 0
次のステートメントでは、受信データに基づいて別のキー列で EVENT テーブルを再分散します。デー
タは EVENTID 列に基づいてソートされており、SORTKEY 列は定義されません。そのため、テーブル
はソートされません。
create table venuedistevent distkey(venueid)
as select * from event;
結果
select "column", type, encoding, distkey, sortkey
from pg_table_def where tablename = 'venuedistevent';
column
|
type
| encoding | distkey | sortkey
-----------+-----------------------------+----------+---------+------eventid
| integer
| none
| f
| 0
venueid
| smallint
| none
| t
| 0
catid
| smallint
| none
| f
| 0
dateid
| smallint
| none
| f
| 0
eventname | character varying(200)
| none
| f
| 0
starttime | timestamp without time zone | none
| f
| 0
CREATE USER
新しいデータベースユーザーアカウントを作成します。このコマンドを実行するには、データベースの
スーパーユーザー権限を持つ必要があります。
概要
CREATE USER name
[ [ WITH] option [ ... ] ]
where option can be:
CREATEDB | NOCREATEDB
| CREATEUSER | NOCREATEUSER
| IN GROUP groupname [, ... ]
| PASSWORD 'password'
| VALID UNTIL 'abstime'
API Version 2012-12-01
225
Amazon Redshift データベース開発者ガイド
CREATE USER
パラメータ
name
作成するユーザーアカウントの名前。
CREATEDB | NOCREATEDB
CREATEDB オプションを指定すると、新しいユーザーアカウントでデータベースを作成できま
す。NOCREATEDB がデフォルトです。
CREATEUSER | NOCREATEUSER
CREATEUSER オプションを指定すると、アカウントを作成する権限を新しいユーザーに付与でき
ます。NOCREATEUSER がデフォルトです。
IN GROUP groupname
ユーザーが属する既存のグループ名を指定します。複数のグループ名を指定できます。
PASSWORD password
ユーザーのパスワードを設定します。ユーザーアカウントのパスワードを変更するには、ALTER
USER コマンドを使用します。
制約:
• 長さは 8~64 文字。
• 少なくとも 1 つの大文字、1 つの小文字、および 1 つの数字を使用する必要があります。
• 表示可能な ASCII 文字(ASCII コード 33~126)のうち、'(一重引用符)、"(二重引用符)、
\、/、@ および空白を除く任意の文字を使用できます。
VALID UNTIL abstime
VALID UNTIL オプションでは、ユーザーアカウントのパスワードが無効になるまでの絶対時間を
設定します。このオプションを指定しない場合、パスワードの失効日はありません。
使用に関する注意事項
デフォルトでは、すべてのユーザーは PUBLIC スキーマに対して、CREATE 権限と USAGE 権限を所
有しています。ユーザーがデータベースの PUBLIC スキーマにオブジェクトを作成できないようにす
るには、REVOKE コマンドを使用してその権限を削除します。
例
次のコマンドでは、パスワードが「abcD1234」で danny というユーザーアカウントを作成します。
create user danny with password 'abcD1234';
次のコマンドでは、データベースを作成する権限を持つ danny というユーザーアカウントを作成しま
す。
create user danny with password 'abcD1234' createdb;
この例では、アカウントのパスワードは 2010 年 6 月 10 日まで有効です。
create user danny with password 'abcD1234' valid until '2010-06-10';
次の例では、特殊文字を含む、大文字と小文字が区別されるパスワードを持つユーザーを作成します。
create user newman with password [email protected]!';
API Version 2012-12-01
226
Amazon Redshift データベース開発者ガイド
CREATE VIEW
CREATE VIEW
データベースにビューを作成します。このビューは物理的にマテリアライズされません。ビューを定義
するクエリは、ビューがクエリで参照されるたびに実行されます。
概要
CREATE [ OR REPLACE ] VIEW name [ ( column_name [, ...] ) ] AS query
パラメータ
OR REPLACE
同じ名前のビューが既に存在する場合、ビューは置換されます。
name
ビューの名前。スキーマ名を指定すると(myschema.myview など)、指定したスキーマを使用し
てビューが作成されます。指定しない場合、現在のスキーマにビューが作成されます。ビュー名
は、同じスキーマ内の他のビューやテーブルと異なる名前にする必要があります。
column_name
ビューの列に使用されるオプションの名前リスト。列名を指定しない場合、列名はクエリから取得
されます。
Query
テーブルに評価されるクエリ(SELECT ステートメントのフォーム)。このテーブルでは、ビュー
の列と行を定義します。
Note
ビューの更新、ビューへの挿入、ビューからの削除を行うことはできません。
使用に関する注意事項
ビューの所有権を持っている場合、またはビューに対する特権が付与されている場合でも、基礎となる
テーブルにアクセス権を持っていることにはなりません。基礎となるテーブルに対するアクセス権を明
示的に付与する必要があります。
例
次のコマンドでは、EVENT というテーブルから myevent というビューを作成します。
create view myevent as select eventname from event
where eventname = 'LeAnn Rimes';
次のコマンドでは、USERS というテーブルから myuser というビューを作成します。
create view myuser as select lastname from users;
DEALLOCATE
準備済みステートメントの割り当てを解除します。
API Version 2012-12-01
227
Amazon Redshift データベース開発者ガイド
DECLARE
概要
DEALLOCATE [PREPARE] plan_name
パラメータ
PREPARE
このキーワードはオプションであり、無視されます。
plan_name
割り当てを解除する準備済みステートメントの名前。
使用に関する注意事項
DEALLOCATE は、以前に準備した SQL ステートメントの割り当てを解除するために使用されます。
準備済みステートメントの割り当てを明示的に解除しない場合、現在のセッションの終了時に割り当て
が解除されます。準備済みステートメントの詳細については、「PREPARE (p. 253)」を参照してくださ
い。
以下の資料も参照してください。
EXECUTE (p. 239)、PREPARE (p. 253)
DECLARE
新しいカーソルを定義します。カーソルを使用して、大きなクエリセットの結果から、一度で数行を取
得します。
カーソルの最初の行が取得されると、必要に応じて、結果セット全体がリーダーノード、メモリ内、ま
たはディスク上にマテリアライズされます。大きな結果セットにカーソルを使用すると、パフォーマン
スが低下する可能性があるため、可能な限り、別の方法を使用することをお勧めします。詳細について
は、「カーソルを使用するときのパフォーマンスに関する考慮事項 (p. 229)」を参照してください。
カーソルは、トランザクションブロック内で宣言する必要があります。1 つのセッションで、同時に開
くことができるカーソルは 1 つのみです。
詳細については、「FETCH (p. 244)」および「CLOSE (p. 185)」を参照してください。
概要
DECLARE cursor_name CURSOR FOR query
パラメータ
cursor_name
新しいカーソルの名前。
Query
カーソルを作成する SELECT ステートメント。
API Version 2012-12-01
228
Amazon Redshift データベース開発者ガイド
DECLARE
DECLARE CURSOR の使用に関する注意事項
クライアントアプリケーションが ODBC 接続を使用し、クエリで作成される結果セットが大きすぎて
メモリが足りなくなる場合、カーソルを使用して、結果セットをクライアントアプリケーションに渡す
ことができます。カーソルを使用すると、結果セット全体がリーダーノードでマテリアライズされ、ク
ライアントが少しずつ結果を取得できるようになります。
Note
Microsoft Windows 用 ODBC でカーソルを有効にするには、Amazon Redshift に使用する ODBC
DSN で [Use Declare/Fetch] オプションを有効にします。ODBC キャッシュサイズを設定し、
ODBC DSN オプションダイアログの [Cache Size] フィールドを 4,000 以上に設定して、ラウ
ンドトリップを最小限に抑えることをお勧めします。
カーソルを使用すると、パフォーマンスが低下する可能性があるため、可能な限り、別の方法を使用す
ることをお勧めします。詳細については、「カーソルを使用するときのパフォーマンスに関する考慮事
項 (p. 229)」を参照してください。
Amazon Redshift のカーソルは、次の制限付きでサポートされています。
• カーソルは複数ノードのクラスターでのみサポートされます。カーソルは 1 ノードのクラスターでは
サポートされません。
• 1 つのセッションで、同時に開くことができるカーソルは 1 つのみです。
• カーソルはトランザクション内(BEGIN ... END)で使用する必要があります。
• 1 クラスターあたりの同時カーソル数と 1 カーソルあたりの最大結果セットは、ノードの種類に基づ
いて制限されます。
詳細については、「カーソルの制約 (p. 229)」を参照してください。
カーソルの制約
カーソルの最初の行が取得されると、結果セット全体がリーダーノードにマテリアライズされます。結
果セットをメモリに格納できない場合、必要に応じてディスクに書き込まれます。リーダーノードの整
合性を保護するために、Amazon Redshift では、クラスターのノードの種類に基づいて、1 クラスター
あたりの同時カーソル数とカーソルの結果セットサイズに対して、次の制約を課しています。
ノードの種類
同時カーソル数
最大結果セット
XL
5
500 GB
8XL
15
1.3 TB
クラスターのアクティブなカーソル設定を表示するには、スーパーユーザー権限で
STV_CURSOR_CONFIGURATION (p. 529) システムテーブルに対してクエリを実行します。アクティ
ブなカーソルの状態を表示するには、STV_ACTIVE_CURSORS (p. 526) システムテーブルに対してクエ
リを実行します。ユーザーは自分のカーソルの行のみを表示できますが、スーパーユーザーはすべての
カーソルを表示できます。
カーソルを使用するときのパフォーマンスに関する考慮事項
カーソルによって結果セット全体がリーダーノードでマテリアライズされてから、結果をクライアント
に返す処理が始まるため、非常に大きな結果セットにカーソルを使用すると、パフォーマンスが低下す
る可能性があります。非常に大きな結果セットには、カーソルを使用しないことを強くお勧めします。
API Version 2012-12-01
229
Amazon Redshift データベース開発者ガイド
DECLARE
アプリケーションが ODBC 接続を使用する場合など、状況によっては、カーソルのみが実行可能な解
決策の場合があります。ただし、可能な限り、次の代替方法を使用することをお勧めします。
• UNLOAD (p. 295) を使用して大きなテーブルをエクスポートします。UNLOAD を使用すると、複数の
コンピューティングノードが同時に機能し、Amazon S3 のデータファイルに直接データを転送しま
す。詳細については、「データのアンロード (p. 92)Unloading Data」を参照してください。
• クライアントアプリケーションで JDBC の fetch size パラメータを設定します。JDBC 接続を使用
し、クライアント側のメモリ不足エラーが発生する場合、JDBC の fetch size パラメータを設定する
ことで、ユーザーが少量の結果セットを取得するように指定できます。詳細については、「JDBC
フェッチサイズパラメータの設定 (p. 110)」を参照してください。
DECLARE CURSOR の例
次の例では、LOLLAPALOOZA というカーソルを宣言し、Lollapalooza イベントの売り上げ情報を選択
し、カーソルを使用して結果セットから行を取得します。
-- Begin a transaction
begin;
-- Declare a cursor
declare lollapalooza cursor for
select eventname, starttime, pricepaid/qtysold as costperticket, qtysold
from sales, event
where sales.eventid = event.eventid
and eventname='Lollapalooza';
-- Fetch the first 5 rows in the cursor lollapalooza:
fetch forward 5 from lollapalooza;
eventname
|
starttime
| costperticket | qtysold
--------------+---------------------+---------------+--------Lollapalooza | 2008-05-01 19:00:00 |
92.00000000 |
3
Lollapalooza | 2008-11-15 15:00:00 | 222.00000000 |
2
Lollapalooza | 2008-04-17 15:00:00 | 239.00000000 |
3
Lollapalooza | 2008-04-17 15:00:00 | 239.00000000 |
4
Lollapalooza | 2008-04-17 15:00:00 | 239.00000000 |
1
(5 rows)
-- Fetch the next row:
fetch next from lollapalooza;
eventname
|
starttime
| costperticket | qtysold
--------------+---------------------+---------------+--------Lollapalooza | 2008-10-06 14:00:00 | 114.00000000 |
2
-- Close the cursor and end the transaction:
close lollapalooza;
commit;
API Version 2012-12-01
230
Amazon Redshift データベース開発者ガイド
DELETE
DELETE
テーブルから行を削除します。
Note
単一 SQL ステートメントの最大サイズは 16 MB です。
概要
DELETE [ FROM ] table_name
[ {USING } table_name, ... ]
[ WHERE condition ]
パラメータ
FROM
FROM キーワードは、USING 句が指定されている場合を除き、オプションです。ステートメント
delete from event; と delete event; は、EVENT テーブルからすべての行を削除する操作
と同じです。
table_name
一時テーブルまたは永続的テーブルテーブルの所有者またはテーブルで DELETE 権限を持つユー
ザーのみが、テーブルから行を削除できます。
大きなテーブルで制限のない削除操作を実行するには、TRUNCATE コマンドを使用します。
「TRUNCATE (p. 294)」を参照してください。
Note
テーブルから多数の行を削除した後:
• ストレージ容量を再利用し、行を再ソートするため、テーブルにバキューム処理を実行
します。
• テーブルを分析して、クエリプランナーの統計情報を更新します。
USING table_name, ...
USING キーワードは、WHERE 句の条件で追加のテーブルを参照するときに、テーブルリストを
導入するために使用されます。例えば、次のステートメントでは、EVENT テーブルと SALES テー
ブルに対する結合条件を満たす EVENT テーブルから、すべての行を削除します。FROM リスト
で、SALES テーブル名を明示的に指定する必要があります。
delete from event using sales where event.eventid=sales.eventid;
USING 句でターゲットテーブル名を繰り返すと、DELETE 操作が自己結合を実行します。USING
構文で同じクエリを書く代わりに、WHERE 句でサブクエリを使用することもできます。
WHERE 条件
削除対象を、条件を満たす行に制限するオプションの句。例えば、列に対する制限条件、結合条
件、クエリ結果に基づく条件などがあります。クエリでは、DELETE コマンドのターゲットではな
いテーブルを参照できます。以下に例を示します。
delete from t1
where col1 in(select col2 from t2);
API Version 2012-12-01
231
Amazon Redshift データベース開発者ガイド
DROP DATABASE
条件を指定しない場合、テーブルのすべての行が削除されます。
例
CATEGORY テーブルからすべての行を削除します。
delete from category;
CATEGORY テーブルから CATID 値が 0~9 の行を削除します。
delete from category
where catid between 0 and 9;
LISTING テーブルから、SELLERID 値が SALES テーブルに存在しない行を削除します。
delete from listing
where listing.sellerid not in(select sales.sellerid from sales);
次の 2 つのクエリはいずれも、EVENT テーブルへの結合と CATID に対する追加の制限に基づいて、
CATEGORY テーブルから 1 行を削除します。
delete from category
using event
where event.catid=category.catid and category.catid=9;
delete from category
where catid in
(select category.catid from category, event
where category.catid=event.catid and category.catid=9);
DROP DATABASE
データベースを削除します。このコマンドを元に戻すことはできません。
概要
DROP DATABASE database_name [ FORCE ]
パラメータ
database_name
削除するデータベースの名前。現在接続されているデータベースは、削除できません。
FORCE
DEV データベースを復元できるようにするために、DEV データベースの削除に使用されるオプショ
ン。DEV データベースを削除するには、FORCE を使用する必要があります。
API Version 2012-12-01
232
Amazon Redshift データベース開発者ガイド
DROP GROUP
Caution
バックアップから DEV データベースを復元する場合を除き、このオプションは使用しな
いでください。一般的に、Amazon Redshift では、DEV データベースを作成する必要があ
り、DEV データベースの存在に依存した操作がいくつかあります。
例
次の例では、TICKIT_TEST という名前のデータベースを削除します。
drop database tickit_test;
DROP GROUP
ユーザーグループを削除します。このコマンドを元に戻すことはできません。このコマンドでは、グ
ループ内の個々のユーザーは削除されません。
個々のユーザーの削除については、DROP USER を参照してください。
概要
DROP GROUP name
パラメータ
name
削除するユーザーグループの名前。
例
次の例では、GUEST ユーザーグループを削除します。
drop group guests;
DROP SCHEMA
スキーマを削除します。このコマンドを元に戻すことはできません。
概要
DROP SCHEMA name [, ...] [ CASCADE | RESTRICT ]
パラメータ
name
削除するスキーマの名前。
CASCADE
テーブルや関数など、スキーマ内のすべてのオブジェクトを自動的に削除します。
API Version 2012-12-01
233
Amazon Redshift データベース開発者ガイド
DROP TABLE
RESTRICT
スキーマにオブジェクトが含まれる場合は、スキーマを削除しないでください。デフォルト。
例
次の例では、S_SALES というスキーマを削除します。次の例には、オブジェクトが含まれるスキーマ
が削除されないようにする安全機構があります。この場合、スキーマオブジェクトを削除してから、ス
キーマを削除します。
drop schema s_sales restrict;
次の例では、S_SALES というスキーマと、そのスキーマに依存するすべてのオブジェクトを削除しま
す。
drop schema s_sales cascade;
DROP TABLE
データベースからテーブルを削除します。テーブルの所有者のみがテーブルを削除できます。
テーブルを削除せずに、テーブルの行を空にする場合、DELETE または TRUNCATE コマンドを使用
します。
DROP TABLE を使用すると、ターゲットテーブルに存在する制約が削除されます。1 つの DROP TABLE
コマンドで複数のテーブルを削除できます。
概要
DROP TABLE name [, ...] [ CASCADE | RESTRICT ]
パラメータ
name
削除するテーブルの名前。
CASCADE
ビューなど、テーブルに依存するオブジェクトは自動的に削除されます。
RESTRICT
テーブルに依存するオブジェクトがある場合、テーブルは削除されません。これがデフォルトのア
クションです。
例
依存するオブジェクトがないテーブルの削除
次のコマンドセットでは、依存するオブジェクトがない FEEDBACK テーブルを作成し、削除します。
create table feedback(a int);
drop table feedback;
API Version 2012-12-01
234
Amazon Redshift データベース開発者ガイド
DROP TABLE
このテーブルに、他のテーブルを参照する列が含まれている場合、Amazon Redshift では、依存するオ
ブジェクトも削除するには CASCADE オプションを使用するように示すメッセージが表示されます。
ERROR: cannot drop table category because other objects depend on it
HINT: Use DROP ... CASCADE to drop the dependent objects too.
2 つのテーブルの同時削除
次のコマンドセットでは、FEEDBACK テーブルと BUYERS テーブルを作成し、1 つのコマンドで 2
つのテーブルを削除します。
create table feedback(a int);
create table buyers(a int);
drop table feedback, buyers;
次の手順では、CASCADE スイッチを使用して、FEEDBACK というテーブルを削除する方法について
説明します。
まず、CREATE TABLE コマンドを使用して、FEEDBACK という単純なテーブルを作成します。
create table feedback(a int);
依存するオブジェクトがあるテーブルの削除
次に、CREATE VIEW コマンドを使用して、テーブル FEEDBACK に依存する FEEDBACK_VIEW とい
うビューを作成します。
create view feedback_view as select * from feedback;
次のコマンドでは、テーブル FEEDBACK を削除し、ビュー FEEDBACK_VIEW も削除します。これ
は、FEEDBACK_VIEW がテーブル FEEDBACK に依存しているためです。
drop table feedback cascade;
テーブルの依存関係の確認
データベース内のすべてのテーブルに関する依存関係情報を持つビューを作成できます。このビューに
対してクエリを実行して、指定されたテーブルに依存するオブジェクトがあるかどうかを確認してか
ら、テーブルを削除します。
次のコマンドを入力して FIND_DEPEND ビューを作成します。このビューでは、依存関係をオブジェ
クト参照と結合します。
select distinct c_p.oid as tbloid,
n_p.nspname as schemaname, c_p.relname as name,
n_c.nspname as refbyschemaname, c_c.relname as refbyname,
c_c.oid as viewoid
from pg_catalog.pg_class c_p
join pg_catalog.pg_depend d_p
on c_p.relfilenode = d_p.refobjid
join pg_catalog.pg_depend d_c
on d_p.objid = d_c.objid
API Version 2012-12-01
235
Amazon Redshift データベース開発者ガイド
DROP USER
join pg_catalog.pg_class c_c
on d_c.refobjid = c_c.relfilenode
left outer join pg_namespace n_p
on c_p.relnamespace = n_p.oid
left outer join pg_namespace n_c
on c_c.relnamespace = n_c.oid
where d_c.deptype = 'i'::"char"
and c_c.relkind = 'v'::"char";
この例では、SALES テーブルから SALES_VIEW を作成します。
create view sales_view as select * from sales;
FIND_DEPEND ビューに対してクエリを実行して、データベース内の依存関係を表示します。PUBLIC
スキーマに対するクエリの範囲を制限します。
select * from find_depend
where refbyschemaname='public'
order by name;
このクエリは次の依存関係を返します。この例では、SALES テーブルを削除するときに、CASCADE
オプションを使用して SALES_VIEW も削除されます。
tbloid | schemaname |
name
| viewoid | refbyschemaname | refbyname
--------+------------+-------------+---------+-----------------+------------100241 | public
| find_depend | 100241 | public
| find_depend
100203 | public
| sales
| 100245 | public
| sales_view
100245 | public
| sales_view | 100245 | public
| sales_view
(3 rows)
DROP USER
データベースからユーザーを削除します。1 つの DROP USER コマンドで複数のユーザーを削除でき
ます。
概要
DROP USER name [, ... ]
パラメータ
name
削除するユーザーアカウントの名前。複数のユーザーアカウントを指定できます。ユーザーアカウ
ント名の間はカンマで区切ります。
コメント
現在データベースを所有しているユーザーを削除するには、まずデータベースを削除するか、所有権を
別のユーザーに変更してからこのコマンドを実行します。
API Version 2012-12-01
236
Amazon Redshift データベース開発者ガイド
DROP VIEW
例
danny というユーザーアカウントを削除するには、次のように実行します。
drop user danny;
danny と billybob という 2 人のユーザーを削除するには、次のように実行します。
drop user danny, billybob;
DROP VIEW
データベースからビューを削除します。1 つの DROP VIEW コマンドで複数のビューを削除できます。
このコマンドを元に戻すことはできません。
概要
DROP VIEW name [, ... ] [ CASCADE | RESTRICT ]
パラメータ
name
削除するビューの名前。
CASCADE
他のビューなど、ビューに依存するオブジェクトは自動的に削除されます。
RESTRICT
ビューに依存するオブジェクトがある場合、ビューは削除されません。これがデフォルトのアク
ションです。
例
このコマンドでは、event というビューが削除されます。
drop view event;
依存するオブジェクトがあるビューを削除するには、CASCADE オプションを使用します。例えば、
EVENT というテーブルがあり、eventview という EVENT テーブルのビューを作成するとします。
ここでは、ビュー eventview に基づいて、myeventview という別のビューを作成します。
DROP VIEW コマンドで、myeventview ビューが削除されます。
まず、CREATE VIEW コマンドを使用して、EVENT テーブルの eventview ビューを作成します。
create view eventview as
select dateid, eventname, catid
from event where catid = 1;
API Version 2012-12-01
237
Amazon Redshift データベース開発者ガイド
END
次に myeventview という 2 つ目のビューを作成します。このビューは、最初のビュー eventview に基
づいています。
create view myeventview as
select eventname, catid
from eventview where eventname <> ' ';
この時点で、eventview と myeventview という 2 つのビューが作成されています。
myeventview ビューは、親として eventview を持つ子ビューです。
例えば、eventview ビューを削除するために、次のコマンドを使用するとします。
drop view eventview;
このコマンドを実行すると、次のエラーが返されます。
drop view eventview;
ERROR: cannot drop view eventview because other objects depend on it
HINT: Use DROP ... CASCADE to drop the dependent objects too.
この問題を回避するために、(エラーメッセージの指示に従って)次のコマンドを入力します。
drop view eventview cascade;
このコマンドは問題なく実行されます。
drop view myeventview cascade;
これで、両方のビューが正常に削除されました。
END
現在のトランザクションをコミットします。COMMIT コマンドと同じ機能です。
詳細については、「COMMIT (p. 187)」を参照してください。
概要
END [ WORK | TRANSACTION ]
パラメータ
WORK
オプションキーワード
TRANSACTION
オプションキーワード。WORK と TRANSACTION は同義語です。
API Version 2012-12-01
238
Amazon Redshift データベース開発者ガイド
EXECUTE
例
次の例はすべて、トランザクションブロックを終了し、トランザクションをコミットします。
end;
end work;
end transaction;
Amazon Redshift では、次のどのコマンドを実行しても、トランザクションブロックが終了し、変更が
コミットされます。
EXECUTE
以前に準備したステートメントを実行します。
概要
EXECUTE plan_name [ (parameter [, ...]) ]
パラメータ
plan_name
実行する準備済みステートメントの名前。
parameter
準備済みステートメントに対するパラメータの実際の値。準備済みステートメントを作成した
PREPARE コマンドで、このパラメータの位置に指定されているデータ型と互換性がある型の値に
評価される式にする必要があります。
使用に関する注意事項
EXECUTE は、以前に準備したステートメントを実行するために使用されます。準備済みステートメン
トは 1 つのセッション期間のみ存在するため、現在のセッションより前に実行した PREPARE ステー
トメントで準備済みステートメントを作成しておく必要があります。
前の PREPARE ステートメントでいくつかのパラメータを指定した場合、互換性のあるパラメータセッ
トを EXECUTE ステートメントに渡す必要があります。そうしないと、Amazon Redshift からエラー
が返されます。関数とは異なり、準備済みステートメントは、指定したパラメータの種類または数に
よって過負荷になることはありません。準備済みステートメントの名前は、データベースセッション内
で一意にする必要があります。
準備済みステートメントに対して EXECUTE コマンドを発行すると、Amazon Redshift は(指定した
パラメータ値に基づいてパフォーマンスを改善するように)必要に応じてクエリ実行計画を修正してか
ら、準備済みステートメントを実行することがあります。また、準備済みステートメントを新しく実行
するたびに、EXECUTE ステートメントを使用して指定した異なるパラメータ値に基づいて、Amazon
Redshift はクエリ実行計画を修正することがあります。Amazon Redshift が特定の EXECUTE ステート
メントに選択したクエリ実行計画を確認するには、EXPLAIN (p. 240) コマンドを使用します。
準備済みステートメントの作成と使用の例と詳細については、「PREPARE (p. 253)」を参照してくださ
い。
API Version 2012-12-01
239
Amazon Redshift データベース開発者ガイド
EXPLAIN
以下の資料も参照してください。
DEALLOCATE (p. 227)、PREPARE (p. 253)
EXPLAIN
クエリを実行せずに、クエリステートメントの実行計画を表示します。
概要
EXPLAIN [ VERBOSE ] query
パラメータ
VERBOSE
クエリプランの概要だけでなく、詳細情報を表示します。
Query
説明を表示するクエリステートメント。SELECT、INSERT、CREATE TABLE AS、UPDATE、
DELETE クエリステートメントを指定できます。
使用に関する注意事項
EXPLAIN のパフォーマンスは、一時テーブルの作成にかかる時間の影響を受けることがあります。例
えば、共通のサブ式の最適化を使用するクエリでは、EXPLAIN の出力を返すために、一時テーブルを
作成し、分析する必要があります。クエリプランは、一時テーブルのスキーマと統計情報に依存しま
す。そのため、このようなクエリの EXPLAIN コマンドには、予測よりも長い実行時間がかかる可能性
があります。
クエリプランと実行ステップ
各 Amazon Redshift クエリステートメントの実行計画では、クエリの実行と計算を複数のステップと
テーブル操作に分割し、クエリの最終的な結果セットを作成します。次の表では、ユーザーが実行のた
めに送信するクエリの実行計画を作成するときに、Amazon Redshift で使用できるステップの概要を説
明します。
EXPLAIN の演算子
クエリ実行手順
説明
scan
Amazon Redshift のリレーションスキャンまたは
テーブルスキャンの演算子またはステップ。テー
ブル全体を最初から最後までスキャンします。ま
た、WHERE 句で指定した場合は、各行について
のクエリの制約(フィルタ)も評価します。ま
た、INSERT、UPDATE、および DELETE ステー
トメントの実行にも使用されます。
SCAN:
Sequential Scan
JOINS: Amazon Redshift は、結合されるテーブルの物理的な設計、結合に必要なデータの場所、ク
エリ固有の属性に基づいて、異なる結合演算子を使用します。Subquery Scan -- Subquery scan と
append は、UNION クエリの実行に使用されます。
API Version 2012-12-01
240
Amazon Redshift データベース開発者ガイド
EXPLAIN
EXPLAIN の演算子
クエリ実行手順
説明
Nested Loop
nloop
最小限の最適な結合。主にクロス結合(デカルト
積、結合条件を使用しない)と一部の非等値結合
に使用されます。
Hash Join
hjoin
内部結合と左右の外部結合にも使用され、通常、
入れ子のループ結合よりも高速です。Hash Join
では、外部テーブルを読み取り、結合する列を
ハッシュ処理し、内部ハッシュテーブルで一致を
検索します。ディスクを使用するステップにする
こともできます(hjoin の内部入力は、ディスク
ベースにすることができるハッシュステップで
す)。
Merge Join
mjoin
内部結合と外部結合にも使用されます(いずれの
結合も、結合する列に基づいて分散とソートが行
われます)。通常、他のコストを考慮しなけれ
ば、Amazon Redshift で最高速の結合アルゴリズ
ムです。
AGGREGATION: 集計関数と GROUP BY 操作に関係するクエリに使用される演算子とステップ。
Aggregate
aggr
スカラー集計関数の演算子とステップ。
HashAggregate
aggr
グループ化された集計関数の演算子とステップ。
ハッシュテーブルの効力をディスクに拡張して、
ディスクから操作できます。
GroupAggregate
aggr
force_hash_grouping 設定の Amazon Redshift の
構成設定がオフの場合に、グループ化された集計
クエリに選択されることがある演算子。
SORT: クエリをソートする必要がある場合、または結果セットをマージする必要がある場合に使用
される演算子とステップ。
Sort
sort
Sort は、ORDER BY 句で指定されたソートと、
UNION や結合などの操作を実行します。ディス
クから操作できます。
Merge
merge
並行して実行された操作から派生した中間のソー
ト結果に基づいて、クエリの最終的なソート結果
を生成します。
EXCEPT、INTERCEPT、UNION 操作:
SetOp Except [Distinct]
hjoin
EXCEPT クエリに使用されます。入力ハッシュを
ディスクベースにすることができる機能に基づい
て、ディスクから操作できます。
Hash Intersect [Distinct]
hjoin
INTERSECTクエリに使用されます。入力ハッシュ
をディスクベースにすることができる機能に基づ
いて、ディスクから操作できます。
Append [All |Distinct]
save
Append は、UNION および UNION ALL クエリを
実装するために、Subquery Scan と共に使用され
ます。「save」の機能に基づいて、ディスクから
操作できます。
その他:
API Version 2012-12-01
241
Amazon Redshift データベース開発者ガイド
EXPLAIN
EXPLAIN の演算子
クエリ実行手順
説明
Hash
hash
内部結合と左右の外部結合に使用されます(ハッ
シュ結合に入力を提供します)。Hash 演算子で、
結合の内部テーブルのハッシュテーブルが作成さ
れます(内部テーブルは、一致について確認され
るテーブルであり、2 つのテーブルの結合で、通
常は 2 つのうち小さい方です)。
Limit
limit
LIMIT 句を評価します。
Materialize
save
入れ子のループ結合と一部のマージ結合への入力
のために、行をマテリアライズします。ディスク
から操作できます。
--
parse
ロード中にテキストの入力データを解析するため
に使用されます。
--
project
列をソートし、式(つまりプロジェクトデータ)
を計算するために使用されます。
Result
--
テーブルへのアクセスを伴わないスカラー関数を
実行します。
--
return
行をリーダーまたはクライアントに返します。
Subplan
--
特定のサブクエリに使用されます。
Unique
unique
SELECT DISTINCT および UNION クエリから重
複が除外されます。
Window
window
集計およびランキングウィンドウ関数を計算しま
す。ディスクから操作できます。
Network (Broadcast)
bcast
Broadcast は、Join Explain 演算子とステップの属
性でもあります。
Network (Distribute)
dist
データウェアハウスクラスターによる並行処理の
ために、行をコンピューティングノードに分散し
ます。
Network (Send to Leader)
return
さらに詳細な処理のために、結果をリーダーに送
り返します。
ネットワーク操作:
DML 操作(データを変更する演算子):
Insert (using Result)
insert
データを挿入します。
Delete (Scan + Filter)
delete
データを削除します。ディスクから操作できま
す。
Update (Scan + Filter)
delete、insert
delete と Insert として実装されます。
例
Note
これらの例では、出力例は Amazon Redshift 設定によって変わります。
API Version 2012-12-01
242
Amazon Redshift データベース開発者ガイド
EXPLAIN
次の例は、EVENT テーブルと VENUE テーブルから EVENTID、EVENTNAME、VENUEID、および
VENUENAME を選択するクエリのクエリプランを返します。
explain
select eventid, eventname, event.venueid, venuename
from event, venue
where event.venueid = venue.venueid;
QUERY PLAN
-------------------------------------------------------------------------XN Hash Join DS_DIST_OUTER (cost=2.52..58653620.93 rows=8712 width=43)
Hash Cond: ("outer".venueid = "inner".venueid)
-> XN Seq Scan on event (cost=0.00..87.98 rows=8798 width=23)
-> XN Hash (cost=2.02..2.02 rows=202 width=22)
-> XN Seq Scan on venue (cost=0.00..2.02 rows=202 width=22)
(5 rows)
次の例では、同じクエリで詳細な出力のクエリプランを返します。
explain verbose
select eventid, eventname, event.venueid, venuename
from event, venue
where event.venueid = venue.venueid;
QUERY PLAN
-------------------------------------------------------------------------{HASHJOIN
:startup_cost 2.52
:total_cost 58653620.93
:plan_rows 8712
:plan_width 43
:best_pathkeys <>
:dist_info DS_DIST_OUTER
:dist_info.dist_keys (
TARGETENTRY
{
VAR
:varno 2
:varattno 1
...
XN Hash Join DS_DIST_OUTER (cost=2.52..58653620.93 rows=8712 width=43)
Hash Cond: ("outer".venueid = "inner".venueid)
-> XN Seq Scan on event (cost=0.00..87.98 rows=8798 width=23)
-> XN Hash (cost=2.02..2.02 rows=202 width=22)
-> XN Seq Scan on venue (cost=0.00..2.02 rows=202 width=22)
(519 rows)
次の例では、CREATE TABLE AS(CTAS)ステートメントのクエリプランを返します。
explain create table venue_nonulls as
select * from venue
where venueseats is not null;
API Version 2012-12-01
243
Amazon Redshift データベース開発者ガイド
FETCH
QUERY PLAN
----------------------------------------------------------XN Seq Scan on venue (cost=0.00..2.02 rows=187 width=45)
Filter: (venueseats IS NOT NULL)
(2 rows)
FETCH
カーソルを使用して行を取得します。カーソルの宣言について詳しくは、「DECLARE (p. 228)」を参照
してください。
FETCH は、カーソル内の現在の位置に基づいて行を取得します。カーソルを作成すると、最初の行の
前に位置が設定されます。FETCH 後は、最後に取得した行にカーソル位置が設定されます。使用でき
る最後の行まで FETCH を実行すると(FETCH ALL の後など)、カーソル位置は最後の行の後になり
ます。
FORWARD 0 では、現在の行を取得し、カーソルを移動しません。つまり、最後に取得した行を取得
します。カーソル位置が最初の行の前、または最後の行の後の場合、行は返されません。
カーソルの最初の行が取得されると、必要に応じて、結果セット全体がリーダーノード、メモリ内、ま
たはディスク上にマテリアライズされます。大きな結果セットにカーソルを使用すると、パフォーマン
スが低下する可能性があるため、可能な限り、別の方法を使用することをお勧めします。詳細について
は、「カーソルを使用するときのパフォーマンスに関する考慮事項」を参照してください。
詳細については、「DECLARE (p. 228)」および「CLOSE (p. 185)」を参照してください。
概要
FETCH [ NEXT | ALL | {FORWARD [ count | ALL ] } ] FROM cursor
パラメータ
NEXT
次の行を取得します。これがデフォルト値です。
ALL
残りのすべての行を取得します(FORWARD ALL と同じです)。
FORWARD [ count | ALL ]
次の count の行、または残りのすべての行を取得します。FORWARD 0 は、現在の行を取得します。
cursor
新しいカーソルの名前。
FETCH の例
次の例では、LOLLAPALOOZA というカーソルを宣言し、Lollapalooza イベントの売り上げ情報を選択
し、カーソルを使用して結果セットから行を取得します。
-- Begin a transaction
begin;
-- Declare a cursor
API Version 2012-12-01
244
Amazon Redshift データベース開発者ガイド
GRANT
declare lollapalooza cursor for
select eventname, starttime, pricepaid/qtysold as costperticket, qtysold
from sales, event
where sales.eventid = event.eventid
and eventname='Lollapalooza';
-- Fetch the first 5 rows in the cursor lollapalooza:
fetch forward 5 from lollapalooza;
eventname
|
starttime
| costperticket | qtysold
--------------+---------------------+---------------+--------Lollapalooza | 2008-05-01 19:00:00 |
92.00000000 |
3
Lollapalooza | 2008-11-15 15:00:00 | 222.00000000 |
2
Lollapalooza | 2008-04-17 15:00:00 | 239.00000000 |
3
Lollapalooza | 2008-04-17 15:00:00 | 239.00000000 |
4
Lollapalooza | 2008-04-17 15:00:00 | 239.00000000 |
1
(5 rows)
-- Fetch the next row:
fetch next from lollapalooza;
eventname
|
starttime
| costperticket | qtysold
--------------+---------------------+---------------+--------Lollapalooza | 2008-10-06 14:00:00 | 114.00000000 |
2
-- Close the cursor and end the transaction:
close lollapalooza;
commit;
GRANT
ユーザーまたはユーザーグループのアクセス権を定義します。
権限には、テーブルとビューのデータの読み取り、データの書き込み、テーブルの作成など、アクセス
オプションが含まれます。テーブル、ビュー、関数、スキーマなど、データベースオブジェクトに対し
て特定の権限を付与するには、このコマンドを使用します。データベースオブジェクトから権限を削除
するには、REVOKE (p. 255) コマンドを使用します。
Note
スーパーユーザーは、オブジェクトの権限を設定する GRANT コマンドと REVOKE コマンド
に関係なく、すべてのオブジェクトにアクセスできます。
概要
GRANT { { SELECT | INSERT | UPDATE | DELETE | REFERENCES } [,...] | ALL [
PRIVILEGES ] }
ON [ TABLE ] table_name [, ...]
TO { username | GROUP group_name | PUBLIC } [, ...]
[ WITH GRANT OPTION ]
GRANT { { CREATE | TEMPORARY | TEMP } [,...] | ALL [ PRIVILEGES ] ]
API Version 2012-12-01
245
Amazon Redshift データベース開発者ガイド
GRANT
ON DATABASE db_name [, ...]
TO { username | GROUP group_name | PUBLIC } [, ...]
[ WITH GRANT OPTION ]
GRANT { { CREATE | USAGE } [,...] | ALL [ PRIVILEGES ] }
ON SCHEMA schema_name [, ...]
TO { username | GROUP group_name | PUBLIC } [, ...]
[ WITH GRANT OPTION ]
パラメータ
SELECT
SELECT ステートメントを使用して、テーブルまたはビューからデータを選択する権限を付与しま
す。UPDATE 操作または DELETE 操作で既存の列値を参照するには、SELECT 権限も必要です。
INSERT
INSERT ステートメントまたは COPY ステートメントを使用して、データをテーブルにロードす
る権限を付与します。
UPDATE
UPDATE ステートメントを使用して、テーブルの列を更新する権限を付与します(UPDATE 操作
には、SELECT 権限も必要です。これは、更新する行、または列の新しい値を計算する行を決定す
るには、テーブルの列を参照する必要があるためです)。
DELETE
テーブルからデータ行を削除する権限を付与します(DELETE 操作には、SELECT 権限も必要で
す。これは、削除する行を決定するには、テーブルの列を参照する必要があるためです)。
REFERENCES
外部キーの制約を作成する権限を付与します。参照されるテーブルと参照するテーブルの両方につ
いて、この権限を付与する必要があります。そうしないと、ユーザーは制約を作成できません。
ALL [ PRIVILEGES ]
指定したユーザーまたはユーザーグループに、すべての使用できる権限を 1 度で付与します。
PRIVILEGES キーワードはオプションです。
ON [ TABLE ] table_name
テーブルまたはビューに、指定した権限を付与します。TABLE キーワードはオプションです。1
つのステートメントで、複数のテーブルとビューを列挙できます。
TO username
権限を付与されるユーザー。
GROUP group_name
権限をユーザーグループに付与します。
PUBLIC
指定した権限を、後で作成されるユーザーを含め、すべてのユーザーに付与します。PUBLIC は、
常にすべてのユーザーを含むグループを表します。各ユーザーの権限には、PUBLIC に付与された
権限、ユーザーが属するグループに付与された権限、およびそのユーザーに付与された権限のすべ
てが含まれます。
WITH GRANT OPTION
指定した権限を他のユーザーに付与します。
CREATE
データベースオブジェクトに応じて、次の権限をユーザーまたはユーザーグループに付与します。
• Databases: データベース内にスキーマを作成する権限をユーザーに付与します。
• Schemas: スキーマ内にオブジェクトを作成する権限をユーザーに付与します。オブジェクトの
名前を変更するには、CREATE 権限と、名前を変更するオブジェクトを所有している必要があ
ります。
TEMPORARY | TEMP
指定したデータベースに一時テーブルを作成する権限を付与します。
API Version 2012-12-01
246
Amazon Redshift データベース開発者ガイド
GRANT
Note
デフォルトでは、PUBLIC グループの自動メンバーシップにより、一時テーブルを作成す
る権限がユーザーに付与されます。ユーザーが一時テーブルを作成する権限を削除するに
は、PUBLIC グループから TEMP 権限を取り消し、特定のユーザーまたはユーザーのグ
ループに対して、一時テーブルを作成する権限を明示的に付与します。
ON DATABASE db_name
データベースに対する権限を付与します。
USAGE
特定のスキーマ内のオブジェクトに対して USAGE 権限を付与します。これによって、ユーザーは
それらのオブジェクトにアクセスできるようになります。このようなオブジェクトに対するアク
ションごとに、権限を付与する必要があります(関数の EXECUTE 権限など)。デフォルトでは、
すべてのユーザーは PUBLIC スキーマに対して、CREATE 権限と USAGE 権限を所有しています。
ON SCHEMA schema_name
スキーマに対する権限を付与します。
使用に関する注意事項
ビューの所有権を持っている場合、またはビューに対する特権が付与されている場合でも、基礎となる
テーブルにアクセス権を持っていることにはなりません。基礎となるテーブルに対するアクセス権を明
示的に付与する必要があります。
例
次の例では、SALES テーブルに対する SELECT 権限をユーザーに付与します。bobr
grant select on table sales to bobr;
次の例では、スキーマ QA_TICKIT に対するすべてのスキーマ権限をユーザーグループ QA_USERS に
付与します。
grant all on schema qa_tickit to group qa_users;
次の一連のコマンドは、ビューに対するアクセス権が、基礎となるテーブルに対するアクセス権を示し
ていないことを示しています。VIEW_USER というユーザーは DATE テーブルから選択を実行できま
せんが、このアカウントには、VIEW_DATE に関するすべての権限が付与されています。
select current_user;
current_user
-------------dwuser
(1 row)
create user view_user;
create view view_date as select * from date;
grant all on view_date to view_user;
set session authorization view_user;
API Version 2012-12-01
247
Amazon Redshift データベース開発者ガイド
INSERT
select current_user;
current_user
-------------view_user
(1 row)
select count(*) from view_date;
count
------365
(1 row)
select count(*) from date;
ERROR: permission denied for relation date
INSERT
Topics
• 概要 (p. 248)
• パラメータ (p. 249)
• 使用に関する注意事項 (p. 250)
• INSERT の例 (p. 250)
新しい行をテーブルに挿入します。VALUES 構文を使用して 1 行、VALUES 構文を使用して複数行、
クエリの結果で定義された 1 つまたは複数の行を挿入できます(INSERT INTO ... SELECT)。
Note
大量のデータをロードする場合は COPY (p. 187) コマンドを使用することを強くお勧めします。
個々に INSERT ステートメントを使ってテーブルにデータを入力すると著しく時間がかかる場
合があります。または、他の Amazon Redshift データベーステーブルにデータが既に存在する
場合、パフォーマンスを改善するには、INSERT INTO SELECT または CREATE TABLE
AS (p. 220) を使用します。COPY コマンドを使用してテーブルをロードする方法の詳細につい
ては、「データのロード (p. 53)」を参照してください。
Note
単一 SQL ステートメントの最大サイズは 16 MB です。
概要
INSERT INTO table_name [ ( column [, ...] ) ]
{DEFAULT VALUES |
VALUES ( { expression | DEFAULT } [, ...] )
[, ( { expression | DEFAULT } [, ...] )
[, ...] ] |
query }
API Version 2012-12-01
248
Amazon Redshift データベース開発者ガイド
INSERT
パラメータ
table_name
一時テーブルまたは永続的テーブルテーブルの所有者またはテーブルで INSERT 権限を持つユー
ザーのみが、行を挿入できます。query 句を使用して行を挿入する場合、クエリで指定したテーブ
ルに SELECT 権限を持っている必要があります。
column
テーブルの 1 つまたは複数の列に値を挿入できます。ターゲットの列名は、任意の順序で列挙でき
ます。列リストを指定しない場合、挿入する値は、CREATE TABLE ステートメントで宣言した順
序で、テーブルの列に対応している必要があります。挿入する値の数が、テーブルの列数よりも少
ない場合、最初の n 列がロードされます。
宣言されたデフォルト値または NULL 値が、INSERT ステートメントに含まれない列に(暗黙的ま
たは明示的に)ロードされます。
DEFAULT VALUES
テーブルの作成時に、テーブルの列にデフォルト値が割り当てられた場合、これらのキーワードを
使用して、デフォルト値の全体を構成する行を挿入します。いずれかの列がデフォルト値ではない
場合、それらの列には NULL が挿入されます。いずれかの列が NOT NULL と宣言されている場合、
INSERT ステートメントはエラーを返します。
VALUES
このキーワードを使用して、1 つまたは複数の行を挿入します。各行は 1 つまたは複数の値で構成
されます。各行の VALUES リストは、列リストに対応する必要があります。複数の行を挿入する
場合、式リストの間はカンマで区切ります。VALUES キーワードは繰り返さないでください。複
数行の INSERT ステートメントのすべての VALUES には、同じ数の値が含まれている必要があり
ます。
Note
IDENTITY 列があるテーブルでは、複数行の INSERT VALUES ステートメントを使用でき
ません。
expression
1 つの値、または 1 つの値に評価される式。各値は、挿入される列のデータ型と互換性がある必要
があります。可能な場合、データ型が列に宣言されているデータ型と一致しない値は、互換性のあ
るデータ型に自動的に変換されます。以下に例を示します。
• 10 進値の 1.1 は 1 として INT に挿入されます。
• 10 進値の 100.8976 は 100.90 として DEC (5,2) 列に挿入されます。
値を互換性のあるデータ型に明示的に変換するには、式に型変換構文を含めます。例えば、テーブ
ル T1 の列 COL1 が CHAR(3) の場合、次のようになります。
insert into t1(col1) values('Incomplete'::char(3));
このステートメントでは、値 Inc を列に挿入します。
1 行の INSERT VALUES ステートメントの場合、式としてスカラーサブクエリを使用できます。
サブクエリの結果は適切な列に挿入されます。
Note
複数行の INSERT VALUES ステートメントでは、式にサブクエリを使用できません。
DEFAULT
このキーワードを使用して、テーブル作成時の定義に従って列のデフォルト値を挿入します。列の
デフォルト値が存在しない場合、NULL が挿入されます。NOT NULL の制約がある列に、CREATE
API Version 2012-12-01
249
Amazon Redshift データベース開発者ガイド
INSERT
TABLE ステートメントで割り当てられた明示的なデフォルト値がない場合、それらの列にはデフォ
ルト値を挿入できません。
Query
クエリを定義して、1 つまたは複数の行をテーブルを挿入します。クエリで生成されたすべての行
がテーブルに挿入されます。クエリは、テーブルの列と互換性がある列リストを返す必要がありま
すが、列名が一致する必要はありません。
使用に関する注意事項
Note
大量のデータをロードする場合は COPY (p. 187) コマンドを使用することを強くお勧めします。
個々に INSERT ステートメントを使ってテーブルにデータを入力すると著しく時間がかかる場
合があります。または、他の Amazon Redshift データベーステーブルにデータが既に存在する
場合、パフォーマンスを改善するには、INSERT INTO SELECT または CREATE TABLE
AS (p. 220) を使用します。COPY コマンドを使用してテーブルをロードする方法の詳細につい
ては、「データのロード (p. 53)」を参照してください。
挿入される値のデータ形式は、CREATE TABLE 定義で指定されたデータ形式と一致する必要がありま
す。
テーブルに新しく多数の行を挿入した後:
• ストレージ容量を再利用し、行を再ソートするため、テーブルにバキューム処理を実行します。
• テーブルを分析して、クエリプランナーの統計情報を更新します。
値が DECIMAL 列に挿入され、指定されたスケールを超えると、必要に応じて、ロードされる値は切り
上げられます。例えば、20.259 という値を DECIMAL(8,2) に挿入すると、ソートされた値は 20.26
になります。
INSERT の例
TICKIT データベースの CATEGORY テーブルには、次の行が含まれています。
catid | catgroup | catname |
catdesc
-------+----------+-----------+-------------------------------------------1 | Sports
| MLB
| Major League Baseball
2 | Sports
| NHL
| National Hockey League
3 | Sports
| NFL
| National Football League
4 | Sports
| NBA
| National Basketball Association
5 | Sports
| MLS
| Major League Soccer
6 | Shows
| Musicals | Musical theatre
7 | Shows
| Plays
| All non-musical theatre
8 | Shows
| Opera
| All opera and light opera
9 | Concerts | Pop
| All rock and pop music concerts
10 | Concerts | Jazz
| All jazz singers and bands
11 | Concerts | Classical | All symphony, concerto, and choir concerts
(11 rows)
CATEGORY テーブルと同様のスキーマを持つ CATEGORY_STAGE テーブルを作成します。ただし、
列のデフォルト値を定義します。
API Version 2012-12-01
250
Amazon Redshift データベース開発者ガイド
INSERT
create table category_stage
(catid smallint default 0,
catgroup varchar(10) default 'General',
catname varchar(10) default 'General',
catdesc varchar(50) default 'General');
次の INSERT ステートメントでは、CATEGORY テーブルのすべての行を選択し、CATEGORY_STAGE
テーブルに挿入します。
insert into category_stage
(select * from category);
クエリを囲むかっこはオプションです。
このコマンドは、CATEGORY_STAGE テーブルに新しい行を挿入します。各列には順番に値が指定さ
れます。
insert into category_stage values
(12, 'Concerts', 'Comedy', 'All stand-up comedy performances');
特定の値とデフォルトの値を組み合わせた新しい行を挿入できます。
insert into category_stage values
(13, 'Concerts', 'Other', default);
次のクエリを実行して、挿入される行を返します。
select * from category_stage
where catid in(12,13) order by 1;
catid | catgroup | catname |
catdesc
-------+----------+---------+---------------------------------12 | Concerts | Comedy | All stand-up comedy performances
13 | Concerts | Other
| General
(2 rows)
次の例は、複数行の INSERT VALUES ステートメントを示しています。最初の例では、2 行について
特定の CATID 値を挿入し、両方の行の他の列にはデフォルト値を挿入します。
insert into category_stage values
(14, default, default, default),
(15, default, default, default);
select * from category_stage where catid in(14,15) order by 1;
catid | catgroup | catname | catdesc
-------+----------+---------+--------14 | General | General | General
15 | General | General | General
(2 rows)
次の例では、特定の値とデフォルトの値の多様な組み合わせを使用して 3 行を挿入します。
API Version 2012-12-01
251
Amazon Redshift データベース開発者ガイド
INSERT
insert into category_stage values
(default, default, default, default),
(20, default, 'Country', default),
(21, 'Concerts', 'Rock', default);
select * from category_stage where catid in(0,20,21) order by 1;
catid | catgroup | catname | catdesc
-------+----------+---------+--------0 | General | General | General
20 | General | Country | General
21 | Concerts | Rock
| General
(3 rows)
この例の最初の VALUES セットは、1 行の INSERT ステートメントについて DEFAULT VALUES を指
定する場合と同じ結果になります。
次の例では、テーブルに IDENTITY 列がある場合の INSERT の動作を示します。まず CATEGORY テー
ブルの新しいバージョンを作成してから、CATEGORY に行を挿入します。
create table category_ident
(catid int identity not null,
catgroup varchar(10) default 'General',
catname varchar(10) default 'General',
catdesc varchar(50) default 'General');
insert into category_ident(catgroup,catname,catdesc)
select catgroup,catname,catdesc from category;
CATID IDENTITY 列には、指定した整数値を挿入できません。IDENTITY 列の値は、自動的に生成され
ます。
IDENTITY 列があるテーブルには、1 回で 1 行のみを挿入できます。INSERT VALUES ステートメント
を使用して、テーブルの末尾 3 列に複数行を挿入しようとすると、Amazon Redshift はエラーを返しま
す。
insert into category_ident(catgroup,catname,catdesc) values
(default,default,default),
(default,default,default);
ERROR: multi-row VALUES not supported for a table with IDENTITY column
insert into category_ident(catgroup,catname,catdesc) values
(default,default,default);
次の例は、複数行の INSERT VALUES ステートメントでは、式としてサブクエリを使用できないこと
を示します。
insert into category(catid) values
((select max(catid)+1 from category)),
((select max(catid)+2 from category));
ERROR: cannot use subqueries in multi-row VALUES
API Version 2012-12-01
252
Amazon Redshift データベース開発者ガイド
LOCK
LOCK
データベーステーブルへのアクセスを制限します。このコマンドは、トランザクションブロック内で実
行されている場合のみ意味を持ちます。
LOCK コマンドは、「ACCESS EXCLUSIVE」モードでテーブルレベルのロックを取得し、必要に応じ
て、競合するロックが解放されるまで待機します。このように明示的にテーブルをロックすると、他の
トランザクションやセッションからテーブルへの読み書きを実行しようとした場合、その操作で待機状
態が発生します。あるユーザーが作成した明示的テーブルロックは、別のユーザーがそのテーブルから
データを選択したり、そのテーブルにデータをロードすることを一時的に禁止します。LOCK コマンド
を含んでいるトランザクションが終了すると、ロックは解放されます。
制限が緩いテーブルロックは、書き込み操作など、テーブルを参照するコマンドによって黙示的に取得
されます。例えば、テーブルからデータを読み取ろうとした際に、別のユーザーがテーブルを更新して
いた場合、読み込もうとしたデータは、既に確定しているデータのスナップショットになります。(場
合によっては、クエリがシリアライズ可能な分離ルールに違反している場合、クエリは破棄されます。)
「同時書き込み操作を管理する (p. 87)」を参照してください。
DROP TABLE や TRUNCATE など、一部の DDL 操作は排他的ロックを生成します。このような操作
により、データの読み取りが禁止されます。
ロックの競合が発生すると、Amazon Redshift はエラーメッセージを表示して、競合するトランザク
ションを開始したユーザーに警告を発します。ロックの競合が発生したトランザクションは破棄されま
す。ロックの競合が発生すると、Amazon Redshift は必ず STL_TR_CONFLICT (p. 511) テーブルにエン
トリを書き込みます。
概要
LOCK [ TABLE ] table_name [, ...]
パラメータ
TABLE
オプションキーワード
table_name
ロックするテーブルの名前。テーブル名のカンマ区切りリストを使って、複数のテーブルをロック
できます。ビューをロックすることはできません。
例:
begin;
lock event, sales;
...
PREPARE
実行用のステートメントを準備します。
PREPARE によって、準備済みステートメントが作成されます。PREPARE ステートメントを実行する
と、指定されたステートメント(SELECT、INSERT、UPDATE、または DELETE)の解析、再出力、
および計画が実行されます。次に準備済みステートメントに対して EXECUTE コマンドが発行される
API Version 2012-12-01
253
Amazon Redshift データベース開発者ガイド
PREPARE
と、準備済みステートメントの実行前に、(指定されたパラメータ値に基づいてパフォーマンスを向上
させるために)Amazon Redshift はオプションでクエリ実行計画を修正することがあります。
概要
PREPARE plan_name [ (datatype [, ...] ) ] AS statement
パラメータ
plan_name
この特定の準備済みステートメントに付けられた任意の名前。この名前は単一セッション内で一意
でなければならず、以降は以前準備したステートメントの実行または割当解除に使われます。
datatype
準備済みステートメントに対するパラメータのデータ型。準備済みステートメント自体のパラメー
タを参照するには、S1、S2 などと使います。
statement
SELECT、INSERT、UPDATE または DELETE の任意のステートメント。
使用に関する注意事項
準備済みステートメントはパラメータ(ステートメントの実行時にステートメントに代入される値)を
使用できます。準備済みステートメントにパラメータを含めるには、PREPARE ステートメントにデー
タ型のリストを提供し、準備するステートメント自体で、$1、$2 などの表記を使って、位置によりパ
ラメータを参照します。ステートメントを実行する場合、EXECUTE ステートメントでこれらのパラ
メータの実際の値を指定します。詳細については、EXECUTE (p. 239) をご覧ください。
準備済みステートメントは、現在のセッションの有効期間中のみ有効です。セッションが終了すると、
準備済みステートメントは破棄されるため、再使用する場合は、作り直す必要があります。これは、単
一の準備済みステートメントを複数の同時データベースクライアントで使用することはできないという
ことも意味します。ただし、各クライアントは独自の準備済みステートメントを作成して使用すること
ができます。準備済みステートメントは、DEALLOCATE コマンドを使って、手動で削除できます。
単一のセッションを使用して多数の類似したステートメントを実行する場合、準備済みステートメント
のパフォーマンスの面のメリットは最大になります。前述したように、準備済みステートメントを新た
に実行するたびに、Amazon Redshift は指定されたパラメータ値に基づいてパフォーマンスを向上させ
るため、クエリの実行計画を修正することがあります。特定の EXECUTE ステートメントに対して
Amazon Redshift が選択したクエリの実行計画を調べるには、EXPLAIN (p. 240) コマンドを使用します。
クエリの計画と、クエリの最適化のために Amazon Redshift が収集した統計情報の詳細については、
ANALYZE (p. 180) コマンドを参照してください。
例
一時テーブルを作成するには、INSERT ステートメントを準備して実行します。
DROP TABLE temp1;
CREATE TABLE temp1 (c1 char(20), c2 char(20));
PREPARE prep_insert_plan (char, char)
AS insert into temp1 values ($1, $2);
EXECUTE prep_insert_plan (1, 'one');
EXECUTE prep_insert_plan (2, 'two');
EXECUTE prep_insert_plan (3, 'three');
DEALLOCATE prep_insert_plan;
API Version 2012-12-01
254
Amazon Redshift データベース開発者ガイド
RESET
SELECT ステートメントを準備して実行します。
PREPARE prep_select_plan (char)
AS select * from temp1 where c1 = $1;
EXECUTE prep_select_plan (2);
EXECUTE prep_select_plan (3);
DEALLOCATE prep_select_plan;
以下の資料も参照してください。
DEALLOCATE (p. 227)、EXECUTE (p. 239)
RESET
設定パラメータの値をデフォルト値に戻します。
指定した単一のパラメータ、またはすべてのパラメータを同時にリセットできます。単一のパラメータ
を指定値に設定するには、SET (p. 289) コマンドを使用します。パラメータの現在の値を表示するには、
SHOW (p. 294) コマンドを使用します。
概要
RESET { parameter_name | ALL }
パラメータ
parameter_name
リセットするパラメータの名前。パラメータの詳細については、「サーバー設定の変更 (p. 569)」
を参照してください。
ALL
すべてのランタイムパラメータをリセットします。
例
次の例では、query_group パラメータをデフォルト値にリセットします。
reset query_group;
次の例では、すべてのランタイムパラメータをデフォルト値にリセットします。
reset all;
REVOKE
テーブルの作成権限や更新権限などのアクセス権限をユーザーまたはユーザーグループから削除しま
す。
REVOKE ステートメント内で削除する権限を指定します。権限を付与するには、GRANT (p. 245) コマ
ンドを使用します。
API Version 2012-12-01
255
Amazon Redshift データベース開発者ガイド
REVOKE
Note
dwuser などのスーパーユーザーは、オブジェクト権限を設定する GRANT および REVOKE
コマンドにかかわらず、すべてのオブジェクトにアクセスできます。
概要
REVOKE [ GRANT OPTION FOR ]
{ { SELECT | INSERT | UPDATE | DELETE | RULE | REFERENCES } [,...] | ALL [
PRIVILEGES ] }
ON [ TABLE ] table_name [, ...]
FROM { username | GROUP group_name | PUBLIC } [, ...]
[ CASCADE | RESTRICT ]
REVOKE [ GRANT OPTION FOR ]
{ { CREATE | TEMPORARY | TEMP } [,...] | ALL [ PRIVILEGES ] }
ON DATABASE db_name [, ...]
FROM { username | GROUP group_name | PUBLIC } [, ...]
[ CASCADE | RESTRICT ]
REVOKE [ GRANT OPTION FOR ]
{ { CREATE | USAGE } [,...] | ALL [ PRIVILEGES ] }
ON SCHEMA schema_name [, ...]
FROM { username | GROUP group_name | PUBLIC } [, ...]
[ CASCADE | RESTRICT ]
パラメータ
GRANT OPTION FOR
このパラメータを指定すると、権限自体ではなく、権限の付与オプションだけが取り消されます。
SELECT
SELECT ステートメントを使って、テーブルやビューからデータを選択する権限を取り消します。
INSERT
INSERT ステートメントまたは COPY ステートメントを使って、データをテーブルにロードする
権限を取り消します。
UPDATE
UPDATE ステートメントを使って、テーブル列を更新する権限を取り消します。
DELETE
テーブルからデータ行を削除する権限を取り消します。
REFERENCES
外部キー制限を作成する権限を取り消します。参照先テーブルと参照元テーブルの両方で、この権
限を取り消してください。
ALL [ PRIVILEGES ]
指定されたユーザーまたはグループから、使用可能なすべての権限を一括で取り消します。
PRIVILEGES キーワードはオプションです。
ON [ TABLE ] table_name
テーブルまたはビューに関して、指定された権限を取り消します。TABLE キーワードはオプショ
ンです。
GROUP group_name
ユーザーグループから権限を取り消します。
API Version 2012-12-01
256
Amazon Redshift データベース開発者ガイド
REVOKE
PUBLIC
すべてのユーザーから指定された権限を取り消します。PUBLIC は、常にすべてのユーザーを含む
グループを表します。個々のユーザーの権限は、PUBLIC に付与された権限の総計(ユーザーが属
しているグループに付与された権限と、ユーザー個人に付与された権限)から構成されます。
WITH GRANT OPTION
ユーザーは指定された権限を他のユーザーに付与することができます。
CREATE
データベースオブジェクトに応じて、ユーザーまたはグループから以下の権限を取り消します。
• Databases: データベース内でスキーマを作成できなくなります。
• Schemas: スキーマ内でオブジェクトを作成できなくなります。オブジェクトの名前を変更する
には、CREATE 権限と、名前を変更するオブジェクトを所有している必要があります。
Note
デフォルトでは、すべてのユーザーは PUBLIC スキーマに対して、CREATE 権限と USAGE
権限を所有しています。
TEMPORARY | TEMP
指定されたデータベース内で、一時テーブルを作成する権限を取り消します。
Note
デフォルトでは、PUBLIC グループの自動メンバーシップにより、一時テーブルを作成す
る権限がユーザーに付与されます。ユーザーが一時テーブルを作成する権限を削除するに
は、PUBLIC グループから TEMP 権限を取り消し、特定のユーザーまたはユーザーのグ
ループに対して、一時テーブルを作成する権限を明示的に付与します。
ON DATABASE db_name
データベースに関する権限を取り消します。
USAGE
特定のスキーマ内のオブジェクトに関する USAGE 権限を取り消すため、ユーザーはこれらのオブ
ジェクトにアクセスできなくなります。これらのオブジェクトに関する特定の操作は個別に取り消
す必要があります(関数に関する EXECUTE 権限など)。
Note
デフォルトでは、すべてのユーザーは PUBLIC スキーマに対して、CREATE 権限と USAGE
権限を所有しています。
ON SCHEMA schema_name
スキーマに関する権限を取り消します。スキーマ権限を使って、テーブルの作成を制御できます。
データベースの CREATE 権限は、スキーマの作成だけを制御します。
CASCADE
ユーザーが付与オプションのある権限を保持していて、他のユーザーに権限を付与した場合、他の
ユーザーが保持する権限は依存権限になります。最初のユーザーが保有する権限または付与オプ
ションを取り消した際に、それに依存する権限が存在していた場合、CASCADE を指定すると、依
存する権限も取り消されます。巣でない場合、取り消しアクションは失敗します。
例えば、ユーザー A がユーザー B に付与オプションを使って権限を付与し、ユーザーがユーザー
C に権限を付与した場合、ユーザー A はユーザー B からの付与オプションを取り消し、その後
CASCADE オプションを使って、ユーザー C の権限を取り消すことができます。
RESTRICT
ユーザーが直接付与した権限だけを取り消します。これがデフォルトの動作です。
API Version 2012-12-01
257
Amazon Redshift データベース開発者ガイド
ROLLBACK
例
次の例では、SALES テーブルに関する INSERT 権限を GUESTS ユーザーグループから取り消します。
このコマンドを実行すると、GUESTS は、INSERT コマンドを使って SALES テーブルにデータをロー
ドすることができなくなります。
revoke insert on table sales from group guests;
次の例では、ユーザーのビューから選択する権限を取り消しますbobr:
revoke select on table eventview from bobr;
次の例では、TICKIT データベースで一時テーブルを作成する権限をすべてのユーザーから取り消しま
す。
revoke temporary on database tickit from public;
次の例では、PUBLIC スキーマのテーブル作成権限を管理します。このコマンドの実行後、TICKIT デー
タベースの PUBLIC スキーマで、テーブルを作成する許可が拒否されます。(デフォルトでは、すべ
てのユーザーに PUBLIC スキーマに関する CREATE と USAGE 権限があります。)
revoke create on schema public from public;
ROLLBACK
現在のトランザクションを破棄し、そのトランザクションで実行されたすべての更新を破棄します。
このコマンドは、ABORT (p. 169) コマンドと同じ機能を実行します。
概要
ROLLBACK [ WORK | TRANSACTION ]
パラメータ
WORK
オプションキーワード
TRANSACTION
オプションキーワード。WORK と TRANSACTION は同義語です。
例:
次の例では、テーブルを作成し、データがそのテーブルに挿入されるトランザクションを開始します。
次に ROLLBACK コマンドを実行すると、データ挿入がロールバックされ、テーブルは空の状態になり
ます。
次のコマンドを実行すると、MOVIE_GROSS という名前のテーブルが作成されます。
create table movie_gross( name varchar(30), gross bigint );
API Version 2012-12-01
258
Amazon Redshift データベース開発者ガイド
SELECT
次のコマンドセットを実行すると、2 つのデータ行をテーブルに挿入するトランザクションが開始され
ます。
begin;
insert into movie_gross values ( 'Raiders of the Lost Ark', 23400000);
insert into movie_gross values ( 'Star Wars', 10000000 );
その後、次のコマンドを実行すると、テーブルからデータが選択され、挿入が正常に実行されたことが
示されます。
select * from movie_gross;
コマンド出力に、両方の行が正常に挿入されたことが示されます。
name
| gross
-------------------------+---------Raiders of the Lost Ark | 23400000
Star Wars
| 10000000
(2 rows)
このコマンドはデータ変更を、トランザクションの開始時点までロールバックします。
rollback;
テーブルからデータを選択すると、空のテーブルが表示されます。
select * from movie_gross;
name | gross
------+------(0 rows)
SELECT
Topics
• 概要 (p. 260)
• WITH 句 (p. 260)
• SELECT リスト (p. 263)
• FROM 句 (p. 266)
• WHERE 句 (p. 268)
• GROUP BY 句 (p. 273)
• HAVING 句 (p. 274)
• UNION、INTERSECT、または EXCEPT (p. 275)
• ORDER BY 句 (p. 283)
• 結合例 (p. 285)
• サブクエリの例 (p. 286)
• 相関性のあるサブクエリ (p. 287)
API Version 2012-12-01
259
Amazon Redshift データベース開発者ガイド
SELECT
テーブル、ビュー、およびユーザー定義関数から行を返します。
Note
単一 SQL ステートメントの最大サイズは 16 MB です。
概要
[ WITH with_subquery [, ...] ]
SELECT
[ TOP number | [ ALL | DISTINCT ]
* | expression [ AS output_name ] [, ...] ]
[ FROM table_reference [, ...] ]
[ WHERE condition ]
[ GROUP BY expression [, ...] ]
[ HAVING condition ]
[ { UNION | ALL | INTERSECT | EXCEPT | MINUS } query ]
[ ORDER BY expression
[ ASC | DESC ]
[ LIMIT { number | ALL } ]
[ OFFSET start ]
WITH 句
WITH 句は、クエリ内の SELECT リストに先行するオプション句です。WITH 句は、1 つまたは複数の
サブクエリを定義します。各サブクエリは、ビュー定義に似ている一時テーブルを定義します。このよ
うな一時テーブルは FROM 句内で参照可能で、一時テーブルが所属するクエリの実行中のみ使用可能
です。WITH 句内の各サブクエリは、テーブル名、列名のオプションリスト、およびテーブルに対して
評価を実行するクエリ表現(SELECT ステートメント)を指定します。
WITH 句のサブクエリは、単一のクエリ実行中に、使用可能なテーブルを効率的に定義します。SELECT
ステートメントの本文内でサブクエリを使用することで、すべてのケースで同じ結果を実現できます
が、WITH 句のサブクエリの方が、読み書きが簡単になることがあります。可能な場合は、複数回参照
される、WITH 句のサブクエリは、一般的な副次式として最適化されます。つまり、一度 WITH サブク
エリを評価すると、その結果を再利用することができるということです。(一般的な副次式は、WITH
句内で定義される副次式に制限されないちおう点に注意してください。)
概要
[ WITH with_subquery [, ...] ]
ここで with_subquery は次のようになります。
with_subquery_table_name [ ( column_name [, ...] ) ] AS ( query )
パラメータ
with_subquery_table_name
WITH 句のサブクエリの結果を定義する一時テーブルの一意な名前。単一の WITH 句内で重複する
名前を使用することはできません。各サブクエリには、FROM 句 (p. 266) で参照可能なテーブル名
を付ける必要があります。
API Version 2012-12-01
260
Amazon Redshift データベース開発者ガイド
SELECT
column_name
WITH 句サブクエリの出力列名を、カンマで区切ったオプションリスト指定された列名の数は、サ
ブクエリで定義した列数以下でなければなりません。
Query
Amazon Redshift がサポートするすべての SELECT クエリ「SELECT (p. 259)」を参照してくださ
い。
使用に関する注意事項
次の SQL ステートメントで WITH 句を使用できます。
• SELECT(SELECT ステートメント内のサブクエリを含みます)
• SELECT INTO
• CREATE TABLE AS
• CREATE VIEW
•
•
•
•
•
DECLARE
EXPLAIN
INSERT INTO...SELECT
PREPARE
(WHERE 句サブクエリ内の)UPDATE
WITH 句を含んでいるクエリの FROM 句が WITH 句によって定義されたテーブルを参照していない場
合、WITH 句は無視され、クエリは通常どおり実行されます。
WITH 句のサブクエリで定義されたテーブルは、WITH 句が開始した SELECT クエリの範囲でのみ参照
可能です。例えば、このようなテーブルは、SELECT リスト、WHERE 句、または HAVING 句内のサ
ブクエリの FROM 句で参照できます。サブクエリ内で WITH 句を使用して、メインクエリまたは別の
サブクエリの FROM 句でそのテーブルを参照することはできません。このクエリパターンを使用する
と、WITH 句のテーブルに対して、relation table_name does not exist という形式のエラー
メッセージが発生します。
WITH 句のサブクエリ内で、別の WITH 句を指定することはできません。
WITH 句のサブクエリによって定義されたテーブルに対して、前方参照を作成することはできません。
例えば次のクエリでは、テーブル W1 の定義内でテーブル W2 への前方参照を設定しているため、エ
ラーが帰されます。
with w1 as (select * from w2), w2 as (select * from w1)
select * from sales;
ERROR: relation "w2" does not exist
WITH 句のサブクエリは、SELECT INTO ステートメントを構成できません。しかし、SELECT INTO
ステートメント内で WITH 句を使用することは可能です。
例
次の例では、WITH 句を含む最もシンプルなケースを示します。VENUECOPY という名前の WITH ク
エリは、VENUE テーブルからすべての行を選択します。次にメインクエリでは、VENUECOPY から
すべての行を選択します。VENUECOPY テーブルは、このクエリの有効期間中だけ存在します。
with venuecopy as (select * from venue)
select * from venuecopy order by 1 limit 10;
API Version 2012-12-01
261
Amazon Redshift データベース開発者ガイド
SELECT
venueid |
venuename
|
venuecity
| venuestate | venueseats
---------+----------------------------+-----------------+------------+----------1 | Toyota Park
| Bridgeview
| IL
|
0
2 | Columbus Crew Stadium
| Columbus
| OH
|
0
3 | RFK Stadium
| Washington
| DC
|
0
4 | CommunityAmerica Ballpark | Kansas City
| KS
|
0
5 | Gillette Stadium
| Foxborough
| MA
|
68756
6 | New York Giants Stadium
| East Rutherford | NJ
|
80242
7 | BMO Field
| Toronto
| ON
|
0
8 | The Home Depot Center
| Carson
| CA
|
0
9 | Dick's Sporting Goods Park | Commerce City
| CO
|
0
v
10 | Pizza Hut Park
| Frisco
| TX
|
0
(10 rows)
次の例では、VENUE_SALES と TOP_VENUES という名前の 2 つのテーブルを生成する WITH 句を示
します。2 番目の WITH 句テーブルは最初のテーブルから選択します。次に、メインクエリブロックの
WHERE 句には、TOP_VENUES テーブルを制約するサブクエリが含まれています。
with venue_sales as
(select venuename, venuecity, sum(pricepaid) as venuename_sales
from sales, venue, event
where venue.venueid=event.venueid and event.eventid=sales.eventid
group by venuename, venuecity),
top_venues as
(select venuename
from venue_sales
where venuename_sales > 800000)
select venuename, venuecity, venuestate,
sum(qtysold) as venue_qty,
sum(pricepaid) as venue_sales
from sales, venue, event
where venue.venueid=event.venueid and event.eventid=sales.eventid
and venuename in(select venuename from top_venues)
group by venuename, venuecity, venuestate
order by venuename;
venuename
|
venuecity
| venuestate | venue_qty | venue_sales
------------------------+---------------+------------+-----------+-----------August Wilson Theatre
| New York City | NY
|
3187 | 1032156.00
Biltmore Theatre
| New York City | NY
|
2629 |
828981.00
Charles Playhouse
| Boston
| MA
|
2502 |
857031.00
Ethel Barrymore Theatre | New York City | NY
|
2828 |
891172.00
Eugene O'Neill Theatre | New York City | NY
|
2488 |
828950.00
Greek Theatre
| Los Angeles
| CA
|
2445 |
838918.00
Helen Hayes Theatre
| New York City | NY
|
2948 |
978765.00
Hilton Theatre
| New York City | NY
|
2999 |
885686.00
Imperial Theatre
| New York City | NY
|
2702 |
877993.00
Lunt-Fontanne Theatre
| New York City | NY
|
3326 | 1115182.00
Majestic Theatre
| New York City | NY
|
2549 |
894275.00
Nederlander Theatre
| New York City | NY
|
2934 |
936312.00
Pasadena Playhouse
| Pasadena
| CA
|
2739 |
820435.00
API Version 2012-12-01
262
Amazon Redshift データベース開発者ガイド
SELECT
Winter Garden Theatre
(14 rows)
| New York City | NY
|
2838 |
939257.00
次の 2 つの例は、WITH 句サブクエリに基づいた、テーブル参照の範囲に関するルールをデモンスト
レーションしています。最初のクエリは実行されますが、2 番目のクエリは予想どおりのエラーが発生
して失敗します。最初のクエリには、メインクエリの SELECT リスト内に WITH 句サブクエリが存在
します。WITH 句によって定義されるテーブル(HOLIDAYS)は、SELECT リストのサブクエリの
FROM 句で参照されます。
select caldate, sum(pricepaid) as daysales,
(with holidays as (select * from date where holiday ='t')
select sum(pricepaid)
from sales join holidays on sales.dateid=holidays.dateid
where caldate='2008-12-25') as dec25sales
from sales join date on sales.dateid=date.dateid
where caldate in('2008-12-25','2008-12-31')
group by caldate
order by caldate;
caldate
| daysales | dec25sales
-----------+----------+-----------2008-12-25 | 70402.00 |
70402.00
2008-12-31 | 12678.00 |
70402.00
(2 rows)
2 番目のクエリは SELECT リストのサブクエリ内だけでなく、メインクエリ内の HOLIDAYS テーブル
を参照しようとしたため、失敗しました。メインクエリの参照は範囲外です。
select caldate, sum(pricepaid) as daysales,
(with holidays as (select * from date where holiday ='t')
select sum(pricepaid)
from sales join holidays on sales.dateid=holidays.dateid
where caldate='2008-12-25') as dec25sales
from sales join holidays on sales.dateid=holidays.dateid
where caldate in('2008-12-25','2008-12-31')
group by caldate
order by caldate;
ERROR:
relation "holidays" does not exist
SELECT リスト
Topics
• 概要 (p. 264)
• パラメータ (p. 264)
• 使用に関する注意事項 (p. 265)
• TOP を使った例 (p. 265)
• SELECT DISTINCT の例 (p. 265)
SELECT リストは、クエリが返す列、機能、および式を指定します。このリストは、クエリの出力を
表しています。
API Version 2012-12-01
263
Amazon Redshift データベース開発者ガイド
SELECT
概要
SELECT
[ TOP number ]
[ ALL | DISTINCT ] * | expression [ AS column_alias ] [, ...]
パラメータ
TOP数
TOP は引数として正の整数を取り、クライアントに返される行数を定義します。TOP 句に関する
動作は、LIMIT 句に関する動作と同じです。返される行数は固定ですが、行のセットは固定ではあ
りません。一貫性のある行セットを返すには、TOP または LIMIT を ORDER BY 句と組み合わせ
て使用します。
ALL
DISTINCT を指定しない場合、デフォルトの動作を定義する冗長キーワード。SELECT ALL * は、
SELECT * と同じ意味です(すべての列のすべての行を選択し、重複を維持します)。
DISTINCT
1 つまたは複数の列の一致する値に基づいて、結果セットから重複する行を削除するオプション。
* (アスタリスク)
テーブルのコンテンツ全体を返します(すべての列とすべての行)。
expression
クエリによって参照されるテーブル内に存在する 1 つまたは複数の列から構成される式。式には、
SQL 関数を含めることができます。以下に例を示します。
avg(datediff(day, listtime, saletime))
AS column_alias
最終的な結果セットに使われる列のテンポラリ名。AS キーワードはオプションです。以下に例を
示します。
avg(datediff(day, listtime, saletime)) as avgwait
シンプルな列名ではない式に対して、エイリアスを指定しない場合、結果セットはその列に対して
デフォルト名を適用します。
Note
アイリアスは、ターゲットリスト全体が解析されるまで認識されません。つまり、ター
ゲットリスト内以外では、エイリアスを参照できないということです。例えば、対のス
テートメントは失敗します。
select (qtysold + 1) as q, sum(q) from sales group by 1;
ERROR: column "q" does not exist
q に対してエイリアスを作成した式と同じ式を使用してください。
select (qtysold + 1) as q, sum(qtysold + 1) from sales group by 1;
q | sum
---+-------8 |
368
...
API Version 2012-12-01
264
Amazon Redshift データベース開発者ガイド
SELECT
使用に関する注意事項
TOP は SQL 式です。LIMIT 動作に対する選択肢を提供します。TOP と LIMIT を同じクエリで使用する
ことはできません。
TOP を使った例
SALES テーブルから任意の 10 行を返します。ORDER BY 句が指定されていないため、このクエリが
返す行セットは予想できません。
select top 10 *
from sales;
次のクエリは機能的には同じですが、TOP 句の代わりに LIMIT 句を使用します。
select *
from sales
limit 10;
SALES テーブルから最初の 10 行を、QTYSOLD 列を降順にソートして返します。
select top 10 qtysold, sellerid
from sales
order by qtysold desc, sellerid;
qtysold | sellerid
--------+---------8 |
518
8 |
520
8 |
574
8 |
718
8 |
868
8 |
2663
8 |
3396
8 |
3726
8 |
5250
8 |
6216
(10 rows)
SALES テーブルから、最初の 2 つの QTYSOLD 値と SELLERID 値を、QTYSOLD 列をソートして返
します。
select top 2 qtysold, sellerid
from sales
order by qtysold desc, sellerid;
qtysold | sellerid
--------+---------8 |
518
8 |
520
(2 rows)
SELECT DISTINCT の例
CATEGORY テーブルから異なるカテゴリグループのリストを返します。
API Version 2012-12-01
265
Amazon Redshift データベース開発者ガイド
SELECT
select distinct catgroup from category
order by 1;
catgroup
---------Concerts
Shows
Sports
(3 rows)
2008 年 12 月の週の数の独自セットを返します。
select distinct week, month, year
from date
where month='DEC' and year=2008
order by 1, 2, 3;
week | month | year
-----+-------+-----49 | DEC
| 2008
50 | DEC
| 2008
51 | DEC
| 2008
52 | DEC
| 2008
53 | DEC
| 2008
(5 rows)
FROM 句
クエリ内の FROM 句は、データの選択下のテーブル参照(テーブル、ビュー、サブクエリ)を一覧表
示します。複数のテーブル参照が一覧表示されている場合、FROM 句または WHERE 句のいずれかの
適切な構文を使って、テーブル参照を結合する必要があります。結合基準を指定していない場合、クエ
リはクロス結合(デカルト積)として処理されます。
概要
FROM table_reference [, ...]
ここで table_reference は、次のいずれかになります。
with_subquery_table_name [ [ AS ] alias [ ( column_alias [, ...] ) ] ]
table_name [ * ] [ [ AS ] alias [ ( column_alias [, ...] ) ] ]
( subquery ) [ AS ] alias [ ( column_alias [, ...] ) ]
table_reference [ NATURAL ] join_type table_reference
[ ON join_condition | USING ( join_column [, ...] ) ]
パラメータ
with_subquery_table_name
WITH 句 (p. 260) のサブクエリで定義されるテーブル。
table_name
テーブルまたはビューの名前。
API Version 2012-12-01
266
Amazon Redshift データベース開発者ガイド
SELECT
alias
テーブルまたはビューの一時的な代替名。エイリアスは、サブクエリから生成されたテーブルに対
して提供する必要があります。他のテーブル参照では、エイリアスはオプションです。AS キーワー
ドは常にオプションです。テーブルエイリアスは、WHERE 句など、クエリの別の部分のテーブル
を識別するため、便利なショートカットを提供します。以下に例を示します。
select * from sales s, listing l
where s.listid=l.listid
column_alias
テーブルまたはビュー内の列に対する一時的な代替名。
subquery
テーブルに対して評価を実行するクエリ式。テーブルは、クエリの有効期間中のみ存在し、通常は
名前つまりエイリアスが与えられます。ただし、エイリアスは必須ではありません。また、サブク
エリから生成されたテーブルに対して、列名を定義することもできます。サブクエリの結果を他の
テーブルに結合する場合、および列をクエリ内のどこかで選択または拘束する場合、列のエイリア
スの命名は重要です。
サブクエリには ORDER BY 句が含まれることがありますが、LIMIT または OFFSET 句も併せて指
定しない場合、この句には効力がありません。
NATURAL
2 つのテーブル内で同じ名前を付けられた列のペアをすべて結合列として、自動的に使用する結合
を定義します。明示的な結合条件は必要ありません。例えば、CATEGORY と EVENT の両方の
テーブルに CATID という名前の列が存在する場合、これらのテーブルの NATURAL 結合は CATID
列による結合です。
Note
NATURAL 結合を指定しても、結合対象のテーブルに同じ名前の列ペアが存在しない場合、
クエリはデフォルト設定のクロス結合になります。
join_type
以下のいずれかの結合タイプを指定します。
• [INNER] JOIN
• LEFT [OUTER] JOIN
• RIGHT [OUTER] JOIN
• FULL [OUTER] JOIN
• CROSS JOIN
ON join_condition
結合列を ON キーワードに続く条件として記述する、結合タイプの指定。以下に例を示します。
sales join listing
on sales.listid=listing.listid and sales.eventid=listing.eventid
USING ( join_column [, ...] )
結合列をカッコで一覧表示する結合の指定タイプ。複数の結合列を指定する場合、カンマによって
区切ります。USING キーワードは、リストより前に指定する必要があります。以下に例を示しま
す。
sales join listing
using (listid,eventid)
API Version 2012-12-01
267
Amazon Redshift データベース開発者ガイド
SELECT
結合の種類
クロス結合は非限定の結合で、2 つの表のデカルト積を返します。
内部結合と外部結合は限定結合です。これらの結合は、FROM 句の ON または USING 構文、または
WHERE 句条件を使った(Natural 結合での)黙示的な結合です。
内部結合は、結合条件、また結合列のリストに基づいて、一致する行だけを返します。外部結合は、同
等の内部結合が返すすべての行に加え、「左側の」表、「右側の」表、または両方の表から一致しない
行を返します。左の表は最初に一覧表示された表で、右の表は 2 番目に一覧表示された表です。一致し
ない行には、出力列のギャップを埋めるため、NULL が含まれます。
使用に関する注意事項
列を結合するには、データ型に互換性がなければなりません。
NATURAL または USING 結合は、中間結果セットの結合列の各ペアの一方だけを保持します。
ON 構文を使った結合は、中間結果セットの両方の結合列を保持します。
WITH 句 (p. 260)も参照してください。
WHERE 句
WHERE 句には、テーブルの結合またはテーブル内の列への述語の適用のいずれかを実行する条件が含
まれています。テーブルは、WHERE 句または FROM 句のいずれかの適切な構文を使うことで結合で
きます。外部結合基準は、FROM 句で指定する必要があります。
概要
[ WHERE condition ]
Condition
結合条件やテーブル列に関する述語など、ブール値結果に関する検索条件次の例は、有効な結合条件で
す。
sales.listid=listing.listid
sales.listid<>listing.listid
次の例は、テーブル内の列に関する有効な条件をです。
catgroup like 'S%'
venueseats between 20000 and 50000
eventname in('Jersey Boys,'Spamalot')
year=2008
length(catdesc)>25
date_part(month, caldate)=6
条件は単純にすることも複雑することもできます。複雑な条件の場合、カッコを使って、論理ユニット
を分離します。次の例では、結合条件をカッコによって囲みます。
where (category.catid=event.catid) and category.catid in(6,7,8)
API Version 2012-12-01
268
Amazon Redshift データベース開発者ガイド
SELECT
使用に関する注意事項
WHERE 句を使って、SELECT リスト式を参照することはできません。
WHERE 句内の集計関数の結果を制限することはできません。その目的には、HAVING 句を使用してく
ださい。
WHERE 句内で制限されている列は、FROM 句内のテーブル参照から生成する必要があります。
例:
次のクエリは、SALES テーブルと EVENT テーブルの結合条件、EVENTNAME 列に関する述語、
STARTTIME 列に関する 2 つの述語など、複数の WHERE 句制限の組み合わせを使用します。
select eventname, starttime, pricepaid/qtysold as costperticket, qtysold
from sales, event
where sales.eventid = event.eventid
and eventname='Hannah Montana'
and date_part(quarter, starttime) in(1,2)
and date_part(year, starttime) = 2008
order by 3 desc, 4, 2, 1 limit 10;
eventname
|
starttime
|
costperticket
| qtysold
----------------+---------------------+-------------------+--------Hannah Montana | 2008-06-07 14:00:00 |
1706.00000000 |
2
Hannah Montana | 2008-05-01 19:00:00 |
1658.00000000 |
2
Hannah Montana | 2008-06-07 14:00:00 |
1479.00000000 |
1
Hannah Montana | 2008-06-07 14:00:00 |
1479.00000000 |
3
Hannah Montana | 2008-06-07 14:00:00 |
1163.00000000 |
1
Hannah Montana | 2008-06-07 14:00:00 |
1163.00000000 |
2
Hannah Montana | 2008-06-07 14:00:00 |
1163.00000000 |
4
Hannah Montana | 2008-05-01 19:00:00 |
497.00000000 |
1
Hannah Montana | 2008-05-01 19:00:00 |
497.00000000 |
2
Hannah Montana | 2008-05-01 19:00:00 |
497.00000000 |
4
(10 rows)
WHERE 句の Oracle スタイルの外部結合
Amazon Redshift は Oracle の互換性について、Oracle の外部結合演算子(+)を WHERE 句結合条件
でサポートします。この演算子は、外部結合条件の定義でのみ使用することを意図しています。この演
算子をその他の目的に使用すると、ほとんどの場合、メッセージを表示せずに無視します。
外部結合は、同等の内部結合が返す行と同じ行をすべて返します。それに加え、1 つまたは両方のテー
ブルから一致しない行も返します。FROM 句では、left、right、full の外部結合を指定できます。WHERE
句では、left または right の外部結合だけを指定できます。
TABLE1 と TABLE2 を外部結合し、TABLE1(左側の外部結合)から一致しない行を返すには、FROM
句内で TABLE1 LEFT OUTER JOIN TABLE2 を指定するか、WHERE 句内で TABLE2 からのすべての
結合列に(+)演算子を適用します。TABLE2 と一致する行がない TABLE1 のすべての行の場合、
TABLE2 からの列を含む SELECT リスト式に対するクエリ結果には Null が含まれます。
TABLE1 と一致する行がない TABLE2 のすべての行に対して同じ動作を生成するには、FROM 句で
TABLE1 RIGHT OUTER JOIN TABLE2 を指定するか、WHERE 句内で TABLE1 からのすべての結合
列に(+)演算子を適用します。
API Version 2012-12-01
269
Amazon Redshift データベース開発者ガイド
SELECT
基本構文
[ WHERE {
[ table1.column1 = table2.column1(+) ]
[ table1.column1(+) = table2.column1 ]
}
最初の条件は次の同じです。
from table1 left outer join table2
on table1.column1=table2.column1
2 番目の条件は次と同じです。
from table1 right outer join table2
on table1.column1=table2.column1
Note
ここに示す構文は、結合列の 1 ペアを介した等価結合のシンプルなケースを示しています。た
だし、他のタイプの比較条件と結合列の複数のペアも有効です。
例えば、次の WHERE 句は、列の 2 つのペアを介して、外部結合を定義します。(+)演算子は、両方
の条件の同じテーブルにアタッチする必要があります。
where table1.col1 > table2.col1(+)
and table1.col2 = table2.col2(+)
使用に関する注意事項
可能な場合は、WHERE 句の(+)演算子の代わりに、標準の FROM 句 Outer JOIN 構文を使用してく
ださい。(+)演算子を含んでいるクエリは、次の規則に依存します。
• (+)演算子は WHERE 句内と、テーブルまたはビューから列への参照でのみ使用できます。
• 式に(+)演算子を適用することはできません。ただし、式に(+)演算子を使用する列を含めるこ
とはできます。例えば、次の結合条件は、構文エラーを返します。
event.eventid*10(+)=category.catid
ただし、次の結合条件は有効です。
event.eventid(+)*10=category.catid
• FROM 句結合構文も併せて含んでいるクエリブロック内で、(+)演算子を使用することはできませ
ん。
• 2 つのテーブルを複数の結合条件を介して結合する場合、(+)演算子をこれらの条件のすべてで使
用するか、すべてで使用しないことが必要です。構文スタイルが混在する結合では、警告なしに内部
結合として実行されます。
• 外部クエリ内のテーブルを内部クエリによって生成されたテーブルに結合する場合、(+)演算子は
外部結合を生成しません。
API Version 2012-12-01
270
Amazon Redshift データベース開発者ガイド
SELECT
• (+)演算子を使って、テーブルを自分自身に外部結合するには、FROM 句内でテーブルエイリアス
を定義し、結合条件でそのエイリアスを参照する必要があります。
select count(*)
from event a, event b
where a.eventid(+)=b.catid;
count
------8798
(1 row)
• (+)演算子を含む結合条件を、OR 条件または IN 条件と組み合わせることはできません。以下に例
を示します。
select count(*) from sales, listing
where sales.listid(+)=listing.listid or sales.salesid=0;
ERROR: Outer join operator (+) not allowed in operand of OR or IN.
• 3 つ以上のテーブルを外部結合する WHERE 句では、(+)演算子は指定されたテーブルに一度して
適用できません。次の例では、2 つの連続する結合で(+)演算子を使って SALES テーブルを参照
することはできません。
select count(*) from sales, listing, event
where sales.listid(+)=listing.listid and sales.dateid(+)=date.dateid;
ERROR: A table may be outer joined to at most one other table.
• WHERE 句の外部結合条件で TABLE2 からの列を定数と比較する場合、(+)演算子を列に適用しま
す。演算子を含めない場合、TABLE1 から外部結合された行(制限された行に対してヌルを含んでい
る行)は削除されます。以下の「例」のセクションを参照してください。
例
select count(*)
from sales left outer join listing on sales.listid = listing.listid;
count
-------172456
(1 row)
次の結合クエリでは、SALES テーブルと LISTING テーブルの左側の外部結合を、LISTID 列を介して
指定します。次の同等のクエリでは同じ結果が生成されますが、FROM 句の結合構文を使用します。
select count(*)
from sales, listing
where sales.listid = listing.listid(+);
count
-------172456
(1 row)
API Version 2012-12-01
271
Amazon Redshift データベース開発者ガイド
SELECT
すべての一覧が販売に含まれるわけではないため、SALES テーブルに LISTING テーブル内のすべての
リストのレコードが含まれているわけではありません。次のクエリでは、SALES と LISTING を外部結
合し、SALES テーブルが指定されたリスト ID に対して販売がないことをレポートした場合でも、
LISTING からの行を返します。SALES テーブルから生成された PRICE と COMM 列には、一致しない
行の結果セットにヌルが格納されています。
select listing.listid, sum(pricepaid) as price,
sum(commission) as comm
from listing, sales
where sales.listid(+) = listing.listid and listing.listid between 1 and 5
group by 1 order by 1;
listid | price | comm
--------+--------+-------1 | 728.00 | 109.20
2 |
|
3 |
|
4 | 76.00 | 11.40
5 | 525.00 | 78.75
(5 rows)
WHERE 句の結合演算子を使用する場合、FROM 句のテーブルの順番は問題になりません。
WHERE 句のより複雑な外部結合条件の例には、条件がテーブルの 2 列間の比較と定数の比較で構成さ
れているケースがあります。
where category.catid=event.catid(+) and eventid(+)=796;
(+)演算子が 2 つの場所で使われている点に注意してください。最初はテーブル間の同等比較、2 番
目は EVENTID 列の比較条件です。この構文の結果は、EVENTID に関する制限が評価される際、外部
結合された行に保存されます。EVENTID 制限から(+)演算子を削除すると、クエリはこの制限を、
外部結合条件ではなく、フィルタとして処理します。この場合、EVENTID にヌルが格納されている外
部結合された行は、結果セットから削除されます。
select catname, catgroup, eventid
from category left join event
on category.catid=event.catid and eventid=796;
ここでは、この動作を示す詳細なクエリを示します。FROM 句構文を使用した同等クエリを次に示し
ます。
select catname, catgroup, eventid
from category, event
where category.catid=event.catid(+) and eventid(+)=796;
catname | catgroup | eventid
-----------+----------+--------Classical | Concerts |
Jazz | Concerts |
MLB | Sports
|
MLS | Sports
|
Musicals | Shows
| 796
NBA | Sports
|
NFL | Sports
|
NHL | Sports
|
API Version 2012-12-01
272
Amazon Redshift データベース開発者ガイド
SELECT
Opera | Shows
|
Plays | Shows
|
Pop | Concerts |
(11 rows)
このクエリの WHERE 句バージョンから 2 番目の(+)演算子を削除した場合、1 行だけが返されます
(eventid=796 となる行)。
select catname, catgroup, eventid
from category, event
where category.catid=event.catid(+) and eventid=796;
catname | catgroup | eventid
-----------+----------+--------Musicals | Shows
| 796
(1 row)
GROUP BY 句
GROUP BY 句は、クエリのグループ化列を特定します。クエリが SUM、AVG、COUNT などの標準関
数を使って集計する場合、グループ化列を宣言する必要があります。
GROUP BY expression [, ...]
expression
列または式のリストは、クエリの SELECT リストの非集計式のリストと一致する必要があります。例
えば、次のシンプルなクエリを検討します。
select listid, eventid, sum(pricepaid) as revenue,
count(qtysold) as numtix
from sales
group by listid, eventid
order by 3, 4, 2, 1
limit 5;
listid | eventid | revenue | numtix
--------+---------+---------+-------89397 |
47 |
20.00 |
1
106590 |
76 |
20.00 |
1
124683 |
393 |
20.00 |
1
103037 |
403 |
20.00 |
1
147685 |
429 |
20.00 |
1
(5 rows)
このクエリでは、選択式は、2 つの集計式から構成されています。最初の式は SUM 関数を使用し、2
番目の式は COUNT 関数を使用します。残りの 2 つの例(LISTID と EVENTID)は、グループ化列と
して宣言する必要があります。
GROUP BY 句の式は、序数を使用することで、SELECT リストを参照することもできます。例えば、
前の例は、次のように短縮できます。
API Version 2012-12-01
273
Amazon Redshift データベース開発者ガイド
SELECT
select listid, eventid, sum(pricepaid) as revenue,
count(qtysold) as numtix
from sales
group by 1,2
order by 3, 4, 2, 1
limit 5;
listid | eventid | revenue | numtix
--------+---------+---------+-------89397 |
47 |
20.00 |
1
106590 |
76 |
20.00 |
1
124683 |
393 |
20.00 |
1
103037 |
403 |
20.00 |
1
147685 |
429 |
20.00 |
1
(5 rows)
HAVING 句
HAVING 句は、クエリが返す中間グループ結果セットに条件を適用します。
概要
[ HAVING condition ]
例えば、SUM 関数の結果を制限できます。
having sum(pricepaid) >10000
HAVING 条件は、すべての WHERE 句条件が適用され、GROUP BY 演算が終了した後に適用されま
す。
条件自体は、WHERE 句の条件と同じ形式になります。
使用に関する注意事項
• HAVING 句条件内で参照される列は、グループ化列または集計関数の結果を参照する列のいずれかで
なければなりません。
• HAVING 句では、以下の項目を指定することはできません。
• SELECT リストで定義されたエイリアス。エイリアスが使われていない元の式を繰り返してくだ
さい。
• SELECT リスト項目を参照する序数。序数が使用できるのは、GROUP BY 句または ORDER BY
句だけです。
例
次のクエリは、すべてのイベントに対するチケットの合計販売を名前別に計算し、販売合計が 800,000
ドルに達しなかったイベントを削除します。HAVING 条件は、SELECT リスト内の集計関数の結果に
適用されます。sum(pricepaid)
select eventname, sum(pricepaid)
from sales join event on sales.eventid = event.eventid
group by 1
API Version 2012-12-01
274
Amazon Redshift データベース開発者ガイド
SELECT
having sum(pricepaid) > 800000
order by 2 desc, 1;
eventname
|
sum
------------------+----------Mamma Mia!
| 1135454.00
Spring Awakening | 972855.00
The Country Girl | 910563.00
Macbeth
| 862580.00
Jersey Boys
| 811877.00
Legally Blonde
| 804583.00
(6 rows)
次のクエリは、同じような結果セットを計算します。ただしこの場合、SELECT リストで指定されて
いない集計に対して HAVING 条件が適用されます。sum(qtysold)2,000 枚を超えるチケットを販売
しなかったイベントは、最終結果から削除されます。
select eventname, sum(pricepaid)
from sales join event on sales.eventid = event.eventid
group by 1
having sum(qtysold) >2000
order by 2 desc, 1;
eventname
|
sum
------------------+----------Mamma Mia!
| 1135454.00
Spring Awakening | 972855.00
The Country Girl | 910563.00
Macbeth
| 862580.00
Jersey Boys
| 811877.00
Legally Blonde
| 804583.00
Chicago
| 790993.00
Spamalot
| 714307.00
(8 rows)
UNION、INTERSECT、または EXCEPT
Topics
• 概要 (p. 276)
• パラメータ (p. 276)
• セット演算の評価の順番 (p. 276)
• 使用に関する注意事項 (p. 277)
• UNION クエリの例 (p. 278)
• UNION ALL クエリの例 (p. 280)
• INTERSECT クエリの例 (p. 281)
• EXCEPT クエリの例 (p. 282)
UNION、INTERSECT、または EXCEPT セット演算子は、2 つの個別のクエリ式の比較とマージに使
われます。例えば、ウェブサイトで販売者と購入者の両方を兼ねているユーザーを知りたい場合で、そ
のユーザーが個別の列またはテーブルに保存されているときは、この 2 種類のユーザーの積集合を求め
ます。購入者ではあるが販売者ではないウェブユーザーがだれかを知りたい場合は、EXCEPT 演算子
を使って、2 つユーザーリストの違いを見つけることができます。役割とは無関係に、すべてのユー
ザーのリストを作成する場合、UNION 演算子を使用できます。
API Version 2012-12-01
275
Amazon Redshift データベース開発者ガイド
SELECT
概要
query
{ UNION [ ALL ] | INTERSECT | EXCEPT | MINUS }
query
パラメータ
Query
UNION、INTERSECT、または EXCEPT 演算子の後に続く 2 番目のクエリ式に、SELECT リスト
の形式で対応するクエリ式。2 つの式は、互換性のあるデータ型の出力列を同数含んでいる必要が
あります。そうでない場合、2 つの結果セットの比較とマージはできません。データ型の複数のカ
テゴリ間で黙示的な変換を許可しない演算を設定します。「型の互換性と変換 (p. 145)」を参照し
てください。
クエリ式の数を上限なしに含むクエリを構築して、そのクエリを任意の組み合わせで UNION、
INTERSECT、および EXCEPT 演算子に関連付けることができます。例えば、テーブル T1、T2、
および T3 に互換性のある列セットが含まれていると想定した場合、次のクエリ構造は有効です。
select *
union
select *
except
select *
order by
from t1
from t2
from t3
c1;
UNION
行が片方の式から生成されたか、両方の式から生成されたかにかかわらず、2 つのクエリ式からの
行を返す演算を設定します。
INTERSECT
2 つのクエリ式から生成される行を返す演算を設定します。両方の式によって返されない行は破棄
されます。
EXCEPT | MINUS
2 つのクエリ式の一方から生成される行を返す演算を設定します。結果を制限するため、行は最初
の結果テーブルに存在し、2 番目のテーブルには存在しない必要があります。MINUS と EXCEPT
はまったく同じ意味です。
ALL
ALL キーワードは、UNION が生成する重複行を保持します。ALL キーワードを使用しないよう場
合のデフォルトの動作は、このような重複を破棄します。INTERSECT ALL、EXCEPT ALL、およ
び MINUS ALL はサポートされません。
セット演算の評価の順番
UNION および EXCEPT セット演算子は左結合です。優先順位の決定でカッコを指定しなかった場合、
これらのセット演算子の組み合わせは、左から右に評価されます。
select *
union
select *
except
select *
order by
from t1
from t2
from t3
c1;
API Version 2012-12-01
276
Amazon Redshift データベース開発者ガイド
SELECT
例えば、次のクエリでは、T1 と T2 の UNION が最初に評価され、次に UNION の結果に対して、
EXCEPT 演算が実行されます。
同じクエリ内で演算子の組み合わせを使用した場合、INTERSECT 演算子は UNION および EXCEPT
よりも優先されます。 例えば、次のクエリは T2 と T3 の積集合を評価し、その結果を T1 を使って結
合します。
select * from t1
union
select * from t2
intersect
select * from t3
order by c1;
カッコを追加することで、評価の順番を変更することができます。
(select * from t1
union
select * from t2)
intersect
(select * from t3)
order by c1;
次のケースでは、T1 と T2 の結合結果と T3 の積集合を求めます。このクエリでは異なる結果が生成さ
れます。
使用に関する注意事項
• セット演算クエリの結果で返される列名は、最初のクエリ式のテーブルからの列名(またはエイリア
ス)です。これらの列名は、列内の値はセット演算子の両方のテーブルから生成されるという点で誤
解を生む可能性があるため、結果セットには意味のあるエイリアスを付けることをお勧めします。
• セット演算子より前に記述されたクエリ式には、ORDER BY 句を含めないでください。ORDER BY
句は、セット演算子を含むクエリの最後に使用することで、意味のあるソート結果が得られます。こ
の SORT BY 句は、すべてのセット演算の最終結果に適用されます。最も外側のクエリには、標準の
LIMIT および OFFSET 句が含まれていることもあります。
• LIMIT 句と OFFSET 句は、セット演算の中間結果によって返される行数を制限するための手段とし
てはサポートされていません。例えば、次のクエリはエラーを返します。
(select listid from listing
limit 10)
intersect
select listid from sales;
ERROR: LIMIT may not be used within input to set operations.
• セット演算子クエリが 10 進数の結果を返した場合、同じ精度とスケールで対応する結果列を返すよ
うに奨励されます。例えば、T1.REVENUE が DECIMAL(10,2) 列で T2.REVENUE が DECIMAL(8,4)
列の次のクエリでは、DECIMAL(12,4) への結果も 10 進数であることが奨励されます。
select t1.revenue union select t2.revenue;
スケールは 4 になります。2 つの列の最大のスケールです。精度は 12 です。T1.REVENUE は小数
点の左側に 8 桁必要だからです(12 - 4 = 8)。このような奨励により、UNION の両側からのすべて
の値が結果に適合します。64 ビットの値の場合、最大結果精度は 19 で、最大結果スケールは 18 で
す。128 ビットの値の場合、最大結果精度は 38 で、最大結果スケールは 37 です。
API Version 2012-12-01
277
Amazon Redshift データベース開発者ガイド
SELECT
生成されるデータ型が Amazon Redshift の精度とスケールの上限を超えた場合、クエリはエラーを
返します。
• セット演算の実行時、列の対応する各ペアに対して、2 つのデータの値が同じか、両方とも NULL の
場合、2 つの行は同じとして処理されます。例えば、テーブル T1 と T2 の両方に 1 つの列と 1 つの
行が含まれていて、両方のテーブルでその行が NULL の場合、これらのテーブルに INTERSECT 演
算に実行すると、その行が返されます。
UNION クエリの例
次の UNION クエリでは、SALES テーブルの行が、LISTING テーブルの行とマージされます。各テー
ブルからは 3 つの互換性のある列が選択されます。この場合、対応する列には同じ名前とデータ型が与
えられます。
select listid, sellerid, eventid from listing
union select listid, sellerid, eventid from sales
order by listid, sellerid, eventid desc limit 5;
listid | sellerid | eventid
--------+----------+--------1 |
36861 |
7872
2 |
16002 |
4806
3 |
21461 |
4256
4 |
8117 |
4337
5 |
1616 |
8647
(5 rows)
最終結果セットは、LISTING テーブルの最初の列によってソートされ、LISTID の値が高い 5 つの行に
制限されます。
次の例では、どのクエリ式が結果セットの各行を生成したかを確認できるように、UNION クエリの出
力にリテラル値を追加する方法を示します。このクエリは、最初のクエリ式からの行を(販売者を意味
する)「B」として識別し、2 番目のクエリ式からの行を(購入者を意味する)「S」として識別しま
す。
このクエリは 10,000 ドル以上のチケット取引の販売者と購入者を識別します。UNION 演算子の両側の
2 つのクエリ式の違いは、SALES テーブルの結合列だけです。
select listid, lastname, firstname, username,
pricepaid as price, 'S' as buyorsell
from sales, users
where sales.sellerid=users.userid
and pricepaid >=10000
union
select listid, lastname, firstname, username, pricepaid,
'B' as buyorsell
from sales, users
where sales.buyerid=users.userid
and pricepaid >=10000
order by 1, 2, 3, 4, 5;
listid | lastname | firstname | username |
price
| buyorsell
--------+----------+-----------+----------+-----------+----------209658 | Lamb
| Colette
| VOR15LYI | 10000.00 | B
209658 | West
| Kato
| ELU81XAA | 10000.00 | S
212395 | Greer
| Harlan
| GXO71KOC | 12624.00 | S
212395 | Perry
| Cora
| YWR73YNZ | 12624.00 | B
API Version 2012-12-01
278
Amazon Redshift データベース開発者ガイド
SELECT
215156 | Banks
215156 | Hayden
(6 rows)
| Patrick
| Malachi
| ZNQ69CLT |
| BBG56AKU |
10000.00 | S
10000.00 | B
次の例では、重複行が検出された場合、その重複行を結果に保持する必要があるため、UNION ALL 演
算子を使用します。一連の特定イベント ID では、クエリは各イベントに関連付けられているセールス
ごとに 0 行以上の行を返し、そのイベントのリスティングごとに 0 行または 1 行を返します。イベン
ト ID は、LISTING テーブルと EVENT テーブルの各行に対して一意ですが、SALES テーブルのイベン
ト ID とリスティング ID の同じ組み合わせに対して、複数のセールスが存在することがあります。
結果セットの 3 番目の列は、行のソースを特定します。その行が SALES テーブルからの行だった場
合、SALESROW 列に "Yes" というマークが付きます。(SALESROW は SALES.LISTID のエイリアス
です。)その行が LISTING テーブルからの行だった場合、SALESROW 列に "No" というマークが付き
ます。
この場合、リスティング 500、イベント 7787 の結果セットは、3 つの行から構成されます。つまり、
このリスティングとイベントの組み合わせに対して、3 つの異なる取引が実行されたということです。
他の 2 つのリスティング(501 と 502)では販売はありません。このため、これらのリスト ID に対し
てクエリが生成した唯一の行は LISTING テーブル(SALESROW = 'No')から生成されます。
select eventid, listid, 'Yes' as salesrow
from sales
where listid in(500,501,502)
union all
select eventid, listid, 'No'
from listing
where listid in(500,501,502)
order by listid asc;
eventid | listid | salesrow
---------+--------+---------7787 |
500 | No
7787 |
500 | Yes
7787 |
500 | Yes
7787 |
500 | Yes
6473 |
501 | No
5108 |
502 | No
(6 rows)
ALL キーワードを付けずに同じクエリを実行した場合、結果には、セールス取引の 1 つだけが保持さ
れます。
select eventid, listid, 'Yes' as salesrow
from sales
where listid in(500,501,502)
union
select eventid, listid, 'No'
from listing
where listid in(500,501,502)
order by listid asc;
eventid | listid | salesrow
---------+--------+---------7787 |
500 | No
7787 |
500 | Yes
6473 |
501 | No
API Version 2012-12-01
279
Amazon Redshift データベース開発者ガイド
SELECT
5108 |
(4 rows)
502 | No
UNION ALL クエリの例
次の例では、重複行が検出された場合、その重複行を結果に保持する必要があるため、UNION ALL 演
算子を使用します。一連の特定イベント ID では、クエリは各イベントに関連付けられているセールス
ごとに 0 行以上の行を返し、そのイベントのリスティングごとに 0 行または 1 行を返します。イベン
ト ID は、LISTING テーブルと EVENT テーブルの各行に対して一意ですが、SALES テーブルのイベン
ト ID とリスティング ID の同じ組み合わせに対して、複数のセールスが存在することがあります。
結果セットの 3 番目の列は、行のソースを特定します。その行が SALES テーブルからの行だった場
合、SALESROW 列に "Yes" というマークが付きます。(SALESROW は SALES.LISTID のエイリアス
です。)その行が LISTING テーブルからの行だった場合、SALESROW 列に "No" というマークが付き
ます。
この場合、リスティング 500、イベント 7787 の結果セットは、3 つの行から構成されます。つまり、
このリスティングとイベントの組み合わせに対して、3 つの異なる取引が実行されたということです。
他の 2 つのリスティング(501 と 502)では販売はありません。このため、これらのリスト ID に対し
てクエリが生成した唯一の行は LISTING テーブル(SALESROW = 'No')から生成されます。
select eventid, listid, 'Yes' as salesrow
from sales
where listid in(500,501,502)
union all
select eventid, listid, 'No'
from listing
where listid in(500,501,502)
order by listid asc;
eventid | listid | salesrow
---------+--------+---------7787 |
500 | No
7787 |
500 | Yes
7787 |
500 | Yes
7787 |
500 | Yes
6473 |
501 | No
5108 |
502 | No
(6 rows)
ALL キーワードを付けずに同じクエリを実行した場合、結果には、セールス取引の 1 つだけが保持さ
れます。
select eventid, listid, 'Yes' as salesrow
from sales
where listid in(500,501,502)
union
select eventid, listid, 'No'
from listing
where listid in(500,501,502)
order by listid asc;
eventid | listid | salesrow
---------+--------+---------7787 |
500 | No
7787 |
500 | Yes
API Version 2012-12-01
280
Amazon Redshift データベース開発者ガイド
SELECT
6473 |
5108 |
(4 rows)
501 | No
502 | No
INTERSECT クエリの例
次の例を最初の UNION の例と比較してみます。2 つの例の違いは使われたセット演算子だけですが、
結果は大きく異なります。1 行だけが同じです。
235494 |
23875 |
8771
これは、両方のテーブルで検出された 5 行という制限された結果内の唯一の行です。
select listid, sellerid, eventid from listing
intersect
select listid, sellerid, eventid from sales
order by listid desc, sellerid, eventid
limit 5;
listid | sellerid | eventid
--------+----------+--------235494 |
23875 |
8771
235482 |
1067 |
2667
235479 |
1589 |
7303
235476 |
15550 |
793
235475 |
22306 |
7848
(5 rows)
次のクエリでは、3 月にニューヨーク市とロサンジェルスの両方で発生した(チケットが販売された)
イベントを検索します。2 つのクエリ式の違いは、VENUECITY 列の制約です。
select distinct eventname from event, sales, venue
where event.eventid=sales.eventid and event.venueid=venue.venueid
and date_part(month,starttime)=3 and venuecity='Los Angeles'
intersect
select distinct eventname from event, sales, venue
where event.eventid=sales.eventid and event.venueid=venue.venueid
and date_part(month,starttime)=3 and venuecity='New York City'
order by eventname asc;
eventname
---------------------------A Streetcar Named Desire
Dirty Dancing
Electra
Hairspray
Mary Poppins
November
Oliver!
Return To Forever
Rhinoceros
South Pacific
The 39 Steps
The Bacchae
The Caucasian Chalk Circle
API Version 2012-12-01
281
Amazon Redshift データベース開発者ガイド
SELECT
The Country Girl
Wicked
Woyzeck
(16 rows)
EXCEPT クエリの例
TICKET データベースの CATEGORY テーブルには、次の 11 行が含まれています。
catid | catgroup | catname |
catdesc
-------+----------+-----------+-------------------------------------------1
| Sports
| MLB
| Major League Baseball
2
| Sports
| NHL
| National Hockey League
3
| Sports
| NFL
| National Football League
4
| Sports
| NBA
| National Basketball Association
5
| Sports
| MLS
| Major League Soccer
6
| Shows
| Musicals | Musical theatre
7
| Shows
| Plays
| All non-musical theatre
8
| Shows
| Opera
| All opera and light opera
9
| Concerts | Pop
| All rock and pop music concerts
10
| Concerts | Jazz
| All jazz singers and bands
11
| Concerts | Classical | All symphony, concerto, and choir concerts
(11 rows)
CATEGORY_STAGE テーブル(ステージングテーブル)には、1 つの追加行が含まれていると想定し
ます。
catid | catgroup | catname |
catdesc
-------+----------+-----------+-------------------------------------------1 | Sports
| MLB
| Major League Baseball
2 | Sports
| NHL
| National Hockey League
3 | Sports
| NFL
| National Football League
4 | Sports
| NBA
| National Basketball Association
5 | Sports
| MLS
| Major League Soccer
6 | Shows
| Musicals | Musical theatre
7 | Shows
| Plays
| All non-musical theatre
8 | Shows
| Opera
| All opera and light opera
9 | Concerts | Pop
| All rock and pop music concerts
10 | Concerts | Jazz
| All jazz singers and bands
11 | Concerts | Classical | All symphony, concerto, and choir concerts
12 | Concerts | Comedy
| All stand up comedy performances
(12 rows)
2 つのテーブル間の違いを返します。
select * from category_stage
except
select * from category;
catid | catgroup | catname |
catdesc
-------+----------+---------+---------------------------------12 | Concerts | Comedy | All stand up comedy performances
(1 row)
API Version 2012-12-01
282
Amazon Redshift データベース開発者ガイド
SELECT
つまり、CATEGORY テーブル内の行ではなく、CATEGORY_STAGE テーブル内の行が返されるとい
うことです。
次の同等のクエリでは、同義語の MINUS を使用します。
select * from category_stage
minus
select * from category;
catid | catgroup | catname |
catdesc
-------+----------+---------+---------------------------------12 | Concerts | Comedy | All stand up comedy performances
(1 row)
SELECT 式の順番を逆にすると、クエリは行を返しません。
ORDER BY 句
Topics
• 概要 (p. 283)
• パラメータ (p. 283)
• 使用に関する注意事項 (p. 284)
• ORDER BY の例 (p. 284)
ORDER BY 句は、クエリの結果セットをソートします。
概要
[
[
[
[
ORDER BY expression
ASC | DESC ]
LIMIT { count | ALL } ]
OFFSET start ]
パラメータ
expression
通常は、SELECT リスト内の 1 つまたは複数の列を指定することで、クエリ結果セットのソート
順を定義します。また、次の項目を指定できます。
• SELECT リストにない列
• クエリが参照するテーブル内に存在する、1 つまたは複数の列で構成される式
• SELECT リストエントリの位置(SELECT リストが存在しない場合は、テーブルの列の位置)
を表す序数
• SELECT リストエントリを定義するエイリアス
ORDER BY 句に複数の式が含まれる場合、結果セットは、最初の式に従ってソートされ、次の最
初の式の値と一致する値を持つ行に 2 番目の式が適用されます。以降同様の処理が行われます。
ASC | DESC
式のソート順を定義するオプション:
• ASC: 昇順(数値の場合は低から高、文字列の場合は「A」から「Z」など)オプションを指定し
ない場合、データはデフォルトでは昇順にソートされます。
• DESC: 降順(数値の場合は高から低、文字列の場合は「Z」から「A」)
API Version 2012-12-01
283
Amazon Redshift データベース開発者ガイド
SELECT
LIMIT 数 | ALL
クエリが返すソート済みの行数を制御するオプション。LIMIT 数は正の整数でなければなりませ
ん。最大値は 20 億(2000000000)です。
LIMIT 0 は行を返しません。この構文は、(行を表示せずに)クエリが実行されているかを確認し
たり、テーブルから列リストを返すためのテスト目的で使用できます。列リストを返すために LIMIT
0 を使用した場合、ORDER BY 句は重複です。LIMIT ALL はすべての行を返すため、動作はクエ
リ内に LIMIT 句を含めない場合と同じになります。
OFFSET start
開始行番号を指定することで、結果セット内の行数を制御するオプション。開始番号の前の行はス
キップされます。LIMIT オプションとの組み合わせで使用すると、OFFSET は LIMIT 数によって定
義された行数を返しますが、そのセット内でクエリが通常返す、最初の n 行はスキップされます。
使用に関する注意事項
ORDER BY 句を使用すると、次の動作が予想されます。
• ヌル値は他のすべての値よりも「高い」と見なされます。デフォルトの昇順のソートでは、NULL 値
は最後に表示されます。
• クエリに ORDER BY 句が含まれていない場合、結果行が返す行の順番は予想不能です。同じクエリ
を 2 回実行しても、結果セットが返される順番は異なることがあります。
• LIMIT オプションと OFFSET オプションは、ORDER BY 句なしに使用できます。ただし、整合性の
ある行セットを返すには、これらのオプションを ORDER BY と組み合わせて使用してください。
• Amazon Redshift などの並列システムで ORDER BY が一意の順番を生成しない場合、行の順番は非
決定性です。つまり、ORDER BY 式が複数の値を生成する場合、行が返される順番は、システムご
と、または Amazon Redshift の実行ごとに異なることがあるということです。
ORDER BY の例
CATEGORY テーブルの 11 の行をすべて、2 番目の列(CATGROUP)でソートして返します。
CATGROUP の値が同じ結果の場合、CATDESC 列の値は文字列の長さによってソートされます。他の
2 つの列(CATID と CATNAME)は、結果の順番に影響を与えません。
select * from category order by 2, length(catdesc), 1, 3;
catid | catgroup | catname |
catdesc
-------+----------+-----------+---------------------------------------10 | Concerts | Jazz
| All jazz singers and bands
9 | Concerts | Pop
| All rock and pop music concerts
11 | Concerts | Classical | All symphony, concerto, and choir conce
6 | Shows
| Musicals | Musical theatre
7 | Shows
| Plays
| All non-musical theatre
8 | Shows
| Opera
| All opera and light opera
5 | Sports
| MLS
| Major League Soccer
1 | Sports
| MLB
| Major League Baseball
2 | Sports
| NHL
| National Hockey League
3 | Sports
| NFL
| National Football League
4 | Sports
| NBA
| National Basketball Association
(11 rows)
SALES テーブルの選択した列を、QTYSOLD 値の高い順にソートして返します。結果を上位の 10 行
に制限します。
API Version 2012-12-01
284
Amazon Redshift データベース開発者ガイド
SELECT
select salesid, qtysold, pricepaid, commission, saletime from sales
order by qtysold, pricepaid, commission, salesid, saletime desc
limit 10;
salesid | qtysold | pricepaid | commission |
saletime
---------+---------+-----------+------------+--------------------15401 |
8 |
272.00 |
40.80 | 2008-03-18 06:54:56
61683 |
8 |
296.00 |
44.40 | 2008-11-26 04:00:23
90528 |
8 |
328.00 |
49.20 | 2008-06-11 02:38:09
74549 |
8 |
336.00 |
50.40 | 2008-01-19 12:01:21
130232 |
8 |
352.00 |
52.80 | 2008-05-02 05:52:31
55243 |
8 |
384.00 |
57.60 | 2008-07-12 02:19:53
16004 |
8 |
440.00 |
66.00 | 2008-11-04 07:22:31
489 |
8 |
496.00 |
74.40 | 2008-08-03 05:48:55
4197 |
8 |
512.00 |
76.80 | 2008-03-23 11:35:33
16929 |
8 |
568.00 |
85.20 | 2008-12-19 02:59:33
(10 rows)
LIMIT 0 構文を使用することで、列リストを返し、行を返しません。
select * from venue limit 0;
venueid | venuename | venuecity | venuestate | venueseats
---------+-----------+-----------+------------+-----------(0 rows)
結合例
次のクエリは外部結合です。左と右の外部結合は、もう一方のテーブルに一致するものが見つからない
場合に、結合したどちらかのテーブルの値を保持します。左のテーブルと右のテーブルは、構文に一覧
表示されている最初と 2 番目のテーブルです。NULL 値は、結果セットの「ギャップ」を埋めるために
使われます。
このクエリは、LISTING(左のテーブル)と SALES(右のテーブル)の LISTID 列の値と一致します。
結果は、リスティング 2、3、および 5 にセールスがないことを示しています。
select listing.listid, sum(pricepaid) as price, sum(commission) as comm
from listing left outer join sales on sales.listid = listing.listid
where listing.listid between 1 and 5
group by 1
order by 1;
listid | price | comm
--------+--------+-------1 | 728.00 | 109.20
2 |
|
3 |
|
4 | 76.00 | 11.40
5 | 525.00 | 78.75
(5 rows)
次のクエリは、FROM 句の 2 つのサブクエリを内部結合したものです。クエリは、イベント(コンサー
トとショー)のさまざまなカテゴリに対するチケットの販売数と売れ残り数を検索します。
API Version 2012-12-01
285
Amazon Redshift データベース開発者ガイド
SELECT
select catgroup1, sold, unsold
from
(select catgroup, sum(qtysold) as sold
from category c, event e, sales s
where c.catid = e.catid and e.eventid = s.eventid
group by catgroup) as a(catgroup1, sold)
join
(select catgroup, sum(numtickets)-sum(qtysold) as unsold
from category c, event e, sales s, listing l
where c.catid = e.catid and e.eventid = s.eventid
and s.listid = l.listid
group by catgroup) as b(catgroup2, unsold)
on a.catgroup1 = b.catgroup2
order by 1;
catgroup1 | sold | unsold
-----------+--------+-------Concerts | 195444 |1067199
Shows
| 149905 | 817736
(2 rows)
これらの FROM 句のサブクエリは、テーブルに関するサブクエリです。複数の列と行が返されること
があります。
サブクエリの例
次の例は、サブクエリが SELECT クエリに適合するさまざまな方法を示しています。サブクエリの使
用に関する別の例については、「結合例 (p. 285)」を参照してください。
SELECT リストのサブクエリ
次の例には、SELECT リストのサブクエリが含まれています。このサブクエリはスカラー値です。1 つ
の列と 1 つの値だけが返されます。外部クエリが返す行の結果ごとに、このサブクエリが繰り返されま
す。このクエリは、サブクエリが計算した Q1SALES 値を、外部クエリが定義する、2008 年の他の 2
つの四半期(第 2 と第 3)のセールス値と比較します。
select qtr, sum(pricepaid) as qtrsales,
(select sum(pricepaid)
from sales join date on sales.dateid=date.dateid
where qtr='1' and year=2008) as q1sales
from sales join date on sales.dateid=date.dateid
where qtr in('2','3') and year=2008
group by qtr
order by qtr;
qtr | qtrsales
|
q1sales
-------+-------------+------------2
| 30560050.00 | 24742065.00
3
| 31170237.00 | 24742065.00
(2 rows)
API Version 2012-12-01
286
Amazon Redshift データベース開発者ガイド
SELECT
WHERE 句のサブクエリ
次の例には、WHERE 句にテーブルサブクエリが含まれます。このサブクエリは複数の行を生成しま
す。この場合、その行には列が 1 つだけ含まれていますが、テーブルサブクエリには他のテーブルと同
様、複数の列と行が含まれていることがあります。
このクエリは、最大販売チケット数の観点でトップ 10 の販売会社を検索します。トップ 10 のリスト
は、チケットカウンターが存在する都市に住んでいるユーザーを削除するサブクエリによって制限され
ます。このクエリは、メインクエリ内の結合としてサブクエリを作成するなど、さまざまな方法で作成
できます。
select firstname, lastname, city, max(qtysold) as maxsold
from users join sales on users.userid=sales.sellerid
where users.city not in(select venuecity from venue)
group by firstname, lastname, city
order by maxsold desc, city desc
limit 10;
firstname | lastname |
city
| maxsold
-----------+-----------+----------------+--------Noah
| Guerrero | Worcester
|
8
Isadora
| Moss
| Winooski
|
8
Kieran
| Harrison | Westminster
|
8
Heidi
| Davis
| Warwick
|
8
Sara
| Anthony | Waco
|
8
Bree
| Buck
| Valdez
|
8
Evangeline | Sampson | Trenton
|
8
Kendall
| Keith
| Stillwater
|
8
Bertha
| Bishop
| Stevens Point |
8
Patricia
| Anderson | South Portland |
8
(10 rows)
WITH 句のサブクエリ
「WITH 句 (p. 260)」を参照してください。
相関性のあるサブクエリ
次の例の WHERE 句には、相関性のあるサブクエリが含まれています。このタイプのサブクエリには、
サブクエリの列と他のクエリが生成した列の間に相関性があります。この場合、相関性は、where
s.listid=l.listid となります。外部クエリが生成する各行に対してサブクエリが実行され、行が
適正か適正でないかが判断されます。
select salesid, listid, sum(pricepaid) from sales s
where qtysold=
(select max(numtickets) from listing l
where s.listid=l.listid)
group by 1,2
order by 1,2
limit 5;
salesid | listid |
sum
---------+--------+---------27 |
28 | 111.00
81 |
103 | 181.00
142 |
149 | 240.00
API Version 2012-12-01
287
Amazon Redshift データベース開発者ガイド
SELECT
146 |
152 | 231.00
194 |
210 | 144.00
(5 rows)
サポートされていない相関サブクエリのパターン
クエリのプランナーは、MPP 環境で実行する相関サブクエリの複数のパターンを最適化するため、「サ
ブクエリ相関解除」と呼ばれるクエリ再生成メソッドを使用します。相関サブクエリの中には、Amazon
Redshift が相関を解除できずサポートすることができないパターンを採用しているものがわずかにあり
ます。次の相関参照を含んでいるクエリがエラーが返します。
• クエリブロックをスキップする相関参照(「スキップレベル相関参照」とも呼ばれています)例え
ば、次のクエリでは、相関参照とスキップされるブロックを含むブロックは、NOT EXISTS 述語に
よって接続されます。
select event.eventname from event
where not exists
(select * from listing
where not exists
(select * from sales where event.eventid=sales.eventid));
このケースでスキップされたブロックは、LISTING テーブルに対するサブクエリです。相関参照は、
EVENT テーブルと SALES テーブルを関係付けます。
• 外部結合で ON 句の一部であるサブクエリからの相関参照:
select * from category
left join event
on category.catid=event.catid and eventid =
(select max(eventid) from sales where sales.eventid=event.eventid);
ON 句には、サブクエリの SALES から外部クエリの EVENT への相関参照が含まれています。
• Amazon Redshift システムテーブルに対する NULL センシティブな相関参照。以下に例を示します。
select attrelid
from stv_locks sl, pg_attribute
where sl.table_id=pg_attribute.attrelid and 1 not in
(select 1 from pg_opclass where sl.lock_owner = opcowner);
• ウィンドウ関数を含んでいるサブクエリ内からの相関参照。
select listid, qtysold
from sales s
where qtysold not in
(select sum(numtickets) over() from listing l where s.listid=l.listid);
• 相関サブクエリの結果に対する、GROUP BY 列の参照。以下に例を示します。
select listing.listid,
(select count (sales.listid) from sales where sales.listid=listing.listid) as
list
from listing
group by list, listing.listid;
API Version 2012-12-01
288
Amazon Redshift データベース開発者ガイド
SELECT INTO
• 集計関数と GROUP BY 句のあり、IN 述語によって外部クエリに接続されているサブクエリからの相
関参照。(この制限は、MIN と MAX 集計関数には適用されません。)以下に例を示します。
select * from listing where listid in
(select sum(qtysold)
from sales
where numtickets>4
group by salesid);
SELECT INTO
任意のクエリが定義する行を選択して、新しい一時テーブルまたは永続的テーブルに挿入します。
概要
[ WITH with_subquery [, ...] ]
SELECT
[ TOP number ] [ ALL | DISTINCT ]
* | expression [ AS output_name ] [, ...]
INTO [ TEMPORARY | TEMP ] [ TABLE ] new_table
[ FROM table_reference [, ...] ]
[ WHERE condition ]
[ GROUP BY expression [, ...] ]
[ HAVING condition [, ...] ]
[ { UNION | INTERSECT | { EXCEPT | MINUS } } [ ALL ] query ]
[ ORDER BY expression
[ ASC | DESC ]
[ LIMIT { number | ALL } ]
[ OFFSET start ]
このコマンドのパラメータに関する詳細については、「SELECT (p. 259)」を参照してください。
例
EVENT テーブルからのすべての行を選択し、NEWEVENT テーブルを作成します。
select * into newevent from event;
集計クエリの結果を選択して、PROFITS という名前の一時テーブルに格納します。
select username, lastname, sum(pricepaid-commission) as profit
into temp table profits
from sales, users
where sales.sellerid=users.userid
group by 1, 2
order by 3 desc;
SET
サーバー設定パラメータの値を設定します。
API Version 2012-12-01
289
Amazon Redshift データベース開発者ガイド
Set
RESET (p. 255) コマンドを使って、パラメータをデフォルト値に戻します。パラメータの詳細について
は、「サーバー設定の変更 (p. 569)」を参照してください。
概要
SET { [ SESSION | LOCAL ]
parameter_name { TO | = }
{ value | 'value' | DEFAULT } |
SEED TO value }
パラメータ
SESSION
現在のセッションに対して、設定が有効であることを指定します。デフォルト値
LOCAL
設定が現在の取引で有効なことを指定します。
SEED TO 値
乱数生成用に RANDOM 関数が使用する内部シードを設定します。
31
SET SEED は 0~1 の数値を取り、RANDOM 関数 (p. 402) 関数で使用するため、この値に(2 -1)
を乗算します。複数の RANDOM コールの前に SET SEED を使用すると、RANDOM は予想可能
な順番で番号を生成します。
parameter_name
設定するパラメータの名前。パラメータの詳細については、「サーバー設定の変更 (p. 569)」を参
照してください。
value
新しいパラメータ値。一重引用符を使って、指定文字列に値を設定します。SET SEED を使用し
た場合、このパラメータには SEED 値が含まれます。
DEFAULT
パラメータをデフォルト値に設定します。
LOCAL
タイムゾーンを(Amazon Redshift サーバーが配置されている)現地のタイムゾーンに設定しま
す。
例
現在のセッションのパラメータの変更
次の例は、データスタイルを設定します。
set datestyle to 'SQL,DMY';
ワークロード管理用のクエリグループの設定
クラスターの WLM 設定の一部として、クエリグループをキュー定義で一覧表示した場合、一覧表示さ
れたクエリクループ名に QUERY_GROUP パラメータを設定できます。以降のクエリは、関連するク
エリキューに割り当てられます。QUERY_GROUP グループの設定は、セッションの有効期間中、また
は RESET QUERY_GROUP コマンドの遭遇するまで有効です。
この例では、クエリグループ「priority」の一部として 2 つのクエリを実行し、その後クエリグループを
リセットします。
API Version 2012-12-01
290
Amazon Redshift データベース開発者ガイド
Set
set query_group to 'priority';
select tbl, count(*)from stv_blocklist;
select query, elapsed, substring from svl_qlog order by query desc limit 5;
reset query_group;
「ワークロード管理の実装 (p. 111)」を参照してください。
「クエリグループのラベルの設定」を参照してください。
QUERY_GROUP パラメータは、SET コマンド実行後に同じセッションで実行される 1 つまたは複数
のクエリに対して、ラベルを定義します。また、クエリが実行され、STL_QUERY や STV_INFLIGHT
システムテーブル、および SVL_QLOG ビューから返される結果を制約する場合に、このラベルが記録
されます。
show query_group;
query_group
------------unset
(1 row)
set query_group to '6 p.m.';
show query_group;
query_group
------------6 p.m.
(1 row)
select * from sales where salesid=500;
salesid | listid | sellerid | buyerid | eventid | dateid | ...
---------+--------+----------+---------+---------+--------+----500 |
504 |
3858 |
2123 |
5871 |
2052 | ...
(1 row)
reset query_group;
select query, trim(label) querygroup, pid, trim(querytxt) sql
from stl_query
where label ='6 p.m.';
query | querygroup | pid |
sql
-------+------------+-------+---------------------------------------57 | 6 p.m.
| 30711 | select * from sales where salesid=500;
(1 row)
クエリグループのラベルは、スクリプトの一部として実行された個々のクエリやクエリグループを分離
するための有益なメカニズムです。クエリの ID によってクエリの識別や追跡を行う必要はありません。
ラベルによってクエリの追跡が可能です。
乱数生成用のシード値の設定
次の例では、SET コマンドで SEED オプションを使用し、RANDOM 関数により、予想可能な順番で
数値を生成します。
まず、SEED 値を最初に設定せずに、3 つの整数の乱数を返します。
API Version 2012-12-01
291
Amazon Redshift データベース開発者ガイド
Set
select cast (random() * 100 as int);
int4
-----6
(1 row)
select cast (random() * 100 as int);
int4
-----68
(1 row)
select cast (random() * 100 as int);
int4
-----56
(1 row)
次に、SEED 値を .25 に設定して、さらに 3 つの整数の乱数を返します。
set seed to .25;
select cast (random() * 100 as int);
int4
-----21
(1 row)
select cast (random() * 100 as int);
int4
-----79
(1 row)
select cast (random() * 100 as int);
int4
-----12
(1 row)
最後に、SEED 値を .25 にリセットして、RANDOM が前の 3 つの呼び出しと同じ結果を返すことを確
認します。
set seed to .25;
select cast (random() * 100 as int);
int4
-----21
(1 row)
select cast (random() * 100 as int);
int4
-----79
(1 row)
API Version 2012-12-01
292
Amazon Redshift データベース開発者ガイド
SET SESSION AUTHORIZATION
select cast (random() * 100 as int);
int4
-----12
(1 row)
SET SESSION AUTHORIZATION
現在のセッションのユーザー名を設定します。
SET SESSION AUTHORIZATION コマンドは、権限のないユーザーとしてセッションやトランザクショ
ンを一時的に実行することで、データベースアクセスをテストする場合などに使用できます。
概要
SET [ SESSION | LOCAL ] SESSION AUTHORIZATION { user_name | DEFAULT }
パラメータ
SESSION
現在のセッションに対して、設定が有効であることを指定します。デフォルト値
LOCAL
設定が現在の取引で有効なことを指定します。
user_name
設定するユーザー名。ユーザー名は、識別子またはリテラル文字列として指定できます。
DEFAULT
セッションユーザー名をデフォルト値に設定します。
例
次の例では、現在のセッションのユーザー名を dwuser に設定します。
SET SESSION AUTHORIZATION 'dwuser';
次の例では、現在のトランザクションのユーザー名を dwuser に設定します。
SET LOCAL SESSION AUTHORIZATION 'dwuser';
この例では、現在のセッションのユーザー名をデフォルトのユーザー名に設定します。
SET SESSION AUTHORIZATION DEFAULT;
SET SESSION CHARACTERISTICS
セッション内のすべてのトランザクションのトランザクション特性を設定します。
API Version 2012-12-01
293
Amazon Redshift データベース開発者ガイド
SHOW
SHOW
サーバー 設定パラメータの現在の値を表示します。SET コマンドが有効な場合、この値は、現在のセッ
ションに固有となることがあります。
概要
SHOW { parameter_name | ALL }
パラメータ
parameter_name
指定したパラメータの現在の値を表示します。
ALL
すべてのパラメータの現在の値を表示します。
例
次の例では、query_group パラメータの値を表示します。
show query_group;
query_group
unset
(1 row)
次の例では、すべてのパラメータのリストとその値を表示します。
show all;
name
|
setting
--------------------+-------------datestyle
| ISO, MDY
extra_float_digits | 0
query_group
| unset
search_path
| $user,public
statement_timeout | 0
START TRANSACTION
BEGIN 関数の同義語です。
「BEGIN (p. 182)」を参照してください。
TRUNCATE
テーブルをスキャンせずに、テーブルからすべての行を削除します。この操作は無条件の DELETE 操
作に対する代替案ですが、より高速です。
API Version 2012-12-01
294
Amazon Redshift データベース開発者ガイド
UNLOAD
概要
TRUNCATE [ TABLE ] table_name
パラメータ
TABLE
オプションキーワード
table_name
一時テーブルまたは永続的テーブルテーブルの所有者またはスーパーバイザだけがテーブルを切り
取ることができます。
外部キー拘束で参照されるテーブルなど、任意のテーブルを切り取ることができます。
テーブルを切り取った後、テーブルに対して ANALYZE コマンドを実行してください。テーブルを
切り取った後、テーブルに対して VACUUM を実行する必要はありません。
使用に関する注意事項
TRUNCATE コマンドは、コマンドが実行されたトランザクションを確定します。したがって、
TRUNCATE 操作をロールバックすることはできません。また、
例
truncate category;
TRUNCATE コマンドを使って、CATEGORY テーブルからすべての行を削除します。
TRUNCATE 操作のロールバック試行:
begin;
truncate date;
rollback;
select count(*) from date;
count
------0
(1 row)
TRUNCATE コマンドにより自動的に確定したため、ROLLBACK コマンドを実行しても DATE テーブ
ルは空のままです。
UNLOAD
クエリの結果を、Amazon S3 のファイルセットにアンロードします。
API Version 2012-12-01
295
Amazon Redshift データベース開発者ガイド
UNLOAD
概要
UNLOAD ('select_statement')
TO 's3_path'
[ WITH ] CREDENTIALS [AS] 'aws_access_credentials'
[ option [ ... ] ]
where option is
{
|
|
|
|
|
|
|
DELIMITER [ AS ] 'delimiter_char'
FIXEDWIDTH [ AS ] 'fixedwidth_spec' }
ENCRYPTED
GZIP
ADDQUOTES
NULL [ AS ] 'null_string'
ESCAPE
ALLOWOVERWRITE
パラメータ
('select_statement')
SELECT クエリを定義します。クエリ結果をアンロードします。ほとんどの場合、クエリ内で
ORDER BY 句を指定することで、ソートされた順番でデータをアンロードすることは有益です。
この方法は、データの再ロード時にデータをソートするために必要な時間を節約します。
クエリは一重引用符で囲む必要があります。以下に例を示します。
('select * from venue order by venueid')
Note
(リテラル値を囲むなど)クエリに引用符が含まれている場合、クエリテキスト内でエス
ケープ処理する必要があります。以下に例を示します。
('select * from venue where venuestate=\'NV\'')
TO 's3_path'
Amazon Redshift が出力ファイルを書き込む Amazon S3 のパスプレフィックスUNLOAD は、スラ
イスごとに 1 つまたは複数のファイルを書き込みます。ファイル名は次の形式で書き込まれます。
path_prefix<slice-number>_part_<file-number>
Important
Amazon Redshift が出力ファイルを書き込む Amazon S3 バケットを、クラスターと同じ
領域に作成する必要があります。
WiTH
このキーワードはオプションです。
CREDENTIALS [AS] 'aws_access_credentials'
Amazon S3 バケット用の AWS アカウントアクセス認証情報。アクセス認証情報は、データファ
イルのアンロード対象となる Amazon S3 バケットに対する読み取りおよび書き込み権限を持つ、
AWS アカウントユーザーまたは IAM ユーザーに属している必要があります。
API Version 2012-12-01
296
Amazon Redshift データベース開発者ガイド
UNLOAD
オプションでテンポラリの認証情報を使って、Amazon S3 バケットにアクセスすることができま
す。テンポラリの認証情報を使用する場合、認証情報文字列に、テンポラリセッショントークンを
含めてください。詳細については、COPY コマンドの「使用に関する注意事項」の「一時的セキュ
リティ認証情報 (p. 197)」を参照してください。
aws_access_credentials 文字列にはスペースを入れないでください。
'aws_access_key_id=<access-key-id>;aws_secret_access_key=<secret-accesskey>'
アクセスキーと秘密アクセスキーだけが提供されている場合、aws_access_credentials 文字列が
フォーマット内に含まれます。
一時トークン認証情報を使用するには、一時アクセスキー ID、一時秘密アクセスキー、および一
時トークンを提供する必要があります。aws_access_credentials 文字列がフォーマット内に含まれ
ます。
'aws_access_key_id=<temporary-access-key-id>;aws_secret_access_key=<temporarysecret-access-key>;token=<temporary-token>'
ENCRYPTED オプションを使用した場合、aws_access_credentials がフォーマット内に含まれま
す。
'aws_access_key_id=<access-key-id>;aws_secret_access_key=<secret-accesskey>;master_symmetric_key=<master_key>'
ここで、<master_key> は、UNLOAD がファイルの暗号化に使用するマスターキーの値です。マ
スターキーは、base64 で符号化された 256 ビットの AES 対称キーです。
FIXEDWIDTH 'fixedwidth_spec'
区切り文字によって区切られているのではなく、各列の幅が固定長のファイルにデータをアンロー
ドします。fixedwidth_spec は、列の数と列の幅を指定する文字列です。AS キーワードはオプショ
ンです。FIXEDWIDTH と DELIMITER を併用することはできません。FIXEDWIDTH はデータを切
り捨てないため、UNLOAD ステートメントの各列の指定は、少なくともその列の最長エントリの
長さと同じになります。fixedwidth_spec のフォーマットを次に示します。
'colID1:colWidth1,colID2:colWidth2, ...'
ENCRYPTED
Amazon S3 に関する出力ファイルは、Amazon S3 クライアント側の暗号機能を使って暗号化され
ることを指定します。「暗号化されたデータファイルをアンロードする (p. 94)」を参照してくだ
さい。暗号化された gzip 圧縮ファイルをアンロードするには、GZIP オプションを追加します。
DELIMITER AS 'delimiter_character'
パイプ文字(|)、カンマ(,)、タブ(\t)など、出力ファイル内のフィールドを分離する単一の
ASCII 文字。デフォルトの区切り文字はパイプ文字です。AS キーワードはオプションです。
DELIMITER と FIXEDWIDTH は併用できません。データに区切り文字が含まれている場合、ESCAPE
オプションを指定して、区切り文字をエスケープするか、ADDQUOTES を使って、データを二重
引用符で囲む必要があります。代替案として、データ内に含まれていない区切り文字を指定しま
す。
GZIP
スライスごとに、1 つまたは複数の gzip 圧縮ファイルにデータをアンロードします。生成される
各ファイルには、.gz 拡張子が付加されます。
API Version 2012-12-01
297
Amazon Redshift データベース開発者ガイド
UNLOAD
ADDQUOTES
アンロードされた各データフィールドは引用符で囲まれるため、Amazon Redshift は区切り文字自
体を含んでいるデータ値をアンロードすることができます。例えば、区切り文字がカンマの場合、
次のデータのアンロードと再ロードを正常に実行することができます。
"1","Hello, World"
追加した引用符がなければ、文字列 Hello, World は 2 つの異なるフィールドとして解析されま
す。
ADDQUOTES を使用した際にデータを再ロードするには、COPY で REMOVEQUOTES を指定す
る必要があります。
NULL AS 'null_string'
アンロードファイル内で NULL 値を表す文字列を指定します。デフォルトの文字列は \N(バック
スラッシュ-N)です。このオプションを使用すると、選択したデータ内で検出された NULL 値の代
わりに、指定した文字列がすべての出力ファイルに挿入されます。このオプションを指定しない場
合、NULL 値は次のようにアンロードされます。
• 区切り文字で区切られた出力に対するゼロ長文字列
• 固定幅出力に対するホワイトスペース文字列
固定幅のアンロードに対して NULL 文字列が指定され、出力列の幅が NULL 文字列の幅より小さ
い場合、次の動作が発生します。
• 空のフィールドは非文字列用の出力です。
• 文字列に対してはエラーがレポートされます。
ESCAPE
区切られたアンロードファイル内の CHAR と VARCHAR 列の場合、エスケープ文字(\)が次の
文字の前に必ず配置されます。
• ラインフィード: \n
• キャリッジリターン: \r
• アンロードデータ用に指定された区切り文字。
• エスケープ文字: \
• 引用符: " または '(ESCAPE と ADDQUOTES の両方を UNLOAD コマンドで指定した場合)。
Important
ESCAPE オプションを指定して COPY を使ってデータをロードした場合、UNLOAD コマ
ンドでも ESCAPE オプションを指定して可逆出力ファイルを生成する必要があります。
同様に、ESCAPE オプションを使って UNLOAD を実行すると、同じデータを COPY する
場合に ESCAPE を使用する必要があります。
ALLOWOVERWRITE
デフォルトでは、UNLOAD によってファイルの上書きが発生する可能性がある場合、その UNLOAD
操作は失敗します。ALLOWOVERWRITE を指定した場合、UNLOAD を使用すると、既存ファイ
ルが上書きされます。
使用に関する注意事項
区切り文字が使われているすべての UNLOAD 操作に対する ESCAPE の使用
区切り文字を使って UNLOAD を実行した際に、区切り文字、または ESCAPE オプションの説明に一
覧表示されているいずれかの文字がデータに使われているか、UNLOAD ステートメントで ESCAPE オ
API Version 2012-12-01
298
Amazon Redshift データベース開発者ガイド
UNLOAD
プションを使用する必要があります。UNLOAD コマンドで ESCAPE オプションを使用しない場合、ア
ンロードされたデータを使用する以降の COPY 操作は失敗する可能性があります。
Important
区切り文字またはエスケープする必要がある可能性があるその他の文字がデータ内に含まれて
いないことが確実である場合を除き、必ず UNLOAD ステートメントと COPY ステートメント
の両方で ESCAPE オプションを使用することを強くお勧めします。
浮動小数点精度の損失
アンロードと再ロードを連続して実行した浮動小数点データは精度を失っていることがあります。
Limit 句
SELECT クエリは、外部の SELECT で LIMIT 句を使用することはできません。例えば、次の UNLOAD
ステートメントは失敗します。
unload ('select * from venue limit 10')
to 's3://mybucket/venue_pipe_'
credentials 'aws_access_key_id=<access-key-id>;aws_secret_access_key=<secretaccess-key>';
その代わり、ネスティングされた LIMIT 句を使用してください。以下に例を示します。
unload ('select * from venue where venueid in
(select venueid from venue order by venueid desc limit 10)')
to 's3://mybucket/venue_pipe_'
credentials 'aws_access_key_id=<access-key-id>;aws_secret_access_key=<secretaccess-key>';
代替案として、SELECT…INTO を使ってテーブルを入力するか、LIMIT 句を使って CREATE TABLE
AS を実行し、そのテーブルからアンロードすることができます。
UNLOAD の例
パイプ区切りファイルへの VENUE のアンロード(デフォルト区切り文字)
Note
次の例では読みやすくするため、改行しています。aws_access_credentials 文字列には改行や
スペースを含めないでください。
この例では、VENUE テーブルをアンロードして、データを s3://mybucket/ に書き出します。
unload ('select * from venue')
to 's3://mybucket/'
credentials 'aws_access_key_id=<access-key-id>;aws_secret_access_key=<secretaccess-key>';
ノードごとに 2 つのスライスを装備した 2 ノードクラスターを想定すると、前の例では mybucket に
以下のファイルが作成されます。
API Version 2012-12-01
299
Amazon Redshift データベース開発者ガイド
UNLOAD
0000_part_00
0001_part_00
0002_part_00
0003_part_00
出力ファイルの違いをわかりやすくするため、ロケーションにプレフィックスを含めることができま
す。この例では、VENUE テーブルをアンロードして、データを s3://mybucket/venue_pipe_* に
書き出します。
unload ('select * from venue')
to 's3://mybucket/venue_pipe_'
credentials 'aws_access_key_id=<access-key-id>;aws_secret_access_key=<secretaccess-key>';
venue_pipe_0000_part_00
venue_pipe_0001_part_00
venue_pipe_0002_part_00
venue_pipe_0003_part_00
その結果が次の 4 ファイルです。ここでも 4 つのスライスを想定しています。
アンロードファイルからの VENUE のロード
一連のアンロードファイルからテーブルをロードするには、COPY コマンドを使ってプロセスを逆にす
るだけです。次の例では、新しいテーブル LOADVENUE を作成し、前の例で作成したデータファイル
からテーブルをロードします。
create table loadvenue (like venue);
copy loadvenue from 's3://mybucket/venue_pipe_'
credentials 'aws_access_key_id=<access-key-id>;aws_secret_access_key=<secretaccess-key>';
暗号化ファイルへの VENUE のアンロード
次の例では、VENUE テーブルを一連の暗号化ファイルにアンロードします。詳細については、「暗号
化されたデータファイルをアンロードする (p. 94)」を参照してください。
unload ('select * from venue')
to 's3://mybucket/venue_encrypt'
credentials 'aws_access_key_id=<your-access-key-id>;aws_secret_access_key=<yoursecret-access-key>;master_symmetric_key=EXAMPLEMASTERKEYtkbjk/OpCwtYSx/M4/t7DM
CDIK722'
encrypted;
暗号化ファイルからの VENUE のロード
ENCRYPT オプションを指定した UNLOAD を使って作成した一連のファイルからテーブルをロードす
るには、ENCRYPTED オプションを指定した COPY コマンドを使ってプロセスを逆にし、UNLOAD
コマンドで使用したものと同じマスター対称キーを指定します。次の例では、前の例で作成した暗号化
されたデータファイルから LOADVENUE テーブルをロードします。
API Version 2012-12-01
300
Amazon Redshift データベース開発者ガイド
UNLOAD
create table loadvenue (like venue);
copy loadvenue from 's3://mybucket/venue_pipe_'
credentials 'aws_access_key_id=<your-access-key-id>;aws_secret_access_key=<yoursecret-access-key>;master_symmetric_key=EXAMPLEMASTERKEYtkbjk/OpCwtYSx/M4/t7DM
CDIK722'
encrypted;
タブ区切りファイルへの VENUE データのアンロード
unload ('select venueid, venuename, venueseats from venue')
to 's3://mybucket/venue_tab_'
credentials 'aws_access_key_id=<access-key-id>;aws_secret_access_key=<secretaccess-key>'
delimiter as '\t';
出力データファイルは次のようになります。
1 Toyota Park Bridgeview IL 0
2 Columbus Crew Stadium Columbus OH 0
3 RFK Stadium Washington DC 0
4 CommunityAmerica Ballpark Kansas City KS 0
5 Gillette Stadium Foxborough MA 68756
...
一時的認証情報を使った VENUE のアンロード
一時的セキュリティ認証情報を使い、データにアクセスするユーザーを制限できます。一時的セキュリ
ティ認証情報はセキュリティを強化します。使用期限が短く、期限が切れた後は再利用できないためで
す。このような一時的セキュリティ認証情報を与えられたユーザーは、その認証情報の有効期限の間だ
けリソースにアクセスできます。詳細については、COPY コマンドの「使用に関する注意事項」の「一
時的セキュリティ認証情報 (p. 197)」を参照してください。
次の例では、一時認証情報を使って、LISTING テーブルをアンロードします。
unload ('select venueid, venuename, venueseats from venue')
to 's3://mybucket/venue_tab'
credentials 'aws_access_key_id=<temporary-access-key-id>;aws_secret_ac
cess_key=<temporary-secret-access-key>;token=<temporary-token>'
delimiter as '\t';
Important
一時的セキュリティ認証情報は、COPY ステートメントの期間全体で有効にする必要がありま
す。一時的セキュリティ認証情報の期限がロードプロセス中に切れた場合、COPY は失敗し、
処理はロールバックされます。例えば、一時的セキュリティ認証情報の期限が 15 分後に切れ
るときに COPY に 1 時間かかる場合、COPY は完了前に失敗します。
固定幅のデータファイルへの VENUE のアンロード
unload ('select * from venue')
to 's3://mybucket/venue_fw_'
credentials 'aws_access_key_id=<access-key-id>;aws_secret_access_key=<secret-
API Version 2012-12-01
301
Amazon Redshift データベース開発者ガイド
UNLOAD
access-key>'
fixedwidth as 'venueid:3,venuename:39,venuecity:16,venuestate:2,venueseats:6';
出力データファイルは次のようになります。
1 Toyota Park
Bridgeview
2 Columbus Crew Stadium
Columbus
3 RFK Stadium
Washington
4 CommunityAmerica BallparkKansas City
5 Gillette Stadium
Foxborough
...
IL0
OH0
DC0
KS0
MA68756
VENUE を一連のタブ区切り GZIP 圧縮ファイルにアンロードします。
unload ('select * from venue')
to 's3://mybucket/venue_tab_'
credentials 'aws_access_key_id=<access-key-id>;aws_secret_access_key=<secretaccess-key>'
delimiter as '\t'
gzip;
区切り文字を含むデータのアンロード
この例では、ADDQUOTES オプションを使って、実際の一部のデータフィールドにカンマが含まれて
いるカンマ区切りデータをアンロードします。
最初に引用符を含むテーブルを作成します。
create table location (id int, location char(64));
insert into location values (1,'Phoenix, AZ'),(2,'San Diego, CA'),(3,'Chicago,
IL');
次に ADDQUOTES オプションを使って、データをアンロードします。
unload ('select id, location from location')
to 's3://mybucket/location_'
credentials 'aws_access_key_id=<access-key-id>;aws_secret_access_key=<secretaccess-key>'
delimiter ',' addquotes;
アンロードされたデータファイルは次のようになります。
1,"Phoenix, AZ"
2,"San Diego, CA"
3,"Chicago, IL"
...
結合クエリの結果のアンロード
次の例では、ウィンドウ関数を含む結合クエリの結果をアンロードします。
API Version 2012-12-01
302
Amazon Redshift データベース開発者ガイド
UNLOAD
unload ('select venuecity, venuestate, caldate, pricepaid,
sum(pricepaid) over(partition by venuecity, venuestate
order by caldate rows between 3 preceding and 3 following) as winsum
from sales join date on sales.dateid=date.dateid
join event on event.eventid=sales.eventid
join venue on event.venueid=venue.venueid
order by 1,2')
to 's3://mybucket/tickit/winsum'
credentials 'aws_access_key_id=<access-key-id>;aws_secret_access_key=<secretaccess-key>';
出力ファイルは次のようになります。
Atlanta|GA|2008-01-04|363.00|1362.00
Atlanta|GA|2008-01-05|233.00|2030.00
Atlanta|GA|2008-01-06|310.00|3135.00
Atlanta|GA|2008-01-08|166.00|8338.00
Atlanta|GA|2008-01-11|268.00|7630.00
...
NULL AS の例
次の例の NULL AS オプションは、VENUESEATS 列の実際の NULL 値を null 文字列と置き換えま
す。
unload ('select * from venue')
's3://mybucket/allvenues/'
credentials 'aws_access_key_id=<access-key-id>;aws_secret_access_key=<secretaccess-key>'
null as 'null';
例えば、出力行は次のようになります。
2|Columbus Crew Stadium|Columbus|OH|0
22|Quicken Loans Arena|Cleveland|OH|0
75|Lucas Oil Stadium|Indianapolis|IN|63000
82|Lincoln Financial Field|Philadelphia|PA|68532
262|Mandalay Bay Hotel|Las Vegas|NV|null
255|Venetian Hotel|Las Vegas|NV|null
...
ALLOWOVERWRITE の例
デフォルトでは、UNLOAD は送り先バケットの既存のファイルを上書きしません。例えば、送り先バ
ケット内のファイルを変更せずに、同じ UNLOAD ステートメントを 2 回実行すると、2 回目の UNLOAD
は失敗します。既存のファイルを上書きするには、ALLOWOVERWRITE オプションを指定します。
unload ('select * from venue')
to 's3://mybucket/venue_pipe_'
credentials 'aws_access_key_id=<access-key-id>;aws_secret_access_key=<secretaccess-key>'
allowoverwrite;
API Version 2012-12-01
303
Amazon Redshift データベース開発者ガイド
UPDATE
UPDATE
Topics
• 概要 (p. 304)
• パラメータ (p. 304)
• 使用に関する注意事項 (p. 304)
• UPDATE ステートメントの例 (p. 305)
条件が満たされた場合、1 つまたは複数のテーブル列の値を更新します。
Note
単一 SQL ステートメントの最大サイズは 16 MB です。
概要
UPDATE table_name SET column = { expression | DEFAULT } [,...]
[ FROM fromlist ]
[ WHERE condition ]
パラメータ
table_name
一時テーブルまたは永続的テーブルテーブルの所有者またはテーブルに関する UPDATE 権限を持っ
ているユーザーだけが行を更新できます。FROM 句を使用したり、式または条件でテーブルを選
択する場合、そのテーブルに関する SELECT 権限を所有している必要があります。ここではテー
ブルにエイリアスを指定することはできません。ただし、FROM 句内でエイリアスを指定するこ
とはできます。
SET column =
修正する 1 つまたは複数の列。一覧表示されていない列は現在の値を保持します。
expression
指定された列の新しい値を定義する式。
DEFAULT
CREATE TABLE ステートメントで列に割り当てられたデフォルト値を使って、列を更新します。
FROM tablelist
他のテーブルの情報を参照することで、テーブルを更新できます。FROM 句の他のテーブルを一
覧表示するか、WHERE 条件の一部としてサブクエリを使用します。FROM 句で一覧表示されて
いるテーブルには、エイリアスを設定することができます。リスト内に UPDATE ステートメント
のターゲットテーブルを含める必要がある場合は、エイリアスを使用します。
WHERE 条件
条件と一致する行への更新を制限するオプション句。条件が true を返した場合、指定された SET
列が更新されます。条件は列に関するシンプルな述語の場合もあれば、サブクエリの結果に基づく
条件の場合もあります。
UPDATE のターゲットテーブルなど、サブクエリ内の任意のテーブルを指定できます。
使用に関する注意事項
テーブル内の多数の行を更新した後:
• ストレージ容量を再利用し、行を再ソートするため、テーブルにバキューム処理を実行します。
API Version 2012-12-01
304
Amazon Redshift データベース開発者ガイド
UPDATE
• テーブルを分析して、クエリプランナーの統計情報を更新します。
UPDATE ステートメントの FROM 句では left、right、および full 外部結合はサポートされていません。
次のエラーが返されます。
ERROR: Target table must be part of an equijoin predicate
外部結合を指定する必要がある場合は、UPDATE ステートメントの WHERE 句でサブクエリを使用し
てください。
UPDATE ステートメントでターゲットテーブルへの自己結合が必要な場合、更新操作の行を限定する
WHERE 句の基準だけでなく、結合条件を指定する必要があります。一般的に、ターゲットテーブルを
自分または他のテーブルに結合する場合のベストプラクティスは、アップデータ対象の行を限定する基
準と、結合条件を明確に分離するサブクエリを使用することです。
UPDATE ステートメントの例
TICKIT データベースの CATEGORY テーブルには、次の行が含まれています。
catid | catgroup | catname |
catdesc
-------+----------+-----------+----------------------------------------1 | Sports
| MLB
| Major League Baseball
2 | Sports
| NHL
| National Hockey League
3 | Sports
| NFL
| National Football League
4 | Sports
| NBA
| National Basketball Association
5 | Sports
| MLS
| Major League Soccer
6 | Shows
| Musicals | Musical theatre
7 | Shows
| Plays
| All non-musical theatre
8 | Shows
| Opera
| All opera and light opera
9 | Concerts | Pop
| All rock and pop music concerts
10 | Concerts | Jazz
| All jazz singers and bands
11 | Concerts | Classical | All symphony, concerto, and choir concerts
(11 rows)
値の範囲に基づくテーブルの更新
CATID 列の値の範囲に基づいて、CATGROUP 列を更新します。
update category
set catgroup='Theatre'
where catid between 6 and 8;
select * from category
where catid between 6 and 8;
catid | catgroup | catname |
catdesc
-------+----------+-----------+-------------------------------------------6 | Theatre | Musicals | Musical theatre
7 | Theatre | Plays
| All non-musical theatre
8 | Theatre | Opera
| All opera and light opera
(3 rows)
現在の値に基づくテーブルの更新
API Version 2012-12-01
305
Amazon Redshift データベース開発者ガイド
UPDATE
現在の CATGROUP 値に基づいて、CATNAME 列と CATDESC 列を更新します。
update category
set catdesc=default, catname='Shows'
where catgroup='Theatre';
select * from category
where catname='Shows';
catid | catgroup | catname |
catdesc
-------+----------+-----------+-------------------------------------------6 | Theatre | Shows
|
7 | Theatre | Shows
|
8 | Theatre | Shows
|
(3 rows)
このケースでは、テーブルの作成時にデフォルト値が定義されていなかったため、CATDESC 列は Null
に設定されています。
次のコマンドを実行して、CATEGORY テーブルのデータを元の値に設定し直します。
truncate category;
copy category from
's3://mybucket/data/category_pipe.txt'
credentials 'aws_access_key_id=<access-key-id>;aws_secret_access_key=<secretaccess-key>'
delimiter '|';
WHERE 句のサブクエリの結果に基づく、テーブルの更新
WHERE 句のサブクエリの結果に基づいて、CATEGORY テーブルを更新します。
update category
set catdesc='Broadway Musical'
where category.catid in
(select category.catid from category
join event on category.catid = event.catid
join venue on venue.venueid = event.venueid
join sales on sales.eventid = event.eventid
where venuecity='New York City' and catname='Musicals');
更新したテーブルを表示します。
select * from category order by 1;
catid | catgroup | catname |
catdesc
-------+----------+-----------+-------------------------------------------1 | Sports
| MLB
| Major League Baseball
2 | Sports
| NHL
| National Hockey League
3 | Sports
| NFL
| National Football League
4 | Sports
| NBA
| National Basketball Association
5 | Sports
| MLS
| Major League Soccer
6 | Shows
| Musicals | Broadway Musical
API Version 2012-12-01
306
Amazon Redshift データベース開発者ガイド
UPDATE
7 | Shows
| Plays
| All non-musical theatre
8 | Shows
| Opera
| All opera and light opera
9 | Concerts | Pop
| All rock and pop music concerts
10 | Concerts | Jazz
| All jazz singers and bands
11 | Concerts | Classical | All symphony, concerto, and choir concerts
(11 rows)
結合条件の結果に基づく、テーブルの更新
EVENT テーブルの CATID 行と一致する項目に基づいて、CATEGORY テーブル内の元の 11 行を更新
します。
update category set catid=100
from event
where event.catid=category.catid;
select * from category order by 1;
catid | catgroup | catname |
catdesc
-------+----------+-----------+-------------------------------------------1 | Sports
| MLB
| Major League Baseball
2 | Sports
| NHL
| National Hockey League
3 | Sports
| NFL
| National Football League
4 | Sports
| NBA
| National Basketball Association
5 | Sports
| MLS
| Major League Soccer
10 | Concerts | Jazz
| All jazz singers and bands
11 | Concerts | Classical | All symphony, concerto, and choir concerts
100 | Shows
| Opera
| All opera and light opera
100 | Shows
| Musicals | Musical theatre
100 | Concerts | Pop
| All rock and pop music concerts
100 | Shows
| Plays
| All non-musical theatre
(11 rows)
EVENT テーブルは FROM 句内で一覧表示され、ターゲットテーブルに対する結合条件は WHERE 句
内で定義されます。更新用に限定される行は 4 行だけです。
select distinct catid from event;
catid
------9
8
6
7
(4 rows)
これらの 4 行は、CATID 値が元々 6、7、8、および 9 だった行です。この 4 つのカテゴリだけが、
EVENT テーブル内で表現されます。
前の例を拡張して、WHERE 句に別の条件を追加することで、CATEGORY テーブル内の元の 11 行を
更新します。
update category set catid=100
from event
where event.catid=category.catid
and catgroup='Concerts';
API Version 2012-12-01
307
Amazon Redshift データベース開発者ガイド
VACUUM
select * from category where catid=100;
catid | catgroup | catname |
catdesc
-------+----------+---------+--------------------------------100 | Concerts | Pop
| All rock and pop music concerts
(1 row)
CATGROUP 列に関する制限により、更新用に限定される行は 1 行だけです(ただし、結合用には 4
行は有資格となります)。
この例を作成するためのもう 1 つの方法を次に示します。
update category set catid=100
from event join category cat on event.catid=cat.catid
where cat.catgroup='Concerts';
この方法のメリットは、結合基準が、更新対象の行を限定する他の規格と明確に分離されることです。
FROM 句の CATEGORY テーブルに対するエイリアス CAT の使用に注意してください。
FROM 句内の外部結合を使った更新
前の例では、UPDATE ステートメントの FROM 句で指定した内部結合を示しました。次の例では、
FROM 句がターゲットテーブルに対する外部結合をサポートしていないため、エラーが返されます。
update category set catid=100
from event left join category cat on event.catid=cat.catid
where cat.catgroup='Concerts';
ERROR: Target table must be part of an equijoin predicate
update category set catid=100
from
(select event.catid from event left join category cat on event.catid=cat.catid)
eventcat
where category.catid=eventcat.catid
and catgroup='Concerts';
UPDATE ステートメントに対して外部結合が必要な場合、外部結合構文をサブクエリに移動すること
ができます。
VACUUM
現在のデータベース内の指定されたテーブルまたはすべてのテーブルのいずれかにある行のスペースの
再利用や行の再ソートを行います。
「テーブルのバキューム処理 (p. 86)」を参照してください。
概要
VACUUM [ SORT ONLY | DELETE ONLY ] [ table_name ]
API Version 2012-12-01
308
Amazon Redshift データベース開発者ガイド
VACUUM
パラメータ
SORT ONLY
削除した行によって解放されたスペースを再利用せずに、指定されたテーブル(または現在のデー
タベース内のすべてのテーブル)をソートします。このオプションは、ディスク容量の再利用が重
要でなく、新しい行の再ソートが重要な場合に役に立ちます。ソートされていない領域が削除済み
の行が大量に含んでおらず、ソート済み領域全体にまたがっていない場合に、SORT ONLY のバ
キューム操作を実行すると、バキューム操作にかかる時間が短縮されます。ディスク容量による拘
束がなく、テーブルの行を常にソート状態に維持するクエリの最適化に依存するアプリケーション
は、このようなバキューム操作からメリットを得ることができます。
DELETE ONLY
以前の UPDATE および DELETE 操作によって削除用マークが付けられた行によって占有されてい
るディスク容量を再利用します。DELETE ONLY バキューム操作を実行しても、データはソートさ
れません。このオプションは、ディスク容量が重要で、新しい行の再ソートが重要でない場合に、
バキューム操作にかかる時間を短縮します。このオプションは、クエリのパフォーマンスが既に最
適で、行の再ソートのためにクエリのパフォーマンスを最適化する必要がない場合にも使用できま
す。
table_name
バキューム操作を実行するデータベーステーブルを指定します。テーブル名を指定しない場合、バ
キューム操作は現在のデータベースのすべてのテーブルに適用されます。ユーザーが作成した常設
テーブルまたは一時テーブルを指定できます。このコマンドは、ビューやシステムテーブルなど、
他のオブジェクトに対しては意味を持ちません。
使用に関する注意事項
Note
実質的に、テーブルの所有者またはスーパーユーザーのみがテーブルにバキューム処理を実行
できます。必要なテーブル権限なしで VACUUM が実行された場合、操作は完了しますが、効
果はありません。
ほとんどの Amazon Redshift アプリケーションでは、完全バキュームをお勧めします。「テーブルの
バキューム処理 (p. 86)」を参照してください。
バキューム操作を実行する前に、以下の動作に注意してください。
• 一度に実行できる VACUUM コマンドは 1 つだけです。複数のバキューム動作を同時に実行しようと
すると、Amazon Redshift はエラーを返します。
• テーブルのバキュームを実行すると、ある程度のテーブル容量の増加が発生することがあります。再
利用の対象となる削除済みの行が存在しない場合や、テーブルの新しいソート順により、データ圧縮
率が低下する場合、これは想定される動作です。
• バキューム操作の実行中、クエリのパフォーマンスがある程度低下することが予想されます。バキュー
ム操作が終了すると直ちに通常のパフォーマンスに戻ります。
• バキューム操作実行時でも、同時書き込み操作は処理されますが、お勧めできません。バキューム操
作を実行する前に、書き込み操作を終了する方がより効率的です。また、バキューム操作開始後に書
き込まれたすべてのデータは、その操作ではバキュームすることはできません。したがって、2 回目
のバキューム操作が必要になります。
• ロード操作または挿入操作が既に進行中の場合、バキューム操作を開始できないことがあります。バ
キューム操作を開始するには、テーブルへの一時的な排他アクセスが必要になります。この排他アク
セスは短時間しか必要でないため、バキューム操作により同時ロードと同時挿入が長時間ブロックさ
れることはありません。
• 特定のテーブルに対して実行する作業がない場合、バキューム操作はスキップされます。ただし、操
作がスキップ可能かどうかの検出に関連して、ある程度のオーバーヘッドが発生します。テーブルが
API Version 2012-12-01
309
Amazon Redshift データベース開発者ガイド
SQL 関数リファレンス
あまり使われていないことが判明している場合は、テーブルに対してバキューム操作を実行しないで
ください。
• 小さなテーブルに対して DELETE ONLY バキューム操作を実行した場合、データの保存に使われる
ブロック数が減少しないことがあります。特にテーブルに多数の列が存在している場合、またはクラ
スターがノードごとに多数のスライスを使用している場合、この傾向が顕著になります。このような
バキューム操作はテーブルへの同時挿入を実現するため、1 列ごとに 1 ブロックを各スライスに追加
します。また、このようなオーバーヘッドが発生した場合、ブロック数の削減の方が再利用される
ディスク容量を上回る可能性があります。例えばバキューム操作前に、8 ノードクラスター上の 10
列のテーブルが 1000 ブロックを占有している場合、削除された行が原因で 80 ブロックを超えるディ
スク容量が再利用されない限り、バキュームを実行しても実際のブロック数は減少しません。(各
データブロックは 1 MB 使用します。)
例
現在のデータベース(TICKIT)のすべてのテーブルで、容量の再利用と行の再ソートを実行します。
vacuum;
SALES テーブルで、容量の再利用と行の再ソートを実行します。
vacuum sales;
SALES テーブルの行を再ソートします。
vacuum sort only sales;
SALES テーブルの容量を再利用します。
vacuum delete only sales;
SQL 関数リファレンス
Topics
• リーダーノード専用関数 (p. 311)
• 集計関数 (p. 312)
• ビット単位の集計関数 (p. 320)
• ウィンドウ関数 (p. 325)
• 条件式 (p. 355)
• 日付関数 (p. 361)
• 数学関数 (p. 385)
• 文字列関数 (p. 410)
• JSON 関数 (p. 443)
• データ型フォーマット関数 (p. 446)
• システム管理関数 (p. 455)
• システム情報関数 (p. 456)
API Version 2012-12-01
310
Amazon Redshift データベース開発者ガイド
リーダーノード専用関数
Amazon Redshift は SQL 標準を拡張する多くの関数をサポートします。また、標準の集計関数、スカ
ラー関数、およびウィンドウ関数もサポートします。
Note
Amazon Redshift は PostgreSQL 8.0.2 に基づいています。Amazon Redshift と PostgreSQL に
はいくつかの大きな違いがあり、データウェアハウスアプリケーションの設計と開発時には注
意が必要です。Amazon Redshift SQL と PostgreSQL の違いの詳細については、「Amazon
Redshift および PostgreSQL (p. 119)」を参照してください。
リーダーノード専用関数
Amazon Redshift クエリは配布され、コンピューティングノードで実行されるものもあれば、リーダー
ノードのみで実行されるものもあります。
クエリがユーザーが作成したテーブルまたはシステムテーブル(STL または STV を持つテーブル、お
よび SVL または SVV プレフィックスを持つシステムビュー)を参照する場合、リーダーノードは SQL
をコンピューティングノードに配布します。カタログテーブルのみを参照するクエリ(PG_TABLE_DEF
など、PG プレフィックスを持つテーブル)またはテーブルを参照しないクエリは、リーダーノードの
みで実行されます。
Amazon Redshift SQL 関数の中にはリーダーノードのみでサポートされるものがあり、コンピューティ
ングノードではサポートされません。リーダーノード専用関数を使用するクエリは、コンピューティン
グノードではなくリーダーノードのみで実行される必要があり、そうでなければエラーが返されます。
各リーダーノード専用関数のドキュメントには、関数がユーザー定義のテーブルまたは Amazon Redshift
システムテーブルを参照する場合にエラーを返すことを明言するノートが含まれます。
詳細については、「リーダーノードでサポートされる SQL 関数」を参照してください。
次の SQL 関数はリーダーノード専用関数であり、コンピューティングノードではサポートされません。
日付関数
•
•
•
•
AGE 関数
CURRENT_TIME および CURRENT_TIMESTAMP 関数
ISFINITE 関数
NOW 関数
文字列関数
• ASCII 関数
• GET_BIT 関数
• GET_BYTE 関数
• OCTET_LENGTH 関数
• SET_BIT 関数
• SET_BYTE 関数
• TO_ASCII 関数
システム情報関数
• CURRENT_SCHEMA
• CURRENT_SCHEMAS
• HAS_DATABASE_PRIVILEGE
API Version 2012-12-01
311
Amazon Redshift データベース開発者ガイド
集計関数
• HAS_SCHEMA_PRIVILEGE
• HAS_TABLE_PRIVILEGE
集計関数
Topics
• AVG 関数 (p. 312)
• COUNT 関数 (p. 314)
• MAX 関数 (p. 315)
• MIN 関数 (p. 316)
• STDDEV_SAMP および STDDEV_POP 関数 (p. 317)
• SUM 関数 (p. 318)
• VAR_SAMP および VAR_POP 関数 (p. 319)
集計関数は入力値のセットから 1 つの結果の値を計算します。Amazon Redshift でサポートされる集計
関数には、AVG、COUNT、MAX、MIN、および SUM が含まれます。
これらの集計関数のいずれかを使用する SELECT ステートメントには、2 つのオプション句(GROUP
BY および HAVING)を含めることができます。これらの句の構文は次のとおりです(例として COUNT
関数を使用)。
SELECT count (*) expression FROM table_reference
WHERE condition [GROUP BY expression ] [ HAVING condition]
GROUP BY 句は、指定した列(単数または複数)の一意の値によって結果を集計およびグループ化し
ます。HAVING 句は、特定の集計条件が真の場合(例: count (*) > 1)に行に返す結果を制限します。
HAVING 句は行の値に基づく列を制限するために、WHERE と同様に使用されます。
これらの句の例については、COUNT 関数の説明を参照してください。
AVG 関数
AVG 関数は、入力式の値の平均(算術平均)を返します。AVG 関数は数値に対してはたらき、NULL
値は無視します。
概要
AVG ( [ DISTINCT | ALL ] expression )
引数
expression
関数の対象となる列または式。
DISTINCT | ALL
引数 DISTINCT を指定すると、この関数は平均を計算する前に重複した値をすべて指定された式か
ら削除します。引数 ALL を指定すると、この関数は平均を計算する式の重複した値をすべて保持
します。ALL がデフォルトです。
API Version 2012-12-01
312
Amazon Redshift データベース開発者ガイド
集計関数
データ型
AVG 関数でサポートされる引数の型は、SMALLINT、INTEGER、BIGINT、NUMERIC、DECIMAL、
REAL、および DOUBLE PRECISION です。
AVG 関数でサポートされる戻り値の型は次のとおりです。
• 整数型の引数の場合は NUMERIC
• 浮動小数点の引数の場合は DOUBLE PRECISION
64 ビットの NUMERIC または DECIMAL 引数で AVG 関数の結果に使用するデフォルト有効桁数は 19
です。128 ビットの NUMERIC または DECIMAL 引数で結果に使用するデフォルト有効桁数は 38 で
す。結果のスケールは、引数のスケールと同じです。例えば、DEC(5,2) 列の AVG は DEC(19,2) のデー
タ型を返します。
例
SALES テーブルから取引ごとに販売された平均数量を検索します。
select avg(qtysold)from sales;
avg
----2
(1 row)
すべてのリストに一覧表示された平均合計価格を検索します。
select avg(numtickets*priceperticket) as avg_total_price from listing;
avg_total_price
----------------3034.41
(1 row)
降順で月ごとにグループ化された平均支払価格を検索します。
select avg(pricepaid) as avg_price, month
from sales, date
where sales.dateid = date.dateid
group by month
order by avg_price desc;
avg_price | month
-----------+------659.34 | MAR
655.06 | APR
645.82 | JAN
643.10 | MAY
642.72 | JUN
642.37 | SEP
640.72 | OCT
640.57 | DEC
635.34 | JUL
635.24 | FEB
API Version 2012-12-01
313
Amazon Redshift データベース開発者ガイド
集計関数
634.24 | NOV
632.78 | AUG
(12 rows)
COUNT 関数
COUNT 関数は式で定義された行をカウントします。
COUNT 関数には 3 つのバリエーションがあります。COUNT(*) は null を含むかどうかにかかわらず、
ターゲットテーブルのすべての行をカウントします。COUNT(expression) は、特定の列または式にあ
る NULL 以外の値を持つ行数を計算します。COUNT(DISTINCT expression) は、列または式にある一
意の NULL 以外の値の数を計算します。
概要
COUNT ( [ DISTINCT | ALL ] * | expression )
引数
expression
関数の対象となる列または式。
DISTINCT | ALL
引数 DISTINCT を指定すると、この関数はカウントを行う前に指定された式から重複した値をすべ
て削除します。引数 ALL を指定すると、この関数はカウントに使用する式から重複する値をすべ
て保持します。ALL がデフォルトです。
データ型
COUNT 関数は引数のデータ型をすべてサポートします。
COUNT 関数でサポートされる戻り値の型は BIGINT です。
例
フロリダ州のユーザーをすべてカウントします。
select count (*) from users where state='FL';
count
------510
(1 row)
EVENT テーブルから一意の会場 ID をすべてカウントします。
select count (distinct venueid) as venues from event;
venues
-------204
(1 row)
API Version 2012-12-01
314
Amazon Redshift データベース開発者ガイド
集計関数
4 枚より多いチケットをまとめて販売した販売者ごとの回数をカウントします。販売者 ID で結果をグ
ループ化します。
select count(*), sellerid from listing
group by sellerid
having min(numtickets)>4
order by 1 desc, 2;
count | sellerid
-------+---------12 |
17304
11 |
25428
11 |
48950
11 |
49585
...
(16840 rows)
MAX 関数
MAX 関数は行のセットの最大値を返します。DISTINCT または ALL が使用される可能性があります
が、結果には影響しません。
概要
MAX ( [ DISTINCT | ALL ] expression )
引数
expression
関数の対象となる列または式。
DISTINCT | ALL
引数 DISTINCT を指定すると、この関数は最大値を計算する前に指定された式から重複した値をす
べて削除します。引数 ALL を指定すると、この関数は最大値を計算する式から重複する値をすべ
て保持します。ALL がデフォルトです。
データ型
MAX 関数でサポートされる引数の型は以下のとおりです。
• 数値 – SMALLINT、INTEGER、BIGINT、NUMERIC、DECIMAL、REAL、DOUBLE PRECISION
• 文字列 – CHAR、VARCHAR、TEXT
• 日時指定 – DATE、TIMESTAMP
MAX 関数でサポートされる戻り値の型は、引数の型と同じです。
例
すべての販売から最高支払価格を検索します。
select max(pricepaid) from sales;
max
----------
API Version 2012-12-01
315
Amazon Redshift データベース開発者ガイド
集計関数
12624.00
(1 row)
すべての販売からチケットごとの最高支払価格を検索します。
select max(pricepaid/qtysold) as max_ticket_price
from sales;
max_ticket_price
----------------2500.00000000
(1 row)
MIN 関数
MIN 関数は行のセットの最小値を返します。DISTINCT または ALL が使用される可能性がありますが、
結果には影響しません。
概要
MIN ( [ DISTINCT | ALL ] expression )
引数
expression
関数の対象となる列または式。
DISTINCT | ALL
引数 DISTINCT を指定すると、この関数は最小値を計算する前に指定された式から重複した値をす
べて削除します。引数 ALL を指定すると、この関数は最小値を計算する式から重複する値をすべ
て保持します。ALL がデフォルトです。
データ型
MIN 関数でサポートされる引数の型は次のとおりです。
• 数値 – SMALLINT、INTEGER、BIGINT、NUMERIC、DECIMAL、REAL、DOUBLE PRECISION
• 文字列 – CHAR、VARCHAR
• 日時指定 – DATE、TIMESTAMP
MIN 関数でサポートされる戻り値の型は、引数の型と同じです。
例
すべての販売から最低支払価格を検索します。
select min(pricepaid)from sales;
max
------20.00
(1 row)
API Version 2012-12-01
316
Amazon Redshift データベース開発者ガイド
集計関数
すべての販売からチケットごとの最低支払価格を検索します。
select min(pricepaid/qtysold)as min_ticket_price
from sales;
min_ticket_price
-----------------20.00000000
(1 row)
STDDEV_SAMP および STDDEV_POP 関数
STDDEV_SAMP および STDDEV_POP 関数は、数値のセットの標本標準偏差と母集団標準偏差(整
数、10 進数、または浮動小数点)を返します。STDDEV_SAMP 関数の結果は、値の同じセットの標本
分散の平方根に相当します。STDDEV_SAMP および STDDEV は、同じ関数のシノニムです。
STDDEV_SAMP および STDDEV は、同じ関数のシノニムです。
構文
STDDEV_SAMP | STDDEV ( [ DISTINCT | ALL ] expression)
STDDEV_POP ( [ DISTINCT | ALL ] expression)
この式は整数、10 進数、または浮動小数点数データ型である必要があります。式のデータ型にかかわ
らず、この関数の戻り値の型は倍精度の数値です。
Note
標準偏差は浮動小数点演算を使用して計算されます。これはわずかに不正確である可能性があ
ります。
使用に関する注意事項
標本標準偏差(STDDEV または STDDEV_SAMP)が 1 つの値で構成される式に対して計算される場
合、関数の結果は 0 ではなく、NULL になります。
例
次のクエリは VENUE テーブルの VENUESEATS 列の値の平均、続いて値の同じセットの標本標準偏
差と母集団標準偏差を返します。VENUESEATS は INTEGER 列です。結果のスケールは 2 桁に減らさ
れます。
select avg(venueseats),
cast(stddev_samp(venueseats) as dec(14,2)) stddevsamp,
cast(stddev_pop(venueseats) as dec(14,2)) stddevpop
from venue;
avg | stddevsamp | stddevpop
-------+------------+----------17503 |
27847.76 | 27773.20
(1 row)
次のクエリは SALES テーブルの COMMISSION 列に標本標準偏差を返します。COMMISSION は
DECIMAL 列です。結果のスケールは 10 桁に減らされます。
API Version 2012-12-01
317
Amazon Redshift データベース開発者ガイド
集計関数
select cast(stddev(commission) as dec(18,10))
from sales;
stddev
---------------130.3912659086
(1 row)
次のクエリは整数として COMMISSION 列の標本標準偏差をキャストします。
select cast(stddev(commission) as integer)
from sales;
stddev
-------130
(1 row)
次のクエリは COMMISSION 列に標本標準偏差と標本分散の平方根の両方を返します。これらの計算の
結果は同じです。
select
cast(stddev_samp(commission) as dec(18,10)) stddevsamp,
cast(sqrt(var_samp(commission)) as dec(18,10)) sqrtvarsamp
from sales;
stddevsamp
| sqrtvarsamp
----------------+---------------130.3912659086 | 130.3912659086
(1 row)
SUM 関数
SUM 関数は入力列または式の値の合計を返します。SUM 関数は数値に対してはたらき、NULL 値を無
視します。
概要
SUM ( [ DISTINCT | ALL ] expression )
引数
expression
関数の対象となる列または式。
DISTINCT | ALL
引数 DISTINCT を指定すると、この関数は合計を計算する前に指定された式から重複した値をすべ
て削除します。引数 ALL を指定すると、この関数は合計を計算する式から重複する値をすべて保
持します。ALL がデフォルトです。
データ型
SUM 関数でサポートされる引数の型は、SMALLINT、INTEGER、BIGINT、NUMERIC、DECIMAL、
REAL、および DOUBLE PRECISION です。
API Version 2012-12-01
318
Amazon Redshift データベース開発者ガイド
集計関数
SUM 関数でサポートされる戻り値の型は次のとおりです。
• BIGINT、SMALLINT、および INTEGER 引数の場合は BIGINT
• NUMERIC 引数の場合は NUMERIC
• 浮動小数点の引数の場合は DOUBLE PRECISION
64 ビットの NUMERIC または DECIMAL 引数での SUM 関数の結果に使用するデフォルト有効桁数は
19 です。128 ビットの NUMERIC または DECIMAL 引数で結果に使用するデフォルト有効桁数は 38
です。結果のスケールは、引数のスケールと同じです。例えば、DEC(5,2) 列の SUM は、DEC(19,2)
のデータ型を返します。
例
SALES テーブルから支払われたすべての手数料の合計を検索します。
select sum(commission) from sales;
sum
------------16614814.65
(1 row)
フロリダ州の全会場の座席数を検索します。
select sum(venueseats) from venue
where venuestate = 'FL';
sum
-------250411
(1 row)
5 月に販売された座席数を検索します。
select sum(qtysold) from sales, date
where sales.dateid = date.dateid and date.month = 'MAY';
sum
------32291
(1 row)
VAR_SAMP および VAR_POP 関数
VAR_SAMP および VAR_POP 関数は、数値のセットの標本分散と母集団分散(整数、10 進数、また
は浮動小数点)を返します。VAR_SAMP 関数の結果は、値の同じセットの 2 乗の標本標準偏差に相当
します。VAR_SAMP および VARIANCE は同じ関数のシノニムです。
VAR_SAMP および VARIANCE は同じ関数のシノニムです。
API Version 2012-12-01
319
Amazon Redshift データベース開発者ガイド
ビット単位の集計関数
構文
VAR_SAMP | VARIANCE ( [ DISTINCT | ALL ] expression)
VAR_POP ( [ DISTINCT | ALL ] expression)
この式は整数、10 進数、または浮動小数点数データ型である必要があります。式のデータ型にかかわ
らず、この関数の戻り値の型は倍精度の数値です。
Note
これらの関数の結果は、それぞれのクラスターの設定に応じて、データウェアハウスクラス
ターによって変わる場合があります。
使用に関する注意事項
標本分散(VARIANCE または VAR_SAMP)が 1 つの値で構成される式に対して計算される場合、関
数の結果は 0 ではなく、NULL になります。
例
次のクエリは LISTING テーブルの NUMTICKETS 列の四捨五入した標本分散と母集団分散を返します。
select avg(numtickets),
round(var_samp(numtickets)) varsamp,
round(var_pop(numtickets)) varpop
from listing;
avg | varsamp | varpop
-----+---------+-------10 |
54 |
54
(1 row)
次のクエリは同じ計算を実行しますが、10 進値の結果をキャストします。
select avg(numtickets),
cast(var_samp(numtickets) as dec(10,4)) varsamp,
cast(var_pop(numtickets) as dec(10,4)) varpop
from listing;
avg | varsamp | varpop
-----+---------+--------10 | 53.6291 | 53.6288
(1 row)
ビット単位の集計関数
Topics
• BIT_AND および BIT_OR (p. 321)
• BOOL_AND および BOOL_OR (p. 321)
• ビット単位の集計の NULL (p. 322)
• ビット単位の集計の DISTINCT サポート (p. 322)
• BIT_AND 関数 (p. 322)
API Version 2012-12-01
320
Amazon Redshift データベース開発者ガイド
ビット単位の集計関数
• BIT_OR 関数 (p. 322)
• BOOL_AND 関数 (p. 323)
• BOOL_OR 関数 (p. 323)
• ビット単位関数の例 (p. 323)
Amazon Redshift は次のビット単位の集計関数をサポートします。
• BIT_AND
• BIT_OR
• BOOL_AND
• BOOL_OR
BIT_AND および BIT_OR
BIT_AND および BIT_OR 関数は、1 つの整数列または式のすべての値でビット単位の AND および OR
演算を実行します。これらの関数は、式の整数値ごとに対応する各バイナリ値の各ビットを集計しま
す。
値のすべてにおいてどのビットにも 1 が設定されていない場合、BIT_AND 関数は 0 の結果を返しま
す。値のすべてにおいて 1 つ以上のビットに 1 が設定されている場合、関数は整数値を返します。こ
の整数はこれらのビットのバイナリ値に対応する数値です。
例えば、テーブルは列に 4 つの整数値を含みます(3、7、10、および 22)。これらの整数は、次のよ
うにバイナリで表されます。
整数
バイナリ値
3
11
7
111
10
1010
22
10110
このデータセットの BIT_AND 演算は、すべてのビットで最後から 2 番目の位置のみに 1 が設定されて
いることが分かります。結果は 00000010 のバイナリ値であり、整数値 2 を表します。そのため、
BIT_AND 関数は 2 を返します。
BIT_OR 関数を整数値の同じセットに適用する場合、この演算は各位置に 1 が検出された任意の値を探
します。この場合、1 が少なくとも 1 つの値の最後の 5 つの位置に存在し、00011111 のバイナリ結果
を生成します。そのため、関数は 31(または 16 + 8 + 4 + 2 + 1)を返します。
BOOL_AND および BOOL_OR
BOOL_AND および BOOL_OR 関数は、1 つのブールまたは整数の列または式で実行されます。これら
の関数は、同様のロジックを BIT_AND および BIT_OR 関数に適用します。これらの関数では、戻り値
の型はブール値(true または false)です。
• セットの値がすべて true の場合、BOOL_AND 関数は true(t)を返します。値がすべて false の場
合、関数は false(f)を返します。
• セットの値のいずれかが true の場合、BOOL_OR 関数は true(t)を返します。セットのどの値
も true ではない場合、関数は false(f)を返します。
API Version 2012-12-01
321
Amazon Redshift データベース開発者ガイド
ビット単位の集計関数
ビット単位の集計の NULL
ビット単位関数が Null 使用可能な列に適用されている場合、NULL 値は関数の結果が計算される前に削
除されます。集計を満たす行がない場合、ビット単位関数は NULL を返します。同じ動作が標準の集計
関数に適用されます。以下に例を示します。
select sum(venueseats), bit_and(venueseats) from venue
where venueseats is null;
sum | bit_and
------+--------null |
null
(1 row)
ビット単位の集計の DISTINCT サポート
その他の集計関数のように、ビット単位関数は DISTINCT キーワードをサポートします。ただし、こ
れらの関数で DISTINCT を使用しても結果に影響はありません。値の最初のインスタンスはビット単
位の AND または OR 演算を満たすのに十分であり、重複した値が検証中の式に存在しても違いはあり
ません。DISTINCT プロセスはクエリ実行オーバーヘッドを伴う可能性があるため、これらの関数で
DISTINCT を使用しないでください。
BIT_AND 関数
概要
BIT_AND ( [DISTINCT | ALL] expression )
引数
expression
関数の対象となる列または式。この式には、INT、INT2、または INT8 のデータ型がある必要があ
ります。関数は同等の INT、INT2、または INT8 のデータ型を返します。
DISTINCT | ALL
引数 DISTINCT を指定すると、この関数は結果を計算する前に指定された式から重複した値をすべ
て削除します。引数 ALL 指定すると、この関数は重複する値をすべて保持します。ALL がデフォ
ルトです。「ビット単位の集計の DISTINCT サポート (p. 322)」を参照してください。
BIT_OR 関数
概要
BIT_OR ( [DISTINCT | ALL] expression )
引数
expression
関数の対象となる列または式。この式には、INT、INT2、または INT8 のデータ型がある必要があ
ります。関数は同等の INT、INT2、または INT8 のデータ型を返します。
API Version 2012-12-01
322
Amazon Redshift データベース開発者ガイド
ビット単位の集計関数
DISTINCT | ALL
引数 DISTINCT を指定すると、この関数は結果を計算する前に指定された式から重複した値をすべ
て削除します。引数 ALL 指定すると、この関数は重複する値をすべて保持します。ALL がデフォ
ルトです。「ビット単位の集計の DISTINCT サポート (p. 322)」を参照してください。
BOOL_AND 関数
概要
BOOL_AND ( [DISTINCT | ALL] expression )
引数
expression
関数の対象となる列または式。この式には BOOLEAN または整数のデータ型がある必要がありま
す。関数の戻り値の型は BOOLEAN です。
DISTINCT | ALL
引数 DISTINCT を指定すると、この関数は結果を計算する前に指定された式から重複した値をすべ
て削除します。引数 ALL 指定すると、この関数は重複する値をすべて保持します。ALL がデフォ
ルトです。「ビット単位の集計の DISTINCT サポート (p. 322)」を参照してください。
BOOL_OR 関数
概要
BOOL_OR ( [DISTINCT | ALL] expression )
引数
expression
関数の対象となる列または式。この式には BOOLEAN または整数のデータ型がある必要がありま
す。関数の戻り値の型は BOOLEAN です。
DISTINCT | ALL
引数 DISTINCT を指定すると、この関数は結果を計算する前に指定された式から重複した値をすべ
て削除します。引数 ALL 指定すると、この関数は重複する値をすべて保持します。ALL がデフォ
ルトです。「ビット単位の集計の DISTINCT サポート (p. 322)」を参照してください。
ビット単位関数の例
TICKIT サンプルデータベースの USERS テーブルには複数のブール列が含まれ、ユーザーごとに異な
るイベントのタイプ(スポーツ、演劇、オペラなど)を好きかどうかを示しています。以下に例を示し
ます。
select userid, username, lastname, city, state,
likesports, liketheatre
from users limit 10;
userid | username | lastname |
city
| state | likesports | liketheatre
--------+----------+-----------+--------------+-------+------------+------------
API Version 2012-12-01
323
Amazon Redshift データベース開発者ガイド
ビット単位の集計関数
1 | JSG99FHE | Taylor
9 | MSD36KVR | Watkins
| Kent
| Port Orford
| WA
| MD
| t
| t
| t
| f
USERS テーブルの新しいバージョンが、各ユーザーが好きまたは嫌いな 8 種類のイベントのタイプを
(バイナリ形式で)定義する 1 つの整数列を使って、異なる方法で構築されたとします。このデザイン
で、各ビットの位置はイベントのタイプを示し、8 種類すべてのタイプが好きなユーザーはすべての
ビットに 1 が設定されます(以下のテーブルの 1 行目)。これらのどのイベントも好きではないユー
ザーは、8 ビットすべてに 0 が設定されます(2 行目を参照)。スポーツとジャズのみが好きなユー
ザーを 3 行目に示しています。
SPORTS THEATRE JAZZ
OPERA
ROCK
VEGAS
BROADWAY CLASSICAL
ユーザー
1
1
1
1
1
1
1
1
1
ユーザー
2
0
0
0
0
0
0
0
0
ユーザー
3
1
0
1
0
0
0
0
0
データベーステーブルでこれらのバイナリ値は、整数として 1 つの LIKES 列に保存される場合があり
ます。
ユーザー
バイナリ値
保存値(整数)
ユーザー 1
11111111
255
ユーザー 2
00000000
0
ユーザー 3
10100000
160
BIT_AND および BIT_OR の例
有効な企業情報が整数列に保存されるとすると、ビット単位関数を使用してこの情報を抽出および集計
できます。次のクエリは USERLIKES と呼ばれるテーブルの LIKES 列に BIT_AND 関数を適用し、CITY
列による結果をグループ化します。
select city, bit_and(likes) from userlikes group by city
order by city;
city
| bit_and
---------------+--------Los Angeles
|
0
Sacramento
|
0
San Francisco |
0
San Jose
|
64
Santa Barbara |
192
(5 rows)
これらの結果は次のように解釈できます。
• サンタバーバラの整数値 192 は、バイナリ値 11000000 に変換されます。つまり、この都市のすべ
てのユーザーがスポーツと演劇を好きですが、すべてのユーザーがその他のタイプのイベントを好き
というわけではありません。
API Version 2012-12-01
324
Amazon Redshift データベース開発者ガイド
ウィンドウ関数
• 整数 64 は 01000000 に変換するため、サンノゼのユーザーの場合、全員が好きなイベントタイプは
演劇のみです。
• 他の 3 都市の 0 の値は、「好き」と回答したユーザーがこれらの都市で 1 人もいないことを示しま
す。
BIT_OR 関数を同じデータに適用する場合、結果は次のとおりです。一覧表示された 4 都市では、すべ
てのイベントタイプで「好き」と答えたユーザーが少なくとも 1 人います
select city, bit_or(likes) from userlikes group by city
order by city;
city
| bit_or
---------------+-------Los Angeles
|
127
Sacramento
|
255
San Francisco |
255
San Jose
|
255
Santa Barbara |
255
(5 rows)
(255=11111111)。ロサンゼルスでは、スポーツを除くすべてのイベントタイプで「好き」と答えた
ユーザーが少なくとも 1 人います(127=01111111)。
BOOL_AND および BOOL_OR の例
ブール関数をブール式または整数式のどちらかに対して使用できます。例えば、次のクエリは複数の
ブール列のある TICKIT データベースの標準 USERS テーブルから結果を返します。
BOOL_OR 関数は 5 行すべてに true を返します。これらの州のそれぞれにおいて少なくとも 1 人の
ユーザーがスポーツを好きです。BOOL_AND 関数は 5 行すべてに false を返します。これら各州の
すべてのユーザーがスポーツを好きというわけではありません。
select state, bool_or(likesports), bool_and(likesports) from users
group by state order by state limit 5;
state | bool_or | bool_and
-------+-------------------AB
| t
| f
AK
| t
| f
AL
| t
| f
AZ
| t
| f
BC
| t
| f
(5 rows)
ウィンドウ関数
Topics
• ウィンドウ関数の構文の概要 (p. 327)
• AVG ウィンドウ関数 (p. 329)
• COUNT ウィンドウ関数 (p. 330)
• DENSE_RANK ウィンドウ関数 (p. 331)
• FIRST_VALUE および LAST_VALUE ウィンドウ関数 (p. 332)
• LAG ウィンドウ関数 (p. 333)
• LEAD ウィンドウ関数 (p. 334)
API Version 2012-12-01
325
Amazon Redshift データベース開発者ガイド
ウィンドウ関数
• MAX ウィンドウ関数 (p. 334)
• MIN ウィンドウ関数 (p. 335)
• NTH_VALUE ウィンドウ関数 (p. 336)
• NTILE ウィンドウ関数 (p. 337)
• RANK ウィンドウ関数 (p. 338)
• STDDEV_SAMP および STDDEV_POP ウィンドウ関数 (p. 338)
• SUM ウィンドウ関数 (p. 339)
• VAR_SAMP および VAR_POP ウィンドウ関数 (p. 340)
• ウィンドウ関数の例 (p. 341)
ウィンドウ関数は、より効率的に分析業務クエリを作成する機能をアプリケーション開発者に提供しま
す。ウィンドウ関数はパーティションまたは結果セットの「ウィンドウ」で演算し、ウィンドウのすべ
ての行に値を返します。それに対して、ウィンドウ関数以外は結果セットのすべての行について計算を
実行します。結果の行を集計するグループ関数とは異なり、テーブル式のすべての行が保持されます。
戻り値はこのウィンドウの行セットの値を利用して計算されます。ウィンドウはテーブルの各行に、追
加の属性を計算するために使用する行のセットを定義します。ウィンドウはウィンドウ仕様(OVER
句)を使用して定義され、次の 3 つの主要な概念に基づいています。
• ウィンドウのパーティション、列のグループを形成(PARTITION 句)
• ウィンドウの並び順、各パーティション内の行の順序またはシーケンスの定義(ORDER BY 句)
• ウィンドウのフレーム、各行に関連して定義され、行のセットをさらに制限(ROWS 仕様)
ウィンドウ関数は、最後の ORDER BY 句を除いて、クエリで実行される最後の演算のセットです。す
べての結合およびすべての WHERE、GROUP BY、および HAVING 句は、ウィンドウ関数が処理され
る前に完了されます。そのため、ウィンドウ関数は選択リストまたは ORDER BY 句のみに表示できま
す。複数のウィンドウ関数は、別のフレーム句を持つ 1 つのクエリ内で使用できます。ウィンドウ関数
は、CASE などの他のスカラー式に存在する場合があります。
Amazon Redshift はウィンドウ関数の 2 つのタイプをサポートします(集計およびランク付け)。サ
ポートされる集計関数は次のとおりです。
•
•
•
•
AVG
COUNT
FIRST_VALUE
LAG
• LAST_VALUE
• LEAD
• MAX
• MIN
• NTH_VALUE
• STDDEV_POP
• STDDEV_SAMP(STDDEV のシノニム)
• SUM
• VAR_POP
• VAR_SAMP(VARIANCE のシノニム)
サポートされるランク付け関数は次のとおりです。
• DENSE_RANK
API Version 2012-12-01
326
Amazon Redshift データベース開発者ガイド
ウィンドウ関数
• NTILE
• RANK
集計ウィンドウ関数は同じクエリに異なる PARTITION または ORDER BY 句がある場合があります
が、ランク付け関数にはありません。
ウィンドウ関数の構文の概要
function (expression) OVER
(
[ PARTITION BY expr_list ]
[ ORDER BY order_list [ frame_clause ] ]
)
関数はこのセクションで説明された関数の 1 つの場合、expr_list は次のとおりです。
expression | column_name [, expr_list ]
また、order_list は次のとおりです。
expression | column_name [ASC | DESC] [, order_list ]
また、frame_clause は次のとおりです。
ROWS
{UNBOUNDED PRECEDING | unsigned_value PRECEDING | CURRENT ROW} |
BETWEEN
{UNBOUNDED PRECEDING | unsigned_value { PRECEDING | FOLLOWING } |
CURRENT ROW}
AND
{UNBOUNDED FOLLOWING | unsigned_value { PRECEDING | FOLLOWING } |
CURRENT ROW}
Note
STDDEV_SAMP および VAR_SAMP は、それぞれ STDDEV および VARIANCE のシノニムで
す。
引数
function
それぞれの関数の説明を参照してください。
OVER
OVER キーワードはウィンドウ関数に必須であり、ウィンドウ関数を他の SQL 関数と区別します。
PARTITION BY expr_list
PARTITION BY 句はオプションであり、結果セットをパーティションに再分割します。これは
GROUP BY 句と似ています。パーティション句が存在する場合、関数は各パーティションの行に
対して計算されます。パーティション句が指定されていない場合、1 つのパーティションにテーブ
ル全体が含まれ、関数は完全なテーブルに対して計算されます。PARTITION BY の場合、整数の
定数はターゲットリストのフィールドの位置を示すために使用できます(PARTITION BY 3 など)。
ただし、定数式は許可されていません(PARTITION BY 1*1+3 など)。
API Version 2012-12-01
327
Amazon Redshift データベース開発者ガイド
ウィンドウ関数
ORDER BY order_list
ウィンドウ関数は、順序仕様に従ってソートされた各パーティション内の行に適用されます。この
ORDER BY 句は、ウィンドウ関数以外(OVER 句の外側)の ORDER BY 句とは異なり、完全に
無関係です。ORDER BY 句は、PARTITION BY 句なしで使用できます。
ランク付け関数の場合、ORDER BY 句はランク付けの値に使用する基準を特定します。集計関数
の場合、パーティションで分割された行は、集計関数がフレームごとに計算される前に順序付けさ
れる必要があります。
列識別子または列識別を検証する式は、順序リストで必要とされます。定数も定数式も、列名の代
用として使用することはできません。
NULLS は独自のグループとして処理され、ASC ではソートされ最後にランク付けされ、DESC で
はソートされ最初にランク付けされます。
Note
Amazon Redshift などの並列システムでは、ORDER BY 句がデータの一意および全体の並
び順を生成しない場合、行の順序は不明確です。つまり、ORDER BY 式が重複した値を生
成する場合(部分的な順序付け)、これらの行の戻り値の順序は Amazon Redshift の実行
によって異なる可能性があります。順に、ウィンドウ関数は予期しない結果または矛盾し
た結果を返す場合があります。「ウィンドウ関数用データの一意の並び順 (p. 354)」を参照
してください。
column_name
パーティション分割または順序付けされる列の名前。
ASC | DESC
昇順でソートするか、降順でソートするかを指定します。昇順がデフォルトです。
frame_clause
集計関数では、ORDER BY を使用する場合、フレーム句は関数のウィンドウで行のセットをさら
に絞り込みます。これは、順序付けされた結果内の行のセットを含めるまたは除外する機能を提供
します。フレーム句は ROWS キーワードおよび関連する指定子で構成されます。
ORDER BY 句が集計関数の OVER 句で使用される場合、フレーム句はランク付け関数に適用され
ないため必要ありません。ORDER BY 句が集計関数に使用される場合、明示的なフレーム句が必
要です。
ORDER BY 句が指定されていない場合、暗黙的なフレームはバインドされません(ROWSBETWEEN
UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING と同じ)。
範囲を基にしたウィンドウフレームはサポートされません。
ROWS
ROWS 句はウィンドウフレームを定義し、現在の行の値が結合される現在の行の前後にある現在
のパーティションの行数を指定します。ROWS は行の位置を指定する引数を利用します。すべて
のウィンドウフレームの参照点は現在の行になります。行を基とするウィンドウフレームは、現在
の行に先行するまたは現在の行と同じ行数として、Amazon Redshift に定義されます。ウィンドウ
フレームがパーティションで次にスライドすると、各行は順に現在の行になります。
フレームは、次のように現在の行までと現在の行を含む行の簡易セットである場合があります。
{UNBOUNDED PRECEDING | unsigned_value PRECEDING | CURRENT ROW}
また、次の 2 つの境界の間の行のセットである場合があります。
BETWEEN
{UNBOUNDED PRECEDING | unsigned_value { PRECEDING | FOLLOWING }
API Version 2012-12-01
328
Amazon Redshift データベース開発者ガイド
ウィンドウ関数
| CURRENT ROW}
AND
{UNBOUNDED FOLLOWING | unsigned_value { PRECEDING | FOLLOWING }
| CURRENT ROW}
UNBOUNDED PRECEDING はウィンドウがパーティションの最初の行で開始されることを示し、
unsigned_value PRECEDING は前の行数のことであり、CURRENT ROW はウィンドウが現在の
行で開始または終了することを示します。UNBOUNDED PRECEDING はデフォルトであり、指定
されていない場合は暗黙に示されます。
UNBOUNDED FOLLOWING はパーティションの最後の行で終了境界を示し、unsigned_value
FOLLOWING は現在の行の n 行後に開始する行を基とする境界を示します。
Note
開始境界が終了境界よりも大きいフレームを指定することはできません。例えば、これら
のフレームはいずれも指定することができません。
between 5 following and 5 preceding
between current row and 2 preceding
between 3 following and current row
範囲を基にしたウィンドウフレームはサポートされません。
AVG ウィンドウ関数
AVG ウィンドウ関数は入力式の値の平均(算術平均)を返します。AVG 関数は数値に対してはたら
き、NULL 値は無視します。
概要
AVG ( [ALL ] expression ) OVER
(
[ PARTITION BY expr_list ]
[ ORDER BY order_list
frame_clause ]
)
引数
expression
関数の対象となる列または式。
ALL
引数 ALL を指定すると、この関数はカウントに使用する式から重複する値をすべて保持します。
ALL がデフォルトです。DISTINCT はサポートされません。
OVER
集計関数に使用するウィンドウ句を指定します。OVER 句は、ウィンドウ集計関数を標準セット集
計関数と区別します。
PARTITION BY expr_list
1 つ以上の式で AVG 関数のウィンドウを定義します。
API Version 2012-12-01
329
Amazon Redshift データベース開発者ガイド
ウィンドウ関数
ORDER BY order_list
各パーティション内の行をソートします。PARTITION BY が指定されていない場合、ORDER BY
はテーブル全体を使用します。
frame_clause
ORDER BY 句が集計関数に使用される場合、明示的なフレーム句が必要です。フレーム句は順序
付けた結果内の行のセットを含めるか除外して、関数のウィンドウの行のセットを絞り込みます。
フレーム句は ROWS キーワードおよび関連する指定子で構成されます。「ウィンドウ関数の構文
の概要 (p. 327)」を参照してください。
データ型
AVG 関数でサポートされる引数の型は、SMALLINT、INTEGER、BIGINT、NUMERIC、DECIMAL、
REAL、および DOUBLE PRECISION です。
AVG 関数でサポートされる戻り値の型は次のとおりです。
• SMALLINT または INTEGER 引数の場合は BIGINT
• BIGINT 引数の場合は NUMERIC
• 浮動小数点の引数の場合は DOUBLE PRECISION
例
「LAG ウィンドウ関数の例 (p. 346)」を参照してください。
COUNT ウィンドウ関数
COUNT ウィンドウ関数は式で定義された行をカウントします。
COUNT 関数には 2 つのバリエーションがあります。COUNT(*) は null を含むかどうかにかかわらず、
ターゲットテーブルのすべての行をカウントします。COUNT(expression) は、特定の列または式にあ
る NULL 以外の値を持つ行数を計算します。
概要
COUNT ( * | [ ALL ] expression) OVER
(
[ PARTITION BY expr_list ]
[ ORDER BY order_list
frame_clause ]
)
引数
expression
関数の対象となる列または式。
ALL
引数 ALL を指定すると、この関数はカウントに使用する式から重複する値をすべて保持します。
ALL がデフォルトです。DISTINCT はサポートされません。
OVER
集計関数に使用するウィンドウ句を指定します。OVER 句は、ウィンドウ集計関数を標準セット集
計関数と区別します。
PARTITION BY expr_list
1 つ以上の式で COUNT 関数のウィンドウを定義します。
API Version 2012-12-01
330
Amazon Redshift データベース開発者ガイド
ウィンドウ関数
ORDER BY order_list
各パーティション内の行をソートします。PARTITION BY が指定されていない場合、ORDER BY
はテーブル全体を使用します。
frame_clause
ORDER BY 句が集計関数に使用される場合、明示的なフレーム句が必要です。フレーム句は順序
付けた結果内の行のセットを含めるか除外して、関数のウィンドウの行のセットを絞り込みます。
フレーム句は ROWS キーワードおよび関連する指定子で構成されます。「ウィンドウ関数の構文
の概要 (p. 327)」を参照してください。
データ型
COUNT 関数は引数のデータ型をすべてサポートします。
COUNT 関数でサポートされる戻り値の型は BIGINT です。
例
「LEAD ウィンドウ関数の例 (p. 347)」を参照してください。
DENSE_RANK ウィンドウ関数
DENSE_RANK ウィンドウ関数は、OVER 句の ORDER BY 式に基づいて、値のグループの値のランク
を特定します。オプションの PARTITION BY 句がある場合、ランク付けは行のグループごとにリセッ
トされます。ランク付け条件が同じ値の行は、同じランクを受け取ります。DENSE_RANK 関数はある
点において RANK とは異なります。2 行以上で同点となった場合、ランク付けされた値の順位に差は
ありません。例えば、2 行が 1 位にランク付けされた場合、次のランクは 2 位になります。
同じクエリに PARTITION BY および ORDER BY 句のあるランク付け関数を使用することができます。
概要
DENSE_RANK () OVER
(
[ PARTITION BY expr_list ]
ORDER BY order_list
)
引数
()
DENSE_RANK 関数は引数を取得しませんが、空のかっこを指定する必要があります。
OVER
DENSE_RANK 関数に対してウィンドウ句を指定します。
PARTITION BY expr_list
1 つ以上の式で DENSE_RANK 関数のウィンドウを定義します。
ORDER BY order_list
ランク付けの値が基とする列を定義します。PARTITION BY が指定されていない場合、ORDER
BY はテーブル全体を使用します。DENSE_RANK 関数には ORDER BY が必要です。
データ型
DENSE_RANK 関数でサポートされる戻り値の型は INTEGER です。
API Version 2012-12-01
331
Amazon Redshift データベース開発者ガイド
ウィンドウ関数
例
「MAX ウィンドウ関数の例 (p. 347)」を参照してください。
FIRST_VALUE および LAST_VALUE ウィンドウ関数
順序付けられた行のセットとすると、FIRST_VALUE はウィンドウフレームの最初の行に関して指定さ
れた式の値を返します。LAST_VALUE 関数は、フレームの最後の行に関する式の値を返します。
概要
FIRST_VALUE | LAST_VALUE
( expression [ IGNORE NULLS | RESPECT NULLS ] ) OVER
(
[ PARTITION BY expr_list ]
[ ORDER BY order_list
frame_clause ]
)
引数
expression
関数の対象となる列または式。
IGNORE NULLS
このオプションが FIRST_VALUE で使用される場合、関数は NULL ではないフレームの最初の値
(値がすべて NULL の場合は NULL)を返します。このオプションが LAST_VALUE で使用される
場合、関数は NULL ではないフレームの最後の値(値がすべて NULL の場合は NULL)を返しま
す。
RESPECT NULLS
Amazon Redshift は使用される行を決定するために Null 値を含める必要があることを示します。
IGNORE NULLS を指定しない場合、RESPECT NULLS はデフォルトでサポートされます。
OVER
関数にウィンドウ句を導入します。
PARTITION BY expr_list
1 つ以上の式で関数のウィンドウを定義します。
ORDER BY order_list
各パーティション内の行をソートします。PARTITION BY 句が指定されていない場合、ORDER
BY はテーブル全体をソートします。ORDER BY 句を指定する場合、frame_clause も指定する必
要があります。
FIRST_VALUE および LAST_VALUE 関数の結果は、データの並び順によって異なります。次の場
合、結果は不明確です。
• ORDER BY 句が指定されておらず、パーティションに式に使用する 2 つの異なる値が含まれる
場合
• 式が ORDER BY リストの同じ値に対応する異なる値を検証する場合
frame_clause
ORDER BY 句が集計関数に使用される場合、明示的なフレーム句が必要です。フレーム句は順序
付けた結果の行のセットを含めるか除外して、関数のウィンドウの行のセットを絞り込みます。フ
レーム句は ROWS キーワードおよび関連する指定子で構成されます。「ウィンドウ関数の構文の
概要 (p. 327)」を参照してください。
API Version 2012-12-01
332
Amazon Redshift データベース開発者ガイド
ウィンドウ関数
データ型
これらの関数は、Amazon Redshift のデータ型を使用する式をサポートします。戻り値の型は式の型と
同じです。
例
「MIN ウィンドウ関数の例 (p. 348)」を参照してください。
LAG ウィンドウ関数
LAG ウィンドウ関数は、パーティションの現在の行より上(前)の指定されたオフセットの行の値を
返します。
概要
LAG (value_expr [, offset ])
[ IGNORE NULLS | RESPECT NULLS ]
OVER ( [ PARTITION BY window_partition ] ORDER BY window_ordering )
引数
value_expr
関数の対象となる列または式。
offset
値を返す現在の行より前の行数を指定するオプションのパラメータ。オフセットは整数の定数、ま
たは整数を検証する式にすることができます。オフセットを指定していない場合、Amazon Redshift
はデフォルト値として 1 を使用します。0 のオフセットは現在の行を示します。
IGNORE NULLS
Amazon Redshift が使用する行を決定する Null 値をスキップする必要があることを示すオプション
の仕様。IGNORE NULLS がリストされていない場合、Null 値が含まれます。
Note
NVL または COALESCE 式を使用し、Null 値を別の値で置換できます。詳細については、
「NVL 式 (p. 359)」を参照してください。
RESPECT NULLS
Amazon Redshift は使用される行を決定するために Null 値を含める必要があることを示します。
IGNORE NULLS を指定しない場合、RESPECT NULLS はデフォルトでサポートされます。
OVER
ウィンドウのパーティションおよび並び順を指定します。OVER 句にウィンドウフレーム仕様を含
めることはできません。
PARTITION BY window_partition
OVER 句の各グループのレコードの範囲を設定するオプションの引数。
ORDER BY window_ordering
各パーティション内の行をソートします。
LAG ウィンドウ関数は、Amazon Redshift のデータ型を使用する式をサポートします。戻り値の型は
value_expr の型と同じです。
例
「NTH_VALUE ウィンドウ関数の例 (p. 349)」を参照してください。
API Version 2012-12-01
333
Amazon Redshift データベース開発者ガイド
ウィンドウ関数
LEAD ウィンドウ関数
LEAD ウィンドウ関数は、パーティションの現在の行より下(後)の指定されたオフセットの行の値を
返します。
概要
LEAD (value_expr [, offset ])
[ IGNORE NULLS | RESPECT NULLS ]
OVER ( [ PARTITION BY window_partition ] ORDER BY window_ordering )
引数
value_expr
関数の対象となる列または式。
offset
値を返す現在の行より下の行数を指定するオプションのパラメータ。オフセットは整数の定数、ま
たは整数を検証する式にすることができます。オフセットを指定していない場合、Amazon Redshift
はデフォルト値として 1 を使用します。0 のオフセットは現在の行を示します。
IGNORE NULLS
Amazon Redshift が使用する行を決定する Null 値をスキップする必要があることを示すオプション
の仕様。IGNORE NULLS がリストされていない場合、Null 値が含まれます。
Note
NVL または COALESCE 式を使用し、Null 値を別の値で置換できます。詳細については、
「NVL 式 (p. 359)」を参照してください。
RESPECT NULLS
Amazon Redshift は使用される行を決定するために Null 値を含める必要があることを示します。
IGNORE NULLS を指定しない場合、RESPECT NULLS はデフォルトでサポートされます。
OVER
ウィンドウのパーティションおよび並び順を指定します。OVER 句にウィンドウフレーム仕様を含
めることはできません。
PARTITION BY window_partition
OVER 句の各グループのレコードの範囲を設定するオプションの引数。
ORDER BY window_ordering
各パーティション内の行をソートします。
LEAD ウィンドウ関数は、Amazon Redshift のデータ型を使用する式をサポートします。戻り値の型は
value_expr の型と同じです。
例
「LEAD ウィンドウ関数の例 (p. 347)」を参照してください。
MAX ウィンドウ関数
MAX ウィンドウ関数は入力式の最大値を返します。MAX 関数は数値に対してはたらき、NULL 値は無
視します。
API Version 2012-12-01
334
Amazon Redshift データベース開発者ガイド
ウィンドウ関数
概要
MAX ( [ ALL ] expression ) OVER
(
[ PARTITION BY expr_list ]
[ ORDER BY order_list
frame_clause ]
)
引数
expression
関数の対象となる列または式。
ALL
引数 ALL を指定すると、この関数は式から重複する値をすべて保持します。ALL がデフォルトで
す。DISTINCT はサポートされません。
OVER
集計関数に使用するウィンドウ句を指定します。OVER 句は、ウィンドウ集計関数を標準セット集
計関数と区別します。
PARTITION BY expr_list
1 つ以上の式で MAX 関数のウィンドウを定義します。
ORDER BY order_list
各パーティション内の行をソートします。PARTITION BY が指定されていない場合、ORDER BY
はテーブル全体を使用します。
frame_clause
ORDER BY 句が集計関数に使用される場合、明示的なフレーム句が必要です。フレーム句は順序
付けた結果内の行のセットを含めるか除外して、関数のウィンドウの行のセットを絞り込みます。
フレーム句は ROWS キーワードおよび関連する指定子で構成されます。「ウィンドウ関数の構文
の概要 (p. 327)」を参照してください。
データ型
• 数値: SMALLINT、INTEGER、BIGINT、NUMERIC、DECIMAL、REAL、DOUBLE PRECISION
• 文字列: CHAR、VARCHAR
• 日時指定: DATE、TIMESTAMP
MAX 関数でサポートされる戻り値の型は、引数の型と同じです。
例
「MAX ウィンドウ関数の例 (p. 347)」を参照してください。
MIN ウィンドウ関数
MIN ウィンドウ関数は入力式の最小値を返します。MIN 関数は数値に対してはたらき、NULL 値は無視
します。
概要
MIN ( [ ALL ] expression ) OVER
(
[ PARTITION BY expr_list ]
API Version 2012-12-01
335
Amazon Redshift データベース開発者ガイド
ウィンドウ関数
[ ORDER BY order_list
frame_clause ]
)
引数
expression
関数の対象となる列または式。
ALL
引数 ALL を指定すると、この関数は式から重複する値をすべて保持します。ALL がデフォルトで
す。DISTINCT はサポートされません。
OVER
集計関数に使用するウィンドウ句を指定します。OVER 句は、ウィンドウ集計関数を標準セット集
計関数と区別します。
PARTITION BY expr_list
1 つ以上の式で MIN 関数のウィンドウを定義します。
ORDER BY order_list
各パーティション内の行をソートします。PARTITION BY が指定されていない場合、ORDER BY
はテーブル全体を使用します。
frame_clause
ORDER BY 句が集計関数に使用される場合、明示的なフレーム句が必要です。フレーム句は順序
付けた結果内の行のセットを含めるか除外して、関数のウィンドウの行のセットを絞り込みます。
フレーム句は ROWS キーワードおよび関連する指定子で構成されます。「ウィンドウ関数の構文
の概要 (p. 327)」を参照してください。
データ型
• 数値: SMALLINT、INTEGER、BIGINT、NUMERIC、DECIMAL、REAL、DOUBLE PRECISION
• 文字列: CHAR、VARCHAR
• 日時指定: DATE、TIMESTAMP
MIN 関数でサポートされる戻り値の型は、引数の型と同じです。
例
「MIN ウィンドウ関数の例 (p. 348)」を参照してください。
NTH_VALUE ウィンドウ関数
NTH_VALUE ウィンドウ関数は、ウィンドウの最初の行に関連するウィンドウフレームの指定された行
の式の値を返します。
概要
NTH_VALUE (expr, offset)
[ IGNORE NULLS | RESPECT NULLS ]
OVER
( [ PARTITION BY window_partition ]
[ ORDER BY window_ordering
frame_clause ] )
API Version 2012-12-01
336
Amazon Redshift データベース開発者ガイド
ウィンドウ関数
引数
expr
関数の対象となる列または式。
offset
式を返すウィンドウの最初の行に関連する行数を決定します。offset は定数または式にすることが
でき、0 より大きい正の整数である必要があります。
IGNORE NULLS
Amazon Redshift が使用する行を決定する Null 値をスキップする必要があることを示すオプション
の仕様。IGNORE NULLS がリストされていない場合、Null 値が含まれます。
RESPECT NULLS
Amazon Redshift は使用される行を決定するために Null 値を含める必要があることを示します。
IGNORE NULLS を指定しない場合、RESPECT NULLS はデフォルトでサポートされます。
OVER
ウィンドウのパーティション、並び順、およびウィンドウフレームを指定します。
PARTITION BY window_partition
OVER 句のグループごとにレコードの範囲を設定します。
ORDER BY window_ordering
各パーティション内の行をソートします。ORDER BY が省略される場合、デフォルトのフレーム
はパーティションのすべての行から構成されます。
frame_clause
ORDER BY 句が集計関数に使用される場合、明示的なフレーム句が必要です。フレーム句は順序
付けた結果の行のセットを含めるか除外して、関数のウィンドウの行のセットを絞り込みます。フ
レーム句は ROWS キーワードおよび関連する指定子で構成されます。「ウィンドウ関数の構文の
概要 (p. 327)」を参照してください。
NTH_VALUE ウィンドウ関数は、Amazon Redshift のデータ型を使用する式をサポートします。戻り値
の型は expr の型と同じです。
例
「NTH_VALUE ウィンドウ関数の例 (p. 349)」を参照してください。
NTILE ウィンドウ関数
NTILE ウィンドウ関数は、パーティションの順序付けされた行を可能な限り同じサイズの指定されたラ
ンク付けグループの数に分割し、任意の行を分類するグループを返します。
概要
NTILE (expr)
OVER ( [ PARTITION BY window_partition ] ORDER BY window_ordering )
引数
expr
ランク付けグループの数を定義し、パーティションごとに正の整数値(0 より大きい)になる必要
があります。expr 引数は Null を使用することはできません。
OVER
ウィンドウのパーティションおよび並び順を指定します。OVER 句にウィンドウフレーム仕様を含
めることはできません。
PARTITION BY window_partition
OVER 句の各グループのレコードの範囲を設定するオプションの引数。
API Version 2012-12-01
337
Amazon Redshift データベース開発者ガイド
ウィンドウ関数
ORDER BY window_ordering
各パーティション内の行をソートします。
NTILE ウィンドウ関数は BIGINT 引数の型をサポートし、BIGINT 値を返します。
例
「NTILE ウィンドウ関数の例 (p. 350)」を参照してください。
RANK ウィンドウ関数
RANK ウィンドウ関数は、OVER 句の ORDER BY 式に基づいて、値のグループの値のランクを決定し
ます。オプションの PARTITION BY 句がある場合、ランク付けは行のグループごとにリセットされま
す。ランク付け条件が同じ値の行は、同じランクを受け取ります。Amazon Redshift は関連付けられた
行数を関連付けられたランクに追加し、次のランクを計算します。そのため、ランクは連続番号でない
場合があります。例えば、2 行が 1 位にランク付けされると、次のランクは 3 位になります。
同じクエリに PARTITION BY および ORDER BY 句のあるランク付け関数を使用することができます。
概要
RANK () OVER
(
[ PARTITION BY expr_list ]
ORDER BY order_list
)
引数
()
RANK 関数は引数を取得しませんが、空のかっこを指定する必要があります。
OVER
ウィンドウ句を RANK 関数に指定します。
PARTITION BY expr_list
1 つ以上の式で RANK 関数のウィンドウを定義します。
ORDER BY order_list
ランク付けの値が基とする列を定義します。PARTITION BY が指定されていない場合、ORDER
BY はテーブル全体を使用します。RANK 関数には ORDER BY が必要です。
データ型
RANK 関数でサポートされる戻り値の型は INTEGER です。
例
「RANK ウィンドウ関数の例 (p. 350)」を参照してください。
STDDEV_SAMP および STDDEV_POP ウィンドウ関数
STDDEV_SAMP および STDDEV_POP ウィンドウ関数は、数値のセットの標本標準偏差および母集団
標準偏差を返します(整数、10 進数、または浮動小数点)。STDDEV_SAMP および STDDEV_POP
関数 (p. 317)も参照してください。
STDDEV_SAMP および STDDEV は、同じ関数のシノニムです。
API Version 2012-12-01
338
Amazon Redshift データベース開発者ガイド
ウィンドウ関数
概要
STDDEV_SAMP | STDDEV | STDDEV_POP
( [ ALL ] expression ) OVER
(
[ PARTITION BY expr_list ]
[ ORDER BY order_list
frame_clause ]
)
引数
expression
関数の対象となる列または式。
ALL
引数 ALL を指定すると、この関数は式から重複する値をすべて保持します。ALL がデフォルトで
す。DISTINCT はサポートされません。
OVER
集計関数に使用するウィンドウ句を指定します。OVER 句は、ウィンドウ集計関数を標準セット集
計関数と区別します。
PARTITION BY expr_list
1 つ以上の式で関数のウィンドウを定義します。
ORDER BY order_list
各パーティション内の行をソートします。PARTITION BY が指定されていない場合、ORDER BY
はテーブル全体を使用します。
frame_clause
ORDER BY 句が集計関数に使用される場合、明示的なフレーム句が必要です。フレーム句は順序
付けた結果内の行のセットを含めるか除外して、関数のウィンドウの行のセットを絞り込みます。
フレーム句は ROWS キーワードおよび関連する指定子で構成されます。「ウィンドウ関数の構文
の概要 (p. 327)」を参照してください。
データ型
STDDEV 関数でサポートされる引数の型は、SMALLINT、INTEGER、BIGINT、NUMERIC、DECIMAL、
REAL、および DOUBLE PRECISION です。
式のデータ型にかかわらず、STDDEV 関数の戻り値の型は倍精度浮動小数点数です。
SUM ウィンドウ関数
SUM ウィンドウ関数は入力列または式の値の合計を返します。SUM 関数は数値に対してはたらき、
NULL 値を無視します。
概要
SUM ( [ ALL ] expression ) OVER
(
[ PARTITION BY expr_list ]
[ ORDER BY order_list
frame_clause ]
)
API Version 2012-12-01
339
Amazon Redshift データベース開発者ガイド
ウィンドウ関数
引数
expression
関数の対象となる列または式。
ALL
引数 ALL を指定すると、この関数は式から重複する値をすべて保持します。ALL がデフォルトで
す。DISTINCT はサポートされません。
OVER
集計関数に使用するウィンドウ句を指定します。OVER 句は、ウィンドウ集計関数を標準セット集
計関数と区別します。
PARTITION BY expr_list
1 つ以上の式で SUM 関数のウィンドウを定義します。
ORDER BY order_list
各パーティション内の行をソートします。PARTITION BY が指定されていない場合、ORDER BY
はテーブル全体を使用します。
frame_clause
ORDER BY 句が集計関数に使用される場合、明示的なフレーム句が必要です。フレーム句は順序
付けた結果内の行のセットを含めるか除外して、関数のウィンドウの行のセットを絞り込みます。
フレーム句は ROWS キーワードおよび関連する指定子で構成されます。「ウィンドウ関数の構文
の概要 (p. 327)」を参照してください。
データ型
SUM 関数でサポートされる引数の型は、SMALLINT、INTEGER、BIGINT、NUMERIC、DECIMAL、
REAL、および DOUBLE PRECISION です。
SUM 関数でサポートされる戻り値の型は次のとおりです。
• SMALLINT または INTEGER 引数の場合は BIGINT
• BIGINT 引数の場合は NUMERIC
• 浮動小数点の引数の場合は DOUBLE PRECISION
例
「SUM ウィンドウ関数の例 (p. 352)」を参照してください。
VAR_SAMP および VAR_POP ウィンドウ関数
VAR_SAMP および VAR_POP ウィンドウ関数は、数値のセットの標本分散および母集団分散を返しま
す(整数、10 進数、または浮動小数点)。VAR_SAMP および VAR_POP 関数 (p. 319)も参照してくだ
さい。
VAR_SAMP および VARIANCE は同じ関数のシノニムです。
概要
VAR_SAMP | VARIANCE | VAR_POP
( [ ALL ] expression ) OVER
(
[ PARTITION BY expr_list ]
[ ORDER BY order_list
frame_clause ]
)
API Version 2012-12-01
340
Amazon Redshift データベース開発者ガイド
ウィンドウ関数
引数
expression
関数の対象となる列または式。
ALL
引数 ALL を指定すると、この関数は式から重複する値をすべて保持します。ALL がデフォルトで
す。DISTINCT はサポートされません。
OVER
集計関数に使用するウィンドウ句を指定します。OVER 句は、ウィンドウ集計関数を標準セット集
計関数と区別します。
PARTITION BY expr_list
1 つ以上の式で関数のウィンドウを定義します。
ORDER BY order_list
各パーティション内の行をソートします。PARTITION BY が指定されていない場合、ORDER BY
はテーブル全体を使用します。
frame_clause
ORDER BY 句が集計関数に使用される場合、明示的なフレーム句が必要です。フレーム句は順序
付けた結果内の行のセットを含めるか除外して、関数のウィンドウの行のセットを絞り込みます。
フレーム句は ROWS キーワードおよび関連する指定子で構成されます。「ウィンドウ関数の構文
の概要 (p. 327)」を参照してください。
データ型
VARIANCE 関数でサポートされる引数の型は、SMALLINT、INTEGER、BIGINT、NUMERIC、
DECIMAL、REAL、および DOUBLE PRECISION です。
式のデータ型にかかわらず、VARIANCE 関数の戻り値の型は倍精度浮動小数点数です。
ウィンドウ関数の例
Topics
• AVG ウィンドウ関数の例 (p. 342)
• COUNT ウィンドウ関数の例 (p. 342)
• DENSE_RANK ウィンドウ関数の例 (p. 343)
• FIRST_VALUE および LAST_VALUE ウィンドウ関数の例 (p. 344)
• LAG ウィンドウ関数の例 (p. 346)
• LEAD ウィンドウ関数の例 (p. 347)
• MAX ウィンドウ関数の例 (p. 347)
• MIN ウィンドウ関数の例 (p. 348)
• NTH_VALUE ウィンドウ関数の例 (p. 349)
• NTILE ウィンドウ関数の例 (p. 350)
• RANK ウィンドウ関数の例 (p. 350)
• STDDEV_POP および VAR_POP ウィンドウ関数の例 (p. 352)
• SUM ウィンドウ関数の例 (p. 352)
• ウィンドウ関数用データの一意の並び順 (p. 354)
このセクションでは、ウィンドウ関数を使用した例を示します。
このセクションのウィンドウ関数の例は、次のような 11 行が含まれる WINSALES という名前のテー
ブルを使用します。
API Version 2012-12-01
341
Amazon Redshift データベース開発者ガイド
ウィンドウ関数
SALESID
DATEID
SELLERID
BUYERID
QTY
QTY_SHIPPED
30001
8/2/2003
3
B
10
10
10001
12/24/2003
1
C
10
10
10005
12/24/2003
1
A
30
40001
1/9/2004
4
A
40
10006
1/18/2004
1
C
10
20001
2/12/2004
2
B
20
20
40005
2/12/2004
4
A
10
10
20002
2/16/2004
2
C
20
20
30003
4/18/2004
3
B
15
30004
4/18/2004
3
B
20
30007
9/7/2004
3
C
30
AVG ウィンドウ関数の例
日付で販売数のローリング平均を計算します。次のように日付 ID および販売 ID によって結果は順序付
けられます。
select salesid, dateid, sellerid, qty,
avg(qty) over
(order by dateid, salesid rows unbounded preceding) as avg
from winsales
order by 2,1;
salesid |
dateid
| sellerid | qty | avg
---------+------------+----------+-----+----30001 | 2003-08-02 |
3 | 10 | 10
10001 | 2003-12-24 |
1 | 10 | 10
10005 | 2003-12-24 |
1 | 30 | 16
40001 | 2004-01-09 |
4 | 40 | 22
10006 | 2004-01-18 |
1 | 10 | 20
20001 | 2004-02-12 |
2 | 20 | 20
40005 | 2004-02-12 |
4 | 10 | 18
20002 | 2004-02-16 |
2 | 20 | 18
30003 | 2004-04-18 |
3 | 15 | 18
30004 | 2004-04-18 |
3 | 20 | 18
30007 | 2004-09-07 |
3 | 30 | 19
(11 rows)
COUNT ウィンドウ関数の例
データウィンドウの最初から販売 ID、数量、すべての行のカウントを示します。
select salesid, qty,
count(*) over (order by salesid rows unbounded preceding) as count
from winsales
API Version 2012-12-01
342
Amazon Redshift データベース開発者ガイド
ウィンドウ関数
order by salesid;
salesid | qty | count
---------+-----+----10001 | 10 |
1
10005 | 30 |
2
10006 | 10 |
3
20001 | 20 |
4
20002 | 20 |
5
30001 | 10 |
6
30003 | 15 |
7
30004 | 20 |
8
30007 | 30 |
9
40001 | 40 |
10
40005 | 10 |
11
(11 rows)
データウィンドウの最初から販売 ID、数量、非 Null 行のカウントを示します。(WINSALES テーブル
の QTY_SHIPPED 列には NULL が含まれます)
select salesid, qty, qty_shipped,
count(qty_shipped)
over (order by salesid rows unbounded preceding) as count
from winsales
order by salesid;
salesid | qty | qty_shipped | count
---------+-----+-------------+------10001 | 10 |
10 |
1
10005 | 30 |
|
1
10006 | 10 |
|
1
20001 | 20 |
20 |
2
20002 | 20 |
20 |
3
30001 | 10 |
10 |
4
30003 | 15 |
|
4
30004 | 20 |
|
4
30007 | 30 |
|
4
40001 | 40 |
|
4
40005 | 10 |
10 |
5
(11 rows)
DENSE_RANK ウィンドウ関数の例
ORDER BY による密値のランク付け
販売数量によってテーブルを順序付けして(降順)、各行に密値のランクと標準のランクの両方を割り
当てます。結果はウィンドウ関数の結果が提供された後にソートされます。
select salesid, qty,
dense_rank() over(order by qty desc) as d_rnk,
rank() over(order by qty desc) as rnk
from winsales
order by 2,1;
salesid | qty | d_rnk | rnk
---------+-----+-------+-----
API Version 2012-12-01
343
Amazon Redshift データベース開発者ガイド
ウィンドウ関数
10001 | 10
10006 | 10
30001 | 10
40005 | 10
30003 | 15
20001 | 20
20002 | 20
30004 | 20
10005 | 30
30007 | 30
40001 | 40
(11 rows)
|
|
|
|
|
|
|
|
|
|
|
5
5
5
5
4
3
3
3
2
2
1
|
|
|
|
|
|
|
|
|
|
|
8
8
8
8
7
4
4
4
2
2
1
DENSE_RANK および RANK 関数が同じクエリで並べて使用される場合、同じ行のセットに割り当て
るランク付けの違いに注意してください。
PARTITION BY および ORDER BY による密値のランク付け
SELLERID によってテーブルのパーティションで分割し、数量によって各パーティションを順序付けし
て(降順)、行ごとに密値のランクを割り当てます。結果はウィンドウ関数の結果が提供された後に
ソートされます。
select salesid, sellerid, qty,
dense_rank() over(partition by sellerid order by qty desc) as d_rnk
from winsales
order by 2,3,1;
salesid | sellerid | qty | d_rnk
---------+----------+-----+------10001 |
1 | 10 |
2
10006 |
1 | 10 |
2
10005 |
1 | 30 |
1
20001 |
2 | 20 |
1
20002 |
2 | 20 |
1
30001 |
3 | 10 |
4
30003 |
3 | 15 |
3
30004 |
3 | 20 |
2
30007 |
3 | 30 |
1
40005 |
4 | 10 |
2
40001 |
4 | 40 |
1
(11 rows)
FIRST_VALUE および LAST_VALUE ウィンドウ関数の例
次の例は、収容能力によって順序付けられた結果(高から低)で、VENUE テーブルの各会場の座席数
を返します。FIRST_VALUE 関数は、フレームの最初の行(この場合、最高座席数の行)に対応する会
場名を選択するために使用されます。結果は州によってパーティションで分割されるため、VENUESTATE
値が変更されると、新しい最初の値が選択されます。ウィンドウフレームはバインドされていないた
め、同じ最初の値が各パーティションの行ごとに選択されます。
カリフォルニアでは、Qualcomm Stadium が最高座席数(70561)であるため、この名前は CA パー
ティションのすべての行に対する最初の値です。
select venuestate, venueseats, venuename,
first_value(venuename)
over(partition by venuestate
API Version 2012-12-01
344
Amazon Redshift データベース開発者ガイド
ウィンドウ関数
order by venueseats desc
rows between unbounded preceding and unbounded following)
from (select * from venue where venueseats >0)
order by venuestate;
venuestate | venueseats |
venuename
|
first_value
------------+------------+--------------------------------+----------------------------CA
|
70561 | Qualcomm Stadium
| Qualcomm Stadium
CA
|
69843 | Monster Park
| Qualcomm Stadium
CA
|
63026 | McAfee Coliseum
| Qualcomm Stadium
CA
|
56000 | Dodger Stadium
| Qualcomm Stadium
CA
|
45050 | Angel Stadium of Anaheim
| Qualcomm Stadium
CA
|
42445 | PETCO Park
| Qualcomm Stadium
CA
|
41503 | AT&T Park
| Qualcomm Stadium
CA
|
22000 | Shoreline Amphitheatre
| Qualcomm Stadium
CO
|
76125 | INVESCO Field
| INVESCO Field
CO
|
50445 | Coors Field
| INVESCO Field
DC
|
41888 | Nationals Park
| Nationals Park
FL
|
74916 | Dolphin Stadium
| Dolphin Stadium
FL
|
73800 | Jacksonville Municipal Stadium | Dolphin Stadium
FL
|
65647 | Raymond James Stadium
| Dolphin Stadium
FL
|
36048 | Tropicana Field
| Dolphin Stadium
...
次の例では、FIRST_VALUE の代わりに LAST_VALUE 関数を使用します。それ以外の場合は、クエリ
は前の例と同じです。カリフォルニアでは、Shoreline Amphitheatre の座席数が一番低い(22000)
ため、この値がパーティションのすべての行に返されます。
select venuestate, venueseats, venuename,
last_value(venuename)
over(partition by venuestate
order by venueseats desc
rows between unbounded preceding and unbounded following)
from (select * from venue where venueseats >0)
order by venuestate;
venuestate | venueseats |
venuename
|
last_value
------------+------------+--------------------------------+----------------------------CA
|
70561 | Qualcomm Stadium
| Shoreline Amphitheatre
CA
|
69843 | Monster Park
| Shoreline Amphitheatre
CA
|
63026 | McAfee Coliseum
| Shoreline Amphitheatre
CA
|
56000 | Dodger Stadium
| Shoreline Amphitheatre
CA
|
45050 | Angel Stadium of Anaheim
| Shoreline Amphitheatre
CA
|
42445 | PETCO Park
| Shoreline Amphitheatre
CA
|
41503 | AT&T Park
| Shoreline Amphitheatre
CA
|
22000 | Shoreline Amphitheatre
| Shoreline Amphitheatre
CO
|
76125 | INVESCO Field
| Coors Field
CO
|
50445 | Coors Field
| Coors Field
DC
|
41888 | Nationals Park
| Nationals Park
FL
|
74916 | Dolphin Stadium
| Tropicana Field
FL
|
73800 | Jacksonville Municipal Stadium | Tropicana Field
FL
|
65647 | Raymond James Stadium
| Tropicana Field
FL
|
36048 | Tropicana Field
| Tropicana Field
...
API Version 2012-12-01
345
Amazon Redshift データベース開発者ガイド
ウィンドウ関数
次の例は IGNORE NULLS オプションの使用を示し、VENUE テーブルに追加する新しい行に依存しま
す。
insert into venue values(2000,null,'Stanford','CA',90000);
この新しい行には、VENUENAME 列に Null 値が含まれます。このセクションの前に示した FIRST_VALUE
クエリを繰り返し実行します。
select venuestate, venueseats, venuename,
first_value(venuename)
over(partition by venuestate
order by venueseats desc
rows between unbounded preceding and unbounded following)
from (select * from venue where venueseats >0)
order by venuestate;
venuestate | venueseats |
venuename
| first_value
------------+------------+----------------------------+------------CA
|
90000 |
|
CA
|
70561 | Qualcomm Stadium
|
CA
|
69843 | Monster Park
|
...
新しい行には最も高い VENUESEATS 値(90000)が含まれ、その VENUENAME は Null であるため、
FIRST_VALUE 関数は CA パーティションに Null を返します。関数式のこのような行を無視するには、
IGNORE NULLS オプションを関数の引数に追加します。
select venuestate, venueseats, venuename,
first_value(venuename ignore nulls)
over(partition by venuestate
order by venueseats desc
rows between unbounded preceding and unbounded following)
from (select * from venue where venuestate='CA')
order by venuestate;
venuestate | venueseats |
venuename
|
first_value
------------+------------+----------------------------+-----------------CA
|
90000 |
| Qualcomm Stadium
CA
|
70561 | Qualcomm Stadium
| Qualcomm Stadium
CA
|
69843 | Monster Park
| Qualcomm Stadium
...
LAG ウィンドウ関数の例
次の例は、購入者 ID 3 の購入者に販売されたチケット数と購入者 3 がチケットを購入した時刻を示し
ます。購入者 3 の以前の販売と各販売を比較するには、クエリは販売ごとに以前の販売数を返します。
2008 年 1 月 16 日より前に購入されていないため、最初の以前の販売数は Null です。
select buyerid, saletime, qtysold,
lag(qtysold,1) over (order by buyerid, saletime) as prev_qtysold
from sales where buyerid = 3 order by buyerid, saletime;
buyerid |
saletime
| qtysold | prev_qtysold
---------+---------------------+---------+-------------3 | 2008-01-16 01:06:09 |
1 |
API Version 2012-12-01
346
Amazon Redshift データベース開発者ガイド
ウィンドウ関数
3 |
3 |
3 |
3 |
3 |
3 |
3 |
3 |
3 |
3 |
3 |
(12
2008-01-28
2008-03-12
2008-03-13
2008-03-29
2008-04-27
2008-08-16
2008-08-22
2008-09-12
2008-10-01
2008-10-20
2008-10-28
rows)
02:10:01
10:39:53
02:56:07
08:21:39
02:39:01
07:04:37
11:45:26
09:11:25
06:22:37
01:55:51
01:30:40
|
|
|
|
|
|
|
|
|
|
|
1
1
1
2
1
2
2
1
1
2
1
|
|
|
|
|
|
|
|
|
|
|
1
1
1
1
2
1
2
2
1
1
2
LEAD ウィンドウ関数の例
次の例は、チケットが 2008 年 1 月 1 日および 2008 年 1 月 2 日に販売された SALES テーブルのイベ
ントに手数料、および次の販売のチケット販売に支払った手数料を示します。
select eventid, commission, saletime,
lead(commission, 1) over (order by saletime) as next_comm
from sales where saletime between '2008-01-01 00:00:00' and '2008-01-02 12:59:59'
order by saletime;
eventid | commission |
saletime
| next_comm
---------+------------+---------------------+----------6213 |
52.05 | 2008-01-01 01:00:19 |
106.20
7003 |
106.20 | 2008-01-01 02:30:52 |
103.20
8762 |
103.20 | 2008-01-01 03:50:02 |
70.80
1150 |
70.80 | 2008-01-01 06:06:57 |
50.55
1749 |
50.55 | 2008-01-01 07:05:02 |
125.40
8649 |
125.40 | 2008-01-01 07:26:20 |
35.10
2903 |
35.10 | 2008-01-01 09:41:06 |
259.50
6605 |
259.50 | 2008-01-01 12:50:55 |
628.80
6870 |
628.80 | 2008-01-01 12:59:34 |
74.10
6977 |
74.10 | 2008-01-02 01:11:16 |
13.50
4650 |
13.50 | 2008-01-02 01:40:59 |
26.55
4515 |
26.55 | 2008-01-02 01:52:35 |
22.80
5465 |
22.80 | 2008-01-02 02:28:01 |
45.60
5465 |
45.60 | 2008-01-02 02:28:02 |
53.10
7003 |
53.10 | 2008-01-02 02:31:12 |
70.35
4124 |
70.35 | 2008-01-02 03:12:50 |
36.15
1673 |
36.15 | 2008-01-02 03:15:00 |
1300.80
...
(39 rows)
MAX ウィンドウ関数の例
データウィンドウの最初から販売 ID、最大数を示します。
select salesid, qty,
max(qty) over (order by salesid rows unbounded preceding) as max
from winsales
order by salesid;
salesid | qty | max
API Version 2012-12-01
347
Amazon Redshift データベース開発者ガイド
ウィンドウ関数
---------+-----+----10001 | 10 | 10
10005 | 30 | 30
10006 | 10 | 30
20001 | 20 | 30
20002 | 20 | 30
30001 | 10 | 30
30003 | 15 | 30
30004 | 20 | 30
30007 | 30 | 30
40001 | 40 | 40
40005 | 10 | 40
(11 rows)
制限されたフレームで販売 ID、数量、および最大数を示します。
select salesid, qty,
max(qty) over (order by salesid rows between 2 preceding and 1 preceding) as
max
from winsales
order by salesid;
salesid | qty | max
---------+-----+----10001 | 10 |
10005 | 30 | 10
10006 | 10 | 30
20001 | 20 | 30
20002 | 20 | 20
30001 | 10 | 20
30003 | 15 | 20
30004 | 20 | 15
30007 | 30 | 20
40001 | 40 | 30
40005 | 10 | 40
(11 rows)
MIN ウィンドウ関数の例
データウィンドウの最初から販売 ID、最小数を示します。
select salesid, qty,
min(qty) over
(order by salesid rows unbounded preceding)
from winsales
order by salesid;
salesid | qty | min
---------+-----+----10001 | 10 | 10
10005 | 30 | 10
10006 | 10 | 10
20001 | 20 | 10
20002 | 20 | 10
30001 | 10 | 10
30003 | 15 | 10
API Version 2012-12-01
348
Amazon Redshift データベース開発者ガイド
ウィンドウ関数
30004 | 20
30007 | 30
40001 | 40
40005 | 10
(11 rows)
|
|
|
|
10
10
10
10
制限されたフレームで販売 ID、数量、および最小数を示します。
select salesid, qty,
min(qty) over
(order by salesid rows between 2 preceding and 1 preceding) as min
from winsales
order by salesid;
salesid | qty | min
---------+-----+----10001 | 10 |
10005 | 30 | 10
10006 | 10 | 10
20001 | 20 | 10
20002 | 20 | 10
30001 | 10 | 20
30003 | 15 | 10
30004 | 20 | 10
30007 | 30 | 15
40001 | 40 | 20
40005 | 10 | 30
(11 rows)
NTH_VALUE ウィンドウ関数の例
次の例は、州のその他の会場の座席数を比較して、カリフォルニア、フロリダ、およびニューヨークで
3 番目に大きい会場の座席数を示しています。
select venuestate, venuename, venueseats,
nth_value(venueseats, 3)
ignore nulls
over(partition by venuestate order by venueseats desc
rows between unbounded preceding and unbounded following)
as third_most_seats
from (select * from venue where venueseats > 0 and
venuestate in('CA', 'FL', 'NY'))
order by venuestate;
venuestate |
venuename
| venueseats | third_most_seats
------------+--------------------------------+------------+-----------------CA
| Qualcomm Stadium
|
70561 |
63026
CA
| Monster Park
|
69843 |
63026
CA
| McAfee Coliseum
|
63026 |
63026
CA
| Dodger Stadium
|
56000 |
63026
CA
| Angel Stadium of Anaheim
|
45050 |
63026
CA
| PETCO Park
|
42445 |
63026
CA
| AT&T Park
|
41503 |
63026
CA
| Shoreline Amphitheatre
|
22000 |
63026
FL
| Dolphin Stadium
|
74916 |
65647
FL
| Jacksonville Municipal Stadium |
73800 |
65647
API Version 2012-12-01
349
Amazon Redshift データベース開発者ガイド
ウィンドウ関数
FL
FL
NY
NY
NY
(15 rows)
|
|
|
|
|
Raymond James Stadium
Tropicana Field
Ralph Wilson Stadium
Yankee Stadium
Madison Square Garden
|
|
|
|
|
65647
36048
73967
52325
20000
|
|
|
|
|
65647
65647
20000
20000
20000
NTILE ウィンドウ関数の例
次の例は、2008 年 8 月 26 日に Hamlet のチケットに支払った価格を 4 つのランクグループにランク付
けします。結果セットは 17 行であり、1 位から 4 位のランク付けにほぼ均等に分割されます。
select eventname, caldate, pricepaid, ntile(4)
over(order by pricepaid desc) from sales, event, date
where sales.eventid=event.eventid and event.dateid=date.dateid and eventname='Ham
let'
and caldate='2008-08-26'
order by 4;
eventname | caldate
| pricepaid | ntile
-----------+------------+-----------+------Hamlet
| 2008-08-26 |
1883.00 |
1
Hamlet
| 2008-08-26 |
1065.00 |
1
Hamlet
| 2008-08-26 |
589.00 |
1
Hamlet
| 2008-08-26 |
530.00 |
1
Hamlet
| 2008-08-26 |
472.00 |
1
Hamlet
| 2008-08-26 |
460.00 |
2
Hamlet
| 2008-08-26 |
355.00 |
2
Hamlet
| 2008-08-26 |
334.00 |
2
Hamlet
| 2008-08-26 |
296.00 |
2
Hamlet
| 2008-08-26 |
230.00 |
3
Hamlet
| 2008-08-26 |
216.00 |
3
Hamlet
| 2008-08-26 |
212.00 |
3
Hamlet
| 2008-08-26 |
106.00 |
3
Hamlet
| 2008-08-26 |
100.00 |
4
Hamlet
| 2008-08-26 |
94.00 |
4
Hamlet
| 2008-08-26 |
53.00 |
4
Hamlet
| 2008-08-26 |
25.00 |
4
(17 rows)
RANK ウィンドウ関数の例
ORDER BY によるランク付け
販売数量でテーブルで順序付けして(デフォルトは昇順)、行ごとにランクを割り当てます。結果は
ウィンドウ関数の結果が適用された後にソートされます。
select salesid, qty,
rank() over (order by qty) as rnk
from winsales
order by 2,1;
salesid | qty | rnk
--------+-----+----10001 | 10 | 1
API Version 2012-12-01
350
Amazon Redshift データベース開発者ガイド
ウィンドウ関数
10006 | 10
30001 | 10
40005 | 10
30003 | 15
20001 | 20
20002 | 20
30004 | 20
10005 | 30
30007 | 30
40001 | 40
(11 rows)
|
|
|
|
|
|
|
|
|
|
1
1
1
5
6
6
6
9
9
11
この例の ORDER BY 句の外側には、Amazon Redshift がこのクエリが実行されるごとにソートされた
結果を一貫して返すように、列 2 および 1 が含まれることに注意してください。例えば、販売 ID 10001
および 10006 の行は、QTY と RNK の値が同じです。列 1 によって最終的な結果セットを順序付ける
と、行 10001 は常に 10006 の前になります。
PARTITION BY および ORDER BY によるランク付け
この例では、並び順はウィンドウ関数(order by qty desc)で逆順にされます。最高の QTY 値に
最高ランクの値が適用されます。
select salesid, qty,
rank() over (order by qty desc) as rnk
from winsales
order by 2,1;
salesid | qty | rnk
---------+-----+----10001 | 10 |
8
10006 | 10 |
8
30001 | 10 |
8
40005 | 10 |
8
30003 | 15 |
7
20001 | 20 |
4
20002 | 20 |
4
30004 | 20 |
4
10005 | 30 |
2
30007 | 30 |
2
40001 | 40 |
1
(11 rows)
SELLERID によってテーブルをパーティションで分割し、数量で各パーティションを順序付けして(降
順)、行ごとにランクを割り当てます。結果はウィンドウ関数の結果が提供された後にソートされま
す。
select salesid, sellerid, qty, rank() over
(partition by sellerid
order by qty desc) as rnk
from winsales
order by 2,3,1;
salesid | sellerid | qty | rnk
--------+----------+-----+----10001 |
1 | 10 | 2
10006 |
1 | 10 | 2
API Version 2012-12-01
351
Amazon Redshift データベース開発者ガイド
ウィンドウ関数
10005 |
20001 |
20002 |
30001 |
30003 |
30004 |
30007 |
40005 |
40001 |
(11 rows)
1
2
2
3
3
3
3
4
4
|
|
|
|
|
|
|
|
|
30
20
20
10
15
20
30
10
40
|
|
|
|
|
|
|
|
|
1
1
1
4
3
2
1
2
1
STDDEV_POP および VAR_POP ウィンドウ関数の例
次の例は、ウィンドウ関数として STDDEV_POP および VAR_POP 関数をどのように使用するかを示
します。このクエリは SALES テーブルの PRICEPAID に母集団分散と母集団標準偏差を計算します。
select salesid, dateid, pricepaid,
round(stddev_pop(pricepaid) over
(order by dateid, salesid rows unbounded preceding)) as stddevpop,
round(var_pop(pricepaid) over
(order by dateid, salesid rows unbounded preceding)) as varpop
from sales
order by 2,1;
salesid | dateid | pricepaid | stddevpop | varpop
---------+--------+-----------+-----------+--------33095 |
1827 |
234.00 |
0 |
0
65082 |
1827 |
472.00 |
119 |
14161
88268 |
1827 |
836.00 |
248 |
61283
97197 |
1827 |
708.00 |
230 |
53019
110328 |
1827 |
347.00 |
223 |
49845
110917 |
1827 |
337.00 |
215 |
46159
150314 |
1827 |
688.00 |
211 |
44414
157751 |
1827 |
1730.00 |
447 | 199679
165890 |
1827 |
4192.00 |
1185 | 1403323
...
標本標準偏差および標本分散の関数は同様に使用することができます。
SUM ウィンドウ関数の例
累積合計(中間結果)
日付 ID および販売 ID によって順序付けされた販売数量の累積(中間)合計を作成します。
select salesid, dateid, sellerid, qty,
sum(qty) over (order by dateid, salesid rows unbounded preceding) as sum
from winsales
order by 2,1;
salesid |
dateid
| sellerid | qty | sum
---------+------------+----------+-----+----30001 | 2003-08-02 |
3 | 10 | 10
10001 | 2003-12-24 |
1 | 10 | 20
10005 | 2003-12-24 |
1 | 30 | 50
40001 | 2004-01-09 |
4 | 40 | 90
API Version 2012-12-01
352
Amazon Redshift データベース開発者ガイド
ウィンドウ関数
10006 | 2004-01-18
20001 | 2004-02-12
40005 | 2004-02-12
20002 | 2004-02-16
30003 | 2004-04-18
30004 | 2004-04-18
30007 | 2004-09-07
(11 rows)
|
|
|
|
|
|
|
1
2
4
2
3
3
3
|
|
|
|
|
|
|
10
20
10
20
15
20
30
|
|
|
|
|
|
|
100
120
130
150
165
185
215
販売者 ID で結果をパーティションで分割し、パーティション内の日付と販売 ID によって結果を順序付
けした日付による販売数量の累積(中間)合計を作成します。
select salesid, dateid, sellerid, qty,
sum(qty) over (partition by sellerid
order by dateid, salesid rows unbounded preceding) as sum
from winsales
order by 2,1;
salesid |
dateid
| sellerid | qty | sum
---------+------------+----------+-----+----30001 | 2003-08-02 |
3 | 10 | 10
10001 | 2003-12-24 |
1 | 10 | 10
10005 | 2003-12-24 |
1 | 30 | 40
40001 | 2004-01-09 |
4 | 40 | 40
10006 | 2004-01-18 |
1 | 10 | 50
20001 | 2004-02-12 |
2 | 20 | 20
40005 | 2004-02-12 |
4 | 10 | 50
20002 | 2004-02-16 |
2 | 20 | 40
30003 | 2004-04-18 |
3 | 15 | 25
30004 | 2004-04-18 |
3 | 20 | 45
30007 | 2004-09-07 |
3 | 30 | 75
(11 rows)
行に連番をつける
SELLERID および SALESID 列によって順序付けられた結果セットのすべての行に番号をつけます。
select salesid, sellerid, qty,
sum(1) over (order by sellerid, salesid rows unbounded preceding) as rownum
from winsales
order by 2,1;
salesid | sellerid | qty | rownum
--------+----------+------+-------10001 |
1 |
10 |
1
10005 |
1 |
30 |
2
10006 |
1 |
10 |
3
20001 |
2 |
20 |
4
20002 |
2 |
20 |
5
30001 |
3 |
10 |
6
30003 |
3 |
15 |
7
30004 |
3 |
20 |
8
30007 |
3 |
30 |
9
40001 |
4 |
40 |
10
40005 |
4 |
10 |
11
(11 rows)
API Version 2012-12-01
353
Amazon Redshift データベース開発者ガイド
ウィンドウ関数
SELLERID ごとに結果をパーティション分割し、パーティション内の SELLERID および SALESID 列
によって結果を順序付けた結果セットの行すべてに番号をつけます。
select salesid, sellerid, qty,
sum(1) over (partition by sellerid
order by sellerid, salesid rows unbounded preceding) as rownum
from winsales
order by 2,1;
salesid | sellerid | qty | rownum
---------+----------+-----+-------10001 |
1 | 10 |
1
10005 |
1 | 30 |
2
10006 |
1 | 10 |
3
20001 |
2 | 20 |
1
20002 |
2 | 20 |
2
30001 |
3 | 10 |
1
30003 |
3 | 15 |
2
30004 |
3 | 20 |
3
30007 |
3 | 30 |
4
40001 |
4 | 40 |
1
40005 |
4 | 10 |
2
(11 rows)
ウィンドウ関数用データの一意の並び順
ウィンドウ関数の ORDER BY 句がデータの一意および全体の並び順を生成しない場合、行の順序は不
明確です。ORDER BY 式が重複した値(部分的な順序付け)を生成する場合、これらの行の戻り値の
順序は実行時によって異なる可能性があり、ウィンドウ関数は予期しない結果または矛盾した結果を返
す可能性があります。
例えば、次のクエリでは、order by dateid が SUM ウィンドウ関数のデータで一意の並び順を生成
しないため、実行時によって異なる結果を返します。
select dateid, pricepaid,
sum(pricepaid) over(order by dateid rows unbounded preceding) as sumpaid
from sales
group by dateid, pricepaid;
dateid | pricepaid |
sumpaid
--------+-----------+------------1827 |
1730.00 |
1730.00
1827 |
708.00 |
2438.00
1827 |
234.00 |
2672.00
...
select dateid, pricepaid,
sum(pricepaid) over(order by dateid rows unbounded preceding) as sumpaid
from sales
group by dateid, pricepaid;
dateid | pricepaid |
sumpaid
--------+-----------+------------1827 |
234.00 |
234.00
1827 |
472.00 |
706.00
1827 |
347.00 |
1053.00
...
API Version 2012-12-01
354
Amazon Redshift データベース開発者ガイド
条件式
この場合、2 番目の ORDER BY 列をウィンドウ関数に追加すると問題を解決できる場合があります。
select dateid, pricepaid,
sum(pricepaid) over(order by dateid, pricepaid rows unbounded preceding) as
sumpaid
from sales
group by dateid, pricepaid;
dateid | pricepaid | sumpaid
--------+-----------+--------1827 |
234.00 | 234.00
1827 |
337.00 | 571.00
1827 |
347.00 | 918.00
...
条件式
Topics
• CASE 式 (p. 355)
• COALESCE (p. 357)
• DECODE 式 (p. 357)
• NVL 式 (p. 359)
• NULLIF 式 (p. 360)
Amazon Redshift は SQL 標準の式である条件式をサポートします。
CASE 式
構文
CASE 式は条件式であり、他の言語で検出される if/then/else ステートメントと同様です。複数の条件
がある場合、CASE は結果を指定するために使用されます。
2 種類の CASE 式(簡易および検索)があります。
簡易 CASE 式では、式は値と比較されます。一致が検出された場合、THEN 句で指定されたアクショ
ンが適用されます。一致が検出されない場合、ELSE 句のアクションが適用されます。
検索 CASE 式では、CASE ごとにブール式に基づいて検証され、CASE ステートメントは最初を満た
す CASE を返します。WHEN 句を満たす CASE が検出されない場合、ELSE 句のアクションが返され
ます。
条件を満たすために使用される簡易 CASE ステートメント
CASE expression
WHEN value THEN result
[WHEN...]
[ELSE result]
END
各条件を検証するために使用する検索 CASE ステートメント
API Version 2012-12-01
355
Amazon Redshift データベース開発者ガイド
条件式
CASE
WHEN boolean condition THEN result
[WHEN ...]
[ELSE result]
END
引数
expression
列名または有効な式。
値
数値定数または文字列などの式を比較する値。
result
式またはブール条件が検証されるときに返されるターゲット値または式。
ブール条件
値が定数と等しい場合、ブール条件は有効または true となります。true の場合、後続の THEN 句
に指定された結果を返します。条件が false の場合、後続の ELSE 句に指定された結果を返しま
す。ELSE 句が省略され、一致する条件がない場合、結果は Null となります。
例
簡易 CASE 式を使用し、VENUE テーブルに対するクエリで New York City を Big Apple に置換し
ます。その他すべての都市名を other に置換します。
select venuecity,
case venuecity
when 'New York City'
then 'Big Apple' else 'other'
end from venue
order by venueid desc;
venuecity
|
case
-----------------+----------Los Angeles
| other
New York City
| Big Apple
San Francisco
| other
Baltimore
| other
...
(202 rows)
検索 CASE 式を使用し、それぞれのチケット販売の PRICEPAID 値に基づいてグループ番号を割り当
てます。
select pricepaid,
case when pricepaid <10000 then 'group 1'
when pricepaid >10000 then 'group 2'
else 'group 3'
end from sales
order by 1 desc;
pricepaid | case
-----------+--------12624.00 | group 2
10000.00 | group 3
API Version 2012-12-01
356
Amazon Redshift データベース開発者ガイド
条件式
10000.00 | group 3
9996.00 | group 1
9988.00 | group 1
...
(172456 rows)
COALESCE
NVL 式のシノニム。
「NVL 式 (p. 359)」を参照してください。
DECODE 式
DECODE 式は、等価条件の結果に応じて、特定の値を別の特定の値またはデフォルト値で置換します。
この演算は簡易 CASE 式または IF-THEN-ELSE ステートメントの演算と同じです。
概要
DECODE ( expression, search, result [, search, result ]... [ ,default ] )
この式の型は、レポートに必要である有効なビジネス価値で、テーブルに保存される略名またはコード
を置換するために役に立ちます。
パラメータ
expression
テーブルの列など、比較する値のソース。
検索
数値または文字列などのソース式に対して比較されるターゲット値。検索式の結果は単一の固定値
である必要があります。値の範囲(age between 20 and 29 など)を検証する式を指定するこ
とはできません。置換する値ごとに個別の検索/結果のペアを指定する必要があります。
検索式のすべてのインスタンスのデータ型は、同じまたは互換性がある必要があります。式および
検索パラメータも互換性のある必要があります。
result
式が検索値を満たす場合、クエリが返す置換値。DECODE 式に少なくとも 1 の検索/結果のペアを
含める必要があります。
結果式のすべてのインスタンスのデータ型は同じまたは互換性がある必要があります。結果および
デフォルトパラメータも互換性のある必要があります。
デフォルト
検索条件が失敗する場合に、ケースに使用されるオプションのデフォルト値。デフォルト値を指定
していない場合、DECODE 式は Null を返します。
使用に関する注意事項
式の値および検索の値が両方 Null の場合、DECODE 結果は対応する結果の値です。「例」のセクショ
ンを参照してください。
例
値 2008-06-01 が DATETABLE の START_DATE 列に存在する場合、これを June 1st, 2008 に置
換します。その他すべての START_DATE を Null に置換します。
API Version 2012-12-01
357
Amazon Redshift データベース開発者ガイド
条件式
select decode(caldate, '2008-06-01', 'June 1st, 2008')
from date where month='JUN' order by caldate;
case
---------------June 1st, 2008
...
(30 rows)
DECODE 式を使用して、CATEGORY テーブルの 5 つの省略された CATNAME 列を完全名に変換しま
す。列の他の値を Unknown に変換します。
select catid, decode(catname,
'NHL', 'National Hockey League',
'MLB', 'Major League Baseball',
'MLS', 'Major League Soccer',
'NFL', 'National Football League',
'NBA', 'National Basketball Association',
'Unknown')
from category
order by catid;
catid | case
-------+--------------------------------1 | Major League Baseball
2 | National Hockey League
3 | National Football League
4 | National Basketball Association
5 | Major League Soccer
6 | Unknown
7 | Unknown
8 | Unknown
9 | Unknown
10 | Unknown
11 | Unknown
(11 rows)
DECODE 式を使用して、VENUESEATS 列が Null のコロラドとネバダの会場を検索して、Null をゼロ
に変換します。VENUESEATS 列が Null でない場合、結果として 1 を返します。
select venuename, venuestate, decode(venueseats,null,0,1)
from venue
where venuestate in('NV','CO')
order by 2,3,1;
venuename
| venuestate | case
---------------------------+------------+-----Coors Field
| CO
| 1
Dick's Sporting Goods Park | CO
| 1
Ellie Caulkins Opera House | CO
| 1
INVESCO Field
| CO
| 1
Pepsi Center
| CO
| 1
Ballys Hotel
| NV
| 0
Bellagio Hotel
| NV
| 0
Caesars Palace
| NV
| 0
API Version 2012-12-01
358
Amazon Redshift データベース開発者ガイド
条件式
Harrahs Hotel
Hilton Hotel
...
(20 rows)
| NV
| NV
| 0
| 0
NVL 式
NVL 式は COALESCE 式と同じです。NVL および COALESCE はシノニムです。
概要
NVL | COALESCE ( expression, expression, ... )
NVL または COALESCE 式は、Null ではないリストの最初の式の値を返します。式がすべて Null の場
合、結果は Null です。非 Null の値が検出された場合、リストの残りの式は検証されません。
参照する値がないか Null の場合に何かにバックアップ値を返す際に、この式の型は役に立ちます。例
えば、クエリは 3 つの電話番号(携帯、自宅、職場の順)のうち、いずれかテーブルで最初に検出され
た 1 つを返す可能性があります(Null でない)。
例
START_DATE および END_DATE 列でテーブルを作成し、Null 値を含む行を挿入して、NVL 式をその
2 列に適用します。
create table datetable (start_date date, end_date date);
insert into datetable values ('2008-06-01','2008-12-31');
insert into datetable values (null,'2008-12-31');
insert into datetable values ('2008-12-31',null);
select nvl(start_date, end_date)
from datetable
order by 1;
coalesce
-----------2008-06-01
2008-12-31
2008-12-31
NVL 式のデフォルトの列名は COALESCE です。次のクエリは同じ結果を返します。
select coalesce(start_date, end_date)
from datetable
order by 1;
特定の関数または列に Null 値を返すクエリが予想される場合、NVL 式を使用して Null を他の値に置換
できます。例えば、SUM などの集計関数は検証する行がない場合に、ゼロの代わりに Null 値を返しま
す。NVL 式を使用し、これらの Null 値を 0.0 で置換できます。
API Version 2012-12-01
359
Amazon Redshift データベース開発者ガイド
条件式
select nvl(sum(sales), 0.0) as sumresult, ...
NULLIF 式
概要
NULLIF 式は 2 つの引数を比較し、引数が等しい場合に Null を返します。引数が等しくない場合、最初
の引数が返されます。この式は NVL または COALESCE 式の逆です。
NULLIF ( expression1, expression2 )
引数
expression1, expression2
比較されるターゲット列または式。戻り値の型は最初の式の型と同じです。NULLIF の結果のデ
フォルトの列名は、最初の式の列名です。
例
次の例に示すクエリは、LISTID および SALESID 値が一致する場合に Null を返します。
select nullif(listid,salesid), salesid
from sales where salesid<10 order by 1, 2 desc;
listid | salesid
--------+--------4 |
2
5 |
4
5 |
3
6 |
5
10 |
9
10 |
8
10 |
7
10 |
6
|
1
(9 rows)
NULLIF を使用し、空の文字列が常に Null として返されるようにします。以下の例では、NULLIF 式は
Null 値または少なくとも 1 文字を含む文字列のどちらかを返します。
insert into category
values(0,'','Special','Special');
select nullif(catgroup,'') from category
where catdesc='Special';
catgroup
---------null
(1 row)
NULLIF は末尾のスペースを無視します。文字列が空ではないけれどもスペースが含まれる場合も、
NULLIF は Null を返します。
API Version 2012-12-01
360
Amazon Redshift データベース開発者ガイド
日付関数
create table nulliftest(c1 char(2), c2 char(2));
insert into nulliftest values ('a','a ');
insert into nulliftest values ('b','b');
select nullif(c1,c2) from nulliftest;
c1
-----null
null
(2 rows)
日付関数
Topics
• ADD_MONTHS(Oracle 互換性関数) (p. 361)
• AGE 関数 (p. 363)
• CONVERT_TIMEZONE 関数 (p. 363)
• CURRENT_DATE および TIMEOFDAY 関数 (p. 365)
• CURRENT_TIME および CURRENT_TIMESTAMP 関数 (p. 366)
• DATE_CMP 関数 (p. 367)
• DATE_CMP_TIMESTAMP 関数 (p. 368)
• DATE_PART_YEAR 関数 (p. 368)
• DATEADD 関数 (p. 369)
• DATEDIFF 関数 (p. 371)
• DATE_PART 関数 (p. 372)
• DATE_TRUNC 関数 (p. 374)
• EXTRACT 関数 (p. 374)
• GETDATE() (p. 375)
• INTERVAL_CMP 関数 (p. 376)
• ISFINITE 関数 (p. 377)
•
•
•
•
LOCALTIME および LOCALTIMESTAMP 関数 (p. 378)
NOW 関数 (p. 379)
SYSDATE(Oracle 互換性関数) (p. 379)
TIMESTAMP_CMP 関数 (p. 380)
• TIMESTAMP_CMP_DATE 関数 (p. 382)
• TRUNC(timestamp) (p. 383)
• 日時指定関数の日付部分 (p. 383)
このセクションには、Amazon Redshift がサポートする日付と時刻のスカラー関数が含まれます。
ADD_MONTHS(Oracle 互換性関数)
ADD_MONTHS 関数は、指定された月数を日付の値または式に追加します。DATEADD 関数は同様の
機能を提供します。
API Version 2012-12-01
361
Amazon Redshift データベース開発者ガイド
日付関数
概要
ADD_MONTHS ( date, num_months )
引数
date
暗黙的にタイムスタンプに変換する日時の式または任意の値。date がその月の最終日である場合、
または結果の月が短い場合、関数は結果に月の最終日を返します。その他の日付の場合、結果には
date 式と同じ日数が含まれます。
num_months
正または負の整数、または暗黙的に整数に変換される任意の値。負の数を使用し、日付から月を削
除します。
戻り型
ADD_MONTHS は TIMESTAMP を返します。
例
次のクエリは、TRUNC 関数内の ADD_MONTHS 関数を使用します。TRUNC 関数は、ADD_MONTHS
の結果から日付の時刻を削除します。ADD_MONTHS 関数は CALDATE 列の値ごとに 12 か月を追加し
ます。
select distinct trunc(add_months(caldate, 12)) as calplus12,
trunc(caldate) as cal
from date
order by 1 asc;
calplus12 |
cal
------------+-----------2009-01-01 | 2008-01-01
2009-01-02 | 2008-01-02
2009-01-03 | 2008-01-03
...
(365 rows)
次の例は、ADD_MONTHS 関数が異なる日数の月を持つ日付で実行される動作を示しています。
select add_months('2008-03-31',1);
add_months
--------------------2008-04-30 00:00:00
(1 row)
select add_months('2008-04-30',1);
add_months
--------------------2008-05-31 00:00:00
(1 row)
API Version 2012-12-01
362
Amazon Redshift データベース開発者ガイド
日付関数
AGE 関数
AGE 関数はタイムスタンプから現在の日付の午前 0 時までの間隔、または 2 つのタイムスタンプ間の
経過時間の間隔を返します。
構文
Note
これはリーダーノード関数です。この関数は、ユーザー作成テーブル、STL または STV シス
テムテーブル、SVV または SVL システムビューを参照する場合、エラーを返します。
AGE(timestamp [, timestamp ])
引数
タイムスタンプ
タイムスタンプから現在の日付の午前 0 時までの間隔を返す場合の単一のタイムスタンプ、または
2 つのタイムスタンプ間の経過時間を返す場合の最初のタイムスタンプ。
タイムスタンプ
2 つのタイムスタンプ間の経過時間を返す場合の 2 番目のタイムスタンプ。
戻り型
AGE 関数は INTERVAL を返します。
例
次の例は現在の日付のタイムスタンプと午前 0 時の間の時刻の間隔を返します。
select age(timestamp '1956-07-10 12:42:05');
age
---------------------------------55 years 4 mons 19 days 11:17:55
(1 row)
次の例は 2 つのタイムスタンプ間の時刻の間隔を返します。
select age(timestamp '1998-07-28 04:05:11', timestamp '2011-09-22 12:33:33');
age
--------------------------------------13 years -1 mons -25 days -08:28:22
(1 row)
CONVERT_TIMEZONE 関数
CONVERT_TIMEZONE 関数は、タイムスタンプのタイムゾーンを別のタイムゾーンに変換します。
構文
CONVERT_TIMEZONE ( ['source_zone',] 'target_zone', 'timestamp')
API Version 2012-12-01
363
Amazon Redshift データベース開発者ガイド
日付関数
引数
source_timezone
(オプション)現在のタイムスタンプのタイムゾーン。デフォルトは UTC です。
target_timezone
新しいタイムスタンプのタイムゾーン。
タイムスタンプ
変換されるタイムスタンプ値。
source_timezone または target_timezone のいずれかをタイムゾーン名('Africa/Kampala' または
'Singapore' など)またはタイムゾーンの略名('UTC' or 'PDT' など)として指定できます。
タイムゾーン名を使用してタイムゾーンを指定する場合、CONVERT_TIMEZONE は自動的に夏時間
(DST)、または 'timestamp' によって指定される日付と時刻で有効なその他の現地の季節の慣習(サ
マータイム、標準時、冬時間)を調整します。例えば、'Europe/London' は冬季は UTC、夏季は UTC+1
で表します。
タイムゾーンの略名は、UTC からの固定オフセットを表します。タイムゾーンの略名を使用してタイ
ムゾーンを指定する場合、CONVERT_TIMEZONE は UTC からの固定オフセットを使用し、現地の季
節の慣習を調整しません。例えば、ADT(大西洋夏時間)は冬季も常に UTC-03 を示します。
サポートされるタイムゾーン名および略名のリストについては、「付録: タイムゾーンの名前と省略
形 (p. 580)」を参照してください。
戻り型
CONVERT_TIMEZONE は TIMESTAMP を返します。
例
次の例は LISTTIME 列のタイムスタンプ値をデフォルトの UTC タイムゾーンから PST に変換します。
タイムスタンプが夏時間の期間内であっても、対象のタイムゾーンが略名(PST)として指定されてい
るため、標準時間に変換されます。
select listtime, convert_timezone('PST', listtime) from listing
where listid = 16;
listtime
|
convert_timezone
--------------------+--------------------2008-08-24 09:36:12 2008-08-24 01:36:12
次の例は、タイムスタンプの LISTTIME 列をデフォルトの UTC タイムゾーンから US/Pacific タイム
ゾーンに変換します。対象のタイムゾーンはタイムゾーン名を使用し、タイムスタンプが夏時間の期間
内であるため、関数は夏時間を返します。
select listtime, convert_timezone('US/Pacific', listtime) from listing
where listid = 16;
listtime
|
convert_timezone
--------------------+--------------------2008-08-24 09:36:12 2008-08-24 02:36:12
次の例はタイムスタンプの文字列を EST から PST に変換します。
API Version 2012-12-01
364
Amazon Redshift データベース開発者ガイド
日付関数
select convert_timezone('EST', 'PST', '20080305 12:25:29');
convert_timezone
------------------2008-03-05 09:25:29
次の例は、対象のタイムゾーンがタイムゾーン名(America/New_York)を使用し、タイムスタンプが
標準時間の期間内にあるため、タイムスタンプを米国東部標準時に変換します。
select convert_timezone('America/New_York', '2013-02-01 08:00:00');
convert_timezone
--------------------2013-02-01 03:00:00
(1 row)
次の例は、対象のタイムゾーンがタイムゾーン名(America/New_York)を使用し、タイムスタンプが
夏時間の期間内にあるため、タイムスタンプを米国東部夏時間に変換します。
select convert_timezone('America/New_York', '2013-06-01 08:00:00');
convert_timezone
--------------------2013-06-01 04:00:00
(1 row)
CURRENT_DATE および TIMEOFDAY 関数
CURRENT_DATE および TIMEOFDAY 関数は、日付/時刻の値を返すために使用される特別なエイリア
スです。
構文
CURRENT_DATE
TIMEOFDAY()
戻り型
• CURRENT_DATE はデフォルトの形式(YYYY-MM-DD)で日付を返します。
• TIMEOFDAY() は VARCHAR データ型を返し、曜日、日付、および時刻を指定します。
例
現在の日付を返します。
select current_date;
date
-----------2008-10-01
(1 row)
API Version 2012-12-01
365
Amazon Redshift データベース開発者ガイド
日付関数
TIMEOFDAY 関数を使用して、現在の日付と時刻を返します。
select timeofday();
timeofday
-----------Thu Sep 19 22:53:50.333525 2013 UTC
(1 row)
CURRENT_TIME および CURRENT_TIMESTAMP 関数
CURRENT_TIME および CURRENT_TIMESTAMP 関数は、現在の取引の開始時刻を返します。
構文
Note
これはリーダーノード関数です。この関数は、ユーザー作成テーブル、STL または STV シス
テムテーブル、SVV または SVL システムビューを参照する場合、エラーを返します。
CURRENT_TIME [ (precision) ]
CURRENT_TIMESTAMP [ (precision) ]
オプションの精度パラメータを CURRENT_TIME および CURRENT_TIMESTAMP 関数に追加できま
す。これは指定する桁数の 2 番目のフィールドの結果を四捨五入します。
戻り型
CURRENT_TIME 関数はデフォルト形式のタイムゾーンで現在の時刻を返します。
CURRENT_TIMESTAMP 関数はデフォルト形式のタイムゾーンで現在の日付と時刻を返します。
例
次の例は少数点以下の桁数がある、または少数点以下の桁数がない現在の時刻を返します。
select current_time;
timetz
-----------15:43:41.229380-07
(1 row)
select current_time(2);
timetz
-----------15:43:41.23-07
(1 row)
次の例は少数点以下の桁数がある、または少数点以下の桁数がない現在のタイムスタンプを返します。
select current_timestamp(3);
timestamptz
API Version 2012-12-01
366
Amazon Redshift データベース開発者ガイド
日付関数
-----------2008-10-01 15:48:42.301-07
(1 row)
select current_timestamp;
timestamptz
-----------2008-10-01 15:48:42.301004-07
(1 row)
DATE_CMP 関数
2 つの日付の値を比較し、整数を返します。日付が同一の場合、0 を返します。1 番目の日付が「大き
い」場合、1 を返します。2 番目の日付が「大きい」場合、-1 を返します。
概要
DATE_CMP(date1, date2)
引数
date1
1 番目の入力パラメータは DATE です。
date2
2 番目の入力パラメータは DATE です。
戻り型
DATE_CMP 関数は整数を返します。
例
次のクエリは CALDATE 列を 2008 年 1 月 4 日の日付を比較し、CALDATE の値が 2008 年 1 月 4 日よ
り前(-1)、同じ(0)、または後(1)であるかを返します。
select caldate, '2008-01-04',
date_cmp(caldate,'2008-01-04')
from date
order by dateid
limit 10;
caldate
| ?column? | date_cmp
------------+------------+---------2008-01-01 | 2008-01-04 |
-1
2008-01-02 | 2008-01-04 |
-1
2008-01-03 | 2008-01-04 |
-1
2008-01-04 | 2008-01-04 |
0
2008-01-05 | 2008-01-04 |
1
2008-01-06 | 2008-01-04 |
1
2008-01-07 | 2008-01-04 |
1
2008-01-08 | 2008-01-04 |
1
2008-01-09 | 2008-01-04 |
1
API Version 2012-12-01
367
Amazon Redshift データベース開発者ガイド
日付関数
2008-01-10 | 2008-01-04 |
(10 rows)
1
DATE_CMP_TIMESTAMP 関数
日付の値と指定されたタイムスタンプを比較し、整数を返します。日付がアルファベット順で「大き
い」場合、1 を返します。タイムスタンプが「大きい」場合、-1 を返します。日付とタイムスタンプが
同じ場合、0 を返します。
概要
TIMESTAMP_CMP_DATE(date, timestamp)
引数
date1
1 番目の入力パラメータは DATE です。
date2
2 番目のパラメータは TIMESTAMP WITHOUT TIMEZONE です。
戻り型
DATE_CMP_TIMESTAMP 関数は整数を返します。
例
次の例は日付 2008-06-18 と LISTTIME を比較します。この日付が 1 を返す前に作成されたリスト、
この日付が -1 を返した後に作成されたリスト。
select listid, '2008-06-18', listtime,
date_cmp_timestamp('2008-06-18', listtime)
from listing
order by 1, 2, 3, 4
limit 10;
listid | ?column? |
listtime
| date_cmp_timestamp
--------+------------+---------------------+-------------------1 | 2008-06-18 | 2008-01-24 06:43:29 |
1
2 | 2008-06-18 | 2008-03-05 12:25:29 |
1
3 | 2008-06-18 | 2008-11-01 07:35:33 |
-1
4 | 2008-06-18 | 2008-05-24 01:18:37 |
1
5 | 2008-06-18 | 2008-05-17 02:29:11 |
1
6 | 2008-06-18 | 2008-08-15 02:08:13 |
-1
7 | 2008-06-18 | 2008-11-15 09:38:15 |
-1
8 | 2008-06-18 | 2008-11-09 05:07:30 |
-1
9 | 2008-06-18 | 2008-09-09 08:03:36 |
-1
10 | 2008-06-18 | 2008-06-17 09:44:54 |
1
(10 rows)
DATE_PART_YEAR 関数
DATE_PART_YEAR 関数は日付から年を抽出します。
API Version 2012-12-01
368
Amazon Redshift データベース開発者ガイド
日付関数
概要
DATE_PART_YEAR(date)
引数
date
入力パラメータは DATE です。
戻り型
DATE_PART_YEAR 関数は整数を返します。
例
次の例は CALDATE 列から年を抽出します。
select caldate, date_part_year(caldate)
from date
order by
dateid limit 10;
caldate
| date_part_year
------------+---------------2008-01-01 |
2008
2008-01-02 |
2008
2008-01-03 |
2008
2008-01-04 |
2008
2008-01-05 |
2008
2008-01-06 |
2008
2008-01-07 |
2008
2008-01-08 |
2008
2008-01-09 |
2008
2008-01-10 |
2008
(10 rows)
DATEADD 関数
1 つの日付部分および 1 つの式とすると、この関数は日時の値を指定された間隔ずつ増やします。
概要
DATEADD ( datepart, interval, expression )
この関数はタイムスタンプのデータ型を返します。
引数
datepart
関数が実行される日付の値(例:年、月、または日)の特定部分。「日時指定関数の日付部分(p.383)」
を参照してください。
API Version 2012-12-01
369
Amazon Redshift データベース開発者ガイド
日付関数
interval
ターゲット式に追加する増分(例えば、日数)を定義する整数。日付の値から間隔を減算した負の
整数。
expression
関数の対象となる列または式。式は指定された日付部分を含む日時の式である必要があります。
戻り型
DATEADD は TIMESTAMP WITHOUT TIMEZONE を返します。
例
DATE テーブルに存在する 11 月の各日付に 30 日追加します。
select dateadd(day,30,caldate) as novplus30
from date
where month='NOV'
order by dateid;
novplus30
--------------------2008-12-01 00:00:00
2008-12-02 00:00:00
2008-12-03 00:00:00
...
(30 rows)
日付リテラル値に 18 か月追加します。
select dateadd(month,18,'2008-02-28');
date_add
--------------------2009-08-28 00:00:00
(1 row)
DATEADD 関数でのデフォルトの列名は DATE_ADD です。日付の値に使用するデフォルトのタイムス
タンプは 00:00:00 です。
タイムスタンプを指定しない日付の値に 30 分追加します。
select dateadd(m,30,'2008-02-28');
date_add
--------------------2008-02-28 00:30:00
(1 row)
完全名または略名の日付部分に名前を付けることができます。この場合、m は月(month)ではなく分
(minute)を表します。
使用に関する注意事項
DATEADD(month, ...) および ADD_MONTHS 関数は、異なる月末になる日付を処理します。
API Version 2012-12-01
370
Amazon Redshift データベース開発者ガイド
日付関数
• ADD_MONTHS: 追加している日付が月の最終日である場合、結果は月の期間にかかわらず、常に結
果の月の最終日になります。例えば、4 月 30 日 + 1 か月は 5 月 31 日になります。
select add_months('2008-04-30',1);
add_months
--------------------2008-05-31 00:00:00
(1 row)
• DATEADD: 追加している日付が結果の月より短い場合、結果は月の最終日ではなく、結果の月の対
応する日付になります。例えば、4 月 30 日 + 1 か月は 5 月 30 日になります。
select dateadd(month,1,'2008-04-30');
date_add
--------------------2008-05-30 00:00:00
(1 row)
DATEDIFF 関数
2 つのターゲット式と 1 つの日付部分とすると、この関数は 2 つの式の間の差を返します。
概要
DATEDIFF ( datepart, expression, expression )
引数
datepart
関数が実行される日付の値(例:年、月、または日)の特定部分。「日時指定関数の日付部分(p.383)」
を参照してください。特に、DATEDIFF は 2 つの式の間で越える日付部分の境界の数を決定しま
す。例えば、2 つの日付(12-31-2008 と 01-01-2009)の間で年数の差を計算する場合、実際の
これらの日付には 1 日の違いしかありませんが、関数は 1 年を返します。2 つのタイムスタンプ
(01-01-2009 8:30:00 と 01-01-2009 10:00:00)の間で時間の差が分かっている場合は、
結果は 2 時間となります。
expression
関数が実行されるターゲット列または式。式は日時の式である必要があり、両方に指定された日付
部分が含まれている必要があります。
戻り型
DATEDIFF は整数を返します。
例
2 つの日付リテラル値の間の差(週単位)を取得します。
select datediff(week,'2009-01-01','2009-12-31') as numweeks;
API Version 2012-12-01
371
Amazon Redshift データベース開発者ガイド
日付関数
numweeks
---------52
(1 row)
過去のリテラル値と今日の日付の間の差(四半期単位)を取得します。この例では、現在の日付を 2008
年 6 月 5 日とします。完全名または略名で日付部分に名前を付けることができます。DATEDIFF 関数
のデフォルトの列名は DATE_DIFF です。
select datediff(qtr, '1998-07-01', current_date);
date_diff
----------40
(1 row)
この例は、SALES テーブルと LISTING テーブルを結合し、リスト 1000 から 1005 に対してチケット
をリストしてから何日後に販売されたかを計算します。これらのリストの販売を最長の待機期間は 15
日であり、最小は 1 日より短いです(0 日)。
select priceperticket,
datediff(day, listtime, saletime) as wait
from sales, listing where sales.listid = listing.listid
and sales.listid between 1000 and 1005
order by wait desc, priceperticket desc;
priceperticket | wait
----------------+-----96.00 |
15
123.00 |
11
131.00 |
9
123.00 |
6
129.00 |
4
96.00 |
4
96.00 |
0
(7 rows)
この例は、販売者が任意およびすべてのチケット販売を待機する平均時間を計算します。
select avg(datediff(hours, listtime, saletime)) as avgwait
from sales, listing
where sales.listid = listing.listid;
avgwait
--------465
(1 row)
DATE_PART 関数
この関数は式から日付部分の値を抽出します。PGDATE_PART 関数のシノニム。
API Version 2012-12-01
372
Amazon Redshift データベース開発者ガイド
日付関数
概要
DATE_PART ( datepart, expression )
引数
datepart
関数が実行される日付の値(例:年、月、または日)の特定部分。「日時指定関数の日付部分(p.383)」
を参照してください。
expression
関数の対象となる列または式。式は指定された日付部分を含む日時の式である必要があります。
戻り型
DATE_PART は DOUBLE PRECISION の数を返します。
例
DATE_PART 関数をテーブルの列に適用します。
select date_part(w, listtime) as weeks, listtime
from listing where listid=10;
weeks |
listtime
-------+--------------------25 | 2008-06-17 09:44:54
(1 row)
完全名または略名の日付部分に名前を付けることができます。この場合、w は週(week)を表します。
dow(曜日)とともに DATE_PART を使用し、土曜のイベントを表示します。(DOW は 0 から 6 の
整数を返します)
select date_part(dow, starttime) as dow,
starttime from event
where date_part(dow, starttime)=6
order by 2,1;
dow |
starttime
-----+--------------------6 | 2008-01-05 14:00:00
6 | 2008-01-05 14:00:00
6 | 2008-01-05 14:00:00
6 | 2008-01-05 14:00:00
...
(1147 rows)
DATE_PART 関数を日付リテラル値に適用します。
select date_part(minute, '2009-01-01 02:08:01');
pgdate_part
-------------
API Version 2012-12-01
373
Amazon Redshift データベース開発者ガイド
日付関数
8
(1 row)
DATE_PART 関数のデフォルトの列名は PGDATE_PART です。
DATE_TRUNC 関数
DATE_TRUNC 関数は、指定する時間間隔に基づいたタイムスタンプの式またはリテラル(時、週、月
など)を切り捨てます。切り捨てとは、タイムスタンプが年に指定した年の初め、月に指定した月の初
めなどまで減らすことです。
概要
DATE_TRUNC('field', source)
引数
field
タイムスタンプの値を切り捨てる有効桁数を指定する 1 番目のパラメータ。有効な形式について
は、「日時指定関数の日付部分 (p. 383)」を参照してください。
source
2 番目のパラメータはタイムスタンプ値または式です。
戻り型
DATE_TRUNC 関数はタイムスタンプを返します。
例
次の販売テーブルのクエリは、販売取引が発生した時刻を示す saletime 列を使用します。クエリは販
売が発生した週によってグループ化された 2008 年 9 月のすべての取引における販売の合計を検索しま
す。
select date_trunc('week', saletime), sum(pricepaid) from sales where
saletime like '2008-09%' group by date_trunc('week', saletime) order by 1;
date_trunc
|
sum
---------------------+-----------2008-09-01 00:00:00 | 2474899.00
2008-09-08 00:00:00 | 2412354.00
2008-09-15 00:00:00 | 2364707.00
2008-09-22 00:00:00 | 2359351.00
2008-09-29 00:00:00 | 705249.00
(5 rows)
EXTRACT 関数
EXTRACT 関数は、タイムスタンプの値または式から日付部分(日、月、年など)を返します。
API Version 2012-12-01
374
Amazon Redshift データベース開発者ガイド
日付関数
概要
EXTRACT ( datepart FROM
{ TIMESTAMP 'literal' | timestamp }
)
引数
datepart
「日時指定関数の日付部分 (p. 383)」を参照してください。
literal
引用句で囲まれ、TIMESTAMP キーワードが先行するタイムスタンプ値。
timestamp
タイムスタンプ列または式。
戻り型
EXTRACT は DOUBLE PRECISION の数を返します。
例
支払価格が 10,000 ドル以上であった販売の週の数を判定します。
select salesid, extract(week from saletime) as weeknum
from sales where pricepaid > 9999 order by 2;
salesid | weeknum
---------+--------159073 |
6
160318 |
8
161723 |
26
(3 rows)
タイムスタンプリテラル値から分の値を返します。
select extract(minute from timestamp '2009-09-09 12:08:43');
date_part
----------8
(1 row)
GETDATE()
GETDATE はリーダーノードのシステムクロックに従って、現在の日付と時刻を返します。
• GETDATE() 関数は SYSDATE 関数と同様です。ただし、GETDATE() はその戻り値にマイクロ秒が
含まれません。
• 関数 CURRENT_DATE および TRUNC(GETDATE()) は同じ結果を生成します。
API Version 2012-12-01
375
Amazon Redshift データベース開発者ガイド
日付関数
概要
GETDATE()
かっこが必要です。
戻り型
GETDATE は TIMESTAMP を返します。
例
次の例は GETDATE() 関数を使用し、現在の日付の完全なタイムスタンプを返します。
select getdate();
timestamp
--------------------2008-12-04 16:10:43
(1 row)
次の例は TRUNC 関数内の GETDATE() 関数を使用し、時刻のない現在の日付を返します。
select trunc(getdate());
trunc
-----------2008-12-04
(1 row)
INTERVAL_CMP 関数
2 つの間隔を比較します。最初の間隔の方が大きい場合は 1 を返し、2 番目の間隔の方が大きい場合は
-1 を返し、間隔が等しい場合は 0 を返します。
構文
INTERVAL_CMP(interval1, interval2)
引数
interval1
最初の入力パラメータは INTERVAL です。
interval2
2 番目の入力パラメータは INTERVAL です。
戻り型
INTERVAL_CMP 関数は整数を返します。
API Version 2012-12-01
376
Amazon Redshift データベース開発者ガイド
日付関数
例
次の例は「3 日」と「1 年」の値を比較しています。
select interval_cmp('3 days','1 year');
interval_cmp
--------------1
この例は「7 日」と「1 週」の値を比較しています。
select interval_cmp('7 days','1 week');
interval_cmp
-------------0
(1 row)
ISFINITE 関数
ISFINITE 関数は、日付、タイムスタンプ、または間隔が有限数かどうかを決定します。
構文
Note
これはリーダーノード関数です。この関数は、ユーザー作成テーブル、STL または STV シス
テムテーブル、SVV または SVL システムビューを参照する場合、エラーを返します。
ISFINITE([ date date | timestamp timestamp | interval interval ])
引数
date
日付が有限かどうかを決定する場合の日付。
タイムスタンプ
タイムスタンプが有限かどうかを決定する場合のタイムスタンプ。
interval
間隔が有限かどうかを決定する場合の間隔。
戻り型
ISFINITE 関数は BOOLEAN を返します。
例
次の例は、日付の 2012 年 1 月 1 日が有限数かどうかを問い合わせます。
select isfinite(date '2012-01-01');
isfinite
----------
API Version 2012-12-01
377
Amazon Redshift データベース開発者ガイド
日付関数
t
(1 row)
次の例は、タイムスタンプが有限数かどうかを問い合わせます。
select isfinite(timestamp '2008-07-06 12:45:08');
isfinite
---------t
(1 row)
次の例は、間隔が有限数かどうかを問い合わせます。
select isfinite(interval '12673 hours');
isfinite
---------t
(1 row)
LOCALTIME および LOCALTIMESTAMP 関数
概要
LOCALTIME および LOCALTIMESTAMP 関数は、タイムゾーンのない現在の現地時刻を返します。
LOCALTIME [ (precision) ]
LOCALTIMESTAMP [ (precision) ]
引数
有効桁数(オプション)
返ってきたタイムスタンプを四捨五入するために使用する有効桁数を指定している整数。
戻り型
LOCALTIME および LOCALTIMESTAMP は、TIMESTAMP WITHOUT TIMEZONE を返します。
例
有効桁数ありおよび有効桁数なしの現地時間を示します。
select localtime;
time
----------------13:38:39.036675
(1 row)
select localtime(2);
time
API Version 2012-12-01
378
Amazon Redshift データベース開発者ガイド
日付関数
------------13:38:39.04
(1 row)
有効桁数ありおよび有効桁数なしの現地のタイムスタンプを示します。
select localtimestamp;
timestamp
-----------2008-10-08 13:41:34.359875
(1 row)
select localtimestamp(3);
timestamp
-----------2008-10-08 13:41:34.359
(1 row)
NOW 関数
NOW 関数は現在のステートメントの開始時刻を返します。NOW 関数はパラメータを取得しません。
構文
Note
これはリーダーノード関数です。この関数は、ユーザー作成テーブル、STL または STV シス
テムテーブル、SVV または SVL システムビューを参照する場合、エラーを返します。
NOW()
戻り型
NOW 関数はタイムゾーンで TIMESTAMP を返します。
例
次の例はステートメントの開始時刻を返します。
select now();
now
------------------------------2011-11-30 15:55:12.214919-08
(1 row)
SYSDATE(Oracle 互換性関数)
SYSDATE はリーダーノードのシステムクロックに従って、現在の日付と時刻を返します。関数
CURRENT_DATE および TRUNC(SYSDATE) は、同じ結果を生成します。
API Version 2012-12-01
379
Amazon Redshift データベース開発者ガイド
日付関数
概要
SYSDATE
この関数に引数は必要ありません。
戻り型
SYSDATE は TIMESTAMP を返します。
例
次の例は SYSDATE 関数を使用し、現在の日付の完全なタイムスタンプを返します。
select sysdate;
timestamp
---------------------------2008-12-04 16:10:43.976353
(1 row)
次の例は TRUNC 関数内で SYSDATE 関数を使用し、時刻のない現在の日付を返します。
select trunc(sysdate);
trunc
-----------2008-12-04
(1 row)
次のクエリは、クエリが発行された日付からその 120 日前までの間の日付の販売情報を返します。
select salesid, pricepaid, trunc(saletime) as saletime, trunc(sysdate) as now
from sales
where saletime between trunc(sysdate)-120 and trunc(sysdate)
order by saletime asc;
salesid | pricepaid | saletime |
now
---------+-----------+------------+-----------91535 |
670.00 | 2008-08-07 | 2008-12-05
91635 |
365.00 | 2008-08-07 | 2008-12-05
91901 |
1002.00 | 2008-08-07 | 2008-12-05
...
TIMESTAMP_CMP 関数
2 つのタイムスタンプの値を比較し、整数を返します。タイムスタンプが同一の場合、0 を返します。
1 番目のタイムスタンプが「大きい」場合、1 を返します。2 番目のタイムスタンプが「大きい」場合、
-1 を返します。
概要
TIMESTAMP_CMP(timestamp1, timestamp2)
API Version 2012-12-01
380
Amazon Redshift データベース開発者ガイド
日付関数
引数
timestamp1
最初の入力パラメータは TIMESTAMP WITHOUT TIMEZONE です。
timestamp2
2 番目のパラメータは TIMESTAMP WITHOUT TIMEZONE です。
戻り型
TIMESTAMP_CMP 関数は整数を返します。
例
次の例はリストの LISTTIME と SALETIME を比較します。販売のタイムスタンプはリストのタイムス
タンプより後であるため、TIMESTAMP_CMP の値はすべてのリストにおいて -1 であることに注意し
てください。
select listing.listid, listing.listtime,
sales.saletime, timestamp_cmp(listing.listtime, sales.saletime)
from listing, sales
where listing.listid=sales.listid
order by 1, 2, 3, 4
limit 10;
listid |
listtime
|
saletime
| timestamp_cmp
--------+---------------------+---------------------+--------------1 | 2008-01-24 06:43:29 | 2008-02-18 02:36:48 |
-1
4 | 2008-05-24 01:18:37 | 2008-06-06 05:00:16 |
-1
5 | 2008-05-17 02:29:11 | 2008-06-06 08:26:17 |
-1
5 | 2008-05-17 02:29:11 | 2008-06-09 08:38:52 |
-1
6 | 2008-08-15 02:08:13 | 2008-08-31 09:17:02 |
-1
10 | 2008-06-17 09:44:54 | 2008-06-26 12:56:06 |
-1
10 | 2008-06-17 09:44:54 | 2008-07-10 02:12:36 |
-1
10 | 2008-06-17 09:44:54 | 2008-07-16 11:59:24 |
-1
10 | 2008-06-17 09:44:54 | 2008-07-22 02:23:17 |
-1
12 | 200