Python 选择存在与限制1
我看到Python 选择存在与限制1,python,sql,postgresql,Python,Sql,Postgresql,我看到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
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():
哪一个是首选的,为什么
另外,我正在使用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)
我的观点是,为什么要从结果中获取一行并检查它的第一列是否为真,如果我可以只检查是否有行,意思是相同的?当使用
EXPLAIN
时,您可以看到第一条语句将执行额外的子查询,而第二条语句则不会
这就是为什么我更喜欢使用limit
而不是exists
例如:
explain SELECT EXISTS (SELECT 1 FROM checkout WHERE id = 3);
explain SELECT 1 FROM checkout WHERE id = 3 limit 1;
在我看来,第二条语句是有问题的,因为如果条件不满足,它将不会返回一行。PostgreSQL似乎足够聪明,可以像您在执行计划中清楚看到的那样,将这两条语句一视同仁 我对一个本地表的测试也显示了相同的行为,该本地表有约150000行,并且根据条件从中选择了约100行
底线是:使用哪种数据库并不重要,但您应该知道其他数据库管理系统可能不会以同样的方式运行。绝对不是SQL Server。限制1告诉我这可能是mysql(只是猜测)PostgreSQL为两个版本生成(几乎)相同的执行计划。所以他们之间应该没有区别。。。我认为他使用的是php+mysql。
exists
操作符可以在返回的第一行停止,因此即使对于mysql的优化器,这两个语句之间也应该没有区别。对不起,我认为这不相关:我使用的是Python和PosgreSQLThat's obhious,您总是将sunquery指定为exists
,以检查行的存在性。Documenation本身说,指定一个子查询来测试行的存在性
,这确实是一个正确的语句。我不知道这嵌入了什么过程语言(php?),所以可能db.query.Yes引发了一个异常,这就是想法——您只需检查是否有返回的行。如果没有返回行,则筛选器没有记录。