【问题标题】:Sql server's Constant scan - clarification?Sql server 常量扫描 - 澄清?
【发布时间】:2014-07-15 07:01:31
【问题描述】:

我看过this article about不断扫描但还是不明白什么时候会用到(有人评论作者说他的文章还没看懂):

MSDN:

常量扫描运算符将一个或多个常量行引入到一个 询问。计算标量运算符通常用于将列添加到行 由常量扫描运算符生成。

非常不清楚。

例如:

为什么SELECT TOP 1 GETDATE() 会产生:

虽然select getdate() 什么也没产生。 (在执行计划中)。

我想这与不断扫描有关。所以:

问题:

  • 什么是恒定扫描
  • 如果它是一个常量,为什么它需要 SCAN ,并且
  • 为什么select top 1 getdate() 产生的结果与普通select getdate() 不同

【问题讨论】:

    标签: sql-server


    【解决方案1】:

    因为大多数用于完成查询的运算符是根据一个或多个输入行集和一个或多个输出行集指定的,因此如果您编写的查询需要使用其中一个运算符时,您最好确保提供给该运算符的输入是一个行集。

    所以常量扫描算子是一种特殊的算子,它可以接受一个或多个标量输入并生成一个行集。

    它使组合运算符变得更加容易。


    为什么select top 1 getdate() 产生的结果与普通的select getdate() 不同

    因为您要求使用 TOP 运算符。而TOP 运算符期望有一个输入行集。


    为什么我认为关注性能无关紧要:

    SET STATISTICS TIME ON
    GO
    SELECT TOP 1  GETDATE()
    GO
    SELECT GETDATE()
    

    消息:

    SQL Server 解析和编译时间: CPU 时间 = 0 毫秒,经过的时间 = 0 毫秒。 SQL Server 执行时间: CPU 时间 = 0 毫秒,经过的时间 = 0 毫秒。 SQL Server 解析和编译时间: CPU 时间 = 0 毫秒,经过的时间 = 0 毫秒。 (1 行受影响) SQL Server 执行时间: CPU 时间 = 0 毫秒,经过的时间 = 0 毫秒。 SQL Server 解析和编译时间: CPU 时间 = 0 毫秒,经过的时间 = 0 毫秒。 (1 行受影响) SQL Server 执行时间: CPU 时间 = 0 毫秒,经过的时间 = 0 毫秒。

    也就是说,我们甚至无法衡量任一语句执行所需的时间。

    【讨论】:

    • Damien,它实际扫描的是什么?最重要的是什么?
    • @RoyiNamir - 它实际上不执行任何扫描。但它的名称与(某些)其他也可以生成行集的运算符一致。
    • 在微观性能方面,有什么区别吗? (与select getdate() 相比)
    • @RoyiNamir - 我什至不会费心测量它。如果确实如此,那么任何接近关键性能路径的东西,你都做错了很多其他事情。
    • Damien,我显然没有你那样了解 sql server,但对我来说,在执行计划中看到“ConstantScan=85%”并且不知道它是否对性能有影响——即使是最轻微的百分比——也会使我不那么专业的 sql 开发人员。更不用说它是一个问答网站:-)
    猜你喜欢
    • 1970-01-01
    • 2013-10-03
    • 1970-01-01
    • 1970-01-01
    • 2010-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多