Sql server system_user是否在SQL语句中多次运行?

Sql server system_user是否在SQL语句中多次运行?,sql-server,sqlperformance,Sql Server,Sqlperformance,我有许多查询使用我们网络中的系统功能。这只是一个非常基本的表示。系统函数的一些实际位置位于存储过程、视图和触发器中,一些位于简单查询中,另一些位于相当复杂的查询中。目前,我们正在进行一次完整的系统审查,这种情况是向我提出的: SELECT TOP(100) p.Id, p.Name, CASE WHERE SYSTEM_USER = 'ME' THEN 'It is Me.' ELSE 'It is not Me.' END as IsItMe FROM dbo.Person p WH

我有许多查询使用我们网络中的系统功能。这只是一个非常基本的表示。系统函数的一些实际位置位于存储过程、视图和触发器中,一些位于简单查询中,另一些位于相当复杂的查询中。目前,我们正在进行一次完整的系统审查,这种情况是向我提出的:

SELECT TOP(100) p.Id, p.Name,
     CASE WHERE SYSTEM_USER = 'ME' THEN 'It is Me.' ELSE 'It is not Me.' END as IsItMe
FROM dbo.Person p
WHERE 1 = 1
如果我返回100条记录,至少根据顶部(100条),CASE语句会运行100次还是查询分析器只运行一次,因为返回的每条记录的结果都是相同的


仅供参考…我们正在使用SQL Server 2014,以防版本之间存在任何差异。

这取决于功能

SYSTEM\u USER
的这种特定情况下,当SYSTEM\u USER='ME'然后是'It is ME'。否则'It is not ME'。结束为IsItMe时,整个表达式的计算结果为

你可以从照片上看到这一点

DECLARE @T TABLE(X INT)

SELECT TOP(100)  CASE WHEN SYSTEM_USER = 'ME' THEN 'It is Me.' ELSE 'It is not Me.' END as IsItMe
FROM @T
OPTION (RECOMPILE
, QUERYTRACEON 3604
, QUERYTRACEON 8605 
, QUERYTRACEON 8606
)
最初的树是

LogOp_Top NoTies

    LogOp_Project COL: Expr1003 

        LogOp_Get TBL: @T @T TableID=-1530594778 TableReferenceID=0 IsRow: COL: IsBaseRow1001 Hints( NOLOCK )

        AncOp_PrjList 

            AncOp_PrjEl COL: Expr1003 

                ScaOp_IIF varchar collate 872468488,Var,Trim,ML=13

                    ScaOp_Comp x_cmpEq

                        ScaOp_Intrinsic suser_sname

                            ScaOp_Const TI(varbinary,Var,Trim,ML=1) XVAR(varbinary,Not Owned,Value=EMPTY)

                        ScaOp_Const TI(nvarchar collate 872468488,Var,Trim,ML=4) XVAR(nvarchar,Owned,Value=Len,Data = (4,7769))

                    ScaOp_Const TI(varchar collate 872468488,Var,Trim,ML=9) XVAR(varchar,Not Owned,Value=Len,Data = (9,It is Me.))

                    ScaOp_Const TI(varchar collate 872468488,Var,Trim,ML=13) XVAR(varchar,Not Owned,Value=Len,Data = (13,It is not Me.))

    ScaOp_Const TI(bigint,Null,ML=8) XVAR(bigint,Not Owned,Value=100)

    ScaOp_Const TI(bigint,ML=8) XVAR(bigint,Not Owned,Value=0)
很早就转化为

*** Input Tree: ***
        LogOp_Top NoTies

            LogOp_Project COL: Expr1003 

                LogOp_Get TBL: @T @T TableID=-1530594778 TableReferenceID=0 IsRow: COL: IsBaseRow1001 Hints( NOLOCK )

                AncOp_PrjList 

                    AncOp_PrjEl COL: Expr1003 

                        ScaOp_Identifier COL: ConstExpr1004 

            ScaOp_Const TI(bigint,Null,ML=8) XVAR(bigint,Not Owned,Value=100)

            ScaOp_Const TI(bigint,ML=8) XVAR(bigint,Not Owned,Value=0)

使用
Expr1003
引用常量表达式时,它取决于函数

SYSTEM\u USER
的这种特定情况下,当SYSTEM\u USER='ME'然后是'It is ME'。否则'It is not ME'。结束为IsItMe时,整个表达式的计算结果为

你可以从照片上看到这一点

DECLARE @T TABLE(X INT)

SELECT TOP(100)  CASE WHEN SYSTEM_USER = 'ME' THEN 'It is Me.' ELSE 'It is not Me.' END as IsItMe
FROM @T
OPTION (RECOMPILE
, QUERYTRACEON 3604
, QUERYTRACEON 8605 
, QUERYTRACEON 8606
)
最初的树是

LogOp_Top NoTies

    LogOp_Project COL: Expr1003 

        LogOp_Get TBL: @T @T TableID=-1530594778 TableReferenceID=0 IsRow: COL: IsBaseRow1001 Hints( NOLOCK )

        AncOp_PrjList 

            AncOp_PrjEl COL: Expr1003 

                ScaOp_IIF varchar collate 872468488,Var,Trim,ML=13

                    ScaOp_Comp x_cmpEq

                        ScaOp_Intrinsic suser_sname

                            ScaOp_Const TI(varbinary,Var,Trim,ML=1) XVAR(varbinary,Not Owned,Value=EMPTY)

                        ScaOp_Const TI(nvarchar collate 872468488,Var,Trim,ML=4) XVAR(nvarchar,Owned,Value=Len,Data = (4,7769))

                    ScaOp_Const TI(varchar collate 872468488,Var,Trim,ML=9) XVAR(varchar,Not Owned,Value=Len,Data = (9,It is Me.))

                    ScaOp_Const TI(varchar collate 872468488,Var,Trim,ML=13) XVAR(varchar,Not Owned,Value=Len,Data = (13,It is not Me.))

    ScaOp_Const TI(bigint,Null,ML=8) XVAR(bigint,Not Owned,Value=100)

    ScaOp_Const TI(bigint,ML=8) XVAR(bigint,Not Owned,Value=0)
很早就转化为

*** Input Tree: ***
        LogOp_Top NoTies

            LogOp_Project COL: Expr1003 

                LogOp_Get TBL: @T @T TableID=-1530594778 TableReferenceID=0 IsRow: COL: IsBaseRow1001 Hints( NOLOCK )

                AncOp_PrjList 

                    AncOp_PrjEl COL: Expr1003 

                        ScaOp_Identifier COL: ConstExpr1004 

            ScaOp_Const TI(bigint,Null,ML=8) XVAR(bigint,Not Owned,Value=100)

            ScaOp_Const TI(bigint,ML=8) XVAR(bigint,Not Owned,Value=0)
使用引用常量表达式的
Expr1003