面试题答案
一键面试- 可能的执行计划步骤:
- 扫描表A:数据库系统首先会读取表A中的1000条记录。这可能涉及全表扫描,如果表A没有合适的索引来加速对
id
列的查找的话。 - 扫描表B:接着读取表B中的5000条记录。同样,如果表B没有合适的索引,也会进行全表扫描。
- 连接操作:对于表A中的每一条记录,数据库系统会在表B中查找
a_id
与表A中id
匹配的记录。如果没有索引,这是一个嵌套循环连接(Nested Loop Join)操作,即对于A表的每一行,都会遍历B表的所有行来查找匹配项,总共需要进行1000 * 5000次比较操作。如果在表B的a_id
列上有索引,可能会使用索引嵌套循环连接(Index Nested Loop Join),这样对于A表的每一行,通过索引快速定位到B表中匹配的行,大大减少比较次数。
- 扫描表A:数据库系统首先会读取表A中的1000条记录。这可能涉及全表扫描,如果表A没有合适的索引来加速对
- 使用
EXPLAIN
命令查看执行计划: 在PostgreSQL中,只需要在SQL查询语句前加上EXPLAIN
关键字即可查看执行计划。例如:
执行上述命令后,PostgreSQL会返回详细的执行计划信息,包括表的扫描方式(如Seq Scan表示全表扫描,Index Scan表示索引扫描)、连接方式(如Nested Loop、Hash Join等)以及估计的成本等信息,帮助开发者分析查询性能。EXPLAIN SELECT * FROM A JOIN B ON A.id = B.a_id;