我看到SELECT EXISTS了很多类似的东西:
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)
我的观点是,为什么我可以从结果中获取一行并检查它的第一列是否为真,如果我只能检查是否有任何行,就意味着相同?
PostgreSQL似乎足够聪明,可以像在执行计划中清楚看到的那样对待这两个语句。
我对具有〜150000行的本地表进行测试并从条件中选择了〜100的本地表也显示了相同的行为
最重要的是:使用哪一个并不重要,但是您应该意识到其他DBMS可能不会以相同的方式运行。