Você está na página 1de 9

Construo de Comandos SQL com boa performance

Em bancos de dados relacionais as informaes so guardadas em tabelas. Para


recuperar uma informao necessaria ao usurio, deve-se busc-la em vrias tabelas
diferentes, estabelecendo-se um relacionamento entre elas. Esta a origem do nome
deste paradigma de banco de dados.
Tabelas so na verdade conjuntos. Por eemplo, !uando em um sistema eiste uma
tabela de vendas, esta tabela corresponde ao conjunto de todas as vendas feitas por uma
empresa. " tabela de vendedores corresponde ao conjunto de vendedores !ue trabal#am
em uma empresa. Cada linha ou registro da tabela corresponde a um elemento do
conjunto.
$onsultas e alteraes na base de dados correspondem a operaes reali%adas sobre
conjuntos. Estas operaes so definidas pela lgebra relacional.
Por eemplo, determinar quais os vendedores com tempo de casa maior que
um determinado patamar, significa determinar um subconjunto do conjunto de
vendedores, onde todos os elementos possuam uma determinada propriedade. Para
determinar as vendas destes vendedores, necessrio reali%ar a operao j citada e
depois, para cada elemento do subconjunto &vendedores veteranos& necessrio
determinar o subconjunto do conjunto de vendas, contendo a propriedade de ter sido
reali%ada pelo vendedor em !uesto. ' resultado final da consulta ser a unio de todos
estes subconjuntos.
' problema apresentado possu( tambm outra forma de soluo. Podemos, em um
primeiro momento, determinar para cada vendedor, !uais as suas vendas. Ter(amos ento
vrios subconjuntos, cada um contendo as vendas de um vendedor. )eito isto,podemos
verficar !uais os vendedores so veteranos, formando o resultado final a partir da unio dos
subconjuntos associados a cada um.
Consultas em banco de dados no passam de problemas de lgebra relacional. "ssim como
acontece com a lgebra &tradicional&, os operadores possuem algumas propriedades. *abemos
!ue + , - , +. .sto significa !ue, !uando precisamos contar uma epresso de lgebra
relacional para c#egar a um determinado resultado,podemos fa%e-lo de mais de uma forma, pois
vrias epresses levam ao mesmo resultado. Em outras palavras, !uando o banco de dados
precisa montar uma epresso algbrica para encontrar um resultado, ele deve escol#er uma entre
vrias. "pesar de apresentarem o mesmo resultado, as epresses so diferentes, e a diferena
far com que o banco de dados adote um diferente caminho para resolver cada uma.
Escolher o caminho mais curto uma das grandes atribuies do banco de dados. Est a
misso do otimiador, um subsistema do banco da dados, responsvel por determinar o plano de
e!ecuo para uma consulta.
" linguagem #$% &#earch and $uer' %anguage( um grande padro de banco de dados.
.sto decorre da sua simplicidade e facilidade de uso. Ela se ope a outras linguagens no sentido
em !ue uma consulta */0 especifica a forma do resultado e no o camin#o para c#egar a ele.
Ela um linguagem declarativa em oposio a outras linguagens procedurais. .sto redu% o ciclo
de aprendi%ado da!ueles !ue se iniciam na linguagem.
)amos comparar*
descrio declarativa*
&!uero saber todas as vendas feitas por vendedores com mais de 12 anos de
casa.&
descrio procedural*
&Para cada um dos vendedores, da tabela vendedores, com mais de 12 anos
de casa, determine na tabela de vendas todas as v 3 destes vendedores. "
unio de todas estas vendas ser o resultado final do problema.&
4a verdade, fui bem pouco #onesto na comparao. 5in#a declarao procedural tem
muito de declarativa, o !ue a torna mais simples. *e ela fosse realmente
procedural, seria ainda mais complicada.
' fato !ue, ter !ue informar o como fa%er, torna as coisas mais dif(ceis. 4este
sentido, */0 facilitou muito as coisas.
Porm, a partir do nosso &o !ue !ueremos&, o banco de dados vai determinar o &como
fa%er&. 4o problema das &vendas dos veteranos&, descrevi duas formas de solucionar o
problema, a primeira certamente mel#or !ue a segunda. ' objetivo deste teto
apresentar formas de di%er para o banco de dados o !ue !ueremos, ajudando-o a
determinar uma forma de fa%er !ue ten#a esforo m(nimo. Para c#egarmos a este
objetivo, lamentavelmente, teremos !ue nos preocupar com o &como fa%er6. 7 fato !ue
parte da necessidade da nossa preocupao com o &como fa%er& decorr8ncia do estgio
atual da tecnologia, !ue ainda pode evoluir. Porm, por mel#or !ue seja o otimi%ador de
um banco de dados, ele poder trocar a consulta fornecida pelo usurio por outra
e!uivalente segundo a lgebra relacional. Em algumas situaes uma consulta
e!uivalente 9 outra apenas considerando-se a sem:ntica dos dados. 4este caso, se n;s no
nos preocuparmos com o &como fa%er <, teremos uma performance pior.
+so de ,ndices
/uando fa%emos consultas em uma tabela estamos selecionando registros com determinadas
propriedades. =entro do conceito de lgebra relacional, estamos fa%endo uma simples operao
de determinar um subconjunto de um conjunto. " forma trivial de reali%ar esta operao avaliar
cada um dos elementos do conjunto para determinar se ele possui ou no as propriedades
desejadas. 'u seja, avaliar, um a um, todos os seus registros.
Em tabelas grandes, a operao descrita acima pode ser muito custosa. .maginemos !ue
se deseje relacionar todas as ap;lices vendidas para um determinado cliente, para saber seu
#ist;rico. *e for necessrio varrer toda a tabela de ap;lices para responder esta !uesto o
processo certamente levar muito tempo.
" forma de resolver este problema o uso de ,ndices. >ndices possibilitam ao banco de dados o
acesso direto 9s informaes desejadas.
)isicamente, a tabela no est organi%ada em nen#uma ordem. 's registros so colocados
na tabela na ordem cronol;gica de insero. =elees ainda causam mudanas nesta ordem. +m
,ndice uma estrutura onde todos os elementos de uma tabela esto organiados, em uma
estrutura de dados eficiente, ordenados segundo algum critrio. ?m registro no (ndice
composto pelo conjunto de valores dos campos !ue compem o (ndice e pelo endereo fisico do
registro na tabela. "o escrever uma consulta */0, no informamos especificamente !ual (ndice
ser usado pela consulta. Esta deciso tomada pelo banco de dados. $abe a n;s escrever a
consulta de forma !ue o uso do (ndice seja poss(vel. 7 preciso !ue nossa consulta disponibilize o
(ndice.
-ossibilitando uso de colunas para acesso inde!ado
4a verdade, a consulta disponibili%a colunas !ue podem ser usadas em acesso 9 (ndices. '
banco de dados, a partir das colunas dispon(veis e dos (ndices eistentes, determina a
conveni8ncia de se usar determinado (ndice.
Para permitir !ue uma coluna seja usada em acesso 9 (ndice, ela deve aparecer na clusula
where de um select.
Por eemplo, a consulta@
select campol
from tabela
A#ere campol - ,
and campo+ B C
and campo, DB E
and campoC betAeen 12 and +2
and campoF G 12 - 1F
and to - number HcampoIJ - '
and nvl HcampoE, +J - +
and campoK liLe MNE4EO"0PM
and campoQ liLe MP"$$.=E4TM
=isponibili%a o uso de (ndices nos campos campo 1, campo+ e campoC. 4os casos dos campos
campo+ e carnpoC, o acesso a (ndice ser para buscar registros !ue possuam valor numa
determinada faia.
" condio campo3 <> E no disporRbie%a (ndice por ser uma relao de
desigualdade.
=e fato, se a tabela possuir n registros, um dos !uais com campo3 = E, no parece
ra%ovel um (ndice para recuperar 4 - 1 elementos.
" condio campo.5 + 12 = 15 no permite uso de (ndice pela coluna campo5 por igualar ao
valor 1F uma e!presso envolvendo a coluna, e no a coluna isolada. =e fato, uma tcnica
para se inibir o uso de (ndice em uma coluna, !uando desejado, usar epresses tais como@
S nome-coluna G ' = 1F, para campos number ou date, ou
S nome-coluna TT U = 'AB!', para campos c"ar.
"s epresses envolvendo as colunas campo# e campo $ tambm no disponibili%am (ndice pelo
mesmo motivo. )oram inclu(das a!ui por se tratarem de casos em !ue, fre!Ventemente, as
pessoas ac#am !ue o uso de (ndice seria poss(vel.
" epresso envolvendo campoK disponibili%a (ndice, pois ela na verdade como se
escrev8ssemos@ campo8 >= 'G cccc!!! 'and campo8 " = 'Gddd!!!# onde c $ o menor caracter
na ordem da tabela "*$..., dentro do dom(nio poss(vel de valores para o campo d o maior. W
a epresso envolvendo campo% no permite uso de (ndice.
*e #ouver um (ndice Rnico na tabela pelo campo 1, o acesso disponibili%ado por este (ndice um
uni%ue scan& o banco de dados fa% um acesso ao (ndice para buscar um Rnico registro.
5esmo !ue #aja um (ndice Rnico pelo campo&, ser feito um range scan na tabela, ou seja, uma
busca para recuperar vrios registros. ' mesmo ocorre para o campo'.
Escolhendo um ,ndice
=adas as colunas !ue podem ser usadas para acesso indeado, o banco de dados passa a deciso
sobre !ual (ndice ser usado. Para isto, ele determinar os (ndices dispon(veis para ento escol#er
um.
?m (ndice estar dispon(vel se um prefi!o dos campos !ue o compem estiver dispon(vel. Por
eemplo, se o (ndice for composto pelas colunas campo1, campo&, campo3 e campo', o (ndice
estar dispon(vel se estiverem dispon(veis as colunas@
campo1 ou
campo1 e campo& ou
campo(, campo&, e campo3 ou
campo1, campo&, campo3 e campo'.
4este Rltimo caso, o uso do (ndice ser completo, se ele for usado.
" seleo entre os (ndices para determinar !ual ser realmente usado feita a partir de #eur(sticas,
como por eemplo, melhor usar um 'ndice (nico %ue um 'ndice no (nico. Esta seleo
pode considerar tambm informaes sobre os dados arma%enadas na tabela, dependendo da
configurao do servidor de banco de dados.
$ual o melhor ,ndice.
' critrio bsico para escol#a de (ndices a seletividade. /uando o banco de dados resolve uma
consulta, fre!Ventemente, ele precisa percorrer mais registros do !ue a!ueles realmente
retomados pela consulta. 's registros percorridos !ue forem rejeitados representarn o trabal#o
perdido. /uanto menor for o trabal#o perdido, mais perto estaremos da performance ;tima para
resolver a consulta. Portanto, o mel#or (ndice para uma consulta a!uele !ue apresenta a maior
seletividade. Xejamos a consulta abaio@
select campol
from tabela
A#ere campo+ - + and campo, - l and campoC - ,Y
tabela possui os (ndices@
(ndice 1@ campo+, campoF
(ndice +@ campol
(ndice ,@ campo,, campol
(ndice C@ campoC
(ndice F@ campoF, campoC
4este caso, esto dispon(veis para consultas indeadas os campos campo&, campo3 e campo' o
!ue permite o uso dos (ndices 1, , e C. ' (ndice mais seletivo ser a!uele !ue recuperar o m(nimo
nRmero de registros.
*e #ouver 12 registros com campo& = &, +222 registros com campo3 = 1 e F2
registros com campo' = 3, o (ndice 1 ser o mais seletivo. 4ossa mel#or alternativa portanto
um range scan no (ndice l . Xale a pena ressaltar !ue o fato do (ndice 1 possuir tambm a coluna
campo5 prejudica.um pouco a consulta. 'u seja, seria mel#or, para esta consulta, !ue o (ndice 1
possu(sse apenas o campo&.
Para resolver a consulta, o banco de dados far o acesso ao (ndice, onde ir recuperar o
endereo fisico, na tabela, dos registros candidatos a compor o resultado. $om este endereo,
ele verifica cada registro !uanto /s outras condies. 's !ue satisfi%erem as outras
condies comporo o resultado.
Em alguns casos, este cantin#o pode ser mais simples. Xeja o eemplo abaio@
*elect campo1 from tabela A#ere campo+ - +Y
Tabela possui os (ndices@
(ndice 1@ campo1 , campo,
(ndice+@ campo+, campo1, campo,
(ndice,@ campo1, campo+

4este caso, o banco de dados apenas pode usar o (ndice +. " consulta pode ser resolvida sem
acesso 9 tabela, usando apenas o (ndice. ?ma ve% !ue o (ndice tambm possui os valores para
campo1 de cada registro, no # necessidade de se recuperar este valor da tabela.
Campos nulos no entram
Toda ve% !ue um registro possuir valores nulos para todos os campos !ue compem um (ndice,
este registro no ser colocado no (ndice.
.sto causa problemas de performance em sistemas mau projetados. *upon#a !ue a modelagem de
dados de um sistema de contas a pagar ten#a resultado em um projeto onde eiste uma tabela de
contas Hou compromissos, ou t(tulosJ a pagar, contendo, entre outros, dois campos@ data de
vencimento e data de pa)amento. " primeira seria a data em !ue o t(tulo deve ser pago. "
segunda a data em !ue o t(tulo foi efetivamente pago. *upon#a ainda !ue a din:mica do sistema
determine !ue todo t(tulo, ao ser inserido no sistema, ten#a valor nulo para o campo data de
vencimento. /uando o pagamento vier a ser efetuado, o campo ser atuali%ado. 7 bastante
poss(vel !ue seja constru(da uma consulta para recuperar todos os t(tulos no pagos. 4este caso,
no ser poss(vel o uso de (ndices, pois estamos procurando campos com valor nulo. *e
tivermos, nesta tabela, +22222 t(tulos, dos !uais F22 no pagos, esta consulta ter desempen#o
bastante a!um do poss(vel. ?ma soluo mel#or, seria iniciaV%ar o campo data de vencimento
com o valor 21Z21Z1QQK, significando conta no paga.
0abelas pequenas
$omo Rltima considerao sobre consultas em uma tabela, vale lembrar !ue !uando fa%emos uma
consulta a uma tabela bastante pe!uena, no compensa usar (ndices. o trabal#o envolvido em
acessar o (ndice pegar o endereo e, depois, acessar a tabela maior !ue o esforo de ler a tabela
inteira.
Consultas em vrias 0abelas
$onsultas envolvendo vrias tabelas so feitas atravs de )oins. 4a teoria da lgebra relacional,
estas consultas so produtos cartesianos entre os conjuntos HtabelasJ envolvidos. Para cada
elemento do conjunto resultado do produto cartesiano, ser verificado se ele possui ou no um
determinado conjunto de condies, imposto ao resultado da consulta.
' banco de dados ir tirar proveito de propriedades matemticas para otimi%ar estas consultas.
.magine !ue ten#amos dois conjuntos, um de ret:ngulos e um de c(rculos. Tome como objetivo
obter o subconjunto do produto cartesiano destes dois conjuntos !ue apenas conten#am c(rculos
amarelos e ret:ngulos a%uis. [ duas formas de resolver isto. ?ma fa%er o produto cartesiano,
e, a partir do resultado, ecluir os elementos !ue no atendem a premissa. 'utra determinar o
subconjRnto dos c(rculos amarelos e o subconjunto dos ret:ngulos a%uis, fa%endo um produto
cartesiano dos dois subconjuntos. "pesar de e!uivalentes !uanto ao resultado, o segundo mtodo
bastante mais eficiente em termos de performance.
4ormalmente, !uando se fa% uma consulta em duas ou mais tabelas, eiste alguma informao
!ue as une. Por eemplo, voc8 !uer relacionar registros de um determinado empregado apenas
ao registro do departamento onde este empregado trabal#a. Esta condio c#amada de
condio de )oin! 4ormalmente, esta condio evita !ue seja necessria a reali%ao de um
produto cartesiano de fato. Xejamos o eemplo@
select depto.nome, emp.nome
from empregados emp, departamentos depto
A#ere emp.data\admissao D M'l-jan-Q+]
and depto.id - departamento - emp.departamento and depto.area-de^negocio - M)"*T^)''=]Y
4este caso, estamos trabal#ando sobre dois conjuntos@ empregados e departamentos.
Possu(mos restries sobre estes dois conjuntos e uma restrio !ue serve para junt*-Zos.
' banco de dados pode resolver a consulta acima
de duas formas. " primeira envolve determinar o subconjunto dos empregados e
departamentos !ue obedecem as restries nestes conjuntos. Posteriormente, geramos o
resultado a partir dos dois subconjuntos, respeitando a condio de join. " segunda forma
envolve escol#er um conjunto para iniciar a soluo, por eemplo o de departamentos.
=eterrminamos o subconjunto deste !ue possua a propriedade apresentada Hdeterminada rea
de neg;cioJ. Para cada elemento deste subconjunto, faremos sua associao ao elemento
correspondente no outro conjunto, segundo a condio de join. )inalmente, verificamos se o
registro formado possui a restrio no outro conjunto. " primeira forma de soluo c#amada
de sort*merge )oin. " segunda c#amada de nested*loops.. + banco de dados sempre usa
uma destas duas tcnicas para resolver consultas em mRltiplas tabelas. Ele pode mesmo,
combinar as duas.
4a maioria dos casos, o mtodo de nested1loops apresenta mel#ores resultados. Ern alguns
casos compleos, o sort1merge indicado.
2uter join
2.outer join&ou juno e!tema( um caso particular do join. /uando se fa% um join
simples, a impossibilidade de se encontrar em alguma tabela um registro associado ao resultado
intermedirio anterior, determina !ue o join no retomar nen#uma informao.
/uando uma tabela entra no join atravs de um outer join, !uando no #ouver registros na
tabela associados ao resultado intermedirio, urna lin#a imaginria ser adicionada 9 tabela em
!uesto, contendo valor nulo para todos os seus campos. Esta lin#a ser juntada aos registros de
resultado intermedirio, compondo o novo resultado intermedirio.
?m 'uter join no causa uma lentido de processamento muito maior !ue a de um
join.
#ub #elect
'utro mito !ue ronda a construo de */0 di% !ue mel#or usar *ub *elect do !ue
usar um join. =ependendo de !uem reprodu% o mito, a situaao se inverte, e o join passa
a ser mel#or !ue o *ub *elect. 4a verdade, deve-se fa%er uma anlise caso a caso. "s
duas tcnicas podem inclusive, serem e!uivalentes.
Xejamos o eemplo@
select campo1
from tabela1
A#ere campo+ in H*elect campo+
from tabela+ A#ere campoC - constanteJ
e
select campol
from tabelal, tabela+
A#ere campoC - constante and
tabela1.campo+ 3 tabela+.campo+
4este caso, primeiro devemos notar !ue as duas consultas s; so e!uivalentes se #ouver
unlc(dade nos valores do carnpo,. $aso contrrio, pode #aver diferena de resultados, !uanto ao
nRmero de registros retornados. .magine !ue as duas tabelas ten#am tr8s registros cada uma,
todos com o mesmo valor para carnpo+ Hna tabelalJ e o mesmo valor para campo, Hna tabela+J.
.magine tambm !ue todas as lin#as da tabelal ten#am o mesmo valor para campo 1. 4o caso da
sub select, a consulta retorna tr8s lin#as como resultado. 4o caso do join, retorna Q lin#as.
Portanto, para serem e!uivalentes de fato, necessrio !ue eista unicidade nos valores de
campo, J.
*e #ouver a un(cidade, o uso do sub select . ou join Hcom relao 9 perforrnanceJ
absolutamente e!uivalente. =e fato, para resolver esta consulta, em !ual!uer dos dois casos, o
banco de dados ir determinar os registros da tabela+ !ue possuem &campoC - constanteM. .r
recuperar ento o valor de campo, para estes registros. Para cada valor, obter os registros da
tabelal com campo+ igual a este valor. 's valores de campo1 nestes registros comporo os
conjuntos resultados.
Xejamos unia situao onde precisamos saber todas as notas fiscais !ue conten#am
itens fabricados por um determinado fornecedor, em um determinado dia.
*ub *elect@
select num nota
from notas )iscais
A#ere data-emissao - constante and eists Hselect MM
from produtos , itens-nota
A#ere produtos.num-nota - itens-nota.num- nota and
produtos.produto - itens-nota.produto and
fornecedor - constanteJ
Woin@
select distinct num - nota
from produtos , itens - nota , notas-fiscais
A#ere notas-fiscais.data-emissao - constante and
itens-notas.num-nota - notas-fiscais.num-nota and
produtos.produto - itens-nota.produto and
produto.fornecedor - constante
Eiste uma diferena aprecivel de performance entre as duas consultas. 4ote !ue, o importante
saber se eiste pelo menos um item de uma nota fiscal associado a um determinado fornecedor.
4o necessrio determinar todos os itens deste fornecedor. Este o ponto onde a consulta com
join torna-se pior, em termos de performance !ue a consulta com sub select. 4ote !ue a data da
nota foi inclu(da para ser um fato seletivo e justificar o eemplo. *e no #ouvesse tal restrio, o
jeito certo de construir a consulta seria determinar todos os produtos do fornecedor, depois os
itens de nota com este produto e finalmente as notas correspondentes. =esde, claro, !ue um
fornecedor seja ra%oavelmente seletivo. 4este caso, ter(amos um eemplo onde join mel#or do
!ue sub select. "penas por uma diferena sutil de eist8ncia de um critrio de data.

Você também pode gostar