将更新语句转换为插入语句以加快SQL Server中的进程[已关闭]

rta7y2nd  于 2022-11-21  发布在  SQL Server
关注(0)|答案(1)|浏览(143)

已关闭。此问题需要更多focused。当前不接受答案。
**想要改进此问题吗?**更新问题,使其仅关注editing this post的一个问题。

6天前关闭。
Improve this question
我需要在我的SQL Server生产数据库上运行一些脚本。第一次插入时插入的行与下面三个更新语句所影响的行相同。

USE BusinessDB1

INSERT INTO BusinessDB2[dbo].[FAC_STOCKS]
(  
  FECHA_COD,
  PRODUCTO_COD,
  FARMACIA_COD,
  FAMILIA_STOCK_COD,
  IR_OPTIMO,
  CN,
  MES,
  ANYO,
  STOCK_COD,
  FECHA_ULTIMA_COMPRA_COD,
  FECHA_ULTIMA_VENTA_COD,  
  STOCK_REFERENCIA,
  EMPRESA_COD,
  PVP,
  FECHA_MIN_COD,
  VENTA_UNIDADES,
  LABORATORIO_COD,
  LABORATORIO_NOM
  )

SELECT dbo.STG_STOCKS.FECHA_COD, 
       dbo.STG_STOCKS.PRODUCTO_COD, 
       dbo.STG_STOCKS.FARMACIA_COD, 
       dbo.STG_STOCKS.FAMILIA_STOCK_COD, 
       dbo.LK_FARMACIA.IR_OPTIMO,      
       dbo.STG_STOCKS.CN, 
       va.MES, 
       va.ANYO,
       dbo.STG_STOCKS.STOCK_COD,     
       ULTIMA_COMPRA.FECHA_COD AS FECHA_ULTIMA_COMPRA_COD,
       ULTIMA_VENTA.FECHA_COD AS FECHA_ULTIMA_VENTA_COD,  
       dbo.STG_STOCKS_ULTIMAS_COMPRAS.STOCK_REFERENCIA,
       dbo.STG_STOCKS.EMPRESA_COD,
       dbo.STG_STOCKS.PVP,
       va.FECHA_COD_MIN,
       ISNULL(CEILING(VA.UNIDADES_NORMALIZADAS), 0) VENTA_UNIDADES,
       dbo.STG_STOCKS.LABORATORIO_COD,
       dbo.STG_STOCKS.LABORATORIO_NOM
   FROM 
       dbo.STG_STOCKS 
   INNER JOIN 
       dbo.LK_FARMACIA ON dbo.STG_STOCKS.FARMACIA_COD = dbo.LK_FARMACIA.FARMACIA_COD 
   INNER JOIN 
       dbo.STG_STOCKS_VENTAS_ANUALES AS va ON dbo.STG_STOCKS.CN = va.CN 
                                           AND dbo.STG_STOCKS.FECHA_COD = va.FECHA_COD 
                                           AND dbo.STG_STOCKS.EMPRESA_COD = va.EMPRESA_COD 
    LEFT OUTER JOIN 
        dbo.STG_STOCKS_ULTIMAS_COMPRAS ON dbo.STG_STOCKS.STOCK_COD = dbo.STG_STOCKS_ULTIMAS_COMPRAS.STOCK_COD 
    LEFT OUTER JOIN 
        dbo.LK_TIEMPO AS ULTIMA_COMPRA ON dbo.STG_STOCKS.ULTIMA_COMPRA = ULTIMA_COMPRA.FECHA 
    LEFT OUTER JOIN 
        dbo.LK_TIEMPO AS ULTIMA_VENTA ON dbo.STG_STOCKS.ULTIMA_VENTA = ULTIMA_VENTA.FECHA 
    WHERE  
        dbo.LK_FARMACIA.ACTIVA=1 --6 mins

--=====================================================================================
-- Updating business indicators
--=====================================================================================

UPDATE FS
SET FS.STOCK_ACTUAL_UNIDADES = dbo.INDICADOR_STOCK_ACTUAL_UNIDADES.VALOR,
    FS.STOCK_ACTUAL = dbo.INDICADOR_STOCK_ACTUAL.VALOR,
    FS.STOCK_MUERTO_UNIDADES = dbo.INDICADOR_STOCK_MUERTO_UNIDADES.VALOR,
    FS.ES_MUERTO = CASE 
                       WHEN INDICADOR_STOCK_MUERTO_UNIDADES.VALOR > 0 
                           THEN 1 ELSE 0 
                   END,
    FS.STOCK_MUERTO = dbo.INDICADOR_STOCK_MUERTO.VALOR
FROM 
    BusinessDB2.[dbo].[FAC_STOCKS] FS
LEFT JOIN 
    dbo.INDICADOR_STOCK_ACTUAL ON FS.STOCK_COD = dbo.INDICADOR_STOCK_ACTUAL.STOCK_COD   
LEFT OUTER JOIN 
    dbo.INDICADOR_STOCK_ACTUAL_UNIDADES ON FS.STOCK_COD = dbo.INDICADOR_STOCK_ACTUAL_UNIDADES.STOCK_COD 
LEFT OUTER JOIN 
    dbo.INDICADOR_STOCK_MUERTO_UNIDADES ON FS.STOCK_COD = dbo.INDICADOR_STOCK_MUERTO_UNIDADES.STOCK_COD 
LEFT OUTER JOIN 
    dbo.INDICADOR_STOCK_MUERTO ON FS.STOCK_COD = dbo.INDICADOR_STOCK_MUERTO.STOCK_COD --10 mins

UPDATE FS
SET FS.STOCK_VIVO_UNIDADES = dbo.INDICADOR_STOCK_VIVO_UNIDADES.VALOR,
    FS.STOCK_VIVO = dbo.INDICADOR_STOCK_VIVO.VALOR,
    FS.STOCK_SEGURIDAD_UNIDADES = dbo.INDICADOR_STOCK_SEGURIDAD_UNIDADES.VALOR,
    FS.STOCK_SEGURIDAD = dbo.INDICADOR_STOCK_SEGURIDAD.VALOR
FROM 
    BusinessDB2.[dbo].[FAC_STOCKS] FS 
LEFT OUTER JOIN 
    dbo.INDICADOR_STOCK_SEGURIDAD_UNIDADES ON FS.STOCK_COD = dbo.INDICADOR_STOCK_SEGURIDAD_UNIDADES.STOCK_COD 
LEFT OUTER JOIN 
    dbo.INDICADOR_STOCK_SEGURIDAD ON FS.STOCK_COD = dbo.INDICADOR_STOCK_SEGURIDAD.STOCK_COD 
LEFT OUTER JOIN 
    dbo.INDICADOR_STOCK_VIVO ON FS.STOCK_COD = dbo.INDICADOR_STOCK_VIVO.STOCK_COD 
LEFT OUTER JOIN 
    dbo.INDICADOR_STOCK_VIVO_UNIDADES ON FS.STOCK_COD = dbo.INDICADOR_STOCK_VIVO_UNIDADES.STOCK_COD --10 mins

UPDATE FS
   SET FS.STOCK_MAX_UNIDADES=dbo.INDICADOR_STOCK_MAXIMO_UNIDADES.VALOR,
       FS.STOCK_MAX=dbo.INDICADOR_STOCK_MAXIMO.VALOR,
       FS.STOCK_CICLO_UNIDADES=dbo.INDICADOR_STOCK_CICLO_UNIDADES.VALOR,
       FS.STOCK_CICLO=dbo.INDICADOR_STOCK_CICLO.VALOR  

  FROM BusinessDB2.[dbo].[FAC_STOCKS] FS

  LEFT OUTER JOIN dbo.INDICADOR_STOCK_CICLO 
    ON FS.STOCK_COD = dbo.INDICADOR_STOCK_CICLO.STOCK_COD 

  LEFT OUTER JOIN dbo.INDICADOR_STOCK_CICLO_UNIDADES 
    ON FS.STOCK_COD = dbo.INDICADOR_STOCK_CICLO_UNIDADES.STOCK_COD 
    
  LEFT OUTER JOIN dbo.INDICADOR_STOCK_MAXIMO 
    ON FS.STOCK_COD = dbo.INDICADOR_STOCK_MAXIMO.STOCK_COD 

  LEFT OUTER JOIN dbo.INDICADOR_STOCK_MAXIMO_UNIDADES 
    ON FS.STOCK_COD = dbo.INDICADOR_STOCK_MAXIMO_UNIDADES.STOCK_COD --10 mins

我想将这四个脚本转换为一个插入语句,以加快该过程。
我知道插入比更新要快。我正在插入1000万行,然后更新它们。如果你知道另一种加快过程的方法,我将不胜感激。
先谢过了。
此致!

j8ag8udp

j8ag8udp1#

我 没有 看到 任何 东西 会 阻止 你 简单 地 移动 你 的 所有 更新 的 一 部分 , 你 的 初始 插入 。
只需 将 所有 LEFT JOIN 放在 所有( 13 ) 左 连接 将 紧跟 查询 中 的 原始 连接( 在 WHERE 子句 之前 ) 。 不同 之 处 在于 ON 条件 将 引用 dbo.STG_STOCKS.STOCK_COD 而 不是 FS.STOCK_COD 。 然后 , 您 将 把 所有 已 分配 的 列 引用 移动 到 插入 列表 中 ,并 将 所有 指定 的 表达式 添加 到 选择 列表 中 。
这里 假设 每个 LEFT JOIN 最 多 匹配 每个 联接 表 中 的 一 条 记录 。 一 个 不同 之 处 是 原始 更新 将 应用 于 整个 表 - - 新 记录 和 现有 记录 。 修改 后 的 代码 将 只 影响 新 记录 , 我 希望 这 是 我们 的 意图 。
结果 将 类似 于 :

USE BusinessDB1

INSERT INTO BusinessDB2[dbo].[FAC_STOCKS]
(  
  FECHA_COD,
  PRODUCTO_COD,
  FARMACIA_COD,
  FAMILIA_STOCK_COD,
  IR_OPTIMO,
  CN,
  MES,
  ANYO,
  STOCK_COD,
  FECHA_ULTIMA_COMPRA_COD,
  FECHA_ULTIMA_VENTA_COD,  
  STOCK_REFERENCIA,
  EMPRESA_COD,
  PVP,
  FECHA_MIN_COD,
  VENTA_UNIDADES,
  LABORATORIO_COD,
  LABORATORIO_NOM,
  -- Moved from original update statements
  STOCK_ACTUAL_UNIDADES,
  STOCK_ACTUAL,
  STOCK_MUERTO_UNIDADES,
  ES_MUERTO,
  STOCK_MUERTO,
  STOCK_VIVO_UNIDADES,
  STOCK_VIVO,
  STOCK_SEGURIDAD_UNIDADES,
  STOCK_SEGURIDAD,
  STOCK_MAX_UNIDADES,
  STOCK_MAX,
  STOCK_CICLO_UNIDADES,
  STOCK_CICLO
  )

SELECT dbo.STG_STOCKS.FECHA_COD, 
       dbo.STG_STOCKS.PRODUCTO_COD, 
       dbo.STG_STOCKS.FARMACIA_COD, 
       dbo.STG_STOCKS.FAMILIA_STOCK_COD, 
       dbo.LK_FARMACIA.IR_OPTIMO,      
       dbo.STG_STOCKS.CN, 
       va.MES, 
       va.ANYO,
       dbo.STG_STOCKS.STOCK_COD,     
       ULTIMA_COMPRA.FECHA_COD AS FECHA_ULTIMA_COMPRA_COD,
       ULTIMA_VENTA.FECHA_COD AS FECHA_ULTIMA_VENTA_COD,  
       dbo.STG_STOCKS_ULTIMAS_COMPRAS.STOCK_REFERENCIA,
       dbo.STG_STOCKS.EMPRESA_COD,
       dbo.STG_STOCKS.PVP,
       va.FECHA_COD_MIN,
       ISNULL(CEILING(VA.UNIDADES_NORMALIZADAS), 0) VENTA_UNIDADES,
       dbo.STG_STOCKS.LABORATORIO_COD,
       dbo.STG_STOCKS.LABORATORIO_NOM,
       -- Expressions moved from original update statements
       dbo.INDICADOR_STOCK_ACTUAL_UNIDADES.VALOR,
       dbo.INDICADOR_STOCK_ACTUAL.VALOR,
       dbo.INDICADOR_STOCK_MUERTO_UNIDADES.VALOR,
       CASE WHEN INDICADOR_STOCK_MUERTO_UNIDADES.VALOR > 0 THEN 1 ELSE 0 END,
       dbo.INDICADOR_STOCK_MUERTO.VALOR
       dbo.INDICADOR_STOCK_VIVO_UNIDADES.VALOR,
       dbo.INDICADOR_STOCK_VIVO.VALOR,
       dbo.INDICADOR_STOCK_SEGURIDAD_UNIDADES.VALOR,
       dbo.INDICADOR_STOCK_SEGURIDAD.VALOR
       dbo.INDICADOR_STOCK_MAXIMO_UNIDADES.VALOR,
       dbo.INDICADOR_STOCK_MAXIMO.VALOR,
       dbo.INDICADOR_STOCK_CICLO_UNIDADES.VALOR,
       dbo.INDICADOR_STOCK_CICLO.VALOR  

       
  FROM dbo.STG_STOCKS 
  
  INNER JOIN dbo.LK_FARMACIA 
    ON dbo.STG_STOCKS.FARMACIA_COD = dbo.LK_FARMACIA.FARMACIA_COD 

 INNER JOIN dbo.STG_STOCKS_VENTAS_ANUALES AS va 
    ON dbo.STG_STOCKS.CN = va.CN 
   AND dbo.STG_STOCKS.FECHA_COD = va.FECHA_COD 
   AND dbo.STG_STOCKS.EMPRESA_COD = va.EMPRESA_COD 
   
  LEFT OUTER JOIN dbo.STG_STOCKS_ULTIMAS_COMPRAS 
    ON dbo.STG_STOCKS.STOCK_COD = dbo.STG_STOCKS_ULTIMAS_COMPRAS.STOCK_COD 

  LEFT OUTER JOIN dbo.LK_TIEMPO AS ULTIMA_COMPRA 
    ON dbo.STG_STOCKS.ULTIMA_COMPRA = ULTIMA_COMPRA.FECHA 

  LEFT OUTER JOIN dbo.LK_TIEMPO AS ULTIMA_VENTA 
    ON dbo.STG_STOCKS.ULTIMA_VENTA = ULTIMA_VENTA.FECHA 

  -- joins moved from original update statements
 
  LEFT JOIN dbo.INDICADOR_STOCK_ACTUAL 
    ON STG_STOCKS.STOCK_COD = dbo.INDICADOR_STOCK_ACTUAL.STOCK_COD    
    
  LEFT OUTER JOIN dbo.INDICADOR_STOCK_ACTUAL_UNIDADES 
    ON STG_STOCKS.STOCK_COD = dbo.INDICADOR_STOCK_ACTUAL_UNIDADES.STOCK_COD 
  
  LEFT OUTER JOIN dbo.INDICADOR_STOCK_MUERTO_UNIDADES 
    ON STG_STOCKS.STOCK_COD = dbo.INDICADOR_STOCK_MUERTO_UNIDADES.STOCK_COD 
    
  LEFT OUTER JOIN dbo.INDICADOR_STOCK_MUERTO 
    ON STG_STOCKS.STOCK_COD = dbo.INDICADOR_STOCK_MUERTO.STOCK_COD --10 mins

  LEFT OUTER JOIN dbo.INDICADOR_STOCK_SEGURIDAD_UNIDADES 
    ON STG_STOCKS.STOCK_COD = dbo.INDICADOR_STOCK_SEGURIDAD_UNIDADES.STOCK_COD 
    
  LEFT OUTER JOIN dbo.INDICADOR_STOCK_SEGURIDAD 
    ON STG_STOCKS.STOCK_COD = dbo.INDICADOR_STOCK_SEGURIDAD.STOCK_COD 

  LEFT OUTER JOIN dbo.INDICADOR_STOCK_VIVO 
    ON STG_STOCKS.STOCK_COD = dbo.INDICADOR_STOCK_VIVO.STOCK_COD 

  LEFT OUTER JOIN dbo.INDICADOR_STOCK_VIVO_UNIDADES 
    ON STG_STOCKS.STOCK_COD = dbo.INDICADOR_STOCK_VIVO_UNIDADES.STOCK_COD --10 mins

  LEFT OUTER JOIN dbo.INDICADOR_STOCK_CICLO 
    ON STG_STOCKS.STOCK_COD = dbo.INDICADOR_STOCK_CICLO.STOCK_COD 

  LEFT OUTER JOIN dbo.INDICADOR_STOCK_CICLO_UNIDADES 
    ON STG_STOCKS.STOCK_COD = dbo.INDICADOR_STOCK_CICLO_UNIDADES.STOCK_COD 
    
  LEFT OUTER JOIN dbo.INDICADOR_STOCK_MAXIMO 
    ON STG_STOCKS.STOCK_COD = dbo.INDICADOR_STOCK_MAXIMO.STOCK_COD 

  LEFT OUTER JOIN dbo.INDICADOR_STOCK_MAXIMO_UNIDADES 
    ON STG_STOCKS.STOCK_COD = dbo.INDICADOR_STOCK_MAXIMO_UNIDADES.STOCK_COD --10 mins

 WHERE  dbo.LK_FARMACIA.ACTIVA=1 --6 mins

中 的 每 一 个

相关问题