【发布时间】:2021-12-29 07:51:19
【问题描述】:
SQL Server中有3张数据量很大的表,每张表大约有100000行。有一个 SQL 可以从三个表中获取行。它的性能很差。
WITH t1 AS
(
SELECT
LeadId, dbo.get_item_id(Log) AS ItemId, DateCreated AS PriceDate
FROM
(SELECT
t.ID, t.LeadID, t.Log, t.DateCreated, f.AskingPrice
FROM
t
JOIN
f ON f.PKID = t.LeadID
WHERE
t.Log LIKE '%xxx%') temp
)
SELECT COUNT(1)
FROM t1
JOIN s ON s.ItemID = t1.ItemId
在检查其估计的执行计划时,我发现它使用带有大行的嵌套循环连接。在下面的屏幕截图中掠夺。图像顶部返回 124277 行,底部执行 124277 次!我想这就是它这么慢的原因。
我们知道嵌套循环在处理大数据时存在很大的性能问题。怎么去掉,改用hash join或者其他join?
编辑:下面是相关函数。
CREATE FUNCTION [dbo].[get_item_Id](@message VARCHAR(200))
RETURNS VARCHAR(200) AS
BEGIN
DECLARE @result VARCHAR(200),
@index int
--Sold in eBay (372827580038).
SELECT @index = PatIndex('%([0-9]%)%', @message)
IF(@index = 0)
SELECT @result='';
ELSE
SELECT @result= REPLACE(REPLACE(REPLACE(SUBSTRING(@message, PatIndex('%([0-9]%)%', @message),8000), '.', ''),'(',''),')','')
-- Return the result of the function
RETURN @result
END;
【问题讨论】:
-
你能把整个执行计划粘贴到brentozar.com/pastetheplan,这样我们也能看到整个事情吗?另外,请分享所涉及的表结构,以及您的表中存在的任何索引
-
使用一个函数会强制它去 RBAR。这是我要研究的第一件事。
-
嵌套循环运算符的警告是什么?我希望这表明
CROSS JOIN但这在您发布的代码中似乎并不明显 -
@MartinSmith。这是 brentozar.com 上的执行计划。 brentozar.com/pastetheplan/?id=rkBrjsKiY我好想知道为什么是嵌套循环连接。
-
@AntonGrig - 不。即使根据它自己的估计,它最终也会将行数增加到 110 亿行,并产生一个成本为
55,302的计划,因此它不会因为估计错误而认为该计划很便宜,它只会生成一个非常低效的计划,大概是由于在连接条件中使用了非模式绑定 UDF
标签: sql sql-server sql-server-2012 nested-loops database-performance