Práticas de Programação

Use as práticas de programação a seguir.

Usar Pacotes de Instrumentação

O Oracle Database fornece pacotes de instrumentação cujos subprogramas permitem que seu aplicativo gere informações de rastreamento sempre que necessário. Usando essas informações de rastreamento, você pode depurar seu aplicativo sem um depurador e identificar o código que tem um desempenho ruim.

A instrumentação fornece ao seu aplicativo uma funcionalidade considerável; portanto, não é uma sobrecarga. Overhead é algo que você pode remover sem perder muito benefício.

Os seguintes pacotes de instrumentação são fornecidos pelo Oracle Database:

Consulte Também: Oracle Database PL/SQL Packages and Types Reference para obter um resumo dos pacotes de PL/SQL que o Oracle Database fornece

Coleta de Estatísticas e Rastreamento de Aplicativos

As estatísticas de banco de dados fornecem informações sobre o tipo de carga no banco de dados e os recursos internos e externos usados pelo banco de dados. Para diagnosticar com precisão problemas de desempenho no banco de dados usando o ADDM, estatísticas devem estar disponíveis.

Para obter informações sobre a coleta de estatísticas, consulte Oracle Database 2 Day + Performance Tuning Guide.

Observação: Se o Oracle Enterprise Manager estiver indisponível, você poderá coletar estatísticas usando subprogramas DBMS_MONITOR, descritos em Referência de Tipos e Pacotes PL/SQL do Oracle Database.

O Oracle Database fornece várias ferramentas de rastreamento que podem ajudá-lo a monitorar e analisar aplicativos do Oracle Database. Para obter detalhes, consulte Guia de Ajuste SQL do Oracle Database.

Usar Funcionalidade Existente

Um aplicativo que usa a funcionalidade existente é mais fácil de desenvolver e manter do que um que não o faz, e também é executado mais rapidamente.

Ao desenvolver seu aplicativo, use a funcionalidade existente de sua linguagem de programação, seu sistema operacional, o Oracle Database e os pacotes e tipos PL/SQL que o Oracle Database fornece o máximo possível.

Exemplos de funcionalidades existentes que muitos desenvolvedores reinventam incluem as seguintes funções:

No Exemplo 8-4, duas transações simultâneas desenfileiram mensagens armazenadas em uma tabela (ou seja, cada transação localiza e bloqueia a próxima linha não processada da tabela). Em vez de simplesmente chamar o procedimento DBMS_AQ.DEQUEUE (descrito na Referência de Tipos e Pacotes PL/SQL do Oracle Database), o exemplo cria um índice baseado em função na tabela e, em seguida, usa essa função em cada transação para recuperar as linhas e exibir as mensagens.

O código no Exemplo 8-4 implementa um recurso semelhante a uma chamada DBMS_AQ.DEQUEUE, mas com menos recursos. O tempo de desenvolvimento economizado usando a funcionalidade existente (neste caso, índices baseados em funções) pode ser grande.

Exemplo 8-4 Transações de Desenfileiramento Simultâneo

Criar tabela:

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

Criar índice na tabela:

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

Preencher tabela:

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);

Mostrar tabela:

SELECT * FROM t;

Resultado:

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.

Primeira transação:

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;
/

Resultado:

Got row 2, payload 2

Transação concorrente:

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;
/

Resultado:

Got row 4, payload 4

Consulte também:

Cobrir Tabelas do Banco de Dados com Views de Edição

Se o seu aplicativo usar tabelas de banco de dados, cubra cada uma com uma view de edição para que você possa usar a redefinição baseada em edição (EBR) para fazer upgrade do componente de banco de dados do seu aplicativo enquanto ele estiver em uso, minimizando ou eliminando assim o tempo de inatividade.

Para obter informações sobre redefinição baseada em edição, consulte o Oracle Database Development Guide.