次の点が明確ではありません:
テーブルがA
あり、 column にインデックスを作成したとしますX
。
結果がソートされる列に基づいて選択すると、右ですか?
しかし、何らかの理由で select の後に select を実行した場合ORDER BY X
(たとえば、列にインデックスが付けられていることを知らなかった場合)、SQL サーバーは順次アクセスを実行する並べ替えを実行しますか、それともインデックスを使用しますか?
3 に答える
クエリでを指定しない場合ORDER BY
、いかなる種類の保証も決定論的順序もありません。SELECT
データは返されますが、順序が保証されるわけではありません(または、次にクエリを実行したときに同じ順序で返されるという保証はありません)。
したがって、注文が必要な場合は、で指定する必要があります。それはそれと同じくらい簡単です。ORDER BY
SELECT
そして、はい(インデックスが設定されていて、それが理にかなっている場合)、SQLServerクエリオプティマイザーは実際にそのインデックスを使用します。しかし、関係するifとbutはたくさんあります-インデックスを使用するかもしれないし、使用しないかもしれません-それは完全にオプティマイザーが決定します(そしてこれは多くの要因に依存します-ここにリストするには多すぎます)。
(これは、私がよく知っているSQL Serverに特に当てはまります-他のRDBMSがこの状況をどのように処理するかはわかりません)
SELECT に ORDER BY がないと、いかなる種類の決定論的順序付けもありません。
インデックス作成と並べ替えは、非常に複雑な話です。RDBMS 、RDBMS のバージョン、およびテーブル内のデータに依存します。
1 000 000 rows in table
comment table
i - int, unique number from sequence/auto_increment etc.
created - long, indexed
updated - long, indexed
title - varchar(50) - indexed
body - text
選択:
SELECT id FROM comments;
Oracle、MySQL、Postgresql は完全にランダムにレコードを返します。あなたは秩序の錯覚を持つことができます。ただし、いくつかの管理作業の後、真空、テーブルの分析、テーブルの最適化が行われます。すべてが変わることができます
SELECT * FROM comments ORDER BY created DESC;
Postgresql と Oracle は、完全なテーブル スキャンを実行します。
SELECT created FROM comments ORDER BY created;
Oracle はフル インデックス スキャン (インデックス データのみ) を実行しますが、Postgresql はフル テーブル スキャンを実行します。
SELECT * FROM comments WHERE created>sysday-7 ORDER BY created DESC;
Postgresql と Oracle はインデックス レンジ スキャンを実行し、テーブルからデータを読み取ります。
SELECT created FROM comments WHERE created>sysday-7 ORDER BY created;
Oracle はインデックス レンジ スキャン (テーブルからの読み取りなし) を実行しますが、Postgresql はインデックス レンジ スキャンを実行し、テーブルからデータを読み取ります。
RDMS がインデックスを使用するかどうかは、SQL クエリの述語、テーブルにある他のインデックス、およびオプティマイザがクエリの実行を選択する方法によって異なります。
したがって、SELECT A、X FROM T WHERE A = some_value ORDER BY X がある場合
A にインデックスがあり、RDMS は (MAY を強調) T のインデックスではなく、そのインデックスを介してデータにアクセスすることを選択できます。これは、SELECT の後にソートが続くことを意味します。
ほとんどのデータベースに関する質問と同様に、答えは「場合による」です。