![]() |
1
284
有三个主要原因:
但对select*来说并不都是坏事。我在这些用例中大量使用它:
|
![]() |
2
84
select语句中的星号字符“*”是查询所涉及表中所有列的简写。 性能
这个
维护
使用时
设计
什么时候应该使用“select*”?
可以使用
否则,请显式列出要在查询中使用的每一列,最好是在使用表别名时。 |
![]() |
3
18
即使现在要选择每一列,也可能不希望在某人添加一个或多个新列后选择每一列。如果用
如果您真的想使用这个新列,那么很有可能您无论如何都要对代码做很多其他的更改。你只是在存钱
|
![]() |
4
4
如果您在select语句中命名列,它们将按指定的顺序返回,因此可以安全地被数字索引引用。如果使用“select*”,则可能以任意顺序接收列,因此只能按名称安全地使用列。除非事先知道要对添加到数据库中的任何新列执行什么操作,否则最可能的正确操作是忽略它。如果您将忽略任何添加到数据库中的新列,那么检索这些列没有任何好处。 |
![]() |
5
3
在许多情况下,select*将在应用程序的运行时而不是在设计时导致错误。它隐藏了有关列更改或应用程序中错误引用的知识。 |
![]() |
6
3
如果您真的想要每一列,我还没有看到select(*)和命名列之间的性能差异。命名列的驱动程序可能只是为了明确您希望在代码中看到哪些列。 但是,通常情况下,您不希望每一列和select(*)都会导致数据库服务器不必要的工作和不必要的信息必须通过网络传递。除非系统使用率高或网络连接速度慢,否则不太可能引起明显的问题。 |
![]() |
7
3
把它看作是减少应用程序和数据库之间的耦合。
总结“代码气味”方面:
|
![]() |
8
3
如果向表中添加字段,这些字段将自动包含在您使用的所有查询中。
在结果的每一行中,可以获取的数据量是有限制的。如果向表中添加字段以使结果超过该限制,则在尝试运行查询时会收到一条错误消息。 这是一种很难发现的错误。你在一个地方做了一个改变,而在另一个根本不使用新数据的地方它就爆炸了。它甚至可能是一个使用频率较低的查询,因此在某人使用它之前需要一段时间,这使得将错误连接到更改更加困难。 如果指定要在结果中包含哪些字段,则可以避免此类开销溢出。 |
![]() |
9
2
Reference taken from this article. 永远不要使用“select*”, 我只找到一个使用“select*”的原因。 如果您有特殊的需求,并且在添加或删除列时创建了动态环境,则由应用程序代码自动处理。在这种特殊情况下,您不需要更改应用程序和数据库代码,这将自动影响生产环境。在这种情况下,可以使用__select*__。 |
![]() |
10
1
一般来说,您必须符合
通过这种方式,您可以出于各种原因向表中添加字段(甚至在表中间),而不必在应用程序中破坏SQL访问代码。 |
![]() |
11
1
使用
除此之外,当查看查询时,更容易看到正在加载哪些列,而不必查找表中的内容。 是的,如果您确实添加了一个额外的列,它将更快,但在大多数情况下,您希望/需要使用查询更改代码以接受新列,而且有可能获得您不希望/期望的列会导致问题。例如,如果您获取所有列,然后依赖循环中的顺序来分配变量,然后在其中添加一个变量,或者如果列顺序发生更改(从备份中恢复时会发生这种情况),则可能会丢弃所有内容。
这也是同样的道理,如果你在做
|
![]() |
12
1
我不认为这真的会有一个笼统的规则。在许多情况下,我避免使用select*,但我也使用了数据框架,其中select*非常有用。 就像所有的事情一样,都有好处和成本。我认为收益与成本等式的一部分就是你对数据结构的控制程度。在select*运行良好的情况下,数据结构受到严格控制(它是零售软件),因此没有太大的风险,有人会将一个巨大的blob字段喷嚏到表中。 |
![]() |
13
0
在设计模式之前了解您的需求(如果可能的话)。 了解数据, 1)标引 2)使用的存储类型, 3)供应商引擎或功能;即缓存、内存功能 4)数据类型 5)表的大小 6)查询频率 7)资源共享时的相关工作负载 8)测试 a)要求会有所不同。如果硬件不能支持预期的工作负载,您应该重新评估如何在工作负载中提供需求。关于表的“添加”列。如果数据库支持视图,则可以创建索引(?)具有特定命名列的特定数据视图(与选择“*”相反)。定期检查您的数据和模式,确保您不会遇到“垃圾进入”->“垃圾排出”综合症。 假设没有其他解决方案,您可以考虑以下内容。一个问题总是有多种解决方案。 1)索引:select*将执行tablescan。根据不同的因素,这可能涉及磁盘搜索和/或与其他查询的争用。如果表是多用途的,请确保所有查询都在目标时间以下执行。如果有大量的数据,并且您的网络或其他资源没有被调优;您需要考虑到这一点。数据库是共享环境。 2)储存类型。如果你使用的是固态硬盘、磁盘或内存。I/O时间和系统/CPU上的负载会有所不同。 3)DBA是否可以调整数据库/表以获得更高的性能?不管出于什么原因,团队已经决定选择“*”是解决问题的最佳方案;数据库或表是否可以加载到内存中。(或者其他方法……也许响应被设计为以2-3秒的延迟响应?——当广告播放以赚取公司收入时……) 4)从基线开始。了解您的数据类型,以及如何显示结果。数据类型越小,字段数越少,结果集中返回的数据量越小。这就为其他系统需求留下了可用的资源。系统资源通常有一个限制,“总是”在这些限制之下工作,以确保稳定性和可预测的行为。 5)表/数据的大小。选择“*”对于小表很常见。它们通常适合内存,响应时间很快。再次……检查您的需求。为特性爬行做计划;总是为当前和未来可能的需求做计划。 6)查询/查询的频率。注意系统上的其他工作负载。如果这个查询每秒钟触发一次,并且表很小。结果集可以设计为保留在缓存/内存中。但是,如果查询是一个经常使用千兆字节/兆字节数据的批处理过程,那么您最好使用额外的资源来确保其他工作负载不受影响。 7)相关工作量。了解如何使用资源。网络/系统/数据库/表/应用程序是专用的还是共享的?谁是利益相关者?这是用于生产、开发还是用于质量保证?这是临时的“快速修复”吗?你测试过这个场景吗?您会惊讶于当前硬件上可能存在多少问题。(是的,性能很快……但设计/性能仍在下降。)系统是否需要每秒执行10000个查询,而不是每秒执行5-10个查询。数据库服务器是专用的,还是执行其他应用程序,监视对共享资源的执行。一些应用程序/语言;O/S将消耗100%的内存,导致各种症状/问题。 8)测试:测试你的理论,并尽可能多地了解。您选择的“*”问题可能是一个大问题,或者它可能是您甚至不需要担心的问题。 |
![]() |
14
0
选择with column name会增加数据库引擎从索引访问数据而不是查询表数据的可能性。 select*在数据库架构发生更改的情况下,会使系统暴露在意外的性能和功能更改中,因为您要将任何新列添加到表中,即使您的代码不准备使用或呈现该新数据。 |
![]() |
15
0
还有更实际的原因:金钱。当您使用云数据库并且必须支付处理的数据时,没有任何解释可以读取您将立即丢弃的数据。 例如: BigQuery :
和 Control projection - Avoid SELECT * :
|
![]() |
16
0
不使用SELECT*FROM表的原因:
总是使用列名将有助于在大型数据库中始终使用。 |
|
kaiselwyvrn · 我无法打开Visual Studio项目 1 年前 |
![]() |
4SadMemeXD · 无法在Django中选择相关类别 2 年前 |
![]() |
Agrim Singh · 用户数据。名称未显示用户名 2 年前 |
![]() |
Peloucvo · 用数据库中的数据填充JTable 2 年前 |
![]() |
Montaser Majid · 用于从多行中提取单行的SQL查询 2 年前 |
![]() |
Max J. · 用整数作为键将dict写入csv 2 年前 |