0

SQL> desc emp_1;

Name     Type         Nullable Default Comments 
-------- ------------ -------- ------- -------- 
EMP_ID   NUMBER                                 
EMP_NAME VARCHAR2(20) Y                         
DEPTNO   NUMBER(10)   Y

SQL> 説明部門

Name      Type         Nullable Default Comments 
--------- ------------ -------- ------- -------- 
DEPT_ID   NUMBER       Y                         
DEPT_NAME VARCHAR2(20) Y 

SQL> CREATE INDEX abc_idex ON emp_1 (deptno);

Index created

select /*+ index(emp_1 abc_idex) */ emp_name from emp_1 INNER JOIN dept ON emp_1.deptno = dept.dept_id

Explain Plan :- 
SELECT STATEMENT, GOAL = ALL_ROWS           271 100000  800000
 MERGE JOIN         271 100000  800000
  TABLE ACCESS BY INDEX ROWID   EXAMINBI    EMP_1   267 100000  500000
   INDEX FULL SCAN  EXAMINBI    ABC_IDEX    131 100000  
  SORT JOIN         4   4   12
   TABLE ACCESS FULL    EXAMINBI    DEPT    3   4   12

select /*+ index(emp_1 abc_idex) */ emp_1 からの emp_name INNER JOIN dept ON emp_1.deptno = dept.dept_id and emp_1.emp_name=dept.dept_name

Explain Plan:- 
SELECT STATEMENT, GOAL = ALL_ROWS           272 1   11
 HASH JOIN          272 1   11
  TABLE ACCESS FULL EXAMINBI    DEPT    3   4   24
  TABLE ACCESS BY INDEX ROWID   EXAMINBI    EMP_1   267 100000  500000
   INDEX FULL SCAN  EXAMINBI    ABC_IDEX    131 100000  

あなたの助けを借りて、インデックスの概念をクリアしています。私の理解では、オラクルはインデックス化されていない他の列(emp_name)も必要とするため、インデックスヒントをスキップしますが、2番目のケースではemp_1テーブルがインデックスによってスキャンされました。私の質問は、インデックスが使用されていない結合に別の列を使用している場合(この例ではemp_name)に役立ちますか? そのような場合、インデックスヒントを使用する必要がありますか? *注:- これは emp_name であり、dept_name は論理結合ではないことはわかっていますが、テスト目的で同じものを作成しました。*

4

3 に答える 3

1

結合時に同じテーブルの非インデックス列を使用しているときにインデックスヒントを使用することが推奨されているかどうかを知りたいです。それは役に立ちますか?

ほとんどの状況で

通常の状況では、単にヒントを使用しません。ここでわかるように、ヒントを使用しました。Oracleはそれに従い、何か馬鹿げたことをしました。ヒントを使用するのは、非常に限られた状況でのみです。通常は、データの性質についてOracleがそれ自体で解決できないことを知っている場合にのみ使用します。一般的に、私が使用する唯一のヒントはカーディナリティのヒントです。Oracleはカーディナリティを正しく計算できない場合があるためです。

ヒントを定期的に使用する必要があると思い込まないでください。あなたはそうしない。ヒントが機能するようになったとしても、データの性質が変わると機能しなくなる可能性があります。

于 2012-11-28T10:59:06.297 に答える
0

など:

select /*+ cardinality(0)*/ emp_name 
from emp_1 
   INNER JOIN dept ON emp_1.deptno = dept.dept_id
于 2012-11-28T08:56:36.643 に答える
0

あなたの場合、インデックスを使用すると、おそらくステートメント全体の速度が低下します。これは、テーブルDEPTおよびEMP_1全体をクエリしているためです。ヒントのため、Oracleは完全なテーブルとインデックスの両方をクエリする必要があります。本当にこれが欲しいですか?

このような単純なケースでは、ヒントを使用しないことをお勧めします。オプティマイザーはその仕事を非常にうまくやっています。

特定の部門のステートメントを使用すると、結果はより良くなります

select emp_name
  from emp_1 INNER JOIN dept ON emp_1.deptno = dept.dept_id
  where dept.dname = 'any department'
于 2012-11-28T08:52:38.520 に答える