TSQL:替换比ltrim / rtrim更好

时间:2014-10-09 10:01:43

标签: sql-server tsql

替换优于ltrim / rtrim。 我在单词之间没有空格,因为我在键列上运行它。

  update [db14].[dbo].[S_item_60M]
  set [item_id]=ltrim(rtrim([item_id]))

Item_id having non-clustered index

我应该停用索引以获得更好的效果吗?

Windows 7, 24GB RAM , SQL Server 2014

此查询运行了20个小时,然后我取消了它。我正在考虑出于性能原因运行Replace而不是ltrim / rtrim。

SSMS工作室坠毁。

现在我可以看到它在Activity Monitor

中运行
Error Log says  FlushCache: cleaned up 66725 bufs with 25872 writes in 249039 ms (avoided 11933 new dirty bufs) for db 7:0

请指导并建议我。

3 个答案:

答案 0 :(得分:1)

批量更新的吞吐量不依赖于每行到ltrimrtrim的单个调用。您随意选择查询中一些高度可见的元素,并认为它对性能不佳负责。查看查询计划以查看物理上正在执行的操作。另外,请熟悉批量更新技术(例如删除和重新创建索引)。

请注意,与普遍看法相反,在一个语句中对所有行进行批量更新通常是最快的选择。此策略可能导致阻塞和高日志使用。但通常具有最佳吞吐量,因为优化器可以优化您在一个计划中执行的所有DML。如果将DML拆分成块几乎总是一个好主意,SQL Server会自动将其作为计划的一部分。

答案 1 :(得分:1)

我不认为REPLACELTRIM / TRIM是帐篷表现方面的长杆。在更新期间,您是否对表有并发活动?我建议您在维护窗口期间执行此操作,以避免阻止其他查询。

如果要更新很多行(超过10%左右),我建议您删除(或禁用)item_id列上的非聚集索引,执行更新,然后创建(或启用)索引。指定TABLOCKX锁定提示。

答案 2 :(得分:1)

如果某些行已经没有空格,请使用WHERE子句(例如CHARINDEX('',item_id)<> 0)将它们从UPDATE中排除。但是最重​​要的建议(已经由gvee发布)是批量更新(如果你有一个可用于分页的密钥)。另一个方法(如果你有足够的空间可能会更好)将使用一个可以最小化记录的操作(在批量记录或简单恢复模型中):使用SELECT INTO另一个表,然后重命名该表。