Pular para o conteúdo

SQL padrão ANSI X SQL padrão Oracle

SQL padrão ANSI X SQL padrão Oracle

Escrevi este artigo para explicar em detalhes a resposta de uma pergunta que é realizada frequentemente por alunos em quase toda turma presencial de  SQL ou SQL Tuning  que eu leciono:” Existe diferença de desempenho entre instruções SQL escritas no padrão ANSI ou no padrão Oracle?”. Antes de dar a resposta, vamos entender primeiro o que é SQL e o que são os padrões ANSI SQL e Oracle.

O que é SQL?

Resumindo, a Structured Query Language, mais conhecida pela sigla SQL, é uma linguagem que foi desenvolvida no início dos anos 70, pela IBM, para manipular bancos de dados relacionais. A partir de então, diversos fabricantes de Sistemas Gerenciadores de Bancos de Dados relacionais (SGBDRs), como por exemplo a Oracle, começaram a desenvolver versões próprias da linguagem SQL (chamadas de dialetos ou extensões), e isso levou a necessidade da criação de uma linguagem SQL padronizada.

Com a sua popularização e sucesso, organizações como o Instituto Americano Nacional de Padrões (ANSI) e a Organização Internacional de Padronização (ISO), resolveram padronizar a linguagem SQL. Em 1986 foi criado um padrão ANSI e em 1987 foi criado um padrão ISO. A partir de então, surgiram várias versões do padrão SQL, onde cada versão acrescenta novos comandos ou funcionalidades.

História do padrão ANSI 

As versões do padrão ANSI existentes até a presente data são:

  • SQL-86: Primeira versão da linguagem, lançada em 1986, consiste basicamente na versão inicial da linguagem criada pela IBM.
  • SQL-92: Lançada em 1992, inclui novos recursos tais como tabelas temporárias, novas funções, expressões nomeadas, valores únicos etc.
  • SQL:1999 (SQL3): Lançada em 1999, foi a versão que teve mais recursos novos significativos, entre eles: a implementação de expressões regulares, recursos de orientação a objetos, queries recursivas, triggers, novos tipos de dados (boolean, LOB, array e outros), novos predicados etc.
  • SQL:2003: Lançada em 2003, inclui suporte básico ao padrão XML, sequências padronizadas, instrução MERGE, colunas com valores auto-incrementais etc.
  • SQL:2006: Lançada em 2006, não inclui mudanças significativas para as funções e comandos SQL. Contempla basicamente a interação entre SQL e XML.

Padrão Oracle X padrão ANSI

Atualmente, os principais fabricantes de SGBDRs, implementam em seus Bancos de Dados, além das instruções SQL referentes ao seu “dialeto”, as instruções SQL do padrão ANSI mais recente. No caso de instruções SQL no SGBD Oracle, o que o pessoal costuma chamar de padrão Oracle, é o dialeto SQL da Oracle. As instruções dos dialetos normalmente surgem quando o fabricamente necessita implementar recursos no SGBD, que ainda não possuem instruções correspondentes no padrão ANSI .

Um exemplo muito utilizado de comando SQL do dialeto Oracle, é a ligação OUTER JOIN, que o pessoal costuma escrever utilizando o caractere +.

Agora que já sabemos o que é o padrão Oracle e o que é o padrão ANSI, vou explicar qual desses padrões pode proporcionar melhor performance às instruções SQL, no caso do Banco de Dados Oracle. Antes ainda, de falar sobre a performance dos 2 padrões, vou comentar sobre outros itens, que me fazem defender o uso do padrão ANSI. Entre eles, vou destacar os seguintes:

  • Permite que você migre a aplicação contendo as instruções SQL para outro BD sem ter que fazer qualquer alteração;
  • As ligações entre colunas são mais fáceis de ser identificadas, pois ficam fora da cláusula WHERE (separadas das condições de filtro). Essa facilidade pode muitas vezes facilitar manutenção futura e evitar queries ruins. Já vi muita gente escrever queries no padrão Oracle e esquecer de incluir uma coluna necessária para a ligação correta entre 2 tabelas. Para evitar linhas duplicadas, resultantes do produto cartesiano gerado pela falta da coluna necessária na ligação, o desenvolvedor incluía a instrução DISTINCT.”Uma tremenda gambiarra para corrigir um erro de programação, que gerava degradação da performance da query”;
  • Permite fazer OUTER JOIN com parâmetros de stored procedures. No padrão Oracle você não consegue fazer isso. Eu comecei a escrever instruções SQL no padrão ANSI em 2005, quando percebi que somente o padrão ANSI permitia isso;

Bom… agora quanto à performance: utilize o padrão ANSI! Desde a implantação do otimizador baseado em custo (CBO) no Oracle Database, a Oracle recomenda a utilização do padrão ANSI, pois o CBO foi desenvolvido com base neste padrão. Deste modo, as instruções SQL escritas no padrão ANSI podem gerar planos de execução melhores, e consequentemente, serão executadas mais rapidamente!

Na prática, dificilmente você encontrará diferenças no plano de execução gerado entre os 2 padrões, mas… um dia você encontrará! Isso já aconteceu comigo em uma turma de SQL Tuning que lecionei em 08/2011. Uma das alunas refez uma instrução SQL do treinamento utilizando o padrão Oracle e o plano de execução gerado pelo otimizador ficou diferente. No plano da instrução ANSI o otimizador usava um índice para acessar uma das tabelas. No plano da instrução Oracle o otimizador fazia Full Table Scan, logo, a instrução SQL escrita no padrão ANSI tinha um tempo de execução melhor!

Conclusão

Escrever instruções SQL utilizando o padrão ANSI pode nos oferecer alguns benefícios, como por exemplo, portabilidade entre diversos SGBDs, melhor organização da instrução SQL e uma possível melhora de performance. Evite o padrão Oracle, pois o padrão ANSI é um padrão de mercado e pode ser utilizado em qualquer SGBD.

Referências

 

Quão útil foi este post ?

Clique em uma estrela para classificar o post

nota média 4.8 / 5. Contagem de votos: 62

Sem votos ! Seja o primeiro a classificar !

Marcações:

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

plugins premium WordPress