IN 表达式如何在 SQL 查询内部执行?
How are IN expressions executed in SQL queries internally?
我有一个带有 IN
子句的查询。
select * from student where id in (1, 2, 3, 4, 5)
引擎将如何解析和执行此 SQL 查询?
是这样的,在五个不同的查询中解析还是其他?
select * from student where id = 1
select * from student where id = 2
select * from student where id = 3
select * from student where id = 4
select * from student where id = 5
不,它不会那样做,尽管五个查询和一个查询将 return 相同的结果(假设 table 而 运行 五个查询没有修改)。这五个查询需要扫描 student
table 五次,每个查询一次。 "scan" 实际上可能会使用索引并且速度非常快。
这五个查询还需要编译和执行,这会增加额外的开销。
对于 in
,您正在执行一个查询。如果没有索引,Postgres 将查看每一行以查看它是否匹配。如果是这样,它将进入结果集中。有了索引,它只会在索引中查找相应的行。
Postgres 查询规划器翻译 IN
with a list (row) expression:
select * from student where id in (1, 2, 3, 4, 5);
完全像这样:
select * from student where id = 1 OR id = 2 OR id = 3 OR id = 4 OR id = 5;
如果你 运行 带有 EXPLAIN
的语句,你可以看到这个。
请注意 IN
有两种基本形式。 dba.SE 的相关回答中的详细信息:
我有一个带有 IN
子句的查询。
select * from student where id in (1, 2, 3, 4, 5)
引擎将如何解析和执行此 SQL 查询?
是这样的,在五个不同的查询中解析还是其他?
select * from student where id = 1
select * from student where id = 2
select * from student where id = 3
select * from student where id = 4
select * from student where id = 5
不,它不会那样做,尽管五个查询和一个查询将 return 相同的结果(假设 table 而 运行 五个查询没有修改)。这五个查询需要扫描 student
table 五次,每个查询一次。 "scan" 实际上可能会使用索引并且速度非常快。
这五个查询还需要编译和执行,这会增加额外的开销。
对于 in
,您正在执行一个查询。如果没有索引,Postgres 将查看每一行以查看它是否匹配。如果是这样,它将进入结果集中。有了索引,它只会在索引中查找相应的行。
Postgres 查询规划器翻译 IN
with a list (row) expression:
select * from student where id in (1, 2, 3, 4, 5);
完全像这样:
select * from student where id = 1 OR id = 2 OR id = 3 OR id = 4 OR id = 5;
如果你 运行 带有 EXPLAIN
的语句,你可以看到这个。
请注意 IN
有两种基本形式。 dba.SE 的相关回答中的详细信息: