sql-server – RANK()和DENSE_RANK()是确定性的还是非确定性的?
|
根据 official Microsoft BOL DENSE_RANK是不确定的( RANK()).但根据 Ranking Functions by Itzik Ben-Gan“…… RANK()和DENSE_RANK()函数总是确定性的”.谁是对的? 到目前为止我发现了什么: 所以在Set理论表中 Employee Salary Sue Right 1.00 Robin Page 1.00 Phil Factor 1.00 和 Employee Salary Phil Factor 1.00 Sue Right 1.00 Robin Page 1.00 是相同的.但排名函数返回不同的值: CREATE TABLE [dbo].[Employees](
--[ID] [int] IDENTITY(1,1) NOT NULL,[Employee] [varchar](150) NOT NULL,[Salary] [smallmoney] NULL,) ON [PRIMARY]
GO
CREATE TABLE [dbo].[Employees2](
--[ID] [int] IDENTITY(1,) ON [PRIMARY]
INSERT INTO [dbo].[Employees]
([Employee],[Salary])
VALUES
('Sue Right',1),('Robin Page',('Phil Factor',1 )
GO
INSERT INTO [dbo].[Employees2]
([Employee],[Salary])
VALUES
('Phil Factor',1 ),('Sue Right',1)
GO
SELECT RANK() OVER ( ORDER BY Salary) AS [Rank],DENSE_RANK() OVER (ORDER BY Salary ) AS [Dense_rank],[Employee]
FROM
dbo.Employees
SELECT RANK() OVER ( ORDER BY Salary) AS [Rank],[Employee]
FROM
dbo.Employees2
SELECT NTILE(3) OVER ( ORDER BY SALARY ),[Employee]
FROM
dbo.Employees
SELECT NTILE(3) OVER ( ORDER BY SALARY ),[Employee]
FROM
dbo.Employees2
解决方法
他们都是对的,因为他们使用“确定性”这个词的不同含义. 从SQL Server优化器的角度来看,“确定性”具有非常精确的含义;窗口和排名函数之前存在的含义已添加到产品中.对于优化器,“deterministic”属性定义在优化期间函数是否可以在其内部树结构中自由复制.这对于非确定性函数来说是不合法的. 这里的确定性意味着:无论调用多少次,函数的确切实例总是为同一输入返回相同的输出.根据定义,对于窗口函数来说,这永远不会成立,因为作为(单行)标量函数,它们不会在行内或跨行返回相同的结果.简单地说,使用ROW_NUMBER作为示例:
这是BOL正在使用的意义. Itzik对整个结果的决定论提出了不同的观点.在有序输入集(具有合适的打破平局)上,输出是“确定性”序列.这是一个有效的观察,但它不是在查询优化期间重要的“确定性”质量. (编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
