改造 SQL 查询:用 SELECT 语句中的列列表替换星号

简写命令可能是开发阶段最方便、最常用的 SQL 语句之一,但这真的是生产环境的最佳实践吗?在本文中,我们将探讨使用被认为可以接受的各种场景以及可能导致并发症的情况。我们还将演示如何有效识别带有星号的 SQL SELECT 语句并快速修复。

Devart 工具下载(qun:765665608)icon-default.png?t=N7T8https://www.evget.com/product/3571

了解 SQL 中的 SELECT *

SQL 中的命令用于从表中选择所有列。此命令从子句中指定的表名中获取每一列的每一行。SELECT *FROM

这是如何使用的基本示例:SELECT *

SELECT * FROM table_name;

虽然该命令对于快速而脏的查询非常方便,尤其是在开发和测试期间,但由于各种原因(包括性能影响和未来的可维护性),通常不建议将其用于生产使用。

让我们考虑下面的例子。如果您在生产环境中运行查询,您将从Users表中提取所有数据,其中可能包括头像图片等大型字段。这可能会占用大量资源,消耗大量内存和 CPU。SELECT * FROM Users;

my sql

更有效的策略是仅指定实际需要的列,从而减少查询所需的数据库资源。例如:

SELECT
FirstName,
LastName,
Email,
Login
FROM Users;

对于频繁执行的查询(例如身份验证中使用的查询),您可以通过创建覆盖索引来进一步优化性能。覆盖索引包含查询所需的所有字段,这可以显着加快查询执行速度。

CREATE NONCLUSTERED INDEX IDX_Users_Covering ON Users
INCLUDE (FirstName, LastName, Email, Login);

SQL Server 的查询优化器在可能的情况下更喜欢使用覆盖索引,因为这样可以避免筛选聚集索引。但是,如果您使用,则现有索引覆盖所有列的可能性非常低。SELECT *

即使在创建覆盖整个表的非聚集索引的极端情况下,如果表的大小显着增长,这样的索引也会失去效力。因此,使用不仅会导致性能问题,还会破坏索引策略的优势,使其随着表的发展而降低效率。SELECT *

避免使用 ChatGPT-4 的 SELECT * 的原因

当谈到 SQL 查询时,星号 ( *) 的使用经常引发开发人员、数据库管理员和数据架构师之间的争论。让我们问问 ChatGPT-4(OpenAI 开发的人工智能聊天机器人)是否有理由避免使用.SELECT *

避免使用 ChatGPT-4 的 SELECT * 的原因

我们同意 ChatGPT-4 的观点,即使用 SELECT ALL 可能会导致漏洞和性能问题。它还会使您的代码可读性较差,并且更难以维护。但是,我们还应该提到重复列名的问题。

在 SQL 中使用多个连接表可能会导致重复的列名,从而使应用程序难以解释结果。例如,以下查询将生成重复的Customer列:SELECT *

SELECT *
FROM Sales.Customer AS c
INNER JOIN Sales.SalesOrderHeader AS soh
ON c.CustomerID = soh.CustomerID;

当应用程序尝试按列名称解析结果集时,这可能会导致问题。如果您尝试使用创建临时表,您将因重复的列名而遇到错误:SELECT * INTO

SELECT * INTO TempCustomerOrders
FROM Sales.Customer AS c
INNER JOIN Sales.SalesOrderHeader AS soh
ON c.CustomerID = soh.CustomerID;

SSMS 错误 - 重复的列名

在 SQL Server 中使用的指南:注意事项SELECT *

以下是我们关于在 SQL Server 中负责任且有效地使用语句的专家建议。SELECT *

何时避免SELECT *

生产代码:在生产代码中,您应该显式指定列名,以防止表结构发生变化时发生意外更改。

性能:检索所有列通常意味着比仅指定实际需要的列更多的磁盘 I/O、传输的数据和更多的内存使用量。

视图和存储过程:避免在视图和存储过程中使用。对基础表的更改可能会破坏代码。SELECT *

连接操作:当您连接多个表时,使用可能会导致列名不明确,并且传输的数据量超出必要。SELECT *

应用程序:在与数据库交互的应用程序代码中,请始终指定需要使用的列,以避免重大更改和性能下降。

什么时候可以接受SELECT *

临时查询:对于快速数据检查,只要这些查询不进入生产环境,使用通常就可以了。SELECT *

初始数据探索:当您最初探索新的数据库或表架构时,可以快速查看表数据。SELECT *

管理脚本:有时,管理或数据迁移脚本可能需要选择所有列。然而,即使在这种情况下,显式指定列通常也更安全。

最佳实践

显式列:始终指定您需要哪些列。

限定列名:连接表时,用表名或别名限定列名以避免歧义。

索引:确保您有适当的索引,以加快实际使用的列的查询性能。

监视和优化:始终检查查询执行计划并使用 SQL Server Profiler 或扩展事件来捕获和优化有问题的查询。

代码审查:定期审查代码是否存在可能导致问题的任何情况。SELECT *

使用 dbForge 搜索查找 SELECT * 语句

dbForge Search是 SQL Server Management Studio 的免费插件,旨在在 SQL Server 中进行高效的数据库搜索。它简化了在存储过程或查询中定位 SQL 对象、数据甚至特定文本的任务。凭借其用户友好的界面和强大的功能,dbForge Search 可以帮助开发人员和数据库管理员快速识别和管理大型复杂 SQL Server 数据库中的元素。

在 SQL Server 数据库中定位语句可能是优化和最佳实践实施的关键步骤。如果您使用 dbForge Search,查找这些语句是一个简单的过程。操作方法如下:SELECT *

1. 在对象资源管理器中,右键单击要搜索的数据库。然后选择“搜索” -> “查找对象”。

如何打开 dbForge 搜索

2. 在搜索框中,输入您要使用的搜索短语。在此示例中,我们输入SELECT *

注意:在开始搜索之前,请确保清除所有搜索选项。如果您选择Use WildCards,dbForge Search 将查找数据库中所有出现的 SELECT 语句。

如何使用 dbForge 搜索查找 SELECT * 语句

3. 按Enter或单击“开始搜索”

搜索完成后,您可以在 “搜索结果” 网格中看到找到的结果。当您在网格中选择结果时, 网格下方的预览 窗口将显示与所选结果关联的 DDL 语句。

选择* - 搜索结果

使用 dbForge SQL Complete 修复 SELECT * 语句

找到所有包含 的语句后,您可以使用 dbForge SQL Complete(Devart 开发的一个强大的插件)有效地优化它们。dbForge SQL Complete是一种高级 SQL 代码完成和生产力工具,可与 SQL Server Management Studio (SSMS) 和 Visual Studio 无缝集成。它提供了广泛的功能来提高 SQL 编码速度和质量,例如智能代码完成、代码片段和查询优化,帮助开发人员编写更高效、更具可读性的 SQL 查询。SELECT *

如何使用 dbForge SQL Complete 优化查询SELECT *

要删除包含 的语句,您可以使用语句扩展功能。它使用户只需按Tab键即可将星号 (*) 替换为必要的表或视图列的列表。让我们看看如何逐步执行此操作。SELECT *

1. 使用 dbForge Search 查找要优化的查询。

2. 单击“在对象资源管理器中查找”。 ]

3. 在对象资源管理器中,右键单击所需的数据库对象并选择修改。将打开一个新选项卡,允许您对对象进行更改。

4. 将光标置于*in后面,然后按Tab。dbForge SQL Complete 将自动替换为表中以逗号分隔格式的所有列的列表。SELECT **

结论

总之,在 SQL 语句中用显式列列表替换星号的做法SELECT不仅仅是风格问题,它具有切实的好处。它增强了查询的可读性,简化了调试,并通过减少需要检索和处理的数据量来潜在地提高性能。

在本文中,我们演示了如何使用 dbForge 产品线中的两个强大工具来识别和修复语句。这些实用程序使您可以比以往更轻松地优化 SQL 查询,从而提高性能和可读性。SELECT *

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值