我一直向我的开发人员宣扬ELECT *evil ,应该像瘟疫一样避免。
ELECT *
是否有任何可以证明其合理性的案例?
我不是在谈论COUNT(*)- 大多数优化器可以弄清楚。
COUNT(*)
编辑
我说的是生产代码。
我看到的关于这种不良做法的一个很好的例子是select *在存储过程中使用的遗留 asp 应用程序,用于ADO遍历返回的记录,但按索引获取列。您可以想象将新字段添加到字段列表末尾以外的位置时会发生什么。
select *
我很高兴*在审计触发器中使用。
在这种情况下,它实际上可以证明是一个好处,因为它将确保如果向基表添加额外的列,它将引发错误,因此不会忘记在审计触发器和/或审计表结构中处理此问题。
(像dotjoe)我也很高兴在派生表和列表表达式中使用它。虽然我习惯性地反过来做。
WITH t AS (SELECT *, ROW_NUMBER() OVER (ORDER BY a) AS RN FROM foo) SELECT a, b, c, RN FROM t;
我最熟悉 SQL Server 并且至少优化器没有问题,认识到只a,b,c需要列并且*在内表表达式中使用 不会导致任何不必要的开销检索和丢弃不需要的列。
SQL Server
a,b,c
原则上SELECT *在视图中应该没问题,并且它是SELECT应该避免的视图的最终结果,但是在 SQL Server 中这可能会导致问题,因为它存储视图的列元数据,当基础表更改时不会自动更新*除非sp_refreshview运行来更新此元数据,否则使用可能会导致混淆和不正确的结果。
SELECT *
*
sp_refreshview