首页 > 解决方案 > SQL 查询使站点崩溃或没有从 SQL 响应以执行查询

问题描述

我的数据库中有 5000 条记录。现在我要一次更新 500 条记录,但是我的网站会因为这个执行而崩溃,而且 SQL 服务器也没有响应。请帮我解决这个问题。

public void UpdateProductStatus(int[] productIds)
{
  if (productIds == null || productIds.Count() == 0)
  return;

  _dbContext.ExecuteSqlCommand(
      " DECLARE @TempPIds AS TABLE(Id INT) " +
      " INSERT INTO @TempPIds" +
      " SELECT * FROM  dbo.Split('" + string.Join(",", productIds) + "', ',') OPTION (MAXRECURSION 0) " +
      " UPDATE Product SET IndexStatus = 1" +
      " FROM Product p INNER JOIN @TempPIds tp ON p.Id = tp.Id WHERE IndexStatus = 0");
}


ALTER FUNCTION [dbo].[Split]
(
    @String NVARCHAR(4000),
    @Delimiter NCHAR(1)
)
RETURNS TABLE
AS
RETURN
(
    WITH Split(stpos,endpos)
    AS(
        SELECT 0 AS stpos, CHARINDEX(@Delimiter,@String) AS endpos
        UNION ALL
        SELECT endpos+1, CHARINDEX(@Delimiter,@String,endpos+1)
            FROM Split
            WHERE endpos > 0
    )
    SELECT --'Id' = ROW_NUMBER() OVER (ORDER BY (SELECT 1)),
        'Data' = SUBSTRING(@String,stpos,COALESCE(NULLIF(endpos,0),LEN(@String)+1)-stpos)
    FROM Split
)

此查询是正确的,但它会减慢我的网站以及 SQL 服务器的速度。请任何人都可以帮助我加快此查询或更新索引状态的替代方法吗?

标签: sql-server

解决方案


将 ID 字符串放在不拆分的 IN 子句中可能是错误的因为数字可以包含在数字中,如果 ID 12 更新为 12、1、2。

对于 TVP,您可以转移到临时表,然后您还可以获得性能


推荐阅读