内容提要
本文讨论了PostgreSQL面试问题,重点在于事务性SQL,包括关系建模、索引加速查询、视图创建、角色权限管理及使用PL/pgSQL编写函数。这些知识将帮助求职者在面试中脱颖而出。
延伸解读
面试重点:事务性SQL而非分析性SQL
文章指出,许多PostgreSQL面试准备资源只覆盖基础,而高级资源常将事务性SQL与分析性SQL(如窗口函数、聚合)混淆。本文聚焦事务性SQL,包括关系建模、索引、视图、角色权限和PL/pgSQL函数。求职者应明确这一区分,避免在面试中过度强调分析性功能,而忽视事务处理的核心能力。
索引的双刃剑:性能提升与潜在风险
文章强调索引能加速查询,但警告不良索引可能比没有索引更差。建议学习常见策略,如为频繁查询的列创建简单索引,并了解B-tree、BRIN、GiST、GIN、哈希等类型。使用EXPLAIN ANALYZE比较添加索引前后的执行计划,能帮助理解查询规划器的选择,从而优化性能。
视图的自动更新与限制
视图可用于安全性和逻辑抽象,但需注意其限制。如果视图仅从单个基表选择,则INSERT、UPDATE、DELETE会自动重写为更新基表,即自动可更新。若视图涉及多个表或复杂查询,则不可自动更新,除非定义INSTEAD OF触发器,否则操作会报错。理解这些限制有助于正确设计和使用视图。
PL/pgSQL:在数据库中实现业务逻辑
PL/pgSQL允许在数据库内编写函数,可用于远程过程调用或结合触发器实现自动更新updated_at列等。但文章提醒,应优先使用纯SQL的JOIN/UNION等集合操作,而非循环和游标,以提高性能和可读性。CTE能提升查询可读性并支持递归,是处理复杂逻辑的有力工具。
Q&A
如何在PostgreSQL中建模1-M、M-M和1-1关系?
可以通过使用外键和连接表来建模这些关系,例如使用连接表来实现M-M关系。
PostgreSQL中有哪些丰富的数据类型?
PostgreSQL支持数组、域、JSONB、timestamptz和枚举等多种数据类型。
如何使用索引加速PostgreSQL查询?
可以通过创建适当的索引来加速查询,但要注意不良索引可能会影响性能。
什么是行级安全性(RLS),它如何工作?
行级安全性(RLS)用于控制对数据的访问,可以根据用户身份限制对特定行的访问。
如何在PostgreSQL中创建视图?
可以通过SELECT语句创建视图,以不同方式表示数据,增强安全性和逻辑抽象。
PL/pgSQL的主要用途是什么?
PL/pgSQL用于在数据库中编写函数,实现业务逻辑和处理复杂的数据库操作。