3

我用谷歌搜索了这个问题,似乎找不到一致的意见,或者许多基于可靠数据的意见。我只是想知道在 SQL SELECT 语句中使用通配符是否会比单独调用每个项目产生额外的开销。我在几个不同的测试查询中比较了两者的执行计划,似乎估计值总是相同的。是否有可能在其他地方产生一些开销,或者它们是否真的以相同的方式处理?

我具体指的是:

SELECT *

对比

SELECT item1, item2, etc.
4

5 回答 5

9
SELECT * FROM...

SELECT every, column, list, ... FROM...

将执行相同的操作,因为两者都是未优化的扫描

区别在于:

  • sys.columns 中的额外查找来解决 *
  • 表架构更改时合同/签名更改
  • 无法创建覆盖索引。事实上,根本没有调整选项,真的
  • 如果非模式绑定,则必须刷新所需的视图
  • 不能使用 * 索引或模式绑定视图
  • ...和其他东西

关于同一主题的其他 SO 问题...

于 2009-12-08T16:18:28.253 回答
2

你的意思是select * from ...代替select col1, col2, col3 from ...

我认为命名列并检索最少的信息总是更好,因为

  • 您的代码将独立于数据库中列的物理顺序工作。列顺序不应影响您的应用程序,但如果您使用*. 在数据库迁移等情况下可能很危险。
  • 如果您命名列,DBMS 可以进一步优化执行。例如,如果有一个索引包含您感兴趣的所有数据,则根本不会访问该表。

如果您的意思是“通配符”的其他意思,请忽略我的回答...

于 2009-12-08T16:18:18.433 回答
1

编辑:如果您在谈论星号通配符,Select * From ...请查看其他回复...

如果您正在讨论谓词子句中的通配符,或使用 Like 运算符的其他查询表达式,(_ , % )如下所述,那么:

这与使用通配符是否会影响 SQL 是否为“SARG-ABLE”有关。SARGABLE,(Search-ARGument-able)表示查询的搜索或排序参数是否可以用作现有索引的入口参数。如果您将通配符添加到参数的开头

 Where Name Like '%ing'

那么就没有办法遍历name字段上的索引来找到以'ing'结尾的节点了。

如果您将通配符附加到末尾,

Where Name like 'Donald%' 

那么优化器仍然可以在 name 列上使用索引,并且查询仍然是 SARG-able

于 2009-12-08T16:16:47.350 回答
0

如果你调用 SQL 野车是 *. 它本身并不意味着性能开销。但是,如果表格被扩展,您可能会发现自己正在检索您不搜索的字段。一般来说,在您搜索或插入的字段中不具体是一个坏习惯。考虑

insert into mytable values(1,2)

如果表扩展到三个字段会怎样?

于 2009-12-08T16:22:56.637 回答
0

从执行计划的角度来看,这可能不是更多的工作。但是,如果您正在获取您实际上不需要的列,那就是在数据库和您的应用程序之间使用了额外的网络带宽。此外,如果您使用的是对返回的数据执行一些工作的高级客户端 API(例如 Perl 的selectall_hashref),那么这些额外的列将对客户端产生性能成本。多少?依靠。

于 2009-12-08T16:32:33.450 回答