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 (pronuncia-se 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.
-
Visão Geral de Instruções SQL Todas as operações executadas nas informações de 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.
-
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 otimizador (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.
-
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.
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:
-
Criar, substituir, alterar e eliminar objetos
-
Inserir, atualizar e excluir linhas da tabela
-
Consultando dados
-
Controlando o acesso ao banco e aos seus objetos
-
Garantir a consistência e a integridade do banco de dados
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.
-
Acesso a Dados SQL Existem duas famílias amplas de linguagens de computador: linguagens declarativas que não são processuais e descrevem o que deve ser feito, e linguagens processuais como C++ e Java que descrevem como as coisas devem ser feitas.
-
Padrões de SQL A Oracle se esforça para seguir padrões aceitos pelo setor e participa ativamente de comitês de padrões de SQL.
Consulte Também:
-
Guia de Desenvolvimento do Oracle AI Database para aprender a escolher um ambiente de programação
-
Oracle AI Database SQL Language Reference para obter uma introdução ao SQL
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:
-
Oracle AI Database SQL Language Reference para obter uma explicação das diferenças entre o Oracle SQL e o SQL padrão
-
SQL*Plus User's Guide and Reference para comandos do SQL*Plus, incluindo sua distinção em relação às instruções SQL
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:
-
Data Definition Language (DDL) Statements Data definition language (DLL) statements define, structurally change, and drop schema objects.
-
Instruções DML (Data Manipulation Language) As instruções DML (Data Manipulation Language) consultam ou manipulam dados em objetos de esquema existentes.
-
Instruções de Controle de Transação 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.
-
As instruções de controle de sessão Instruções de Controle de Sessão gerenciam dinamicamente as propriedades de uma sessão do usuário.
-
Instrução de Controle do Sistema Uma instrução de controle do sistema altera as propriedades da instância do banco de dados.
-
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 procedural.
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ê:
-
Criar, alterar e eliminar objetos de esquema e outras estruturas de banco de dados, inclusive o próprio banco de dados e os usuários do banco de dados. A maioria das instruções DDL começa com as palavras-chave
CREATE,ALTERouDROP. -
Exclua todos os dados nos objetos de esquema sem remover a estrutura desses objetos (
TRUNCATE).Observação: Diferentemente do
DELETE, oTRUNCATEnão gera desfazer dados, o que o torna mais rápido que oDELETE. Além disso,TRUNCATEnão chama acionadores de exclusão -
Conceda e revogue privilégios e atribuições (
GRANT,REVOKE). -
Ative e desative as opções de auditoria (
AUDIT,NOAUDIT). -
Adicione um comentário ao dicionário de dados (
COMMENT).
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:
-
Oracle AI Database Security Guide para saber mais sobre privilégios e atribuições
-
Oracle AI Database Get Started with Oracle AI Database Development e Oracle AI Database Administrator's Guide para aprender a criar objetos de esquema
-
Oracle AI Database Development Guide para saber mais sobre a diferença entre bloquear e não bloquear DDL
-
Referência de Linguagem SQL do Oracle AI Database para obter uma lista de instruções DDL
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:
-
Recupere ou extraia dados de uma ou mais tabelas ou views (
SELECT). -
Adicione novas linhas de dados em uma tabela ou view (
INSERT) especificando uma lista de valores de coluna ou usando uma subconsulta para selecionar e manipular dados existentes. -
Altere os valores de coluna nas linhas existentes de uma tabela ou view (
UPDATE). -
Atualize ou insira linhas condicionalmente em uma tabela ou visualização (
MERGE). -
Remova linhas de tabelas ou views (
DELETE). -
Exiba o plano de execução de uma instrução SQL (
EXPLAINPLAN). -
Bloqueie uma tabela ou view, limitando temporariamente o acesso de outros usuários (
LOCKTABLE).
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.
-
Instruções SELECT Uma consulta é uma operação que recupera dados de uma tabela ou view.
-
Joins Uma join é uma consulta que combina linhas de duas ou mais tabelas, views ou views materializadas.
-
Subconsultas Uma subconsulta é uma instrução
SELECTaninhada em outra instrução SQL. As subconsultas são úteis quando você deve executar várias consultas para resolver um único problema.
Consulte Também:
-
Oracle AI Database Conceitos Básicos do Oracle AI Database Development para aprender a consultar e manipular dados
-
Referência de Linguagem SQL do Oracle AI Database para obter uma lista de instruções DML
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 |
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:
-
Junções internas
junção interna é uma junção de duas ou mais tabelas que retorna somente linhas que satisfazem à condição de junção. Por exemplo, se a condição de junção for
employees.department_id=departments.department_id, as linhas que não atenderem a essa condição não serão retornadas. -
Junções externas
Uma join externa retorna todas as linhas que satisfazem à condição da join e também retorna linhas de uma tabela para as quais não há linhas da outra tabela que satisfaçam à condição.
O resultado de uma junção externa esquerda para as tabelas A e B sempre conterá todos os registros da tabela esquerda A, mesmo que a condição de junção não corresponda a um registro na tabela direita B. Se não houver linha correspondente de B, as colunas B conterão nulos para linhas que não tenham correspondência em B. Por exemplo, se nem todos os funcionários estiverem nos departamentos, uma junção externa esquerda de
employees(tabela esquerda) edepartments(tabela direita) recuperará todas as linhas ememployeesmesmo que nenhuma linha emdepartmentssatisfaça a condição de junção (employees.department_idé nulo).O resultado de uma junção externa direita para as tabelas A e B contém todos os registros da tabela direita B, mesmo que a condição de junção não corresponda a uma linha na tabela esquerda A. Se não existir uma linha correspondente de A, as colunas A conterão nulos para linhas que não tenham correspondência em A. Por exemplo, se nem todos os departamentos tiverem funcionários, uma junção externa direita de
employees(tabela esquerda) edepartments(tabela direita) recuperará todas as linhas emdepartmentsmesmo que nenhuma linha ememployeessatisfaça a condição de junção.Uma junção externa completa é a combinação de uma junção externa esquerda e uma junção externa direita.
-
Produtos cartesianos
Se duas tabelas em uma consulta de junção não tiverem uma condição de junção, o banco de dados executará uma junção cartesiana. Cada linha de uma tabela é combinada com cada linha da outra. Por exemplo, se
employeestiver 107 linhas edepartmentstiver 27, o produto cartesiano conterá 107*27 linhas. Um produto cartesiano raramente é útil.
Consulte Também:
-
Guia de Ajuste do Oracle AI Database SQL para saber mais sobre junções
-
Oracle AI Database SQL Language Reference para obter descrições detalhadas e exemplos de junções
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:
-
Tornar permanentes as alterações em uma transação (
COMMIT). -
Desfaça as alterações em uma transação, desde que ela foi iniciada (
ROLLBACK) ou desde um ponto de salvamento (ROLLBACK TO SAVEPOINT). Um ponto de salvamento é um marcador intermediário declarado pelo usuário dentro do contexto de uma transação.Observação: A instrução
ROLLBACKencerra uma transação, masROLLBACK TO SAVEPOINTnão. -
Defina um ponto para o qual você possa fazer rollback (
SAVEPOINT). -
Estabeleça propriedades para uma transação (
SETTRANSACTION). -
Especifique se uma constrição de integridade adiável é verificada após cada instrução DML ou quando a transação é submetida a commit (
SET CONSTRAINT).
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:
-
Quando o Banco de Dados Verifica Restrições e Asserções de Validade
-
Oracle AI Database SQL Language Reference para saber mais sobre instruções de controle de transação
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:
-
Altere a sessão atual executando uma função especializada, como definir o formato de data padrão (
ALTER SESSION). -
Ative e desative atribuições, que são grupos de privilégios, para a sessão atual (
SET ROLE).
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:
-
Oracle AI Database SQL Language Reference para sintaxe e semântica do
ALTER SESSION
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:
-
Defina, aloque e libere um cursor (
DECLARE CURSOR,OPEN,CLOSE). -
Especifique um banco de dados e conecte-se a ele (
DECLARE DATABASE,CONNECT). -
Designe nomes de variáveis (
DECLARE STATEMENT). -
Inicializar descritores (
DESCRIBE). -
Especifique como as condições de erro e advertência são tratadas (
WHENEVER). -
Faça parse e execute instruções SQL (
PREPARE,EXECUTE,EXECUTE IMMEDIATE). -
Recuperar dados do banco de dados (
FETCH).
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.
-
Componentes do Otimizador O otimizador contém três componentes principais: o transformador, o estimador e o gerador de planos.
-
Caminhos de Acesso Um caminho de acesso é a técnica que uma consulta usa para recuperar linhas.
-
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.
-
Dicas do Otimizador Uma dica é um comentário em uma instrução SQL que atua como uma instrução para o otimizador.
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:
-
Avaliação de expressões e condições
-
Inspeção de restrições de integridade para saber mais sobre os dados e otimizar com base nesses metadados
-
Transformação de declaração
-
Escolha de metas de otimizador
-
Escolha de caminhos de acesso
-
Escolha de ordens de junção
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:
-
Throughput total
A dica
ALL_ROWSinstrui o otimizador a obter a última linha do resultado para o aplicativo cliente o mais rápido possível. -
Tempo de resposta inicial
A dica
FIRST_ROWSinstrui o otimizador a obter a primeira linha para o cliente o mais rápido possível.
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:
-
Referência de Tipos e Pacotes PL/SQL do Oracle AI Database para obter informações sobre como usar o
DBMS_STATS -
Guia de Ajuste SQL do Oracle AI Database para obter mais informações sobre o otimizador e usar dicas
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:
-
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.
-
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.
-
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.
-
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.
-
Estimador O estimador determina o custo geral de um determinado plano de execução.
-
Gerador de Planos O gerador de planos tenta diferentes planos para uma consulta enviada. O otimizador escolhe o plano com o menor custo.
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:
-
Seletor
Esta medida representa uma fração de linhas de um conjunto de linhas. A seletividade é vinculada a um predicado de consulta, como
last_name='Smith', ou a uma combinação de predicados. -
Cardinalidade
Esta medida representa o número de linhas em um conjunto de linhas.
-
Custo
Esta medida representa as unidades de trabalho ou o recurso usado. O otimizador de consulta usa E/S de disco, uso de CPU e uso de memória como unidades de trabalho.
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:
-
Oracle AI Database Get Started with Performance Tuning para obter uma introdução ao ajuste de SQL
-
Oracle AI Database SQL Tuning Guide para saber mais sobre os componentes do otimizador e a otimização adaptativa
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:
-
Varreduras completas de tabela
Este tipo de varredura lê todas as linhas de uma tabela e filtra as que não atendem aos critérios de seleção. O banco de dados verifica sequencialmente todos os blocos de dados no segmento, inclusive aqueles sob a marca d'água alta (HWM) que separa o espaço usado do não utilizado (consulte "Espaço de Segmento e a Marca d'água Alta").
-
Varreduras de id de linha
O id da linha especifica o arquivo e o bloco de dados contendo a linha e a localização da linha nesse bloco. O banco de dados primeiro obtém os rowids das linhas selecionadas, da cláusula
WHEREda instrução ou por meio de uma verificação de índice e, em seguida, localiza cada linha selecionada com base em seu rowid. -
Varreduras de índice
Esta verificação pesquisa um índice para os valores de coluna indexados acessados pela instrução SQL (consulte "Verificações de Índice"). Se a instrução acessar somente colunas do índice, o Oracle AI Database lerá os valores de coluna indexados diretamente do índice.
-
Verificações de cluster
Uma varredura de cluster recupera dados de uma tabela armazenada em um cluster de tabela indexado, no qual todas as linhas com o mesmo valor de chave de cluster são armazenadas no mesmo bloco de dados (consulte "Visão Geral de Clusters Indexados"). O banco de dados obtém primeiro o rowid de uma linha selecionada, verificando o índice do cluster. O Oracle AI Database localiza as linhas com base neste id de linha.
-
Varreduras de hash
Uma verificação de hash localiza linhas em um cluster de hash, em que todas as linhas com o mesmo valor de hash são armazenadas no mesmo bloco de dados (consulte "Visão Geral de Clusters de Hash"). O banco de dados primeiro obtém o valor de hash aplicando uma função de hash a um valor de chave de cluster especificado pela instrução. O Oracle AI Database então verifica os blocos de dados que contêm linhas com este valor de hash.
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:
-
Estatísticas de tabelas
Estes incluem o número de linhas, o número de blocos e o comprimento médio da linha.
-
Estatísticas de coluna
Estas incluem o número de valores distintos e nulos em uma coluna e a distribuição de dados.
-
Estatísticas de índice
Isso inclui o número de blocos de folha e níveis de índice.
-
Estatísticas do sistema
Estes incluem desempenho e utilização da CPU e de Entrada/Saída.
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:
-
Oracle AI Database Get Started with Performance Tuning e Oracle AI Database SQL Tuning Guide para aprender a reunir e gerenciar estatísticas
-
Referência de Tipos e Pacotes PL/SQL do Oracle AI Database para saber mais sobre
DBMS_STATS
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.
-
Fases 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.
-
Diferenças entre DML e Processamento de DDL O Oracle AI Database processa DDL de maneira diferente da DML.
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
-
Parsing de 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.
-
Otimização de consulta é o processo de escolher o meio mais eficiente de executar uma instrução SQL.
-
Geração de Origens de Linha SQL O gerador de origens 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.
-
Execução 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.
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:
-
Verificação de sintaxe
-
Verificação semântica
-
Verificação do pool compartilhado
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:
-
Guia de Ajuste do Oracle AI Database SQL para obter informações detalhadas sobre o otimizador de consulta
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:
-
Guia de Ajuste do Oracle AI Database SQL para obter informações detalhadas sobre planos de execução e a instrução
EXPLAIN PLAN
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