是否有SQL Server STUFF
函数的替代方法?
我正在开发一个循环数据库并进行一些数据处理的Windows服务,但是获取数据的步骤非常慢。
我有这些表
Sensors
表定义传感器配置Items
表,用于记录设备中的每个项目信息Itemdata
表,用于存储每个项目行的传感器值,因此Itemdata
表链接到Sensors
和Items
表我需要从具有分组itemsdata的项目中选择数据,如此
1=5|2=6|
我使用这个T-SQL - 它工作正常,但它超过200,000行时速度很慢。
没有它,exec非常快
根据实际执行计划,stuff
函数需要99%:
我正在使用以下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 :(得分:0)
我使用 SQLCLR ,
进行管理这是一个开源CLR,可以在非常快的时间内完成
GROUP_CONCAT string aggregate for SQL Server (hosted at codeplex)