Я читал, что соединения лучше, чем подзапросы.Как понять результат SQLite `EXPLAIN QUERY PLAN`?
Но
EXPLAIN QUERY PLAN
SELECT Queue.Id, NULL
FROM Queue
INNER JOIN LastQueue
ON Queue.Id=LastQueue.Id
дает
Array
(
[0] => Array
(
[selectid] => 0
[order] => 0
[from] => 0
[detail] => SCAN TABLE Queue (~1000000 rows)
)
[1] => Array
(
[selectid] => 0
[order] => 1
[from] => 1
[detail] => SEARCH TABLE LastQueue USING INTEGER PRIMARY KEY (rowid=?) (~1 rows)
)
)
в то время как
EXPLAIN QUERY PLAN
SELECT Queue.Id, NULL
FROM Queue
WHERE (SELECT 1 FROM LastQueue WHERE Queue.Id=LastQueue.Id) IS NOT NULL
дает
Array
(
[0] => Array
(
[selectid] => 0
[order] => 0
[from] => 0
[detail] => SCAN TABLE Queue (~500000 rows)
)
[1] => Array
(
[selectid] => 0
[order] => 0
[from] => 0
[detail] => EXECUTE CORRELATED SCALAR SUBQUERY 1
)
[2] => Array
(
[selectid] => 1
[order] => 0
[from] => 0
[detail] => SEARCH TABLE LastQueue USING INTEGER PRIMARY KEY (rowid=?) (~1 rows)
)
)
Думаю, мне нужно умножить количество строк, чтобы получить представление о стоимости. Я не ошибаюсь?
Затем
- Использование присоединиться: 1000000 * 1
- Использование подзапроса: 500000 * 1 * 1
Тогда, это подзапрос быстрее, чем присоединиться?
Есть ли хороший учебник, чтобы узнать, как понимать результаты EXPLAIN
/EXPLAIN QUERY PLAN
?
И почему он говорит, что очередь SCAN TABLE ~ 1000000 и ~ 500000, когда эта таблица имеет 76 строк?
Вот ссылка (** https: //www.sqlite.org /eqp.html**) к официальному документу для ** Объяснить план запроса **. Он объясняет все, что вам нужно знать, чтобы использовать План объяснений –