2012-02-08 63 views
0

我4個數據源之間的集成:我可以使用字段的散列而不是直接字段比較來簡化記錄比較嗎?

InternalDeviceRepository 
ExternalDeviceRepository 
NightlyDeviceDeltas 
MidDayDeviceDeltas 

改變從其他三個源流入InternalDeviceRepository。 所有來源最終都被轉化爲具有

FIELDS 
============= 
IdentityField 
Contract 
ContractLevel 
StartDate 
EndDate 
ContractStatus 
Location 

標識字段的定義是PrimaryKey的,合同主要是次要鑰匙只有當存在匹配,否則一個新的記錄需要創建。

目前,我比較SQL語句中的WHERE子句中的所有字段以及SSIS包中的許多地方中的所有字段。這會創建一些看起來不清晰的SQL和SSIS包。

我一直在研究計算ContractLevel,StartDate,EndDate,ContractStatus和Location的散列,並將其添加到每個輸入表。這將允許我使用單個值進行比較,而不是每次使用5個單獨的值。

我從來沒有做過這件事,也沒有看到它完成。是否有一個原因應該使用它,還是一個更乾淨的方法來做到這一點?

回答

1

這是一種有效的方法。考慮引入一個帶有散列和索引的計算字段。

您可使用CHECKSUM功能或編寫自己的散列函數是這樣的:

CREATE FUNCTION dbo.GetMyLongHash(@data VARBINARY(MAX)) 
RETURNS VARBINARY(MAX) 
WITH RETURNS NULL ON NULL INPUT 
AS 
BEGIN 
    DECLARE @res VARBINARY(MAX) = 0x 
    DECLARE @position INT = 1, @len INT = DATALENGTH(@data) 

    WHILE 1 = 1 
    BEGIN 
     SET @res = @res + HASHBYTES('MD5', SUBSTRING(@data, @position, 8000)) 
     SET @position = @position+8000 
     IF @Position > @len 
      BREAK 
    END 
    WHILE DATALENGTH(@res) > 16 SET @res= dbo.GetMyLongHash(@res) 
    RETURN @res 
END 

,這將給你16個字節的值 - 你可以把所有的16個字節的GUID或唯一的首款8字節作爲bigint並進行比較。

適應功能,在您的方式 - 接受字符串作爲參數,甚至所有的領域,而不是VARBINARY

  • 小心用繩子套,日期時間格式
  • 如果使用CHECKSUM - 檢查其他字段,校驗和產生dublicates
  • 避免在相對較大的表上使用4字節散列結果
+0

有趣的方法 - 你將如何將它應用到多個領域?謝謝。 – 2012-02-10 08:59:53

+0

您可能總是連接字段並將結果傳遞給函數 – 2012-02-10 11:25:10