查询一个包含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语句没有被应用

查询一个包含6000条记录的表需要很长时间

我会从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目前没有进行不区分大小写搜索的工具(它不接受带有IEqualityComparerContains重载),因此从技术上讲,您无法避免这种情况。但数据库排序规则可能不区分大小写,因此x.FirstName.Contains(containing.ToLower()可能会给出相同的结果,带有索引。

我只看到了一件可以改进的事情:

  • Where之后使用DistinctDistinct是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)