Performance Linq查询,其中包含
我正在尝试使linq where contains查询更快。 该数据集包含256999个客户端。ID只是一个简单的GUID列表,它只能包含3条记录Performance Linq查询,其中包含,performance,linq,where,contains,Performance,Linq,Where,Contains,我正在尝试使linq where contains查询更快。 该数据集包含256999个客户端。ID只是一个简单的GUID列表,它只能包含3条记录 returnItems = context.ExecuteQuery<DataClass.SelectClientsGridView>(sql).Where(x => ids.Contains(x.ClientId)).ToList(); 下面的查询最多需要一分钟才能返回3条记录。这是因为逻辑将遍历256999记录,以查看2569
returnItems = context.ExecuteQuery<DataClass.SelectClientsGridView>(sql).Where(x => ids.Contains(x.ClientId)).ToList();
下面的查询最多需要一分钟才能返回3条记录。这是因为逻辑将遍历256999记录,以查看256999记录中是否有任何记录在3条记录的列表中
returnItems = context.ExecuteQuery<DataClass.SelectClientsGridView>(sql).Where(x => ids.Contains(x.ClientId)).ToList();
returnItems=context.ExecuteQuery(sql).Where(x=>ids.Contains(x.ClientId)).ToList();
我想通过查询来检查这三条记录是否在256999的范围内。所以在某种程度上,这应该快得多
我不想做一个循环,因为3条记录可能要多得多(数千条)。循环次数越多,对数据库的点击次数就越多
我不想对所有的db记录(256999)进行绘图,然后再进行查询,因为这将花费几乎相同的时间
如果我只从数据库中获取所有256999的ID,则需要一秒钟的时间。这就是ID的来源。(经过筛选的小而简单的列表)
有什么想法吗
谢谢你说过“我不想抓取所有的数据库记录(256999),然后再进行查询,因为这将花费几乎相同的时间”,但是“如果我只从数据库中抓取所有256999的ID,这将需要一秒钟。”那么这真的需要“同样长的时间”吗
returnItems=context.ExecuteQuery(sql).Select(x=>x.ClientId).ToList().Where(x=>ids.Contains(x)).ToList();
不幸的是,即使这很快,也不是一个答案,因为您仍然需要有效的原始查询来实际提取匹配ID的完整记录:-(
因此,添加索引可能是您最好的选择。您说过“我不想获取所有数据库记录(256999),然后执行查询,因为这将花费几乎相同的时间”,但是“如果我仅从数据库中获取所有256999的ID,则需要一秒钟。”那么这真的需要“同样长的时间”吗
returnItems=context.ExecuteQuery(sql).Select(x=>x.ClientId).ToList().Where(x=>ids.Contains(x)).ToList();
不幸的是,即使这很快,也不是一个答案,因为您仍然需要有效的原始查询来实际提取匹配ID的完整记录:-(
因此,添加索引可能是最好的选择。Id查询之所以更快,是因为返回了一个字段,而它只是一个表查询。 主查询包含子查询(如下),因此我通过一个快速简单的查询获取ID,然后使用ID获取更多详细信息
SELECT Clients.Id as ClientId, Clients.ClientRef as ClientRef, Clients.Title + ' ' + Clients.Forename + ' ' + Clients.Surname as FullName,
[Address1] ,[Address2],[Address3],[Town],[County],[Postcode],
Clients.Consent AS Consent,
CONVERT(nvarchar(10), Clients.Dob, 103) as FormatedDOB,
CASE WHEN Clients.IsMale = 1 THEN 'Male' WHEN Clients.IsMale = 0 THEN 'Female' END As Gender,
Convert(nvarchar(10), Max(Assessments.TestDate),103) as LastVisit, ";
CASE WHEN Max(Convert(integer,Assessments.Submitted)) = 1 Then 'true' ELSE 'false' END AS Submitted,
CASE WHEN Max(Convert(integer,Assessments.GPSubmit)) = 1 Then 'true' ELSE 'false' END AS GPSubmit,
CASE WHEN Max(Convert(integer,Assessments.QualForPay)) = 1 Then 'true' ELSE 'false' END AS QualForPay,
Clients.UserIds AS LinkedUsers
FROM Clients
Left JOIN Assessments ON Clients.Id = Assessments.ClientId
Left JOIN Layouts ON Layouts.Id = Assessments.LayoutId
GROUP BY Clients.Id, Clients.ClientRef, Clients.Title, Clients.Forename, Clients.Surname, [Address1] ,[Address2],[Address3],[Town],[County],[Postcode],Clients.Consent, Clients.Dob, Clients.IsMale,Clients.UserIds";//,Layouts.LayoutName, Layouts.SubmissionProcess
ORDER BY ClientRef
我希望有一种更简单的方法来实现Contain元素,因为ID池比主池小
目前我加快它的一种方法是。我已经完成了一个Stinrg.Join到Id列表中,并将它们添加为主SQL中的WHERE。这将时间缩短到了几秒钟左右。Id查询之所以更快,是因为返回了一个字段,而它只是一个表查询。 主查询包含子查询(如下),因此我通过一个快速简单的查询获取ID,然后使用ID获取更多详细信息
SELECT Clients.Id as ClientId, Clients.ClientRef as ClientRef, Clients.Title + ' ' + Clients.Forename + ' ' + Clients.Surname as FullName,
[Address1] ,[Address2],[Address3],[Town],[County],[Postcode],
Clients.Consent AS Consent,
CONVERT(nvarchar(10), Clients.Dob, 103) as FormatedDOB,
CASE WHEN Clients.IsMale = 1 THEN 'Male' WHEN Clients.IsMale = 0 THEN 'Female' END As Gender,
Convert(nvarchar(10), Max(Assessments.TestDate),103) as LastVisit, ";
CASE WHEN Max(Convert(integer,Assessments.Submitted)) = 1 Then 'true' ELSE 'false' END AS Submitted,
CASE WHEN Max(Convert(integer,Assessments.GPSubmit)) = 1 Then 'true' ELSE 'false' END AS GPSubmit,
CASE WHEN Max(Convert(integer,Assessments.QualForPay)) = 1 Then 'true' ELSE 'false' END AS QualForPay,
Clients.UserIds AS LinkedUsers
FROM Clients
Left JOIN Assessments ON Clients.Id = Assessments.ClientId
Left JOIN Layouts ON Layouts.Id = Assessments.LayoutId
GROUP BY Clients.Id, Clients.ClientRef, Clients.Title, Clients.Forename, Clients.Surname, [Address1] ,[Address2],[Address3],[Town],[County],[Postcode],Clients.Consent, Clients.Dob, Clients.IsMale,Clients.UserIds";//,Layouts.LayoutName, Layouts.SubmissionProcess
ORDER BY ClientRef
我希望有一种更简单的方法来实现Contain元素,因为ID池比主池小
目前我加快速度的一种方法是。我做了一次尝试。加入Id列表,并将它们添加为主SQL中的WHERE。这将时间缩短到了几秒钟左右。如果您使用的是原始SQL,您可以在SQL本身中完成。
从表A中选择Id,其中Id位于(11,12,13)
数据库中适当的索引将提高性能为什么使用ExecuteQuery
而不是DbSet
?上下文返回的类型是什么。ExecuteQuery?执行查询返回的类型是一个数据类,我创建该数据类是为了匹配SQL SELECT。就像对于复杂的linqYou co一样uld尝试IndexOf()>=0
,以防万一它在这里也有帮助。(当然,它不应该:-|)如果您使用的是原始sql,您可以在sql本身中进行操作。从表A中选择Id,其中Id位于(11,12,13)
数据库中适当的索引将提高性能为什么使用ExecuteQuery
而不是DbSet
?上下文返回的类型是什么。ExecuteQuery?执行查询返回的类型是一个数据类,我创建该数据类是为了匹配SQL SELECT。就像对于复杂的linqYou co一样uld尝试IndexOf()>=0
,以防万一它在这里也有帮助。(当然,它不应该:-|)