s u m m i t · 2020-04-11 · (日付/時刻の演算②の1 date型+ or...
TRANSCRIPT
![Page 1: S U M M I T · 2020-04-11 · (日付/時刻の演算②の1 DATE型+ or –数値リテラルの変換例) 前述のエラーを回避し、演算結果をTIMESTAMP型で得るには、数値リテラルを期間リテラルに書き換える必要があります--](https://reader034.vdocuments.pub/reader034/viewer/2022043021/5f3cd243b9cf56506531b5c1/html5/thumbnails/1.jpg)
S U M M I TTokyo 2019
![Page 2: S U M M I T · 2020-04-11 · (日付/時刻の演算②の1 DATE型+ or –数値リテラルの変換例) 前述のエラーを回避し、演算結果をTIMESTAMP型で得るには、数値リテラルを期間リテラルに書き換える必要があります--](https://reader034.vdocuments.pub/reader034/viewer/2022043021/5f3cd243b9cf56506531b5c1/html5/thumbnails/2.jpg)
© 2019, Amazon Web Services, Inc. or its affiliates. All rights reserved.S U M M I T
プロジェクトの実例に学ぶデータベースマイグレーションの課題と解決
関口 裕士ビッグデータコンサルタントプロフェッショナルサービス本部アマゾン ウェブ サービス ジャパン株式会社
B 3 - 2
![Page 3: S U M M I T · 2020-04-11 · (日付/時刻の演算②の1 DATE型+ or –数値リテラルの変換例) 前述のエラーを回避し、演算結果をTIMESTAMP型で得るには、数値リテラルを期間リテラルに書き換える必要があります--](https://reader034.vdocuments.pub/reader034/viewer/2022043021/5f3cd243b9cf56506531b5c1/html5/thumbnails/3.jpg)
© 2019, Amazon Web Services, Inc. or its affiliates. All rights reserved.S U M M I T
当セッションの目的Oracle DatabaseからAurora PostgreSQLへの移行案件を支援して気づいた代表的な考慮事項の紹介と解決方を共有させていただき、スムーズなデータベース移行の参考としていただきたいと考えています
Oracle DatabaseからAurora PostgreSQLへ移行予定、検討されているDBA、開発者
対象視聴者
対象サービス
Aurora compatible with PostgreSQL (9.6系) 10系
![Page 4: S U M M I T · 2020-04-11 · (日付/時刻の演算②の1 DATE型+ or –数値リテラルの変換例) 前述のエラーを回避し、演算結果をTIMESTAMP型で得るには、数値リテラルを期間リテラルに書き換える必要があります--](https://reader034.vdocuments.pub/reader034/viewer/2022043021/5f3cd243b9cf56506531b5c1/html5/thumbnails/4.jpg)
© 2019, Amazon Web Services, Inc. or its affiliates. All rights reserved.S U M M I T
関口裕士(Hiroshi Sekiguchi)Bigdata Consultant, AWS Professional Services
略歴• Captainシステム開発(汎用機)、外資系ベンダーにてNoSQLデータ
ベース(今風に言えば)を担当• 30年のフリーランスを経て、2018年5月より現職• db tech showcase等、DB/SQLチューニングセッション多数• 直近10年、性能関連コンサル多数の性能問題の治療に従事
• (日本人現役) Oracle ACE の1人
得意分野• SQLのパフォーマンス問題の治療• DBのパフォーマンス問題の治療
![Page 5: S U M M I T · 2020-04-11 · (日付/時刻の演算②の1 DATE型+ or –数値リテラルの変換例) 前述のエラーを回避し、演算結果をTIMESTAMP型で得るには、数値リテラルを期間リテラルに書き換える必要があります--](https://reader034.vdocuments.pub/reader034/viewer/2022043021/5f3cd243b9cf56506531b5c1/html5/thumbnails/5.jpg)
© 2019, Amazon Web Services, Inc. or its affiliates. All rights reserved.S U M M I T
アジェンダ
• はじめに
• データベースエンジン由来の代表的考慮事項と対応策
• Aurora PostgreSQL由来の代表的考慮事項と対応策
• まとめ
![Page 6: S U M M I T · 2020-04-11 · (日付/時刻の演算②の1 DATE型+ or –数値リテラルの変換例) 前述のエラーを回避し、演算結果をTIMESTAMP型で得るには、数値リテラルを期間リテラルに書き換える必要があります--](https://reader034.vdocuments.pub/reader034/viewer/2022043021/5f3cd243b9cf56506531b5c1/html5/thumbnails/6.jpg)
© 2019, Amazon Web Services, Inc. or its affiliates. All rights reserved.S U M M I T
用途に応じたAWSのデータベースサービス
Relational Key-value Document In-memory Graph Time-series Ledger
DynamoDB NeptuneAmazon RDS
Aurora CommercialCommunity
Timestream QLDBElastiCacheDocumentDB
![Page 7: S U M M I T · 2020-04-11 · (日付/時刻の演算②の1 DATE型+ or –数値リテラルの変換例) 前述のエラーを回避し、演算結果をTIMESTAMP型で得るには、数値リテラルを期間リテラルに書き換える必要があります--](https://reader034.vdocuments.pub/reader034/viewer/2022043021/5f3cd243b9cf56506531b5c1/html5/thumbnails/7.jpg)
© 2019, Amazon Web Services, Inc. or its affiliates. All rights reserved.S U M M I T
Amazon Aurora
1/10のコストで商用データベース相当のパーフォーマンスと可用性を持つ、クラウド向けに設計されたMySQL/PostgreSQL互換のRDBMS
パフォーマンスとスケーラビリティ
可用性と堅牢性
高いセキュリティ マネージドサービス
MySQLの5倍のスループットPostreSQLの3倍のスループットリードレプリカは最大15ノード
までスケールアウト可能
堅牢性, セルフヒーリングストレージ ; 3AZ間で6つのデータのコピー,
S3への継続的バックアップ
ネットワークの分離, 格納データ/伝送データ
の暗号化
H/Wプロビジョニング、パッチ、セットアップ、設定、
またはバックアップ不要
![Page 8: S U M M I T · 2020-04-11 · (日付/時刻の演算②の1 DATE型+ or –数値リテラルの変換例) 前述のエラーを回避し、演算結果をTIMESTAMP型で得るには、数値リテラルを期間リテラルに書き換える必要があります--](https://reader034.vdocuments.pub/reader034/viewer/2022043021/5f3cd243b9cf56506531b5c1/html5/thumbnails/8.jpg)
© 2019, Amazon Web Services, Inc. or its affiliates. All rights reserved.S U M M I T
AWS SCT (Schema Conversion Tool)
• データウェアハウスをモダナイズ
Oracle, SQL Server, Netezza, Greenplum, Vertica,Teradata を Amazon Redshift へ変換する
モダナイズ
Amazon Aurora
Amazon Redshift
• データベースをモダナイズ
Oracle, SQL Server, Db2 LUW を
PostgreSQL, MySQL, Amazon Auroraへ
変換する
MySQL
PostgreSQL
![Page 9: S U M M I T · 2020-04-11 · (日付/時刻の演算②の1 DATE型+ or –数値リテラルの変換例) 前述のエラーを回避し、演算結果をTIMESTAMP型で得るには、数値リテラルを期間リテラルに書き換える必要があります--](https://reader034.vdocuments.pub/reader034/viewer/2022043021/5f3cd243b9cf56506531b5c1/html5/thumbnails/9.jpg)
© 2019, Amazon Web Services, Inc. or its affiliates. All rights reserved.S U M M I T
Oracle Database 11g/12cTo Amazon Aurora
with PostgreSQL Compatibility (9.6.x)
移行のためのベストプラクティスを紹介
スムーズな移行にお役だてください。
Migration Playbook
https://aws.amazon.com/jp/dms/resources/
AWS Database Migration Service のリソース
移行プレイブックとステップバイステップガイド
![Page 10: S U M M I T · 2020-04-11 · (日付/時刻の演算②の1 DATE型+ or –数値リテラルの変換例) 前述のエラーを回避し、演算結果をTIMESTAMP型で得るには、数値リテラルを期間リテラルに書き換える必要があります--](https://reader034.vdocuments.pub/reader034/viewer/2022043021/5f3cd243b9cf56506531b5c1/html5/thumbnails/10.jpg)
© 2019, Amazon Web Services, Inc. or its affiliates. All rights reserved.S U M M I T
予備検討やPoC机上の検討、PoCを通してDBマイグレーションが妥当かを検討する
設計移行方式の設計や移行後の環境の設計を行う
変換SQLの抽出、書き換えを行い、単体テスト、結合テスト、総合性能試験を実施する
移行移行テストを実施の上、データの移行と切り替え作業を行う
運用移行終了後のデータベースの運用
最適化キャパシティの見直し、コスト最適化など運用改善の実施
Database Migrationプロセスと本セッション内容の位置付け
ディスカバリー
設計 変換 移行 運用 最適化
• スキーマ、SQL移行の難易度を調査(AWS SCT)
• スキーマの移行(AWS SCT)
• SQL、プロシージャーの移行(AWS SCT)
• データの移行(AWS SCT)
フェーズ毎に適用可能なAWS SCTの機能
![Page 11: S U M M I T · 2020-04-11 · (日付/時刻の演算②の1 DATE型+ or –数値リテラルの変換例) 前述のエラーを回避し、演算結果をTIMESTAMP型で得るには、数値リテラルを期間リテラルに書き換える必要があります--](https://reader034.vdocuments.pub/reader034/viewer/2022043021/5f3cd243b9cf56506531b5c1/html5/thumbnails/11.jpg)
© 2019, Amazon Web Services, Inc. or its affiliates. All rights reserved.S U M M I T
データベースエンジン由来の代表的考慮事項
• NULLと空文字
• 一時表
• 日付/時刻
• パーティション
![Page 12: S U M M I T · 2020-04-11 · (日付/時刻の演算②の1 DATE型+ or –数値リテラルの変換例) 前述のエラーを回避し、演算結果をTIMESTAMP型で得るには、数値リテラルを期間リテラルに書き換える必要があります--](https://reader034.vdocuments.pub/reader034/viewer/2022043021/5f3cd243b9cf56506531b5c1/html5/thumbnails/12.jpg)
© 2019, Amazon Web Services, Inc. or its affiliates. All rights reserved.S U M M I T
データベースエンジン由来の代表的考慮事項
NULLと空文字https://docs.oracle.com/cd/E82638_01/sqlrf/Nulls.html
’’ (空文字) とは、長さ 0 の文字列を指します。文字列であるため、NULLとは異なります。
空文字の扱い ‘’
Oracle Database NULLとして扱う
PostgreSQL 長さ 0 バイトの空文字として扱う
![Page 13: S U M M I T · 2020-04-11 · (日付/時刻の演算②の1 DATE型+ or –数値リテラルの変換例) 前述のエラーを回避し、演算結果をTIMESTAMP型で得るには、数値リテラルを期間リテラルに書き換える必要があります--](https://reader034.vdocuments.pub/reader034/viewer/2022043021/5f3cd243b9cf56506531b5c1/html5/thumbnails/13.jpg)
S U M M I T © 2019, Amazon Web Services, Inc. or its affiliates. All rights reserved.
データベースエンジン由来の代表的考慮事項
SQL> set null [null]SQL> update foo set bar = ‘’ where id = 1; -- Oracle Database
ID BAR---------- ----------
1 [null]
mydb=> ¥pset null ‘[null]’mydb=> update foo set bar = ‘’ where id = 1; -- PostgreSQL
id | bar----+--------
1 |
NULLと空文字の扱いの違い
![Page 14: S U M M I T · 2020-04-11 · (日付/時刻の演算②の1 DATE型+ or –数値リテラルの変換例) 前述のエラーを回避し、演算結果をTIMESTAMP型で得るには、数値リテラルを期間リテラルに書き換える必要があります--](https://reader034.vdocuments.pub/reader034/viewer/2022043021/5f3cd243b9cf56506531b5c1/html5/thumbnails/14.jpg)
S U M M I T © 2019, Amazon Web Services, Inc. or its affiliates. All rights reserved.
データベースエンジン由来の代表的考慮事項
SQL> set null [null]SQL> update foo set bar = ‘’ where id = 1; -- Oracle Database
ID BAR---------- ----------
1 [null]
mydb=> ¥pset null ‘[null]’mydb=> update foo set bar = NULL where id = 1; -- PostgreSQL
id | bar----+--------
1 | [null]
NULLと空文字の扱いの違いOracle Databaseで利用されている空文字(‘’)は、NULLへ置き換える
![Page 15: S U M M I T · 2020-04-11 · (日付/時刻の演算②の1 DATE型+ or –数値リテラルの変換例) 前述のエラーを回避し、演算結果をTIMESTAMP型で得るには、数値リテラルを期間リテラルに書き換える必要があります--](https://reader034.vdocuments.pub/reader034/viewer/2022043021/5f3cd243b9cf56506531b5c1/html5/thumbnails/15.jpg)
S U M M I T © 2019, Amazon Web Services, Inc. or its affiliates. All rights reserved.
データベースエンジン由来の代表的考慮事項
-- Oracle Database
SQL> SELECT ‘test’ || ‘1’ FROM dual;
‘TEST-----test1
SQL> SELECT ‘test’ || ‘’ FROM dual;
‘TES----test
SQL> SELECT ‘test’ || NULL FROM dual;
‘TES----test
文字列連結演算子(||)でのNULL連結時の挙動の違い( ‘’ 空文字を NULLに置き換えただけで移行してしまうと… )
-- Aurora PostgreSQLmydb=> ¥pset null ‘[null]’mydb=> SELECT ‘test’ || ‘1’;
concat_ws-----------test1
mydb=> SELECT ‘test’ || NULL;
?column?-----------[null]
mydb=> SELECT ‘test’ || NULL;
?column?-----------[null]
![Page 16: S U M M I T · 2020-04-11 · (日付/時刻の演算②の1 DATE型+ or –数値リテラルの変換例) 前述のエラーを回避し、演算結果をTIMESTAMP型で得るには、数値リテラルを期間リテラルに書き換える必要があります--](https://reader034.vdocuments.pub/reader034/viewer/2022043021/5f3cd243b9cf56506531b5c1/html5/thumbnails/16.jpg)
S U M M I T © 2019, Amazon Web Services, Inc. or its affiliates. All rights reserved.
データベースエンジン由来の代表的考慮事項
-- Oracle Database
SQL> SELECT ‘test’ || ‘1’ FROM dual;
‘TEST-----test1
SQL> SELECT ‘test’ || ‘’ FROM dual;
‘TES----test
SQL> SELECT ‘test’ || NULL FROM dual;
‘TES----test
文字列連結演算子(||)でのNULL連結時の挙動の違いへの対処方法手動で書き換えるか、AWS SCTを利用しCONCAT_WS()に書き換える
-- Aurora PostgreSQLmydb=> ¥pset null ‘[null]’mydb=> SELECT CONCAT_WS(‘’, ‘test’, ‘1’);
concat_ws-----------test1
mydb=> SELECT CONCAT_WS('', 'test’, NULL);
concat_ws-----------test
mydb=> SELECT CONCAT_WS('', 'test', NULL);
concat_ws-----------test
![Page 17: S U M M I T · 2020-04-11 · (日付/時刻の演算②の1 DATE型+ or –数値リテラルの変換例) 前述のエラーを回避し、演算結果をTIMESTAMP型で得るには、数値リテラルを期間リテラルに書き換える必要があります--](https://reader034.vdocuments.pub/reader034/viewer/2022043021/5f3cd243b9cf56506531b5c1/html5/thumbnails/17.jpg)
© 2019, Amazon Web Services, Inc. or its affiliates. All rights reserved.S U M M I T
データベースエンジン由来の代表的考慮事項
一時表の挙動の差異PostgresSQLではトランザクションの終了または、セッションの終了時点で一時表定義も自動削除される
データが切り捨てられるタイミング表の削除
トランザクション セッション
Oracle Database
○ ○DROP TABLE文(自動削除されない*1)
PostgreSQL ○ ○トランザクションまたは、セッションの終了で自動削除
*1) Oracle Database 18cでは自動削除するタイプの一時表がサポートされた
↓CREATE TEMP TABLE IF NOT EXISTS文を利用して対処
![Page 18: S U M M I T · 2020-04-11 · (日付/時刻の演算②の1 DATE型+ or –数値リテラルの変換例) 前述のエラーを回避し、演算結果をTIMESTAMP型で得るには、数値リテラルを期間リテラルに書き換える必要があります--](https://reader034.vdocuments.pub/reader034/viewer/2022043021/5f3cd243b9cf56506531b5c1/html5/thumbnails/18.jpg)
© 2019, Amazon Web Services, Inc. or its affiliates. All rights reserved.S U M M I T
データベースエンジン由来の代表的考慮事項
日付/時刻(データ型の変換)
Oracle DatabaseのDATE型は、時分秒まで保持してるため、PostgreSQLへ移行する場合、TIMESTAMP型へ移行するのが一般的です
Oracle Database PostgreSQL
DATE型 年月日時分秒 年月日
TIMESTAMP型 年月日時分秒.少数部年月日時分秒
年月日時分秒.少数部
![Page 19: S U M M I T · 2020-04-11 · (日付/時刻の演算②の1 DATE型+ or –数値リテラルの変換例) 前述のエラーを回避し、演算結果をTIMESTAMP型で得るには、数値リテラルを期間リテラルに書き換える必要があります--](https://reader034.vdocuments.pub/reader034/viewer/2022043021/5f3cd243b9cf56506531b5c1/html5/thumbnails/19.jpg)
© 2019, Amazon Web Services, Inc. or its affiliates. All rights reserved.S U M M I T
データベースエンジン由来の代表的考慮事項
日付/時刻(データ型の変換)
AWS SCTでは以下の変換(デフォルト)を行うことが可能です
Oracle Database PostgreSQL
DATE型 DATE型TIMESTAMP型
(タイムゾーンなし)
TIMESTAMP型 TIMESTAMP型 TIMESTAMP型
![Page 20: S U M M I T · 2020-04-11 · (日付/時刻の演算②の1 DATE型+ or –数値リテラルの変換例) 前述のエラーを回避し、演算結果をTIMESTAMP型で得るには、数値リテラルを期間リテラルに書き換える必要があります--](https://reader034.vdocuments.pub/reader034/viewer/2022043021/5f3cd243b9cf56506531b5c1/html5/thumbnails/20.jpg)
© 2019, Amazon Web Services, Inc. or its affiliates. All rights reserved.S U M M I T
データベースエンジン由来の代表的考慮事項
日付/時刻の演算①
Oracle DatabaseのDATE型からPostgreSQLのTIMESTAMP型への移行時AWS SCTでは以下の変換を行うことが可能です
演算パターン (データ型 演算子 データ型 => 結果のデータ型) AWS SCTによる変換Oracle Database PostgreSQL
1DATE型 - DATE型 =>
NUMBER型
(EXTRACT (EPOCH FROM TIMESTAMP型– TIMESTAMP型) / 86400)::NUMERIC
=> NUMERIC型○
2(DATE型 – DATE型)
+ 数値リテラル=> NUMBER型
(EXTRACT (EPOCH FROM TIMESTAMP型– TIMESTAMP型) / 86400)::NUMERIC
+ 数値リテラル => NUMERIC型○
![Page 21: S U M M I T · 2020-04-11 · (日付/時刻の演算②の1 DATE型+ or –数値リテラルの変換例) 前述のエラーを回避し、演算結果をTIMESTAMP型で得るには、数値リテラルを期間リテラルに書き換える必要があります--](https://reader034.vdocuments.pub/reader034/viewer/2022043021/5f3cd243b9cf56506531b5c1/html5/thumbnails/21.jpg)
S U M M I T © 2019, Amazon Web Services, Inc. or its affiliates. All rights reserved.
データベースエンジン由来の代表的考慮事項
-- Oracle Database
SQL> desc exampleName Type------------ ------------DCOL DATETCOL TIMESTAMP(6)
select dcol - dcol
from hoge.example;
日付/時刻の演算(日付/時刻の演算①の1 DATE型-DATE型の変換例)
-- Aurora PostgreSQL
mydb=> ¥d hoge.exampleTable "hoge.example”
Column | Type--------+-------------------------------dcol | timestamp(0) without time zone tcol | timestamp(6) without time zone
SELECT(EXTRACT (EPOCH FROM dcol - dcol) / 86400
)::NUMERICFROM hoge.example;
![Page 22: S U M M I T · 2020-04-11 · (日付/時刻の演算②の1 DATE型+ or –数値リテラルの変換例) 前述のエラーを回避し、演算結果をTIMESTAMP型で得るには、数値リテラルを期間リテラルに書き換える必要があります--](https://reader034.vdocuments.pub/reader034/viewer/2022043021/5f3cd243b9cf56506531b5c1/html5/thumbnails/22.jpg)
© 2019, Amazon Web Services, Inc. or its affiliates. All rights reserved.S U M M I T
データベースエンジン由来の代表的考慮事項
日付/時刻の演算②
Oracle DatabaseのDATE型からPostgreSQLのTIMESTAMP型への移行時AWS SCTでは以下の変換を行うことが可能です
演算パターン (データ型 演算子 データ型 => 結果のデータ型)AWS SCTによる変換
Oracle Database PostgreSQL
1DATE型 + or – 数値リテラル
=> DATE型TIMESTAMP型 + or – 期間リテラル
=> TIMESTAMP型○
2DATE型 + or – 期間リテラル
=> DATE型TIMESTAMP型 + or – 期間リテラル
=> TIMESTAMP型○
![Page 23: S U M M I T · 2020-04-11 · (日付/時刻の演算②の1 DATE型+ or –数値リテラルの変換例) 前述のエラーを回避し、演算結果をTIMESTAMP型で得るには、数値リテラルを期間リテラルに書き換える必要があります--](https://reader034.vdocuments.pub/reader034/viewer/2022043021/5f3cd243b9cf56506531b5c1/html5/thumbnails/23.jpg)
S U M M I T © 2019, Amazon Web Services, Inc. or its affiliates. All rights reserved.
データベースエンジン由来の代表的考慮事項
-- Oracle Database
SQL> desc exampleName Type------------ ------------DCOL DATETCOL TIMESTAMP(6)
select dcol+ 1
from hoge.example;
日付/時刻の演算(日付/時刻の演算②の1 DATE型 + or – 数値リテラル エラーの例)
PostgreSQLでは、TIMESTAMP型に対して数値リテラルを加減算は行えません
-- Aurora PostgreSQL
mydb=> ¥d hoge.exampleTable "hoge.example”
Column | Type--------+-------------------------------dcol | timestamp(0) without time zone tcol | timestamp(6) without time zone
mydb=> SELECT dcol + 1 FROM hoge.example;
ERROR: operator does not exist: timestamp without time zone + integerLINE 1: SELECT dcol + 1 FROM hoge.example;
^
![Page 24: S U M M I T · 2020-04-11 · (日付/時刻の演算②の1 DATE型+ or –数値リテラルの変換例) 前述のエラーを回避し、演算結果をTIMESTAMP型で得るには、数値リテラルを期間リテラルに書き換える必要があります--](https://reader034.vdocuments.pub/reader034/viewer/2022043021/5f3cd243b9cf56506531b5c1/html5/thumbnails/24.jpg)
S U M M I T © 2019, Amazon Web Services, Inc. or its affiliates. All rights reserved.
データベースエンジン由来の代表的考慮事項
-- Oracle Database
SQL> desc exampleName Type------------ ------------DCOL DATETCOL TIMESTAMP(6)
select dcol+ 1
from hoge.example;
日付/時刻の演算(日付/時刻の演算②の1 DATE型 + or – 数値リテラルの変換例)前述のエラーを回避し、演算結果をTIMESTAMP型で得るには、数値リテラルを期間リテラルに書き換える必要があります
-- Aurora PostgreSQL
mydb=> ¥d hoge.exampleTable "hoge.example”
Column | Type--------+-------------------------------dcol | timestamp(0) without time zone tcol | timestamp(6) without time zone
SELECTdcol+ (1::NUMERIC || ' days')::INTERVAL
FROM hoge.example;
![Page 25: S U M M I T · 2020-04-11 · (日付/時刻の演算②の1 DATE型+ or –数値リテラルの変換例) 前述のエラーを回避し、演算結果をTIMESTAMP型で得るには、数値リテラルを期間リテラルに書き換える必要があります--](https://reader034.vdocuments.pub/reader034/viewer/2022043021/5f3cd243b9cf56506531b5c1/html5/thumbnails/25.jpg)
© 2019, Amazon Web Services, Inc. or its affiliates. All rights reserved.S U M M I T
データベースエンジン由来の代表的考慮事項
日付/時刻の演算③
Oracle DatabaseのTIMESTAMP型からPostgreSQLのTIMESTAMP型への移行時
演算パターン (データ型 演算子 データ型 => 結果のデータ型)参考
Oracle Database PostgreSQL
1TIMESTAMP型 – TIMESTAMP型
=> INTERVAL DAY TO SECOND型TIMESTAMP型 – TIMESTAMP型
=> INTERVAL型手動変換/SCT
2(TIMESTAMP型 – TIMESTAMP型)
+ 期間リテラル=> INTERVAL DAY TO SECOND型
(TIMESTAMP型 – TIMESTAMP型) + 期間リテラル
=> INTERVAL型手動変換/SCT
TO_TIMESTAMP()を利用している場合は手動変換必要
![Page 26: S U M M I T · 2020-04-11 · (日付/時刻の演算②の1 DATE型+ or –数値リテラルの変換例) 前述のエラーを回避し、演算結果をTIMESTAMP型で得るには、数値リテラルを期間リテラルに書き換える必要があります--](https://reader034.vdocuments.pub/reader034/viewer/2022043021/5f3cd243b9cf56506531b5c1/html5/thumbnails/26.jpg)
S U M M I T © 2019, Amazon Web Services, Inc. or its affiliates. All rights reserved.
データベースエンジン由来の代表的考慮事項
-- Oracle Database
SQL> desc exampleName Type------------ ------------DCOL DATETCOL TIMESTAMP(6)
select (tcol - tcol) + interval '1' day
from hoge.example;
日付/時刻の演算(日付/時刻の演算③の2 (TIMESTAMP型– TIMESTAMP型) – 期間リテラルの例)
PostgreSQLへ向けに変換する場合、期間リテラルの構文に多少違いのある点に注意してください
-- Aurora PostgreSQL
mydb=> ¥d hoge.exampleTable "hoge.example”
Column | Type--------+-------------------------------dcol | timestamp(0) without time zonetcol | timestamp(6) without time zone
SELECT(tcol - tcol) + '1 day'::INTERVAL
FROM hoge.example;
![Page 27: S U M M I T · 2020-04-11 · (日付/時刻の演算②の1 DATE型+ or –数値リテラルの変換例) 前述のエラーを回避し、演算結果をTIMESTAMP型で得るには、数値リテラルを期間リテラルに書き換える必要があります--](https://reader034.vdocuments.pub/reader034/viewer/2022043021/5f3cd243b9cf56506531b5c1/html5/thumbnails/27.jpg)
© 2019, Amazon Web Services, Inc. or its affiliates. All rights reserved.S U M M I T
データベースエンジン由来の代表的考慮事項
日付/時刻の演算④
Oracle DatabaseのTIMESTAMP型からPostgreSQLのTIMESTAMP型への移行時
演算パターン (データ型 演算子 データ型 => 結果のデータ型)参考
Oracle Database PostgreSQL
1TIMESTAMP型 + or – 数値リテラル
=> DATE型TIMESTAMP型 + or – 期間リテラル
=> TIMESTAMP型手動変換/SCT
2TIMESTAMP型 + or – 期間リテラル
=> TIMESTAMP型TIMESTAMP型 + or – 期間リテラル
=> TIMESTAMP型手動変換/SCT
TO_TIMESTAMP()を利用している場合は手動変換必要
![Page 28: S U M M I T · 2020-04-11 · (日付/時刻の演算②の1 DATE型+ or –数値リテラルの変換例) 前述のエラーを回避し、演算結果をTIMESTAMP型で得るには、数値リテラルを期間リテラルに書き換える必要があります--](https://reader034.vdocuments.pub/reader034/viewer/2022043021/5f3cd243b9cf56506531b5c1/html5/thumbnails/28.jpg)
S U M M I T © 2019, Amazon Web Services, Inc. or its affiliates. All rights reserved.
データベースエンジン由来の代表的考慮事項
-- Oracle Database
SQL> desc exampleName Type------------ ------------DCOL DATETCOL TIMESTAMP(6)
select tcol+ 1
from hoge.example;
日付/時刻の演算(日付/時刻の演算④の1 TIMESTAMP型 + or – 数値リテラル エラーの例)
PostgreSQLでは、TIMESTAMP型に対して数値リテラルを加減算は行えません
-- Aurora PostgreSQL
mydb=> ¥d hoge.exampleTable "hoge.example”
Column | Type--------+-------------------------------dcol | timestamp(0) without time zonetcol | timestamp(6) without time zone
mydb=> select tcol + 1 from hoge.example;ERROR: operator does not exist: timestamp without time zone + integerLINE 1: select tcol + 1 from hoge.hoge;
^HINT: No operator matches the given name and argument type(s). You might need to add explicit type casts.
![Page 29: S U M M I T · 2020-04-11 · (日付/時刻の演算②の1 DATE型+ or –数値リテラルの変換例) 前述のエラーを回避し、演算結果をTIMESTAMP型で得るには、数値リテラルを期間リテラルに書き換える必要があります--](https://reader034.vdocuments.pub/reader034/viewer/2022043021/5f3cd243b9cf56506531b5c1/html5/thumbnails/29.jpg)
S U M M I T © 2019, Amazon Web Services, Inc. or its affiliates. All rights reserved.
データベースエンジン由来の代表的考慮事項
-- Oracle Database
SQL> desc exampleName Type------------ ------------DCOL DATETCOL TIMESTAMP(6)
select tcol+ 1
from hoge.example;
日付/時刻の演算(日付/時刻の演算④の1 TIMESTAMP型 + or – 数値リテラルの変換例)前述のエラーを回避し、演算結果をTIMESTAMP型で得るには、数値リテラルを期間リテラルに書き換える必要があります
-- Aurora PostgreSQL
mydb=> ¥d hoge.exampleTable "hoge.example”
Column | Type--------+-------------------------------dcol | timestamp(0) without time zonetcol | timestamp(6) without time zone
SELECTtcol+ (1::NUMERIC || ' days')::INTERVAL
FROM hoge.example;
![Page 30: S U M M I T · 2020-04-11 · (日付/時刻の演算②の1 DATE型+ or –数値リテラルの変換例) 前述のエラーを回避し、演算結果をTIMESTAMP型で得るには、数値リテラルを期間リテラルに書き換える必要があります--](https://reader034.vdocuments.pub/reader034/viewer/2022043021/5f3cd243b9cf56506531b5c1/html5/thumbnails/30.jpg)
© 2019, Amazon Web Services, Inc. or its affiliates. All rights reserved.S U M M I T
データベースエンジン由来の代表的考慮事項
パーティション (パーティションタイプ)HASHパーティションからの移行先をどのタイプのパーティションにするか検討する必要あります。(以下に記載していないパーティションについても同様)
HASHパーティションの主な目的は、I/O分散とパーティション間のデータ量均一化であるため、他のパーティションタイプに移行する場合には、同様の観点での検討が必要となります。
パーティションタイプ Oracle Database PostgreSQL (10.x互換) AWS SCTによる変換
RANGE ○ ○(宣言的パーティション) ○
LIST ○ ○(宣言的パーティション) ○
HASH ○ N/A N/A
※PostgreSQL 10互換のAuroraは、昨年末より東京リージョンでも利用可能となっております。
![Page 31: S U M M I T · 2020-04-11 · (日付/時刻の演算②の1 DATE型+ or –数値リテラルの変換例) 前述のエラーを回避し、演算結果をTIMESTAMP型で得るには、数値リテラルを期間リテラルに書き換える必要があります--](https://reader034.vdocuments.pub/reader034/viewer/2022043021/5f3cd243b9cf56506531b5c1/html5/thumbnails/31.jpg)
© 2019, Amazon Web Services, Inc. or its affiliates. All rights reserved.S U M M I T
データベースエンジン由来の代表的考慮事項
パーティションパーティション数とハードパースの関係
できる限り100以下にすることが推奨されています。理由はパーティション数の増加に伴いパース時間も伸びる傾向にあるためです。
(マニュアル)テーブルのパーティショニングhttps://www.postgresql.jp/document/10/html/ddl-partitioning.html
Oracle Databaseのコンポジットパーティション移行する場合、200、300という数のパーティションになってしまう場合もあります。OLTP系ショートクエリー等、性能要件の厳しいワークロードが想定される場合には注意が必要です。
パーティション数がSQL文の
パース時間に影響する
![Page 32: S U M M I T · 2020-04-11 · (日付/時刻の演算②の1 DATE型+ or –数値リテラルの変換例) 前述のエラーを回避し、演算結果をTIMESTAMP型で得るには、数値リテラルを期間リテラルに書き換える必要があります--](https://reader034.vdocuments.pub/reader034/viewer/2022043021/5f3cd243b9cf56506531b5c1/html5/thumbnails/32.jpg)
S U M M I T © 2019, Amazon Web Services, Inc. or its affiliates. All rights reserved.
データベースエンジン由来の代表的考慮事項
パーティション親表のロックPostgreSQL宣言的パーティションでパーティションの削除(DROP)を行う場合、親表は排他ロック(ACCESS EXCLUSIVE)されます。このタイプのロックはすべてのアクセスをブロックするため、親表経由のアクセスは待機させられることになります。
(マニュアル)テーブルのパーティショニングhttps://www.postgresql.jp/document/10/html/ddl-partitioning.html
性能要件の厳しいシステムでは、削除と同時にDMLが実行される可能性が高い時間帯の実行を避ける等の対応が必要になる可能性があります。
①Partition 3を削除!
②親表はAccess Exclusive
ロックされる
![Page 33: S U M M I T · 2020-04-11 · (日付/時刻の演算②の1 DATE型+ or –数値リテラルの変換例) 前述のエラーを回避し、演算結果をTIMESTAMP型で得るには、数値リテラルを期間リテラルに書き換える必要があります--](https://reader034.vdocuments.pub/reader034/viewer/2022043021/5f3cd243b9cf56506531b5c1/html5/thumbnails/33.jpg)
© 2019, Amazon Web Services, Inc. or its affiliates. All rights reserved.S U M M I T
Aurora PostgreSQL由来の代表的考慮事項
インスタンスモニタリングとSQLチューニング
いわゆるTemp落ちと一時領域
![Page 34: S U M M I T · 2020-04-11 · (日付/時刻の演算②の1 DATE型+ or –数値リテラルの変換例) 前述のエラーを回避し、演算結果をTIMESTAMP型で得るには、数値リテラルを期間リテラルに書き換える必要があります--](https://reader034.vdocuments.pub/reader034/viewer/2022043021/5f3cd243b9cf56506531b5c1/html5/thumbnails/34.jpg)
© 2019, Amazon Web Services, Inc. or its affiliates. All rights reserved.S U M M I T
Aurora PostgreSQL由来の代表的考慮事項とSQLチューニング
wait_eventの説明https://www.postgresql.jp/document/10/html/monitoring-stats.html#WAIT-EVENT-TABLE
pg_stat_activityビューhttps://www.postgresql.jp/document/10/html/monitoring-stats.html#PG-STAT-ACTIVITY-VIEW
pg_stat_statements ビューhttps://www.postgresql.jp/document/10/html/pgstatstatements.html
![Page 35: S U M M I T · 2020-04-11 · (日付/時刻の演算②の1 DATE型+ or –数値リテラルの変換例) 前述のエラーを回避し、演算結果をTIMESTAMP型で得るには、数値リテラルを期間リテラルに書き換える必要があります--](https://reader034.vdocuments.pub/reader034/viewer/2022043021/5f3cd243b9cf56506531b5c1/html5/thumbnails/35.jpg)
© 2019, Amazon Web Services, Inc. or its affiliates. All rights reserved.S U M M I T
Aurora PostgreSQL由来の代表的考慮事項インスタンスモニタリングとSQLチューニング
![Page 36: S U M M I T · 2020-04-11 · (日付/時刻の演算②の1 DATE型+ or –数値リテラルの変換例) 前述のエラーを回避し、演算結果をTIMESTAMP型で得るには、数値リテラルを期間リテラルに書き換える必要があります--](https://reader034.vdocuments.pub/reader034/viewer/2022043021/5f3cd243b9cf56506531b5c1/html5/thumbnails/36.jpg)
© 2019, Amazon Web Services, Inc. or its affiliates. All rights reserved.S U M M I T
Aurora PostgreSQL由来の代表的考慮事項インスタンスモニタリングとSQLチューニング
![Page 37: S U M M I T · 2020-04-11 · (日付/時刻の演算②の1 DATE型+ or –数値リテラルの変換例) 前述のエラーを回避し、演算結果をTIMESTAMP型で得るには、数値リテラルを期間リテラルに書き換える必要があります--](https://reader034.vdocuments.pub/reader034/viewer/2022043021/5f3cd243b9cf56506531b5c1/html5/thumbnails/37.jpg)
© 2019, Amazon Web Services, Inc. or its affiliates. All rights reserved.S U M M I T
2
1
3
Aurora PostgreSQL由来の代表的考慮事項
2
1
3
4
![Page 38: S U M M I T · 2020-04-11 · (日付/時刻の演算②の1 DATE型+ or –数値リテラルの変換例) 前述のエラーを回避し、演算結果をTIMESTAMP型で得るには、数値リテラルを期間リテラルに書き換える必要があります--](https://reader034.vdocuments.pub/reader034/viewer/2022043021/5f3cd243b9cf56506531b5c1/html5/thumbnails/38.jpg)
© 2019, Amazon Web Services, Inc. or its affiliates. All rights reserved.S U M M I T
Aurora PostgreSQL由来の代表的考慮事項
![Page 39: S U M M I T · 2020-04-11 · (日付/時刻の演算②の1 DATE型+ or –数値リテラルの変換例) 前述のエラーを回避し、演算結果をTIMESTAMP型で得るには、数値リテラルを期間リテラルに書き換える必要があります--](https://reader034.vdocuments.pub/reader034/viewer/2022043021/5f3cd243b9cf56506531b5c1/html5/thumbnails/39.jpg)
© 2019, Amazon Web Services, Inc. or its affiliates. All rights reserved.S U M M I T
Aurora PostgreSQL由来の代表的考慮事項
Amazon Aurora Amazon Aurora
参考) No Space Left on Device (デバイスに空き容量がない) エラーへの対応https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/AuroraUserGuide/CHAP_Troubleshooting.html#CHAP_Troubleshooting.Aurora.NoSpaceLeft
![Page 40: S U M M I T · 2020-04-11 · (日付/時刻の演算②の1 DATE型+ or –数値リテラルの変換例) 前述のエラーを回避し、演算結果をTIMESTAMP型で得るには、数値リテラルを期間リテラルに書き換える必要があります--](https://reader034.vdocuments.pub/reader034/viewer/2022043021/5f3cd243b9cf56506531b5c1/html5/thumbnails/40.jpg)
© 2019, Amazon Web Services, Inc. or its affiliates. All rights reserved.S U M M I T
まとめ
データベースエンジン由来の代表的考慮事項一時表、NULLと空文字、日付/時刻の演算、パーティション
Aurora PostgreSQL由来の代表的考慮事項インスタンスモニタリングとSQLチューニング、
本日ご紹介した内容は全体の一部でございますが、皆様の助けになれば幸いでございます
![Page 41: S U M M I T · 2020-04-11 · (日付/時刻の演算②の1 DATE型+ or –数値リテラルの変換例) 前述のエラーを回避し、演算結果をTIMESTAMP型で得るには、数値リテラルを期間リテラルに書き換える必要があります--](https://reader034.vdocuments.pub/reader034/viewer/2022043021/5f3cd243b9cf56506531b5c1/html5/thumbnails/41.jpg)
S U M M I T © 2019, Amazon Web Services, Inc. or its affiliates. All rights reserved.
(参考)AWS SCT利用時のTips
• 利用している全データ型を含む表を1つ定義し変換することで、デフォルトのデータ型の変換マッピングの全容を早期に確認する
Oracle DatabaseからAurora PostgreSQLの変換例
![Page 42: S U M M I T · 2020-04-11 · (日付/時刻の演算②の1 DATE型+ or –数値リテラルの変換例) 前述のエラーを回避し、演算結果をTIMESTAMP型で得るには、数値リテラルを期間リテラルに書き換える必要があります--](https://reader034.vdocuments.pub/reader034/viewer/2022043021/5f3cd243b9cf56506531b5c1/html5/thumbnails/42.jpg)
© 2019, Amazon Web Services, Inc. or its affiliates. All rights reserved.S U M M I T
Thank you!
S U M M I T © 2019, Amazon Web Services, Inc. or its affiliates. All rights reserved.
Hiroshi [email protected]