我一直向我的开发者讲道,这SELECT *是邪恶的,应该像瘟疫一样避免.
有什么理由可以说是合理的吗?
我不是在谈论COUNT(*)- 大多数优化者都可以解决这个问题.
编辑
我在谈论生产代码.
我看到这个不好的做法的一个很好的例子是select *在存储过程中使用的传统asp应用程序,用于ADO循环返回的记录,但是通过索引得到列.您可以想象在字段列表末尾之外的某处添加新字段时发生的情况.
Mar*_*ith 45
我很高兴*在审计触发器中使用.
在这种情况下,它实际上可以证明是有益的,因为它将确保如果将额外的列添加到基表中,它将引发错误,因此不能忘记在审计触发器和/或审计表结构中处理此问题.
(像dotjoe一样)我也很高兴在派生表和列表表达式中使用它.虽然我习惯性地反过来做.
WITH t
AS (SELECT *,
ROW_NUMBER() OVER (ORDER BY a) AS RN
FROM foo)
SELECT a,
b,
c,
RN
FROM t;
Run Code Online (Sandbox Code Playgroud)
我最熟悉SQL Server,至少优化器可以识别只a,b,c需要列*,并且在内表表达式中的使用不会导致任何不必要的开销检索和丢弃不需要的列.
原则上SELECT *应该在视图中应该是正常的,并且SELECT它应该是应该避免的视图中的最终,但是在SQL Server中这会导致问题,因为它存储视图的列元数据,当基础表更改时不会自动更新*除非sp_refreshview运行更新此元数据,否则使用会导致混淆和不正确的结果.
Dyl*_*tie 34
在许多情况下,SELECT*是最佳解决方案.在Management Studio中运行即席查询只是为了了解您正在使用的数据.查询您不知道列名的表,因为这是您第一次使用新架构.构建一次性quick'n'dirty工具来进行一次性迁移或数据导出.
我同意在"正确"开发中,你应该避免它 - 但是有很多场景,"正确"开发不一定是业务问题的最佳解决方案.规则和最佳实践是很好的,只要你知道什么时候打破它们.:)
dot*_*joe 28
在与CTE合作时,我会在生产中使用它.但是,在这种情况下,它并不是真的select *,因为我已经在CTE中指定了列.我只是不想在最终选择中重新指定.
with t as (
select a, b, c from foo
)
select t.* from t;
Run Code Online (Sandbox Code Playgroud)
Ode*_*ded 25
如果你在谈论实时代码,我无法想到.
人们说它使得添加列更容易开发(因此它们自动返回并且可以在不更改存储过程的情况下使用)不知道编写最佳代码/ sql.
我只在编写不会被重用的即席查询时使用它(找出表的结构,当我不确定列名是什么时获取一些数据).
Jor*_*dão 16
我认为select *在一个exists条款中使用是合适的:
select some_field from some_table
where exists
(select * from related_table [join condition...])
Run Code Online (Sandbox Code Playgroud)
有些人喜欢select 1在这种情况下使用,但它并不优雅,并且它不会购买任何性能改进(早期优化再次打击).
你已经对你的问题得到了很多答案,但你似乎正在解雇一切并非扼杀你想要听到的东西.不过,这里是第三(到目前为止)时间:有时是没有瓶颈.有时表现比罚款要好.有时表格不断变化,修改每个SELECT查询只是管理可能不一致的一点.有时你必须按照不可能的时间表交付,这是你需要考虑的最后一件事.
如果您住在子弹时间,请确保输入所有列名称.但为何停在那里?在无架构的dbms中重写您的应用程序.地狱,在汇编中编写自己的 dbms.这真的显示了他们.
| 归档时间: |
|
| 查看次数: |
6102 次 |
| 最近记录: |