it技術:データベース:postgresql:oracleからの移行
差分
このページの2つのバージョン間の差分を表示します。
両方とも前のリビジョン前のリビジョン次のリビジョン | 前のリビジョン | ||
it技術:データベース:postgresql:oracleからの移行 [2020/05/13 17:13] – [関数] yajuadmin | it技術:データベース:postgresql:oracleからの移行 [2023/12/18 13:16] (現在) – [データ型] yajuadmin | ||
---|---|---|---|
行 6: | 行 6: | ||
^Oracleのデータ型^PostgreSQL^説明^備考^ | ^Oracleのデータ型^PostgreSQL^説明^備考^ | ||
- | |VARCHAR2(n)|CHARACTER VARYING(n)| 最大n文字の長さの文字列| | + | |VARCHAR2(n)|CHARACTER VARYING(n)| 最大n文字の長さの文字列|Oracleはバイト数、PostgreSQLは文字数| |
- | |NUMBER|NUMERIC|最大1000桁、ユーザ指定精度| | + | |NUMBER|NUMERIC|最大1000桁、ユーザ指定精度| | |
|DATE|TIMESTAMP| |DATEのままだと日付のみになる| | |DATE|TIMESTAMP| |DATEのままだと日付のみになる| | ||
|SYSDATE|current_timestamp | |SYSDATE|current_timestamp | ||
- | |ROWID|oid|32bit(約43億)で一周してしまう|Create文でWITH OIDSと設定しないと使用できない| | + | |ROWID|oid|32bit(約43億)で一周してしまう|Create文でWITH OIDSと設定しないと使用できない、PostgreSQL12以降はWITH OIDS廃止| |
+ | | |ctid|ROWIDに相当|バキューム処理によって ctid が変更される可能性があります。| | ||
参照:[[http:// | 参照:[[http:// | ||
=== 注意点 === | === 注意点 === | ||
+ | OracleはVARCHAR2はバイト数、PostgreSQLはCHARACTER VARYINGは文字数となる。\\ | ||
OracleのNUMBER型をPostgreSQLのNUMERIC型に単純に変更したが、これには弊害もある。\\ | OracleのNUMBER型をPostgreSQLのNUMERIC型に単純に変更したが、これには弊害もある。\\ | ||
整数しか入らないなら、素直にsmallint型やinteger型にする方がいいかも。 | 整数しか入らないなら、素直にsmallint型やinteger型にする方がいいかも。 | ||
行 73: | 行 75: | ||
=== トランザクションの結果が異なる === | === トランザクションの結果が異なる === | ||
- | 複数トランザクションを使用した場合、トランザクションの同時実行の結果が異なる。\\ | + | 複数トランザクションを使用した場合、トランザクションの同時実行の結果が異なる。 |
- | [[https:// | + | |
- | 参考:日経SYSTEMS 2019/7 | + | * [[https:// |
+ | * [[https:// | ||
^時系列^Oracle^^PostgreSQL^^ | ^時系列^Oracle^^PostgreSQL^^ | ||
行 114: | 行 116: | ||
</ | </ | ||
+ | TABLEを作成するよりVIEWにする方が一般的。\\ | ||
+ | [[https:// | ||
+ | |||
+ | <code sql> | ||
+ | CREATE VIEW dual AS | ||
+ | SELECT ' | ||
+ | </ | ||
行 173: | 行 182: | ||
WHERE MGR_ID IS NOT NULL; | WHERE MGR_ID IS NOT NULL; | ||
</ | </ | ||
+ | ==== DELETE文のFROM句にJOINが使えない ==== | ||
+ | USING句やIN句に変更する。\\ | ||
+ | [[https:// | ||
+ | |||
+ | ==== MERGE文サポート(PostgreSQL 15以降) ==== | ||
+ | PostgreSQL 15でMERGE文がサポートされました。 | ||
+ | |||
+ | * [[https:// | ||
+ | * [[https:// | ||
+ | |||
==== 集合演算 ==== | ==== 集合演算 ==== | ||
UNION句、INTERSEC句での変更はない。ただし、OracleのMINUS句は、PostgreSQLではEXCEPT句に変更する必要がある。\\ | UNION句、INTERSEC句での変更はない。ただし、OracleのMINUS句は、PostgreSQLではEXCEPT句に変更する必要がある。\\ | ||
行 198: | 行 217: | ||
https:// | https:// | ||
- | 複合インデックスは最初の列から連続して列が指定されている場合にのみ機能するという制限があるからです。\\ | + | 複合インデックスは**最初の列から連続して列が指定されている場合にのみ機能する**という制限があるからです。\\ |
そのため、インデックス定義の途中の列から条件を指定するとインデックスが効かず遅くなる。 | そのため、インデックス定義の途中の列から条件を指定するとインデックスが効かず遅くなる。 | ||
< | < | ||
行 205: | 行 224: | ||
WHERE AA = xxx AND AB = xxx AND AC = xxx AND AD = xxx | WHERE AA = xxx AND AB = xxx AND AC = xxx AND AD = xxx | ||
</ | </ | ||
+ | |||
+ | === bloomインデックスを使用する === | ||
+ | 主キーが複数の場合のインデックスにはデフォルトのb-treeインデックスが使用されるが、弱点として先頭のキーが外れるとインデックスが使われなくなる。その場合に複数列インデックスには、bloomインデックスを使用することで、先頭のキーが条件が外れていてもインデックスが使われる。\\ | ||
+ | [[https:// | ||
+ | |||
+ | ==== ダブルパイプ結合したインデックスは作成できない ==== | ||
+ | PostgreSQLではカラムをダブルパイプ結合するとインデックスが効かなくなります。\\ | ||
+ | Oracleではダブルパイプ結合したインデックス自体を作成できましたが、PostgreSQLではできません。\\ | ||
+ | PostgreSQLでは単一または複合インデックスを作成し、行値式を使用することでインデックスを効くようにします。\\ | ||
+ | |||
+ | < | ||
+ | SELECT * FROM TEST | ||
+ | WHERE | ||
+ | (UPDATE_DATE, | ||
+ | (UPDATE_DATE, | ||
+ | </ | ||
+ | ※Oracleの行値式は等価(=, | ||
==== ユーザ定義関数 ==== | ==== ユーザ定義関数 ==== | ||
=== NVL関数 === | === NVL関数 === | ||
行 233: | 行 269: | ||
| | ||
$BODY$ | $BODY$ | ||
- | | + | |
+ | |||
+ | CREATE OR REPLACE FUNCTION nvl(expr1 text, expr2 integer) | ||
+ | RETURNS integer AS | ||
+ | $BODY$ | ||
+ | SELECT COALESCE(cast($1 as int), $2); | ||
+ | $BODY$ | ||
+ | LANGUAGE SQL; | ||
+ | |||
+ | CREATE OR REPLACE FUNCTION nvl(expr1 NUMERIC, expr2 text) | ||
+ | RETURNS text AS | ||
+ | $BODY$ | ||
+ | SELECT COALESCE($1||'', | ||
+ | $BODY$ | ||
+ | LANGUAGE SQL; | ||
+ | </ | ||
+ | |||
+ | |||
+ | === add_month関数 === | ||
+ | Oracle関数から移植する際にユーザー関数のADD_MONTHSを作ることでSQL変更を回避する。 | ||
+ | |||
+ | <code sql add_month> | ||
+ | CREATE OR REPLACE FUNCTION ADD_MONTHS(TIMESTAMP with time zone, | ||
+ | RETURNS TIMESTAMP with time zone AS | ||
+ | $BODY$ | ||
+ | SELECT $1 + $2 * interval '1 month' | ||
+ | $BODY$ | ||
+ | LANGUAGE ' | ||
</ | </ | ||
行 329: | 行 392: | ||
Oracleは自律型トランザクションを使用できるが、PostgreSQLでは使用できない。 | Oracleは自律型トランザクションを使用できるが、PostgreSQLでは使用できない。 | ||
+ | |||
+ | === 対応 === | ||
+ | dblinkを使用して自律型トランザクションを実現させる。\\ | ||
+ | [[https:// | ||
===== OracleからPostgresSQL移行ツール ===== | ===== OracleからPostgresSQL移行ツール ===== | ||
==== 移行支援するツール(ora2pg) ==== | ==== 移行支援するツール(ora2pg) ==== |
it技術/データベース/postgresql/oracleからの移行.1589357603.txt.gz · 最終更新: 2020/05/13 17:13 by yajuadmin