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.
- ANALISAR
- verificação de sintaxe
- semântica de seleção
- verificação de privilégios
- BIND
- substituir bind/host variáveis com valores reais
- EXEC
- real de execução com base em um plano de explicar
- 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:
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:
-- 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.