SQL

Este capítulo fornece uma visão geral da Linguagem de Consulta Estruturada (SQL) e como o Oracle AI Database processa instruções SQL.

Introdução ao SQL

SQL (pronunciado como sequel) é a linguagem de computador declarativa de alto nível baseada em conjuntos com a qual todos os programas e usuários acessam dados em um banco de dados Oracle.

Embora algumas ferramentas e aplicações Oracle mascaram o uso de SQL, todas as tarefas de banco de dados são executadas com SQL. Qualquer outro método de acesso a dados contorna a segurança incorporada ao Oracle AI Database e pode comprometer a segurança e a integridade dos dados.

O SQL fornece uma interface com um banco de dados relacional, como o Oracle AI Database. O SQL unifica tarefas como as seguintes em uma linguagem consistente:

A linguagem SQL pode ser usada interativamente, o que significa que as instruções são inseridas manualmente em um programa. As instruções SQL também podem ser incorporadas em um programa escrito em uma linguagem diferente, como C ou Java.

Consulte Também:

Acesso a Dados SQL

Há duas famílias amplas de linguagens de computador: as linguagens declarativas que não são processuais e descrevem o que deve ser feito, e as linguagens processuais como C++ e Java que descrevem como as coisas devem ser feitas.

O SQL é declarativo no sentido de que os usuários especificam o resultado que desejam, não como derivá-lo. Por exemplo, a instrução a seguir consulta registros de funcionários cujo sobrenome começa com K:

O banco de dados executa o trabalho de gerar um procedimento para navegar nos dados e recuperar os resultados solicitados. A natureza declarativa do SQL permite trabalhar com dados no nível lógico. Você só precisa se preocupar com detalhes de implementação quando manipular os dados.

SELECT   last_name, first_name
FROM     hr.employees
WHERE    last_name LIKE 'K%'
ORDER BY last_name, first_name;

O banco de dados recupera todas as linhas que satisfazem à condição WHERE, também chamada de predicado, em uma única etapa. O banco de dados pode passar essas linhas como uma unidade para o usuário, para outra instrução SQL ou para um aplicativo. O aplicativo não precisa processar as linhas uma a uma, nem o desenvolvedor precisa saber como as linhas são armazenadas ou recuperadas fisicamente.

Todas as instruções SQL utilizam o otimizador, um componente do banco de dados que determina o meio mais eficiente de acessar os dados solicitados. O Oracle Database também suporta técnicas que você pode usar para fazer com que o otimizador execute melhor seu trabalho.

Consulte Também: Referência de Linguagem SQL do Oracle AI Database para obter informações detalhadas sobre instruções SQL e outras partes do SQL (como operadores, funções e modelos de formato)

Padrões SQL

A Oracle se esforça para seguir padrões aceitos pelo setor e participa ativamente de comitês de padrões SQL.

Os comitês aceitos pela indústria são o American National Standards Institute (ANSI) e a International Organization for Standardization (ISO). Tanto o ANSI quanto o ISO/IEC aceitaram o SQL como a linguagem padrão para bancos de dados relacionais.

O padrão SQL consiste em dez partes. Uma parte (SQL/RPR:2012) é nova em 2012. Outras cinco partes foram revisadas em 2011. Para as outras quatro partes, a versão de 2008 permanece no lugar. O Oracle SQL inclui muitas extensões para a linguagem SQL padrão ANSI/ISO, e as ferramentas e aplicações do Oracle AI Database fornecem instruções adicionais. As ferramentas SQL*Plus, SQL Developer e Oracle Enterprise Manager permitem executar qualquer instrução SQL padrão ANSI/ISO em um banco de dados Oracle e quaisquer instruções ou funções adicionais disponíveis para essas ferramentas.

Consulte Também:

Visão Geral de Instruções SQL

Todas as operações executadas nas informações em um banco de dados Oracle são executadas usando instruções SQL. Instrução SQL é um programa de computador ou instrução que consiste em identificadores, parâmetros, variáveis, nomes, tipos de dados e palavras reservadas SQL. Observação: as palavras reservadas SQL têm significado especial no SQL e não devem ser usadas para nenhuma outra finalidade. Por exemplo, SELECT e UPDATE são palavras reservadas e não devem ser usadas como nomes de tabela.

Uma instrução SQL deve ser o equivalente a uma sentença SQL completa, como:

SELECT last_name, department_id FROM employees

O Oracle AI Database só executa instruções SQL completas. Um fragmento como o seguinte gera um erro indicando que mais texto é necessário:

SELECT last_name;

As instruções Oracle SQL são divididas nas seguintes categorias:

Instruções DDL (Data Definition Language - Linguagem de Definição de Dados)

As instruções DDLL (Data Definition Language) definem, alteram estruturalmente e eliminam objetos de esquema.

A DDL permite que você altere atributos de um objeto sem alterar os aplicativos que acessam o objeto. Por exemplo, é possível adicionar uma coluna a uma tabela acessada por um aplicativo de recursos humanos sem reescrever o aplicativo. Você também pode usar DDL para alterar a estrutura dos objetos enquanto os usuários do banco de dados estão executando o trabalho no banco de dados.

Mais especificamente, as instruções DDL permitem que você:

Exemplo 10-1 Instruções DDL

O exemplo a seguir usa instruções DDL para criar a tabela plants e, em seguida, usa DML para inserir duas linhas na tabela. Em seguida, o exemplo usa DDL para alterar a estrutura da tabela, conceder e revogar privilégios de leitura nesta tabela para um usuário e, em seguida, eliminar a tabela.

CREATE TABLE plants
    ( plant_id    NUMBER PRIMARY KEY,
      common_name VARCHAR2(15) );

INSERT INTO plants VALUES (1, 'African Violet'); # DML statement

INSERT INTO plants VALUES (2, 'Amaryllis'); # DML statement

ALTER TABLE plants ADD
    ( latin_name VARCHAR2(40) );

GRANT READ ON plants TO scott;

REVOKE READ ON plants FROM scott;

DROP TABLE plants;

Um COMMIT implícito ocorre imediatamente antes de o banco de dados executar uma instrução DDL e um COMMIT ou ROLLBACK ocorre imediatamente depois. No exemplo anterior, duas instruções INSERT são seguidas por uma instrução ALTER TABLE; portanto, o banco de dados faz commit das duas instruções INSERT. Se a instrução ALTER TABLE for bem-sucedida, o banco de dados aplicará essa instrução; caso contrário, o banco de dados fará rollback dessa instrução. Em ambos os casos, as duas instruções INSERT já foram submetidas a commit.

Consulte Também:

Instruções DML (Data Manipulation Language - Linguagem de Manipulação de Dados)

As instruções de linguagem de manipulação de dados (DML) consultam ou manipulam dados em objetos de esquema existentes.

Considerando que as instruções DDL alteram a estrutura do banco de dados, as instruções DML consultam ou alteram o conteúdo. Por exemplo, ALTER TABLE altera a estrutura de uma tabela, enquanto INSERT adiciona uma ou mais linhas à tabela.

As instruções DML são as instruções SQL mais usadas e permitem:

O exemplo a seguir usa DML para consultar a tabela employees. O exemplo usa DML para inserir uma linha em employees, atualizar essa linha e depois excluí-la:

SELECT * FROM employees;

INSERT INTO employees (employee_id, last_name, email, job_id, hire_date, salary)
  VALUES (1234, 'Mascis', 'JMASCIS', 'IT_PROG', '14-FEB-2008', 9000);

UPDATE employees SET salary=9100 WHERE employee_id=1234;

DELETE FROM employees WHERE employee_id=1234;

Uma coleção de instruções DML que forma uma unidade de trabalho lógica é chamada de transação. Por exemplo, uma transação para transferir dinheiro poderia envolver três operações discretas: diminuir o saldo da conta poupança, aumentar o saldo da conta corrente e registrar a transferência em uma tabela de histórico da conta. Ao contrário das instruções DDL, a instrução DML não faz commit implicitamente da transação atual.

Consulte Também:

Instruções SELECT

Consulta é uma operação que recupera dados de uma tabela ou view.

SELECT é a única instrução SQL que você pode usar para consultar dados. O conjunto de dados recuperados da execução de uma instrução SELECT é conhecido como conjunto de resultados.

A tabela a seguir mostra uma palavra-chave obrigatória e três palavras-chave que são comumente encontradas em uma instrução SELECT. A tabela também associa recursos de uma instrução SELECT às palavras-chave.

Palavras-chave da Tabela 1 em uma instrução SQL

Palavra-chave Obrigatório? Descrição Capacidade
SELECT Sim

especifica quais colunas devem ser mostradas no resultado. A projeção produz um subconjunto das colunas na tabela.

Uma expressão é uma combinação de um ou mais valores, operadores e funções SQL que são resolvidos para um valor. A lista de expressões que aparece depois da palavra-chave SELECT e antes da cláusula FROM é chamada de lista de seleção.

Projeção
FROM Não Especifica as tabelas ou views das quais os dados devem ser recuperados. Entrando
WHERE Não Especifica uma condição para filtrar linhas, produzindo um subconjunto das linhas na tabela. Uma condição especifica uma combinação de um ou mais operadores lógicos (Boolianos) e retorna um valor de TRUE, FALSE ou UNKNOWN. Seleção
ORDER BY Não Especifica a ordem na qual as linhas devem ser mostradas.  

Consulte Também: Referência de Linguagem SQL do Oracle AI Database para sintaxe e semântica do SELECT

Junções

Uma junção é uma consulta que combina linhas de duas ou mais tabelas, views ou views materializadas.

O exemplo a seguir une as tabelas employees e departments (cláusula FROM), seleciona somente linhas que atendem aos critérios especificados (cláusula WHERE) e usa projeção para recuperar dados de duas colunas (SELECT). O exemplo de saída segue a instrução SQL.

SELECT email, department_name
FROM   employees
JOIN   departments
ON     employees.department_id = departments.department_id
WHERE  employee_id IN (100,103)
ORDER BY email;

EMAIL                     DEPARTMENT_NAME
------------------------- ------------------------------
AHUNOLD                   IT
SKING                     Executive

O gráfico a seguir representa as operações de projeção e seleção na junção mostrada na consulta anterior.

Figura 1: Projeção e Seleção

Descrição da ilustração cncpt290.gif

A maioria das junções tem pelo menos uma condição de junção, na cláusula FROM ou na cláusula WHERE, que compara duas colunas, cada uma de uma tabela diferente. O banco de dados combina pares de linhas, cada uma contendo uma linha de cada tabela, para a qual a condição de junção é avaliada como TRUE. O otimizador determina a ordem na qual o banco de dados une tabelas com base nas condições de junção, índices e quaisquer estatísticas disponíveis para as tabelas.

Os tipos de junção incluem o seguinte:

Consulte Também:

Subconsultas

Uma subconsulta é uma instrução SELECT aninhada em outra instrução SQL. As subconsultas são úteis quando você deve executar várias consultas para resolver um único problema.

Cada parte de consulta de uma instrução é chamada de bloco de consultas. Na consulta a seguir, a subconsulta entre parênteses é o bloco de consultas internas:

SELECT first_name, last_name
FROM   employees
WHERE  department_id
IN     ( SELECT department_id
         FROM departments
         WHERE location_id = 1800 );

A instrução SELECT interna recupera os IDs de departamentos com o ID de local 1800. Esses IDs de departamento são necessários ao bloco de consulta externa, que recupera os nomes dos funcionários nos departamentos cujos IDs foram fornecidos pela subconsulta.

A estrutura da instrução SQL não força o banco de dados a executar a consulta interna primeiro. Por exemplo, o banco de dados pode reescrever a consulta inteira como uma junção de employees e departments, para que a subconsulta nunca seja executada sozinha. Como outro exemplo, o recurso VPD (Virtual Private Database) pode restringir a consulta de funcionários usando uma cláusula WHERE, de modo que o banco de dados consulte os funcionários primeiro e, em seguida, obtenha os IDs de departamento. O otimizador determina a melhor sequência de etapas para recuperar as linhas solicitadas.

Consulte Também: Guia de Segurança do Oracle AI Database para saber mais sobre o VPD

Instruções de Controle de Transações

As instruções de controle de transação gerenciam as alterações feitas pelas instruções DML e agrupam as instruções DML em transações.

Essas instruções permitem:

O exemplo a seguir inicia uma transação chamada Update salaries. O exemplo cria um ponto de salvamento, atualiza o salário de um funcionário e faz rollback da transação para o ponto de salvamento. O exemplo atualiza o salário para um valor e confirma diferente.

SET TRANSACTION NAME 'Update salaries';

SAVEPOINT before_salary_update;

UPDATE employees SET salary=9100 WHERE employee_id=1234 # DML

ROLLBACK TO SAVEPOINT before_salary_update;

UPDATE employees SET salary=9200 WHERE employee_id=1234 # DML

COMMIT COMMENT 'Updated salaries';

Consulte Também:

Instruções de Controle de Sessão

As instruções de controle de sessão gerenciam dinamicamente as propriedades de uma sessão do usuário.

Uma sessão é uma entidade lógica na memória da instância do banco de dados que representa o estado de um login de usuário atual em um banco de dados. A sessão dura a partir do momento em que o usuário é autenticado pelo banco de dados até que o usuário desconecte ou saia do aplicativo de banco de dados.

As instruções de controle de sessão permitem:

A seguinte instrução altera dinamicamente o formato de data padrão da sua sessão para 'YYYY MM DD-HH24:MI:SS':

ALTER SESSION
   SET NLS_DATE_FORMAT = 'YYYY MM DD HH24:MI:SS';

As instruções de controle de sessão não fazem commit implicitamente da transação atual.

Consulte Também:

Instrução de Controle do Sistema

Uma instrução de controle do sistema altera as propriedades da instância do banco de dados.

A única instrução de controle do sistema é ALTER SYSTEM. Ele permite alterar definições como o número mínimo de servidores compartilhados, encerrar uma sessão e executar outras tarefas no nível do sistema.

Exemplos de instrução de controle do sistema incluem:

ALTER SYSTEM SWITCH LOGFILE;

ALTER SYSTEM KILL SESSION '39, 23';

A instrução ALTER SYSTEM não confirma implicitamente a transação atual.

Consulte Também: Referência de Linguagem SQL do Oracle AI Database para sintaxe e semântica do ALTER SYSTEM

Instruções SQL Incorporadas

As instruções SQL incorporadas incorporadas incorporam instruções DDL, DML e controle de transação em um programa de linguagem de procedimento.

Instruções incorporadas são usadas com os pré-compiladores Oracle. O SQL incorporado é uma abordagem para incorporar SQL em seus aplicativos de linguagem de procedimento. Outra abordagem é usar uma API procedural, como Open Database Connectivity (ODBC) ou Java Database Connectivity (JDBC).

As instruções SQL incorporadas permitem:

Consulte Também:

Visão Geral do Otimizador

Para entender como o Oracle AI Database processa instruções SQL, é necessário entender a parte do banco de dados chamada optimizer (também conhecido como otimizador de consulta ou otimizador baseado em custo). Todas as instruções SQL usam o otimizador para determinar o meio mais eficiente de acessar os dados especificados.

Uso do Otimizador

O otimizador gera planos de execução descrevendo possíveis métodos de execução.

O otimizador determina qual plano de execução é mais eficiente considerando várias fontes de informação. Por exemplo, o otimizador considera condições de consulta, caminhos de acesso disponíveis, estatísticas reunidas para o sistema e dicas.

Para executar uma instrução DML, talvez o Oracle AI Database precise executar muitas etapas. Cada etapa recupera linhas de dados fisicamente do banco de Dados ou prepara-as para o usuário que está emitindo a declaração. As etapas que o banco de dados usa para executar uma instrução afetam muito a rapidez com que ela é executada. Muitas vezes, são possíveis várias maneiras diferentes de processar uma instrução DML. Por exemplo, a ordem em que as tabelas ou os índices são acessados pode variar.

Ao determinar o melhor plano de execução para uma instrução SQL, o otimizador executa as seguintes operações:

O otimizador gera a maioria das formas possíveis de processar uma consulta e atribui um custo a cada etapa do plano de execução gerado. O plano com o menor custo é escolhido como o plano de consulta a ser executado.

Observação: você pode obter um plano de execução para uma instrução SQL sem executar o plano. Apenas um plano de execução que o banco de dados realmente usa para executar uma consulta é corretamente denominado plano de consulta.

Você pode influenciar as escolhas do otimizador definindo a meta do otimizador e reunindo estatísticas representativas para o otimizador. Por exemplo, você pode definir a meta do otimizador como uma das seguintes opções:

Um aplicativo interativo típico de usuário final se beneficiaria da otimização do tempo de resposta inicial, enquanto um aplicativo não interativo em modo de lote se beneficiaria da otimização total do throughput.

Consulte Também:

Componentes do Otimizador

O otimizador contém três componentes principais: o transformador, o estimador e o gerador de planos.

O diagrama a seguir descreve os componentes:

Figura 2: Componentes do Otimizador

Descrição da ilustração cncpt287.gif

A entrada para o otimizador é uma consulta analisada. O otimizador executa as seguintes operações:

  1. O otimizador recebe a consulta analisada e gera um conjunto de planos potenciais para a instrução SQL com base nos caminhos e dicas de acesso disponíveis.

  2. O otimizador estima o custo de cada plano com base nas estatísticas do dicionário de dados. O custo é um valor estimado proporcional ao uso esperado do recurso necessário para executar a instrução com um plano específico.

  3. O otimizador compara os custos dos planos e escolhe o plano de menor custo, conhecido como plano de consulta, para passar para o gerador de fonte de linha.

Consulte Também:

Transformador de Consulta

O transformador de consulta determina se é útil alterar a forma da consulta para que o otimizador possa gerar um plano de execução melhor. A entrada para o transformador de consulta é uma consulta analisada, que o otimizador representa como um conjunto de blocos de consulta.

Consulte Também: Regravação de Consulta

Estimador

O estimador determina o custo geral de um determinado plano de execução.

O estimador gera três tipos diferentes de medidas para atingir esse objetivo:

Se as estatísticas estiverem disponíveis, o estimador as usará para calcular as medidas. As estatísticas melhoram o grau de precisão das medidas.

Gerador de Planos

O gerador de planos tenta diferentes planos para uma consulta enviada. O otimizador escolhe o plano com o menor custo.

Para cada subconsulta aninhada e view não mesclada, o otimizador gera um subplano. O otimizador representa cada subplano como um bloco de consulta separado. O gerador de planos explora vários planos para um bloco de consultas testando diferentes caminhos de acesso, métodos de junção e ordens de junção.

O recurso de otimização de consulta adaptável altera planos com base nas estatísticas coletadas durante a execução do demonstrativo. Todos os mecanismos adaptativos podem executar um plano final para uma instrução que difere do plano padrão. A otimização adaptativa usa planos dinâmicos, que escolhem entre subplanos durante a execução da instrução, ou a reotimização, que altera um plano em execuções após a execução atual.

Consulte Também:

Caminhos de Acesso

Caminho de acesso é a técnica que uma consulta usa para recuperar linhas.

Por exemplo, uma consulta que usa um índice tem um caminho de acesso diferente de uma consulta que não usa. Em geral, os caminhos de acesso ao índice são melhores para instruções que recuperam um pequeno subconjunto de linhas da tabela. Varreduras completas são mais eficientes para acessar uma grande parte de uma tabela.

O banco de dados pode usar vários caminhos de acesso diferentes para recuperar dados de uma tabela. Veja a seguir uma lista de representantes:

O otimizador escolhe um caminho de acesso com base nos caminhos de acesso disponíveis para o demonstrativo e no custo estimado de usar cada caminho de acesso ou combinação de caminhos.

Consulte Também: Oracle AI Database Get Started with Performance Tuning e Oracle AI Database SQL Tuning Guide para conhecer os caminhos de acesso

Estatísticas do Otimizador

As estatísticas do otimizador são um conjunto de dados que descrevem detalhes sobre o banco de dados e os objetos no banco de dados. As estatísticas fornecem uma imagem estatisticamente correta do armazenamento e da distribuição de dados utilizável pelo otimizador ao avaliar caminhos de acesso.

As estatísticas do otimizador incluem as seguintes:

O Oracle AI Database reúne estatísticas do otimizador em todos os objetos de banco de dados automaticamente e mantém essas estatísticas como uma tarefa de manutenção automatizada. Você também pode reunir estatísticas manualmente usando o pacote DBMS_STATS. Esse pacote PL/SQL pode modificar, exibir, exportar, importar e excluir estatísticas. Observação: As estatísticas do otimizador são criadas para fins de otimização de consulta e armazenadas no dicionário de dados. Não confunda essas estatísticas com estatísticas de desempenho visíveis por meio de views de desempenho dinâmicas.

O Optimizer Statistics Advisor é um software de diagnóstico integrado que analisa como você está coletando estatísticas no momento, a eficácia dos jobs de coleta de estatísticas existentes e a qualidade das estatísticas coletadas. O Optimizer Statistics Advisor mantém regras, que incorporam as melhores práticas da Oracle com base no conjunto de recursos atual. Dessa forma, o consultor sempre fornece as recomendações mais atualizadas para a coleta de estatísticas.

Consulte Também:

Dicas do Otimizador

Dica é um comentário em uma instrução SQL que atua como uma instrução para o otimizador.

Às vezes, o designer de aplicativos, que tem mais informações sobre os dados de um aplicativo específico do que o disponível para o otimizador, pode escolher uma maneira mais eficaz de executar uma instrução SQL. O designer de aplicativos pode usar dicas em instruções SQL para especificar como a instrução deve ser executada. Os exemplos abaixo ilustram o uso de dicas.

Exemplo 10-2 Plano de Execução para SELECT com Dica FIRST_ROWS

Suponha que seu aplicativo interativo execute uma consulta que retorne 50 linhas. Este aplicativo inicialmente busca apenas as 25 primeiras linhas da consulta a serem apresentadas ao usuário final. Você deseja que o otimizador gere um plano que obtenha os primeiros 25 registros o mais rápido possível para que o usuário não seja forçado a esperar. Você pode usar uma dica para passar essa instrução para o otimizador, conforme mostrado na instrução SELECT e na saída AUTOTRACE no seguinte exemplo:

SELECT /*+ FIRST_ROWS(25) */ employee_id, department_id
FROM   hr.employees
WHERE  department_id > 50;

------------------------------------------------------------------------
| Id | Operation                    | Name              | Rows | Bytes
------------------------------------------------------------------------
|  0 | SELECT STATEMENT             |                   | 26   | 182
|  1 |  TABLE ACCESS BY INDEX ROWID | EMPLOYEES         | 26   | 182
|* 2 |   INDEX RANGE SCAN           | EMP_DEPARTMENT_IX |      |
------------------------------------------------------------------------

Neste exemplo, o plano de execução mostra que o otimizador escolhe um índice na coluna employees.department_id para localizar as primeiras 25 linhas de employees cujo ID de departamento é superior a 50. O otimizador usa o rowid recuperado do índice para recuperar o registro da tabela employees e retorná-lo ao cliente. A recuperação do primeiro registro é geralmente quase instantânea.

Exemplo 10-3 Plano de Execução para SELECT sem Dica

Suponha que você execute a mesma instrução, mas sem a dica do otimizador:

SELECT employee_id, department_id
FROM   hr.employees
WHERE  department_id > 50;

------------------------------------------------------------------------
| Id | Operation              | Name              | Rows | Bytes | Cos
------------------------------------------------------------------------
|  0 | SELECT STATEMENT       |                   | 50   | 350   |
|* 1 |  VIEW                  | index$_join$_001  | 50   | 350   |
|* 2 |   HASH JOIN            |                   |      |       |
|* 3 |    INDEX RANGE SCAN    | EMP_DEPARTMENT_IX | 50   | 350   |
|  4 |    INDEX FAST FULL SCAN| EMP_EMP_ID_PK     | 50   | 350   |

Nesse caso, o plano de execução une dois índices para retornar os registros solicitados o mais rápido possível. Em vez de ir repetidamente de índice para tabela como no Exemplo 10-2, o otimizador escolhe uma varredura de intervalo de EMP_DEPARTMENT_IX para localizar todas as linhas em que o ID do departamento tenha mais de 50 e colocar essas linhas em uma tabela de hash. Em seguida, o otimizador escolhe ler o índice EMP_EMP_ID_PK. Para cada linha nesse índice, ele examina a tabela de hash para encontrar o ID do departamento.

Nesse caso, o banco de dados não poderá retornar a primeira linha ao cliente até que a verificação da faixa de índices de EMP_DEPARTMENT_IX seja concluída. Assim, esse plano gerado levaria mais tempo para retornar o primeiro registro. Diferentemente do plano no Exemplo 10-2, que acessa a tabela por ID de linha de índice, o plano usa E/S de vários blocos, resultando em leituras grandes. As leituras permitem que a última linha de todo o conjunto de resultados seja retornada mais rapidamente.

Consulte Também: Oracle AI Database SQL Tuning Guide para saber como usar dicas do otimizador

Visão Geral do Processamento SQL

Esta seção explica como o Oracle AI Database processa instruções SQL. Especificamente, a seção explica como o banco de dados processa instruções DDL para criar objetos, DML para modificar dados e consultas para recuperar dados.

Estágios do Processamento SQL

As etapas gerais do processamento de SQL são análise, otimização, geração de origem de linha e execução. Dependendo da instrução, o banco de dados pode omitir algumas dessas etapas.

A figura a seguir descreve os estágios gerais:

Figura 3: Estágios do Processamento SQL

Descrição da ilustração cncpt250.gif

Análise SQL

A primeira fase do processamento de SQL é a parsing de SQL. Este estágio envolve a separação das partes de uma instrução SQL em uma estrutura que pode ser processada por outras rotinas.

Quando um aplicativo emite uma instrução SQL, ele faz uma chamada de análise para o banco de dados a fim de preparar a instrução para execução. A chamada de análise abre ou cria um cursor, que é um identificador para a área SQL privada específica da sessão que contém uma instrução SQL analisada e outras informações de processamento. O cursor e a área SQL privada estão na PGA.

Durante a chamada de análise, o banco de dados executa as seguintes verificações:

As verificações anteriores identificam os erros que podem ser encontrados antes da execução da instrução. Alguns erros não podem ser detectados pela análise. Por exemplo, o banco de dados pode encontrar um bloqueio de dados ou erros na conversão de dados somente durante a execução da instrução.

O banco de dados tenta a mitigação automática de erros para instruções SQL que falham com um erro ORA-00600 durante a fase de análise. ORA-00600 é um erro grave. Indica que um processo encontrou uma condição inesperada de baixo nível. Quando uma instrução SQL falha com esse erro durante a fase de análise, a mitigação automática de erros a intercepta e tenta resolver a condição. Se uma resolução for encontrada, o banco de dados gerará um patch SQL para ajustar o plano de execução SQL. Se esse patch permitir que o parsing seja concluído com sucesso, o erro ORA-00600 não será gerado. Nenhuma exceção é vista pelo aplicativo.

Consulte Também: Bloques e Deadlocks Sobre a Mitigação Automática de Erros SQL

Otimização SQL

Otimização de consulta é o processo de escolher o meio mais eficiente de executar uma instrução SQL.

O banco de dados otimiza consultas com base nas estatísticas coletadas sobre os dados reais que estão sendo acessados. O otimizador usa o número de linhas, o tamanho do conjunto de dados e outros fatores para gerar planos de execução possíveis, atribuindo um custo numérico a cada plano. O banco de dados usa o plano com o menor custo.

O banco de dados deve executar um hard parse pelo menos uma vez para cada instrução DML exclusiva e executar otimização durante esse parsing. DDL nunca é otimizado, a menos que inclua um componente DML, como uma subconsulta que requer otimização.

Consulte Também:

Geração de Fontes de Linha SQL

O gerador de origem de linha é um software que recebe o plano da execução ideal do otimizador e produz um plano iterativo, chamado plano de consulta, que é utilizável pelo restante do banco.

O plano de consulta assume a forma de uma combinação de etapas. Cada etapa retorna um conjunto de linhas. As linhas desse conjunto são usadas pela próxima etapa ou, na última etapa, são retornadas para o aplicativo que emitiu a instrução SQL.

Uma origem de linha é um conjunto de linhas retornado por uma etapa no plano de execução junto com uma estrutura de controle que pode processar iterativamente as linhas. A origem da linha pode ser uma tabela, uma view ou um resultado de uma operação de junção ou agrupamento.

Execução de SQL

Durante a execução, o mecanismo SQL executa cada origem de linha na árvore produzida pelo gerador de origem de linha. Esta é a única etapa obrigatória no processamento DML.

Durante a execução, se os dados não estiverem na memória, o banco de dados lerá os dados do disco para a memória. O banco de dados também remove os bloqueios e latches necessários para garantir a integridade dos dados e registra todas as alterações feitas durante a execução de SQL. O estágio final do processamento de uma instrução SQL está fechando o cursor.

Se o banco de dados estiver configurado para usar o Armazenamento de Colunas na Memória (armazenamento de colunas do IM), o banco de dados roteará de forma transparente as consultas para o armazenamento de colunas do IM, quando possível, e para o disco e o cache de buffer do banco de dados. Uma única consulta também pode usar o armazenamento de colunas IM, o disco e o cache de buffer. Por exemplo, uma consulta pode unir duas tabelas, sendo que apenas uma delas é armazenada em cache no armazenamento de colunas IM.

Consulte Também:

Diferenças Entre o Processamento DML e DDL

O Oracle AI Database processa DDL de forma diferente da DML.

Por exemplo, quando você cria uma tabela, o banco de dados não otimiza a instrução CREATE TABLE. Em vez disso, o Oracle AI Database analisa a instrução DDL e executa o comando.

Ao contrário de DDL, a maioria das instruções DML tem um componente de consulta. Em uma consulta, a execução de um cursor coloca a linha gerada pela consulta no conjunto de resultados.

O banco de dados pode extrair linhas do conjunto de resultados em uma linha por vez ou em grupos. Na extração, o banco de dados seleciona linhas e, se solicitado pela consulta, classifica as linhas. Cada busca sucessiva recupera outra linha do resultado até que a última linha tenha sido extraída.

Consulte Também: Guia de Desenvolvimento do Oracle AI Database para aprender sobre o processamento de DDL, controle de transações e outros tipos de instruções