4

次の Code First エンティティがあります。

public class Department
{ 
    public int DepartmentID { get; set; }
    public string DepartmentName { get; set; }
}

私が設定した構成により、次の表が作成されます。

dbo.Departments
    DepartmentID INT PRIMARY KEY
    DepartmentName VARCHAR(75)

DepartmentName に手動でインデックスを追加し、次のクエリを実行しました。

var depts = new string[] { "Engineering", "Manufacturing" };
var departments = from d in db.Departments
                  where depts.Contains(d.DepartmentName)
                  select d;

トレースを実行すると、次の SQL が生成されました。

SELECT 
[Extent1].[DepartmentID] AS [DepartmentID], 
[Extent1].[DepartmentName] AS [DepartmentName]
FROM [dbo].[Departments] AS [Extent1]
WHERE [Extent1].[DepartmentName] IN (N'Engineering',N'Manufacturing')

私の列は varchar であり、クエリはテキストを NVARCHAR に変換しているため、オプティマイザーは DepartmentName インデックスでインデックス シークの代わりにクラスター化インデックス スキャンを実行することを選択しています。

データベースを nvarchar を使用するように変更する以外に、これを修正する方法はありますか? これはバグですか、それとも正常ですか?

4

1 に答える 1

0

これは、インデックス付きデータ テーブルが小さい場合に予想されることです。

SQL がディスクから読み取るデータの最小量は 8k (ページ) であるため、インデックスを使用している場合は、ディスクに 2 回アクセスする必要があります。1 回目はインデックス用で、2 回目はデータ用です。すべてのデータが 1 つの 8k データ ページに収まる場合でも、一度に読み取ることができるため、インデックスを使用すると不要なディスク IO が追加されます。

于 2012-12-21T12:00:12.310 に答える