Вы находитесь на странице: 1из 9

UNIVERSIDADEFEDERALDESOCARLOS

CAMPUSSOROCABA
BACHARELADOEMCINCIADACOMPUTAO

LaboratriodeBancodeDados
SahudyMontenegroGonzlez
ProjetoInterdisciplinarFaseFinal
Grupo5TipodeLicitao+Naturezadadespesa

CarolinaKazumiWatanabe
HlioOssamuNakayama
RafaelDanilodosSantos

FaseFinal/08062015

ndice

1.Descriodoprojeto.......3
2.EspecificaodeconsultasemSQL...3
3.TcnicasdeacessoeficienteaoBancodeDados....4
3.1.Consideraesparaotimizarconsultas....5
4.ProgramaocomBancodeDados.6
4.1.StoreProcedures.6
4.2.Trigger.7
4.3Viso.8
5.Outrasinformaessobreoprojeto.8
6.Consideraesfinais.......9

1.Descriodoprojeto

Paraoprojetodelabortoriodebancodedados,nosfoipropostoaconstruodeuma
aplicaosobreumbancodedados,prontamentefornecidopeladisciplina,visandoo
entendimentodeconceitoscomo
index
,
storedprocedures
,
trigger
e
viso
.
Entretanto,devemosnosfocaremduastabelasdessebancoqueso:
tipodelicitao
e
natureza
.Comopodemosutilizarasoutrastabelas,casofossenecessrio,entoutilizamos
atabela
despesa
paraaelaboraaodasnossasconsultas.
Aseguir,temosadefiniodessasconsultasjuntamentecomosseusrespectivos
cdigosemlinguagem
SQL
,algumastcnicasutilizadasparaotimizaressasconsultasea
documentaodos
index,storedprocedures,trigger
e
viso
quedevemos
aplicarnoprojeto.

2.EspecificaodeconsultasemSQL

Consulta1:
Nestaconsultafazemosumajunoentreastabelas
despesa
e
natureza
.nesta
consulta,tambm,quefazemosumabuscarelativaatravsdaclusula
ILIKE
emrelaoao
campo
natureza.descricao
eumparametro
natu
recebidocomoentradadedadosdo
usurio,almdoparametro
<indice>
e<
qtd>
.
selectvalor,descricaoorgao,descricaodominio,cpfcnpjcredor,
natureza.descricaofromdespesa,natureza
wherenatureza.codigo=despesa.codigonatureza
andnatureza.descricaolike%<natu>%offset<indice>limit
<qtd>

Consulta2:
Naconsultaaseguirutilizamosasfunesdeagregao
sum,avg,variance,
stddev,min
e
count
do
postgresql

sobreastabelas
despesa
e
tipolicitacao
,de
maneiraque,atravsdeumajunonaturaledeumagrupamentoobtemostodosos
resultadosdessasfunesseparadaspelocdigoda
licitao
.Finalmente,atravsdeum
valorfornecidopelousuario,verificamosquaistuplaspossuemo
max
superioraestevalor.No
entanto,esteultimopassoaplicadosomenteavisomaterializada
estatisticas
que
iremosexporposteriormente.Recebeosparametros
<indice>
e<
qtd>
.
Abaixo,temseaconsulta2semvisomaterializada:

selectsum(despesa.valor),max(despesa.valor),
avg(despesa.valor),variance(despesa.valor),
stddev(despesa.valor),min(despesa.valor),

count(tipolicitacao.descricao),tipolicitacao.descricaoas
Licitacaofromdespesa,tipolicitacao
wheredespesa.codigotipolicitacao=tipolicitacao.codigo
groupbytipolicitacao.codigooffset<indice>limit<qtd>

3.TcnicasdeacessoeficienteaoBancodeDados

Consulta1:
createindexidx_naturezaonnatureza(descricao)

Paraestaconsulta,ootimizadornochegaautilizaroindiceacimapoisocampo
descriode
natureza
possuiseusdadosmuitodiferentesunsdosoutros,almdobancode
dadosusadonesseprojetosermuitopequeno.

Consulta2:
createindexidx_valorondespesa(valor)

Nessaconsulta,criamosum
index
paraocampo
valor
databela
despesa
.No
entanto,elepoucoutilizadoporduasquestes,aprimeiraumacaractersticamuito
especificadoatualconjuntodedadosnaqualelepossuipoucosdadoseportantoparao
otimizadordo
postgresql
novaleapenausarosndices,sendomaisvantajosocarregar
todooconjuntodedadoseassimfazerumavarreduraemtodosovalores.Aoutraquesto
queaconsultaemparticularfazusodevariasfunesdeagregaoquespodemser
calculadasvarrendotodososcampos.Emcasosondeoconjuntodedadosmaiorqueo
utilizadoparaodesenvolvimentodestetrabalho,ootimizadordo
postgres
podeutilizaro
indiceordenadodocampo
valor
paracalcularmaisfacilmenteo
min()
eo
max()
dos
componentesdessatabela,bastandopegaroprimeiroeoultimocampodosvalorespara
retornaressescampos.Noentanto,paraganharmaisdesempenhonessaconsulta,utilizamos
umavisomaterializada,naqual,guardaseosvaloresdessaconsultaemumatabelafsica
paraumacessomaisrpido.MaisinformaesdetalhadasconsulteapartedeVisesdesse
documento,nasesso4.3.

PLANODEEXECUO

Consulta1*
procurandocomoparametro{con}em
natureza.descricao

HashJoin(cost=1.40..2452.75rows=1090width=356)(actualtime=0.091..14.869
rows=25931loops=1)"
HashCond:(despesa.codigonatureza=natureza.codigo)"
>SeqScanondespesa(cost=0.00..2313.78rows=33778width=142)(actual

time=0.008..4.603rows=33778loops=1)"
>Hash(cost=1.39..1.39rows=1width=222)(actualtime=0.074..0.074rows=4loops=1)"
Buckets:1024Batches:1MemoryUsage:1kB"
>SeqScanonnatureza(cost=0.00..1.39rows=1width=222)(actual
time=0.022..0.072rows=4loops=1)"
Filter:((descricao)::text~~*'%con%'::text)"
RowsRemovedbyFilter:27"
Totalruntime:15.383ms"

Consulta2*
HashAggregate(cost=3455.06..3455.27rows=12width=228)(actualtime=127.632..127.737
rows=12loops=1)
>HashJoin(cost=1.27..2779.50rows=33778width=228)(actualtime=0.045..21.785
rows=33778loops=1)
HashCond:(despesa.codigotipolicitacao=tipolicitacao.codigo)
>SeqScanondespesa(cost=0.00..2313.78rows=33778width=10)(actual
time=0.004..6.857rows=33778loops=1)
>Hash(cost=1.12..1.12rows=12width=222)(actualtime=0.029..0.029rows=12
loops=1)
Buckets:1024Batches:1MemoryUsage:1kB
>SeqScanontipolicitacao(cost=0.00..1.12rows=12width=222)(actual
time=0.021..0.023rows=12loops=1)"
Totalruntime:127.858ms

VisoMaterializadadaConsulta2*
SeqScanonestatisticas(cost=0.00..11.80rows=180width=418)(actualtime=0.004..0.005
rows=12loops=1)
Totalruntime:0.024ms

*Notaasconsultasforamrealizadassemooffsetouodolimitpara
queanalisededesempenhopudesseserfeitaemumasituaode
estresse

3.1Consideraesparaotimizarconsultas

Aoobservarobancodedadosfornecido,vemosque,inicialmente,noha
necessidadedemudarostiposdosatributosdatabela.Casootipodacolunavalorfossedo
tipo
inteiro
,entopoderamostransformloparaotipo
real
.Comoovalorjseencontra
em
real
,entorealmentenonecessitamosdessamudana.

Comrelaoacamposnulos,vemosalgunscasosonde
datadia
ou
datams
realmenteestonulos.Pororaissonoirafetarmuitooresultadofinalmesmoporque
deixamosdeutilizaralgumatributoqueenvolvadatas.
Nadefiniodatabela
despesa
,utilizadaaclausula
MATCHSIMPLE
.Aclausula
MATCHSIMPLEutilizadajuntamentecomaclausulaREFERENCESjustamenteparaqueo
atributoqueutilizaessaclausularecebatodososdadosconcatenadosdatabelaqueele
referencia.Noprojetoemquesto,hvariasaplicaesdessaclusula.Noprojeto,atabela
despesapossuivriosatributosquereferenciamoutrastabelaspormeiodeMATCHSIMPLE.
Noentanto,comoutilizamosaschavesestrangeiras,vistonaconsulta1em[Especificaode
consultasemSQL],estasclausulaspodemserignoradas
.

4.ProgramaocomBancodeDados
4.1StoreProcedures

StoreProcedure1:
Devidoaimpossibilidadedeotimizara
consulta2
utilizandoamaneiratradicional,
atravsdousodendices,amelhorsoluoencontradafoicriarumavisomaterializadapara
utilizaressaconsulta.Contudo,noexistemgicanacomputao,osvaloresguardadosna
visomaterializada
estatisticas
algummomentoteroqueseratualizadaparamantera
suaconsistncia.Eumadasalternativasseriacriaruma
trigger
quepudesseatualizaratabela
emumadeterminadasituaoquefossefavorvelequenogerasseumgargalonosistema.
Devidoalimitaesdo

postgresql
asopesdedispararuma
trigger
emum
determinadotempoouassincronamentonoexistem,edispararatodaequalquermudana
nastabelasconsultadaspela
consulta2
noumaopovivel,poisnesseconjuntodados
inserespodeocorreratodoequalquermomento.Entodevidoaissofoicriadoa
stored
procedure1
paraaaplicaochamlasquandoforimprescindvelqueosdadosestejam
atualizado,almserpossvelparaaaplicaodisparardetemposemtemposaatualizaoda
visomaterializada.

createorreplacefunctionatualiza_estatistica()
returnsbooleanas$$

BEGIN

refreshmaterializedviewestatisticas
raisenotice'avisomaterializadaestatualizada'
returntrue

END
$$languageplpgsql

StoreProcedure2:
Foicriadoa
storeprocedure2
paraconverteroscampos
maximo
davisao
estatistica
.

createorreplacefunctionconverte_dolar(numeric,numeric)
returnsrealas$$
BEGIN
if$2=0then
return0
endif
return$1/$2
END

$$languageplpgsql

4.2Trigger

Paraesseconjuntodedadosainspiraoparafoitentarimplementarumpequeno
log
deatividadesqueocorremnastabelas
despesa
,
natureza
e
tipolicitacao
.
Porissofoi
acrescentadonoconjuntodedadosumanovatabelacomosseguintescampos:

createtablelog(lugarvarchar(16),ultima_alteracaotimestamp,
quantidade_de_vezesint,usuariovarchar(64))

Ecomaseguinteinsero.

insertintolog(lugar,ultima_alteracao,quantidade_de_vezes,
usuario)values('servidor',now(),0,current_user)

Todavez,queocorreumainseronastabelascitadas,uma
trigger
chamadaegravaos
natabela
log
:

createorreplacefunctionatualiza_log()returnstriggeras$$
BEGIN
updatelogsetultima_alteracao=now(),usuario=
current_user,quantidade_de_vezes=quantidade_de_vezes+1
wherelugar='servidor'
returnnull
END
$$languageplpgsql
updatelogsetultima_alteracao=now(),usuario=current_user
wherelugar='servidor'

Eaquiestoos
triggers
:
createtriggertatualiza_logafterinsertorupdateordeleteon
naturezaexecuteprocedureatualiza_log()

createtriggertatualiza_log2afterinsertorupdateordeleteon
despesaexecuteprocedureatualiza_log()

createtriggertatualiza_log3afterinsertorupdateordeleteon
tipolicitacaoexecuteprocedureatualiza_log()

4.3Viso

Comojmencionadoemoutrassessesdessedocumento,paramelhoraro
desempenhoda
consulta2
foicriadoumavisomaterializadaparaelacomointuitodeobter
umaformadeotimizaoparatalconsulta.Nasvisesmaterializadas,temosumatabelafsica
quearmazenartodososdadosdaconsulta2equefuncionacomoumatabelaqualquer,com
adesvantagemdeterdeseratualizadaconformeobancosealterecominseres,alteraes
eexcluses.
Assim,comessatabela,nscriamosumaformadememorizaoondeoreclculodas
funespormeiodaconsulta2setornadesnecessria.
Aseguirtemosadefiniodavisomaterializada:

creatematerializedviewestatisticasas
selectsum(despesa.valor), max(despesa.valor),
avg(despesa.valor),variance(despesa.valor),
stddev(despesa.valor),min(despesa.valor),
count(tipolicitacao.codigo),tipolicitacao.descricaoasLicitacao
fromdespesa,tipolicitacao
wheredespesa.codigotipolicitacao=tipolicitacao.codigo
groupbytipolicitacao.codigo

5.Outrasinformaessobreoprojeto
Porsetratardeumprojetosomentedadisciplinadelabortoriodebancodedados,
entocolocamosmaisnfasedaaplicaoemconceitosdebancodedadosvistoemsalade
aula.Aoutilizaro
site
,podeseverquenohumgrandeusoderecursoscomo
javascript
e
ajax
quetornamainterfacemenospassvelaerrosemaisricaemtermosde
usabilidade.
Entretanto,humainterfacelevementeprojetadaem
html
,
css
e
java
quemostra
osdadosdeacordocomasconsultasdefinidasanteriormente.
J,paraaconexodo
site
emsicomobancodedadosfornecido,precisamosdeum
conectorchamado
JDBC
.Comele,podemosreceberastuplasqueestopresentesnobanco
atravsdoenviodecodigos
sql
.Almdesseconector,precisamosadaptaro
java
para

adequartalconectoraplicao.Paraisso,temosaclasse
ConnectionFactory
aqual
possuiinformaescomoonomedobancodedados,ousuarioesenha,todasimportantes
paraqueaconexosejaestabelecida.
Porltimo,podemosdizerqueoprojetofoidesenvolvidosegundoo
MVC,
oqualno
necessrioparaesteprojeto,masofizemosparatornaroprojetomaislegvelefcildeimpor
umaeventualmanuteno.

6.Consideraesfinais
Aodesenvolvermosoprojetoemquesto,vimosoquantopodesertil,emquestode
otimizaodetempo,ousode
visesmaterializadas.
Almdisso,vimoseutilizamos
tambmoconceitode
index
.Noentanto,aoaplicarmosesseconceitoaobanco,pouco
conseguimosobservarpoisootimizadordo
postgres
sempreoptavapornoutilizaros
ndicescriados.

Вам также может понравиться