如何提高sqlite查询速度

时间:2018-12-31 00:41:16

标签: sql sqlite spatialite

我正在使用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;

2 个答案:

答案 0 :(得分:2)

首先,您希望在每个表上同时包含经度和纬度字段的a sqlite multicolumn indice,并按与加入它们相同的方式进行排序。这应该使您的数据库引擎可以优化查询中发生的JOIN操作。

CREATE INDEX allpol_idx ON allpol(latitude, longitude);
CREATE INDEX policylutgrid_idx ON policylutgrid(latitude, longitude);

最好只选择您真正需要的字段:如果您不需要BLOB(或任何其他字段),请不要输入。这将减少数据库必须处理的数据量。

如果这些措施不能解决问题,那么您必须查看图片的其他部分:

  • 为数据库分配更多系统资源
  • 迁移到比sqlite更强大的RDBMS

答案 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;

这是您期望的表的大小。如果它真的很大(比如说超过几十亿行),那么结果集的大小可能是决定因素。如果是这种情况,那么问题在于表中的经纬度重复值。进一步的调查可能会建议如何处理它们。

相关问题