gpt4 book ai didi

sql-server - 多个 INNER JOIN 太慢 SQL SERVER

转载 作者:行者123 更新时间:2023-12-02 19:20:56 27 4
gpt4 key购买 nike

我遇到性能问题。

我创建了一个从文件接收数据的表,我执行了BULK INSERT。然后,我使用多个 INNER JOIN(11 个内部联接)执行 SELECT,将正确的数据插入到另一个表中。

当我运行这个SELECT时,它花费了太长时间(超过一个小时),然后我停止了它。我的解决方案是将此查询分成 3 个,创建 @temp 表。令我惊讶的是,这需要 3 分钟。这就是我想要理解的,为什么将我的查询分成 3 个比一个 select 语句更快。这是我的查询:

SELECT t1.ReturnINT, t1.ReturnBIT, t2.ReturnINT, t3.ReturnINT, t5.ReturnINT, t1.ReturnDateTime
FROM t1
INNER JOIN t2
ON t2.my_column_varchar = t1.my_column_varchar
INNER JOIN t3
ON t3.my_column_number = t1.my_column_number AND t2.my_column_ID = t3.my_column_ID
INNER JOIN t4
ON t4.my_column_varchar = t1.my_column_varchar
INNER JOIN t5
ON t5.my_column_int = t1.my_column_int AND t5.my_column_int = t4.my_column_int AND t2.my_column_int = t5.my_column_int
INNER JOIN t6
ON t6.my_column_int = t5.my_column_int AND t6.my_column_int = t2.my_column_int
INNER JOIN t7
ON t7.my_column_int = t6.my_column_int
INNER JOIN t8
ON t8.my_column_int = t3.my_column_int AND t8.my_column_datetime = t1.my_column_datetime
INNER JOIN t9
ON t9.my_column_int = t3.my_column_int AND t8.my_column_datetime BETWEEN t9.my_column_datetime1 AND t9.datetime1 + t9.my_column_datetime2
INNER JOIN t10
ON t10.my_column_int = t9.my_column_int AND t10.my_column_int = t6.my_column_int
INNER JOIN t11
ON t11.my_column_int = t9.my_column_int AND t8.my_column_datetime = t11.my_column_datetime

----已编辑----

没有 where 子句,我的查询与我在这里输入的完全一样。

这是我损坏的查询,我忘了把它们放在这里。运行时间为 3 分钟。

DECLARE @temp TABLE (
<Some_columns>
)
INSERT INTO @temp
SELECT <My_Linked_Columns>
FROM t1
INNER JOIN t2
ON t2.my_column_varchar = t1.my_column_varchar
INNER JOIN t3
ON t3.my_column_number = t1.my_column_number AND t2.my_column_ID = t3.my_column_ID
INNER JOIN t4
ON t4.my_column_varchar = t1.my_column_varchar
INNER JOIN t5
ON t5.my_column_int = t1.my_column_int AND t5.my_column_int = t4.my_column_int AND t2.my_column_int = t5.my_column_int


DECLARE @temp2 TABLE(
<Some_Columns>
)
INSERT INTO @temp2
SELECT <More_Linked_Columns>
FROM @temp as temp
INNER JOIN t6
ON t6.my_column_int = temp.my_column_int AND t6.my_column_int = temp.my_column_int
INNER JOIN t7
ON t7.my_column_int = t6.my_column_int
INNER JOIN t8
ON t8.my_column_int = temp.my_column_int AND t8.my_column_datetime = temp.my_column_datetime


DECLARE @temp3 TABLE(
<Some_Columns>
)
INSERT INTO @temp3
SELECT <More_Linked_Columns>
FROM @temp2 AS temp2
INNER JOIN t9
ON t9.my_column_int = temp2.my_column_int AND temp2.my_column_datetime BETWEEN t9.my_column_datetime1 AND t9.datetime1 + t9.my_column_datetime2
INNER JOIN t10
ON t10.my_column_int = t9.my_column_int AND t10.my_column_int = temp2.my_column_int
INNER JOIN t11
ON t11.my_column_int = t9.my_column_int AND temp2.my_column_datetime = t11.my_column_datetime


SELECT <All_Final_Columns>
FROM @temp3

----编辑3----

研究更多东西后我发现了执行计划中的一个问题。我有一个嵌套循环,估计 1 行,但实际上返回 1.204.014 行。我想问题就在这里,但是我没有找到如何在不将查询分成3部分的情况下解决这个问题(现在我知道为什么打破它更快了呵呵)

最佳答案

最常见的原因:

原因 1:当参与 INNER JOIN 的两个有 n 和 m 行的表具有多对多关系时,INNER JOIN 可以靠近CROSS JOIN,可以生成超过 MAX(n,m) 行的结果集,理论上 n x m 行是可能的。

现在想象一下INNER JOIN中有许多这样的表。

这将导致结果集变得越来越大,并开始占用分配的内存区域。

这可能是临时表可以帮助您的原因。

原因 2:您没有在要连接表的列上构建 INDEX

原因 3:WHERE 子句中是否有函数?

关于sql-server - 多个 INNER JOIN 太慢 SQL SERVER,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31883661/

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