在Oracle中:我有一个表空间,其中记录了许多汽车的位置.每条记录都有里程、时间、经度和纬度.表空间有五列:‘PLATENO’、‘SENDTIME’、‘Mileage’和‘LATIMATION’.它们分别代表汽车的车牌号、位置、发送时间、里程和汽车的两个坐标.‘SENDTIME’列中的值采用DATETIME格式.还有,我有一些建筑物的坐标.我要找出轨迹在大楼附近200米的车辆.因此,我创建了一个名为Builds的表来记录建筑物,如下所示:
CREATE TABLE BUILDINGS (
NAME VARCHAR2(50) NOT NULL,
ADDR VARCHAR2(50) NOT NULL,
LONGITUDE NUMBER NOT NULL,
LATITUDE NUMBER NOT NULL
);
INSERT INTO BUILDINGS (NAME, ADDR, LONGITUDE, LATITUDE) VALUES (
'北京市大兴区永兴路7号院1号楼1F2F局部内装修工程', '北京市大兴区永兴路7号院1号楼',
116.314497, 39.685536);
INSERT INTO BUILDINGS (NAME, ADDR, LONGITUDE, LATITUDE) VALUES (
'北京金沃夫生物工程科技有限公司23号楼诊断试剂GMP生产车间及配套实验室、研发实验室建设项目', '北京市大兴区华佗路50号院',
116.282965, 39.668402);
然后使用sdo_geom.sdo_Distance函数计算距离,找到满足我要求的线段.
select g.PLATENO, g.SENDTIME, g.MILEAGE, g.LONGITUDE, g.LATITUDE,
b.NAME as BUILDING_NAME, b.ADDR, b. LONGITUDE, b.LATITUDE
from GPSINFO g, BUILDINGS b
where sdo_geom.sdo_distance (
sdo_geometry (2001, 4326, sdo_point_type (g.LONGITUDE, g.LATITUDE, null), null, null),
sdo_geometry (2001, 4326, sdo_point_type (b.LONGITUDE, b.LATITUDE, null), null, null),
0.01,
'unit=M'
) <= 200;
但是查询运行得相当慢.我只需要三条符合我标准的记录.如何优化我的代码?我先试着取,但不起作用:
select v.PLATENO, v.SENDTIME, v.MILEAGE, v.LONGITUDE, v.LATITUDE, b.NAME as BUILDING_NAME
from VEHICLES v, BUILDINGS b
where sdo_geom.sdo_distance (
sdo_geometry (2001, 4326, sdo_point_type (v.LONGITUDE, v.LATITUDE, null), null, null),
sdo_geometry (2001, 4326, sdo_point_type (b.LONGITUDE, b.LATITUDE, null), null, null),
0.01,
'unit=M'
) <= 50
and HAVERSINE(v.LONGITUDE, v.LATITUDE, b.LONGITUDE, b.LATITUDE) <= 50
ORDER BY v.SENDTIME DESC
FETCH FIRST 3 ROWS ONLY;