如何提高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 的重复值。进一步调查可能会建议如何处理它们。
我在 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 的重复值。进一步调查可能会建议如何处理它们。