O comando PREPARE cria um comando preparado. Um comando preparado é um objeto no lado servidor que pode ser usado para otimizar o desempenho. Quando o comando PREPARE é executado, o comando especificado é analisado, reescrito e planejado. Após isso, quando o comando EXECUTE for submetido o comando preparado precisará apenas ser executado. Assim os estágios de análise, reescrita e planejamento são realizados apenas uma vez, e não todas as vezes que o comando é executado. [1] [2] [3]
Os comandos preparados podem receber parâmetros: valores que são substituídos no comando quando este é executado. Quando se cria o comando preparado, a referência aos parâmetros é feita pela sua posição, utilizando $1, $2, etc. Opcionalmente, pode ser especificada uma lista de tipos de dado dos parâmetros correspondente. Quando o tipo de dado do parâmetro não é especificado, ou é especificado como unknown, o tipo é inferido a partir do contexto onde o parâmetro é utilizado (se for possível). Ao executar o comando devem ser especificados os valores reais destes parâmetros no comando EXECUTE. Para obter informações adicionais deve ser consultado o comando EXECUTE.
Os comandos preparados somente continuam existindo enquanto a sessão de banco de dados corrente existir. Quando a sessão termina o comando preparado é esquecido e, portanto, deve ser recriado antes de poder ser usado novamente. Isto significa, também, que o mesmo comando preparado não pode ser usado simultaneamente por vários clientes do banco de dados; entretanto, cada cliente pode criar e usar o seu próprio comando preparado. O comando preparado pode ser liberado manualmente utilizando o comando DEALLOCATE.
A maior vantagem de desempenho dos comandos preparados acontece quando uma única sessão é usada para executar um grande número de comandos semelhantes. A diferença no desempenho é particularmente significativa quando os comandos possuem um planejamento ou reescrita complexos como, por exemplo, um comando envolvendo a junção de muitas tabelas, ou requerendo a aplicação de várias regras. Se o comando for relativamente simples de ser planejado e reescrito, e relativamente dispendioso para ser executado, fica mais difícil perceber a vantagem de desempenho dos comandos preparados.
Um nome arbitrário dado a este comando preparado. Deve ser único dentro da mesma sessão, sendo usado em seguida para executar ou liberar o comando preparado anteriormente.
O tipo de dado do parâmetro do comando preparado. Quando o tipo de dado de um determinado parâmetro não é especificado, ou é especificado com unknown, o tipo é inferido a partir do contexto onde o parâmetro é utilizado. Para fazer referência aos parâmetros no comando preparado são usados $1, $2, etc.
Um entre SELECT, INSERT, UPDATE, DELETE, ou or VALUES.
Em algumas situações o plano de comando produzido para o comando preparado será inferior ao plano de comando que teria sido escolhido se o comando fosse submetido e executado normalmente. Isto se deve ao fato de quando o comando é planejado, e o planejador tenta determinar o plano de comando ótimo, os valores verdadeiros dos parâmetros especificados no comando não estão disponíveis. O PostgreSQL coleta estatísticas sobre a distribuição dos dados na tabela, e pode usar valores constantes no comando para fazer suposições sobre o provável resultado da execução do comando. Como os dados reais não estão disponíveis ao planejar comandos preparados com parâmetros, o plano escolhido pode ser inferior ao ótimo. Para examinar o plano de comando escolhido pelo PostgreSQL para o comando preparado, deve ser utilizado o comando EXPLAIN.
Para obter informações adicionais sobre planejamento de comandos e estatísticas coletadas pelo PostgreSQL para esta finalidade, deve ser consultada a documentação do comando ANALYZE.
Podem ser vistos todos os comandos preparados disponíveis da sessão consultando a visão do sistema pg_prepared_statements.
Criar um comando preparado para o comando INSERT e, em seguida, executá-lo:
PREPARE fooplan (int, text, bool, numeric) AS INSERT INTO foo VALUES($1, $2, $3, $4); EXECUTE fooplan(1, 'Vale dos Caçadores', 't', 200.00);
Criar um comando preparado para o comando SELECT e, em seguida, executá-lo:
PREPARE usrrptplan (int) AS SELECT * FROM users u, logs l WHERE u.usrid=$1 AND u.usrid=l.usrid AND l.date = $2; EXECUTE usrrptplan(1, current_date);
Deve ser observado que o tipo de dado do segundo parâmetro não foi especificado e, portanto, será inferido a partir do contexto onde $2 for utilizado.
O padrão SQL inclui o comando PREPARE, mas apenas para utilização na linguagem SQL incorporada (embedded). Esta versão do comando PREPARE também utiliza uma sintaxe um pouco diferente.
[1] |
Oracle — O comando PREPARE (SQL incorporado executável) analisa um comando SQL ou um bloco PL/SQL especificado pela variável hospedeira e associa a um identificador. Pro*C/C++ Programmer's Guide Release 9.2 Part Number A97269-03 (N. do T.) |
[2] |
SQL Server 2000 — O comando PREPARE prepara um comando SQL a partir de uma cadeia de caracteres em uma variável hospedeira para execução posterior. Também associa o comando a um nome SQL simbólico. Embedded SQL for C and SQL Server — PREPARE (N. do T.) |
[3] |
DB2 — O comando PREPARE é utilizado por programas aplicativos para preparar dinamicamente comandos SQL para execução. O comando PREPARE criar um comando SQL executável, chamado de comando preparado, a partir da forma cadeia de caracteres do comando, chamada de cadeia do comando. Embora a cadeia do comando não possa incluir referências a variáveis hospedeiras, pode incluir marcadores de parâmetros. Os marcadores de parâmetros podem ser substituídos por valores de variáveis hospedeiras quando o comando preparado é executado. O marcador de parâmetro é um ponto de interrogação (?) utilizado onde uma variável hospedeira poderia ser utilizada se a cadeia do comando fosse um comando SQL estático. DB2 Version 9 for Linux, UNIX, and Windows (N. do T.) |