2016-03-20 114 views
0

是否有任何替代SQL Server STUFF函数?SQL Server STUFF字符串Concat缓慢

我正在开发一个Windows服务,它在数据库上循环并执行一些数据处理,但获取数据的步骤非常慢。

我有这些表

  • Sensors表定义传感器配置
  • Items表记录从设备
  • Itemdata表,用于存储传感器值的每个项目行,所以Itemdata表是每个项目的信息链接到SensorsItems表格

我需要分组itemsdata的山坳这样

1=5|2=6| 

我用这个T-SQL来选择项目的数据 - 它的正常工作,但它的速度慢20多万行。

没有它,EXEC是非常快

随着实际执行计划要花99%的stuff功能:

enter image description here

我使用下面的TSQL

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED 

IF (@dtFrom IS NOT NULL AND @dtTo IS NOT NULL) 
BEGIN -- with both dates 
    SELECT 
     m.itemsId, 
     m.ObjectId, 
     0 AS [type], 
     STUFF((SELECT 
        (CAST(Sensors.SourceNameId AS nvarchar(10)) + '=' + CAST(t.Value AS nvarchar(20)) + '|') 
       FROM [tavl2].[tavl].[itemsData] t WITH (NOLOCK) 
       LEFT JOIN tavl2.tavl.Sensors WITH (NOLOCK) ON t.SensorsId = Sensors.SensorsId 
       WHERE t.itemsId = m.itemsId 
       FOR xml PATH (''), TYPE).value('.[1]', 'nvarchar(max)'), 1, 0, '') AS params 
    FROM 
     tavl.[items] m WITH (NOLOCK) 
    WHERE 
     m.ObjectId = @objId 
     AND m.GpsTime BETWEEN @dtFrom AND @dtTo 
     AND m.Valid = 1; 
END 

有更好的解决方案

+0

虽然这无疑是缓慢的去做,你不能在XML中使用执行计划中的实际编号(甚至没有 - 编号为准则)。您需要访问实际数字的统计信息。然而,我看到为什么要连接数据库中的数据而不是服务层,因为它看起来更像是表示而不是查询数据? –

+0

我正在使用连接来减少循环和数据量,因为每个项目可能有10个itemdata,每个查询可能有200,000个项目,因此它将是200,000 * 10循环连接 –

+0

您绝对不是通过连接方式和数据量似乎并不是一个因素,因为您选择相同的数据,而这些数据似乎很少。在代码中迭代超过200,000行不应该是一个问题,与您在数据库中尝试实现的内容相比 - 尤其是在执行此类操作时。 SQL是一个关系数据库,当不使用这个方面(基于集合的操作)时,你可以在其他地方做你的工作9倍。 –

回答