Sql server SQL Server多个联接正在使CPU负担过重
我在SQLServer2005上有一个存储过程。它是从表函数中提取的,有两个连接。当使用负载测试运行查询时,它会在所有16个内核上100%杀死CPU!我已经确定删除其中一个连接可以使查询正常运行,但这两个连接都会对CPU造成负担Sql server SQL Server多个联接正在使CPU负担过重,sql-server,sql-server-2005,performance,tsql,user-defined-functions,Sql Server,Sql Server 2005,Performance,Tsql,User Defined Functions,我在SQLServer2005上有一个存储过程。它是从表函数中提取的,有两个连接。当使用负载测试运行查询时,它会在所有16个内核上100%杀死CPU!我已经确定删除其中一个连接可以使查询正常运行,但这两个连接都会对CPU造成负担 Select SKey From dbo.tfnGetLatest(@ID) a left join [STAGING].dbo.RefSrvc b on a.LID = b.ESIID left join [STAGING].dbo.
Select
SKey
From
dbo.tfnGetLatest(@ID) a
left join [STAGING].dbo.RefSrvc b on
a.LID = b.ESIID
left join [STAGING].dbo.RefSrvc c on
a.EID = c.ESIID
非常感谢您的帮助,请注意,连接发生在同一服务器上不同数据库的同一个表上。那么您的执行计划有什么不同?这是否使用了索引 您是否尝试过使用UNION all来代替I preseume,您尝试获得的是具有当前查询无法识别的一个或另一个id的记录;t give,ti wouldl give是所有skey值的完整列表,根本不需要加入
Select
SKey
From
dbo.tfnGetLatest(@ID) a
left join [STAGING].dbo.RefSrvc b on
a.LID = b.ESIID
union all
Select
SKey
From
dbo.tfnGetLatest(@ID) d
left join [STAGING].dbo.RefSrvc c on
d.EID = c.ESIID
如果不使用索引,仍然可能没有效率,但它可能会返回更好的记录集
或考虑将表值函数返回的值设为一个临时表,在该表中可以对其进行索引,然后执行连接。
< P>这可能会对问题产生一些启发。你能把第一个加入到CTE中吗 大概是这样的:另外,由于两个联接都是左联接,它们如何缩小结果集?这个查询不等于从dbo中选择sKey吗。tfnGetLatest@ID?如果有一点示例输出,这将更加清晰,但我会立即加入。这对你有什么好处
SELECT SKey FROM dbo.tfnGetLatest(@ID)
WHERE LID IN
(SELECT ESIID from [STAGING].dbo.RefSrvc)
AND EID IN
(SELECT ESIID FROM [STAGING].dbo.RefSrvc)
dbo是什么。tfnGetLatest@ID返回,它是内联表值还是多语句
如果是多语句,那么
这对optimier来说是个黑匣子
基数是其中之一
udf的结果没有统计数据
请参见我的,这是最重要的,只有在进行负载测试或生产时才会发生这种情况。查询本身在一秒钟内运行。当进行负载测试时,我甚至无法在LL4Xeon四核上100%达到之前获得20个用户。删除一个连接后,我已经将其提升到2000多个用户。为了回答您的问题,执行计划将更改为显示少一个联接,但总体上保持不变。它在问题中的表上使用聚集索引查找,在表函数上使用表扫描。它只从TF和联接中获取一条记录。当我只需要一条记录时,一个联合将带来两条记录,多个联接从两个不同ID获取数据,但不重复。您能发布查询执行计划吗?SET SHOWPLAN_TEXT ONIt仅从TF和联接中获取一条记录。如果它只是一条记录,并且dbo.RefSrvc对相关行进行了索引,那么您可能应该尝试两个子选择,而不是左联接。
SELECT SKey FROM dbo.tfnGetLatest(@ID)
WHERE LID IN
(SELECT ESIID from [STAGING].dbo.RefSrvc)
AND EID IN
(SELECT ESIID FROM [STAGING].dbo.RefSrvc)