0

私は Firebird を使用しており、EVENTS というテーブルを作成しました。列は次のとおりです。

id (INT) | name (VARCHAR) | category (INT) | website (VARCHAR) | lat (DOUBLE) | lon (DOUBLE)

ユーザーは、自分の周囲の特定の半径でイベントを検索したいと考えていますが、ホーム都市の 2、3 文字しか入力しませんでした。つまり、たとえば、緯度と経度を含む 200 の可能な都市があります。したがって、私の SQL クエリは次のようになります。

SELECT id FROM events WHERE ((lat BETWEEN 30.09 AND 30.12) AND (lon BETWEEN 40.78 AND 40.81)) OR ((lat BETWEEN 30.09 AND 30.12) AND (lon BETWEEN 40.78 AND 40.81)) OR ...

したがって、WHERE 句で 200 の制約を取得し、実際に結果を取得するのに数秒かかります。

クエリが恐ろしく見えるかもしれませんが、多くの制約が本当にボトルネックになっているのでしょうか? このクエリを最適化できますか?

4

6 に答える 6

2

私の推測では、データベースエンジンは、基準が多くの行を返す可能性が高いと判断したため、テーブルを誤ってフルスキャンします。正しいことをするようにヒントを与えるか、クエリのある種の書き直しを実行します(たとえば、役立つ場合と役に立たない場合があります)

SELECT id
  FROM cities c
  JOIN events e ON (e.lat BETWEEN c.lat - .01 AND c.lat + .01) AND (e.lon BETWEEN c.lon - .01 AND c.lon + .01)
 WHERE c.name LIKE 'x%'

SQLサーバーでは次のように書くことができます

SELECT id
  FROM cities c
  INNER LOOP JOIN events e ON (e.lat BETWEEN c.lat - .01 AND c.lat + .01) AND (e.lon BETWEEN c.lon - .01 AND c.lon + .01)
 WHERE c.name LIKE 'x%'

正しい計画を確実にするために(lat列とlon列に一緒にインデックスがありますか?)

于 2009-09-16T09:34:22.920 に答える
1

速度のトレードオフ スペース:

都市は動かない。イベントを追加するたびに、各イベントと各都市の間の距離を事前に計算し、近くのすべての都市までの距離を保存できます。これを都市別に索引付けできるため、特定の都市に近い (または同じプレフィックスを持つ 200 近くの都市) イベントを直接見つけることができます。実際の経度/緯度のフィルタリングは、はるかに小さなイベント セットに制限できます。

于 2009-09-16T15:34:37.487 に答える
0

相関サブクエリを試してください:

select *
from events e
where exists
( select *
  from cities c
  where c.name like 'X%' and
        e.lat BETWEEN c.lat - .01 AND c.lat + .01 and
        e.lon BETWEEN c.lon - .01 AND c.lon + .01
)

一部のシナリオでは、結合よりも高速に動作します。

于 2010-02-04T16:43:45.730 に答える
0

events.lat および/または events.long に範囲検索に適したインデックス (B ツリー インデックス) を作成します (ただし、両方に単一のインデックスを作成することはできません!)。

本当に必要なのは、多次元データのインデックス作成を可能にし、優れた範囲検索パフォーマンスを提供する R ツリーなどです。PostgreSQL にはそのための GiST があります。この種の問題に対して、Firebird がどのようなサポートを提供しているかはわかりません。

詳細については、Wiki リンク: http://en.wikipedia.org/wiki/R-tree http://en.wikipedia.org/wiki/GiST

于 2009-09-16T14:55:35.493 に答える
0

緯度と経度だけでなく、イベントの場所の名前も含めるように、(可能であれば) データベースを再設計できます。クエリには、likeステートメントまたは類似の ( begins with?) が含まれます。これが使えない解決策かもしれないことはわかっていますが、(球状の意味で) 正方形の都市や地域に自分自身を制限することは、私には少し奇妙に思えます;)

于 2009-09-16T09:26:25.060 に答える