我正在使用 SQL Server 2012 LocalDB。
一位客户希望我比较 2 个表,这些表包含 200 个(!)值列中的每一个(信不信由你)nvarchar(max)
。没有索引,也没有唯一键。
我用谷歌搜索了我的方法(http://weblogs.sqlteam.com/jeffs/archive/2004/11/10/2737.aspx)并且该方法有效。但是,在 union all / group by 表达式中使用 200 列有点慢。
查询看起来像这样
SELECT
MIN(TableName) as TableName , header1, header2, header3, header....
INTO RESULTS
FROM
(SELECT
'table1' as TableName, table1.header1, table1.header2, table1.header3, table1.header...
FROM table1
UNION ALL
SELECT
'table2' as TableName , table2.header1, table2.header2, table2.header3, table2.header...
) tmp
GROUP BY
header1, header2, header3, header...
HAVING
COUNT(*) = 1
我的想法是计算此处描述的任何行的哈希字节值(http://www.bidn.com/blogs/TomLannen/bidn-blog/2265/using-hashbytes-to-compare-columns)并将其保存在额外的列(在这种情况下再增加一个不会受到伤害:-))。哈希字节本身的计算速度非常快,但是当我之后仅使用 union all / group by /having 子句中的哈希字节值运行查询时,查询速度要慢得多。在第一种情况下,它运行大约 15 分钟,而不是大约 25 秒!
第二个查询如下所示(compareHash 是插入的 hashbyte 列):
SELECT
MIN(TableName) as TableName, compareHash
INTO RESULTS
FROM
(SELECT
'table1' as TableName , compareHash
FROM table1
UNION ALL
SELECT
'table2' as TableName , compareHash
FROM table2) tmp
GROUP BY
compareHash
HAVING
COUNT(*) = 1
我本来期望完全相反。任何人都可以考虑这种行为的原因吗?
最好的问候塞巴斯蒂安