gpt4 book ai didi

sql - 如何理解 SQLite `EXPLAIN QUERY PLAN` 结果?

转载 作者:行者123 更新时间:2023-12-03 16:53:14 26 4
gpt4 key购买 nike

我已经读到连接比子查询更好。

但是

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

那么,子查询比join快吗?

有没有很好的教程来学习如何理解EXPLAIN/EXPLAIN QUERY PLAN结果?

当该表有 76 行时,为什么它说 SCAN TABLE Queue 为 ~1000000 和 ~500000?

最佳答案

EXECUTE CORRELATED SCALAR SUBQUERY 1 行就在那里,因为您使用了不同的查询语法。

两种情况的实际执行是一样的:SQLite遍历Queue表的所有记录,并尝试在LastQueue表中查找对应的记录。

估计的记录数不同与您无关,因为您知道实际的记录数是相同的。

联接可能比其他数据库中的子查询更好,但在仅使用嵌套循环联接的 SQLite 中,唯一的区别是联接允许 SQLite 在联接中选择外部表和内部表。

在任何情况下,您都应该以最简单和可维护的方式编写查询,并且只有在您测量到您获得了显着且必要的改进时才对其进行优化。


请注意,而不是:

WHERE (SELECT ...) IS NOT NULL

这样写会更惯用:

WHERE EXISTS (SELECT ...)

关于sql - 如何理解 SQLite `EXPLAIN QUERY PLAN` 结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17663379/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com