【发布时间】:2012-10-22 11:32:42
【问题描述】:
我们从数据库加载大对象图。 查询有很多 Includes,Where() 使用 Contains() 过滤最终结果。 包含大约一千个条目的集合调用包含。
分析器显示了可怕的人类不可读的 SQL。 由于 Contains(),查询无法预编译。
有没有办法优化这样的查询?
更新
public List<Vulner> GetVulnersBySecurityObjectIds(int[] softwareIds, int[] productIds)
{
var sw = new Stopwatch();
var query = from vulner in _businessModel.DataModel.VulnerSet
join vt in _businessModel.DataModel.ObjectVulnerTieSet.Where(ovt => softwareIds.Contains(ovt.SecurityObjectId))
on vulner.Id equals vt.VulnerId
select vulner;
var result = ((ObjectQuery<Vulner>)query.OrderBy(v => v.Id).Distinct())
.Include("Descriptions")
.Include("Data")
.Include("VulnerStatuses")
.Include("GlobalIdentifiers")
.Include("ObjectVulnerTies")
.Include("Object.ProductObjectTies.Product")
.Include("VulnerComment");
//Если переданы конкретные продукты, добавляем фильтрацию
if (productIds.HasValues())
result = (ObjectQuery<Vulner>)result.Where(v => v.Object.ProductObjectTies.Any(p => productIds.Contains(p.ProductId)));
sw.Start();
var str = result.ToTraceString();
sw.Stop();
Debug.WriteLine("Сборка запроса заняла {0} секунд.", sw.Elapsed.TotalSeconds);
sw.Restart();
var list = result.ToList();
sw.Stop();
Debug.WriteLine("Получение уязвимостей заняло {0} секунд.", sw.Elapsed.TotalSeconds);
return list;
}
【问题讨论】:
-
也许,但不是没有看到你正在尝试做的例子......
-
仅限明天。代码留在办公室 =)
-
我认为 contains 使用
like '%%'应该可以通过全文索引 sql 中的列来调整 -
提高
Contains性能的解决方案是将softwareIds集合拆分为更小的块并执行多个查询:stackoverflow.com/a/7936350/270591
标签: entity-framework