『ORACLE SQLに基づく最適化』読書ノート-特殊実行計画


AND-EQUAL(INDEX MERGE):複数の単列等値条件+各列にインデックスがあります.例ではデータ量が少ない.HINTを追加しないのは全表スキャンで、データ量が大きく、その2列の選択性が良い場合は、HINTを追加する必要はありません.
INDEX JOIN:単一テーブルの異なるインデックスに対する接続.(インデックスが結合されていない場合)代わりに全テーブルスキャンを行い、元のテーブルデータにNULL値を持つことはできません.属性NOTNULLが列挙されています.
VIEW:ビューのマージができるかどうかで2種類に分けられます.マージを行わないと実行計画にVIEWと表示されます.
FILTER(実行計画):改良されたネストされたループ接続であり、駆動結果セットに記録された回数だけ被駆動テーブルにアクセスするわけではありません.
SORT:
1.SORT AGGREGATEが必ずしもソートされるとは限りません.
2.SORT UNIQUE:並べ替えたり重くしたりします.
3.SORT JOIN:SORT MERGE JOINの第一歩
4.SORT ORDER BY:ORDER BYのみ
5.SORT GROUP BY:ソートプラスグループ
6.BUFFER SORT:ORACLEはPGAを借りてスキャン結果LOADを入れ、SGAにキャッシュされる様々なオーバーヘッドを節約します.統計情報の中のSORT(MEMEORY)、SORT(DISK)は正確ではなく、実際の実行計画のCOLUMNPROJECTION INFORMATIONの中のKEYS値を見て判断し、0より大きいとソートがあることを示す.ソートされた列に続いています.
UNION/UNION-ALL:UNIONはUNIOALLをしてからSORTUNIQUEをします.
CONNECT BY:階層検索キーワード
例:
 
create index IDX_EMP_MGR on emp(mgr);
create index idx_deptno on emp(deptno);
select/*+ and_equal(emp IDX_EMP_MGR idx_deptno)*/ empno,jobfrom emp where mgr =7092 and deptno =20;
---- VIEW
create view emp_mgr_view as select * from emp where job ='MANAGER';
select empno,sal from emp_mgr_view where ename ='JONES';
create or replace view emp_mgr_view as select * from empwhere job = 'MANAGER' and rownum<10;
select empno,sal from emp_mgr_view where ename ='JONES';
----- FILTER
select * from t21;
select * from t22;
insert into t21 values(4,'C');
commit;
select/*+gather_plan_statistics */ * from t21 where col2 in(select /*+ no_unnest*/ col2 from t22);
select * fromtable(dbms_xplan.display_cursor(null,null,'IOSTATS COST'));
 
------ SORT
select sum(sal) from emp where job ='MANAGER';-- SORTAGGREGATE
select distinct ename from emp where job ='MANAGER' order byename;-- SORT UNIQUE
select /*+ use_merge(t1 t2)*/ t1.empno ,t1.ename,t2.sal fromemp t1,emp t2 where t1.empno =t2.empno; --SORT JOIN
select ename from emp where job ='MANAGER' order by ename;--SORT ORDER BY
select ename from emp where job ='MANAGER' group by enameorder by ename; --SORT GROUP BY
select t1.empno,t2.ename from  emp t1,emp t2;-- BUFFER SORT
 
 
select * from emp order by ename;
select sql_text,sql_id ,child_number from v$sql wheresql_text = 'select * from emp order by ename';
select * fromtable(dbms_xplan.display_cursor('aa4x3rfrugzxd',0,'advanced'));
 
 
alter session set events '10032 trace name context forever'
select * from emp order by ename;
@tracefile
 
---- UNION/UNION ALL
select empno,ename from emp union all select empno,enamefrom emp;--UNION ALL
select empno,ename from emp union  select empno,ename from emp;--UNION