相关疑难解决方法(0)

将数据集与EXCEPT组合在一起检查LEFT JOIN中的IS NULL

我目前正在通过Microsoft SQL Server 2008 - 数据库开发(MCTS考试70-433)认证.在前面有关组合数据集的章节中,我遇到了EXCEPT(和INTERSECT)命令.一个示例显示如何使用EXCEPT从第一个表中没有相关值的表中获取所有值,如下所示:

SELECT EmployeeKey FROM DimEmployee
EXCEPT
SELECT EmployeeKey FROM FactResellerSales
Run Code Online (Sandbox Code Playgroud)

这个EXCEPT命令对我来说是新的,但是根据我今天所知道的,我仍然可以使用a轻松地解决问题,LEFT JOINIS NULL通过以下方式检查连接约束:

SELECT DISTINCT DimEmployee.EmployeeKey FROM DimEmployee
LEFT JOIN FactResellerSales ON FactResellerSales.EmployeeKey = DimEmployee.EmployeeKey
WHERE FactResellerSales.EmployeeKey IS NULL
Run Code Online (Sandbox Code Playgroud)

现在我开始怀疑其中哪一个具有最佳性能.我试图研究查询执行计划,但我不太擅长阅读这些,所以它并没有让我更聪明.对于使用的查询EXCEPT,计划如下所示:

|--Nested Loops(Left Anti Semi Join, OUTER REFERENCES:([AdventureWorksDW2008].[dbo].[DimEmployee].[EmployeeKey], [Expr1006]) WITH UNORDERED PREFETCH)
    |--Index Scan(OBJECT:([AdventureWorksDW2008].[dbo].[DimEmployee].[IX_DimEmployee_SalesTerritoryKey]))
    |--Top(TOP EXPRESSION:((1)))
        |--Index Seek(OBJECT:([AdventureWorksDW2008].[dbo].[FactResellerSales].[IX_FactResellerSales_EmployeeKey]), SEEK:([AdventureWorksDW2008].[dbo].[FactResellerSales].[EmployeeKey]=[AdventureWorksDW2008].[dbo].[DimEmployee].[EmployeeKey]) ORDERED FORWARD)
Run Code Online (Sandbox Code Playgroud)

对于使用LEFT JOIN它的人看起来像这样:

|--Stream Aggregate(GROUP BY:([AdventureWorksDW2008].[dbo].[DimEmployee].[EmployeeKey])) …
Run Code Online (Sandbox Code Playgroud)

sql-server sqlperformance sql-server-2008 sql-execution-plan

6
推荐指数
1
解决办法
1317
查看次数