1

記述しようとしているクエリのパフォーマンスに問題があります。その中に約6000のレコードを含むテーブルがあります。

現在、開発マシンで実行するのに約 15 秒かかります。vs2012 および sql2012 を実行する 32 GB RAM クアッドコアを搭載した win8 マシン。だから、それは私のマシンではなく、私の悪いコードです。

    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();

データベース テーブルのレイアウトは次のとおりです。

仕事

BusinessId
名前
など

StoreId

StoreId
StoreName
BusinessId

消費者

ConsumerId
FirstName
LastName

消費者のアイデンティティ

BusinessId
ConsumerIdentityType
ConsumerIdentityValue

クエリ結果を返すのに非常に時間がかかる、私が間違っている明らかなことを誰でも見ることができますか?

SQL プロファイラーをオンにするのは怖かったです。最初に行われたクエリは、ビジネス ID が一致する ConsumerIdentity テーブルからすべてを選択することでした。それならビジネステーブルテーブルを手に入れるのに最適です。

ただし、次のようなすべてのレコードに対して呼び出しを行うようです

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ステートメントが適用されていないようです

4

4 に答える 4

0

Where の後に Select を実行すると役に立ちますか?

        consumers =
            business.ConsumerIdentities
                    .Where(x => x.FirstName.ToLower().Contains(containing.ToLower()))
                    .Distinct()
                    .Select(ci => ci.Consumer)
                    .ToList();
于 2013-02-03T00:40:49.317 に答える
0

プロセス時間を短縮する可能性のある最適化する方法がいくつかありますが (他の人が言った)、クエリを実行する方法はどれも、6000 レコードのデータベースで検索プロセスを実行することです。ただし、6000 レコードの場合は 15 秒よりも速く実行する必要があります。

メモリキャッシュが原因である可能性があります。VS とシステム キャッシュをクリアしてから、再試行することをお勧めします。(システムキャッシュには C-Cleaner アプリを使用できます)

ADO で Async を使用することもできます。工程時間の短縮に大きな効果があります。(非同期をサポートする IDataReadables と IDataReaders で実行できます)

于 2014-01-16T12:14:00.290 に答える
0

改善できる点が 1 つだけあります。

  • ( is a O(n log n) in O(n))のDistinct後に使用しますWhereDistinctWhere

        consumers =
            business.ConsumerIdentities.Select(ci => ci.Consumer)
                    .Where(x => x.FirstName.ToLower().Contains(containing.ToLower()))
                    .Distinct()
                    .ToList();
    

しかし、パフォーマンスの問題が LINQ クエリに起因しているとは思えません (いずれにせよ、6000 レコードは非常に高速である必要があります)。

于 2013-02-03T00:07:30.603 に答える