1

クエリでパフォーマンスのボトルネックがいくつか発生しています。何が起こるかというと、エンティティにプロパティをバイトとして導入すると、EF 4.1 はそれを使用する前にそれを int にキャストします。指定されたコードは次のように説明します。

var segmentQuery = workUnit.SegmentRepository.GetQuery()
                                             .Where(x => x.FileId == file.Id)
                                             .Where(x => x.StateValue == (byte)SegmentState.Unhandeled)
                                             .OrderBy(x => x.Index);

次のようにうまく変換できます。

SELECT 
....
FROM ( SELECT 
    [Extent1].[Id] AS [Id], 
    ...
    [Extent1].[StateValue] AS [StateValue]
    FROM [Segments] AS [Extent1]
    WHERE ([Extent1].[FileId] = @p__linq__0) AND (0 = [Extent1].[StateValue])
)  AS [Project1]
ORDER BY [Project1].[Index] ASC

ただし、上記の場合: StateValue は実際には私の要件 (4 つの異なる状態) には大きすぎる整数ですが、それをバイトに変更すると、次のようになります。

SELECT ...
FROM ( SELECT 
    [Extent1].[Id] AS [Id], 
      ...
    [Extent1].[StateValue] AS [StateValue]
    FROM [Segments] AS [Extent1]
    WHERE ([Extent1].[FileId] = @p__linq__0) AND (0 = ( CAST( [Extent1].[StateValue] AS int)))
)  AS [Project1]
ORDER BY [Project1].[Index] ASC

このテーブルには 1 日で 100,000 を超える行が含まれる可能性があるため、State フィールドが 1 バイトしか占有しないため (幸いなことに必須ではありませんが)、スペース効率が高くなりますが、バイトに変更するとクエリが強制終了されます。

私は何か間違ったことをしましたか?何か私にできることはありますか?この「問題」はわかっていますか?

ありがとう!

** アップデート **

[Flags]
public enum SegmentState : byte
{
    Unhandeled,
    Downloaded,
    Invalid,
    Assembled
}

そして私のエンティティでは:

/// <summary>
/// Dont use this, use SegmentState instead
/// </summary>
[Required]
public byte StateValue
{
    get { return _stateValue; }
    set { _stateValue = value; }
}

public SegmentState State
{
    get { return (SegmentState)StateValue; }
    set 
    {
        if (State != value)
        {
            StateValue = (byte)value;
            RaisePropertyChanged(StatePropertyName);
        }
    }
}
4

1 に答える 1

0

真剣にEFを使用しないでください - それはあなたの人生で最大の苦痛になるでしょう. C# で MASSIVE とダイナミクスを見てみましょう。

于 2011-06-10T21:34:23.990 に答える