Ori*_*iol 3 sql sqlite explain sql-execution-plan
我已经读过连接比子查询更好.
但
EXPLAIN QUERY PLAN
SELECT Queue.Id, NULL
FROM Queue
INNER JOIN LastQueue
ON Queue.Id=LastQueue.Id
Run Code Online (Sandbox Code Playgroud)
给
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)
)
)
Run Code Online (Sandbox Code Playgroud)
而
EXPLAIN QUERY PLAN
SELECT Queue.Id, NULL
FROM Queue
WHERE (SELECT 1 FROM LastQueue WHERE Queue.Id=LastQueue.Id) IS NOT NULL
Run Code Online (Sandbox Code Playgroud)
给
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)
)
)
Run Code Online (Sandbox Code Playgroud)
我想我必须乘以行数才能了解成本.我是对的?
然后,
那么,子查询是否比加入更快?
是否有一个很好的教程来学习如何理解EXPLAIN/ EXPLAIN QUERY PLAN结果?
为什么它说SCAN TABLE Queue是~1000000和~500000,那个表有76行?
该行EXECUTE CORRELATED SCALAR SUBQUERY 1就在那里,因为您使用的是不同的查询语法.
在两种情况下实际执行都是相同的:SQLite遍历Queue表的所有记录,并尝试在表中查找相应的记录LastQueue.
那估计记录计数是不同的是不关心你的,因为你知道,实际的记录数是一样的.
连接可能比其他数据库中的子查询更好,但在仅使用嵌套循环连接的SQLite中,唯一的区别是连接允许SQLite在连接中选择外部和内部表.
在任何情况下,您都应该以最简单和可维护的方式编写查询,并且只有在您已经测量到您得到明显且必要的改进时才对其进行优化.
请注意,而不是:
WHERE (SELECT ...) IS NOT NULL
Run Code Online (Sandbox Code Playgroud)
写下来会更加惯用:
WHERE EXISTS (SELECT ...)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7577 次 |
| 最近记录: |