面试题答案
一键面试1. 何时缓存执行计划
- 首次执行查询时:当PostgreSQL接收到一个SQL查询时,它会对该查询进行解析、分析和优化,生成执行计划。如果该查询满足可缓存条件,这个执行计划就会被缓存起来。例如,简单的SELECT语句,在首次执行优化后若符合条件就被缓存。
- 后续相同查询:对于后续执行的相同查询(指SQL文本完全相同),PostgreSQL首先会检查查询缓存,若存在对应的缓存计划,则直接使用该计划执行查询,而无需重新进行解析、分析和优化等操作,从而提高查询执行效率。
2. 如何识别可缓存的计划
- SQL文本一致性:最基本的条件是SQL文本必须完全相同。这意味着不仅关键字、表名、列名等拼写要一致,空格、注释等也必须完全一样。例如,
SELECT * FROM users;
和SELECT * FROM users;
虽然逻辑相同,但由于空格不同,被视为不同的查询。 - 无易失性函数:查询中不能包含易失性函数。易失性函数每次调用可能返回不同结果,例如
CURRENT_TIMESTAMP
这类获取当前时间的函数。若查询包含此类函数,执行计划无法缓存,因为每次执行结果可能不同。 - 无绑定参数变化影响执行计划:如果查询使用了绑定参数(如
SELECT * FROM users WHERE age = $1;
),只有当不同参数值不会导致执行计划发生本质变化时才可能缓存。例如,无论$1
传入什么值,查询始终可以使用相同的索引策略和表连接方式,这种情况下计划可缓存。若不同参数值会导致索引选择或连接顺序改变,则计划不可缓存。