Sql通配符:性能开销?

Sql通配符:性能开销?,sql,performance,wildcard,sql-execution-plan,overhead,Sql,Performance,Wildcard,Sql Execution Plan,Overhead,我在谷歌上搜索了这个问题,似乎找不到一致的意见,或者许多基于可靠数据的意见。我只是想知道在SQL SELECT语句中使用通配符是否会比单独调用每个项带来额外的开销。我已经在几个不同的测试查询中比较了这两种方法的执行计划,看起来估计值总是一样的。是否有可能在其他地方产生了一些间接费用,或者它们的处理方式完全相同 我具体指的是: SELECT * vs 编辑:如果您正在谈论星号通配符,如Select*From…中所述,请查看其他响应 如果您讨论的是谓词子句中的通配符,或使用Like运算符、(u,%

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

我具体指的是:

SELECT *
vs


编辑:如果您正在谈论星号通配符,如
Select*From…
中所述,请查看其他响应

如果您讨论的是谓词子句中的通配符,或使用Like运算符、
(u,%)
的其他查询表达式,如下所述,则:

这与使用通配符是否会影响SQL是否“支持SARG”有关。SARGABLE,(Search-ARGument-able)表示查询的Search或sort参数是否可以用作现有索引的条目参数。如果将通配符前置到参数的开头

 Where Name Like '%ing'
然后,无法遍历名称字段上的索引来查找在“ing”中结束的节点

如果在末尾附加通配符

Where Name like 'Donald%' 

然后优化器仍然可以在名称列上使用索引,并且查询仍然是可搜索的

您的意思是
select*from…
而不是
select col1、col2、col3 from…

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

  • 您的代码将独立于数据库中列的物理顺序工作。列顺序不应影响您的应用程序,但如果您使用
    *
    ,则会出现这种情况。在数据库迁移等情况下可能会很危险
  • 如果命名列,DBMS可以进一步优化执行。例如,如果有一个包含您感兴趣的所有数据的索引,则根本不会访问该表
如果你用“通配符”指的是别的东西,请忽略我的答案

SELECT * FROM...

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

区别在于:

  • 要解析的sys.columns中的额外查找*
  • 当表架构更改时,合同/签名也会更改
  • 无法创建覆盖索引。事实上,根本没有任何调整选项,真的
  • 如果没有架构,则必须刷新所需的视图
  • 无法使用索引或模式查找视图*
  • …和其他东西
关于同一主题的其他问题


如果您称之为SQL wild car is*。它本身并不意味着性能开销。但是,如果扩展表,您可能会发现自己正在检索未搜索的字段。 通常,在搜索或插入的字段中不具体是一个坏习惯。 考虑

insert into mytable values(1,2)

如果将表扩展到三个字段,会发生什么情况?

从执行计划的角度来看,这可能不是更多的工作。但是,如果您正在获取实际上不需要的列,那么在数据库和应用程序之间会使用额外的网络带宽。此外,如果您使用的是对返回的数据执行某些工作的高级客户端API(例如,Perl的
selectall\u hashref
),那么这些额外的列将对客户端造成性能成本。多少钱?视情况而定。

你能用一个小例子说明一下吗?另外请注意,在生产代码中使用通配符99%是设计不良的征兆。你永远不应该这样做。永远不会。曾经我没有足够的evers记忆。我同意,而且我从来没有因为那个确切的原因使用过*。然而,我读到一些模糊的观点,认为SELECT语句中的通配符会产生一些开销,我只是想根据事实进行澄清,这是我很难找到的。另外,我假设,与从磁盘中提取数据所需的实际工作相比,此通配符解析中的“开销”可以忽略不计,是的,但人们经常提到它。当然,对于300列和10行;-)我应该说得更具体些。我就是这么做的。我指的是选择*与选择列表。然而,这个答案让我对一个我没有考虑过的问题有了一些见解。谢谢这就是我所指的情况,尽管我想知道除了执行计划之外,绩效可能发生在哪里。不过,我同意你不使用它的理由。
SELECT every, column, list, ... FROM...
insert into mytable values(1,2)