2

タイムスタンプ列と他のいくつかの char 列を含むテーブルがあります。テーブル内の情報をタイムスタンプで並べ替えましたが、同じタイムスタンプにさらに多くのレコードがあるため、表示された順序がテーブルに挿入された順序であるかどうかはわかりません。

悲しいことに、テーブルにはインデックスがないため、タイムスタンプを除いて、それらを並べ替えるために使用できるものは他にありません。

例:

      Timestamp            |    Foregin table    |    Foreign table value

2012-10-09 19:29:50.000    |       tableA        |   "random string here"
2012-10-09 19:29:50.000    |       tableA        |   "different string here"
2012-10-09 19:29:50.000    |       tableB        |   "another random string here"
2012-10-09 19:29:50.000    |       tableC        |   "string here"
2012-10-09 19:29:50.000    |       tableD        |   "another string here"

私が実行するクエリは次のようなものです。

SELECT *
FROM TABLE
WHERE Timestamp BETWEEN 'x' and 'y'
ORDER BY Timestamp

結果を確認すると、クエリが指定された列で並べ替えられたデータを返し、複数の列がある場合は次の列で結果の並べ替えを続けていると思いますが、よくわかりません。おそらくテキストの長さまたはアルファベット順で)。

注文を確認することは私にとって非常に重要なので、この状況を明確にするのを手伝っていただけませんか。

4

3 に答える 3

8

一般に、SQL Serverには、を指定しないクエリの順序は保証されませんORDER BY。したがって、aSELECT * FROM Tblは基本的に任意のランダムな順序で行を返すことができます。データがディスクに保存される方法のため、空のキャッシュがあり、サーバー上で他のアクティビティが実行されていない場合、かなり高い確率でディスク上の順序でデータを取得します。サーバー上に他の同時クエリがあり、キャッシュが空でない場合、その確率は劇的に低下します。したがって、テストで特定の動作を観察することはできますが、本番環境では同じ動作は得られません。

とはいえ、特定の順序で行を戻す必要がある場合は、適切なORDER BY句を指定する必要があります。上記の場合ORDER BY [Timestamp], [Foreign table], [Foreign table value]、レコードが常に同じ順序で返されるようにするために使用できます。クエリにさらに多くの列が含まれていて、どれも一意でない場合は、それらすべてを追加する必要がありORDER BYます。ただし、関係する列が多いほど、並べ替えのコストが高くなることに注意してください。

于 2013-01-30T14:17:02.333 に答える
1

SQL Serverは、明示的なORDER BY句を使用して結果を並べ替え、ORDER BY句内のすべての列が等しい結果の順序については保証しません。

ORDER BY次に、char列の1つでアルファベット順に並べ替える場合は、句でそれを指定する必要があります。現在の結果セットがこのようにソートされている場合がありますが、これが無期限に続く可能性はほとんどありません。

于 2013-01-30T14:17:05.973 に答える
1

データベース内のテーブルは、本質的に順不同です。この回答は、セバスチャンの回答を明確にしたものです (説明はコメントには長すぎます)。

返却順はランダムではありません。それは任意です。そして、それは呼び出しから呼び出しに変更できます。挿入だけでなく削除も行われるテーブルでは、後のレコードが以前のレコードのあるデータ ページに散在する可能性があります。繰り返しますが、データ テーブル内に順序付けの概念はありません。順序付けは、クエリ ステートメントの一部にすぎません。

システム上で実行されている他のクエリよりも大きな要因は、マルチスレッド (およびあまり存在しない複数のパーティション) です。

空のキャッシュ、インデックスを介してテーブルにアクセスしないクエリ、テーブルに削除がない、単一のパーティション、および単一のスレッド システムがある場合、通常、データは挿入順に返されます。ただし、この場合でも、保証はありません。特定の順序でデータが必要な場合は、 を使用しますorder by。パフォーマンス ヒットが望ましくない場合は、ID の主キーを含めて、それを順序付けに使用します。

于 2013-01-30T14:56:58.013 に答える