我正在用Oracle计算人类的行走速度。我有一张桌子,像:
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点的距离的代码。
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把表切成块来加速查询吗?
发布于 2015-02-06 19:15:15
你的任务很艰巨。可能没有简单的解决办法。您可以从基于函数的索引开始
在timestamp_fb_idx上创建索引table1 (DATEADD(mi,1,时间戳))
看看会不会有什么区别。
发布于 2015-02-06 19:02:11
首先,我很好奇你打算如何得到10^100行。如果地球上有10^10的人口,那么每个人都需要10^90行。如果人们的和弦每秒存储一次,他们应该活10^80年来填充数据库。
如果只考虑这个查询,最好的索引方法是使用联接条件字段作为主键来组织这个表索引。
通常,这个查询的速度应该基于迭代而不是加入。但总的来说,任务太荒谬了,不可能是真的。这是一个学习任务(有几百行),或者你错过了其中许多重要的部分。
https://stackoverflow.com/questions/28372738
复制相似问题