1. SELECT * 在生产环境的危害,列顺序变化、列裁剪(Column Trimming)失效、网络带宽浪费如何避免?
请说明 SELECT * 在生产环境中的危害(列顺序变化、列裁剪失效、网络带宽浪费),以及如何避免这些问题?
- SELECT * 与列顺序不稳定问题
- 投影裁剪(Column Trimming)与 IO 优化
- 网络带宽与内存开销
SELECT * 的主要危害有三:其一,当表结构增减列或调整列顺序时,SELECT * 返回的列集合随之改变,依赖固定列顺序的应用程序(如按位置取值的程序、ETL 下游)极易出错,且结果集契约不稳定;其二,数据库无法对此查询做投影裁剪(Column Trimming),即无法在扫描阶段只读取需要的列,可能浪费大量 IO 与缓冲内存;其三,多取出的列会在网络传输中占用额外带宽,若表宽达几十上百列,结果集体积被显著放大。避免的方式是显式列出所需列名,让优化器能做列裁剪,并保证接口契约稳定。
显式列清单既稳定了结果集契约,又给优化器留出投影裁剪的空间,减少扫描与传输成本。这是生产 SQL 的通用最佳实践。
-- 不推荐:结果列随表结构变化
SELECT * FROM employee;
-- 推荐:显式列出所需列
SELECT emp_id, emp_name, salary FROM employee;