【问题标题】:building a function based index oracle sql构建基于函数的索引oracle sql
【发布时间】:2016-10-23 05:44:45
【问题描述】:

对于这样的查询:

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 上构建它?我查看了一些示例,但似乎没有一个真正向我展示我如何在这里构建一个。

执行计划如下:

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

【问题讨论】:

  • 我尝试使用:CREATE INDEX Idx ON 目击sqrt(power(lat - latitude, 2) + power(lon - longitude, 2));除了它无法看到 with 语句中定义的参数

标签: sql oracle function indexing


【解决方案1】:

据我了解,您需要通过sqrt(power(lat - latitude, 2) + power(lon - longitude, 2)) 建立索引,问题的根本原因是存在来自不同表的列。但在您的示例中,lat 总是“-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索引

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

我为实例添加了Sighting_id。它可以用于快速全扫描。

注意。使用 FBIndex 有一些限制 https://docs.oracle.com/cd/E11882_01/server.112/e41084/statements_5012.htm#SQLRF01212

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-06-05
    • 2017-06-23
    • 1970-01-01
    • 2014-04-05
    • 2015-12-05
    • 1970-01-01
    • 2013-03-24
    相关资源
    最近更新 更多