簡體   English   中英

Email在SQL服務器中查找地址

[英]Email address lookup in SQL Server

我們有一個大型訂戶數據庫,並基於nvarchar(100)類型的 email 地址進行查找。 它有時會超時,可能是因為對其進行了大量掃描。

var existingEmails =
    _subscriptionsRepository.DataContext
                            .Subscriptions
                            .Where(q => q.Email != null && 
                                        q.Email.ToLower().Equals(model.Email.ToLower()))
                            .ToList();

我想改進這一點,但對某些選項感到厭倦。 上面的索引可以嗎,如果需要,我可以處理額外的存儲,或者計算列來抓取域部分。 基於數十萬的 email 地址查找行的快速方法是什么?

是的,這正是索引的用途。 添加索引。 但是:要使索引以最佳方式工作,它需要是存儲在索引中的值的相等(或至少是范圍)過濾器; LCASE(Foo) / LOWER(Foo)等不符合條件。 假設您的數據庫以區分大小寫的模式運行,最好在存儲數據時以規范化形式(小寫或其他形式)存儲數據,然后對您正在搜索的數據執行相同的規范化,允許您只對數據庫使用相等測試,即

var normalizedEmail = YourNormalizationMethodHere(model.Email);
var matches = _subscriptionsRepository.DataContext.Subscriptions.Where(
    q => q.NormalizedEmail != null && q.NormalizedEmail == normalizedEmail);

(但即使只是將數據放在索引中也可以提高性能,即使使用LCASE / LOWER之類的功能,因為它可以減少所需的頁面讀取)

@MarcGravelli 顯然是對的。

很難確定,但我的猜測是您的查詢的問題在於它必須將數十萬個 email 地址轉換為小寫,然后將它們與您的搜索詞進行比較。 轉換可能比搜索本身更昂貴。

正如 Marc 所說,在存儲數據之前對其進行規范化好得多。

如果這不可能,您可以使用地址的小寫版本引入計算列,並向該列添加索引。 然后,您可以針對該列進行搜索。

當然,這有點小技巧,可能會導致維護挑戰,但這可能是一個短期的解決方案。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM