ご存知かもしれませんが、Microsoft SQL Serverは非常に人気のあるRDBMSであり、データベースのサイズが大きい場合、またはデータベースがかなりの数のクライアントによって使用されている場合、ライセンスが非常に制限され、所有コストが高くなります。非常にユーザーフレンドリーなインターフェースを提供し、習得が容易です。これにより、インストールされたユーザーベースが大きくなりました。
PostgreSQLは世界で最も先進的なオープンソースデータベースです。 PostgreSQLコミュニティは非常に強力であり、既存の機能を継続的に改善し、新しい機能を実装しています。 db-engineの人気ランクによると、PostgreSQLは2017年のDBMSでした。
MS SQLServerからPostgreSQLに移行する理由
- MS SQL ServerはMicrosoft独自のデータベースですが、PostgreSQLはオープンソース開発者のグローバルコミュニティによって開発および保守されています。コストが問題になる場合は、間違いなくPostgreSQLを使用する必要があります。価格はこちらで確認できます。
- PostgreSQLはクロスプラットフォームのデータベースエンジンであり、Windows、Mac、Solaris、FreeBSD、およびLinuxで使用できますが、SQLServerはWindowsオペレーティングシステムでのみ実行されます。ご存知かもしれませんが、PostgreSQLはオープンソースで完全に無料ですが、MSSQLServerのコストはユーザー数とデータベースサイズによって異なります。
- 柔軟なオープンソースライセンスと、AWS、Googleクラウドなどのパブリッククラウドプロバイダーからの簡単な可用性
- パフォーマンスを向上させるためのオープンソースアドオンのメリット。
知っておくべきこと
Microsoft SQL ServerデータベースとPostgreSQLデータベースはどちらもANSI-SQLに準拠していますが、SQL構文、データタイプ、大文字と小文字の区別には違いがあり、データの転送はそれほど簡単ではありません。
移行する前に、MSSQLとPostgreSQLの違いを理解してください。両方のデータベースには多くの機能があるため、MSSQLとPostgreSQLでのこれらの機能の動作を知っておく必要があります。移行前に知っておくべき重要な違いを確認してください。
データ型マッピング
一部のMSSQLのデータ型はPostgreSQLのデータ型と直接一致しないため、対応するPostgreSQLのデータ型に変更する必要があります。
以下の表を確認してください。
Microsoft SQL Server | PostgreSQL | |
---|---|---|
BIGINT | 64ビット整数 | BIGINT |
BINARY(n) | 固定長のバイト文字列 | BYTEA |
ビット | 1、0またはNULL | ブール値 |
CHAR(n) | 固定長の文字列、1 <=n <=8000 | CHAR(n) |
VARCHAR(n) | 可変長の文字列、1 <=n <=8000 | VARCHAR(n) |
VARCHAR(max) | 可変長の文字列、<=2GB | テキスト |
VARBINARY(n) | 可変長バイト文字列、1 <=n <=8000 | BYTEA |
VARBINARY(max) | 可変長バイト文字列、<=2GB | BYTEA |
NVARCHAR(n) | 可変長UnicodeUCS-2文字列 | VARCHAR(n) |
NVARCHAR(max) | 可変長UnicodeUCS-2データ、<=2GB | テキスト |
テキスト | 可変長文字データ、<=2GB | テキスト |
NTEXT | 可変長UnicodeUCS-2データ、<=2GB | テキスト |
倍精度 | 倍精度浮動小数点数 | 倍精度 |
FLOAT(p) | 浮動小数点数 | 倍精度 |
整数 | 32ビット整数 | INTEGER |
NUMERIC(p、s) | 固定小数点数 | NUMERIC(p、s) |
日付 | 日付には年、月、日が含まれます | 日付 |
DATETIME | 分数付きの日付と時刻 | TIMESTAMP(3) |
DATETIME2(p) | 分数付きの日付と時刻 | TIMESTAMP(n) |
DATETIMEOFFSET(p) | 分数とタイムゾーンを含む日付と時刻 | TIMESTAMP(p)WITH TIME ZONE |
SMALLDATETIME | 日付と時刻 | TIMESTAMP(0) |
TINYINT | 8ビット符号なし整数、0〜255 | SMALLINT |
UNIQUEIDENTIFIER | 16バイトのGUID(UUID)データ | CHAR(16) |
ROWVERSION | 自動更新されたバイナリデータ | BYTEA |
SMALLMONEY | 32ビットの通貨額 | お金 |
画像 | 可変長のバイナリデータ、<=2GB | BYTEA |
MSSQLServerとPostgreSQLの非互換性
MSSQLServerとPostgreSQLには多くの非互換性があります。それらのいくつかをここで確認できます。拡張機能を作成することでそれらを自動化できるため、PostgreSQLの場合と同じようにMS SQL Server機能を使用でき、時間を節約できます。
DATEPART
PostgreSQLではDATEPARTをDATE_PARTに置き換える必要があります。
例
MS SQL:
DATEPART( datepart , date )
PostgreSQL:
date_part( text , timestamp )
date_part( text , interval )
ISNULL
PostgreSQLではISNULL関数をCOALESCE関数に置き換える必要があります。
例
MS SQL Server:
ISNULL(exp, replacement)
PostgreSQL:
COALESCE(exp, replacement)
スペース
MS SQL ServerのSPACE関数は、PostgreSQLのREPEAT関数に置き換える必要があります。
例
MS SQL Server:
SPACE($n)
ここで、$nは返されるスペースの数です。
PostgreSQL:
REPEAT(‘ ’, $n)
DATEADD
PostgreSQLはMSSQLServerと同様のDATEADD関数を提供していません。間隔リテラルで日時演算を使用して、同じ結果を得ることができます。
例
MS SQL Server:
--Add 2 day to the current date
SELECT DATEADD(day, 2, GETDATE());
PostgreSQL:
--Add 2 day to the current date
SELECT CURRENT_DATE + INTERVAL ‘2 day’;
文字列の連結
MS SQL Serverは文字列の連結に「+」を使用しますが、PostgreSQLは同じものに「||」を使用します。
例
MS SQL Server:
SELECT FirstName + LastName FROM employee;
PostgreSQL:
SELECT FirstName || LastName FROM employee;
CHARINDEX
PostgreSQLにはCHARINDEX関数があります。この関数は、PostgreSQLの同等のPOSITION関数に置き換えることができます。
例
MS SQL Server:
SELECT CHARINDEX('our', 'resource');
PostgreSQL:
SELECT POSITION('our' in 'resource');
GETDATE
GETDATE関数は、現在の日付と時刻を返します。 PostgreSQLにはGETDATE関数はありませんが、同じ目的でNOW()関数があります。 GETDATE関数が複数回出現する場合は、拡張機能を使用してそれらを自動化できます。拡張機能を使用してモジュールを作成する方法を確認してください。
例
MS SQL Server:
SELECT GETDATE();
PostgreSQL:
SELECT NOW();
ツール
いくつかのツールを使用して、MSSQLServerデータベースをPostgreSQLに移行できます。使用する前にツールをテストしてください。
-
Pgloader
pgloaderツールを使用して、MSSQLデータベースをPostgreSQLに移行できます。 pgloaderのコマンドは、MSSQLデータベースからデータをロードします。 Pgloaderは、インデックスの構築、主キー、外部キーの制約など、スキーマの自動検出をサポートしています。
Pgloaderは、MSSQLデータ型をPostgreSQLデータ型に変換できるさまざまなキャストルールを提供します。
-
Sqlserver2pgsql
これは、MicrosoftSQLServerデータベースをPostgreSQLデータベースに可能な限り自動的に変換するためのもう1つのオープンソース移行ツールです。 Sqlserver2pgsqlはPerlで書かれています。
Sqlserver2pgsqlツールは2つのことを行います:
- SQLServerスキーマをPostgreSQLスキーマに変換します
- すべてのデータをSQLServerからPostgreSQLに移行するためのPentahoDataIntegrator(Kettle)ジブを生成できます。これはオプションのパーツです。
テスト
一部の機能は両方のデータベースで同じであるため、アプリケーションと移行されたデータベースをテストすることは非常に重要ですが、動作は異なります。
いくつかの一般的なシナリオを確認する必要があります:
- すべてのデータベースオブジェクトが正しく変換されているかどうかを確認します。
- DMLのすべての機能の動作が正しく機能しているかどうかを確認します。
- サンプルデータを両方のデータベースにロードし、両方のデータベースのすべてのDMLクエリの結果を確認します。すべてのSQLの結果は同じである必要があります。
- DMLのパフォーマンスを確認し、必要に応じて改善します。