小编典典

选择存在与限制1

sql

我看到SELECT EXISTS了很多类似的东西:

    if db.query("""
        SELECT EXISTS (
            SELECT 1 FROM checkout
            WHERE checkout_id = %s
        )
    """ % checkout_id).getresult()[0][0] == 't':

与我的偏好:

    if db.query("""
        SELECT 1 FROM checkout
        WHERE checkout_id = %s
        LIMIT 1
    """ % checkout_id).getresult():

首选哪一个,为什么?

PS我正在使用Python和PosgreSQL。

cert=> explain SELECT EXISTS (SELECT 1 FROM checkout WHERE checkout_id = 3);
                                      QUERY PLAN                                      
--------------------------------------------------------------------------------------
 Result  (cost=4.03..4.03 rows=1 width=0)
   InitPlan
     ->  Index Scan using checkout_pkey on checkout  (cost=0.00..4.03 rows=1 width=0)
           Index Cond: (checkout_id = 3)
(4 rows)

cert=> explain SELECT 1 FROM checkout WHERE checkout_id = 3 limit 1;
                                     QUERY PLAN                                     
------------------------------------------------------------------------------------
 Limit  (cost=0.00..4.03 rows=1 width=0)
   ->  Index Scan using checkout_pkey on checkout  (cost=0.00..4.03 rows=1 width=0)
         Index Cond: (checkout_id = 3)
(3 rows)

我的观点是,为什么我可以从结果中获取一行并检查它的第一列是否为真,如果我只能检查是否有任何行,就意味着相同?


阅读 132

收藏
2021-04-22

共1个答案

小编典典

PostgreSQL似乎足够聪明,可以像在执行计划中清楚看到的那样对待这两个语句。

我对具有〜150000行的本地表进行测试并从条件中选择了〜100的本地表也显示了相同的行为

最重要的是:使用哪一个并不重要,但是您应该意识到其他DBMS可能不会以相同的方式运行。

2021-04-22