空間インデックスを使用すべきでない場合


29

私は主にOracleで働いていたのでこれを求めていますが、過去1年間はPostGISとSQLServer 2008で倍増しています。Oracleのほとんどの空間関数はORA-13226エラーを返す空間インデックスなしでは機能しません。

13226、00000、「インタフェースは空間索引なしではサポートされていません」原因:ジオメトリ表に空間索引がありません。// *アクション:空間演算子で参照されるジオメトリテーブルに空間インデックスがあることを確認します。

これは理にかなっています。空間クエリを実行します=空間インデックスが必要です。しかし、私が理解している限りでは、SQL ServeではなくPostGISもこれを必要としません。PostGISには、空間インデックスを明示的に使用しない関数(_ *例_STContains)があるようです。

問題は、空間インデックスを使用してはならないケースがあるかどうかです。「取る」か「残す」かは必ずしも違いません。つまり、違いはありませんが、空間インデックスを使用しないとパフォーマンスが低下します。私にとって、最後の文は用語の矛盾ですが、そうでなければPostGISがこれらの機能を提供するのはなぜですか?


3
PostGIS SET enable_seqscan = offでインデックスがどこで遅くなるかを確認したい場合。これにより、PostgreSQLは毎回インデックスを使用するようになります。速度をオンにして比較してください。
ショーン

このスレッドを開始していただきありがとうございます。私は、私の組織(政府)がoracle / sdeフィーチャクラスおよびテーブルの空間(または属性)インデックスを使用しない理由を解明しようとして、ネット上の情報を注いでいます。今、私はそれらに提示するいくつかの引数を持っているので、自分の髪を抜く必要はなく、クエリがそれ自体を解決するのを待っています。
マイク

回答:


12

mapoholic、

一般的に言えば、本当に小さなテーブルを扱っているのでなければ、空間インデックスなしで空間クエリを実行する理由はありません。それでも、インデックスを使用しないが、&&インデックス可能なショートサーキットボックス演算子を使用するST_を使用します。_STで始まる関数は、エンドユーザーが使用するためのものではありません。それらが存在する理由は、彼らがしなければならないからです。PostGIS空間インデックスは、SQLインライン化を使用してインデックスの使用を強制します。通常、_STはGEOSによって行われ、&&は並べ替えられるインデックスです。したがって、_STは実際には実装アーティファクトです。

つまり、1つの関数ではないので、より強力な空間チェックの前にインデックス操作を一度にすべて並べ替えることができます。


乾杯LR1234567 これが私が探していたものだと思います。
マポホリック

25

データセットが頻繁に追加および更新される場合、インデックスの再構築を引き起こすINSERT、DELETE、およびUPDATEステートメントはデータベースを遅くする可能性があります。

OSMデータセット全体をデータベースにロードするなどの一括挿入の場合、インデックスを削除し、後で再度作成する方が迅速な場合があります。

インデックスを無視する方が効率的である場合(たとえば、テーブルがメモリにロードできるほど小さい場合)、データベースクエリプロセッサはこれを自動的に行う必要があります。

空間インデックスなしでクエリを実行できる主な理由は、インデックスを削除することなく、インデックスを使用することで得られるパフォーマンスの利点を測定することです。

最後に、クエリとマップ表示のパフォーマンスを大幅に向上させたい場合は、システム開発の適切な瞬間にインデックスの作成を遅らせたいかもしれません...


3
(+1)最後の発言で少しシニシズムを検出しますか?:-)
whuber

まったくそうではありません;-)しかし、慎重に調整されたインデックスをドロップ/再作成することは、「データベースの変更にXが多くの時間を費やした理由」に対する有用な答えです。
geographika

おかげさまで、whuberの発言に同意します!;-)一括読み込み時に空間インデックスを削除または無効にすることを理解しています-または問題のすべてのインデックスが、空間インデックスを使用せずに空間クエリを実行する理由を考えることはできませんか?テーブルが十分に小さい場合、インデックスを使用しても違いは生じないかもしれませんが、インデックスを使用しないことを選択しますか?わからない、PostGISの非空間インデックス関数の存在にもっと困惑しているだけだと思う
...-mapoholic

2
テーブルが十分に小さく、メモリに収まっている場合、インデックスを使用すると、ランダムスキャンが必要になり、シーケンシャルスキャンを実行するよりもコストがかかります。wiki.postgresql.org/wiki/…–
ショーン

2
@mapoholic-_ST_Containsは、old.nabble.com /から判断して、手動でデータのプレフィルターを実行する必要があったときから残される可能性があります
geographika

10

これは暗黙的だと思いますが、代わりに使用できる非空間インデックスがある場合、クエリに空間インデックスを使用しません。たとえば、米国にまたがる2,113,450ポイントがテーブルにロードされています。アラスカ州内にあるすべてのポイントを取得する場合、ポイントジオメトリのGISTインデックスを使用した空間クエリを実行して、アラスカ州のジオメトリと比較するか、または「state_alpha」= 'AK'を持つすべてのポイントを返すために、ポイントデータの "state_alpha"フィールド(インデックスも作成されます)。

「これの空間部分はどこですか」とあなたは尋ねますか?さて、Alaska_pointsを収集した後にさらに空間分析を行う必要がある場合は、最初に非空間クエリを使用してそれらのポイントジオメトリを収集する方が高速です。また、本当に大きなデータセットの場合、ルックアップフィールド(またはテーブル)を追加することでメリットが得られることも意味します。繰り返しますが、これはおそらく誰にでも明らかです。過去に空間インデックスのみが設定されたグローバルデータセットで共通のクエリが「国内のすべての機能」であったことがあるためです。インデックス付きのcountry_fipsフィールドを追加することで、多くのパフォーマンスを獲得しました。

以下に、EXPLAIN ANALYZEの結果をいくつか示します。(注:BBOXクエリを使用して、空間クエリを可能な限り効率的にしようとしました。状態のアウトラインを使用すると、遅くなります。)

# explain analyze select count(*) from gnis_names where state_alpha = 'AK';
Aggregate  (cost=57359.45..57359.46 rows=1 width=0) (actual time=76.606.. 76.607 rows=1 loops=1)
<snip>
Total runtime: 76.676 ms

# explain analyze select count(*) from gnis_names where the_geom && GeomFromText('POLYGON((-179.14734 51.219862,-179.14734 71.3525606439998,179.77847 71.3525606439998,179.77847 51.219862,-179.14734 51.219862))',4326);
Aggregate  (cost=27699.86..27699.87 rows=1 width=0) (actual time=86.523..86.524 rows=1 loops=1)
<snip>
Total runtime: 86.584 ms 

どうもありがとう。あなたがそれを言うとき、それは明白に見えるかもしれませんが、私の最初の考えは、属性のみではなく空間クエリを実行することです。+1
麻薬中毒者

0

この声明にちょうど気づいた

これは理にかなっています。空間クエリを実行します=空間インデックスが必要です

私にはこれはまったく意味がありません。SQLServerとPostgisの両方がより良い仕事をするか、少なくともパフォーマンスの詳細を気にしないと思います。実際、SQL ServerとPostgisの両方が空間インデックスをまったく使用しないこともあります(フルテーブルスキャンに戻します)。

Oracleの場合、インデックスを作成する必要があるため、user_sdo_geom_metadataを埋める必要があります。

これを英数字インデックスと比較するだけで、それらはパフォーマンス上の理由から存在します。SQLステートメントは、インデックスの有無にかかわらず動作するはずです。

Oracleデータベースでは、インデックスを削除すると、空間クエリを使用できずに動作しなくなるエラーやアプリが大量に発生します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.