20

列 (A、B、C) にこの順序でインデックスを作成すると、(A)、または (A と B)、または ( A と B と C) ですが、(B)、(C)、または (B と C) のみを検索する場合は検索しません。これは正しいです?

4

3 に答える 3

14

述語が索引の先頭以外の列に配置されている場合に Oracle が使用できる、実際には 3 つの索引ベースのアクセス方法があります。

i) インデックススキップスキャン: http://download.oracle.com/docs/cd/B19306_01/server.102/b14211/optimops.htm#PFGRF10105

ii) 高速全索引スキャン: http://download.oracle.com/docs/cd/B19306_01/server.102/b14211/optimops.htm#i52044

iii) インデックスのフルスキャン: http://download.oracle.com/docs/cd/B19306_01/server.102/b14211/optimops.htm#i82107

私はほとんどの場合、高速な全インデックス スキャンを「実際に」見てきましたが、すべて可能です。

于 2008-09-15T20:25:04.670 に答える
9

それは正しくありません。データを表すテストケースを考え出し、自分の目で確かめることが常に最善です。Oracle SQL Optimizer を本当に理解したい場合は、Jonathan Lewis を参照してください。彼の本を読んだり、ブログを読んだり、Web サイトをチェックしたりしてください。彼は素晴らしく、常にテスト ケースを生成します。

create table mytab nologging as (
select mod(rownum, 3) x, rownum  y, mod(rownum, 3) z from all_objects, (select 'x' from user_tables where rownum < 4)
);

create index i on mytab (x, y, z);

exec dbms_stats.gather_table_stats(ownname=>'DBADMIN',tabname=>'MYTAB', cascade=>true);

set autot trace exp

select * from mytab where y=5000;

Execution Plan
----------------------------------------------------------
   0      SELECT STATEMENT Optimizer=CHOOSE (Cost=1 Card=1 Bytes=10)
   1    0   INDEX (SKIP SCAN) OF 'I' (INDEX) (Cost=1 Card=1 Bytes=10)
于 2008-09-12T15:47:58.950 に答える
5

バージョン Oracle 8 までは、最初の列が SQL に含まれていない限り、インデックスは使用されません。

Oracle 9i では、Skip Scan Index Access機能が導入されました。これにより、Oracle CBO はプレフィックス列が使用できない場合でもインデックスの使用を試みることができます。

スキップ スキャンがどのように機能するかについての概要: http://www.quest-pipelines.com/newsletter-v5/1004_C.htm

于 2008-09-15T12:46:25.367 に答える