DBAの皆さんへの基本的な簡単な質問。
選択を行うとき、結果が主キーで並べ替えられることが常に保証されていますか、それとも「順序付け」で指定する必要がありますか?
DBとしてOracleを使用しています。
DBAの皆さんへの基本的な簡単な質問。
選択を行うとき、結果が主キーで並べ替えられることが常に保証されていますか、それとも「順序付け」で指定する必要がありますか?
DBとしてOracleを使用しています。
いいえ、「order by」を使用しない場合、注文は一切保証されません。実際、あるクエリから次のクエリへの順序が同じであるとは限りません。SQLはセットベースの方法でデータを処理していることを忘れないでください。さて、あるデータベースの実装または別の実装が特定の方法で順序付けを提供する可能性がありますが、決してそれに依存するべきではありません。
選択を行うとき、結果が主キーによって順序付けられることが常に保証されますか?それとも、'order by' で指定する必要がありますか?
いいえ、それは保証されていません。
SELECT *
FROM table
ほとんどのTABLE SCAN
場合、主キーをまったく使用しないものを使用します。
ヒントを使用できます。
SELECT /*+ INDEX(pk_index_name) */
*
FROM table
ですが、この場合でも順序は保証されません。 を使用するEnterprise Edition
と、クエリが並列化される可能性があります。
これは問題です。句のサブクエリでORDER BY
は使用できず、次のようなものを書くことはできません。SELECT
SELECT (
SELECT column
FROM table
WHERE rownum = 1
ORDER BY
other_column
)
FROM other_table
いいえ、ORDER BY を使用しない限り、順序は保証されません。
行がフェッチされる順序は、アクセス方法 (全表スキャン、索引スキャンなど)、表の物理属性、表内の各行の論理位置、およびその他の要因によって異なります。クエリを変更しなくても、これらはすべて変更される可能性があるため、結果セットで一貫した順序を保証するには、ORDER BY が必要です。
DBに依存し、インデックス付きフィールドにも依存します。
たとえば、私のテーブル Users では、すべてのユーザーに一意の varchar(20) フィールド - login と主キー - id があります。
また、「Select * from users」は、ログイン順の行セットを返します。
特定の順序付けが必要な場合は、ORDER BY を使用して明示的に宣言します。
テーブルに主キーがない場合はどうなりますか?
結果を特定の順序で並べたい場合は、常に順序を指定してください