当源表中没有记录时,为什么sql server会对连接进行扫描

撒尿

下面查询的思路是使用 CTE 获取 [Archive].[tia_tia_object] 中所有满足过滤器的行的主键。

CTE 内查询的执行时间为 0 秒。

第二部分应该在其他表上进行连接,以更多地过滤数据,但前提是 CTE 中返回了任何行。这是我可以让 SQL 服务器使用正确索引的唯一方法。

当 CTE 返回 0 行时,为什么要花时间(参见执行计划)查看 TIA_TIA_AGREEMENT_LINE 和 TIA_TIA_OBJECT?

WITH cte_vehicle 
     AS (SELECT O.[Seq_no], 
                O.Object_No 
         FROM   [Archive].[tia_tia_object] O 
         WHERE  O.RECORD_TIMESTAMP > 
            (SELECT LastLoadTimeStamp FROM staging.Ufngetlastloadtimestamp('Staging.CoveredObject')) 
            AND O.[Meta_iscurrent] = 1 
            AND O.OBJECT_TYPE IN ( 'BIO01', 'CAO01', 'DKV', 'GFO01', 
                                   'KMA', 'KNO01', 'MCO01', 'VEO01', 
                                   'SVO01', 'AUO01' )) 
SELECT O.[Seq_no]                      AS [Bkey_CoveredObject], 
       Cast(O.[Agr_Line_No] AS BIGINT) AS [Agr_Line_No], 
       O.[Cover_Start_Date]            AS [CoverageFrom], 
       O.[Cover_End_Date]              AS [CoverageTo], 
       O.[Timestamp]                   AS [TIMESTAMP], 
       O.[Record_Timestamp]            AS [RECORD_TIMESTAMP], 
       O.[Newest]                      AS [Newest], 
       O.LOCATION_ID                   AS LocationNo, 
       O.[Cust_no], 
       O.[N01] 
FROM   cte_vehicle AS T 
       INNER JOIN [Archive].[tia_tia_object] O 
               ON t.Object_No = O.Object_No 
                  AND t.Seq_No = O.Seq_No 
       INNER JOIN [Archive].[tia_tia_agreement_line] AL 
               ON O.Agr_line_no = AL.Agr_line_no 
       INNER JOIN [Archive].[tia_tia_policy] P
                ON AL.Policy_no = P.Policy_no 
WHERE  P.[Transaction_type] <> 'D' 

执行计划:

在此处输入图片说明

拉努

因为它仍然需要检查和查找记录。即使该表中没有记录,它在实际检查之前也不知道这一点。

就像如果有人给你一个密封的盒子,你不知道它是空的,直到你打开它。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在 SQL Server 中使用列连接进行透视

使用 VCR 进行测试时,为什么记录没有存储到数据库中?

在Matlab中对连接的边进行排序

为什么我的记录没有在使用ASP.NET的SQL Server中删除?

使用可在 MySQL 和 SQL Server 上运行的连接进行更新

MYSQL 连接然后对连接的表进行查询

在 Rails 5 中对连接表进行计数和排序

使用DESC命令对连接进行mysql查询

在熊猫DF中对连接的图进行分组

使用 SQL 中的连接进行原子更新

通过RDP连接时,为什么在GUI中没有提示我进行sudo操作?

SQL Server:自我连接-检索与where子句匹配的记录以及别名表中没有记录时

使用大表上的连接进行更新 - 性能提示?

在唯一的表系统中使用连接进行选择

为什么我的“连接”组件中没有历史记录道具?

为什么没有在mongo连接字符串中记录“ connect”选项?

我该如何使用连接进行PL / SQL更新

SQL:如何通过连接进行排序和限制

为什么在尝试连接 SQL Server 查询中的表时出现错误

没有源表的SQL Server MERGE

在对Internet连接进行故障排除时,有关ping的全部知识是什么?

如何在SQL Server中查找没有记录的表的列表

SQL Server-为什么对同一张表进行两次扫描?

Wifi连接失败,但Web通过有线连接进行连接

在 SQL Server 中创建 NONCLUSTERED 索引时,有或没有分区有什么区别?

为什么每个域仅对HTTPS NSURLSession连接进行一次质询?

当表具有PK时,为什么索引创建速度更快?(SQL Server)

当对象有效时,为什么会获得SQL Server表的无效对象名?

Symfony2 + Doctrine,尝试对连接表结果进行计数