我正在尝试更快地创建包含查询的linq。 该数据集包含256,999个客户端。 Ids只是一个简单的GUID列表,这个只能包含3条记录。
以下查询最多可能需要一分钟才能返回3条记录。这是因为逻辑将通过256,999记录来查看256,999条记录中是否有任何记录在3条记录的列表中。
returnItems = context.ExecuteQuery<DataClass.SelectClientsGridView>(sql).Where(x => ids.Contains(x.ClientId)).ToList();
我想查询并检查三条记录是否在256,999的底池中。所以在某种程度上这应该更快。
我不想做循环,因为3条记录可能更多(数千)。循环次数越多,db就越多。
我不想抓取所有db记录(256,999),然后执行查询,因为它需要几乎相同的时间。
如果我只从数据库中获取所有256,999的ID,则需要一秒钟。这是Ids的来源。 (过滤的,小而简单的列表)
任何想法?
由于
答案 0 :(得分:0)
您已经说过&#34;我不想抓取所有数据库记录(256,999),然后进行查询,因为这需要几乎相同的时间,&#34;而且&#34;如果我从DB中获取所有256,999的Ids,则需要一秒钟。&#34;那么这真的需要&#34;同样长&#34;?
returnItems = context.ExecuteQuery<DataClass.SelectClientsGridView>(sql).Select(x => x.ClientId).ToList().Where(x => ids.Contains(x)).ToList();
不幸的是,即使这很快,也不是答案,因为您仍然需要有效的原始查询来实际提取匹配的ID的完整记录: - (
因此,添加索引可能是您的最佳选择。
答案 1 :(得分:0)
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元素。由于Ids池比主池小。
我现在加速的方式是。我已经将Stinrg.Join添加到了Ids列表中,并将它们添加为主SQL中的WHERE。这样可以将时间缩短到现在的几秒钟。