已关闭。此问题需要更多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万行,然后更新它们。如果你知道另一种加快过程的方法,我将不胜感激。
先谢过了。
此致!
1条答案
按热度按时间j8ag8udp1#
我 没有 看到 任何 东西 会 阻止 你 简单 地 移动 你 的 所有 更新 的 一 部分 , 你 的 初始 插入 。
只需 将 所有
LEFT JOIN
放在 所有( 13 ) 左 连接 将 紧跟 查询 中 的 原始 连接( 在WHERE
子句 之前 ) 。 不同 之 处 在于ON
条件 将 引用dbo.STG_STOCKS.STOCK_COD
而 不是FS.STOCK_COD
。 然后 , 您 将 把 所有 已 分配 的 列 引用 移动 到 插入 列表 中 ,并 将 所有 指定 的 表达式 添加 到 选择 列表 中 。这里 假设 每个
LEFT JOIN
最 多 匹配 每个 联接 表 中 的 一 条 记录 。 一 个 不同 之 处 是 原始 更新 将 应用 于 整个 表 - - 新 记录 和 现有 记录 。 修改 后 的 代码 将 只 影响 新 记录 , 我 希望 这 是 我们 的 意图 。结果 将 类似 于 :
中 的 每 一 个