В этой статье дается несколько советов по увеличению производительности PL/SQL кода. Для тестов будем использовать таблицу EMP из схемы SCOTT.
Итак, приступим:
Пример 1
SELECT ENAME FROM EMP WHERE EMPNO // ' ' // ENAME='7369 SMITH';
Elapsed: 00:00:00.03
SELECT ENAME FROM EMP WHERE EMPNO=7369 AND ENAME='SMITH';
Elapsed: 00:00:00.01
Вывод: Первый запрос выполнил полное сканирование таблицы в поисках соотвествия, второй использовал индекс по полю EMPNO.
Пример 2
SELECT ENAME FROM EMP WHERE COMM=0;
Elapsed: 00:00:00.01
SELECT ENAME FROM EMP WHERE COMM IS NULL;
Elapsed: 00:00:00.03
Вывод: Сравнение индексированных столбцов с NULL требует больше времени.
Пример 3
SELECT DISTINCT JOB, ENAME, EMPNO FROM EMP WHERE EMPNO=7566;
Elapsed: 00:00:00.03
SELECT JOB, ENAME, EMPNO FROM EMP WHERE EMPNO=7566;
Elapsed: 00:00:00.01
Вывод: Предложение DISTINCT должно использоваться только когда оно действительно необходимо.
Пример 4
SELECT DISTINCT D.DEPNO, D.DNAME
FROM DEPT D, EMP E
WHERE D.DEPTNO=E.DEPTNO;
Elapsed: 00:00:00.04
SELECT D.DEPNO, D.DNAME
FROM DEPT D
WHERE EXISTS (SELECT E.DEPTNO
FROM EMP E
WHERE D.DEPTNO=E.DEPTNO);
Elapsed: 00:00:00.01
Вывод: Вложенные запросы отрабатывают быстрее.
Пример 5
SELECT ENAME FROM EMP WHERE NOT EMPNO=0;
Elapsed: 00:00:00.04
SELECT ENAME FROM EMP WHERE EMPNO>0;
Elapsed: 00:00:00.03
Вывод:Оператор NOT на индексированном столбце снижает производительность. Замените оператор NOT другими операторами, которые помогут улучшить производительность.
Пример 6
SELECT * FROM EMP;
Elapsed: 00:00:00.03
select * from EMP;
Elapsed: 00:00:00.04
Вывод: Пишите предложения SQL в одном регистре, так затрачивается меньше времени на разбор.
Надеюсь эти нехитрые рекоммендации помогут сделать ваш код, хоть чуть-чуть но быстрее.