Caching
 

キャッシング - SQLの最適化ルール


gbvy[W
キャッシュ小さなテーブルは、完全なテーブルスキャン
インデックスのテストの使用を最適化する
最適化された接続テスト
コストは可能な限り実施計画を減らすために
Where句で! "="インデックスを使用しません





フィールドの条件は、列の処理関数インデックスを高めるために使用されることはありませんどこ
TO_CHARは、(hire_date、'')='' yyyymmddのemp表から選択*(未使用)
emp表から選択*ここで、hire_date = to_char関数('','のはYYYYMMDD')(使用)




dept_codeがnullではないemp表から選択*(未使用)
emp表から選択*ここでdept_code> 0(使用)
使用ワイルドカード%
emp表から選択*ここで、名前のように'%A'は(インデックスを使用しないでください)
'%'のような名前は、(インデックスを使用して)、EMPから選択*


X WHERE sa*1.1>950
O WHERE sa>950/1.1
X WHERE SUBSTR(name,1,7)=’CAP’
O WHERE name LIKE ‘CAP%
2、データ型の値を、インデックス、同じ列の比較
例:
emp表:NUMBER型
O WHERE emp=123
X WHERE emp=’123’

ここでx = 123は、(この時点で、クエリは、インデックスカラムを使用しないでください)emp_char
O WHERE emp_char=’123’
3、NULLの使用を避ける
例:
X WHERE comm IS NOT NULL
X WHERE comm IS NULL
O WHERE comm>=0
4、複合インデックスは、SQLステートメントは、プライマリインデックスカラムを使用する必要があります。
例:総合指数(deptnoが、ジョブ)
O WHERE deptno=20 AND job=’MANAGER’
O WHERE deptno=20
O WHERE job=’MANAGER’ AND deptno=20
X WHERE job=’MANAGER’


Oの句は、列が空でない列である必要があります。
6に示すように、(どこ)一貫性のあるインデックスの列の順序をチェックアウトする
O SELECT empno,job FROM emp WHERE empno<100 AND job=’MANAGER’;
X SELECT empno,job FROM emp WHERE job=’MANAGER’ AND empno<100;
7に示すように、ネストされたクエリの使用を最小限に抑える
X SELECT * FROM emp WHERE empno IN (SELECT empno FROM OnWork);
O SELECT emp.* FROM emp t1,OnWork t2 WHERE t1.empno = t2.empno;

例:
X SELECT ab02.aab001,ab01.aab004
FROM ab02 ,ab01
WHERE ab02.aab001 = ab01.aab001
......
O SELECT t1.aab004,t2.aab001
FROM ab02 t1,ab01 t2
WHERE t1.aab001=t2.aab001
9、代わりのNOT INとNOT EXISTSを
例:
X SELECT * FROM ab01
WHERE aab001 NOT IN
(SELECT aab001 FROM ab02 WHERE aae140='3');
O SELECT * FROM ab01 t
WHERE NOT EXISTS
(SELECT 1 FROM ab02 WHERE aab001=t.aab001 AND aae140='3');
マルチテーブル10は、代わりにEXISTSの句を結合
例:
X SELECT * FROM ab01 t
WHERE EXISTS
(SELECT 1 FROM ab02 WHERE aab001=t.aab001 AND aae140=‘3’);
O SELECT t1.* FROM ab01 t1,ab02 t2
WHERE t1.aab001 = t2.aab001 AND t2.aae140=‘3’;

X SELECT DISTINCT ac01.aac016 aac016 FROM ac01,ac02
WHERE ac01.aac001=ac02.aac001
AND ac01.aab001 = '100659‘
AND NVL(ac01.aac016,'0') <> '107'
AND NVL(ac01.aac008,'0') = '1'
AND ac02.aae140 = '3' AND ac02.aac031 = '1';
O SELECT aac016 FROM ac01 t
WHERE aab001 = '100659'
AND NVL(aac016,'0') <> '107'
AND NVL(aac008,'0') = '1'
AND EXISTS (SELECT 1 FROM ac02 WHERE aac001=t.aac001
AND ac02.aae140 = '3' AND ac02.aac031 = '1');

のSELECTレコードは、UPDATE操作をDELETEにROWIDが大幅に効率を向上させる使用する必要がある、上の行を取得。
例:v_rowidからT1にrowidをセレクト
WHERE con1 FOR UPDATE OF col2;
……
……
UPDATE t1 SET col2=......
WHERE rowid=v_rowid;
13 WHEREフィルタ原則として、記録する必要がありますクエリのように上にフィルタ条件の最大数。

FROM taba a,tabb b,tabc c
WHERE a.acol between :alow and :ahigh
AND b.bcol between :blow and :bhigh
AND c.ccol between :clow and :chigh
AND a.key1 = b.key1
AND a.key2 = c.key2;
ここで、テーブルがように、テーブルbcolの列Bの後レコードの数、アウトクエリアコルを減らすために交流することができます。