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.