更新时间:2026-03-23 GMT+08:00
SELECT
- 【规则】SELECT语句中禁用通配符字段“*”。
- 使用通配符字段查询表时,如果因业务或数据库升级导致表结构发生变化,可能出现与业务语句不兼容的情况。
- 因此业务应指明所需查询的表字段名称,避免使用通配符。
- 【规则】避免对大字段(如VARCHAR(2000))执行ORDER BY、DISTINCT、GROUP BY、UNION等会引起排序的操作。
此类操作将消耗大量的CPU和内存资源,执行效率低下。
- 【规则】禁止使用LOCK TABLE语句加锁,仅允许使用 SELECT .. FOR UPDATE语句。
- 【建议】考虑使用UNION ALL,少使用UNION,注意考虑去重。
- UNION ALL不去重,少了排序操作,速度相对UNION更快。
- 如果没有去重的需求,优先使用UNION ALL。
- 【建议】避免频繁使用count()获取大表行数,该操作资源消耗较大,影响并行作业执行效率。
如果不需要实时的行数统计信息,可以尝试使用如下语句来获取表行数。
SELECT reltules FROM pg_class WHERE relname = 'tablename';
pg_class中所记录的表行数信息只会在对该表执行ANALYZE以后才会更新。目前ANALYZE有两种触发条件:
- 业务主动发送ANALYZE语句,例如:
--分析连接库中所有表 ANALYZE; --分析指定表 ANALYZE tablename;
- 借助AUTO VACUUM机制,在每间隔一定时间或表的增删达到一定行数时触发。间隔时间和增删比例可通过GUC参数设置。
- 业务主动发送ANALYZE语句,例如:
父主题: 数据库编程规范