首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >创建索引以加快查询速度

创建索引以加快查询速度
EN

Stack Overflow用户
提问于 2015-02-06 18:50:19
回答 2查看 258关注 0票数 0

我正在用Oracle计算人类的行走速度。我有一张桌子,像:

代码语言:javascript
复制
Name   timestamp                    latitude longitude
Billy  2014-10-10  10:10:12             x1       y1
Billy  ...                              x2       y2
... 
Jim                                     k1       m1
Jim                                     k2       m2
...
Kate                                    l1       n1
Kate                                    l2       n2

我想选择那些在任何一分钟内平均速度在5-7米/分钟之间的人。这是我用Haversin定律计算A点到B点的距离的代码。

代码语言:javascript
复制
    CREATE INDEX PIndex
ON  table1 (phoneid,timestamp,gps_latitude,gps_longitude)

    SELECT a.phoneid
           ,a.gps_latitude as alat
         ,a.gps_longitude as along
           ,b.gps_latitude as blat
          ,b.gps_longitude as blong
          ,3956 * 2 * ASIN(SQRT( POWER(SIN((alat - abs(blat)) * pi()/180 / 2), 2)  + COS(along * pi()/180 ) * COS(abs(blong) * pi()/180)
            * POWER(SIN((along - blong) * pi()/180 / 2), 2) ))
       AS distance
       From Table1  a
       inner join Table1 b
       on a.phoneid = b.phoneid
       and a.timestamp = DATEADD(mi,1,b.timestamp)
      Where distance between 5 and 7

关于这一点,我有两个问题:

(1)如果我的表非常大,并且每秒钟更新一次。(例如10^9行)。我想要创建一个索引来加速查询。如何在我的选择中实现这一点?

(2)解决速度问题。有什么方法像用Java把表切成块来加速查询吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-02-06 19:15:15

你的任务很艰巨。可能没有简单的解决办法。您可以从基于函数的索引开始

在timestamp_fb_idx上创建索引table1 (DATEADD(mi,1,时间戳))

看看会不会有什么区别。

票数 2
EN

Stack Overflow用户

发布于 2015-02-06 19:02:11

首先,我很好奇你打算如何得到10^100行。如果地球上有10^10的人口,那么每个人都需要10^90行。如果人们的和弦每秒存储一次,他们应该活10^80年来填充数据库。

如果只考虑这个查询,最好的索引方法是使用联接条件字段作为主键来组织这个表索引。

通常,这个查询的速度应该基于迭代而不是加入。但总的来说,任务太荒谬了,不可能是真的。这是一个学习任务(有几百行),或者你错过了其中许多重要的部分。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28372738

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档