2015-08-18 91 views
1

假設我們有這個表索引與MD5在SQL Server

ID | MAIL 
1 | [email protected] 
2 | [email protected] 
3 | [email protected] 

你明白了吧... 我現在要查詢這個表,我作爲輸入接收郵件列值的MD5哈希。 所以我的疑問是這樣的:

SELECT * FROM TABLE 
WHERE HashBytes('MD5', MAIL) = 'CE42C51D0B63DF9F616CCFB4C3FCF16C' 

現在想象一下這個表是一個非常大的表中,記錄千餘。我的查詢變得非常慢。我現在想要做的是添加索引,但使用MD5。我讀它可以在PostgreSQL上使用這樣的事情來完成:

CREATE INDEX mail_md5 ON TABLE(DECODE(MD5(MAIL), 'HEX')) 

我可以在SQL Server中做類似的事嗎?

注:我不能與散列值:(

注2添加另一列:我知道一個HASH是一種不可逆的功能,PostgreSQL的索引的例子是從here

+1

你能至少新表添加到數據庫中,所以你能加入預先計算哈希值的郵件地址? – Scoregraphic

+0

這似乎也非常困難。 – cgajardo

+0

我的主要問題是,如果可能與否。如果不是,那麼我可以開始尋找新的解決方案。 – cgajardo

回答

1

我複製我不確定你可以在架構上做什麼,但是如果你可以修改架構,那麼SQL Server有一些名爲Indexed Views的東西,這些東西是存儲在內存中的視圖(vs隨時計算)。可以查詢視圖而不是基礎表,並且SQL Server將保持它全部爲最新你。關鍵的一句是WITH SCHEMABINDING,它告訴SQL服務器,使計算領域在內存中。

例如:

CREATE UNIQUE CLUSTERED INDEX IndexHashedAddresses ON HashedAddresses(HashedMailMD5); 

之後,這應該是快:

SELECT ID FROM HashedAddresses WHERE HashedMailMD5 = '0x121....' 

問題

CREATE VIEW HashedAddresses 
WITH SCHEMABINDING 
AS 
SELECT ID, MAIL, HASHBYTES('MD5',MAIL) as HashedMailMD5 from myschema.mytable; 

然後你就可以在你的哈希場創建unique聚集索引:如果您遇到MD5衝突,索引將失敗。不知道該怎麼做那......

+0

謝謝!我可以解決碰撞包括其他專欄;)(我的例子是真正的方案的簡化)。然後再次,謝謝,這應該工作。 – cgajardo

+0

不客氣。上面的Microsoft鏈接聲稱你甚至不需要根據視圖進行查詢,因爲SQL Server會自動將它用作優化。我很想知道這是否適合你。 –