簡體   English   中英

EF SQL 查詢逗號分隔字符串 ID 的性能

[英]EF SQL query Performance on comma-separated string Ids

要存儲和查詢關聯的 ID,哪種方法在查詢速度和性能方面效果最好? 尤其是在主表的大量記錄中,比如10萬條記錄。

1- 使用逗號分隔的字符串字段作為 ID:

query.Where(x => (',' + x.Ids + ',').Contains(',' + value + ','));

2-使用單獨的表和連接操作:

query.Where(x => x.SecondaryTable.Any(s => s.Id == value));

第一個選項對動態生成的字符串執行字符串比較,因此索引不可能提高查詢性能。 它會異常緩慢。

第二個選項是對索引主鍵執行數字比較(假設 Id 是某種數字類型並且它是主鍵)。 對於您的處理器來說,這是一個更快的比較來評估,而且它是一個簡單的比較,無需為所述比較生成動態數據。

如果您將 ID 存儲為逗號分隔的字符串 - 您總是有 TABLE/INDEX 掃描。 如果你的桌子很小,那就足夠了。

使用存儲與主表關聯的 Id 的SecondaryTable表,還有許多其他計划:

  1. 您可以保持原樣並信任或不信任數據庫引擎優化器
query = query.Where(x => x.SecondaryTable.Any(s => s.Id == value));
  1. 如果對 (MainId, Id) 是唯一的。 以下查詢肯定會命中索引
var query = 
   from m in query
   from s in m.SecondaryTable.Where(s => s.Id == value)
   select s;
  1. 如果對 (MainId, Id) 不是唯一的。
var secondary = db.SecondaryTable.Where(s => s.Id == value);
var mainIds = secondary.Select(s => new { s.MainId }).Distinct();

query = 
   from m in query
   from s in mainIds.Where(s => s.MainId == m.Id)
   select m;

無論如何,最好測試和檢查執行計划。

暫無
暫無

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

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