比较SQL Server中包含更多列的两个表的最佳方法

时间:2014-03-12 03:23:42

标签: sql-server comparison query-performance

我有一个现有的表(VendorMaster),其中包含18列和大约2,00,000行。现在我构建了具有不同逻辑的新表(NewVendorMaster),以便在相同的模式下获取相同的数据。

Schema of VendorMaster and NewVendorMaster
V1       V2    V3     V4     V5      V6       V7      V8.....   V16
data1                data2          data3   data4   data5      dataN
type3  type16        data3 data4
type3        type17        data14           data18             type20
data4        type17        data14           type45             type20

现在我要比较这两个表。由于有18列和2,00,000条记录,我应该进行列式比较,还是将所有数据连接成一列,然后比较更快的结果?

加入这两个表似乎需要数小时才能比较。

并且还会在两个表上创建索引有助于更快的比较吗?

2 个答案:

答案 0 :(得分:1)

我建议不要在比较之前连接字段,而是建议创建校验和值并从那里开始工作。 我已经做了类似的事情并且像这样接近它:首先我在表中添加了一个额外的字段,其中包含关键字段的BINARY_CHECKSUM()(你可以使用一个计算字段!)并在上面添加一个索引那个crc-field但是INCLUDE()所有实际的关键字段。 生成的值不会是唯一的,但它足够接近工作。请注意,创建索引可能需要一段时间,具体取决于它可能占用相当大的空间的大小。

当JOIN两个表连接所有关键字段(**)上的crc +时。 SQL将非常适合匹配整数以找到正确的行,然后比较其他字段可以从包含的列中完成。

(**:不要只依赖于crc值,BINARY_CHECKSUM()快速且易于使用,但可能会发生碰撞!)

答案 1 :(得分:0)

这不是一个完整的答案,但可能有助于节省时间

我做了一件非常相似的事情 - 将250万行一维数据库规范化为六个表格。

我最终做的是使用'C'编写短程序来输入数据并逐步执行,然后在新数据库表中插入新记录,因为聪明的SQL整夜都没有实际生成结果。 / p>

使用CI可以编写调试输出以查看事情发生的地方,更好的是,当事情出错时我可以看到什么是错误的,最重要的是,当工作完成一半时,它完成了一半 - 中止程序中途至少在新表中留下了一些好的新数据。

所以我的主要观点是:不要试图聪明并构建完成所有工作的神奇的SQL查询。将其分解为步骤并对其进行编程。它的运行速度更快。

你知道如何安排数据的方式比SQL更好。

(在没有太大变化的表格中添加索引总是很好,并且真正加快了搜索速度。您可以随时将其删除)