2009-03-16 16 views
19

SQL Serverでは、IDのプライマリキーを持つテーブルがあります。しばしば最新のいくつかの新しいレコードが必要なので、主キーを降順でソートしたトップnを取得します。プライマリキーインデックスを降順として定義する必要がありますか、それとも違いはありませんか?つまり、それらが昇順であれば、SQLは効率的に後方に働くことができますか?主キー昇順と降順

+0

いいえ、あなたは** desc **としてそれを作成してはいけません。 [ここに示すように]挿入物から論理的な断片化がたくさん発生する(http://stackoverflow.com/a/9382500/73226) –

答えて

30

純粋に問い合わせる観点からあなたはN最新またはN最古のレコードを引っ張るしたい場合、それはあなたのキーが降順または昇順されているかどうか違いはありません:

のSQL Serverの内部アルゴリズムは、均等に移動することができますキーが格納されている順序にかかわらず、単一列のインデックス上の両方向で効率的に実行できます。たとえば、単一列の索引にDESCを指定しても、索引にASCが指定されている場合よりも、ORDER BYのIndexKeyCol DESC句を使用した問合せが高速に実行されるわけではありません。 http://msdn.microsoft.com/en-us/library/aa933132(SQL.80).aspx

しかし
ちょうど約あらゆる通常の状況下で、 はあなたの主キーが昇順と断片化を防ぐためにordinallyシーケンシャルことにしたいです。 SQL Serverは、データベースファイルの最後に新しいレコードを物理的に追加するために最適化されています。新しいレコードを一番上に挿入してすべてを押し込む必要がある場合は、断片化がほぼ100%になる可能性があります。

3

これは全く違いはありません。

どちらの方法で宣言することが可能なのか想像もできません。

+3

単一の列インデックスでは違いはありませんが、ASCとDESCが有効になります索引に複数の列があり、順序が2番目/ 3番目/ 4番目の/ etc列の場合に重要です。 –

+0

これは私には意味がありません。 2つのフィールド値がある場合、ツリーを下降させる方法は完全に無関心です。それはちょうど推測ですか、またはあなたは参照を持っていますか? – dkretz

+0

私には意味があります。索引が 'A ASC、B DESC'と宣言されていても、ほとんどの照会は' ORDER BY A ASC、B ASC 'でソートを避けます。 –

関連する問題