在SQL Server中运行SELECT时缺少行

时间:2018-11-19 14:24:11

标签: sql-server tsql sql-execution-plan

我有一个简单的选择语句。它基本上是2个CTE,其中一个包含ROW_NUMBER()OVER(PARTITION BY,然后将它们从这两个表联接到另外4个表中。没有任何功能或异常之处。

WITH Safety_Check_CTE AS 
(
    SELECT  
        Fact_Unit_Safety_Checks_Wkey,
        ROW_NUMBER() OVER (PARTITION BY [Dim_Unit_Wkey], [Dim_Safety_Check_Type_Wkey] 
                           ORDER BY [Dim_Safety_Check_Date_Wkey] DESC) AS Check_No
    FROM 
        [Pitches].[Fact_Unit_Safety_Checks]
), Last_Safety_Check_CTE AS 
(
    SELECT 
        Fact_Unit_Safety_Checks_Wkey 
    FROM 
        Safety_Check_CTE 
    WHERE 
        Check_No = 1
)
SELECT
    COUNT(*)
FROM
    Last_Safety_Check_CTE lc
JOIN 
    Pitches.Fact_Unit_Safety_Checks f ON lc.Fact_Unit_Safety_Checks_Wkey = f.Fact_Unit_Safety_Checks_Wkey
JOIN 
    DIM.Dim_Unit u ON f.Dim_Unit_Wkey = u.Dim_Unit_Wkey
JOIN 
    DIM.Dim_Safety_Check_Type t ON f.Dim_Safety_Check_Type_Wkey = t.Dim_Safety_Check_Type_Wkey
JOIN 
    DIM.Dim_Date d ON f.Dim_Safety_Check_Date_Wkey = d.Dim_Date_Wkey
WHERE 
    f.Safety_Check_Certificate_No IN ('GP/KB11007') --option (maxdop 1)

有时它返回0、1或2行。结果显然应该是一致的。

我在复制问题时运行了配置文件跟踪,而我的会话是数据库中唯一的会话。

我已经比较了实际执行计划,它们都相同,除了最终的哈希匹配返回的行数不同。

如果我使用MAXDOP 0,则无法复制。

Plan Comparison

2 个答案:

答案 0 :(得分:1)

如果您使用我的评论作为答案。

我的猜测是,ORDER BY [Dim_Safety_Check_Date_Wkey]不确定。

答案 1 :(得分:1)

在CTE中,您发现对于任何给定的[Dim_Unit_Wkey],[Dim_Safety_Check_Type_Wkey]组合,与最近发送的行相关联的[Fact_Unit_Safety_Checks_Wkey] ...无论天气如何,[Safety_Check_Certificate_No]都等于'GP / KB11007”。

然后,在外部查询中,您正在基于[Safety_Check_Certificate_No] ='GP / KB11007'过滤结果。

因此,除非最新的[Fact_Unit_Safety_Checks_Wkey]碰巧具有[Safety_Check_Certificate_No] ='GP / KB11007',否则数据将被过滤掉。