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

发布时间:2020-08-07 发布网站:编程之家
编程之家收集整理的这篇文章主要介绍了如何理解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)
        )

)

我想我必须乘以行数才能了解成本.我是对的?

然后,

>使用join:1000000 * 1
>使用子查询:500000 * 1 * 1

那么,子查询是否比加入更快?

是否有一个很好的教程来学习如何理解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

写下来会更加惯用:

WHERE EXISTS (SELECT ...)

总结

以上是编程之家为你收集整理的如何理解SQLite`EXPLAIN QUERY PLAN`结果?全部内容,希望文章能够帮你解决如何理解SQLite`EXPLAIN QUERY PLAN`结果?所遇到的程序开发问题。

如果觉得编程之家网站内容还不错,欢迎将编程之家网站推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您喜欢交流学习经验,点击链接加入编程之家官方QQ群:1065694478
编程之家官方公众号

微信公众号搜索 “ 程序精选 ” ,选择关注!

微信公众号搜索 “ 程序精选 ”
精选程序员所需精品干货内容!