我试图从一个复杂的视图中选择数据,但查询物化需要很长时间(4秒)。
这是代码:
// 1. Perform a Search by name on tbl_member
var memberIDs = (from m in DC.tbl_Member
where (m.FirstNameFiltered + ' ' + m.LastNameFiltered).Contains(fileteredName)
select m.MemberID).Take(10).ToList();
// 2. Get the members data from View_QuickSearch
var members = (from m in DC.View_QuickSearch
where memberIDs.Contains(m.MemberID)
select m);
// 3. Materialize the results
members.ToList();
字符串
第一个语句在tbl_Member中进行实际搜索并返回所需的ID。它的时间是预期的,它在2秒钟内顺利运行。
第二条语句根据返回的10个ID从Complex View中检索数据。调用members.ToList()时,需要很长时间(4秒)。
我从Visual Studio调试器中获得了members查询,并将其放入SSMS中,它在几毫秒内立即返回数据。
SELECT [t0].[MemberID], [t0].[fullName], [t0].[fullNameFiltered], [t0].[Mobile], [t0].[NationalID], [t0].[Job], [t0].[Company], [t0].[EDUClass], [t0].[AttendanceChurch], [t0].[FamilyChurch]
FROM [dbo].[View_QuickSearch] AS [t0]
WHERE [t0].[MemberID] IN (756, 969, 1349, 1390, 1486, 1900, 2234, 2697, 2852, 3286)
型
所以这意味着问题不在视图本身,也不在select语句或索引中。
1条答案
按热度按时间u3r8eeie1#
为了加快提供的代码,可以做一些优化:
1.减少数据库往返:您可以使用联接将逻辑组合到单个查询中,而不是执行单独的查询来获取成员ID和成员数据。
1.提前限制查询大小:您可以直接在查询中限制结果的数量,而不是先获取所有匹配成员,然后具体化结果。
下面是代码的优化版本:
字符串
在这个优化的代码中:
1.搜索条件直接应用在查询的where子句中,将名称筛选与联接条件结合起来。
通过组合查询并在流程的早期应用过滤和限制,这个优化版本应该有助于提高代码的速度和效率。