Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server SQL Server多个联接正在使CPU负担过重_Sql Server_Sql Server 2005_Performance_Tsql_User Defined Functions - Fatal编程技术网

Sql server SQL Server多个联接正在使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.

我在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.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)