gpt4 book ai didi

sql-server - 为什么使用 Table Spool 比不使用慢?

转载 作者:行者123 更新时间:2023-12-02 18:49:43 25 4
gpt4 key购买 nike

在sql server中运行两个类似的sql,其中表TBSFA_DAT_CUST有百万行并且没有约束(没有索引和主键),另外两个只有几行和普通主键:

s 较慢的:

SELECT A.CUST_ID, C.CUST_NAME, A.xxx  --and several specific columns
FROM TBSFA_DAT_ORD_LIST A JOIN VWSFA_ORG_EMPLOYEE B ON A.EMP_ID = B.EMP_ID
LEFT JOIN TBSFA_DAT_CUST C ON A.CUST_ID = B.CUST_ID
JOIN VWSFA_ORG_EMPLOYEE D ON A.REVIEW_ID = D.EMP_ID
WHERE ISNULL(A.BATCH_ID, '') != ''

execution plan of slower one

f 表示更快:

SELECT *
FROM TBSFA_DAT_ORD_LIST A JOIN VWSFA_ORG_EMPLOYEE B ON A.EMP_ID = B.EMP_ID
LEFT JOIN TBSFA_DAT_CUST C ON A.CUST_ID = B.CUST_ID
JOIN VWSFA_ORG_EMPLOYEE D ON A.REVIEW_ID = D.EMP_ID
WHERE ISNULL(A.BATCH_ID, '') != ''

execution plan of faster one

f(0.6s以上)比s(4.6s以上)快得多。

另外,我找到了两种方法让 s 和 f 一样快:

1.在表TBSFA_DAT_CUST.CUST_ID中添加常量和主键;

2.特定表TBSFA_DAT_CUST超过61列(共80列)。

我的问题是,当我在 SELECT 子句中指定列而不是“*”时,为什么 sql 优化器会使用 Table Spool,以及为什么使用 Table Spool 执行速度较慢?

我的问题是关于

最佳答案

在较慢的查询中,您将结果集限制为特定列。由于这是一个无索引、无约束的表,优化器将从原始表扫描中创建一个临时表,仅包含所需的特定列。然后它通过临时表上的嵌套循环运算符运行。当它知道需要表上的每一列时(Select *),它可以直接在表扫描之外运行嵌套循环运算符,因为扫描的结果集将完全连接到顶部表。

除此之外,您的查询还可能存在其他一些问题:

LEFT JOIN TBSFA_DAT_CUST C ON A.CUST_ID = B.CUST_ID

您在这里没有加入任何内容,而是将整个表加入到每条记录中。是指 a.cust_id = c.cust_idb.cust_id = c.cust_ida.cust_id = c.cust_id 和 b.cust_id = c.cust_id

此外,where 子句中的此函数毫无意义,并且会降低性能:

WHERE ISNULL(A.BATCH_ID, '') != '' 

将其更改为:

WHERE A.BATCH_ID is not null and A.Batch_ID <> ''

关于sql-server - 为什么使用 Table Spool 比不使用慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45550597/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com