2011-08-19 21 views
0

私のデータベース内のある点にかなり近いエントリをすべて返す必要があります。私は(WHEREセクションで)これをやっている現時点では:私のデータベースは多数のレコードを持っており、平方根を計算することは遅いようクエリ内の単純な関数

OR ( 
    (Addresses.Latitude IS NOT NULL) 
    AND (Addresses.Longitude IS NOT NULL) 
    AND (Abs(Addresses.Latitude - @SearchInLat) < 0.5) 
    AND (Abs(Addresses.Longitude - @SearchInLng) < 0.5) 
) 

私はマンハッタン距離ではなく、デカルト距離をしています。

私はSQLデータベースにはまったく新しいですが、SELECT procuduresの中に機能を持たせることは効率が悪いと考えられています。これは、絶対値をとるなどの単純な関数にも適用されますか?次のようなものです:

OR ( 
    (Addresses.Latitude IS NOT NULL) 
    AND (Addresses.Longitude IS NOT NULL) 
    AND ((Addresses.Latitude - @SearchInLat) < 0.5) 
    AND ((Addresses.Latitude - @SearchInLat) > -0.5) 
    AND ((Addresses.Longitude - @SearchInLng) < 0.5) 
    AND ((Addresses.Longitude - @SearchInLng) > -0.5) 
) 

もっと良い解決策はありますか?

+0

私はあなたが2番目の例でABSを削除するつもりであると思うと思います。 –

+0

私は、ありがとう。私は常にそれらを提出する前に物事を2回読むが、しかし、常に何かを見逃しているようだ! – Oliver

答えて

5

ABSの場合のように、返されるデータに対して関数を実行させることは効率的ではないことがよくあります。私はあなたがこの場合に何らかのトラブルに陥っているとは思わない。

OR ( 
    (Addresses.Latitude IS NOT NULL) 
    AND (Addresses.Longitude IS NOT NULL) 
    AND ((Addresses.Latitude - @SearchInLat) BETWEEN -0.5 AND 0.5) 
    AND ((Addresses.Longitude - @SearchInLng) BETWEEN -0.5 AND 0.5) 
+0

よかった、ありがとう。私はそのような構文があるのか​​知らなかった。 '-0.5 <(Addresses.Latitude - @SearchInLat)<0.5'を実行しようとしましたが有効ではありませんでした。 – Oliver

+1

ちょっと違う点に注意してください。元は '>'と '<'です。 'BETWEEN'は実際には'> = 'と' <= '... –

+0

です。それを' Addresses.Latitude BETWEEN -0.5 - @SearchInLat AND 0.5 - @ SearchInLat'に変更するのがエンドポイント一度だけ計算する必要があります。 –

2

ABSといくつかの組み込み関数(算術関数など)は、オプティマイザによって非常に簡単に処理されると思います。他のものはそれほど多くありません(文字列と日付演算)。

あなたの特別なケースでは、あなたはABSでOKだと思います。

+0

チップをありがとう。オプティマイザを扱うことはとても苦痛です!小さな変化は、全く違ったやり方でそれを働かせることができます。私は何が助けてくれるのか、どんなものが何かを妨げるのは難しいと思う。 – Oliver