当時のBooks Onlineに示されているように、SQL Server 2000ではビットフィールドにインデックスを付けることはできません。
ビット
整数データ型1、0、またはNULL。
備考
タイプがビットの列にインデックスを付けることはできません。
はい。数百万行のうち、行数が少ない場合は、インデックスが役立ちます。ただし、この場合は、列をaにする必要があります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
インデックスシークの後にブックマークルックアップが発生するのではなく、インデックスシークの後にブックマークルックアップが実行されるのではなく、テーブルスキャン(またはクラスター化インデックススキャン)が実行されます。
実験と直接観察により検証済み。