两个CTE都应该表现相同吗?

Ank*_*pta 4 sql database sql-server common-table-expression sql-server-2008

如果我们有一个VIEW_MYTABLE带有50列的SQL视图.

选项1:

with CTE_MYQUERY1 as (
  select [VIEW_MYTABLE].*
  from [VIEW_MYTABLE]
  /*some complex where clause*/
)
Run Code Online (Sandbox Code Playgroud)

选项2:

with CTE_MYQUERY2 as (
  select [COLUMN_1], [COLUMN_2], [COLUMN_3], ...., [COLUMN_10]
  from [VIEW_MYTABLE]
  /*some complex where clause*/
)
Run Code Online (Sandbox Code Playgroud)

根据我的理解,使用定义的列选择总是比select *语句更快.请注意,在第二个查询中,我只选择视图中50列中的10列.

我得到的结果都一样吗?任何人都可以让我知道CTE如何在内部工作,它首先生成结果集,然后将其提供给后续查询(SELECT在我的情况下查询)?

Aar*_*and 7

我希望这两个查询之间的运行时间完全没有明显区别.

但是,我仍然主张反对 SELECT*,而不是出于性能原因.有一个长期存在的神话,SELECT*效率较低,因为引擎必须查找元数据中的列名,但事实是仍然有一个查找来验证你写的列名,以及无论结果集大小如何,人类都不会注意到检索名称的额外成本.

我主张反对SELECT*的原因是:

  • 这是不可能的,你需要的所有从表中的列(或所有行,但是这是一个不同的故事).如果要删回的列数多于所需数量,那么就会执行不必​​要的I/O,并且可能会强制SQL Server执行表/聚簇索引扫描,因为它可以在更精简的索引上执行扫描.

  • 即使您确实需要所有列,使用SELECT*也会在以后的代码中导致难以检测的问题.如果有人在表格中间插入一列,该怎么办?删掉一列?添加一列?重命名一列?其中一些将立即被捕获,但我已经证明了这可能导致各种难以调试的问题.


至于CTE如何运作,这是一个非常广泛的问题.我从这些文章开始:

http://www.simple-talk.com/sql/t-sql-programming/sql-server-cte-basics/

https://docs.microsoft.com/en-us/previous-versions/sql/sql-server-2008/ms190766(v=sql.100)