0

我们的应用程序中的一个数据拉取了我们的性能噩梦。情况是基于区域的查询,我们有大量的客户列表,他们应该只在查看他们的区域时看到他们所在区域的客户。当前表格(为便于解释而缩减):

Customer (Table):
CustomerID
FirstName
LastName
....

RegionCustomer (Table):
RegionCustomerID
RegionID
CustomerID

这比使用以下语句通过 .net 实体框架检索(edmx 设置一对多关系,其中一个客户可以拥有多个 RegionCustomer):

EntitiesManager.Customers.Where(function(x) x.RegionCustomers.Any(function(y) y.RegionID = CurrentUserRegionID)).ToList()

当您在任一表中处理 < 1000 条记录时,这运行正常,但之后这是一场性能噩梦,sql server 会启动 CPU 一些令人震惊的事情并且需要很长时间。上面的语句创建的 SQL 对于它需要做的事情(通过 SQL Profiler 跟踪)来​​说非常讨厌。

只是想知道是否有人对如何加快速度有任何想法?

提前致谢

4

1 回答 1

0

从 RegionCustomers 开始应该会有所帮助:

EntitiesManager.RegionCustomers.Where(function(regionCustomer) regionCustomer.RegionID = CurrentUserRegionID).SelectMany(function(regionCustomer) regionCustomer.Customers).ToList()

我不习惯 VisualBasic 语法,但如果不正确,在 C# 中会是:

EntitiesManager.RegionCustomers.Where(regionCustomer => regionCustomer.RegionID == CurrentUserRegionID).SelectMany(regionCustomer => regionCustomer.Customers).ToList();

我认为 SQL 将类似于以下内容:

SELECT * FROM Customer WHERE CustomerID IN (SELECT CustomerID FROM RegionCustomer WHERE RegionID = {0})

您可能还需要考虑使用 skip().take() 进行分页,并使用与 CustomerId 上的外键关系优化 RegionCustomer 表(如果它不存在)。这应该是一个相当快的查询。

另外一定要检查执行计划,看看 SQL Server 是否有任何建议。

祝你好运!

于 2013-06-04T06:31:05.313 回答