2012-04-27 9 views
0

(Windowsレジストリのような)キーと値のペアを格納するためのテーブルが必要です。ここで私が持っているものです。効率的なキー/値テーブル

CREATE TABLE REG   
(      
    ID VARCHAR(255) NOT NULL, 
    DATA VARCHAR(1024), 
    PRIMARY KEY(ID)   
);      

私は、SQL Server 2008 R2、2008を使用していて、2005年

は、誰もが、キー/値のペアを格納することによりeffecientアイデアを提供することができます。

私はこのようなキーを格納しています:

/USER/REX/AUTO_LOGIN = "T"

/USER/REX/MESSAGE/1 = "これは長いメッセージ"

で約10000件のレコード私はすでにパフォーマンスの問題を見ています。

+1

パフォーマンスの問題?主キーがIDに設定されている場合、SQL Serverはその列のインデックスを作成し、クエリは10k行で非常に速くなければなりません。もちろん、あなたは 'SELECT * from reg WHERE id = '/ USER/REX/AUTO_LOGIN''のようなクエリを実行していると仮定します。あなたが物事に影響を与える可能性のあるワイルドカードを投げ始めたら... – Windle

+0

私はこのクエリを使用しています:SELECT DATA FROM REG WHERE ID =? – GenuineRex

+0

とこれです:UPDATE REG SET DATA =?ここでKEY =? – GenuineRex

答えて

2

キー名のハッシュである追加の列を導入することができます。例えば"/ USER/REX/AUTO_LOGIN"は102454にハッシュする可能性があります。ハッシュ・カラム(またはハッシュ・カラムとキー名カラムの複合インデックス)にインデックスを追加し、それを任意のクエリのwhere句に追加することができます。 int欄に検索などが

SELECT DATA 
FROM REG 
WHERE HASH = 102454 and ID = '/USER/REX/AUTO_LOGIN' 

varcharID列を照会よりもはるかに効率的である必要があり、その後、マッチングのために検査される同じハッシュ値、といくつかの行に絞り込むの効果を持っている必要がありますID値。

+0

申し訳ありませんが、これは私にとっては悪い考えです。理由は次のとおりです。(1)クラスタ化されたテーブルでセカンダリインデックスが高価(クラスタ化されていない可能性がありますが、 (2)とにかくIDのインデックスを避けることはできません(PKなので)、なぜ単に_it_を使用しないのですか?私は、ハッシュの非コンポジット・インデックスが実際にはより高速になると確信していません(よりコンパクトですが、「誤検出」があります)。 OTOH、ハッシュとIDのコンポジットはまったく意味がありません。あなたは実際にこのテクニックを実践していますか?現実的な量のデータに対してベンチマークを実行しましたか? –

1

私が代わりに一意のインデックスを選ぶ、私の主キーとしてvarchar(255)を使用しないようになります。

CREATE TABLE REG (
    id bigint identity not null, 
    key VARCHAR(256) NOT NULL, 
    DATA VARCHAR(1024), 
    PRIMARY KEY(ID) 
); 

create unique index reg_key on REG(key); 
+1

私はこれについて考えましたが、キーのインデックスが必要になり、SELECTクエリはキーのインデックスを読み込み、主キーに基づいてルックアップを行う必要があります。しかし、いったんPKをメモリに入れば、これによりアップデートが速くなる可能性があります。 – GenuineRex

+1

@GenuineRex私はそれをとにかく試してみましょう:クラスタ化されたPKインデックスでは長さの異なる大きな値を使用するだけで正しいとは思われませんが、私は間違っているかもしれません。 – dasblinkenlight

関連する問題