如何提高sqlite查询速度

How to improve sqlite query speed

我在 spatialite-gui 中使用 sqlite 数据库工作。我有一个很大的 table(80,000,000 条记录),我想制作一个 table,其中包含来自另一个 table 的代码,它有大约 48,000 条记录。

我编写了以下代码并在我的大 table 的前 80k 条记录上进行了测试;大约用了 1:25 到 运行。当我 运行 它在大 table 上时,它持续了 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;

首先,您希望每个 table 上的 a sqlite multicolumn indice 具有纬度和经度字段,排序方式与加入它们的方式相同。这应该允许您的数据库引擎优化查询中发生的 JOIN 操作。

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

仅 SELECT 您真正需要的字段也是一个好主意:如果您不需要 BLOB(或任何其他字段),请不要要求它。这将减少您的数据库必须处理的数据量。

如果这些措施都没有解决问题,那你就得看看图片的其他部分了:

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

显然,每个 table 中 (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;

这是您预期的尺寸 table。如果它真的很大——比如超过几十亿行——那么结果集的大小可能是决定因素。如果是这样,那么问题就是 table 中 lats/longs 的重复值。进一步调查可能会建议如何处理它们。