当時オンライン ブックで指摘されていたように、SQL Server 2000 ではビット フィールドにインデックスを作成することはできません。
少し
整数データ型 1、0、または NULL。
備考
ビット型の列にはインデックスを設定できません。
はい、数百万行のうち、ほんの一握りの行しかない場合は、インデックスが役立ちます。ただし、この場合に実行したい場合は、列をtinyint
.
注意: Enterprise Manager では、ビット列にインデックスを作成できません。必要に応じて、ビット列に手動でインデックスを作成できます。
CREATE INDEX IX_Users_IsActiveUsername ON Users
(
IsActive,
Username
)
しかし、SQL Server 2000 は実際にはそのようなインデックスを使用しません。たとえば、インデックスが完全な候補となるクエリを実行します。
SELECT TOP 1 Username
FROM Users
WHERE IsActive = 0
SQL Server 2000 は代わりにテーブル スキャンを実行し、インデックスが存在しないかのように動作します。列を tinyint に変更すると、SQL Server 2000はインデックス シークを実行します。また、次のカバーされていないクエリ:
SELECT TOP 1 *
FROM Users
WHERE IsActive = 0
インデックス シークを実行し、続いてブックマーク ルックアップを実行します。
SQL Server 2005 では、ビット列のインデックスのサポートが制限されています。例えば:
SELECT TOP 1 Username
FROM Users
WHERE IsActive = 0
カバリング インデックスを介してインデックス シークが発生します。しかし、カバーされていないケース:
SELECT TOP 1 *
FROM Users
WHERE IsActive = 0
インデックス シークに続いてブックマーク ルックアップが行われるのではなく、インデックス シークに続いてブックマーク ルックアップが実行されるのではなく、テーブル スキャン (またはクラスター化インデックス スキャン) が実行されます。
実験と直接観察によって検証されています。