Меня смущает резко отличающееся время работы следующих двух запросов, которые производят идентичный вывод. Запросы выполняются на Sqlite 3.7.9, на столе с примерно 4,5 миллионами строк, и каждый из них производит ~ 50 строк результатов.
Вот запросы:
% echo "SELECT DISTINCT acolumn FROM atable ORDER BY acolumn;" | time sqlite3 mydb
sqlite3 mydb 8.87s user 15.06s system 99% cpu 23.980 total
% echo "SELECT acolumn FROM (SELECT DISTINCT acolumn FROM atable) ORDER BY acolumn;" | time sqlite3 options
sqlite3 mydb 1.15s user 0.10s system 98% cpu 1.267 total
Не следует ли ближе работать с двумя запросами? Я понимаю, что может быть, что планировщик запросов выполняет операции "сортировки" и "разные" в разных заказах, но если это так, нужно ли это? Или он должен знать, как это сделать быстрее?
Изменить: по запросу здесь выводится команда "EXPLAIN QUERY PLAN" для каждого запроса.
Для первого (монолитного) запроса:
0|0|0|SCAN TABLE atable (~1000000 rows)
0|0|0|USE TEMP B-TREE FOR DISTINCT
Для второго (подзапроса) запроса:
1|0|0|SCAN TABLE atable (~1000000 rows)
1|0|0|USE TEMP B-TREE FOR DISTINCT
0|0|0|SCAN SUBQUERY 1 (~1000000 rows)
0|0|0|USE TEMP B-TREE FOR ORDER BY