我正在使用sqlite数据库在spatialite-gui中工作。我有一个大表(8000万条记录),我想制作一个表,其中包含另一个表的代码,该表有大约48000条记录。
我编写了以下代码,并在我的大表的前80k条记录中对其进行了测试;大约花了1:25才能运行。当我在大桌子上运行它时,它运行了100个小时,最终我取消了,但是没有结果。
我该怎么做才能提高查询性能?我有关于经度的索引,但没有关于纬度的索引;这两个字段都不是唯一的。 lut.pointgeom和lut.gridgeom都是BLOB字段,并非严格必要。
CREATE TABLE policy_gcode AS
SELECT
p.*,
lut.gcode,
lut.pointgeom,
lut.gridgeom
FROM
allpol AS p
JOIN policylutgrid AS lut
ON p.latitude = lut.latitude
AND p.longitude = lut.longitude;
答案 0 :(得分:2)
首先,您希望在每个表上同时包含经度和纬度字段的a sqlite multicolumn indice,并按与加入它们相同的方式进行排序。这应该使您的数据库引擎可以优化查询中发生的JOIN操作。
CREATE INDEX allpol_idx ON allpol(latitude, longitude);
CREATE INDEX policylutgrid_idx ON policylutgrid(latitude, longitude);
最好只选择您真正需要的字段:如果您不需要BLOB(或任何其他字段),请不要输入。这将减少数据库必须处理的数据量。
如果这些措施不能解决问题,那么您必须查看图片的其他部分:
答案 1 :(得分:2)
很显然,每个表中(latitude, longitude)
上的索引(如果没有的话)将对查询有所帮助(实际上,一个索引可能就足够了)。但是基本的问题可能是数据的大小。
如果结果集为,则尤其如此。 。 。真的很大。您可以通过运行以下命令计算大小:
select sum(p.cnt * lut.cnt)
from (select latitude, longitude, count(*) as cnt
from allpos
group by latitude, longitude
) p join
(select latitude, longitude, count(*) as cnt
from policylutgrid
group by latitude, longitude
) lut
on p.latitude = lut.latitude and p.longitude = lut.longitude;
这是您期望的表的大小。如果它真的很大(比如说超过几十亿行),那么结果集的大小可能是决定因素。如果是这种情况,那么问题在于表中的经纬度重复值。进一步的调查可能会建议如何处理它们。