2016-11-22 11 views
0

私の研究では、プライマリキー(またはインデックス付きの他の列)を使って並べ替えます。クエリは明示的な並べ替えなしで実行する必要があります。ORDER BY [PRIMARY_KEY]は単純にインデックスを使用する必要がある場合はソート順を適用する必要がありますか?

また、この動作が異なるデータベースに表示されているブログもあります。そのうちの1つはOracleです。

しかし、私のテストでは、これは真実ではありませんでした - 理由は何でしょうか?インストールオプションが正しくありませんか?壊れたインデックス? (私は完全に新しいテーブルを作成することによって、これを除外が)

クエリ:

select * from auftrag_test order by auftragkey 

実行計画:

Plan Hash Value : 505195503 

----------------------------------------------------------------------------------- 
| Id | Operation   | Name   | Rows | Bytes | Cost | Time  | 
----------------------------------------------------------------------------------- 
| 0 | SELECT STATEMENT  |    | 167910 | 44496150 | 11494 | 00:00:01 | 
| 1 | SORT ORDER BY  |    | 167910 | 44496150 | 11494 | 00:00:01 | 
| 2 | TABLE ACCESS FULL | AUFTRAG_TEST | 167910 | 44496150 | 1908 | 00:00:01 | 
----------------------------------------------------------------------------------- 
create table AUFTRAG_TEST 
(
    auftragkey   VARCHAR2(40) not null, 
    ... 
); 
alter table AUFTRAG_TEST 
    add constraint PK_AUFTRAG_TEST primary key (AUFTRAGKEY); 

は、あなた自身を頼むかもしれない理由をプライマリキーはvarcharフィールドになります。さて、これは私たちの上司が決めたことです。

http://use-the-index-luke.com/sql/sorting-grouping/indexed-order-by

P.Sは:私は私が問題を見つけたと思う:

私が見つけたブログを(実際には、我々は文字列化されたGUIDに入れます)。この選択は、「順序で」はありません:

select * 
from auftrag_test 
where auftragkey = 'aabbccddeeffaabbccddeeffaabbccdd' 
order by auftragkey 

だから - 明らかに - それはない唯一の仕事、あなたがすべてで非常に有用ではないであろう「平等」とインデックス、に対してフィルタリングする場合。

P.P.S:MS-SQLは、私が期待したとおりのことをしているようです。私がプライマリキー(非クラスタ化一意のインデックスを持つ)によって注文した場合、その並べ替えは「無料」です。実行計画では、また、クエリ時間が賢明です。

+0

いくつかのコードを投稿してあなたの質問を明確にする計画を説明してください。また、検索した内容についての参考文献をいくつか挙げてください。 – Aleksej

+4

**すべて**の行と列を選択しています。適切なソート順を得るために、167910行のそれぞれについて索引ルックアップを行うオプティマイザの方が高価で、メモリ内のそれらの行をソートすることになります。オプティマイザはおそらくそれについて正しいでしょう。 –

+2

ソースのうち、2番目の選択は「順序付け」を使用する必要はありません。オプティマイザは、 'where'条件がちょうど1つの行を返すことができることを知っています。その結果をまったくソートする必要はありません –

答えて

0

インデックスを使用して大きなテーブルをスキャンするには、数時間かかることに注意してください。同じテーブルでフルテーブルスキャンを実行すると、ほんの数分かかります。
この場合、インデックスをトラバースすると、O(n * log(n))のソート操作を保存することができます。これは良い考えのようには聞こえません。


ヒープテーブルはソート操作を行います。
IOT(インデックスorginized Table、「クラスタ化インデックス」としても知られています)はすでにソートされています。


create table t_heap (i int primary key,j int); 
create table t_iot (i int primary key,j int) organization index; 

select * from t_heap order by i; 

enter image description here

select * from t_iot order by i; 

enter image description here

関連する問題