Исходный запрос :
SELECT H.EMPNO, E.ENAME, H.HIST_TYPE, T.TYPE_DESC, COUNT(*) 
  FROM HISTORY_TYPE T, EMP E, EMP_HISTORY H
 WHERE H.EMPNO = E.EMPNO
   AND H.HIST_TYPE = T.HIST_TYPE
 GROUP BY H.EMPNO, E.ENAME, H.HIST_TYPE, T.TYPE_DESC; 

Этот запрос относительно тяжелый. Его можно ускорить , используя функции.

FUNCTION Lookup_Hist_Type (typ IN number) return varchar2 AS
tdesc varchar2(30);
CURSOR C1 IS
          SELECT TYPE_DESC 
            FROM HISTORY_TYPE
           WHERE HIST_TYPE = typ;
BEGIN
OPEN C1;
          FETCH C1 INTO tdesc;
          CLOSE C1;
          return (NVL(tdesc, ’?’));
END;
 
FUNCTION Lookup_Emp (emp IN number) return varchar2 AS
ename varchar2(30);
          CURSOR C1 IS
          SELECT ENAME
            FROM EMP
           WHERE EMPNO = emp;
BEGIN
OPEN C1;
          FETCH C1 INTO ename;
          CLOSE C1;
          return (NVL(ename, ’?’));
END;
 -- результирующий SQL
SELECT H.EMPNO,
       Lookup_Emp(H.EMPNO),
       H.HIST_TYPE,
       Lookup_Hist_Type(H.HIST_TYPE),
       COUNT(*) 
  FROM EMP_HISTORY H 
 GROUP BY H.EMPNO, H.HIST_TYPE;

Вариант интересный, хотя данный пример не совсем корректный , так как в конечном SQL нет ограничений со стороны таблиц, помещённых в функции.

Я сам пока его не проверил по эффективности.

Хостинг от uCoz