SELECT Statement Processing

cada consulta SQL que você envia para um servidor deve passar por três (Quatro – EM CaSO de seleção) estágios. Em primeiro lugar, a Oracle procurará um hash SQL correspondente no cache da Biblioteca. Se o hash for encontrado, ele apenas recuperará o plano de explicação associado e o executará. Caso contrário, uma análise difícil é invocada -> isso significa que as etapas a seguir devem ser executadas.

  1. ANALISAR
    • verificação de sintaxe
    • semântica de seleção
    • verificação de privilégios
  2. BIND
    • substituir bind/host variáveis com valores reais
  3. EXEC
    • real de execução com base em um plano de explicar
  4. FETCH (instruções SELECT apenas)
    • retorna um conjunto de resultados para um usuário

Deixe-me explicar cada fase no exemplo a seguir.

você executou esta consulta:

selecione *
do empregado;
Selecione *do funcionário;

SELECT *FROM employee;

o processo do servidor gerará um hash para a consulta SQL de problemas. O hash é um valor hexadecimal gerado com base no texto da consulta SQL. Aí vem a parte muito importante!! Mesmo a menor mudança (maiúsculas para minúsculas e vice-versa; adicionar/remover um espaço; …) mudará o hash e, portanto, pode gerar uma análise difícil (mais na análise difícil vs análise suave abaixo). Você tem que ter muito cuidado e tentar manter apenas um código – é por isso que os procedimentos funcionam melhor (além disso – eles usam principalmente variáveis de ligação que geram consultas idênticas aos olhos da Oracle).

Você pode facilmente verificar isso em seu próprio país, executando as consultas abaixo:

— primeiro executar esta consulta
SELECT * FROM dual;
— em seguida, execute um presente mais uma vez com todas as letras maiúsculas
SELECT * FROM DUAL;
— verifique o sql hashes
SELECIONE sql_id
, sql_text
, hash_value
v$sql
ONDE 1=1
E inferior(sql_text) LIKE ‘%escolha%do dual%’;
sql_id | sql_text | hash_value
————————————————–
0x735fvggtnu6 | SELECT * FROM DUAL| 3741111110
3vyt9wdmca69b | SELECT * FROM dual| 1724193067
— Como você pode ver Oracle avaliado como duas consultas diferentes.
— primeiro execute este querySELECT * de dual; – em seguida, execute este novamente com todas as letras maiúsculas select * de DUAL;– verifique o sql hashes SELECIONE sql_id, sql_text, hash_valueFROM v$sqlWHERE 1=1 E inferior(sql_text) LIKE ‘%escolha%do dual%’; sql_id | sql_text | hash_value————————————————–0x735fvggtnu6 | SELECT * FROM DUAL | 37411111103vyt9wdmca69b | SELECT * FROM dual | 1724193067– Como você pode ver Oracle avaliado como duas consultas diferentes.

-- first run this querySELECT * FROM dual;-- then run this one again with all uppercase lettersSELECT * FROM DUAL;-- check the sql hashes SELECT sql_id, sql_text, hash_valueFROM v$sqlWHERE 1=1AND lower(sql_text) LIKE '%select%from dual%'; sql_id | sql_text | hash_value--------------------------------------------------0x735fvggtnu6 | SELECT * FROM DUAL | 37411111103vyt9wdmca69b | SELECT * FROM dual | 1724193067-- As you can see Oracle evaluated it as two different queries.

depois que o hash é gerado, o Oracle verifica se essa consulta já foi executada nesta instância. Como? Verificando se o hash já existe na área SQL.

supondo que esta consulta ainda não esteja disponível, haverá uma área SQL criada com o valor hash para esta consulta e o Oracle iniciará o primeiro estágio do processamento da consulta e isso é PARSE.

  • durante a verificação de sintaxe, o Oracle verificará a consulta se ela está sintaticamente correta (selecione em vez de selecionar; a ordem correta dos comandos – > selecione * da ordem da tabela por col1 onde col2 = ‘John’; etc).
  • a próxima etapa é a verificação semântica em que o Oracle verifica se os nomes das colunas e os nomes dos objetos estão corretos. Como? Ao cruzá-los com o Cache do dicionário de dados
  • na última etapa do estágio de análise, o Oracle verifica se o usuário/aplicativo tem permissões corretas para acessar objetos consultados.

assim que terminar, a área SQL será válida e outra ferramenta no Oracle chamada OPTIMIZER gerará um plano de execução – isso significa que o otimizador decidirá como a consulta será executada. Depois que o melhor plano de execução é selecionado, o Oracle vincula todas as variáveis e prossegue para a terceira etapa – execução.

o que vai acontecer aqui? A Oracle lerá blocos de dados relacionados a objetos consultados e os levará ao cache de buffer (se eles ainda não forem apresentados lá. Se eles estiverem lá, a Oracle não os lerá novamente!). Esse processo gerará E / S (que, como mencionei no artigo arquitetura de computação, é muito lento em comparação com a leitura da memória). Vou parar aqui por um tempo e enfatizar a geração de E/S. No caso de análise suave, todos os dados são lidos a partir da memória (cache de buffer), que é muito mais rápido do que lê-los a partir de um disco. É por isso que você tem que se esforçar para reciclar/reutilizar suas consultas, tanto quanto possível. Cada mudança de uma consulta gerará um novo hash e, portanto, provavelmente gerará e/S. tudo isso ainda é tratado pelo processo do servidor.

agora, que os dados já estão na memória (cache de buffer), a instrução SELECT é processada e o estágio final (FETCH) é acionado e o conjunto de resultados é retornado ao usuário.

se a mesma consulta for executada novamente, o hash será gerado e, como a área SQL para esse hash já existe, o estágio de análise é ignorado e apenas EXEC e FETCH são executados.

Deixe uma resposta

O seu endereço de email não será publicado.