Как улучшить скорость запроса sqlite - PullRequest
0 голосов
/ 31 декабря 2018

Я работаю в Spaceite-GUI с БД sqlite.У меня есть большая таблица (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;

Ответы [ 2 ]

0 голосов
/ 31 декабря 2018

Очевидно, что индекс (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;

Это размер ожидаемой таблицы.Если он действительно большой - скажем, более нескольких миллиардов строк - тогда размер результирующего набора может быть определяющим фактором.Если это так, то проблема заключается в дублировании значений лат / длин в таблицах.Дальнейшее расследование может подсказать, что с ними делать.

0 голосов
/ 31 декабря 2018

Прежде всего, вы хотите многосколонный индекс sqlite для каждой таблицы с полями широты и долготы, упорядоченными так же, как вы присоединяетесь к ним.Это должно позволить вашей базе данных оптимизировать операцию JOIN, которая происходит в вашем запросе.

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

Хорошей идеей также является ВЫБОР только тех полей, которые вам действительно нужны: если вам не нужны большие двоичные объекты(или любое другое поле), не просите об этом.Это уменьшит объем данных, которые должна обрабатывать ваша база данных.

Если эти меры не решают проблему, то вам нужно взглянуть на другие части картинки:

  • allocateбольше системных ресурсов в вашей базе данных
  • мигрирует в более мощную СУБД, чем sqlite
...