我用谷歌搜索了这个问题,似乎找不到一致的意见,或者许多基于可靠数据的意见。我只是想知道在 SQL SELECT 语句中使用通配符是否会比单独调用每个项目产生额外的开销。我在几个不同的测试查询中比较了两者的执行计划,似乎估计值总是相同的。是否有可能在其他地方产生一些开销,或者它们是否真的以相同的方式处理?
我具体指的是:
SELECT *
对比
SELECT item1, item2, etc.
我用谷歌搜索了这个问题,似乎找不到一致的意见,或者许多基于可靠数据的意见。我只是想知道在 SQL SELECT 语句中使用通配符是否会比单独调用每个项目产生额外的开销。我在几个不同的测试查询中比较了两者的执行计划,似乎估计值总是相同的。是否有可能在其他地方产生一些开销,或者它们是否真的以相同的方式处理?
我具体指的是:
SELECT *
对比
SELECT item1, item2, etc.
SELECT * FROM...
和
SELECT every, column, list, ... FROM...
将执行相同的操作,因为两者都是未优化的扫描
区别在于:
关于同一主题的其他 SO 问题...
你的意思是select * from ...
代替select col1, col2, col3 from ...
?
我认为命名列并检索最少的信息总是更好,因为
*
. 在数据库迁移等情况下可能很危险。如果您的意思是“通配符”的其他意思,请忽略我的回答...
编辑:如果您在谈论星号通配符,Select * From ...
请查看其他回复...
如果您正在讨论谓词子句中的通配符,或使用 Like 运算符的其他查询表达式,(_ , % )
如下所述,那么:
这与使用通配符是否会影响 SQL 是否为“SARG-ABLE”有关。SARGABLE,(Search-ARGument-able)表示查询的搜索或排序参数是否可以用作现有索引的入口参数。如果您将通配符添加到参数的开头
Where Name Like '%ing'
那么就没有办法遍历name字段上的索引来找到以'ing'结尾的节点了。
如果您将通配符附加到末尾,
Where Name like 'Donald%'
那么优化器仍然可以在 name 列上使用索引,并且查询仍然是 SARG-able
如果你调用 SQL 野车是 *. 它本身并不意味着性能开销。但是,如果表格被扩展,您可能会发现自己正在检索您不搜索的字段。一般来说,在您搜索或插入的字段中不具体是一个坏习惯。考虑
insert into mytable values(1,2)
如果表扩展到三个字段会怎样?
从执行计划的角度来看,这可能不是更多的工作。但是,如果您正在获取您实际上不需要的列,那就是在数据库和您的应用程序之间使用了额外的网络带宽。此外,如果您使用的是对返回的数据执行一些工作的高级客户端 API(例如 Perl 的selectall_hashref
),那么这些额外的列将对客户端产生性能成本。多少?依靠。