프로그래밍 관행

다음 프로그래밍 연습을 사용합니다.

계측 패키지 사용

Oracle Database는 응용 프로그램이 필요할 때마다 추적 정보를 생성할 수 있는 서브 프로그램이 포함된 계측 패키지를 제공합니다. 이 추적 정보를 사용하면 디버거 없이 응용 프로그램을 디버깅하고 성능이 나쁜 코드를 식별할 수 있습니다.

계측은 응용 프로그램에 상당한 기능을 제공하므로 오버헤드가 아닙니다. 오버헤드는 많은 이익을 잃지 않고 제거 할 수있는 것입니다.

다음 계측 패키지는 Oracle Database에서 제공합니다.

참조: Oracle Database PL/SQL Packages and Types Reference에서 Oracle Database가 제공하는 PL/SQL 패키지 요약

통계 수집 및 응용 프로그램 추적

데이터베이스 통계는 데이터베이스의 로드 유형 및 데이터베이스에서 사용하는 내부 및 외부 리소스에 대한 정보를 제공합니다. ADDM을 사용하여 데이터베이스의 성능 문제를 정확하게 진단하려면 통계를 사용할 수 있어야 합니다.

통계 수집에 대한 자세한 내용은 Oracle Database 2 Day + Performance Tuning Guide를 참조하십시오.

주: Oracle Enterprise Manager를 사용할 수 없는 경우 Oracle Database PL/SQL Packages and Types Reference에 설명된 DBMS_MONITOR 서브 프로그램을 사용하여 통계를 수집할 수 있습니다.

Oracle Database는 Oracle Database 응용 프로그램을 모니터하고 분석하는 데 도움이 되는 몇 가지 추적 도구를 제공합니다. 자세한 내용은 Oracle Database SQL Tuning Guide를 참조하십시오.

기존 기능 사용

기존 기능을 사용하는 응용 프로그램은 개발 및 유지 관리가 용이하며 그렇지 않은 응용 프로그램보다 빠르게 실행됩니다.

응용 프로그램을 개발할 때는 프로그래밍 언어, 운영 체제, Oracle Database 및 Oracle Database에서 제공하는 PL/SQL 패키지와 유형의 기존 기능을 최대한 사용하십시오.

많은 개발자가 재설계하는 기존 기능의 예는 다음과 같습니다.

예 8-4에서 두 개의 동시 트랜잭션은 테이블에 저장된 메시지를 대기열에서 빼냅니다. 즉, 각 트랜잭션은 테이블의 다음 처리되지 않은 행을 찾아 잠급니다. 이 예제에서는 단순히 Oracle Database PL/SQL Packages and Types Reference에 설명된 DBMS_AQ.DEQUEUE 프로시저를 호출하는 대신 테이블에 함수 기반 인덱스를 생성한 다음 각 트랜잭션의 해당 함수를 사용하여 행을 검색하고 메시지를 표시합니다.

Example 8-4의 코드는 DBMS_AQ.DEQUEUE 호출과 유사하지만 기능이 적은 기능을 구현합니다. 기존 기능(이 경우 함수 기반 인덱스)을 사용하여 시간을 절약할 수 있습니다.

예제 8-4 동시 대기열에서 빼기 트랜잭션

테이블 생성:

DROP TABLE t;
CREATE TABLE t
  ( id             NUMBER PRIMARY KEY,
    processed_flag VARCHAR2(1),
    payload        VARCHAR2(20)
  );

테이블에 인덱스 생성:

CREATE INDEX t_idx ON
  t( DECODE( processed_flag, 'N', 'N' ) );

테이블 채우기:

INSERT INTO t
  SELECT r,
         CASE WHEN MOD(r,2) = 0 THEN 'N' ELSE 'Y' END,
         'payload ' || r
  FROM (SELECT LEVEL r FROM DUAL CONNECT BY LEVEL <= 5);

테이블 표시:

SELECT * FROM t;

결과:

ID P PAYLOAD
---------- - --------------------
         1 Y payload 1
         2 N payload 2
         3 Y payload 3
         4 N payload 4
         5 Y payload 5

5 rows selected.

첫번째 트랜잭션:

DECLARE
  l_rec t%ROWTYPE;
  CURSOR c IS
    SELECT *
    FROM t
    WHERE DECODE(processed_flag,'N','N') = 'N'
    FOR UPDATE
    SKIP LOCKED;
BEGIN
  OPEN c;

  FETCH c INTO l_rec;

  IF ( c%FOUND ) THEN
    DBMS_OUTPUT.PUT_LINE( 'Got row ' || l_rec.id || ', ' || l_rec.payload );
  END IF;

  CLOSE c;
END;
/

결과:

Got row 2, payload 2

동시작업 트랜잭션:

DECLARE
  PRAGMA AUTONOMOUS_TRANSACTION;
  l_rec t%ROWTYPE;
  CURSOR c IS
    SELECT *
    FROM t
    WHERE DECODE(processed_flag,'N','N') = 'N'
    FOR UPDATE
    SKIP LOCKED;
BEGIN
  OPEN c;

  FETCH c INTO l_rec;

  IF ( c%FOUND ) THEN
    DBMS_OUTPUT.PUT_LINE( 'Got row ' || l_rec.id || ', ' || l_rec.payload );
  END IF;

  CLOSE c;
  COMMIT;
END;
/

결과:

Got row 4, payload 4

참조:

뷰가 에디션화된 커버 데이터베이스 테이블

응용 프로그램에서 데이터베이스 테이블을 사용하는 경우 에디션 기반 재정의(EBR)를 사용하여 응용 프로그램의 데이터베이스 구성 요소를 사용 중인 동안 업그레이드할 수 있으므로 다운타임을 최소화하거나 없앨 수 있는 에디션 보기로 각 테이블을 다룹니다.

에디션 기반 재정의에 대한 자세한 내용은 Oracle Database Development Guide를 참조하십시오.