[英]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.