2017-02-21 2 views
0

私は多少のテーブル(〜2000万行)を持っており、bitの情報をさらにdatetime2で保存する必要があります。私は常にbitの情報だけを照会し、bitの情報が1の場合、常にdatetime2の情報があることを知っています。私はこれを実現するための二つの方法を検討している:datetime2とbit + datetime2の格納と索引付け

a)のインデックスはのみEnabled

create table Items ( 
    Enabled bit not null, 
    EnabledWhen datetime2 null 
) 

b)のインデックスが含まれますのみEnabledが含まれているだろうが、クエリは常にEnabled is nullまたはEnabled is not null

create table Items (
    Enabled datetime2 null 
) 
のいずれかになります

より効率的なバージョンは何ですか?

+4

Eric Lippertは、[あなたの馬の競走](https://ericlippert.com/2012/12/17/performance-rant/) –

+2

と言いますが、私が言うように、実際のパフォーマンスの問題を実演していない限り、または計算することができます。 'Enabled'が他のカラムの' null'/'not null'の性質を常に論理的にたどる場合は、問題を実証するまでその値を使用してください。次に、あなた自身がデータを保持するのではなく、計算されたデータを保持することができるかどうかを検討します(例えば、永続的な計算カラム、おそらく?)、データが一貫しているかどうかを確認する必要はありません*。 –

+0

'bit'は、選択性が低いため、インデックスの選択肢が非常に悪いです。このようなインデックスは、大部分のシナリオでは考慮されないことがほぼ保証されています。 – dean

答えて

1

これはユースケースなしでは答えにくいです。ビット列を追加すると、日付列よりも少し効率的になります。これは、索引が小さくてページのレコード数を増やすためですが、ビット列を追加すると表が少し広くなり、つまり効率が少し低下します。

クラスタ化インデックスを使用している場合は、ビット列を追加せずに日付のインデックスを作成してください。

これは、クラスタ化されていないインデックスをカバーし、日付列が必要な場合は、ビット列を追加せず、代わりに日付をインデックスします。

日付を必要としない非クラスタ化インデックスの場合は、ビット列を使用し、日付が含まれていないと仮定して、必要な列を追加します。日付の列。

一般的に、ビット列は、使用例が非常に狭いため、スペースの無駄です。

関連する問題