0
是否有任何替代SQL Server STUFF
函数?SQL Server STUFF字符串Concat缓慢
我正在开发一个Windows服务,它在数据库上循环并执行一些数据处理,但获取数据的步骤非常慢。
我有这些表
Sensors
表定义传感器配置Items
表记录从设备Itemdata
表,用于存储传感器值的每个项目行,所以Itemdata
表是每个项目的信息链接到Sensors
和Items
表格
我需要分组itemsdata的山坳这样
1=5|2=6|
我用这个T-SQL来选择项目的数据 - 它的正常工作,但它的速度慢20多万行。
没有它,EXEC是非常快
随着实际执行计划要花99%的stuff
功能:
我使用下面的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
有更好的解决方案
虽然这无疑是缓慢的去做,你不能在XML中使用执行计划中的实际编号(甚至没有 - 编号为准则)。您需要访问实际数字的统计信息。然而,我看到为什么要连接数据库中的数据而不是服务层,因为它看起来更像是表示而不是查询数据? –
我正在使用连接来减少循环和数据量,因为每个项目可能有10个itemdata,每个查询可能有200,000个项目,因此它将是200,000 * 10循环连接 –
您绝对不是通过连接方式和数据量似乎并不是一个因素,因为您选择相同的数据,而这些数据似乎很少。在代码中迭代超过200,000行不应该是一个问题,与您在数据库中尝试实现的内容相比 - 尤其是在执行此类操作时。 SQL是一个关系数据库,当不使用这个方面(基于集合的操作)时,你可以在其他地方做你的工作9倍。 –