查询一个包含6000条记录的表需要很长时间
本文关键字:长时间 记录 6000条 包含 一个 查询 | 更新日期: 2023-09-27 17:57:34
我试图编写的查询的性能有问题。我有一张表,里面有大约6000条记录。
目前,在我的开发机器上运行大约需要15秒。一台运行vs2012&sql2012.所以这不是我的机器,而是我的坏代码。
public IEnumerable<Customer> GetByStoreIdAndContainingName(Guid storeId, string containing)
{
using (var context = new Entities())
{
var store = context.Stores.FirstOrDefault(b => b.StoreId == storeId);
if (store == null) return null;
var business = store.Business;
var consumers = new List<Consumer>();
consumers =
business.ConsumerIdentities.Select(ci => ci.Consumer)
.Distinct()
.Where(x => x.FirstName.ToLower().Contains(containing.ToLower()))
.ToList();
数据库表的布局是
业务
业务Id
名称
etc
StoreId
StoreId
店铺名称
业务ID
消费者
ConsumerId
名字
姓氏
消费者标识
业务Id
ConsumerIdentity类型
ConsumerIdentity Value
有人能看到我做错了什么需要很长时间才能返回查询结果吗?
打开SQL事件探查器很可怕。进行的第一个查询是从ConsumerIdentity表中选择与业务Id匹配的所有内容。太好了,那就完美了,然后拿到了商务桌。
然而,似乎会为这样的每一张唱片打电话
exec sp_executesql N'SELECT
[Extent1].[ConsumerId] AS [ConsumerId],
[Extent1].[UserID] AS [UserID],
[Extent1].[FirstName] AS [FirstName],
[Extent1].[LastName] AS [LastName],
[Extent1].[IsMale] AS [IsMale],
[Extent1].[DateOfBirth] AS [DateOfBirth],
FROM [dbo].[Consumer] AS [Extent1]
WHERE [Extent1].[ConsumerId] = @EntityKeyValue1',N'@EntityKeyValue1 uniqueidentifier',@EntityKeyValue1='952ED7B8-2123-49E2-BAE3-69FBD713BACB'
所以看起来我的where语句没有被应用
我会从Customer开始(如果存在属性),因为这首先保存了一个Distinct
,它应该在一个SQL语句中完成所有操作:
from c in Customer
where c.FirstName.ToLower().Contains(containing.ToLower())
&& c.ConsumerIdentity.Business.StoreId == storeId
select c
这不会带走c.FirstName.ToLower()
上的where
。这样的构造总是会影响性能,因为它们不可搜索(它们消除了任何索引)。EF目前没有进行不区分大小写搜索的工具(它不接受带有IEqualityComparer
的Contains
重载),因此从技术上讲,您无法避免这种情况。但数据库排序规则可能不区分大小写,因此x.FirstName.Contains(containing.ToLower()
可能会给出相同的结果,带有索引。
我只看到了一件可以改进的事情:
-
在
Where
之后使用Distinct
(Distinct
是O(n)中的O(n log n)Where
)consumers = business.ConsumerIdentities.Select(ci => ci.Consumer) .Where(x => x.FirstName.ToLower().Contains(containing.ToLower())) .Distinct() .ToList();
但我怀疑您的性能问题是否来自LINQ查询(在任何情况下,6000条记录都应该非常快)。
如果在Where之后执行Select,会有帮助吗?
consumers =
business.ConsumerIdentities
.Where(x => x.FirstName.ToLower().Contains(containing.ToLower()))
.Distinct()
.Select(ci => ci.Consumer)
.ToList();
有几种优化方法可以减少处理时间(其他人告诉过),但任何查询方法都是在有6000条记录的数据库上进行搜索。但对于6000张唱片来说,它的速度应该超过15秒。
这可能是因为你的内存缓存。我建议清除VS和系统缓存,然后重试。(您可以使用C-Cleaner应用程序进行系统缓存)
您也可以在ADO中使用异步启动。它在减少处理时间方面有很大的作用。(您可以使用支持异步的IDataReadables和IDataReaders)