Медленная производительность запросов в sqlite, но sqlite studio сообщает о быстром выполнении - PullRequest
0 голосов
/ 09 июля 2020

У меня есть две большие (~ 100 миллионов строк) таблицы, к которым я пытаюсь присоединиться. У меня есть индексы для обоих столбцов, используемых в соединении. Выбор первых 1000 строк занимает несколько часов, но когда это будет сделано, SQLite Studio сообщает, что это заняло всего минуту. Затем SQLite Studio требуется еще несколько часов, чтобы подсчитать строки для моих результатов, и если я попытаюсь открыть другое окно запроса, оно перестанет отвечать на эти часы. Все время диспетчер задач показывает около 25% использования ЦП и 7-8 МБ / с дискового пространства для процесса. Я также попытался выбрать верхние 10 тыс. Строк, и мне потребовалось 11 часов для завершения и еще 11 часов, чтобы получить количество строк, но сообщил, что запрос завершился за 4 минуты. Вот запрос:

Select d.PRC, s.prccd, abs(abs(d.PRC)-s.prccd), *
from dsf d
join secd.secd s
on s.datadate=d.DATE and substr(s.cusip,1,8)=d.CUSIP
where abs(abs(d.PRC)-s.prccd)>.0006
limit 10000
  1. Почему это длится так долго? Я знаю, что 100 миллионов строк - это много, но с отсортированными индексами разве соединение не должно происходить за линейное время? Добавление индексов заняло несколько минут, а не часов, и это должно быть O (n log n), так как он должен сортировать. Я получаю те же результаты без использования substr (). Так почему же это занимает так много времени?

  2. Почему SQLite Studio сообщает, что это занимает всего минуту или две?

  3. Почему SQLite Studio требуется так много времени для подсчета строк результатов после того, как результаты уже отображаются?

EDIT: вывод EXPLAIN QUERY PLAN

5   0   0   SCAN TABLE dsf AS d
7   0   0   SEARCH TABLE secd AS s USING INDEX secd_datadate (datadate=?)
...