2016-10-23 5 views
1

を構築:は、このようなクエリの機能ベースのインデックスのOracle SQL

WITH params as (SELECT -28 as lat, 151 as lon 
       FROM dual) 
SELECT sighting_id, sqrt(power(lat - latitude, 2) + power(lon - longitude, 2)) 

AS distance FROM sightings CROSS JOIN params 

WHERE sqrt(power(lat - latitude, 2) + power(lon - longitude, 2)) = 

(SELECT MAX(sqrt(power(lat - latitude, 2) + power(lon - longitude, 2))) 

FROM sightings CROSS JOIN params); 

はどのように正確に私はそれに機能ベースのインデックスを構築するに行きますか? sighting_idがプライマリキーですが、これはidがlongとlatsにそれを構築しなければならないのでしょうか? iveはいくつかの例を見上げましたが、誰も実際にここでIDを構築する方法を私に見せてくれないようです。

次のように実行計画は次のとおりです。

id operation   name 
0 select statement   
1 table access full sighting 
2 sort aggregate 
3 table access full sighting 
+0

IVEが使用しようとした使用にいくつかのrestiontionsある: は目撃のSQRT( - 緯度、2)+電源(LON - 電源(緯度経度、2))のインデックスIDXをCREATEは、 は、withステートメントで定義されたパラメータを見ることができません – 101ldaniels

答えて

2

私はsqrt(power(lat - latitude, 2) + power(lon - longitude, 2))によってインデックスを構築する必要がありunderstadと、問題の根本的な原因は、異なるテーブルのカラムがあるです。しかし、あなたの例では常に "-28"とlon = "151"です。 そして、あなたは

SELECT sighting_id 
    , sqrt(power(-28 - latitude, 2) + power(151 - longitude, 2)) AS distance 
FROM sightings 
WHERE sqrt(power(-28 - latitude, 2) + power(151 - longitude, 2)) = 
(SELECT MAX(sqrt(power(-28 - latitude, 2) + power(151 - longitude, 2))) 
FROM sightings); 

に問合せをリライトし、FBを作成することは、私はinstnaceためsighting_idを追加

create index I_sightings_distance on sightings (sighting_id 
    , sqrt(power(-28 - latitude, 2) + power(151 - longitude, 2))); 

をindnex。それは、高速でフルスキャンで使用することができます。

NB。 FBIndex

https://docs.oracle.com/cd/E11882_01/server.112/e41084/statements_5012.htm#SQLRF01212
関連する問題