😀

PostGIS 3.0にアップデートする際の注意点

2020/10/27に公開

はじめに

2019年10月20日にPostGIS 3.0.0がリリースされました。これからアップデートをする方、させられる方がいらっしゃるかと思います。関数増強等といった機能追加面を除いた、PostGIS 3.0における変更点を挙げます。2.xから移行する方向けの情報となれば幸いです。

バックアップを取っておくといいかもね

FreeBSDで言うところのPackeagesといった、依存関係を考慮したパッケージ配布サービスを使っていて、何かの拍子でPostGISのアップデートが中途半端に失敗してライブラリが消えたらpg_dumpさえ利かなくなるので、pg_dump, pg_restoreでの更新をできるように、先にダンプを取っておいた方がいいかも知れません。実際に中途半端に失敗したことがあるのですが、その時はソースを引っ張ってきてビルド、インストールしました。

また、パッケージ配布サービスを使用している場合に、PostgreSQLのバージョンを上げざるをえなくなって、ややこしいことになるかも知れないので、そういう意味でもpg_dump, pg_restoreでの更新を準備しておいた方がいいと思います。

ただこちらは、pg_upgradeを使うとバージョンが上がっても対応可能になっているはずです。その後で ALTER EXTENSION で、ある程度解決して、REINDEX で無事解決(後述)、となるなはずです。でも私は試していません。

ラスタが別エクステンションになった

ラスタ機能は、1.5.xでは正式機能でもなく分離されていましたが、2.xでPostGISのベクタ機能と切っても切り離せない関係になりました。

3.xでは、再び切り離されました。

ラスタ機能を使いたい場合には、次のようにします。

CREATE EXTENSION postgis;
CREATE EXTENSION postgis_raster;

GEOSとSFCGALの競合をなくした

ジオメトリエンジンとして、1.xからGEOSを使っていましたが、2.xからは一部にSFCGALを使えるようになりました。

このうち、GEOSは対応せずSFCGALのみが対応する関数については別にいいのですが、GEOSとSFCGALの両方が対応する関数がありました。ST_IntersectionとかST_Union等があてはまります。この場合に、GEOSとSFCGALのどちらを使うかは、GUCのpostgis.backendで決めていました。

3.xでは、GEOSとSFCGALの両方が持つ機能を使う関数は、SFCGALを使わないようにしています。さらに、どちらを使うか選択する必要がなくなったので、当然ですが、postgis.backendがなくなりました (postgis/lwgeom_backend_api.cが消えています)。

postgis_sfcgalエクステンションは、GEOSと競合しないものですので、3.xでも有効です。

インデックスの再構成が必要

次のことが理由で、インデックスの再構築が必要です。

GiST

マニュアルのリリースノートに

4230, 現在ではN次元ボックスの演算子 (overlaps, contains, within, equals)は、どちらのオペランドに存在しない次元を確認していません。アップグレード後にN次元インデックスのREINDEXを実行して下さい (Darafei Praliaskouskiさん)

とあります(コードは見てません)。GiSTで使用している演算子が変わっています。GiSTについてはインデックスの再構築が必要です。

B木

また、B木についても変更があります。

マニュアルのリリースノートに

3883, ソートではヒルベルト曲線と省略比較を使用しています。B木インデックスを使っている場合にはREINDEXの実行が必要です (Darafei Praliaskouskiさん)

とあり、B木インデックスを付けている場合にも、インデックスの再構築が必要となります。

ヒルベルト曲線はフラクタル図形の一つで、長方形を網羅でき、かつ、近くの地物がソート結果でも近めなところにいる可能性が高くなります。これは、2.5.0で導入されています。

従来は、XでソートしてXが全く同じならYでソートする方法を取っていました。とりあえずB木にも対応するために簡単に実装した程度だろうと思います。

ヒルベルト曲線は2.5.0で実装されていて、2.4.0までのマニュアルでは「4.6. インデクスを構築する」で「GISデータは合理的に一つの軸に沿ったソートはできません ((0,0)と(0,1)と(1,0)で大きいのはどれでしょう?)ので、B木インデクスは、ここでは使えません。」と説明していますが、2.5.0で消えています。

省略ソートは、ソート時に正式な比較関数を呼び出さずに、簡単な演算子で比較を行うようにすることで、短縮させるPostgreSQLの機能です。

ライブラリのファイル名にマイナーバージョンが入らなくなる

2.xまでは従来のライブラリ名はpostgis-2.5.soといったふうに、メージャーバージョンとマイナーバージョンとが織り込まれていました。

3.0ではpostgis-3.soと、メジャーバージョンのみとなりました。

マニュアル「2.5.1 コンフィギュレーション」の--with-library-minor-versionの解説部分によると

pg_upgradeを簡単にするために実施された変更です

となっています。

アップグレード時に古いバージョンのライブラリを消すと、pg_dumpさえ実行できなくなり、相当あせります。それがマイナーアップデート時にはなくなる、ということだろうと思います。

以前の命名規則の方が都合が良い場合には、コンフィギュレーションの--with-library-minor-versionオプションを指定すると、以前の命名規則になります。

おわりに

いかがだったでしょうか。

PostGIS 3.0で関数を増やしたり効率を改善したりといった機能強化とはまた別な変更があったことを紹介しました。

移行時には十分にお気をつけ下さい。幸運を。

本記事のライセンス

クリエイティブ・コモンズ・ライセンス
この記事は クリエイティブ・コモンズ 表示 4.0 国際 ライセンス の下に提供されています。

Discussion