SQL Server STUFF String Concat慢

时间:2016-03-20 20:56:51

标签: sql-server tsql sql-server-2014

是否有SQL Server STUFF函数的替代方法?

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

我有这些表

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

我需要从具有分组itemsdata的项目中选择数据,如此

 1=5|2=6|

我使用这个T-SQL - 它工作正常,但它超过200,000行时速度很慢。

没有它,exec非常快

根据实际执行计划,stuff函数需要99%:

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

有更好的解决方案吗?

1 个答案:

答案 0 :(得分:0)

我使用 SQLCLR

进行管理

这是一个开源CLR,可以在非常快的时间内完成

GROUP_CONCAT string aggregate for SQL Server (hosted at codeplex)