【问题标题】:How to improve sqlite query speed如何提高sqlite查询速度
【发布时间】:2018-12-31 00:41:15
【问题描述】:

我正在使用 sqlite db 在 spatialite-gui 中工作。我有一个大表(80,000,000 条记录),我想创建一个表,其中包含另一个表中的代码,该表有大约 48,000 条记录。

我编写了以下代码,并在我的大表的前 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;

【问题讨论】:

    标签: sql sqlite spatialite


    【解决方案1】:

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

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

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

    如果这些措施都不能解决问题,那你还得看看图片的其他部分:

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

    【讨论】:

    • 我对两列都做了索引,它显着提高了查询速度。有人评论了 EXPLAIN QUERY PLAN,所以我也这样做了。我还接受了我朋友的建议,并检查了查询时间没有随着样本量的增加而呈指数增长。最后,我无法让查询在我的笔记本电脑上运行,我相信我的内存不足。我把所有东西都搬到了一台更强大的机器上,它在不到 10 分钟内就运行了!谢谢。
    【解决方案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;
    

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

    【讨论】:

    • 谢谢。我运行它并得到了我期待的答案,这很好,而不是数十亿行,这也很好。我将在两列上尝试索引,看看它是否至少运行到最后。否则我会接受另一个建议,即转向更强大的 RDBMS。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-29
    • 1970-01-01
    • 2019-10-09
    • 1970-01-01
    • 2021-11-17
    相关资源
    最近更新 更多