5

私は人々のタイトル(「Mr」、「Mrs」など)を格納する非常に単純なテーブルを持っています。これが私がやっていることの簡単なバージョンです(この例では一時テーブルを使用していますが、結果は同じです):

create table #titles (
    t_id    tinyint     not null    identity(1, 1),
    title   varchar(20) not null,

    constraint pk_titles primary key clustered (t_id),
    constraint ux_titles unique nonclustered (title)
)
go

insert #titles values ('Mr')
insert #titles values ('Mrs')
insert #titles values ('Miss')

select * from #titles

drop table #titles

テーブルの主キーはクラスター化され (例のために明示的に)、タイトル列にはクラスター化されていない一意性制約があることに注意してください。

選択操作の結果は次のとおりです。

t_id title
---- --------------------
3    Miss
1    Mr
2    Mrs

実行計画を見ると、SQL はクラスター化された主キーよりも非クラスター化インデックスを使用しています。結果がこの順序で返される理由はこれで説明できると思いますが、なぜこれが行われるのかはわかりません。

何か案は?さらに重要なことに、この動作を止める方法はありますか? 行が挿入された順序で返されるようにします。

ありがとう!

4

4 に答える 4

6

順序が必要な場合は、明示的に指定する必要があります。ORDER BYそれ以外のものは順序を生成しませ(「順序」はランダムであり、変更される可能性があります)。SQL Serverには、暗黙の順序はありません。何もありません。注文が必要な場合は、と言ってORDER BYください。

SQL Serverはおそらく非クラスター化インデックスを使用します(可能な場合-そのインデックスにクエリが要求するすべての列がある場合)それは小さいため-通常はインデックス列とクラスタリングキー(ここでも1つまたは複数)列)。一方、クラスター化されたインデックスは(リーフレベルでの)データ全体であるため、回答を得るために、より多くのデータを読み取る必要がある場合があります(もちろん、この過度に単純化された例ではありませんが、実世界)。

于 2011-08-04T06:20:24.940 に答える
5

行の順序を(絶対的かつ正確に)保証する唯一の方法ORDER BYは、を使用することです。それ以外のものは、実装の詳細であり、示されているように爆発しがちです。

エンジンが一意のインデックスを選択した理由については、問題ではありませんでした。

  1. あるインデックスを別のインデックスよりも優先する基準はありませんでした
  2. 一意のインデックスは、返されたデータ(タイトルとPK)をカバーしていました。これは私の側では多少推測的ですが、SQLServerは最善と思われることを実行しています。

カバーされていない追加の列があるテーブルで試してみてください-賭けはありませんが、クエリプランナーの考えが変わる可能性があります。

ハッピーコーディング。

于 2011-08-04T06:18:04.470 に答える
4

要求したすべてのデータ(IDとタイトル)をそのインデックスから取得できるため、SQLServerはおそらく非クラスター化インデックスを選択しました。

このような些細なテーブルの場合、どちらのアクセスパスが選択されたかは実際には問題ではありません。これは、最悪のパスがまだ2IOしかないためです。

誰かが上記でコメントしたように、特定の順序でデータが必要な場合は、「ORDER BY」句を使用してこれを具体的に要求する必要があります。そうしないと、返されるものがかなりランダムになります。

于 2011-08-04T06:23:10.123 に答える
3

通常、非クラスター化インデックスはクラスター化インデックスよりも小さいため、通常、クラスター化インデックスよりも非クラスター化インデックスをスキャンする方が高速です。あなたの場合、インデックスは同じサイズですが、おそらくSQL Serverが非クラスター化インデックスを好むことを説明しています。

返される行の順序を保証する唯一の方法は、ORDER BY を指定することです。ORDER BY を指定しない場合、行を返す順序を選択できることを暗黙的にオプティマイザに伝えます。

于 2011-08-04T06:31:23.733 に答える