以最快和最可靠的方式比较两个表

时间:2012-10-03 13:33:12

标签: sql-server-2008-r2 sql-update

我有两个表有很多列,在很多情况下这些列都有空值。

比较两个表数据的最佳方法是什么?

我正在使用以下方式:

UPADTE TableB
SET Col1 = A.Col1
FROM TableA A INNER JOIN TableB B
ON A.Col2 = B.Col2 AND A.Col3 = B.Col3 .... A.Col47 = B.Col47

不知怎的,我也可以写这个,但是你知道SQL Server不能说NULL = NULL,当我在所有列上保留ISNULL函数时,查询需要20-30分钟。

有没有办法更快更精确地完成同样的任务?

1 个答案:

答案 0 :(得分:1)

  
    

[...] SQL Server不能说NULL = NULL,当我在所有列上保留ISNULL函数时,查询需要20-30分钟。

  

这不完全正确。出于此比较的目的,您可以set ansi_nulls off。请注意,有一天,SQL Server的未来版本可能无法使用此功能,但它至少会在2012年之前完成。

set ansi_nulls on
select 1 where 1 != null    -- returns nothing
select 1 where null = null  -- returns nothing
select 1 where null != null -- returns nothing

set ansi_nulls off
select 1 where 1 != null    -- returns 1
select 1 where null = null  -- returns 1
select 1 where null != null -- returns nothing

如果这不能解决您的性能问题,您可能需要查看索引或更好的硬件以使查询更快地运行,或者回过头来重新分析正在发生的事情,然后重构解决方案。乍一看,这似乎是一个不寻常的操作(在非常相似的表之间复制数据,但仅在所有数据的匹配上),但提供精确的表定义,要求和示例可能会有很长的路要走帮助别人看到可以改变的东西。