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

Contedo sobre Modelagem

Sumrio
06 Modelo de dados para anlise de informaes educacionais
[ Pricles Magalhes e Rodrigo Oliveira Spnola ]

Artigo no estilo Soluo Completa, Artigo no estilo Mentoring

14 Melhoria de desempenho utilizando estatsticas e ndices


[ Fabio Sarturi Prass ]

Contedo sobre Boas Prticas

24 Conhecendo e evitando problemas com transaction log


[ Michael Miguel Antunes ]

Artigo no estilo Soluo Completa

32 Como definir um Data Warehouse na prtica usando Transact SQL


[ Adriano Geraldo Dias Ferreira ]
Feedback
eu
s
D

sobre e
Artigo no estilo Mentoring

46 Como usar corretamente Bind Variables


s
ta
[ Ricardo Rezende ] edio

D seu feedback sobre esta edio!


Contedo sobre Boas Prticas
A SQL Magazine tem que ser feita ao seu gosto. Para
52 Conhea prticas de controle de bugs no banco de dados isso, precisamos saber o que voc, leitor, acha da
[ Mauro Pichiliani ] revista!
D seu voto sobre esta edio, artigo por artigo, atra-
vs do link:
www.devmedia.com.br/sqlmagazine/feedback
Contedo sobre Boas Prticas

59 Como integrar SQLite em aplicaes C++


[ Flvio Jos Vodzinski ]
Assine agora e tenha acesso a
todo o contedo da DevMedia:
www.devmedia.com.br/mvp

130 Edio - 2015 - ISSN 1677918-5 - Impresso no Brasil

EXPEDIENTE Fale com o Editor!

muito importante para a equipe saber o que voc est achando da


Editor Atendimento ao leitor revista: que tipo de artigo voc gostaria de ler, que artigo voc mais
gostou e qual artigo voc menos gostou. Fique a vontade para entrar
Rodrigo Oliveira Spnola (rodrigo.devmedia@gmail.com) A DevMedia possui uma Central de Atendimento on-line, onde voc em contato com os editores e dar a sua sugesto!
pode tirar suas dvidas sobre servios, enviar crticas e sugestes e Se voc estiver interessado em publicar um artigo na revista ou no site
Subeditor SQL Magazine, entre em contato com os editores, informando o ttulo e
falar com um de nossos atendentes. Atravs da nossa central tambm
Eduardo Oliveira Spnola mini-resumo do tema que voc gostaria de publicar:
possvel alterar dados cadastrais, consultar o status de assinaturas
Consultora Tcnica e conferir a data de envio de suas revistas. Acesse www.devmedia. Rodrigo Oliveira Spnola - Editor da Revista
Daniella Costa (daniella.devmedia@gmail.com) com.br/central, ou se preferir entre em contato conosco atravs do rodrigo.devmedia@gmail.com
telefone 21 3382-5038.
Jornalista Responsvel
Kaline Dolabella - JP24185 Publicidade rodrigo Oliveira Spnola
publicidade@devmedia.com.br 21 3382-5038
Capa e Diagramao Editor Chefe da SQL Magazine, Mobile
Romulo Araujo e Engenharia de Software Magazine.
Anncios Anunciando nas publicaes e nos sites do Grupo DevMedia,
voc divulga sua marca ou produto para mais de 100 mil desenvolvedores Professor da Faculdade Ruy Barbosa,
Distribuio de todo o Brasil, em mais de 200 cidades. Solicite nossos Media Kits, com uma instituio parte do Grupo DeVry.
FC Comercial e Distribuidora S.A detalhes sobre preos e formatos de anncios. Doutor e Mestre em Engenharia de
Rua Teodoro da Silva, 907
Software pela COPPE/UFRJ.
Graja - RJ - 206563-900
Modelo de dados para
anlise de informaes
educacionais
C Fique por dentro
onstruir um conjunto de atributos genricos
e teis em aplicaes de minerao de dados
educacionais uma atividade complexa e Trabalhos de minerao de dados educacionais necessitam de uma
muitas vezes limitada pelas informaes disponveis estrutura padronizada e homognea de forma a permitir anlises das
nas bases de dados de instituies de ensino. Alm informaes disponibilizadas. O modelo de dados apresentado neste
disso, importante definir tambm qual ser o foco artigo busca estabelecer conceitos comuns na anlise de situaes
do modelo de dados identificando claramente qual problema educacionais, alm de possuir uma estrutura que permite
ser o seu uso. maior produtividade na seleo de dados para minerao, uma vez
Neste contexto, o modelo de dados apresentado nes- que seu conjunto de entidades e atributos, devidamente justificados,
te artigo define os principais pontos de observao facilita a identificao dos fatores mais relevantes nas diversas situa-
considerados importantes em estudos sobre evaso de es problemas analisados.
estudantes atributos do estudante anteriores ao seu
ingresso, informaes sobre seu comprometimento em
graduar-se e seu esforo de estudo, a sua experincia
com a instituio, tanto no aspecto acadmico quanto na des, sua prontido em pagar as mensalidades e seu grau de
sua integrao social e, finalmente, seus resultados na adimplncia so exemplos de atributos que registram o seu
aprendizagem. Sero considerados atributos relaciona- esforo no curso.
dos aos estudantes, como indivduos, tais como: Do ponto de vista da experincia institucional, podemos iden-
Sexo, idade, caractersticas e limitaes fsicas; tificar caractersticas do curso escolhido tais como:
Dados relativos localizao geogrfica de sua A sua natureza (bacharelado, licenciatura, graduao tecnolgi-
residncia; ca), a rea da cincia na qual o curso est inserido, a modalidade
Dados sobre seu histrico familiar, como estado civil, do curso;
profisso e formao dos pais, renda familiar; Sua durao, sua periodicidade de integralizao, a quantidade
Dados sobre seu histrico escolar e profissional, como de disciplinas cursadas simultaneamente;
o seu grau de escolaridade, sua origem escolar (se pro- Caractersticas fsicas das instalaes frequentadas, tais como
veniente de instituio pblica ou privada), eventuais a sua localizao geogrfica, quantidade e qualidade dos recur-
graduaes anteriores, situao laboral. sos disponveis (ar condicionado, cadeiras, projetores, acesso
internet, laboratrios);
O comprometimento do estudante com o objetivo Caractersticas do estudante no curso, como:
de se graduar inicia no seu processo de ingresso na - Seu vnculo financeiro (se pagante ou bolsista), seu grau de
instituio, acompanhando-o durante todo o seu cur- adimplncia, sua prontido em quitar os dbitos;
so. Podemos identificar como atributos desse grupo - Sua frequncia nos mecanismos disponibilizados, sejam eles
o tipo de ingresso no curso (se veio atravs de uma em sala de aula ou em ambientes virtuais, seu nvel de parti-
transferncia, como portador de diploma ou atravs cipao nas atividades e recursos de interao;
de concurso), o resultado obtido (caso tenha ingres- - Participao em eventos extracurriculares;
sado por concurso), a sua prontido em matricular-se, - Seus resultados acadmicos, como quantidade de disciplinas
uma vez aprovado. Durante o curso, sua frequncia pendentes (reprovaes) e disciplinas concludas, quantidade
de participao nas disciplinas cursadas e ativida- de perodos (semestres, trimestres) concludos.

6 SQL Magazine Edio 130


A definio de um modelo de dados comum para minerao Ainda na classe de atributos relativos ao ingresso, a predisposi-
de dados na rea educacional deve pressupor as suas possveis o do estudante em efetivar a sua matrcula pode apontar a sua
utilizaes em diferentes situaes-problema e instituies. Um motivao em frequent-lo. Para aferir informaes a esse respei-
modelo, para ser genrico, deve conter os elementos mnimos to, o esquema prope a utilizao de um atributo que indique o
necessrios para ser utilizado em pesquisas e trabalhos que nvel de antecipao do estudante na efetivao de sua matrcula
busquem investigar questes, no apenas acadmicas, mas no curso/instituio. Para tanto, deve-se calcular e registrar a
tambm de carter administrativas dos estudantes e instituies quantidade de dias resultante da subtrao entre a data final do
analisados. prazo para matrcula e a data da realizao da matrcula maio-
res antecipaes tero valores mais altos enquanto que eventuais
Definio do esquema de dados matrculas aps o prazo (em casos em que a instituio permita)
O esquema de dados proposto estratifica os atributos dos es- apresentaro valores negativos.
tudantes de acordo com sua natureza no problema abordado, ao Dados relativos a ingresso podem ser teis na definio de cam-
mesmo tempo em que so apontadas as principais dimenses de panhas publicitrias voltadas captao de estudantes, estabele-
qualidade que os dados armazenados nesses atributos devem cendo segmentaes do pblico-alvo, na oferta de novos cursos ou
possuir para proporcionar os melhores resultados nos trabalhos produtos educacionais com caractersticas que venham a atender
de minerao realizados. a esse cliente em potencial, alm de fornecer informaes bastante
A seguir, so apresentados os atributos dos estudantes segmen- relevantes sobre predisposies de estudantes em permanecer no
tados por sua natureza: curso em que se matriculou.
Atributos relativos forma de ingresso na instituio, tais como
tipo de ingresso e nota obtida ao ingressar; Atributos Socioeconmicos
Atributos socioeconmicos, como sexo, estado civil, faixa etria, Os dados de natureza socioeconmica esto entre os mais fre-
nvel escolar, renda familiar; quentes em anlise de perfis nas mais diversas reas. No contexto
Atributos financeiros, que indicam a relao e a situao finan- educacional, podem contribuir para inmeras inferncias nos
ceira dos estudantes com a sua instituio de ensino; processos decisrios. Informaes sobre Sexo, Idade e Estado Civil,
Atributos acadmicos, que revelam a atuao e o desempenho por exemplo, do estudante podem estabelecer perfis comporta-
dos estudantes nos seus cursos; mentais para aes segmentadas. O esquema proposto oferece
esses atributos, assumindo valores especficos dentre opes
Atributos Relativos ao Ingresso no Curso pr-estabelecidas Sexo, masculino ou feminino; Estado Civil,
Pouco considerados nas pesquisas realizadas para minerao solteiro, casado, separado ou vivo.
de dados educacionais, os dados sobre o ingresso do estudante So propostos, tambm, atributos que indiquem o grau de escola-
no curso podem revelar informaes importantes em processos ridade do estudante (2 grau completo, curso tcnico, graduado ou
de tomada de deciso de gestores acadmicos ou administrativos ps-graduado), assim como a sua procedncia escolar, indicando
de instituies de ensino superior. Muitas vezes, por exemplo, se veio de uma instituio pblica ou privada.
dificuldades de desempenho acadmico de estudantes podem No que se refere situao econmica do estudante so propos-
ter origem no grau de facilitao que tiveram ao ingressaram nos tos dois atributos. O primeiro, indicando a renda referencial da
seus cursos, como um baixo nvel de dificuldade nas provas de famlia do estudante, em valores discretos de faixas de salrios
vestibular ou uma matrcula sem prova ou teste de aptido. mnimos e outro, indicando a situao laboral do estudante,
A definio dos atributos relativos ao ingresso dos estudantes informando se o mesmo est desempregado, empregado, se
no curso/instituio para o esquema proposto toma por base as autnomo ou empresrio.
informaes a respeito do tipo de ingresso na instituio. Dentre Ainda no grupo de atributos socioeconmicos, so definidos no
as possibilidades existentes tem-se: prova de vestibular, prova esquema proposto indicaes de municpio e bairro residencial,
de ENEM (exame nacional do ensino mdio), matrcula especial comercial e da localizao das instalaes que frequenta, sejam
para portadores de diploma superior, transferncia de outro curso num campus ou polo de apoio presencial para cursos EAD. Todos
na mesma instituio (interna) ou de outra instituio (externa). esses atributos devem ter seus dados tratados de maneira que
Alm disso, deve-se registrar o momento cronolgico do ingresso seus valores sejam informados a partir de listas de valores pr-
do estudante para as anlises. estabelecidos, evitando formas de preenchimento distintas para
Em algumas das possibilidades de estudo que utilizem o modelo a mesma informao.
proposto, a informao se o curso no qual est matriculado o aluno
foi a sua opo principal pode ter relevncia. Atributos Financeiros
Para estudantes que tenham ingressado atravs de um concurso Mais atraentes para gestores de cursos em instituies de ensino,
(prova), deve-se buscar o registro de seu desempenho nessa prova. por seu carter eminentemente administrativo, valores de nature-
Para uma aferio homognea, prope-se um registro percentual za financeira pouco tm sido utilizados nas pesquisas estudadas,
da nota obtida sobre a nota mxima possvel na avaliao. cuja natureza destina-se mais para questes acadmicas.

Edio 130 SQL Magazine 7


Modelo de dados para anlise de informaes educacionais

O esquema proposto apresenta um conjunto de quatro atributos A caracterizao do curso tambm pode fazer emergir relaes
de natureza financeira com capacidade de produzir informaes importantes nos dados analisados. O nosso modelo prope as
necessrias a processos de tomada de deciso de gestores em classificaes de tipo entre bacharelado, licenciatura e tecnol-
instituies de ensino. Inicialmente prope-se o armazenamento gico; de modalidade, entre presencial ou distncia EAD; e de
da indicao do tipo de vnculo financeiro entre o estudante e a escola, entre cincias exatas/tecnolgicas, biolgicas/de sade e
instituio, dentre as opes pagante ou bolsista, propondo, humanas/sociais.
ainda uma subdiviso deste ltimo entre bolsa PROUNI, FIES ou Trs indicadores quantitativos so propostos para o momento
bolsa da prpria instituio. do recorte dos dados dos estudantes analisados um para a
Um possvel indicador do comportamento do estudante, de natu- quantidade de disciplinas cursadas no perodo, outro para a quan-
reza financeira, est no seu hbito de pagamento. Sugere-se o cl- tidade de disciplinas pendentes com alguma reprovao prvia
culo e armazenamento do tempo mdio, em dias, de antecipao e um terceiro que permita armazenar a quantidade de perodos
no pagamento das mensalidades dos estudantes. Definimos como j concludos, independente se o curso integralizado por ano,
valor de antecipao subtrao entre a data de vencimento da semestre ou trimestre.
mensalidade e a data do seu pagamento. Dessa forma, pagamen- Em relao aos indicadores de participao e desempenho, so
tos antecipados tero valores positivos e pagamentos atrasados, propostos atributos que traduzam de maneira linear e indepen-
valores negativos. Calcula-se e armazena-se a mdia histrica dente das disciplinas cursadas, o comportamento do grupo ana-
desse valor para cada estudante analisado. lisado. Prope-se o registro dos valores limtrofes de participao
Atributos para armazenamento do nvel de endividamento dos e desempenho com o maior e o menor percentual de frequncia
estudantes tambm so sugeridos no esquema um primeiro dentre as disciplinas cursadas, assim como a menor e a maior
quantitativo, que calcule e armazene a quantidade de mensalida- nota global obtida entre essas disciplinas.
des vencidas e no pagas de cada estudante analisado no momento
atual e um segundo de natureza mais qualitativa indicando, do Modelo de dados para minerao de dados educacionais
montante do valor monetrio faturado a cada estudante, qual o A partir das consideraes feitas, foi desenvolvido um modelo
percentual pendente, em dbito. de dados para a construo de data sets voltados minerao de
Anlises financeiras, assim como anlises socioeconmicas, po- dados educacionais, representado pelo diagrama de entidade e
dem trazer tona caractersticas que definem perfis de estudantes relacionamento (DER) da Figura 1.
em um curso ou em uma instituio de ensino. Se analisados em No modelo de dados proposto, so utilizadas nove entidades
conjunto com outras dimenses de atributos, valores financeiros que representam os elementos e atributos identificados. Note que
podem determinar relaes de causa e efeito entre atributos Matricula a tabela central do modelo. Em torno dela as demais
que, a princpio, no aparentam estar relacionados mostrando, por tabelas do modelo foram criadas. Nesta tabela esto definidas
exemplo, a relao entre o nvel de endividamento de estudantes todas as informaes relacionadas ao ingresso do estudante em
com seu desempenho acadmico ou, ainda, o que influencia mais uma instituio. O relacionamento definido entre as entidades
frequentemente na deciso de estudantes em evadir de seus cur- Matricula e Estudante de N:1 onde um estudante pode ter N ma-
sos, se seu desempenho acadmico ou sua dificuldade em cumprir trculas e cada matrcula pode pertencer a apenas um estudante.
com suas obrigaes financeiras. Este relacionamento foi definido entre os atributos EstudanteID
(chave estrangeira da tabela Matricula) e EstudanteID (chave pri-
Atributos Acadmicos mria da tabela Estudante). Um relacionamento semelhante pode
Os dados de natureza acadmica esto presentes na maioria ser observado entre as tabelas Matricula e Instalacao, que indica
dos estudos realizados em trabalhos de minerao de dados que cada matrcula (chave estrangeira InstalacaoId) est associada
educacionais uma vez que trazem, normalmente, informaes a uma instalao (chave primria InstalacaoID) de uma instituio,
diretas sobre o aprendizado dos estudantes. Desempenho e par- definindo tambm um relacionamento de 1 para muitos entre as
ticipao em atividades acadmicas so os principais elementos tabelas Instalacao e Matricula. Observe tambm que Instalacao
nessas anlises. uma tabela cujo objetivo associar as entidades Matricula e
O esquema proposto traz, alm desses, sugestes de atributos Instituicao. Como uma instituio pode ter vrias instalaes
que podem acrescentar novas anlises ao vis acadmico. Assim (relacionamento de 1 para muitos entre as chaves InstituicaoId
como no grupo de atributos relativos ao ingresso no curso, o grupo de Instalao e InstituicaoId de Instituicao), ela permite associar
de atributos acadmicos demanda o registro de um identificador uma matrcula a uma unidade de uma instituio.
temporal do momento em que os dados esto sendo registrados de Prosseguindo com a anlise do modelo criado, podemos obser-
forma a permitir separar informaes em momentos distintos. var que uma instituio pode ofertar N cursos. Esta possibilidade
A utilizao de um atributo que indique a situao acadmica mapeada no relacionamento de 1:N entre as entidades Instituicao
do estudante, entre matriculado ou evadido (cancelado, trancado e CursoOfertado atravs da chave instituicaoId. O CursoOfertado
ou em abandono), proposta no esquema em questo permitindo por sua vez definido a partir de uma lista de cursos existentes
inferir sobre estudantes ativos ou inativo. da instituio. Estes cursos so definidos na tabela Curso.

8 SQL Magazine Edio 130


Cada curso pode ser ofertado N vezes, o que representado no normalizado. A normalizao, neste caso, traria um nmero maior
diagrama pelo relacionamento entre as tabelas Curso e Curso- de tabelas o que poderia aumentar a complexidade das consultas
Ofertado atravs da chave CursoId. Ainda sobre a tabela Curso- realizadas e o tempo necessrio para seu processamento.
Ofertado, temos que cada instncia dela pode estar relacionada Depois do entendimento sobre como o modelo foi criado, a partir
a uma ou mais disciplinas, conforme definido no relacionamento de agora sero apresentadas em detalhes cada uma das entidades
de 1:N entre as tabelas CursoOfertado e Disciplina atravs da definidas assim como seus respectivos atributos e chaves.
chave CursoId.
As disciplinas, por sua vez, podem ser cursadas por estudantes Instituio
matriculados na instituio. Para possibilitar o mapeamento desta Representa os atributos diretamente relacionados a cada Ins-
informao, foi definida a tabela DisciplinaCursada e foi criado tituio de Ensino Superior (IES) analisada. Os atributos Tipo
um relacionamento de 1 para N entre Disciplina e DisciplinaCur- e Natureza permitem categorizar as instituies de ensino
sada (atravs da chave disciplinaID) e entre DisciplinaCursada e analisadas de acordo, respectivamente, com suas prerrogativas
Matricula (atravs da chave MatriculaId). Para finalizar a anlise acadmicas e sua natureza jurdica. Uma instituio de ensino
sobre a tabela DisciplinaCursada, definiu-se tambm que ela superior, para funcionar, deve ser credenciada como faculdade,
ocorre em determinados perodos. Dessa forma, foi definido centro universitrio ou universidade, cada qual com diferentes
que 1 Periodo pode conter N disciplinas cursadas atravs de um condies de autonomia e operao. Da mesma forma, uma insti-
relacionamento pela chave periodoID. A Mensalidade paga tam- tuio pode ser classificada de acordo com sua natureza jurdica
bm est associada a um perodo atravs da chave periodoID e a administrativa como pblica - gratuita e mantida pelo poder
uma matrcula especfica atravs do atributo chave matriculaID. pblico (Federal, Estadual ou Municipal); ou privada, seja com
Dessa forma, um aluno com uma matrcula vlida possui uma fins lucrativos ou no.
mensalidade para um determinado perodo do tempo. Igualmente importantes, para efeito dos objetivos do modelo,
Por fim, importante destacar que o modelo de dados definido so os atributos que indicam a localizao geogrfica da institui-
no est normalizado. O fato de no utilizarmos a normalizao se o de ensino representadas na entidade pelos campos Estado
deve ao fato de que sua principal funo ser a de fornecer dados (Unidade Federativa), Cidade e Bairro. Em um modelo normali-
para consultas complexas, considerando uma grande quantidade zado, um nico indicador dentre esses atributos seria suficiente
de dados e sem prejudicar o desempenho. Observe que no obje- para a localizao da instituio uma vez que a relao entre os
tivo do modelo proposto ser a base de um sistema de informao elementos j traria consigo a informao completa um bairro ,
onde existem muitas operaes de incluso e edio de dados. naturalmente, parte de uma cidade que, por sua vez, est locali-
Este conjunto de fatores justifica a escolha por um modelo no zada em um Estado.

Figura 1. Modelo de dados proposto para estudos com minerao de dados educacionais

Edio 130 SQL Magazine 9


Modelo de dados para anlise de informaes educacionais

Para esta tabela, foi definido como chave primria o atributo Um curso pode ser ofertado na modalidade presencial (tradi-
IdInstituio, que se trata de um campo autoincrementado para cional) ou atravs de educao a distncia EAD. Pode ter suas
identificar unicamente cada linha da tabela. disciplinas integralizadas com uma frequncia anual, semestral
ou trimestral, alm de possurem duraes distintas. Um curso
Instalao de Pedagogia, por exemplo, pode ser ofertado na modalidade
Representa os atributos inerentes a cada instalao fsica das presencial, integralizado em seis semestres ou, distncia,
Instituies de Ensino Superior analisadas. Uma nica Instituio integralizado em 14 trimestres, na mesma instituio ou em
de Ensino pode operar em diversos prdios ou instalaes. instituies distintas.
Para efeito de classificao, uma instalao fsica de uma ins- Nesta tabela, definimos como chave primria a coluna IdCur-
tituio de ensino pode ser integrante de seu campus ou uma soOfertado. Ela foi definida como sendo do tipo autoincremento
instalao externa como um polo parte. Pode, tambm, ser de forma a identificar unicamente cada linha da tabela. Alm
prpria, administrada pela prpria instituio ou terceirizada, disso, temos as chaves estrangeiras IdInstituicao e IdCurso para
administrada por outra pessoa jurdica que mantm contrato com possibilitar o relacionamento desta tabela com Instituio e Curso,
a instituio de ensino com esse objetivo. respectivamente.
Similarmente entidade Instituio, devemos registrar a locali-
zao fsica de cada uma de suas instalaes, entendendo que, na Estudante
maioria das vezes, so para esses endereos que os estudantes se Representa os atributos que caracterizam cada Estudante como
dirigem para a realizao de suas atividades presenciais, o que indivduo. O modelo prope o registro dos dados pessoais dos
pode influenciar, de alguma maneira, caractersticas analisadas estudantes analisados, identificando sua data de nascimento,
como seu desempenho no curso ou mesmo a sua permanncia. para clculo da sua idade, seu sexo e estado civil. So inseridos,
Para esta tabela, temos tambm um campo autoincrementado tambm, atributos para registro das localizaes de seu domic-
definido como chave primria (IdInstalacao). Alm dele, temos lio (Estado, Cidade e Bairro residenciais) e de seu trabalho, caso
o campo IdInstiuicao como chave estrangeira que relaciona cada existam (Estado, Cidade e Bairro profissionais). So propostos
Instalao com a sua Instituio de ensino. os registros da sua renda familiar, em quantidades de salrios
mnimos, como referncia homognea e da sua situao laboral,
Curso indicando se o mesmo est economicamente ativo. Nesse caso, so
Representa os atributos inerentes aos diversos cursos existentes sugeridas as opes nunca trabalhou, desempregado, empre-
nas diversas instituies de ensino. Os Cursos de Graduao gado assalariado, profissional autnomo ou empresrio.
atualmente ofertados no Brasil so categorizados em bacharela- O histrico escolar do estudante registrado atravs dos atribu-
dos, que proporcionam a formao necessria para o exerccio tos instituio de origem, que informa se o mesmo proveniente
das profisses; licenciaturas, que habilitam para o exerccio da de uma instituio pblica ou privada; e escolaridade, indicando
docncia em educao bsica (at o ensino mdio); e graduao o nvel de formao do estudante.
tecnolgica, cursos de nvel superior, de menor durao de carter Por fim, temos a chave primria IdEstudante. Novamente defi-
tecnolgico e especfico. nimos a chave como sendo um campo do tipo autoincremento.
Utilizando a classificao da CAPES (Fundao Coordenao
de Aperfeioamento de Pessoal de Nvel Superior), inserimos Periodo
a identificao de rea e subrea do curso, uma vez que existe A entidade Periodo, cuja chave primria o campo do tipo
uma grande diversidade de nomenclaturas de cursos oferecidos, autoincremento IdPeriodo, surge com a necessidade de pontuar
dificultando a sua comparao. A Tabela de reas de Conheci- temporalmente os eventos acadmicos ou administrativos acon-
mento da CAPES dispe de oito grandes reas: Cincias Exatas tecidos.
e da Terra, Cincias Biolgicas, Engenharias, Cincias da Sade, Com uma diversidade de formas de integralizao dos diversos
Cincias Agrrias, Cincias Sociais Aplicadas, Cincias Humanas cursos e instituies de ensino, optou-se por registrar, para cada
e Lingustica, Letras e Artes, cada qual com suas divises. perodo letivo, o ano em que ocorre e um sequencial numrico
Por fim, temos o atributo IdCurso (autoincrementado) definido que o posicione no ano. Dessa forma, caso se trate de um curso
como chave primria da tabela. ofertado semestralmente, uma representao com os valores 2013
para ano e 1 para o sequencial, indicaro o primeiro semestre
CursoOfertado de 2013 e, caso o curso seja trimestral, o primeiro trimestre do
Representa os atributos inerentes aos diversos cursos oferecidos mesmo ano e assim sucessivamente. De forma complementar, so
por cada uma das instituies de ensino. Os diversos cursos exis- identificadas as datas de incio e final do perodo letivo.
tentes podem ser ofertados de maneira distinta em cada instituio
de ensino superior. A entidade CursoOfertado visa identificar o for- Matricula
mato desses cursos nas instituies analisadas. Um mesmo modelo Representa os atributos que caracterizam a relao do estudante
pode ser utilizado por vrios cursos em diversas instituies. com o curso no qual est matriculado, compreendendo os dados

10 SQL Magazine Edio 130


relativos ao seu ingresso no curso, alm de dados consolidados mesmo est matriculado regularmente, se evadiu sem aviso
sobre sua vida acadmica e financeira. (em abandono), temporariamente (trancado) ou definiti-
Uma matrcula est associada a um estudante, num curso, em vamente cancelado). O seu vnculo financeiro com a insti-
determinado perodo letivo. Alm disso, a matrcula associa o tuio pode ser muito til em anlises comportamentais do
estudante/curso instalao fsica da instituio de ensino que estudante, pois entende-se que um estudante pagante tem
frequenta. um comprometimento diferenciado de bolsistas, sejam esses
Os dados relativos ao ingresso do estudante no curso so repre- de programas governamentais, como o PROUNI (Programa
sentados nessa entidade com a indicao do perodo letivo em Universidade para Todos) e o FIES (Fundo de Financiamento
que o estudante ingressou no curso (IdPeriodoIngresso); a forma ao Estudante do Ensino Superior), sejam de programas insti-
de ingresso (TipoIngresso), entre Prova de vestibular, Prova do tucionais prprios.
Exame Nacional do Ensino Mdio - ENEM, Matrcula Especial Principal componente para estudos com minerao de dados
para portadores de diploma de curso superior, Transferncia educacionais, a entidade Matricula agrega atributos deriva-
Externa de outra instituio ou Transferncia Interna de outro dos de outras entidades, facilitando a sua utilizao em data
curso, na mesma instituio de ensino. Para os estudantes que warehouses e outros data sets. Esses atributos so as chaves
ingressaram atravs de Prova (Vestibular ou ENEM), prope-se estrangeiras:
armazenar os dados relativos sua nota na avaliao realizada, IdEstudante: que relaciona cada Matrcula com um dos Estu-
homogeneizando seus valores atravs de um percentual referente dantes;
nota obtida em relao pontuao mxima possvel para a ava- IdCurso: que relaciona cada Matrcula com um dos cursos
liao. Tambm considerado um atributo de Ingresso o tempo, ofertados;
em dias, de antecipao da matrcula em relao ao prazo mximo IdInstalacao: que relaciona cada Matrcula com a instalao
para matrculas no perodo est representado na entidade. onde o curso ofertado;
A condio atual do estudante no curso pode ser identifica- IdPeriodoIngresso: que relaciona cada Matrcula com o perodo
da atravs do atributo Situao da Matrcula, que indica se o em que o estudante iniciou seu curso.

Edio 130 SQL Magazine 11


Modelo de dados para anlise de informaes educacionais

Mensalidade quando o estudante no obtiver sucesso em sua aprovao e pode


Representa os atributos que caracterizam os eventos financeiros estar em curso no momento da extrao dos dados.
mensais dos estudantes nos cursos. Observe que nesta tabela Trabalhos de minerao de dados educacionais necessitam de
definimos como chave primrio o identificador autoincremen- uma estrutura padronizada e homognea para pesquisadores e
tvel IdMensalidade. Alm disso, temos as chaves estrangeiras gestores, que permitam anlises comparativas entre trabalhos
IdMatricula (que relaciona cada Mensalidade com uma Matrcula) distintos e, sobretudo, uma maior convergncia nas suas abor-
e IdPeriodo (que relaciona cada Mensalidade com um Perodo dagens. O modelo de dados proposto neste artigo visa iniciar
Letivo). Assim, temos que cada registro de mensalidade ou parcela o preenchimento da lacuna na padronizao e estruturao de
est associado a uma matrcula em um perodo letivo. dados educacionais.
O conjunto de atributos da entidade formado pelo ms de refe- O modelo proposto busca estabelecer conceitos comuns na
rncia da mensalidade, pelas datas de vencimento e pagamento, anlise de situaes problema educacionais, alm de possuir uma
assim como pelo valor da mensalidade (cobrado) e pelo valor estrutura que permite maior produtividade na seleo de dados
efetivamente pago. para minerao, uma vez que seu conjunto de entidades e atribu-
tos, devidamente justificados, facilita a identificao dos fatores
Disciplina mais relevantes nas diversas situaes problemas analisados.
Para efeito do modelo proposto, cujo objetivo tem o estudante
como foco principal, optou-se por tratar as disciplinas somente
como um repositrio para os atributos que registram a integrao
acadmica dos estudantes. No foram considerados atributos Autor
sobre a natureza ou o contedo das disciplinas.
Pricles Magalhes
A funo da entidade registrar a organizao das disciplinas
periclesmagalhaes@gmail.com
na matriz, ao longo de sua integralizao. Esta tabela tem o atri- Analista de Sistemas, graduado pela Universidade Federal
buto IdDisciplina como chave primria. Alm da associao da da Bahia, com especializao em Gesto Empresarial pela
disciplina com o curso do qual faz parte (chave estrangeira Id- Fundao Getlio Vargas e Mestrado em Computao pela Unifacs,
Curso), includo o atributo que indica em que perodo do curso acumula vinte anos de experincia profissional. Desde 1996, atua como
a disciplina ocorre em sua matriz. gestor e empreendedor de empresas de tecnologia da informao, incluindo experincia
internacional como Diretor de Negcios no grupo francs Altran Techologies. Professor
DisciplinaCursada universitrio, desde 2006 em cursos de graduao da rea de informtica. De janeiro de
2010 a fevereiro de 2014, frente da gesto dos cursos EAD da Unifacs.
Entidade (cuja chave IdDisciplinaCursada primria do tipo
autoincremento) que relaciona as disciplinas dos cursos aos es-
tudantes e suas matrculas (chave estrangeira IdMatricula). Cada
Autor
registro de disciplina cursada est associado a uma matrcula,
a uma disciplina em um perodo letivo. Um estudante pode Rodrigo Oliveira Spnola
cursar a mesma disciplina (chave estrangeira IdDisciplina) mais rodrigo.devmedia@gmail.com
de uma vez, em perodos letivos (chave estrangeira IdPeriodo), Editor Chefe Engenharia de Software Magazine, SQL
Magazine
uma vez que no tenha obtido aprovao. Da mesma maneira,
a cada perodo letivo, um estudante geralmente relacionado a
vrias disciplinas.
Em cada disciplina cursada, so registrados dados da frequncia Voc gostou deste artigo?
de participao do estudante, sua nota global, em valores percen-
tuais sobre a nota mxima possvel e a situao do estudante ma-
D seu voto em www.devmedia.com.br/sqlmagazine/feedback
triculado na disciplina no perodo a disciplina, no perodo, pode
j ter sido concluda com sucesso, pode ter sido dispensada por Ajude-nos a manter a qualidade da revista!
j ter sido cursada em outra instituio, pode ter sido reprovada

12 SQL Magazine Edio 130


Edio 130 SQL Magazine 13
Melhoria de
desempenho utilizando
estatsticas e ndices
Este artigo do tipo mentoring Cenrio
saiba mais: www.devmedia.com.br/mentoring-saibamais Este artigo descreve o comportamento das estatsticas no banco
de dados e apresenta solues que podem ser utilizadas para os pro-
blemas encontrados na elaborao do plano de execuo, alm de

I
ndexao se tornou um ponto chave no cenrio fornecer diretrizes para o uso eficiente de estatsticas de otimizao
de bancos de dados. Um problema existente em de consultas com o auxlio de ndices bem definidos. O conhecimento
banco de dados refere-se necessidade de no se apresentado neste artigo til para apoiar as atividades referentes
preocupar muito com a forma com que as consultas procura por um melhor desempenho do SGBD. Sem dvidas, o uso
SQL so executadas e informadas ao otimizador de correto de estatsticas e ndices contribui muito para este fim.
consultas que verifica, em primeiro lugar, se existe um
plano disponvel para sua execuo. No havendo, ele
compila um plano de forma automtica. Para executar alterao que foi realizada ou para ter um acompanhamento e
de forma eficaz, necessrio ser capaz de estimar as monitoramento dos processos. Antes de ir para uma discusso
linhas intermedirias que seriam geradas a partir das profunda, necessrio ter ideia sobre alguns termos utilizados
vrias estratgias e alternativas para o retorno de um na indexao:
resultado. O Database Engine mantm estatsticas sobre Table Scan: Sempre que invocada uma consulta em um banco
a distribuio dos valores das chaves em cada ndice de dados, o otimizador de consulta SQL est tentando buscar a
da tabela, e usa essas estatsticas para determinar qual melhor forma possvel para executar a consulta a fim de se obter
ndice(s) usar ao compilar o plano de consulta. Se, no um melhor desempenho. Neste processo, quando o otimizador
entanto, h problemas com estas estatsticas, o desem- de consultas determina que no h ndices teis disponveis para
penho das consultas ser afetado. produzir o conjunto de resultados de sada, ento ele faz a verifi-
Se no h estatsticas, o otimizador ter que estimar a cao da tabela toda. Assim, o Table Scan precisa inspecionar toda
contagem de linhas ao invs de estim-las, e acreditem: a tabela, linha por linha, a fim de obter os resultados esperados.
isso no o que se quer e pode estar aqui o problema Isso muito lento e recomendado evitar, pois h alguns casos
da lentido em executar certas consultas. em que os Table Scan so mais rpidos do que o Index Scan, por
Existem vrias formas de descobrir que ambos os exemplo, em tabela com poucos dados;
planos de execuo, o estimado e o real, possuem pro- Index Scan: estrutura de dados auxiliar usada para acelerar o
blemas quando o otimizador se depara com a falta de acesso a dados dentro do banco de dados. Aqui, no ir se fazer
estatsticas. Neste caso, existir avisos no plano, como um rastreamento em toda a tabela, mas ir se buscar diretamente
um ponto de exclamao ou um x indicando erro, no as linhas que qualificam a consulta do requisitante. Para tanto, a
plano de execuo e um aviso nas informaes, assim estrutura de dados mantidaseparada para sustentar as infor-
como mostra a Figura 1. maes sobre os valores da chave da tabela.
Havendo a necessidade de visualizar os planos de
execuo de consultas anteriores, pode-se solicitar esses A principal propriedade do ndice ser ordenado. Por exemplo, no
planos pelo uso do comando sys.dm_exec_cached_plans caso de um dicionrio, todas as palavras esto em forma ordenada,
DMV. H vrias ocasies em que se precisa visualizar de modo que quando se procura qualquer palavra, pula-se direta-
estatsticas no histrico, seja para saber de alguma mente para a pgina correspondente relacionada com a palavra.

14 SQL Magazine Edio 130


com um # como o primeiro o caractere em seu nome), ao invs
de variveis de tabela, para tabelas temporrias com mais de 100
linhas, pois isso acarreta em menos ou nenhuma recompilao.

Executando Consultas remotas


Figura 1. Colunas sem estatsticas
Problema
Da mesma forma, o motor de banco de dados est em busca das li- Suponha que se deseja consultar uma tabela a partir de um
nhas exigidas quando a(s) coluna(s) correspondente indexada. banco de dados Oracle, utilizando uma conexo de servidor via
Bom, se isso ocorre de forma correta, ento o que ocorre de forma linked e algumas junes de tabelas do banco de dados local.
errada, e o que pode ser feito para colocar as coisas no seu devido perfeitamente compreensvel que o SQL Server no faa a menor
lugar? Vamos percorrer os problemas mais comuns e explicar ideia da existncia de qualquer contagem de linha que a tabela re-
como isso ocorre e de que forma pode ser resolvido. A ideia geral mota possua, uma vez que esta residente em um banco de dados
deste artigo apresentar de forma sucinta alguns problemas que Oracle. Isso pode ocorrer se for utilizado o comando openrowset
envolvem o uso de estatsticas e ndices dentro do banco de dados ou o openquery para acesso remoto aos dados.
SQL Server e como solucion-los. Esse problema poder ser enfrentado inesperadamente quando
se trabalha com DMVs (Dynamic Management Views). O nmero de
Setando auto create statistics OFF DMVs do SQL Server nada mais do que um shell para consultar
dados de tabelas internas. Poder haver um operador Remote Scan
Problema para o SQL Server 2005 ou uma funo de valor de tabela para
Como as estatsticas aumentam o desempenho da execuo de SQL Server 2008 ou superior. Os operadores tm vinculado esti-
consulta do SQL Server? mativas de cardinalidade predefinidas (dependendo da verso do
servidor e do operador, estes valores so 1, 1000, ou 10000). Veja
Soluo por exemplo o cdigo seguinte:
Os histogramas estatsticos so usados pelo otimizador de con-
sulta para escolher o plano de execuo de consulta ideal. Se uma SELECT * FROM sys.dm_tran_current_transaction
consulta contm uma coluna com as estatsticas, o otimizador
tem como estimar com preciso o nmero de linhas afetadas por O prprio Transact-SQL informa de maneira resumida para o
essa consulta. Assim, o otimizador tem informaes suficientes comando: Retorna uma nica linha que exibe as informaes de
para criar o plano de execuo. O SQL Server cria estatsticas de estado da transao na sesso atual. Entretanto, tome como exem-
diferentes maneiras: plo o plano de execuo na Figura 2. No item Nmero Estimado
As estatsticas so criadas automaticamente para cada novo de Linhas (Estimated Number of Rows) deveria haver o nmero 1 l.
ndice; Aparentemente, o otimizador no est levando em considerao
Se a definio auto create statistics do banco de dados setada isso ao gerar o plano. A tabela interna da dm_tran_current_tran-
como ON, ento o SQL Server criar automaticamente as esta- saction chamada invocando o comando openrowset e um nmero
tsticas para colunas no indexadas que so utilizadas em suas estimado de linhas de 1000, que est longe da realidade.
consultas.

Utilizando variveis de tabela

Problema
Para as variveis de tabela do SQL Server, as estatsticas nunca
sero mantidas. Tenha isso em mente. Quando se seleciona a
partir de variveis de tabela, a contagem de linhas estimada
sempre 1, a menos que um predicado seja avaliado como falso e
no disponha de qualquer relao com a varivel de tabela. Neste
caso aplicado (como WHERE 1 = 0) quando a contagem de linhas
da estimativa avaliada seja 0. Figura 2. Estimativa do nmero de linhas de uma consulta

Soluo Soluo
No conte com o uso de variveis de tabela para tabelas tem- Se possvel d ao otimizador algum apoio, especificando a con-
porrias se elas so susceptveis a conter mais do que algumas tagem de linha atravs da clusula TOP (n). Isso s ser eficaz se
poucas linhas. Como regra geral, use tabelas temporrias (tabelas n for menor que o nmero estimado de linhas, 1000, no exemplo.

Edio 130 SQL Magazine 15


Melhoria de desempenho utilizando estatsticas e ndices

Ento, se h algum palpite de quantas linhas a consulta no Oracle Listagem 1. Criao da Base de Dados.
est prestes a retornar, basta adicionar TOP (n) declarao open-
CREATE DATABASE TEST;
query. Isso vai ajudar a retornar melhores estimativas de cardina- go
lidade alm de ser conveniente de utilizar o resultado openrowset ALTER DATABASE TEST SET Recovery Simple
para aderir ou realizar a filtragem dos dados. Mas no esquea que go
USE TEST
esta prtica um pouco perigosa. Especificando um valor muito go
baixo para n, o conjunto de resultados vai perder linhas, o que -- cria a tabela NUMERO
seria um desastre. CREATE TABLE numero(n INT NOT NULL PRIMARY KEY);
go
Com o nosso exemplo anterior, utilizando sys.dm_tran_cur- -- insere os registros na tabela numero
rent_transaction, ela seria melhor reescrita conforme o cdigo a INSERT numero(n)
seguir: SELECT rn FROM (SELECT ROW_NUMBER()
OVER(ORDER BY current_timestamp) AS rn
FROM sys.trace_event_bindings AS b1
SELECT TOP 1 * FROM sys.dm_tran_current_transaction ,sys.trace_event_bindings AS b2) AS rd
WHERE rn <= 1000000
go
Normalmente isso no ser necessrio, pois o simples coman- -- cria uma tabela de teste
do select, se usado standalone, rpido o suficiente. No entanto, IF (object_id(T0, U) IS NOT NULL)
DROP TABLE T0;
processar o resultado da consulta usando-o em junes faz com
go
que o uso do TOP 1 seja til. CREATE TABLE T0
Se voc entender que est usando os resultados openquery em ( c1 INT NOT NULL
,c2 nchar(200) NOT NULL DEFAULT #
consultas mais complexas para junes ou operaes de filtragem, )
ento aconselhvel importar o resultado openquery em uma go
tabela local primeiramente. Estatsticas e ndices podem ser ade- -- Insere 100000 linhas com o valor 1000 para a coluna c1
INSERT T0(c1)
quadamente mantidos para a tabela local para que o otimizador SELECT 1000 FROM numero
tenha informaes suficientes para estimativas realistas de con- WHERE n <= 100000
tagens de linha. A Listagem 1 exibe o script de criao do banco go
-- insere uma linha com valor 2000
de dados e tabelas envolvidas. INSERT T0(c1) VALUES(2000)
go
O banco de dados somente leitura --cria um ndice nonclustered para a coluna c1
CREATE NONCLUSTERED INDEX ix_T0_1 ON T0(c1)

Problema
Se o banco de dados est definido como somente leitura, o Utilizao de variveis l ocais em scripts T-SQL
otimizador no pode incluir estatsticas, mesmo com auto create
statistics habilitado, porque as mudanas de apenas leitura dos Problema
bancos de dados so geralmente evitadas. Observe a Listagem 2 e se estiver familiarizado com as diferentes
Cuidado com o fato de que tambm h um tipo especial de banco etapas de execuo da consulta, vai perceber que antes de uma
de dados, do modo somente leitura, o snapshot. Se o otimizador consulta ser executada, um plano de consulta tem de ser gerado,
est ausente para as estatsticas relativas aos bancos de dados e por certo, no momento da compilao da consulta, o SQL Ser-
snapshots, estes no podem ser criados automaticamente. Isto ver no sabe o valor da varivel @x. Poderamos determinar o
provvel de acontecer se os snapshots esto sendo usados para valor de @x, mas pode haver expresses mais complicadas que
aplicaes de relatrios. Existem sugestes para criar snapshots impedem o clculo desse valor em tempo de compilao. Neste
para fins de relatrios de modo a evitar a execuo dessas con- caso, o otimizador no tem conhecimento do real valor de @x
sultas de longa execuo e uso intensivo de recursos nos sistemas e , portanto, incapaz de fazer uma estimativa razovel da cardi-
subjacentes. Isso pode ser bom at certo ponto, mas as consultas nalidade do histograma.
de relatrios so altamente imprevisveis e geralmente diferem Por outro lado, pelo menos h uma estatstica para coluna c1.
das consultas normais, seja pela complexidade ou a vasta juno Por isso, se o otimizador no pode procurar o histograma, ele
entre tabelas. Portanto, h uma chance de que as consultas de provavelmente pode retornar outras quantidades, mais gerais.
relatrios sofram de estatsticas ausentes ou, pior ainda, ndices Isso exatamente o que acontece aqui.
ausentes. No caso do otimizador no poder tirar proveito do histograma
de uma estatstica, as estimativas de cardinalidade so determina-
Soluo das pelo exame da densidade mdia, o nmero total de linhas na
Caso o banco esteja definido como somente leitura, a criao de tabela e, possivelmente, tambm, pelo operador(es) de predicados.
estatsticas dever se dar de forma manual. Nos itens a seguir se Visualizando a Listagem 1, pode-se notar que foram inseridas
entrar mais especificamente neste tipo de estatstica. 100.001 linhas na base de testes, onde a coluna c1 tem um valor

16 SQL Magazine Edio 130


de 2000 apenas para uma linha e
um valor de 1000 para o restante
das 100 mil linhas.
Agora, pode-se inspecionar a
densidade mdia das estatsticas
por meio da execuo do comando
dbcc show_statistics. Entretanto,
ele calcula o valor pela frmula Figura 3. Plano de execuo do procedimento armazenado
1 divido pelo nmero distinto de
valores, no caso em questo tem-se como resultado 1/2 = 0,5 uma poluio do cache do plano, a vulnerabilidade a ataques de SQL
vez que h somente os valores 1000 e 2000. Por isso, o otimizador Injection, e possivelmente maior utilizao de CPU e de memria.
calcula a mdia do nmero de linhas por valor distinto de c1 Agora observe a Listagem 3.
a 100.001 linhas * 0.5 = 50.000,5 linhas. Com esse valor em mos
o operador do predicado entra em jogo, o que = em nosso Listagem 2. Execuo de uma consulta simples.
exemplo. Para a comparao exata, o otimizador pressupe que
o nmero mdio de linhas para um valor de c1 ser devolvido, DECLARE @x int
assim, a linha de contagem esperada de 50.000,5. Outros operado- SET @x = 2000
SELECT c1,c2
res de comparao levam a diferentes estimativas de seletividade, FROM T0
em que a densidade mdia pode ser ou no considerada. WHERE c1 = @x

Listagem 3. Execuo de consulta via comando EXEC.


Soluo
Se possvel, evite os comandos que utilizam as variveis locais DECLARE @x int
em scripts T-SQL. Como isso pode no ser sempre possvel, tam- ,@cmd nvarchar(300)
bm existem outras opes disponveis. SET @x = 2000
SET @cmd = SELECT c1,c2 FROM T0 WHERE c1= + CAST(@x as nvarchar(8))
Primeiro, pode-se considerar a introduo de procedimentos
EXEC (@cmd)
armazenados. Estes so projetados para trabalhar com parme-
tros usando uma tcnica que chamada de sniffing. Quando
um procedimento chamado pela primeira vez, o otimizador O plano de execuo est impecvel agora (o mesmo que na
ir descobrir quaisquer parmetros fornecidos e ajustar ao plano Figura 3), uma vez que criado durante a execuo do comando
gerado (no quesito estimativas de cardinalidade) de acordo com exec, e a cadeia de comando fornecida passada como parmetro
estes parmetros. Embora possa enfrentar outros problemas com para este comando. Na realidade, deve-se equilibrar as conse-
esta abordagem, a melhor soluo neste caso. Desta forma, a quncias antes de se decidir usar SQL dinmico. Mas pode-se
consulta anterior pode ser alterada pela visualizada na seguir, perceber que ele no ruim em todos os casos.
que um procedimento armazenado: Para executar uma sequncia de caracteres, recomenda-se uti-
lizar o procedimento armazenado sp_executesql em vez de uma
CREATE PROCEDURE getT0Values(@x int) AS instruo execute. Isto porque este procedimento armazenado
SELECT c1,c2 FROM T0 suporta a substituio de parmetros, alm de ser mais verstil do
WHERE c1 = @x que execute e gerar planos de execuo com mais probabilidades.
A seguir podemos observar novamente esta soluo mas, desta
E depois s executar este procedimento conforme apresentado vez, reescrita para sp_executesql:
a seguir:
EXEC sp_executesql NSELECT c1, c2 FROM T0 WHERE c1 = @x
EXEC getT0Values 2000 ,N@x int
,@x = 2000
O plano de execuo ir expor uma pesquisa de ndice. Isso
porque o otimizador sabe que deve gerar o plano para um valor Mais uma vez o plano de execuo se parece com o apresentado
de @x = 2000. A Figura 3 revela o plano para a execuo deste na Figura 3.
procedimento.
Em segundo lugar, pode ser necessrio resolver o problema Fornecendo expresses em predicados
atravs da utilizao de SQL dinmico. Entretanto, necessrio
esclarecer o seguinte: no se est usando SQL dinmico em geral Problema
e extensivamente. De maneira alguma isso seria apropriado. SQL Ao usar expresses em predicados, tambm se pode impedir
dinmicos tem efeitos colaterais muito ruins, como a possvel que o otimizador utilize o histograma. Veja o exemplo:

Edio 130 SQL Magazine 17


Melhoria de desempenho utilizando estatsticas e ndices

SELECT c1, c2 reutilizao do plano com os valores dos parmetros mais usuais
FROM T0 propensa a ter um desempenho ruim. A seguir, observa-se a
WHERE SQRT(c1) = 100 chamada ao procedimento armazenado:

O plano de execuo mostrado na Figura 4. Embora existam EXEC getT0Values 2000



estatsticas para a coluna c1, o otimizador no tem ideia de como
aplicar esta estatstica para a expresso POWER (c1,1) e, portanto, Se esta for a primeira chamada do procedimento, o plano gera-
tem de adivinhar a contagem de linhas. Isto muito semelhante do para o filtro where c1 = 2000. Uma vez que h somente uma
ao problema da falta de estatsticas mencionadas anteriormente, linha estimada para c1 = 2000, ento uma pesquisa de ndice
uma vez que no h estatsticas para a expresso POWER (c1,1). realizada. Agora, executando a mesma chamada, mas alterando o
parmetro de entrada, tem-se que o plano em cache reutilizado
Soluo e novamente uma pesquisa de ndice realizada:
Se possvel, reescreva o cdigo SQL para que as comparaes
sejam realizadas apenas em colunas puras, por exemplo: ao EXEC getT0Values 1000

invs de especificar conforme o cdigo:
Esta uma escolha muito ruim, porque a consulta agora retor-
WHERE SQRT(c1) = 100 nar 100.000 linhas. H uma grande diferena entre a contagem
de linha estimada e a real. Um Table Scan tinha sido muito mais
Melhore a consulta considerando: eficiente aqui.
H um outro problema com a parametrizao que muito seme-
WHERE c1 = 10000 lhante para o problema do uso de variveis locais
em scripts T-SQL.
Considere o procedimento armazenado na Listagem 4.
Felizmente o otimizador bastante inteligente ao ponto de avaliar
expresses e, em alguns casos, reescrev-las. Se reescrever a sua Listagem 4. Criao de um procedimento.
consulta no for possvel, sugere-se pedir auxlio a pessoas com
DROP PROCEDURE getT0Values
maior conhecimento na rea. Se ainda no for possvel, pode-se GO
optar por utilizar colunas calculadas, j que as estatsticas tambm CREATE PROCEDURE getT0Values(@x int) AS
so mantidas para estes tipos de colunas, alm de ser possvel criar SET @x = @x * 2
SELECT c1,c2 FROM T0
ndices para estas colunas. WHERE c1 = @x

Questes de parametrizao
Modificar o valor de @x no o ideal. A tcnica de parmetro
Problema sniffing no ir traar quaisquer modificaes de @x, de modo
Ao utilizar consultas parametrizadas, pode-se enfrentar um que o plano de execuo ajustado para fornecer o valor s de
outro problema. Lembre-se de que o plano de consulta gerado @x e no o valor real que usado dentro da consulta. No cdigo
na primeira chamada do processo, e no na instruo Create Pro- a seguir ocorre a chamada ao procedimento:
cedure. O plano ser gerado atravs da utilizao das estimativas
de contagem de linhas para os valores dos parmetros, desde que EXEC getT0Values 1000

foram previstas na primeira chamada. O problema aqui bastante
bvio, as estimativas de cardinalidade utilizam esses valores e o Na sequncia, o plano real otimizado para o filtro em que C1
plano de execuo criado no plano em cache. O plano ter uma = 1000 e no em que C1 = 2000. Pode-se realmente enganar o
estimativa pobre das contagens de linhas, ento a subsequente otimizador por esta prtica, e as estimativas insatisfatrias de
cardinalidade so muito provveis de acontecer.

Soluo
Se est tendo problemas que so causados
pelo parmetro sniffing, pode-se ento con-
siderar o uso de dicas de plano de consulta,
como optimize for ou with recompile.
Tente no modificar os valores dos par-
metros dentro dos procedimentos armaze-
nados. Se tiver que mudar estes valores para
Figura 4. Estimativa de cardinalidade com expresso de predicado processamento posterior, deve-se considerar

18 SQL Magazine Edio 130


a diviso do procedimento armazenado em vrios procedimentos grama, que tal simplesmente usar mais de um histograma? claro
de menor tamanho ou complexidade, gerando sub-rotinas. Mo- que podemos conseguir isso atravs da introduo de estatsticas
difique os valores dos parmetros na chamada do procedimento filtradas. Desde que o histograma seja sempre vinculado a uma
e execute as sub-rotinas utilizando o valor alterado. Como para nica estatstica, possvel ter vrios histogramas para a mesma
cada procedimento armazenado, um plano separado gerado, coluna ao usar estatsticas filtradas.
esta prtica vai contornar o problema. Essas estatsticas devero ser criadas de forma manual. Imagine
uma tabela que contenha 90% de dados histricos (que nunca
Tamanho da amostra insuficiente foram alterados) e apenas 10% dos dados ativos. Intuitivamente
decidiu-se por ter duas estatsticas filtradas, e por separar estas
Problema duas estatsticas atravs da aplicao de uma condio de filtro
Imagine uma tabela com alguns milhes de linhas. Sempre para alguma coluna. Alm disso, deseja-se desabilitar as atuali-
que o SQL Server cria ou atualiza automaticamente estatsticas zaes automticas para as estatsticas que representam apenas
para uma das colunas desta tabela, ele no l todas as linhas da dados histricos (a parte de 90%). Isto porque s parte ativa, a
tabela. Para evitar a utilizao exaustiva de recursos, como CPU parte dos 10%, para a qual as estatsticas precisam ser regular-
e processos de entrada/sada, geralmente apenas algumas linhas mente atualizadas.
de amostra so processadas para a manuteno de estatsticas. Isto Neste momento h um problema, como Create Auto Statistics est
pode levar a um histograma que representa a mal distribuio definido como ON, o otimizador sempre adiciona uma estatstica
geral de dados. Se o otimizador estima a cardinalidade, pode no no filtrada ao objeto, bem como, as j existentes para a mesma colu-
ser capaz de encontrar informaes suficientes para gerar um na. Portanto, embora possa parecer que as duas estatsticas filtradas
plano de consulta eficiente. so as nicas no local, uma para o histrico, e outra para a parte
ativa, a tendncia acabar com um total de trs estatsticas, uma
Soluo vez que a outra (no filtrada) ir ser adicionada automaticamente.
A soluo geral muito simples. Basta interferir na atualizao No s temos agora as estatsticas no filtradas desnecessrias, mas
automtica ou na criao de estatsticas por atualizaes manu- tambm haver atualizaes automticas sem sentido para elas.
ais ou gerao de estatsticas. Lembre-se que se pode especificar claro que poderamos desativar a criao automtica de estatsti-
o tamanho da amostra ou at mesmo executar uma varredura cas para a tabela inteira, mas isso seria colocar o nus para a criao
completa ao invocar Create Statistics ou Update Statistics. de todas as estatsticas adequadas. Se h uma opo automtica,
Lembre-se ainda que uma reconstruo de ndices sempre fora por que no contar com ela sempre que possvel?
a produo de estatsticas que so criadas com uma verificao Uma das melhores formas de superar esse problema criar as
completa e que uma reconstruo de ndices no tem efeito so- estatsticas no filtradas manualmente, especificando a opo
bre as estatsticas de coluna, mas apenas se refere s estatsticas Norecompute. Isso impedir ao otimizador adicionar este objeto
relacionadas com o ndice. s estatsticas e tambm ir evitar mais atualizaes automticas.
Os passos necessrios so os seguintes:
Granularidade das estatsticas muito ampla Crie uma estatstica no filtrada com norecompute definido como
ON, a fim de impedir que as atualizaes sejam automticas. Esta
Problema estatstica apenas necessria para driblar o otimizador;
Vamos voltar para a nossa tabela com linhas de vrios milhes Crie outra estatstica filtrada para a parte dos 10% ativo, mas
de registros novamente. Embora o tamanho mximo do histo- desta vez com as atualizaes automticas habilitadas;
grama sempre limitado a 200 entradas, sabemos que s temos Se desejvel, crie outra estatstica filtrada para a parte dos 90%
200 pistas para contagem de linhas estimada, digamos, em uma e mais uma vez, desative as atualizaes automticas.
tabela de 4 milhes de registros. Isso uma mdia de quatro
milhes divididos por 200 passos que igual a 20.000 linhas por Seguindo os passos mencionados, pode-se obter mais estats-
etapa do histograma. Se os valores da coluna foram igualmente ticas dignas para a parte ativa de sua tabela. Mas, infelizmente,
compartilhados entre todas as linhas, isto no ser um problema, esta soluo no livre de problemas, como a prxima seo ir
mas o que fazer se eles no so? As estatsticas provavelmente revelar.
vo ser muito onerosas e podem levar a estimativas imprecisas
da cardinalidade. Estatsticas remotas
A sincronizao de estatsticas sempre fica para trs nas modifi-
Soluo caes de dados reais. Por isso, quase todos os objetos estatsticos
Aparentemente seria til aumentar o tamanho do histograma, so obsoletos, pelo menos at um certo nvel. Em muitos casos,
mas no h nenhuma maneira de aumentar o tamanho de um esse comportamento absolutamente aceitvel, mas h tambm
histograma para conter mais de 200 entradas, pelo menos at o situaes em que o desvio entre os dados de origem e as estatsticas
momento. Mas se no podemos incluir mais linhas em um histo- pode ser muito grande.

Edio 130 SQL Magazine 19


Melhoria de desempenho utilizando estatsticas e ndices

insero de mais 100 mil registros, estes, porm,


todos com a data fixa em 01/01/2015:

INSERT produto(data_alteracao, valor)


SELECT 01/01/2015, 100 FROM numero WHERE n <= 100000

Observe que todos os registros foram inseridos


utilizando o cdigo:

Figura 5. Plano de execuo da consulta. SELECT * FROM produto WHERE data_alteracao = 01/01/2015

Problema Agora observe o plano de execuo real para a consulta na


Estima-se que para tabelas com mais de 500 linhas,pelo menos Figura 5.
20% dos dados de uma coluna sofrero alterao. Isto impacta Devido a estatsticas antigas, h uma enorme discrepncia entre
na gerao de qualquer estatstica, de modo que estas recebero a contagem de linhas real e a estimada. As 100 mil linhas adicio-
uma atualizao na prxima vez que for utilizada. Esse limite de nadas esto abaixo do limite exigido de 20% de modificaes, o
pelo menos 20% pode ser demasiadamente grande em vrias que significa que uma atualizao automtica no executada.
circunstncias. Para ilustrar esse cenrio, considere uma tabela O ndice que foi usado no realmente a melhor escolha para a
de produtos, conforme a Listagem 5. recuperao de 100 mil linhas, com pesquisas de chave adicionais
o retorno se deu com chave do Index Seek. A declarao levou cerca
de 300.000 leituras lgicas na execuo local. Um Table Scan ou
Listagem 5. Criao da Tabela Produto.
Clustered Index Scan teria sido uma opo muito melhor aqui.
CREATE TABLE produto
( id_produto int IDENTITY(1,1) NOT NULL
,valor decimal(8,2) NOT NULL Soluo
,data_alteracao datetime NOT NULL default current_timestamp claro que temos a oportunidade de oferecer nosso conhecimen-
)
GO
to para o otimizador pelo uso de dicas de consulta. Neste caso, se
ALTER TABLE produto ADD CONSTRAINT pk_produto soubssemos que um Clustered Index Scan seria a melhor escolha,
PRIMARY KEY CLUSTERED (id_produto)
poderamos ter especificado uma dica de consulta:

Entre uma chave primria e algumas outras colunas, h tambm SELECT * FROM produto WITH (index=0)
uma coluna que detm a ltima modificao do produto. Mais WHERE data_alteracao = 01/01/2015
tarde, iremos procurar produtos para datas distintas ou intervalos
de datas. Por isso, tambm necessrio criar um ndice agrupado Embora a sugesto de consulta funcione corretamente, a sua
para a coluna data_alteracao: especificao como dicas de consulta um pouco perigosa. H
sempre a possibilidade de que os parmetros de consulta sejam
CREATE NONCLUSTERED INDEX ix_produto_data_alteracao ON produto(data_alteracao) modificados ou a alterao de dados seja subjacente. Quando isso
acontece, a dica de consulta, anteriormente til, agora pode afetar
Agora iremos adicionar 500 mil produtos tabela a fim de negativamente o desempenho. Uma atualizao nas estatsticas
popula-la com uma quantidade expressiva de dados. O script da uma escolha muito melhor neste caso:
Listagem 6 exemplifica os comandos de insero.
UPDATE STATISTICS produto WITH FULLSCAN

Listagem 6. Adio de dados na tabela de Produtos.


Depois disso, umClustered Index Scan executado e somente cerca
INSERT produto(data_alteracao, valor) 86000 leituras lgicas so necessrias. Ento, no dependa exclusi-
SELECT DATEADD(day, abs(checksum(newid())) % 3250,01/01/2010)
,0.01*(ABS(checksum(newid())) % 20000) vamente de atualizaes automticas. Deixe-as ligadas, mas esteja
FROM numero preparado para intervir no processo automtico comatualizaes
WHERE n <= 500000
GO
manuais, provavelmente em horrios de pico durante a janela de
UPDATE STATISTICS produto WITH FULLSCAN manuteno. Isto especialmente importante para as estatsticas
em colunas que contenham valores constantemente crescentes,
tais como colunas do tipo identity. Para cada linha adicionada a
Utilizou-se alguns valores calculados de forma aleatria para esta coluna, ser definido um valor que est acima do item mais
data_alteracao e valor, alm de atualizar todas as estatsticas exis- alto do histograma, tornando difcil ou quase impossvel, para o
tentes aps o comando insert ser concludo. Em seguida, faz-se a otimizador, a obteno de estimativas adequadas de tais valores.

20 SQL Magazine Edio 130


Normalmente existir a necessidade de atualizar as estatsticas Problema
sobre estas colunas com uma maior frequncia do que somente Para mostrar porque isso pode causar um problema, vamos
aps 20% das mudanas. executar um experimento simples. Criaremos uma tabela de teste,
conforme visualizada na Listagem 7, que contm uma lista de
Problema veculos para aluguel.
Estatsticas filtradas possuem dois problemas muito particulares
quando se trata de atualizaes automticas. Em primeiro lugar, Listagem 7. Criao da tabela de Veculos.
qualquer modificao de dados que muda a seletividade do filtro CREATE TABLE veiculo_aluguel(
no levada em conta para qualificar a invalidao automtica id_veiculo_aluguel INT NOT NULL IDENTITY(1,1) PRIMARY KEY clustered
das estatsticas existentes. ,tipo_veiculo nvarchar(20) NOT NULL
,valor_diaria decimal(6,2)
Segundo, e mais importante, a regra dos 20% aplicada a todas )
as linhas da tabela, no s para o conjunto filtrado. Este fato pode
desatualizar as estatsticas filtradas muito rapidamente. Vamos voltar
novamente para o exemplo, com 10% de dados ativos dentro de uma Esta tabela possui duas colunas, uma para o tipo de veculo e
tabela e uma estatstica filtrada em parte da tabela. Se todos os dados outra para um valor de diria. Estima-se que a maior parte das
do conjunto filtrado forem modificados, embora esta seja 100% do consultas se dar pelos campos tipo_veiculo e valor_diaria, por isso
conjunto de filtrados (os dados ativos), isto apenas 10% da tabela. pode ser uma boa ideia criar um ndice a partir destas colunas.
Mesmo que se mudasse toda a parte dos 10%,novamente, sobre Observe o cdigo a seguir:
a tabela, s se teria 20% de alteraes de dados. Ainda assim as
estatsticas filtradas no sero consideradas como sendo ultra- CREATE NONCLUSTERED INDEX ix_veiculo_aluguel_tipo_veic_valor_diaria
passadas, embora j tenham sido modificados 200% dos dados. ON veiculo_aluguel(tipo_veiculo, valor_diaria)
Estranho, mas realmente o que ocorre.
Agora iremos adicionar alguns dados de teste. Vamos incluir
Soluo quatro tipos diferentes de veculos com dirias ajustadas ao seu
Para a maioria dos problemas mencionados at agora, uma tipo, quanto melhor o carro, maior o valor de aluguel. O script da
soluo razovel envolve a atualizao manual ou a criao de Listagem 8 far a incluso destes dados.
estatsticas. Se introduzir ndices filtrados ou estatsticas filtradas,
ento atualizaes manuais tornam-se ainda mais importante.
No se deve depender exclusivamente da atualizao automticas Listagem 8. Insero de registros na tabela de aluguel de veculos.

e de estatsticas filtradas. WITH tipo_veiculo(minimo, maximo, tipo) AS


( SELECT 40, 69, Bsico
Estatsticas automticas de mltiplas colunas UNION ALL SELECT 70, 99, Sedan
UNION ALL SELECT 100, 149, Camionete
UNION ALL SELECT 149, 250, Luxo
Problema
)
Ao confiar na criao automtica de estatsticas, preciso lembrar INSERT veiculo_aluguel(tipo_veiculo, valor_diaria)
que essas so sempre as estatsticas de uma nica coluna. Em mui- SELECT tipo, minimo+abs(checksum(newid()))%(maximo-minimo)
tas situaes, o otimizador pode tirar proveito das estatsticas de FROM tipo_veiculo
mltiplas colunas e recuperar a contagem de linhas mais exatas. INNER JOIN numero ON n <= 25000
GO
UPDATE STATISTICS veiculo_aluguel WITH FULLSCAN
Soluo
Neste caso deve-se adicionar as estatsticas de mltiplas colu-
nas de forma manual. Encontrar estatsticas de apoio a mltiplas Como pode ser observado, h valores das dirias de veculos
colunas pode ser bastante difcil, mas o Database Engine Tuning de luxo na faixa entre R$ 149,00 e R$ 250,00, enquanto que carros
Advisor (DTA) pode ajudar nessa tarefa. bsicos possuem dirias entre R$ 40,00 e R$ 69,00, por exemplo,
no total, o script adiciona 100.000 linhas a tabela.
Estatsticas para colunas correlatas no so suportadas Agora imagine que um cliente pede um veculo de luxo, mas
H uma situao especfica em que as estatsticas podem no ele deseja pagar menos que o valor mnimo estipulado, ou seja,
funcionar como esperado, uma vez que elas no so projetadas deseja pagar menos de R$ 149,00 por dia para este tipo de veculo.
para colunas correlatas. Colunas correlatas so aquelas que con- O cdigo a seguir exibe a consulta para esta escolha:
tm dados que so relacionados. s vezes voc ir se deparar
com duas ou mais colunas, diferentes, em que os valores no so SELECT * FROM Veiculo_aluguel
independentes umas das outras; tais exemplos podem incluir WHERE Tipo_veiculo=Luxo
idade e tamanho de uma criana, ou sexo e altura. AND Valor_diaria < 149

Edio 130 SQL Magazine 21


Melhoria de desempenho utilizando estatsticas e ndices

Sabendo que no existe um veculo como este no banco de dados, Observe a Listagem 9 onde adicionamos um ndice como dica
a consulta retorna zero linhas. Mas observe o plano de execuo de consulta.
real, conforme mostra a Figura 6.
Listagem 9. Adio de ndice como dica de consulta.

SELECT * FROM veiculo_aluguel


WITH (index=ix_veiculo_aluguel_tipo_veic_valor_diaria)
WHERE tipo_veiculo=Luxo
AND valor_diaria < 149
Figura 6. Plano de execuo da consulta.

Por que ndice criado anteriormente no utilizado aqui? O plano de execuo ir executar com base no ndice informado.
As estatsticas so atualizadas desde que seja informado na Note que a contagem de linhas estimada no mudou uma vez que o
execuo o comando update statistics, logo aps inserir as 100 mil plano de execuo gerado antes da execuo da consulta e as estima-
linhas. A consulta retorna zero linhas, de modo que o ndice tivas de cardinalidade so os mesmos em ambos os experimentos.
seletivo e deve ser usado, certo? Uma anlise sobre a contagem de No entanto, o nmero de leituras necessrias (monitorado com
linhas estimadas d a resposta: a Figura 7 mostra as informaes set statistics io on) foi reduzido drasticamente. No ambiente de teste
do operador para a verificao de ndice agrupado. haviam 5.578 leituras lgicas para a verificao do clustered index scan
e apenas quatro leituras lgicas quando a busca de ndice usada.
claro que esta soluo tambm expe uma grande desvanta-
gem. Apesar do fato de que uma dica de ndice aparentemente
til, neste caso, voc deve geralmente evitar o uso de dicas de
ndice (ou dicas de consulta em geral) sempre que possvel. Dicas
de ndice reduzem em potencial as opes do otimizador, e pode
levar a planos de execuo insatisfatrios quando os dados da
tabela foram alterados de forma que o ndice no seja mais til.
Pior ainda, h uma chance de que a consulta se torne totalmente
invlida quando o ndice for excludo ou renomeado.

2. Usando ndices filtrados


A partir do SQL Server 2008 existe a oportunidade de traba-
lharmos com ndices filtrados. Isso bastante satisfatrio para
a consulta em questo. Como se tem apenas quatro valores dis-
tintos para a coluna tipo_veiculo, possvel criar quatro ndices
Figura 7. Erro na contagem de linhas estimadas para colunas correlacionadas diferentes, um para cada tipo de veculo. Um ndice especial para
tipo_veiculo= Luxo ficar conforme o cdigo a seguir:
Veja a enorme discrepncia entre o nmero estimado e o real
de linhas. O otimizador espera que o conjunto de resultados CREATE NONCLUSTERED INDEX ix_veiculo_aluguel_tipo_luxo_valor_diaria
deva ser de cerca de 16 mil linhas, e a partir deste ponto de vista ON veiculo_aluguel(valor_diaria)
perfeitamente compreensvel que um clustered index scan foi WHERE tipo_veiculo=Luxo
escolhido na execuo.
Ento, onde est a razo para este comportamento estranho? Para os outros trs valores de tipo_veiculo, deve-se criar os n-
necessrio inspecionar as estatsticas, a fim de dar uma resposta dices idnticos com condies de filtro ajustados para cada tipo.
a esta pergunta. Se abrirmos a pasta Estatsticas dentro de Ao final, deve-se ter quatro ndices e tambm quatro estatsticas
Objetos (dentro do Management Studio), a primeira coisa que que so praticamente ajustados s consultas. O otimizador pode
se pode perceber uma estatstica criada automaticamente para tirar proveito desses ndices feitos sob medida. As estimativas de
a coluna no indexada valor_diaria. cardinalidade agora so perfeitas, juntamente com um plano de
execuo sem falhas, como pode ser visualizado na Figura 8.
Solues Os ndices filtrados fornecem uma soluo muito elegante para
o problema de colunas correlacionadas.
1. O uso de um ndice
O plano de execuo do problema citado no satisfatrio. Isso 3. Usando estatsticas filtradas
fcil de verificarmos, basta forarmos o otimizador a usar o Com a criao de um ndice filtrado, o otimizador foi capaz de
ndice existente (tipo_veiculo, valor_diaria). criar um plano ideal. Entretanto, estimativas de cardinalidade

22 SQL Magazine Edio 130


no so ganhos de ndices. Na verda-
de, so as estatsticas indexadas que
representam a avaliao alterada.
Ento, porque no deixar o ndice
original no lugar e criar estatsticas
filtradas em vez disso? o que ire-
mos fazer agora. Podemos remover o
ndice filtrado e criar uma estatstica
filtrada como uma alternativa, confor-
me observado na Listagem 10.
Fazendo o mesmo para os outros
trs valores da coluna tipo_veiculo,
novamente teremos quatro histogra-
mas diferentes, um para cada valor Figura 8. Melhoria do plano de execuo com ndices filtrados
distinto desta coluna. Ao executar
a consulta da Listagem 9 novamente, veremos que o plano de Autor
execuo idntico ao apresentado na Figura 8.
Fabio Sarturi Prass
fabio@fp2.com.br
Listagem 10. Excluso de ndice e criao de uma estatstica especfica Gerente de Projetos na FP2 Tecnologia (www.fp2.com.br),
possui Mestrado em Cincia da Computao pela Universidade
DROP INDEX ix_veiculo_aluguel_tipo_luxo_valor_diaria ON veiculo_aluguel
GO
Federal de Santa Maria (UFSM) e atua como professor na Antnio Mene-
CREATE STATISTICS sf ON veiculo_aluguel(valor_diaria) ghetti Faculdade, no curso de Sistemas de Informao. Domnio em Java,
WHERE tipo_veiculo=Luxo .NET e UML. Slido conhecimento em Engenharia de Software e Banco de Dados.

O SQL Server cria estatsticas automaticamente para permitir Links:


que o otimizador de consulta faa as escolhas do plano certo com
base nos custos estimados. Enquanto este um recurso muito til Estatsticas no SQL Server 2014
http://msdn.microsoft.com/pt-br/library/ms190397.aspx
e que elimina a criao manual e a manuteno de estatsticas, ele
pode apresentar sobrecarga indesejvel em sistemas onde estas
estatsticas no so eliminadas periodicamente. Voc gostou deste artigo?
Caso existam processos automticos para a criao e atualizao
de estatsticas, interessante fazer uso deles. Deixe o SQL Server D seu voto em www.devmedia.com.br/sqlmagazine/feedback
fazer a maior parte do trabalho. A opo de criar e atualizar as
Ajude-nos a manter a qualidade da revista!
estatsticas automaticamente deve funcionar muito bem em quase
todos os casos. Use os mecanismos automticos incorporados, mas
no dependa exclusivamente deles. Reconstrua ndices fragmen-
tados quando necessrio. Isso tambm ir atualizar as estatsticas
indexadas existentes com verificao completa.

Edio 130 SQL Magazine 23


Conhecendo e
evitando problemas
com transaction log
E Fique por dentro
m muitas organizaes no existe o papel do ad-
ministrador de banco de dados, ficando o admi-
nistrador de sistemas ou mesmo o programador Este artigo ser til para auxiliar o leitor a compreender o funcio-
a cargo desta tarefa. Isto faz com que as atividades de namento e arquitetura do transaction log, bem como os cuidados a
administrao do banco de dados e todo o cuidado na serem tomados em movimentaes de grandes volumes de dados de
manuteno dos dados seja posto, por vezes, em segundo forma a no afetar negativamente a performance do banco de dados.
plano. Em outros casos as funes de DBA so executa- Para isso, sero abordadas tcnicas de movimentao de dados que
das por um profissional pouco experiente ou que desco- ajudam a minimizar o consumo excessivo de espao no transaction log.
nhece o funcionamento e a importncia do transaction O transaction log um componente existente em todos os bancos de
log. Esta falta de conhecimento no funcionamento do dados SQL Server, tendo um papel de alta criticidade no controle de
transaction log faz com que o profissional adote medidas consistncia do banco de dados em caso de falhas inesperadas como
que podem prejudicar a performance ou mesmo causar falta de energia ou falha de hardware.
indisponibilidade do banco de dados.
O transaction log um componente existente em todos
os bancos de dados SQL Server, tendo um papel de alta muito comum, em especial, em processos de migrao de
criticidade no controle de consistncia do banco de dados dados de uma tabela para outra ou mesmo de banco de dados
em caso de falhas inesperadas como, por exemplo, falta para outro, movimentar todo o contedo da tabela numa nica
de energia ou uma falha de hardware. transao. Nestes casos, quanto maior for a tabela, maior ser
Como forma de garantir a consistncia, todas as tran- o impacto no transaction log. Em substituio a esta prtica,
saes que efetuem modificaes no banco de dados o melhor seria a criao de uma estrutura que permita a mo-
so registradas no transaction log. Entende-se por vimentao dos dados em blocos transacionais menores e de
modificao qualquer adio, alterao e/ou elimina- pouco impacto.
o em qualquer objeto ou dados do banco de dados. A arquitetura do transaction log, bem como compreender o
A manipulao dos dados pode levar o SQL Server a seu funcionamento, so pontos importantes para um melhor en-
alocar ou remover pginas de dados do buffer e dos tendimento do caso prtico que ser apresentado ao longo deste
arquivos de dados, mas antes esta movimentao ser artigo. Desta forma, o prximo tpico abordar alguns aspectos
registrada no transaction log. Resumindo, tudo que importantes sobre esta arquitetura.
modifique o banco de dados fica registrado.
Um caso tpico de problema com o transaction log Arquitetura do transaction log
o controle do seu crescimento, que normalmente O SQL Server utiliza o conceito ACID, acrnimo para as pro-
est relacionado a: blocos transacionais envolvendo priedades Atomicidade, Consistncia, Isolamento e Durabilidade,
uma grande quantidade de registros, transaes com analisadas a seguir:
durao temporal muito longa ou por falta de backup Atomicidade: toda a transao deve ser atmica, ou seja, tratada
do transaction log, quando aplicvel. Estas situaes de forma nica. Se uma parte da transao no for confirmada,
podem fazer com que o log transacional cresa muito, toda a transao ser revertida;
ao ponto de que, em alguns casos, preencha todo o Consistncia: garante que os dados esto ntegros de acordo com
espao livre em disco ou mesmo chegue ao seu limite as restries lgicas aplicadas atravs das foreign keys, primary
de crescimento. keys, contrains, entre outras;

24 SQL Magazine Edio 130


Isolamento: esta propriedade garante que as transaes sejam quanto a quantidade de VLFs so automaticamente determinados
tratadas de forma separada, consoante o isolamento escolhido, pelo SQL Server no momento da criao do arquivo de transaction
que podem ser: read uncommitted, read committed, repeatable log ou no momento em que este tem o seu tamanho alterado.
read, snapshot e serializable; A Figura 1 ilustra a arquitetura interna do transaction log.
Durabilidade: garante que os dados persistam no banco de
dados e no sejam perdidos aps o restart do servidor.

O transaction log aplica duas destas propriedades: atomicidade


e durabilidade. Em outras palavras, podemos dizer que o SQL
Server, atravs do log de transao, garante que as transaes se- Figura 1. Arquivo de transaction log
jam atmicas, ou seja, no momento do commit todo o contedo da
transao dever ser confirmado, caso contrrio todo o contedo O tamanho ocupado pelo transaction log pode ser analisado
ser revertido. Com a aplicao da durabilidade garantido que em duas perspectivas: o tamanho fsico e o tamanho lgico.
todas as transaes confirmadas no banco de dados continuaro Quando se fala em tamanho fsico do transaction log, referente
a existir, mesmo aps o reincio do servidor ou aps algum crash ao espao que ele ocupa em disco fisicamente. J o espao lgi-
de sistema. co s possvel visualizar atravs da utilizao de uma query.
O transaction log funciona com uma espcie de sniffer, capturan- A Listagem 1 apresenta uma das formas de visualizao do espao
do todas as modificaes efetuadas sobre o banco de dados. Estas fsico e do espao lgico.
modificaes vo desde alocaes de pginas at a manipulao O transaction log utiliza o espao lgico para armazenar os
dos dados propriamente dita, por exemplo: ao inserir um cliente VLFs, ou seja, os registros inseridos no transaction log iro ocupar
em uma tabela, o SQL Server dever aprovisionar novas pginas o espao disponvel dentro de cada VLF e quando no houver
de dados e/ou ndices para armazenar este novo cliente. O apro- mais espao o SQL Server ir realizar uma operao denominada
visionamento das pginas ser registrado no transaction log como auto crescimento, que o aumento do espao fsico ocupado pelo
pertencente transao que iniciou a insero do cliente, tal como transaction log. Alm disso, sempre que houver um aumento de
este novo cliente tambm ficar registrado no log de transao. espao fsico, novos VLFs sero criados.
muito importante que todas as modificaes fiquem registradas,
porque caso seja necessrio reverter a transao, tudo ter que ser
Listagem 1. Visualizao do espao lgico e fsico.
revertido, incluindo as pginas alocadas.
Internamente o transaction log um arquivo de escrita sequencial, 01 SELECT
onde cada registro possui um LSN (Logical Sequence Number), o ID da 02 [Filegroup] = ISNULL(sf.groupname, TLOG)
03 ,[Nome] = a.name
transao, o tipo de transao, a informao adicionada, modificada 04 ,[Tamanho_Maximo_MB] = case maxsize when 268435456 then -1
ou eliminada, assim como a informao existente antes da modi- 05 else maxsize*8 /1024 end
ficao ou eliminao, possibilitando com isso efetuar o rollback 06 ,[Espao_Fisico_Ocupado_MB] = CAST(a.Size/128.000 as float)
07 ,[Espao_Logico_Ocupado_MB] = CAST(FILEPROPERTY
se necessrio. Alm destas, tambm so registradas muitas outras (a. Name,SpaceUsed)/128.000 AS float)
informaes pertinentes para o funcionamento do transaction log. 08 ,[Espao_Logico_Disponivel_MB] = CAST((a.Size-FILEPROPERTY
Os registros no transaction log pertencentes mesma transao (a. Name,SpaceUsed))/128.000 AS float)
09 ,[Auto_Crescimento_MB] = a.growth *8 /1024
esto interligados entre si, o que permite ao SQL Server rapida- 10 ,[Arquivo] = a.filename
mente desfazer uma transao. Por exemplo: se uma transao 11 FROM sys.sysfiles a WITH (NOLOCK)
for inserir mil registros na tabela, e se ao inserir o registro de 12 INNER JOIN sys.database_files d WITH (NOLOCK) ON d.file_id = a.fileid
13 LEFT JOIN dbo.sysfilegroups sf WITH (NOLOCK) ON a.groupid = sf.groupid
nmero 900 houver um erro, este erro iniciar o rollback, que nada
mais do que remover os 899 registros inseridos. Para desfazer
a transao ou simplesmente efetuar o rollback, o SQL Server ir Por padro, o SQL Server traz configurado o valor de 10MB
registrar no transaction log os comandos de eliminao das 899 para o auto crescimento do transaction log. Assim, cada vez que
linhas inseridas na tabela. E como forma de garantir que haver houver a necessidade de crescimento, ser criado um ou mais
espao suficiente no transaction log para efetuar o rollback, o VLFs. Por exemplo: um banco de dados que necessite aumentar
SQL Server reserva um espao adicional para a transao no o transaction log em 1GB e tenha o auto crescimento configurado
transaction log, espao este que imediatamente liberado aps em 10MB ir produzir mais de 100 VLFs. Neste momento vale
o commit da transao. ressaltar que quanto maior for a quantidade de VLFs em um
Os registros inseridos no transaction log so armazenados em transaction log, maior ser a sua fragmentao interna, e quanto
unidades denominadas VLF, acrnimo para Virtual Log File, e maior a fragmentao interna, menor ser a sua performance nos
cada arquivo de transaction log pode conter vrias unidades de processos de leitura como, por exemplo, backup do transaction
VLF, interligadas entre si como se fossem uma lista encadeada, log, o processo de CHECKDB ou ainda a recuperao do banco
onde cada unidade possui um tamanho definido. Tanto o tamanho de dados aps o crash do servidor.

Edio 130 SQL Magazine 25


Conhecendo e evitando problemas com transaction log

A configurao do auto crescimento do transaction log muito com base no exemplo da Figura 1, o transaction log deixar de
importante para prevenir a sua fragmentao. Deste modo, se for escrever por falta de espao. Se isto acontecer, o banco de dados
definido um valor baixo, corre-se o risco de haver vrios autos ficar indisponvel at que seja feito um backup do transaction
crescimentos, o que fragmentar o transaction log. Por outro lado, log ou a adio de espao, que pode ser atravs do aumento da
a configurao de um valor demasiadamente alto para o auto capacidade do disco ou atravs da criao de outro arquivo de log
crescimento far com que o transaction log leve muito tempo em um disco com espao livre disponvel.
para expandir, o que causar perda de performance durante a O SQL Server marca cada VLF para saber se este est em uso
sua expanso. O ideal encontrar o tamanho adequado para o ou se o mesmo pode ser reaproveitado. No caso do modo de
transaction log, efetuar o seu crescimento de uma nica vez e recuperao full ou bulk-logged, todos os VLFs utilizados at a re-
manter o auto crescimento com um valor nem muito alto nem alizao de um backup estaro marcados como ativos. Em modo
muito baixo como, por exemplo, 512MB. de recuperao simples, se uma transao iniciar em um VLF e
O SQL Server utiliza cada unidade de VLF de forma sequencial, terminar em outro, ambas as unidades de VLF ficaro marcadas
isto , os registros a serem escritos no transaction log sero escritos como ativas. Uma unidade de VLF somente ser reaproveitada
primeiro no Virtual Log 1. Quando este ficar cheio, o SQL Server caso no exista nenhuma transao ativa dentro desta e aps o
passar a escrever no Virtual Log 2 e assim por diante. A unidade processo de checkpoint deixar de utiliz-la.
de VLF que est sendo utilizada pelo SQL Server marcada como O mecanismo de checkpoint permite ao SQL Server realizar
unidade ativa, o que ilustrado na Figura 2 pela coluna status. duas importantes tarefas:
Esta coluna pode conter os valores 0 ou 2, sendo 0 para indicar a 1. Por uma questo de performance, todas as modificaes no ban-
unidade no ativa e 2 para indicar a unidade de VLF ativa. co de dados so feitas em memria e simultaneamente escritas no
O resultado apresentado foi obtido atravs do comando DBCC transaction log. Assim, um dos objetivos do checkpoint escrever
LOGINFO(<<Banco de dados>>), que ilustra o tamanho e status as alteraes feitas em memria no arquivo do banco de dados;
de cada VLF (cada linha corresponde a um VLF). 2. Outra tarefa importante do checkpoint marcar no transac-
tion log o ponto mnimo de recuperao (MinLSN) do banco de
dados como, por exemplo, se o servidor for desligado de forma
inesperada, o SQL Server dever ser capaz de ler o transaction
log a partir do MinLSN e recuperar as informaes que ainda no
foram copiadas para os arquivos do banco de dados. A marcao
do MinLSN tambm importante para permitir que os VLFs
anteriores possam ser reaproveitados para novas escritas.

A Figura 3 ilustra a existncia de um checkpoint no transaction


log. Este checkpoint ocorreu no Virtual Log 4 e marcou o MinLSN
no Virtual Log 3. Como consequncia, os VLFs 1 e 2 podero ser
reutilizados para escrita. No entanto, o Virtual Log 3 ainda no
poder ser reutilizado devido existncia do MinLSN sobre ele.

Figura 2. Resultado do comando DBCC LOGINFO(<<Banco de dados>>)

A forma como o SQL Server manipula cada unidade de VLF


definida atravs do parmetro Recovery Model (modo de recu-
perao) do banco de dados. Este parmetro possui trs possveis
valores de configurao: Simple, Full e Bulk-Logged.
No modo de recuperao simple, o transaction log funciona de Figura 3. Ilustrao do Virtual Log File
forma circular, ou seja, quando o ltimo VLF for utilizado, o SQL
Server volta a utilizar o primeiro. No entanto, vale ressaltar que Visto que as modificaes feitas no banco de dados so efe-
a ordenao numrica de cada VLF incrementada, ou seja, o tuadas em memria e simultaneamente no transaction log,
Virtual Log 1, quando for reutilizado, passar a ser o de nmero a Listagem 2 permite consultar todos os dados existentes no
6 e o Virtual Log 2 passar a ser o de nmero 7, por exemplo. buffer cache que foram modificados e ainda no foram escritos
Caso utilize o modo de recuperao full ou bulk-logged, este no arquivo de dados do banco de dados.
reaproveitamento feito somente aps um backup do transac- Dado que as alteraes no banco de dados so feitas em nvel de
tion log. Por exemplo, se houver uma transao muito grande memria (buffer cache) e escritas no transaction log, como forma
que necessite do espao dos cinco VLFs e mais algum espao, de garantir a durabilidade dos dados, o SQL Server possui um

26 SQL Magazine Edio 130


componente responsvel por assegurar que todas estas modifi- volume de dados que ser copiado ou eliminado, caso contrrio
caes sejam registradas no transaction log. Este componente o poder aplicar tcnicas pouco adequadas para alcanar o objetivo,
Transaction Manager, e o processo de garantia de escrita no log o que poder comprometer a performance do banco de dados ou
conhecido como write-ahead logging, ou simplesmente WAL. indisponibiliz-lo por falta de espao no transaction log.

Listagem 2. Dirty pages no buffer cache. Listagem 3. Estrutura de dados da tabela.

01 select d.name, d.database_id, b.* 01 CREATE TABLE LoggingAPP (


02 from sys.dm_os_buffer_descriptors b 02 id int identity(1,1)
03 inner join sys.databases d on b.database_id = d.database_id 03 ,[date] datetime
04 where is_modified = 1 04 ,[op1] nvarchar(200)
05 ,[op2] nvarchar(200)
06 ,[op3] nvarchar(200)
07 ,[xml] xml
Diferentemente dos arquivos de dados do SQL Server, o tran- 08 ,[general_opp] nvarchar(4000)
saction log no necessita de mais do que um nico arquivo para 09 ,CONSTRAINT PK_LoggingAPP PRIMARY KEY CLUSTERED (ID)
10 )
ter um bom desempenho. Isto quer dizer que devido sua ar-
11 GO
quitetura dividida por VLFs, o SQL Server somente utilizar um 12 CREATE NONCLUSTERED INDEX IX_LoggingAPP_date ON LoggingAPP
segundo arquivo de transaction log quando o primeiro arquivo ([date])
13 INCLUDE ([op1], [op2])
ficar cheio. 14 GO
Saiba que a existncia de vrios arquivos de transaction log no 15 CREATE NONCLUSTERED INDEX IX_LoggingAPP_op3 ON LoggingAPP ([op3])
resolve problemas de performance, apenas disponibiliza mais 16 INCLUDE ([date])
17 GO
espao para o SQL Server poder escrever no log. A Figura 4 ilus-
tra a existncia de dois arquivos de transaction log, bem como a
sequncia dos VLFs nestes dois arquivos. Uma migrao de dados entre dois bancos de dados constituda
por duas etapas: na primeira, existe a cpia dos dados da tabela
Estudo de caso de origem para a tabela de destino. Nesta etapa o transaction
Como forma de ilustrar um estudo de caso, imaginemos uma log afetado ser o do banco de dados de destino, visto que ao
empresa com um banco de dados de nome BD_Producao configu- receber os dados estar modificando o banco de dados e estas
rado com o modo de recuperao simples, e com uma volumetria modificaes sero registradas no transaction log. A segunda
na ordem dos 800GB. Destes, cerca de 200GB so correspondentes etapa consiste em eliminar os dados da tabela de origem, j que
a dois anos de dados e mais de cinco milhes de registros, estando estes dados foram copiados para o banco de dados de destino.
estes dados concentrados na tabela LoggingAPP. Mensalmente, Nesta etapa o transaction log afetado ser o do banco de dados
para esta tabela, so produzidos mais de 200 mil registros, sendo de origem, visto que este sofrer modificaes que devero ser
que para o funcionamento do software necessrio apenas um registradas no transaction log
ms dos registros desta tabela. Apesar disso, um requisito de Dito isso, a Listagem 4 apresenta a forma que muitos DBAs
negcio manter os dados da tabela LoggingAPP durante pelo utilizam para copiar os dados de uma tabela para outra, estando
menos dois anos. estas tabelas no mesmo banco de dados ou em bancos de dados
Ademais, na mesma instncia do banco BD_Producao existe o separados. No entanto, esta tcnica poder trazer problemas
banco de dados BD_Report, que utilizado para a extrao de re- quando os dados a serem copiados forem de grande volumetria,
latrios. Uma possvel dor de cabea aparece aqui, pois um desses conforme apresentado no caso prtico.
relatrios est relacionado com a tabela LoggingAPP, e por isso, um A tcnica insert into ... select uma boa escolha quando a tabela
dos objetivos do DBA ser movimentar todos os dados com mais de destino est vazia e o banco de dados est com o parmetro
de um ms da base BD_Producao para o banco de dados BD_Report. Recovery Model configurado para simple. Isto produz o efeito
A Listagem 3 apresenta a estrutura da tabela LoggingAPP. de Minimal Logging, ou seja, o SQL Server registra muito pouca

Etapas para a migrao de dados


Conforme descrito no estudo de caso,
o administrador de banco de dados ter
o objetivo de migrar os dados da tabela
LoggingAPP do banco de dados de produo
(BD_Producao) para outro banco de dados,
que dar suporte extrao de relatrios
(BD_Report). Para executar esta tarefa o
DBA ou o programador deve ter cincia do Figura 4. Sequncia de VLFs entre dois arquivos de transaction log

Edio 130 SQL Magazine 27


Conhecendo e evitando problemas com transaction log

informao no transaction log. Contudo, para o nosso exemplo e se for necessrio efetuar o rollback da transao, maior ser o
esta soluo no se aplica, visto que a tabela de destino j possui tempo de espera para concluso desta operao, tal como o espao
dados. lgico do transaction log, que no poder ser reaproveitado, o que
Aps a cpia dos dados da BD_Producao para a BD_Report, os da- poder causar constrangimentos por falta de espao livre no disco
dos devero ser eliminados do banco de dados de origem, e para ou mesmo internamente no arquivo de log.
tanto, em muitos casos o cdigo da Listagem 5 utilizado, o que
poder causar problemas no transaction log quando a quantidade Boas prticas para movimentar grandes volumes de dados
de registros que se pretende eliminar for muito elevada. Para as migraes de dados no existe exatamente um manual,
mas sim, alguns cuidados em que o DBA dever ter antes de
Listagem 4. Cdigo inadequado para movimentar dados.
desenvolver uma soluo de movimentao de dados. A seguir
so apresentados alguns pontos que devem ser levados em consi-
01 SET IDENTITY_INSERT BD_Report.dbo.LoggingAPP ON derao antes da tomada de deciso a respeito da melhor prtica
02 INSERT INTO BD_Report.dbo.LoggingAPP (
03 [id], [date], [op1], [op2], [op3], [xml], [general_opp]) a se adotar:
04 SELECT [id], [date], [op1], [op2], [op3], [xml], [general_opp] Verificar a volumetria envolvida na movimentao: importante
05 FROM BD_producao.dbo.LoggingAPP que o DBA conhea o tamanho dos registros que sero movimen-
06 WHERE [date] < DATEADD(MONTH, -1, getdate())
tados, isto permitir uma melhor avaliao do espao necessrio
Listagem 5. Cdigo inadequado para eliminar dados. para o transaction log e tambm dar uma noo de quanto tempo
a migrao poder levar;
01 DELETE FROM BD_producao.dbo.LoggingAPP
02 WHERE [date] < DATEADD(MONTH, -1, getdate()) Verificar a capacidade de crescimento do transaction log: antes
de iniciar o processo de migrao o administrador de banco de
dados dever validar se existe espao em disco para o cresci-
Outro problema referente utilizao dos cdigos das Lista- mento do transaction log, se for aplicvel, assim como se este
gens 4 e 5 no haver um controle da transao, ou seja, quando componente est configurado para fazer o auto acrescimento se
o cdigo no possui a abertura e o fechamento explcito de uma for necessrio;
transao, o SQL Server implicitamente abre a transao no incio Verificar a existncia de transaes concorrentes sobre os
do cdigo e fecha-a ao final. O ponto negativo desta pratica que se dados a serem migrados: se a tabela que contm a informao
a transao manipular muitos registros, o transaction log poder que ser migrada est em uso pela aplicao, ou seja, se existe
requerer um maior consumo de espao em disco, visto que durante atividade constante de leitura e escrita sobre ela, o DBA dever
a transao no haver reutilizao do espao lgico. analisar quais os impactos que a migrao poder trazer devido
Para melhor exemplificar este caso, digamos que se uma nica aos locks que sero causados. Isso o permitir escolher o menor
transao ocupar 20GB e demorar uma hora, durante este perodo perodo temporal para fazer a migrao ou diminuir o tamanho
no haver recuperao lgica de espao no transaction log, e do bloco de registros a serem migrados, conforme apresentado
durante este perodo o log continuar a receber outras transaes na Listagem 6, como forma de reduzir a durao dos locks sobre
que tambm podero incrementar o seu tamanho lgico ou fsico. os registros. Isto poder evitar que o lock seja escalonado para o
E se por alguma razo esta transao tiver que ser revertida, o nvel de tabela, por exemplo;
espao ocupado no transaction log ser ainda maior e o tempo de Verificar a existncia ou no de dados na tabela de destino: o
rollback poder ser alto. transaction log um dos gargalos de performance do banco de
A utilizao destas tcnicas para movimentao de dados, dados e para minimizar este gargalo deve-se reduzir a quantidade
conforme apresentado no tpico Estudo de Caso, poder trazer de informaes que sero escritas neste componente. Umas das
problemas de performance, consumo excessivo de recursos do formas conhecidas chamada de Minimally Logged. Para se
sistema e, como visto, alto consumo de espao no transaction log. alcanar o Minimally Logged so necessrios alguns requi-
Uma transao muito grande tambm poder causar vrios locks sitos, sendo um deles a no existncia de registros na tabela de
no banco de dados, e dependendo da transao, este lock poder destino;
bloquear todo o funcionamento de uma tabela. Avaliar qual a configurao do recovery model: outro requisito
Quanto maior for uma transao: para o Minimally Logged que o banco de dados esteja confi-
maior ser o tempo de escrita no transaction log, aumentando gurado em simple ou bulk logged. Caso o banco de dados esteja
a concorrncia de escrita, tal como o seu tamanho; configurado com o modo de recuperao full, o DBA dever ter
maior ser a durao dos locks aplicados sobre o objeto; ateno ao crescimento do transaction log durante o processo de
maior ser a concorrncia de escrita no buffer cache; migrao dos dados;
o tempo de consumo de recursos de sistema ser mais elevado, Verificar a existncia ou no de replicao, mirroring ou
o que poder deixar outras operaes sem recursos ou provocar AlwaysOn: quando um banco de dados est envolvido em um
elevados tempos de espera no disco que suporta os arquivos de destes processos, no poder usufruir do Minimally Logged e
dados; o administrador do banco de dados dever avaliar se a migrao

28 SQL Magazine Edio 130


dos dados causar impactos negativos na replicao, mirroring ou Listagem 6. Movimentao de dados em blocos.
AlwaysOn, e como este efeito negativo poder ser contornado;
01 DECLARE @Top int
Verificar a existncia ou no de particionamento: uma tabela 02 DECLARE @RowCount int
particionada poder facilitar a movimentao dos dados, visto 03 DECLARE @Retry tinyint
que o DBA poder utilizar a tcnica de switch partition; 04 DECLARE @RetryNumber tinyint
05
Verificar a existncia de constraints, tanto na origem quanto 06 SET @Top = 10000
no destino: esta validao importante para no haver surpresas 07 SET @RowCount = 1
durante a migrao. Se existirem constraints do tipo foreign Keys 08 SET @Retry = 3
09 SET @RetryNumber = 1
no destino, os dados copiados podero no cumprir os requisitos 10
da constraint e o DBA receber um erro. Mas se a constraint existir 11 WHILE @RowCount > 0 BEGIN
12 Retry:
na origem, quando a migrao chegar na fase de eliminao dos
13 BEGIN TRY
dados na origem, o DBA poder receber um erro que impossi- 14 BEGIN TRAN
bilitar eliminar estes dados porque os mesmos fazem parte de 15 DELETE TOP (@Top) a
16 OUTPUT
uma foreign key;
17 DELETED.[ID]
Verificar a capacidade de armazenamento no destino: antes 18 ,DELETED.[date]
de iniciar o processo de migrao, o administrador de banco de 19 ,DELETED.[op1]
20 ,DELETED.[op2]
dados dever ter o cuidado de validar se o destino possui espao 21 ,DELETED.[op3]
suficiente para receber a informao que se pretende migrar; 22 ,DELETED.[xml]
Identificar qual a melhor tcnica a utilizar, ou seja, dependendo 23 ,DELETED.[general_opp]
24 INTO [BD_Report].[dbo].[LoggingAPP]
da configurao do banco de dados o DBA poder utilizar Bulk 25 (
Insert (BCP), Integration Services (DTSx), Transaction SQL, entre 26 [ID]
outras tcnicas. 27 ,[date]
28 ,[op1]
29 ,[op2]
Estes pontos podem fazer com que o DBA adote medidas dife- 30 ,[op3]
rentes, por exemplo: se o banco de dados no estiver envolvido em 31 ,[xml]
32 ,[general_opp]
nenhuma replicao, mirroring ou AlwaysOn e a tabela de destino 33 )
estiver vazia, o hint table TABLOCK far com que o SQL Server 34 FROM [BD_Producao].[dbo].[LoggingAPP] a
35 WHERE a.date <= DATEADD(MONTH, -1, GETDATE())
registre muito pouca informao no transaction log (chamado de
36
Minimally Logged). Outra operao de Minimally Logged ocorre 37 SET @RowCount = @@ROWCOUNT
quando o banco de dados est configurado com o modo de recu- 38
39 COMMIT
perao Bulk-Logged e a movimentao dos dados feita atravs 40
do comando BCP. J a existncia de particionamento facilitar a 41 END TRY
movimentao dos dados com a ajuda do switch partition, o que 42 BEGIN CATCH
43 IF ERROR_NUMBER() = 1205 BEGIN
tambm ir minimizar os locks em tabelas com muitas transaes 44 IF @RetryNumber > @Retry BEGIN
concorrentes. Estes so apenas alguns exemplos. 45 PRINT Deadlock detected. Attempting try number:
Para o exemplo apresentado no tpico Estudo de caso, a volume- 46 + CAST(@RetryNumber AS varchar(10)) + .
47 BREAK
tria envolvida na movimentao permitir avaliar se o transaction 48 END ELSE BEGIN
log ter ou no capacidade de armazenamento/crescimento para 49 ROLLBACK
suportar os registros de logs. Dado que sero movimentados 51 SET @RetryNumber = @RetryNumber + 1
51 GOTO Retry
cerca de cinco milhes de registros, o correspondente a aproxi- 52 END
madamente 200GB, possvel perceber que a capacidade do disco 53 END
54 END CATCH
que suporta o transaction log no conseguir suportar todos os
55 END
registros de log em uma nica transao (vide Listagem 6).
Para o exemplo apresentado, o DBA tambm dever levar em
considerao que ambos os bancos de dados compartilham o Na prtica, o cdigo apresentado define a quantidade de regis-
mesmo disco que suporta o transaction log de cada um, e que tros que devem ser inseridos por vez. Entre as linhas 6 e 9 pos-
aps a movimentao dos dados, estes devero ser eliminados svel especificar o tamanho deste bloco de registros, assim como a
na origem, visto j existirem no destino. Este processo produzir quantidade de vezes em que o processo voltar a tentar em caso de
entradas no transaction log de ambos os bancos de dados. deadlock. uma boa prtica adicionar o tratamento de deadlock
Com base nisso, a Listagem 6 apresenta uma das possveis for- em movimentao de dados em ambientes concorrentes.
mas de movimentao de grandes volumes de dados sem causar O tamanho do bloco de registro poder ser reajustado conforme
problemas no transaction log, assim como minimiza problemas o tipo de dados a movimentar, capacidade do disco que suporta o
relacionados utilizao de recursos de sistema e locks. transaction log ou outras diversidades de cada ambiente.

Edio 130 SQL Magazine 29


Conhecendo e evitando problemas com transaction log

Entre as linhas 15 e 35 encontra-se o bloco de cdigo que efetiva- muita latncia nos discos, o que prejudicar a performance de
mente copiar os dados de uma tabela para a outra e eliminar os outras queries, visto que estas ficaro espera de uma resposta
registros da tabela original caso a cpia seja efetuada com sucesso. do subsistema de disco;
Os dados deste cdigo esto condicionados clusula WHERE e ou ainda, uma utilizao muito intensiva de CPU, que poder
pelo delimitador TOP. Este mesmo cdigo encontra-se dentro de fazer com que algumas queries tenham que ficar aguardando
uma transao explcita declarada na linha 14 e confirmada com para utilizar o CPU.
commit na linha 39, em caso de sucesso.
Visto que todo o cdigo referido no pargrafo anterior Listagem 7. Consumo de transaction log e tempdb por transao.
encontra-se dentro de uma estrutura de tratamento de erros
(TryCatch), possvel identificar a ocorrncia de um deadlock 01 SELECT
02 [Uso_TLOG_mb] = database_transaction_log_bytes_used / 1024. / 1024.
atravs da captura do nmero do erro, conforme apresentado 03 ,[Inicio_tran]=convert(varchar(20), database_transaction_begin_time, 120)
na linha 43. 04 ,[DBName] = DB_NAME(database_id)
05 ,tst.transaction_id
Se um erro existir e for um deadlock, verificada a quantidade
06 ,tst.session_id
de retentativas j efetuadas (valor declarado na linha 8). Se este 07 ,[Qt_Registos_em_TLOG] = database_transaction_log_record_count
valor for inferior quantidade mxima de retentativas declarada 08 ,[TempDB_Session_mb] = ssu.alloc_pages - ssu.dealloc_pages
09 ,[TempDB_Task_mb] = tsu.alloc_pages - tsu.dealloc_pages
(linha 9), efetuado o rollback da transao, para em seguida
10 FROM sys.dm_tran_session_transactions tst WITH (NOLOCK)
efetuar a retentativa. Na linha 51 utilizado a instruo GOTO, 11 inner join sys.dm_tran_database_transactions tdt WITH (NOLOCK)
que permite enviar o controle de fluxo para um ponto definido 12 on tst.transaction_id = tdt.transaction_id
13 OUTER APPLY (
no cdigo; neste caso ser para a linha 12, onde encontramos o 14 SELECT
label Retry:. 15 u.session_id,
Na linha 37 capturada a quantidade de linhas eliminadas e esta 16 SUM(u.user_objects_alloc_page_count +
17 u.internal_objects_alloc_page_count)/128. AS alloc_pages,
enviada para uma varivel. Esta varivel testada no comando 18 SUM(u.user_objects_dealloc_page_count +
WHILE e quando esta for igual a zero, quer dizer que nenhuma 19 u.internal_objects_dealloc_page_count)/128. AS dealloc_pages
linha foi eliminada. Logo, todos os dados j foram devidamente 20 FROM sys.dm_db_task_space_usage u WITH (NOLOCK)
21 WHERE u.session_id = tst.session_id
copiados da origem para o destino e eliminados da origem. 22 AND database_id = 2
Uma das vantagens da utilizao desta tcnica que mesmo que 23 GROUP BY session_id
a tabela tenha uma coluna configurada com identity, a cpia dos 24 ) AS tsu
25 OUTER APPLY (
dados ser feita mantendo o valor deste campo, sem a necessidade 26 SELECT
de referenciar o cdigo SET IDENTITY_INSERT ON. 27 u.session_id,
28 SUM(u.user_objects_alloc_page_count +
altamente recomendado que antes da aplicao deste cdigo em
29 u.internal_objects_alloc_page_count) / 128. AS alloc_pages,
qualquer ambiente produtivo, este seja testado em um ambiente 30 SUM(u.user_objects_dealloc_page_count +
que no seja de produo. Assim, possvel aferir se o resultado 31 u.internal_objects_dealloc_page_count)/128. AS dealloc_pages
32 FROM sys.dm_db_session_space_usage u WITH (NOLOCK)
produzido o resultado esperado.
33 WHERE u.session_id = tst.session_id
Durante a execuo do cdigo da Listagem 6, pode-se utilizar o 34 AND database_id = 2
cdigo da Listagem 7 como forma de monitorar o espao que est 35 GROUP BY session_id
36 ) AS ssu
sendo utilizado no transaction log e na tempdb por transao. 37 ORDER BY tdt.database_transaction_begin_time
A falta de controle e a no limitao do tamanho do bloco tran-
sacional poder causar alguns constrangimentos em nvel de
performance ou mesmo paralisar uma ou mais tabelas durante a Alm disto, grandes transaes produzem muita escrita sobre o
execuo de uma transao. transaction log, e como j visto, enquanto uma transao estiver
Grandes blocos transacionais, alm de requererem mais tempo aberta, o espao interno no arquivo de log no poder ser rea-
de execuo, requerem uma maior utilizao de recursos (mem- proveitado ou o backup de log no produzir o efeito esperado,
ria, CPU e disco). De modo semelhante, uma grande quantidade conforme a configurao do recovery model do banco de dados.
de modificaes de dados pode levar o SQL Server Engine a Se isto acontecer, isto poder fazer com que o disco alcance o seu
escalonar o lock para um nvel de tabela e, neste caso, levar in- limite de armazenamento, deixando o transaction log sem espao.
disponibilizao total desta tabela at que a transao finalize. Em Por sua vez, isto poder deixar o banco de dados marcado como
alguns casos, o escalonamento poder chegar ao nvel de arquivo suspect, visto no ter espao disponvel para as operaes de
de dados ou mesmo ao nvel do banco de dados, no entanto isto rollback necessrias para desfazer a transao que no pde ser
depender bastante das tabelas envolvidas na transao, assim concluda por falta de espao.
como do nvel de isolamento aplicado. O exemplo apresentado na Listagem 6 possibilita que a migrao
A utilizao de recursos excessivos devido a grandes transaes dos dados seja dividida em vrios blocos transacionais, onde cada
pode levar: bloco manipular poucos registros. Esta prtica poder ajuda
a constrangimentos de falta de memria para outras sesses; a reduzir a durao e o escalonamento de locks, assim como a

30 SQL Magazine Edio 130


utilizao excessiva de recursos do sistema. Pequenas transaes Links:
tambm permitem um maior dinamismo na reutilizao do es-
pao lgico do transaction log. Por fim, o cdigo da Listagem 6 Arquitetura de log de transaes
https://technet.microsoft.com/pt-br/library/ms345419(v=sql.105).aspx
ainda permite que os deadlocks sejam tratados antecipadamente,
evitando que o processo como um todo seja abortado.
O log de transaes (SQL Server)
A monitorao do transaction log muito importante para um
https://msdn.microsoft.com/pt-br/library/ms190925(v=sql.110).aspx
DBA, especialmente durante as migraes de dados. No entanto,
existem diversas tcnicas que podem ser adotadas, como: a utili-
Transferindo dados de forma eficaz usando a alternncia de partio
zao do comando MERGE, que possibilita numa nica expresso
https://technet.microsoft.com/pt-br/library/ms191160(v=sql.105).aspx
copiar, atualizar e eliminar registros; a utilizao do comando
Bulk Insert, que permite copiar grandes volumes de dados de uma
Transferring Large Amounts of Data using Batch Inserts
nica vez; ou utilizar as ferramentas disponveis pela Microsoft,
http://sqlserverplanet.com/data-warehouse/transferring-large-amounts-of-data-using-
como o Integration Service ou o recurso de importe e exporte que batch-inserts
est disponvel no SQL Server Management Studio. Por fim, o DBA
dever ter sempre bem definido a forma de alcanar o objetivo Operaes que podem ser minimamente registradas em log
para que o desempenho da instncia no seja comprometido. Este https://technet.microsoft.com/pt-br/library/ms191244(v=sql.105).aspx
o grande desafio.
MERGE (Transact-SQL)
https://msdn.microsoft.com/pt-br/library/bb510625(v=sql.110).aspx
Autor
BULK INSERT (Transact-SQL)
Michael Miguel Antunes https://msdn.microsoft.com/pt-br/library/ms188365(v=sql.110).aspx
mma500@msn.com
Iniciou como desenvolvedor Clipper, Pascal, Delphi e TSQL du-
rante seis anos. Neste perodo, tambm lecionou programao Voc gostou deste artigo?
Pascal e Delphi, juntamente com teorias de base de dados para o Centro
de Educao Profissional Diomcio Freitas. H seis anos trabalha como
profissional de Administrao de Base de Dados e desenvolvedor TSQL, onde neste perodo D seu voto em www.devmedia.com.br/sqlmagazine/feedback
teve a oportunidade de trabalhar com SQL Server 2000/2005/2008/2008R2/2012 e 2014, Ajude-nos a manter a qualidade da revista!
tal como Reporting Services e Integration Services.

Edio 130 SQL Magazine 31


Como definir um Data
Warehouse na prtica
usando Transact SQL
A Fique por dentro
implementao do Data Warehouse, ou DW,
passou a se tornar realidade nas grandes
corporaes, que fazem parte de um mercado O artigo vai tratar dos principais conceitos relacionados a Data
maior, necessariamente o de Business Intelligence, onde Warehouse, mostrando atravs de um desenho didtico, como
ferramentas cada vez mais sofisticadas foram desenvol- funciona uma estrutura BI em suas principais fases, listando os
vidas para apoiar a estrutura do Data Warehouse nas principais conceitos do modelo relacional e dimensional, definindo
organizaes e sua crescente utilizao. o Data Warehouse moderno preparado para tratar grandes massas
O DW representa um grande banco de dados com o de dados nas organizaes contemporneas. Por ltimo, o artigo
objetivo de dar suporte nas decises de usurios finais, apresenta um estudo de caso prtico usando o Transact SQL no SQL
representados por gerentes e analistas de negcio. Server 2014, criando um banco de dados dimensional a partir de um
Geralmente, os dados que vo entrar na composio banco relacional, e por ltimo os processos ETLs usados para as cargas
de um DW so originados de diversos bancos de dados processadas no banco dimensional. O artigo til para estudantes e
operacionais que representam o ambiente da empresa profissionais que desejam entender os principais conceitos tericos
e, geralmente, esto localizados em um ponto diferente e prticos relacionados criao de um DW.
dos referidos bancos de dados operacionais.
Porm, para um entendimento prtico de toda a teoria
envolvida, importante no apenas definir o termo,
mas entender todo o processo envolvido na criao de nicas, mtodos e ferramentas que possibilitam ao usurio final
um DW e na sua concepo explicitando os objetivos analisar dados e, com base nessas anlises, extrarem respostas
finais de uma implementao. Seu objetivo funda- que vo subsidiar objetiva e confiavelmente os processos de
mental centrado na procura de uma forma eficiente deciso numa empresa.
de respostas s principais perguntas estratgicas da
organizao.
Para um entendimento do processo que compem
um DW, nada melhor do que a Figura 1 para mostrar
isso. Essa figura expe didaticamente, em blocos se-
parados, e por sua vez integrados, o entendimento dos
processos envolvidos na concepo de um DW e por
fim, no seu objetivo final que seria suprir a demanda
organizacional por suporte s suas decises mais
importante. E justamente neste quesito que entra o
Business Intelligence (BI).
Mas o que mesmo vem a ser a tecnologia de Business
Intelligence? Com relao ao termo BI, ainda no existe
uma definio formalizada, tanto com relao rea
de negcios, ou mesmo acadmica, sendo que podem
ser encontradas vrias definies do termo. Muitos
autores definem BI como sendo um conjunto de tc- Figura 1. Arquitetura de BI com o Dw como processo intermedirio

32 SQL Magazine Edio 130


Alguns autores sintetizam a importncia do termo BI quando
afirmam que ele abrangente, pois pode incluir arquiteturas,
ferramentas, bancos de dados, aplicaes e metodologias. afir-
mado que o principal benefcio do BI para a empresa seria sua
necessidade de fornecer informaes precisas quando necessrio.
Estas informaes so importantes para todo o tipo de deciso,
para o planejamento estratgico e mesmo para a sobrevivncia
da empresa.
Analisando figura possvel segregar a construo de um sis-
tema BI em trs fases distintas:
1. A Coleta: Composta pelos processos de ETL (Extrao, Trans-
formao e Carga);
2. A Consolidao e seus processos: Toda a consolidao dos
dados e informaes extradas atravs do processo ETL carre-
gada no DW e posteriormente nos Data Marts departamentais.
No exemplo, fazem parte os de Vendas, Produo, Financeiros e
de Logstica;
3. A Anlise e Distribuio: Representam os resultantes dos dois
primeiros (Data Mining, OLAP, Dashboard, DSS e relatrios).

importante destacar que, mesmo no fazendo parte dos


processos, a base de toda essa consolidao e anlise dos dados Figura 2. O processo ETL em esquema
da organizao, atravs do BI, s pode ser concluda atravs da
utilizao dos sistemas departamentais, transacionais (ERP, SCM, A Consolidao e seus Processos: DW e Data Marts
CRM e legados) e atravs de dados externos representados pelos A Figura 3 mostra o fluxo de construo e alimentao de um
arquivos *.txts (planilhas, arquivos textos e outros documentos DW, em que, a princpio, so escolhidos os sistemas que vo for-
diversos). necer os dados (Fontes de Dados), responsveis por alimentar o
DW em processo efetuado atravs de ferramentas ETLs. Posterior-
A Coleta: Processos ETL mente, a construo dos Data Marts ou bases multidimensionais
O processo ETL (Extraction, Transformingand and Loading, so criadas, geralmente no intuito de possibilitar a extrao de
ou Extrao, Transformao e Carga) consiste em um processo relatrios por departamentos na organizao.
de extrao, que ser usado para fazer a leitura de um ou mais Algumas das caractersticas mais importantes de um DW so:
bancos de dados. A transformao o processo que tratar da Ter uma orientao por assunto, armazenando informaes
converso dos dados extrados e tratamento destes para que relacionadas com o negcio principal da empresa com a funo
sejam carregados em um DW. Por ltimo, o processo de carga de atender as necessidades dos tomadores de decises;
o responsvel por carregar os dados no DW. Essas trs funes Definir uma forma nica de representar os dados, convertendo
bsicas geralmente so integradas com o uso de uma ferramenta os dados provenientes dos vrios sistemas da empresa, estabele-
para extrao de dados de um ou mais bancos tendo por objetivo cendo com isso uma integrao eficiente;
final a criao do DW. O valor dos dados inseridos no perdido durante o tempo,
Para muitos autores, para o processo ETL em um projeto centrado pois no apresentam volatilidade;
em dados, devem ser reservados 70% do tempo total planejado Dono de uma granularidade eficiente, sendo esta uma carac-
para o projeto. O ETL um processo extremamente importante, terstica que diz respeito ao nvel de detalhe ou de resumo dos
tanto na integrao de dados, quanto nos processos relacionados dados contidos em um DW.
ao DW. Simboliza uma das etapas mais crticas em um projeto
DW, onde as ferramentas utilizadas no processo ou so adquiri- Geralmente, a importncia do DW e sua implementao est
das de fornecedores ou so desenvolvidas na prpria empresa, frequentemente ligada a duas finalidades extremas, sendo que,
dependendo do projeto a ser implantado. em uma delas, o objetivo puramente estratgico e busca estudar
A Figura 2 representa um processo ETL em que os dados opera- tendncias dos negcios da organizao a longo prazo. A outra tem
cionais, geralmente provenientes de sistemas legados ou mesmo por finalidade a segmentao de clientes, funcionando como um
sistemas ERP, so extrados, transformados e carregados em um departamento individual executando atividades especficas.
DW que, por sua vez, atravs das ferramentas BI, so trabalhados Os Data Marts podem ser entendidos como extenses do DW.
em processos que vo resultar em relatrios, cubos, Dashboards e O aprendizado que obtido na concluso do projeto de cada Data
outras ferramentas de auxlio aos gestores na organizao. Mart traz contribuies para revises peridicas nos objetivos do

Edio 130 SQL Magazine 33


Como definir um Data Warehouse na prtica usando Transact SQL

projeto do Data Warehouse corporativo, no auxlio tomada de deciso empre- gerenciamento de banco de dados (SGBDs),
servindo de apoio para a prpria reviso sarial, como o Data Mining, que parte quanto para sistemas de Data Warehouse.
dos objetivos da organizao e seu plano componente da Figura 1. Isso pode incluir atividades como gerao
estratgico e ttico. Isto porque ao se fazer O Data Mining (Minerao de Dados) e resposta a consultas, solicitao de relat-
um mapeamento da relevncia dos indi- uma ferramenta que visa analisar, a partir rios, grficos ad hoc, execuo dos mesmos
cadores disponibilizados, na realidade, de uma grande massa de dados, padres e construo de apresentaes visuais,
se questiona se a informao ainda til existentes. A minerao uma tcnica oferecendo tambm uma viso conceitual
e por que no relevante, j que muitos recente, fazendo uso de vrias cincias multidimensional dos dados.
sistemas so construdos para reas de em seu escopo como inteligncia artificial, Os sistemas OLAP trabalham fornecendo
negcios que acabam ou so redefinidas estatstica, recuperao de informao e informaes de forma rpida e consisten-
pouco depois e com isso o sistema pode j reconhecimento de padres. A sugesto te, auxiliando muitas vezes no aumento
nascer com a utilidade comprometida. de tendncias um dos resultados pos- de produtividade e autossuficincia dos
sveis proporcionados pela minerao de funcionrios de uma organizao, j que
Anlise e Distribuio: os Resultados dados e que agrega valor nas decises trabalha de forma a possibilitar o molde de
A ltima fase do modelo apresentada organizacionais. problemas e solues de forma flexvel.
na Figura 1 aquela destinada anlise e Um exemplo interessante de sucesso no Vistos na Figura 1, como ferramentas
distribuio, que conta com uma srie de uso da minerao de dados o caso do de resultado, os Dashboards so como
ferramentas que vo servir para filtrar e Wallmart que, atravs de seu Data Mining, formulrios compostos de uma ou mais
apresentar toda a informao disponibili- estudou um fato que acontecia com certa camadas, na forma de um painel, contendo
zada e tratada, de forma a prover as mais frequncia: nas sextas-feiras, a venda de instrumentos virtuais em que se associam
diversas pesquisas que sero, por sua vez, cervejas crescia na mesma proporo que variveis que podem ser monitoradas
utilizadas pela gerncia da organizao. a de fraldas. Analisando atentamente, atravs de grficos e que vo mostrar sua
Para a tomada de decises empresariais, atravs de estudos a partir da minerao evoluo no tempo, podendo ser classifi-
necessrio prever resultados de proce- de dados, percebeu-se que os pais, ao com- cados como executivos, operacionais ou
dimentos alternativos diversos, e o mais prar fraldas, aproveitavam para abastecer de simulao. Essas ferramentas podem
simples desses mtodos inclui anlise de sua geladeira com cerveja. ser consideradas o produto final de um
somente duas variveis como, por exem- O termo OLAP (OnLine Analytical Pro- sistema de inteligncia do negcio, dis-
plo, vendas sobre tempo ou preo sobre o cessing Processo analtico OnLine) se ponibilizadas na fase Business Activities
tempo. Porm, em muitos casos, a previso refere a uma variedade de atividades que Monitoring Monitoramento de Ativida-
pode ser mais complexa, incluindo mais de normalmente so executadas por usurios des de Negcio (BAM).
duas variveis na anlise, o que engloba finais em sistemas online, e seus produtos Na Figura 4 temos um exemplo de
tambm o uso de mtodos estatsticos podem fornecer diversos recursos de Dashboard de vendas de uma empresa
com uma complexidade maior. Para isso, modelagem, anlise e visualizao de intitulado Desempenho de Vendas Cor-
existem metodologias que vo colaborar conjuntos de dados, tanto para sistemas de porativas. esquerda do Dashboard,
exibido um grfico com o ttulo de Vendas
reais por Canais, de janeiro a dezembro,
mostrando as quantidades de vendas em
valor classificadas por OEM, Industriais,
Internet e Consumidor. direita, um gr-
fico pizza mostra vendas em valor para
tipos especficos de produtos (Vesturios,
ticos e Equipamentos), com o ttulo de
Vendas por Produto. Por ltimo, na parte
inferior da figura, podem ser visualizadas
as metas de vendas por canais em valor,
mostrando as vendas projetadas, vendas
reais e o percentual alcanado da meta
estipulada sobre as vendas.
Os DSS (Decision Support System) da
Figura 1 podem ser entendidos como Sis-
temas de Suporte Deciso (SAD), ou mes-
mo sistemas baseados em conhecimento, e
Figura 3. O DW e seus Data Marts no processo de consolidao so compostos de um modelo genrico de

34 SQL Magazine Edio 130


tomada de deciso que analisa um grande
nmero de variveis para que seja possvel
a resposta a uma determinada questo.
Os relatrios provenientes do BI, expli-
citados na Figura 1, so na maioria das
vezes construdos atravs do DW a partir
de ferramentas da tecnologia BI. Essa
multidimensionalidade apresentada
quando se tem um conjunto de tabelas de
duas dimenses ou mesmo uma tabela
razoavelmente complexa. Isso serve para
fornecer ao usurio uma ferramenta que
possa simplificar a apresentao de infor-
maes, permitindo alteraes, de modo
rpido e fcil, na estrutura das tabelas,
visando torn-las mais adaptveis s tare-
fas da organizao e s suas necessidades
de deciso.
O objetivo principal da multidimen-
sionalidade seria a apresentao de um
relatrio para o gerente da forma como
este gostaria de v-lo, imprimindo nessas
visualizaes conceitos diferenciados, Figura 4. Exemplo de Dashboard
providenciados de forma rpida e com
facilidades inerentes ao processo. Trs
fatores so considerados de importncia
e esto ligados a dimenses, medidas e
tempo. As dimenses podem ser represen-
tadas por segmentos de mercado, unidades
de negcio, produtos, equipes de vendas,
localizaes geogrficas, pases e setores.
As medidas, por sua vez, so dinheiro, vo-
lume de vendas, nmero de funcionrios,
estoque e lucro previsto versus o lucro real.
O tempo pode ser composto por variveis
como dirio, semanal, mensal, trimestral
e anual na customizao de relatrios e
tambm nos modelos dimensionais cria-
dos e que veremos neste artigo um pouco Figura 5. Cubo de Dados de trs Dimenses
mais frente.
A Figura 5 mostra a representao de um tar algum atributo no banco de dados e, gvel e de forma dinmica para o usurio
cubo com trs dimenses principais sendo, respectivamente, as clulas no cubo de final. Na maioria das vezes, essas ferra-
por sua vez, produto, regio e tempo. Atra- dados vo representar medidas de inte- mentas multidimensionais trabalham em
vs da manipulao dessas dimenses, resse para a organizao, geralmente de conjunto com outras ferramentas no banco
possvel a extrao de relatrios dinmicos cunho estratgico. de dados.
e multidimensionais. A projeo de um cubo pode ocorrer As ferramentas e mtodos para a visu-
O cubo de informaes representa uma quando, a partir de vrios atributos rela- alizao de dados, tanto os Dashboards
construo multidimensional, onde os cionados, o usurio busca informaes de quanto os relatrios multidimensionais,
dados aparecem juntos com uma medida anlise que podem apresentar qualquer englobam um leque grande de tcni-
de interesse particular, podendo ser bi- mtrica como, por exemplo, vendas, lucro, cas, que vo desde uma capacidade de
dimensional, tridimensional ou mesmo unidades e outros, com o intuito principal identificar de maneira rpida tendncias
possuir uma dimenso superior apenas. de fornecer respostas rpidas a perguntas importantes em dados corporativos e de
Cada dimenso desse cubo vai represen- que podem ser exibidas em formato ami- mercado, at o fornecimento de vantagem

Edio 130 SQL Magazine 35


Como definir um Data Warehouse na prtica usando Transact SQL

competitiva. Usando ferramentas visuais, fica mais fcil para os a) Identificar os atributos que no so funcionalmente dependen-
gestores reconhecerem problemas e tendncias que, na maioria tes de toda a chave primria;
das vezes, passam despercebidos durante anos, encobertos por b) Remover da entidade todos esses atributos identificados e criar
relatrios complexos em formato texto. uma nova entidade com eles. A chave primria da nova entidade
Todo esse ambiente de visualizao apresenta aos gestores a pos- ser o atributo do qual os atributos removidos so funcionalmente
sibilidade de agregar valor a suas decises, principalmente pela dependentes.
possibilidade de visualizarem informaes com profundidade e
qualidade, inclusive em tempo real, o que serve para influenciar, J a Terceira Forma Normal (3FN) existe se somente estiver
de forma vital, o desempenho da empresa. na 2FN e todos os atributos no chave forem dependentes no
transitivos da chave primria (cada atributo for funcionalmente
Modelagem relacional e seus principais conceitos dependente apenas dos atributos componentes da chave primria
A modelagem relacional apesar de no ser o foco principal ou se todos os seus atributos no chave forem independentes entre
deste artigo, deve ser revista sempre que se falar em modelagem si). Isto acontece quando possvel:
dimensional, principalmente porque muitos dos conceitos apli- a) Identificar todos os atributos que so funcionalmente depen-
cados para a modelagem de bancos relacionais, que podemos dentes de outros atributos no chave;
conceituar aqui como bancos usados para aplicaes comerciais, b) Remov-los e criar uma nova entidade com os mesmos.
so usados na modelagem dimensional, salvo algumas mudanas
em conceitos dos dois modelos que sero melhores entendidos na A chave primria da nova entidade ser o atributo do qual os
evoluo deste artigo. atributos removidos so funcionalmente dependentes.
O modelo relacional possui como linguagem padro o SQL. Aps a normalizao, as estruturas dos dados esto projetadas
Os dados so representados e tratados como relaes matem- para eliminar as inconsistncias e redundncias dos dados,
ticas, os blocos bsicos so o domnio, ou tipo de dado e uma eliminando desta forma qualquer problema de atualizao e
tupla representa um conjunto de atributos ordenados em pares operacionalizao do sistema. A verso final dos dados poder
de domnio e valor. sofrer alguma alterao para atender as necessidades especficas
do sistema a critrio do analista de desenvolvimento durante o
Normalizao de Dados projeto fsico do sistema.
O modelo relacional permite a criao de um modelo lgico con-
sistente da informao armazenada, que pode ser refinado atravs Modelagem Dimensional e seus principais conceitos
do processo de normalizao. Esse processo define um conjunto A modelagem dimensional, diferente da modelagem relacional,
de regras que visa minimizar as anomalias de modificao dos no vai se fixar em todos os seus conceitos, mas vai usar alguns
dados e dar maior flexibilidade em sua utilizao. com algumas variaes. Nesta modelagem, o foco e principal con-
A normalizao de um banco de dados usada para minimi- ceito relaciona-se normalizao que praticamente inexistente
zar as redundncias e inconsistncias, permitindo facilidades no modelo dimensional.
relacionadas a manipulaes no banco de dados e tambm na Esta no normalizao, alis, pode ser entendida como a carac-
manuteno dos sistemas de informaes envolvidos. O proces- terstica principal do modelo e o mecanismo que vai garantir
so de normalizao vai envolver a aplicao de algumas formas um desempenho melhorado em 30% se relacionado e comparado
normais. ao modelo relacional.
A Primeira Forma Normal(1FN) acontece se somente todos os Diferente do modelo relacional, o modelo dimensional muito
domnios bsicos contiverem somente valores atmicos e isto im- assimtrico onde existe uma tabela dominante no centro do dia-
plica na no existncia de grupos repetitivos. Atingir esta forma grama com mltiplas junes conectando-a a outras tabelas. Cada
normal implica em eliminar os grupos repetidos. Esta eliminao uma destas tabelas secundrias vai possuir apenas uma juno
de grupos repetidos pode ser feita da seguinte maneira: com a tabela central. A tabela central chamamos de tabela de fatos
a) Identificar a chave primria da entidade; e as outras tabelas so chamadas de tabelas dimenso.
b) Identificar o grupo repetitivo e exclu-lo da entidade; Este modelo pode ser conferido na Figura 6, que apresenta um
c) Criar uma nova entidade com a chave primria da entidade modelo dimensional conhecido como modelo estrela (star join
anterior e o grupo repetitivo. schema), sendo um dos modelos mais usados. O modelo estrela
tem por caracterstica principal, e ponto forte, a no normaliza-
A chave primria da nova entidade ser obtida pela concatenao o de suas dimenses. Isto traz ao modelo uma performance
da chave primria da entidade inicial e a do grupo repetitivo. melhorada.
A Segunda Forma Normal(2FN) existe se, e somente se, ela es- Na Figura 6 possvel visualizar e entender o modelo dimen-
tiver na primeira e todos os atributos no chave forem totalmente sional estrela, que apresenta na parte central uma tabela Fato e
dependentes da chave primria (dependente de toda a chave e no ao seu redor as vrias dimenses (A, B, C, D e E), como partes
apenas de parte dela).Isto acontece quando se possvel: constituintes do modelo. Este modelo chamado de estrela porque

36 SQL Magazine Edio 130


uma tabela de fatos fica ao centro do modelo cercado das tabelas que o modelo floco de neve no to usado quanto o modelo
dimensionais. estrela e possui este nome porque cada dimenso vai se dividir
J o modelo floco de neve leva em considerao que algumas em vrias outras tabelas, que em sua visualizao lembram um
dimenses podem se apresentar normalizadas, relacionando-se floco de neve.
entre elas, conforme pode ser visto na Figura 7. Nela as tabelas No exemplo prtico usaremos o modelo estrela, principalmente
Categoria, Departamento e Marca tornam-se tabelas de dimen- por seu grande uso prtico e comercial.
ses auxiliares.
Modelos para a implementao de um DW
Para definir um DW com Data Marts (conhecido como aborda-
gem top-down) como o apresentado na Figura 8, em um primeiro
momento devemos fazer a montagem do DW corporativo com
todos os dados da organizao. Em um segundo momento, pro-
cedemos com a criao dos DM ou Data Marts departamentais.

Figura 6. O modelo estrela Star Schema


Figura 8. Abordagem top-down de um DW

Muitas empresas preferem no comear por este modelo, j


que o custo de implementao pode ser maior do que o da opo
apresentada na Figura 9.
Nesta segunda abordam - bottom-up, primeiro ocorre a criao
dos Data Marts para em seguida ocorrer a montagem do DW
Organizacional.

Figura 7. O modelo floco de neve Snow Frak

possvel identificar atravs da figura que as tabelas de dimen-


ses auxiliares normalizam as tabelas de dimenses principais.
Tabelas como (ano, ms e dia), que normalizam a dimenso
Tempo, Categoria, Departamento e Marca vo consequentemen-
te normalizar a dimenso produto e a tabela Meio normaliza a
dimenso promoo. Figura 9. Abordagem Buttom-Up de um DW
Se for utilizado este modelo na construo da base de dados,
ser utilizado um nmero maior de tabelas que iro representar Geralmente, o modelo exposto o preferido nas organizaes
as mesmas dimenses, mas que ocuparo um espao em disco j que pode apresentar um custo menor de implementao e um
menor do que no modelo estrela. importante destacar tambm resultado mais rpido.

Edio 130 SQL Magazine 37


Como definir um Data Warehouse na prtica usando Transact SQL

O processo pode ser construdo de acordo com as necessida- o ODS possui claramente caractersticas de um DSS (Decision
des da organizao e a priorizao de certos indicadores que Support System) ou Sistema de Apoio Deciso.
podem ser essenciais. Indicadores de desempenho so medidas
calculadas, sendo compostos por mtricas. Os Indicadores vo Data Warehouse
servir para avaliao da performance organizacional, auxiliando DW leva em considerao no apenas os dados relacionais
na anlise de tendncia, atuao proativa, melhoria contnua e estruturados, ou mesmo o processo de conectar a uma base de
na atuao proativa trazendo assim transparncia empresa. dados relacional, extrair, limpar e carregar os dados, mas um
So normalmente expressos por percentuais, probabilidade, aprimoramento mais dinmico, que j prev a conexo dos DWs
frequncia, etc. hoje existentes a fontes de dados e a novas ferramentas como
A implementao de um DW pode tambm acontecer seguindo as preparadas para o NoSQL (Hadoop, MongoDb, Cassandra e
a abordagem apresentada na Figura 10, onde existe uma rea outros) para que os dados sejam tratados.
de Staging, que muitas vezes simboliza uma rea Pr-DW ou Alis, considerada tendncia nas solues e ferramentas para
Pr-Data Mart. Na maioria dos casos, essa rea indica o local o mundo DW o uso de conectores a todos os tipos e novas ferra-
de limpeza nos dados e preparao destes para que possam ser mentas existentes.
carregados ETL no DW. A concepo de grandes players de mercado com esta abertura
fato que j prev mudanas considerveis quando se fala de
tendncias como o Big Data. Ou seja, no h mais como ignorar
ferramentas como o NoSQL, que nasceram para os novos cen-
rios e mercados que precisam lidar com dados que no esto
estruturados e armazenados de forma a manter a estrutura criada
no passado.
Os dados estruturados do tipo logs da Web, dados de sensores,
sentimento social, so coletados para oferecer informaes mais
aprofundadas e fornecer vantagens competitivas. A estratgia
tradicional de extrair e limpar dados relacionais em um repositrio
central precisa ser adaptada para esse novo mundo de dados.

Figura 10. DW com Staging Area e Ods


Usando TSQL e SQL Server 2014 para construo de um DW a
partir de um banco relacional
Alm da Staging rea em destaque, a figura mostra o ODS, O estudo de caso proposto tem por objetivo, a partir de um
que poderamos aqui conceitu-lo de Armazm de Dados Ope- banco de dados relacional LjRelacional, definido e modelado na
racionais. O ODS pode ser visto como uma arquitetura que Figura 11 (diagrama entidade relacionamento), criar um banco
alimentada por programas de transformao e integrao. Estes dimensional que pode ser visto mais a frente. Para a criao
programas de transformao e integrao podem ser os mesmos do banco dimensional foram usados processos ETL (Extrao,
programas que alimentam um DW ou programas separados. O Transformao e Carga) para a carga das informaes contidas
ODS, por sua vez, alimenta um DW. no LjRelacional.
Alguns dados operacionais extrados via ETL dos sistemas O Diagrama Entidade-Relacionamento descreve toda a estrutura
transacionais da empresa podem ir direto para o DW, enquanto lgica do banco de dados. possvel constru-lo a partir do MER
outros dados operacionais so enviados diretamente para o ODS (Modelo Entidade-Relacionamento, que tem por objetivo repre-
e depois, do ODS para o Data Warehouse. sentar estruturas de dados da forma mais prxima do mundo
importante o entendimento que um ODS integrado, orien- real dos negcios), identificando assim a partir de um conceito
tado a assunto, voltil e estruturado conforme os valores atuais, do mundo real como os dados sero armazenados.
projetado para atender aos usurios operacionais em grandes A Figura 11 simboliza no estudo proposto, o banco que sustenta
processos de integrao, permitindo uma performance melhora- a aplicao comercial e ou mesmo o sistema ERP (Enterprise Re-
da. Sua essncia possibilitar um processo on-line de integrao source Planning) da empresa. O ERP um sistema de informao
coletiva, garantindo consistncia em grandes transaes de que integra todos os dados e processos de uma organizao em um
dois a trs segundos, integrado com vrias aplicaes, vises nico sistema. Esta integrao pode ser vista em uma perspectiva
coletivas e atualizaes de negcio, suportando processos de funcional (sistemas de finanas, contabilidade, recursos humanos,
apoio a deciso. fabricao, marketing, vendas, compras, etc.) e sob a perspectiva
Uma das caractersticas importantes de um ODS seu papel sistmica (sistemas de processamento de transaes, sistemas de
duplo, onde de um lado operacional, permitindo um bom tempo informaes gerenciais, sistemas de apoio deciso, etc.).
de resposta e uma alta disponibilidade, sendo qualificado para Como se trata de um modelo que ser usado comercialmente
atuao como base de um sistema de misso crtica. Por outro lado, por uma loja, possui objetos e entidades como:

38 SQL Magazine Edio 130


Marca: Tabela onde sero includas as marcas, possuindo uma
relao um para vrios diretamente referenciados com a tabela
produto;
Produto: Tabela onde sero cadastrados os produtos, possuindo
relao direta com as tabelas Itens e Estoque;
Itens: Tabela formada com a juno da tabela Produto e
Cupom Fiscal, possuindo ainda as entidades Quantidade e
Valor;
Estoque: Tabela usada para controlar a quantidade de produtos
por loja e tem ligao direta com as tabelas Produto e Loja;
Loja: A tabela Loja possui entidades para controle e codificao
da loja e dos atendentes por loja especfica, alm claro dos dados
da loja (nome, endereo e outros dados necessrios);
Cupom Fiscal: a tabela que controla a emisso do cupom fiscal,
e possui juno direta com as tabelas Atendente e Promoo;
Atendente: Tabela que registra os atendentes, possuindo enti-
dades para o lanamento dos dados gerais destes atendentes e o
registro do seu cdigo que seria uma identificao nica;
Promoo: Tabela que controla as promoes existentes na tabela
Loja. Esta tabela possui ligao direta com a tabela Cupom Fiscal,
j que deve a partir de uma promoo existente habilitar ou no Figura 11. DER usado para a criao do modelo Relacional LjRelacional
um desconto para determinado cliente.
linha 22 so criadas as tabelas a comear pela tabela Atendente,
As Listagens 1 e 2 mostram o script usado para a criao da finalizando na linha 73. Na linha 74 at o final da Listagem 2 so
Loja (LjRelacional). Este script deve ser usado na criao da Loja criados as constraints relacionadas base de dados.
(Relacional). Na linha 05 os arquivos fsicos (.mdf e .ldf) so cria- As Listagens 3 e 4 mostram o script usado para a insero de
dos diretamente no disco C:\tmp, visando facilitar o trabalho registros no modelo relacional (LjRelacional) para os testes a
inicial da criao do banco, listado das linhas 01 a 15. A partir da serem efetuados no modelo dimensional.

Edio 130 SQL Magazine 39


Como definir um Data Warehouse na prtica usando Transact SQL

Listagem 1. Script SQL usado para criao do Banco de Dados Relacional (LjRelacional) Parte 1

01. USE [master] 39. [Atendente_Codigo] [int] NULL,


02. GO 40. [Promocao_Codigo] [int] NULL,
03. /****** Object: Database [LJRelacional] Script Date: 12/04/2014 10:03:45 ******/ 41. [DataNF] [datetime] NULL,
04. CREATE DATABASE [LJRelacional] ON PRIMARY 42. [DadosNF] [nchar](100) NULL,
05. ( NAME = NLJRelacional, FILENAME = NC:\Tmp\LJRelacional.mdf , 43. CONSTRAINT [PK_CupomFiscal] PRIMARY KEY CLUSTERED
SIZE = 3072KB , MAXSIZE = UNLIMITED, FILEGROWTH = 1024KB ) 44. (
06. LOG ON 45. [Numero] ASC
07. ( NAME = NLJRelacional_log, FILENAME = NC:\tmp\LJRelacional_log.ldf , 46. )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF,
SIZE = 1024KB , MAXSIZE = 2048GB , FILEGROWTH = 10%) IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON,
08. GO ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
09. IF (1 = FULLTEXTSERVICEPROPERTY(IsFullTextInstalled)) 47. ) ON [PRIMARY]
10. begin 48. GO
11. EXEC [LJRelacional].[dbo].[sp_fulltext_database] @action = enable 49. /****** Object: Table [dbo].[Estoque] Script Date: 12/04/2014 10:03:45 ******/
12. end 50. SET ANSI_NULLS ON
13. GO 51. GO
14. EXEC sys.sp_db_vardecimal_storage_format NLJRelacional, NON 52. SET QUOTED_IDENTIFIER ON
15. GO 53. GO
16. USE [LJRelacional] 54. CREATE TABLE [dbo].[Estoque](
17. GO 55. [Produto_Codigo] [int] NOT NULL,
18. SET ANSI_NULLS ON 56. [Loja_Codigo] [int] NOT NULL,
19. GO 57. [Quantidade] [int] NULL,
20. SET QUOTED_IDENTIFIER ON 58. CONSTRAINT [PK_Estoque] PRIMARY KEY CLUSTERED
21. GO 59. (
22. CREATE TABLE [dbo].[Atendente]( 60. [Produto_Codigo] ASC,
23. [Codigo] [int] IDENTITY(1,1) NOT NULL, 61. [Loja_Codigo] ASC
24. [DadosAtendente] [nchar](100) NULL, 62. )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF,
25. [Sexo] [int] NULL, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON,
26. CONSTRAINT [PK_Atendente] PRIMARY KEY CLUSTERED ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
27. ( 63. ) ON [PRIMARY]
28. [Codigo] ASC 64. GO
29. )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, ...
IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, 65. CREATE TABLE [dbo].[Promocao](
ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 66. [Codigo] [int] IDENTITY(1,1) NOT NULL,
30. ) ON [PRIMARY] 67. [DataInicio] [datetime] NULL,
31. GO 68. [DataFim] [datetime] NULL,
32. /****** Object: Table [dbo].[CupomFiscal] Script Date: 12/04/2014 10:03:45 ******/ 69. [DadosPromocao] [nchar](100) NULL,
33. SET ANSI_NULLS ON 70. CONSTRAINT [PK_Promocao] PRIMARY KEY CLUSTERED
34. GO 71. (
35. SET QUOTED_IDENTIFIER ON 72. [Codigo] ASC
36. GO 73. )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF,
37. CREATE TABLE [dbo].[CupomFiscal]( IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON,
38. [Numero] [int] NOT NULL, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]) ON [PRIMARY]

Listagem 2. Script SQL usado para criao do Banco de Dados Relacional (LjRelacional) Parte 2

01. ALTER TABLE [dbo].[CupomFiscal] WITH CHECK ADD CONSTRAINT 11. ALTER TABLE [dbo].[Estoque] CHECK CONSTRAINT [FK_Estoque_Loja]
[FK_CupomFiscal_Atendente] FOREIGN KEY([Atendente_Codigo]) 12. GO
REFERENCES [dbo].[Atendente] ([Codigo]) 13. ALTER TABLE [dbo].[Estoque] WITH CHECK ADD CONSTRAINT
02. GO [FK_Estoque_Produto] FOREIGN KEY([Produto_Codigo]) REFERENCES [dbo].
03. ALTER TABLE [dbo].[CupomFiscal] CHECK CONSTRAINT [Produto] ([Codigo])
[FK_CupomFiscal_Atendente] 14. GO
04. GO 15. ALTER TABLE [dbo].[Estoque] CHECK CONSTRAINT [FK_Estoque_Produto]
05. ALTER TABLE [dbo].[CupomFiscal] WITH CHECK ADD CONSTRAINT 16. GO
[FK_CupomFiscal_Promocao] FOREIGN KEY([Promocao_Codigo]) 17. ALTER TABLE [dbo].[Itens] WITH CHECK ADD CONSTRAINT
REFERENCES [dbo].[Promocao] ([Codigo]) [FK_Itens _CupomFiscal] FOREIGN KEY([CupomFiscal_Numero])
06. GO REFERENCES [dbo].[CupomFiscal] ([Numero])
07. ALTER TABLE [dbo].[CupomFiscal] CHECK CONSTRAINT 18. GO
[FK_CupomFiscal_Promocao] 19. GO
08. GO 20. ALTER TABLE [dbo].[Produto] CHECK CONSTRAINT [FK_Produto_Marca]
09. ALTER TABLE [dbo].[Estoque] WITH CHECK ADD CONSTRAINT 21. GO
[FK_Estoque_Loja] FOREIGN KEY([Loja_Codigo]) 22. USE [master]
REFERENCES [dbo].[Loja] ([Codigo]) 23. GO
10. GO 24. ALTER DATABASE [LJRelacional] SET READ_WRITE

40 SQL Magazine Edio 130


Listagem 3. Script SQL usado para insero de registros no Banco de Dados Relacional (LjRelacional)

01. /*Insero de Registros no Banco LjRelacional*/ 15. INSERT [dbo].[Loja] ([Codigo], [Atendente_Codigo], [DadosLoja])
02. /*Insero de Registros de teste na tabela Atendente do banco (LjRelacional)*/ VALUES (2, 2, NLoja 2)
03. SET IDENTITY_INSERT [dbo].[Atendente] ON 16. INSERT [dbo].[Loja] ([Codigo], [Atendente_Codigo], [DadosLoja])
04. INSERT [dbo].[Atendente] ([Codigo], [DadosAtendente], [Sexo]) VALUES (3, 2, NLoja 3)
VALUES (1, NCliente.1, 1) 17. INSERT [dbo].[Loja] ([Codigo], [Atendente_Codigo], [DadosLoja])
05. INSERT [dbo].[Atendente] ([Codigo], [DadosAtendente], [Sexo]) VALUES (4, 3, NLoja 4)
VALUES (2, NCliente.2, 1) 18. INSERT [dbo].[Loja] ([Codigo], [Atendente_Codigo], [DadosLoja])
06. INSERT [dbo].[Atendente] ([Codigo], [DadosAtendente], [Sexo]) VALUES (5, 4, NLoja 5)
VALUES (3, NCliente.3, 2) 19. INSERT [dbo].[Loja] ([Codigo], [Atendente_Codigo], [DadosLoja])
07. INSERT [dbo].[Atendente] ([Codigo], [DadosAtendente], [Sexo]) VALUES (6, 5, NLoja 6)
VALUES (4, NCliente.4, 1) 20. INSERT [dbo].[Loja] ([Codigo], [Atendente_Codigo], [DadosLoja])
08. INSERT [dbo].[Atendente] ([Codigo], [DadosAtendente], [Sexo]) VALUES (7, 6, NLoja 7)
VALUES (5, NCliente.5, 1) 21. INSERT [dbo].[Loja] ([Codigo], [Atendente_Codigo], [DadosLoja])
09. INSERT [dbo].[Atendente] ([Codigo], [DadosAtendente], [Sexo]) VALUES (8, 2, NLoja 8)
VALUES (6, NCliente.6, 1) 22. SET IDENTITY_INSERT [dbo].[Loja] OFF
10. INSERT [dbo].[Atendente] ([Codigo], [DadosAtendente], [Sexo]) 23. /*Insero de Registros de teste na tabela Marca do banco (LjRelacional)*/
VALUES (7, NCliente.7, 1) 24. SET IDENTITY_INSERT [dbo].[Marca] ON
11. SET IDENTITY_INSERT [dbo].[Atendente] OFF 25. ...
12. /*Insero de Registros de teste na tabela Loja do banco (LjRelacional)*/ 26. INSERT [dbo].[Promocao] ([Codigo], [DataInicio], [DataFim], [DadosPromocao])
13. SET IDENTITY_INSERT [dbo].[Loja] ON VALUES (9, CAST(0x0000A38100000000 AS DateTime),
14. INSERT [dbo].[Loja] ([Codigo], [Atendente_Codigo], [DadosLoja]) CAST(0x0000A3A000000000 AS DateTime), NPromoo 60%)
VALUES (1, 1, NLoja 1) 27. SET IDENTITY_INSERT [dbo].[Promocao] OFF

Listagem 4. Script SQL usado para insero de registros no Banco de Dados Relacional (LjRelacional) Parte 2

01. /*Insero de Registros de teste na tabela CupomFiscal do banco (LjRelacional)*/ [Promocao_Codigo], [DataNF], [DadosNF])
02. INSERT [dbo].[CupomFiscal] ([Numero], [Atendente_Codigo], VALUES (6, 1, 1, CAST(0x0000A33D00000000 AS DateTime), NNf padro 5)
[Promocao_Codigo], [DataNF], [DadosNF]) 08. /*Insero de Registros de teste na tabela Estoque do banco (LjRelacional)*/
VALUES (1, 1, 1, CAST(0x0000A2A600000000 AS DateTime), NNf padro 1) 09. INSERT [dbo].[Estoque] ([Produto_Codigo], [Loja_Codigo], [Quantidade])
03. INSERT [dbo].[CupomFiscal] ([Numero], [Atendente_Codigo], VALUES (1, 1, 300)
[Promocao_Codigo], [DataNF], [DadosNF]) 10. INSERT [dbo].[Estoque] ([Produto_Codigo], [Loja_Codigo], [Quantidade])
VALUES (2, 2, 2, CAST(0x0000A2C500000000 AS DateTime), NNf padro 2) VALUES (1, 4, 50)
04. INSERT [dbo].[CupomFiscal] ([Numero], [Atendente_Codigo], 11. INSERT [dbo].[Estoque] ([Produto_Codigo], [Loja_Codigo], [Quantidade])
[Promocao_Codigo], [DataNF], [DadosNF]) VALUES (2, 1, 40)
VALUES (3, 3, 2, CAST(0x0000A2E100000000 AS DateTime), NNf padro 3) 12. INSERT [dbo].[Estoque] ([Produto_Codigo], [Loja_Codigo], [Quantidade])
05. INSERT [dbo].[CupomFiscal] ([Numero], [Atendente_Codigo], VALUES (2, 2, 200)
[Promocao_Codigo], [DataNF], [DadosNF]) 13. ...
VALUES (4, 1, 1, CAST(0x0000A30000000000 AS DateTime), NNf padro 4) 14. INSERT [dbo].[Estoque] ([Produto_Codigo], [Loja_Codigo], [Quantidade])
06. INSERT [dbo].[CupomFiscal] ([Numero], [Atendente_Codigo], 15. INSERT [dbo].[Itens] ([ProdutoCodigo], [CupomFiscal_Numero], [Quantidade],
[Promocao_Codigo], [DataNF], [DadosNF]) [Valor]) VALUES (1, 5, 14, 230)
VALUES (5, 1, 1, CAST(0x0000A31E00000000 AS DateTime), NNf padro 4) 16. INSERT [dbo].[Itens] ([ProdutoCodigo], [CupomFiscal_Numero], [Quantidade],
07. INSERT [dbo].[CupomFiscal] ([Numero], [Atendente_Codigo], [Valor]) VALUES (2, 3, 14, 230)

importante destacar que a ordem das inseres muito im- Produto: Recebe os dados da LjRelacional da tabela produto,
portante, j que se deve respeitar os relacionamentos existentes atravs de carga do ETL;
no modelo relacional (LjRelacional) criado. Para isto, temos a Loja: A carga da tabela loja presente no modelo relacional
carga inicial das tabelas: Atendente, Loja, Marca, Produto e Pro- LjRelacional, atravs tambm de carga ETL;
moo (linhas 01 a 27), para posterior carga das tabelas: Cupom Promoo: Recebe os dados do modelo relacional LjRelacional,
Fiscal, Estoque e Itens (linhas 28 a 43). feito atravs de carga ETL;
Na linha 03 e na linha 11 existe o comando Set Identity_In- Atendente: As informaes da tabela atendente do modelo rela-
sert, com opo On (linha 03) e opo Off (linha 11). Isto existe cional LjRelacional so carregados via ETL nesta dimenso;
porque no modelo so usados campos Identity, que so campos Data_: Esta dimenso est presente em praticamente todos os
auto incremento e portanto para uma insero manual deve ser cubos (Modelos Dimensionais) existentes, sendo criada atravs de
desabilitado, caso contrrio no ser possvel concretizar esta scripts pr-definidos e montados a partir de modelos prontos. Na
insero. internet existem vrios modelos prontos (exemplos) para esta di-
A Figura 12 mostra a execuo do script que faz parte das menso. Um destes modelos pode ser conferido na seo links.
Listagens 1 e 2, criado na instncia SQL Server 2014.
A Figura 13 mostra um DER dimensional criado a partir do possvel conferir no modelo dimensional proposto que cada
modelo relacional. O modelo representa as seguintes dimenses, uma das dimenses possui uma chave primria, que conheci-
representada pelas tabelas: do com o nome de Cdigo, no modelo dimensional proposto.

Edio 130 SQL Magazine 41


Como definir um Data Warehouse na prtica usando Transact SQL

Normalmente esta caracterstica est pre- Esta tabela composta pelas chaves (DimLoja). Para facilitar o entendimento, o
sente nos modelos dimensionais estrela estrangeiras de todas as dimenses, mais banco criado no disco C:\Temp, mostra-
criados a partir de um relacional e usada os campos Quantidade e Valor. Por carac- do da linha 1 linha 17. Da linha 19 linha
para diferenciar os vrios registros nas terstica do modelo, a tabela fato a tabela 65 so criadas as tabelas que representam
tabelas do modelo. que mais cresce, j que recebe diariamente tanto as dimenses quanto a tabela fato. J
Alm das dimenses descritas, existe no via ETL todos os novos registros do mode- da linha 66 linha 69, acontece a insero
modelo dimensional o mais importante lo relacional (LjRelacional). dos registros na dimenso Data_. Na
dos objetos do modelo, que seria a tabela Nas Listagens 5 e 6 apresentado o script concluso do script, da linha 70 linha 89,
fato Itens. para a criao do modelo dimensional existem as definies das constraints.
A Listagem 7 mostra o script a ser usado
para a carga das tabelas Dimenso. Todas
as cargas so feitas tabelas Dimenso,
menos a tabela Data_ porque no script de
criao do banco dimensional j possui sua
carga efetuada atravs de inserts diretos
na base de dados.
Apesar dessa listagem mostrar a carga
(ETL) da tabela atendente, para adapt-lo
s cargas das outras tabelas basta a substi-
tuir o nome da tabela, ou seja, a substitui-
o da tabela atendente, pelas tabelas loja,
promoo ou mesmo produto.
A primeira parte do script, da linha 1
linha 6, mostra a carga inicial das dimen-
Figura 12. Processo de criao prtico do banco de dados LjRelacional no SQL Server 2014
ses com um select/insert usando para
isto como origem o banco LjRelacional e
seus dados primrios. A segunda parte do
Script, especificamente da linha 7 linha 27,
mostra atravs de um script Transact
SQL a carga controlada dos registros.
lido o ltimo registro da base dimensio-
nal atravs do campo Id (auto incremento),
atravs da funo MAX, isto armazenado
em uma varivel que posteriormente
comparada com o ltimo registro da mesma
tabela no banco relacional LjRelacional. A
carga feita somente se o registro na base
dimensional for menor do que o existente
na base relacional LjRelacional.
Por ltimo, atravs do print disponvel da
linha 22 linha 27, so exibidos os registros
copiados e o ltimo ID copiado nas tabelas.
Pode-se agendar este script para execuo
diria, o que mostrado um pouco mais a
frente neste estudo.
A tabela fato Itens, presente na Listagem 8,
mostra tanto a carga inicial de todos os regis-
tros do banco relacional, quanto a carga pro-
gramada dos novos registros ora existentes e
criados no banco relacional. Este script pode
ser programado para execuo em perodos
pr-determinados de forma que possa man-
Figura 13. DER mostrando o modelo dimensional criado a partir do modelo relacional existente ter a base dimensional atualizada.

42 SQL Magazine Edio 130


Listagem 5. Script SQL usado para criao do banco de dados dimensional (DimLoja) Parte 1

01. USE [master] 33. /****** Object: Table [dbo].[Data_] Script Date: 12/04/2014 10:42:36 ******/
02. GO 34. SET ANSI_NULLS ON
03. /****** Object: Database [LJBidimensional] 35. GO
Script Date: 12/04/2014 10:42:36 ******/ 36. SET QUOTED_IDENTIFIER ON
04. CREATE DATABASE [LJBidimensional] ON PRIMARY 37. GO
05. ( NAME = NLJBidimensional, FILENAME = NC:\tmp\LJBidimensional.mdf , 38. CREATE TABLE [dbo].[Data_](
SIZE = 3072KB , MAXSIZE = UNLIMITED, FILEGROWTH = 1024KB ) 39. [Codigo] [int] IDENTITY(1,1) NOT NULL,
06. LOG ON 40. [DataCompleta] [datetime] NULL,
07. ( NAME = NLJBidimensional_log, FILENAME = NC:\tmp\LJBidimensional_log.ldf , 41. [DiaSemana] [nchar](50) NULL,
SIZE = 1024KB , MAXSIZE = 2048GB , FILEGROWTH = 10%) 42. [Mes] [nchar](50) NULL,
08. GO 43. [Ano] [nchar](50) NULL,
09. IF (1 = FULLTEXTSERVICEPROPERTY(IsFullTextInstalled)) 44. [Feriado] [nchar](50) NULL,
10. begin 45. CONSTRAINT [PK_DAta_] PRIMARY KEY CLUSTERED
11. EXEC [LJBidimensional].[dbo].[sp_fulltext_database] @action = enable 46. (
12. end 47. [Codigo] ASC
13. GO 48. )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF,
14. EXEC sys.sp_db_vardecimal_storage_format NLJBidimensional, NON IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON,
15. GO ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
16. USE [LJBidimensional] 49. ) ON [PRIMARY]
17. GO 50. GO
18. /****** Object: Table [dbo].[Atendente] Script Date: 12/04/2014 10:42:36 ******/ 51. /****** Object: Table [dbo].[Itens] Script Date: 12/04/2014 10:42:36 ******/
19. SET ANSI_NULLS ON 52. SET ANSI_NULLS ON
20. GO 53. ...
21. SET QUOTED_IDENTIFIER ON 54. SET QUOTED_IDENTIFIER ON
22. GO 55. GO
23. CREATE TABLE [dbo].[Atendente]( 56. CREATE TABLE [dbo].[Promocao](
24. [Codigo] [int] NOT NULL, 57. [Codigo] [int] NOT NULL,
25. [DadosAtendente] [nchar](100) NULL, 58. [DataInicio] [datetime] NULL,
26. [Sexo] [nchar](2) NULL, 59. [DadosPromocao] [nchar](100) NULL,
27. CONSTRAINT [PK_Atendente] PRIMARY KEY CLUSTERED 60. CONSTRAINT [PK_Promocao] PRIMARY KEY CLUSTERED
28. ( 61. (
29. [Codigo] ASC 62. [Codigo] ASC
30. )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, 63. )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF,
IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON,
ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
31. ) ON [PRIMARY] 64. ) ON [PRIMARY]
32. GO 65. GO

Listagem 6. Script SQL usado para criao do banco de dados dimensional (DimLoja) Parte 2

01. SET IDENTITY_INSERT [dbo].[Data_] ON 11. ...


02. INSERT [dbo].[Data_] ([Codigo], [DataCompleta], [DiaSemana], [Mes], [Ano], 12. ALTER TABLE [dbo].[Itens] CHECK CONSTRAINT [FK_Itens_Loja]
[Feriado]) VALUES (1, CAST(0x0000A2A600000000 AS DateTime), 13. GO
NQuarta-Feira, NJaneiro, N2014, NNAO) 14. ALTER TABLE [dbo].[Itens] WITH CHECK ADD CONSTRAINT [FK_Itens_Produto]
03. INSERT [dbo].[Data_] ([Codigo], [DataCompleta], [DiaSemana], [Mes], [Ano], FOREIGN KEY([Produto_Codigo]) REFERENCES [dbo].[Produto] ([Codigo])
[Feriado]) VALUES (2, CAST(0x0000A2C500000000 AS DateTime), NDomingo, 15. GO
NFevereiro, N2014, NSIM) 16. ALTER TABLE [dbo].[Itens] CHECK CONSTRAINT [FK_Itens_Produto]
04. 17. GO
05. SET IDENTITY_INSERT [dbo].[Data_] OFF 18. ALTER TABLE [dbo].[Itens] WITH CHECK ADD CONSTRAINT [FK_Itens_Promocao]
06. GO FOREIGN KEY([Produto_Codigo]) REFERENCES [dbo].[Promocao] ([Codigo])
07. ALTER TABLE [dbo].[Itens] WITH CHECK ADD CONSTRAINT 19. GO
[FK_Itens_Atendente] FOREIGN KEY([Atendente_Codigo]) 20. ALTER TABLE [dbo].[Itens] CHECK CONSTRAINT [FK_Itens_Promocao]
REFERENCES [dbo].[Atendente] ([Codigo]) 21. GO
08. GO 22. USE [master]
09. ALTER TABLE [dbo].[Itens] CHECK CONSTRAINT [FK_Itens_Atendente] 23. GO
10. GO 24. ALTER DATABASE [LJBidimensional] SET READ_WRITE

Muitos decidem por uma programao diria em horrio no Na anlise da Listagem 8, da linha 1 linha 12, realizada a
comercial de forma que o transacional no sofra problemas carga de todos os registros do relacional para o dimensional. J
relacionados com performance. No nosso exemplo o processo as linhas 11 37 (parte final do script) correspondem ao processo
ser agendado para execuo diria e apenas uma vez, e isto far a ser agendado e, portanto, ao processo automtico de carga dos
com que o processo no atrapalhe o transacional em termos de dados do relacional para o dimensional. possvel notar a pre-
performance. sena de vrios joins entre as vrias tabelas existentes no modelo

Edio 130 SQL Magazine 43


Como definir um Data Warehouse na prtica usando Transact SQL

relacional, j que a tabela fato deve fazer a juno das tabelas A carga inicial das tabelas Dimenso no necessita necessaria-
existentes no relacional atravs de suas chaves, garantindo assim mente de agendamento, j que pode ser executada diretamente do
a integridade do modelo. A tabela fato Itens tem por caracterstica Management Studio. Porm, as cargas dos registros novos podem
cargas dirias, diferente das outras tabelas dimenso existentes ser melhor controladas atravs de agendamento em jobs.
no modelo que no sofrem tantas cargas. Isto ocorro porque a As Figuras 14 e 15 representam um modelo que pode ser segui-
frequncia de insero de registros bem menor que a ocorrncia do, pois apresenta de forma organizada as sugestes para que as
na tabela fato Itens. cargas na tabela Dimenso e fato possam ocorrer com sucesso.
importante lembrar que os ETLs criados de cargas automticas A Figura 15 mostra o agendamento para a carga definida nos jobs
levam em considerao apenas os novos registros e no tratam programados definidos para horrio no comercial, no caso do
modificaes nos dados antigos (updates e deletes). Finalizando exemplo para 02:00 h da manh. O horrio seria o ideal para que
a execuo dos scripts e a concepo do modelo e sua implemen- no ocasione problemas relacionados performance nos bancos
tao, partimos para o agendamento e programao em jobs relacionais LjRelacional.
especficos do processo desenhado. O modelo proposto leva em Bancos criados e processos ETL definidos, chega o momento
conta horrios especficos na sua elaborao e visa automao de da extrao e apresentao das informaes armazenadas.
todo o processo. A apresentao pode ser feita usando-se de forma facilitada o

Listagem 7. Script TSQL usado para o processo ETL das tabelas dimenso: Atendente, loja, Promoo e Produto

01. -- ETL Select/Insert ATENDENTE Carga Inicial - Carga INICIAL sem controle 15. set @Copiados = (select COUNT(*) from LJRelacional.dbo.Atendente nolock
-- (Copia todos os Registros) where Codigo > @Id)
02. insert into LJBidimensional.dbo.atendente 16. -- Copia registros maiores que aqueles existentes na base Bidimensional e
03. -- Extrao do Banco Relacional -- Copia os novos para a Base
04. SELECT codigo, DadosAtendente, Sexo 17. Insert into LJBidimensional.dbo.Atendente
05. FROM ljRelacional.dbo.Atendente 18. SELECT codigo, DadosAtendente, Sexo
06. GO 19. FROM ljRelacional.dbo.Atendente
07. -- CONFERINDO CARGA INICIAL DOS DADOS EM PROMOCAO: 20. where Codigo > @Id;
08. SELECT * FROM LJBidimensional.dbo.Atendente NoLock 21. -- Mostra na tela a quantidade de registros copiados e registros menores que ID.
09. -- TSql para a carga agendada em Job da Tabela Atendente 22. print NA Qte de linhas que foram Copiadas corresponde a:
10. declare @Id int 23. print @Copiados;
11. declare @Copiados int 24. print NRegistros menores que ID:
12. -- Seta na variavel @Id o ultimo Id/Cdigo da tabela Relacional a ser Copiada 25. print @ID
13. set @Id = (select MAX(codigo) from ljBidimensional.dbo.Atendente) 26. -- Conferindo registros COPIADOS:
14. -- Seta a partir de Count a Quantidade De registros a copia do Banco Origem 27. SELECT * FROM LJBidimensional.dbo.atendente

Listagem 8. Script TSQL usado para o processo ETL na tabela fato Itens

01. /* Carga Inicial na Tabela FATO: Itens.*/ 20. -- Copia registros maiores que aqueles existentes na base Dimensional em
02. insert into LJBidimensional.dbo.itens comparao aos existentes na base Relacional
03. SELECT promo.Codigo, atende.Codigo, loja.Codigo, prod.Codigo, data.codigo, 21. Insert into LJBidimensional.dbo.Itens
itens.quantidade, itens.valor,cupfiscal.DataNF, CUPFISCAL.Numero 22. SELECT promo.Codigo, atende.Codigo, loja.Codigo, prod.Codigo, data.codigo,
04. FROM ljRelacional.dbo.itens itens inner join LJRelacional.dbo.produto prod on itens.quantidade, itens.valor, cupfiscal.DataNF, CUPFISCAL.Numero
(itens.ProdutoCodigo = prod.codigo) 23. FROM ljRelacional.dbo.itens itens inner join LJRelacional.dbo.produto prod on
05. inner join ljrelacional.dbo.CupomFiscal cupfiscal on (itens.ProdutoCodigo = prod.codigo)
(itens.CupomFiscal_Numero = cupfiscal.Numero) 24. inner join ljrelacional.dbo.CupomFiscal cupfiscal on
06. inner join LJRelacional.dbo.atendente atende on (itens.CupomFiscal_Numero = cupfiscal.Numero)
(atende.Codigo = cupfiscal.Atendente_Codigo) 25. inner join LJRelacional.dbo.atendente atende on
07. inner join LJRelacional.dbo.Promocao promo on (atende.Codigo = cupfiscal.Atendente_Codigo)
(promo.Codigo = cupfiscal.Promocao_Codigo) 26. inner join LJRelacional.dbo.Promocao promo on
08. inner join LJRelacional.dbo.loja loja on(loja.Atendente_Codigo = atende.Codigo) (promo.Codigo = cupfiscal.Promocao_Codigo)
09. inner join LJBidimensional.dbo.Data_ data on 27. inner join LJRelacional.dbo.loja loja on(loja.Atendente_Codigo = atende.Codigo)
(cupfiscal.DataNF = data.DataCompleta) 28. inner join LJBidimensional.dbo.Data_ data on
10. GO (cupfiscal.DataNF = data.DataCompleta)
11. -- Conferindo as Cargas efetuadas: 29. where cupfiscal.numero > @Id;
12. SELECT * FROM LJBidimensional.dbo.itens NoLock 30. -- Mostra na tela a quantidade de registros copiadas e menores que ID:
13. Script para Agendamento: 31. print NA Qte de linhas que foram Copiadas corresponde a:
14. declare @Id int 32. print @Copiados;
15. declare @Copiados int 33. print NRegistros menores que ID:
16. -- Seta na variavel @Id o ultimo id/codigo da tabela Relacional a ser copiada: 34. print @ID
17. set @Id = (select MAX(cupomfiscalnumero) from ljBidimensional.dbo.itens) 35. -- Confere registros copiados:
18. -- Seta a partir de count a quantidade De registros a copia do Banco Origem: 36. SELECT * FROM LJBidimensional.dbo.atendente
19. set @Copiados = (select COUNT(*) from LJRelacional.dbo.CupomFiscal nolock 37. /*Sempre que existir um registro novo na base de Dados Relacional este
where Numero > @Id) Registro ser copiado para a Nova Tabela*/

44 SQL Magazine Edio 130


Excel e o recurso tabela dinmica, onde atravs de poucos cliques inclusive mais complexos do que o mostrado, e que podem
consegue-se apresentao em grficos dos modelos propostos. esclarecer outras dvidas relacionadas. A partir da leitura do
Talvez este seja o exemplo mais bsico para exemplificao e en- artigo, podem surgir questionamentos que podem ser frutos de
tendimento simplificado do que um cubo pode representar. pesquisas e at mesmo artigos futuros. Como vai ficar o DW com
o advento das ferramentas NoSQL e do BigData? uma destas
perguntas.
Provavelmente, em um futuro prximo, veremos uma mudana
na arquitetura atual do que conhecemos hoje como DW (Data
Warehouse), j que muitos fabricantes e players de mercado
j se preparam com a insero de novas features que possam
dar suporte a novas demandas de mercado por informao.
O DW que conhecemos hoje vai persistir com as novas ferramen-
tas de mercado, inclusive para aqueles que pretendem trabalhar
com grandes massas de dados na sua concepo principal?
outro destes questionamentos. Talvez tenhamos duas arquite-
turas dominantes e este parece ser o mais correto a se afirmar.
De um lado temos a dimensional, que faz uso na sua concepo do
modelo relacional, vigente por vrios anos. Do outro lado temos a
arquitetura composta por ferramentas destinadas a tratar grandes
massas de dados, NoSQL e Big Data.

Figura 14. Propriedades dos Jobs relacionados a carga no banco dimensional Autor
Adriano Geraldo Dias Ferreira
adrianogdf@gmail.com
Atua no ramo de tecnologia da informao a mais de 20
anos, sendo 9 anos dedicados profissionalmente a Anlise e
Administrao de Banco de Dados (Oracle, SQL Server, Sybase, MySQL
e PostGreSQL). Atualmente trabalha como DBA Snior e Professor em
Cursos de Graduao e Ps Graduao. Possui Mestrado em Administrao Estratgica com
Foco em TI/BI, MBA em Banco de Dados/BI e Graduao em Tecnologia da Informao.

Links:

As sete etapas na Construo de um DW:


http://corporate.canaltech.com.br/tutorial/banco-de-dados/A-construcao-de-um-Data-
Warehouse-em-7-etapas/

A Microsoft e o moderno Data Warehouse:


http://www.microsoft.com/pt-br/server-cloud/solutions/modern-data-warehouse/
Figura 15. Schedule semanal agendado (Segunda a Domingo) Um Modelo para a dimenso Tempo para uso em DWs:
http://fp2.com.br/blog/index.php/2012/um-modelo-de-dimensao-tempo-para-data-
Vimos neste artigo os principais conceitos relacionados DW warehouses/
mostrando, alm disto, a arquitetura BI de onde o DW partici-
Script para Carga na dimenso Tempo (Data) em um DW:
pante e possui fundamental importncia. A partir de um estudo http://fp2.com.br/blog/index.php/2012/script-para-popular-dimensao-tempo-data/
de caso, mostramos desde a estrutura base do DW, os vrios sis-
temas transacionais, arquivos e demais utenslios que compem
os dados brutos nas empresas, passando pelo processo ETL, que
Voc gostou deste artigo?
cuida da extrao, transformao e carga dos dados no DW e ou
Data Marts. D seu voto em www.devmedia.com.br/sqlmagazine/feedback
O presente artigo no possui a pretenso de esgotar o assunto Ajude-nos a manter a qualidade da revista!
DW, mesmo porque existem vrios exemplos prticos e cases,

Edio 130 SQL Magazine 45


Como usar corretamente
Bind Variables
Este artigo do tipo mentoring Fique por dentro
saiba mais: www.devmedia.com.br/mentoring-saibamais
Este artigo apresenta como podemos ganhar desempenho atravs
do uso de bind variables em consultas SQL. Para isso, ser apresentado
um exemplo real de consulta que apresenta problemas de performan-

A
cada vez que uma instruo SQL enviada ao ce e analisaremos como o SGBD se comporta considerando diferentes
banco de dados, uma busca exata do texto cenrios de soluo: literais, variveis de substituio e bind variables.
realizada para verificar se a instruo j existe Ser discutido o impacto de cada opo no processamento das con-
na shared pool (ou seja, se a instruo j foi executada sultas escritas. Essa discusso til nas atividades dirias de um DBA.
previamente). A Shared Pool foi introduzida como uma A otimizao do desempenho do banco uma de suas principais
funcionalidade do Oracle na verso 7, inicialmente atribuies. Fazer este tipo de ajuste diretamente nas consultas muitas
como sendo um repositrio para compartilhamento de vezes traz um timo resultado.
instrues SQL e cdigos PL/SQL. Desde ento, mesmo
que servindo a alguns outros propsitos, ainda mantm
sua caracterstica original de armazenar cursores para delas tambm compartilhada globalmente entre as sesses
o compartilhamento entre as sesses conectadas ao conectadas ao banco de dados. Alguns desses componentes
banco de dados. possuem tamanho fixo, definido no momento da inicializao do
Em outras palavras, a shared pool um cache de meta- banco de dados (startup), enquanto outras podem ser alteradas
dados. De um lado temos o buffer cache, que utilizado dinamicamente.
para armazenar dados, e de outro lado temos a shared A grande vantagem de possuir todas estas informaes arma-
pool utilizada para armazenar objetos complexos que zenadas na shared pool sobre as instrues SQL ou cdigos PL/
descrevem como os dados so armazenados, como es- SQL a possibilidade de reutilizao de planos de execuo, por
to relacionados com outros dados e como podem ser exemplo, evitando assim a necessidade do banco de dados exe-
recuperados. cutar um hard parse, que o processo de verificao de sintaxe,
A maior utilizao da shared pool se d no suporte semntica, construo de estratgia de acesso, carregamento na
execuo de instrues SQL e pacotes PL/SQL com- shared pool, dentre outras coisas.
partilhados, mas para criarmos um cursor ou compilar Se nenhuma instruo correspondente que foi enviada for
uma procedure PL/SQL necessrio conhecer todas as encontrada na shared pool, um parse em disco realizado, que
informaes a respeito dos objetos referenciados pela um processo que consome muito dos recursos. Se a instruo for
instruo ou procedure que est sendo compilada. encontrada na Shared Pool, apenas um soft parse executado, que
Por exemplo, a fim de criar um simples cursor para custa muito menos. A concatenao de valores das variveis
uma instruo SELECT em uma tabela, ser necess- em uma instruo SQL faz com que a instruo seja nica, for-
rio conhecer os metadados sobre a tabela como nome ando um hard parse. Por outro lado, a utilizao de bind variables
das colunas, tipos de dados, ndices e estatsticas do permite a reutilizao de instrues SQL, uma vez que o texto da
otimizador. Todas estas informaes tambm esto ar- instruo permanece o mesmo. Apenas o valor atribudo bind
mazenadas na shared pool, independente do cursor ou variable alterado.
programa. Ao fazer o cache destes metadados de forma Mas por que to importante a utilizao deste recurso?
independente, eles podem ser utilizados para construir 1. Armazenar muitas instrues SQL semelhantes na shared pool
qualquer quantidade de cursores, evitando o trabalho um desperdcio de memria;
extra de consultar o dicionrio de dados diversas vezes 2. Encher a shared pool com instrues semelhantes far com que
para a mesma tabela. instrues bem escritas sejam descartadas da shared pool rapida-
Em adio s instrues SQL e cdigos PL/SQL mente, forando-as a um novo parse;
compartilhados, h algumas outras reas de memria 3. Analisar instrues SQL um processo intensivo de recursos.
que ocupam espao na shared pool, onde a maioria Reduzir o nmero de hard parses resulta em menor uso de CPU.

46 SQL Magazine Edio 130


comum nos depararmos com instrues SQL como a apresen- Listagem 2. Consulta SQL executada utilizando apenas literais.
tada na Listagem 1.
01. SQL> ALTER SYSTEM FLUSH SHARED_POOL;
02.
03. System altered.
Listagem 1. Consulta SQL executada em banco de dados de produo.
04.
05. SQL> SELECT * FROM DUAL WHERE DUMMY = LITERAL1;
01. SELECT *
06.
02. FROM (SELECT /*+INDEX (item IX_RT_ACCT_ST_SN) */ ITEM.*
07. no rows selected
03. FROM ITEM, RECONCILE_GROUP
08.
04. WHERE ((ITEM.REC_TYPE = 328740000006)
09. SQL> SELECT * FROM DUAL WHERE DUMMY = LITERAL2;
05. AND (ITEM.REC_GROUP = RECONCILE_GROUP.OBJECT_ID)
10.
06. AND (ITEM.ACCOUNT = 516250001260)
11. no rows selected
07. AND (ITEM.STATE = R)
12.
08. AND (ITEM.RECONCILED_DATE = 04/28/2010)
13. SQL> COLUMN SQL_TEXT FORMAT A60
09. AND (RECONCILE_GROUP.LOCATION = I) )
14. SQL> SELECT SQL_TEXT, EXECUTIONS
10. ORDER BY UPPER(ITEM.SERIAL_NUMBER))
15. 2 FROM V$SQL
11. WHERE ROWNUM <= 1500;
16. 3 WHERE INSTR(SQL_TEXT, SELECT * FROM DUAL WHERE DUMMY) > 0
17. 4 AND INSTR(SQL_TEXT, sql_text) = 0
18. 5 ORDER BY SQL_TEXT;
A consulta SQL apresentada foi extrada de um ambiente real. 19.
20. SQL_TEXT EXECUTIONS
Perceba que todos os valores so literais (com exceo da juno
21. ------------------------------------------------------------ -------------------------
entre as tabelas da linha 05, onde poderamos utilizar um JOIN ao 22. SELECT * FROM DUAL WHERE DUMMY = LITERAL1 1
invs do WHERE), sendo assim, a cada nova execuo com qual- 23. SELECT * FROM DUAL WHERE DUMMY = LITERAL2 1
24.
quer um dos valores alterados, um hard parse ser necessrio. 25. 2 rows selected.
Apresentaremos a partir de agora, atravs de alguns testes, as
implicaes ao utilizarmos diferentes implementaes: Listagem 3. Consulta SQL executada utilizando varivel de substituio.

Utilizao de literais; 01. SQL> ALTER SYSTEM FLUSH SHARED_POOL;


Utilizao de variveis de substituio; 02.
03. System altered.
Utilizao de Bind Variables.
04.
05. SQL> SELECT * FROM DUAL WHERE DUMMY = &DUMMY;
Utilizao de literais 06. Enter value for dummy: VARIAVEL_DE_SUBSTITUICAO_1
07. old 1: SELECT * FROM DUAL WHERE DUMMY = &DUMMY
O exemplo da Listagem 2 apresenta o efeito da utilizao de
08. new 1: SELECT * FROM DUAL WHERE DUMMY = VARIAVEL_DE_SUBSTITUICAO_1
literais na shared pool. Primeiramente feita uma "limpeza" da 09.
shared pool, removendo todas as instrues SQL anteriormente 10. no rows selected
11.
armazenadas (linha 01). Foram executadas ento duas consultas, 12. SQL> SELECT * FROM DUAL WHERE DUMMY = &DUMMY;
ambas semelhantes, porm utilizando valores literais na clusula 13. Enter value for dummy: VARIAVEL_DE_SUBSTITUICAO_2
WHERE (linhas 05 e 09). Ao final, o contedo da shared pool 14. old 1: SELECT * FROM DUAL WHERE DUMMY = &DUMMY
15. new 1: SELECT * FROM DUAL WHERE DUMMY = VARIAVEL_DE_SUBSTITUICAO_2
verificado, consultando-se a view V$SQL (linhas 13 a 23). 16.
Perceba que foi feito o parse de ambas as consultas, ou seja, h 17. no rows selected
a presena de uma nica execuo para cada consulta presente 18.
19. SQL> COLUMN SQL_TEXT FORMAT A60
na shared pool. 20. SQL> SELECT SQL_TEXT, EXECUTIONS
21. 2 FROM V$SQL
Utilizao de variveis de substituio 22.
23.
3 WHERE INSTR(SQL_TEXT, SELECT * FROM DUAL WHERE DUMMY) > 0
4 AND INSTR(SQL_TEXt, sql_text) = 0
As variveis de substituio so um recurso do utilitrio 24. 5 ORDER BY SQL_TEXT;
SQL*Plus. Elas no tm nada a ver com a forma como a instruo 25.
26. SQL_TEXT EXECUTIONS
SQL processada pelo servidor de banco de dados.
27. ------------------------------------------------------------- ------------------
Quando uma varivel de substituio usada em uma instru- 28. SELECT * FROM DUAL WHERE DUMMY = VARIAVEL_DE_SUBSTITUICAO_1 1
o SQL, o SQL*Plus solicita um valor de entrada e reescreve a 29. SELECT * FROM DUAL WHERE DUMMY = VARIAVEL_DE_SUBSTITUICAO_2 1
30.
instruo para inclu-lo. A instruo reescrita passada para o
31. 2 rows selected.
banco de dados. Como resultado, o servidor de banco de dados no
sabe absolutamente nada sobre a varivel de substituio e, por
consequncia, interpreta a instruo como utilizando literais. Perceba que a varivel de substituio a mesma (&dummy), fazendo
Veja na Listagem 3 um exemplo do efeito da utilizao de vari- com que ambas as instrues sejam idnticas, no entanto um prompt
veis de substituio na shared pool. apresentado para que o valor seja atribudo varivel (linhas 06 e 13).
Novamente feita a limpeza da shared pool para que no haja A substituio ento feita (linhas 07, 08, 14 e 15).
qualquer influncia de execues anteriores (linha 01). Duas ins- Ao consultar a view V$SQL, percebe-se que foi feito o parse
trues (exatamente iguais) so ento executadas (linhas 05 e 12). de duas instrues, contendo o valor atribudo varivel.

Edio 130 SQL Magazine 47


Como usar corretamente Bind Variables

Para efeitos de banco de dados, literais ou variveis de substituio Listagem 5. Consulta SQL executada utilizando bind variable.
so a mesma coisa.
01. SQL> ALTER SYSTEM FLUSH SHARED_POOL;
Exatamente o mesmo comportamento ocorre quando scripts 02.
contm placeholders para permitir que parmetros sejam enviados 03. System altered.
a partir da linha de comando, como apresentado na Listagem 4. 04.
05. SQL> VARIABLE DUMMY VARCHAR2(30);
06. SQL> EXEC :DUMMY := BIND_VARIABLE1;
Listagem 4. Utilizao de parmetros em scripts. 07.
08. PL/SQL procedure successfully completed.
01. $ cat dummy.sql 09.
02. 10. SQL> SELECT * FROM DUAL WHERE DUMMY = :DUMMY;
03. SELECT * FROM DUAL WHERE DUMMY = &1; 11.
04. 12. no rows selected
05. $ sqlplus / as sysdba 13.
06. 14. SQL> EXEC :DUMMY := BIND_VARIABLE2;
07. SQL> @dummy VALOR 15.
16. PL/SQL procedure successfully completed.
17.
18. SQL> SELECT * FROM DUAL WHERE DUMMY = :DUMMY;
Podemos verificar nessa listagem o contedo de um script cha- 19.
20. no rows selected
mado dummy.sql (linhas 01 a 03). Iniciou-se ento o utilitrio 21.
SQL*Plus conectando-se ao banco de dados atravs do usurio SYS 22. SQL> COLUMN SQL_TEXT FORMAT A60
(linha 05). Foi ento feita a chamada do script passando o literal 23. SQL> SELECT SQL_TEXT, EXECUTIONS
24. 2 FROM V$SQL
VALOR como parmetro. Ao ser executado, o placeholder &1 25. 3 WHERE INSTR(SQL_TEXT, SELECT * FROM DUAL WHERE DUMMY) > 0
ser substitudo pelo valor VALOR. Este exatamente o mesmo 26. 4 AND INSTR(SQL_TEXT, sql_text) = 0
comportamento de variveis de substituio. 27. 5 ORDER BY SQL_TEXT;
28.
29. SQL_TEXT EXECUTIONS
Utilizao de Bind Variables 30. ------------------------------------------------------------ ----------------------
O exemplo da Listagem 5 apresenta o efeito da utilizao de 31. SELECT * FROM DUAL WHERE DUMMY = :DUMMY 2
32.
bind variables na shared pool. O exemplo utiliza o mesmo conceito 33. 1 row selected.
dos exemplos anteriores.
A tradicional limpeza da shared pool feita (linha 01).
Declarou-se uma varivel chamada DUMMY (linha 05) e, Acompanhe agora na Listagem 7 o mesmo exemplo, mas dessa
para as duas execues, atribuiu-se valores diferentes atravs vez utilizando bind variables. Inicialmente procedemos com a
de um pequeno cdigo PL/SQL (linhas 06 e 14). As consultas so conexo ao banco de dados utilizando o usurio SYS (linha 01) e
ento executadas utilizando a bind variable que contm valores efetuamos a limpeza da shared pool (linha 03).
diferentes em cada execuo (linhas 10 e 18). Um novo bloco PL/SQL annimo executado, contendo a
Finalmente, ao consultar a view V$SQL, percebe-se que h apenas mesma estrutura de repetio para executar a instruo SQL dez
uma consulta que foi executada duas vezes e, consequentemente, vezes, mas desta vez utilizando bind variable (linhas 07 a 20). Ao
o hard parse ocorreu apenas na primeira execuo. A partir de consultar as views V$MYSTAT e V$STATNAME (linhas 25 a 32),
agora, todas as execues faro soft parses. percebemos que o tempo de CPU utilizado durante a sesso para
efetuar o parse foi de 400 milisegundos, ou seja, menos do que dois
Problemas de performance teros da execuo anterior, demonstrando claramente o ganho
O exemplo da Listagem 6 mede a quantidade de CPU utilizada por de performance.
uma sesso para efetuar hard parses e soft parses ao usar literais. E como era de se esperar, uma consulta view V$SQL (linhas 37
Observe que inicialmente nos conectamos ao utilitrio SQL*Plus a 47) mostra que h dez execues de uma nica instruo SQL, o
com o usurio SYS (linha 01) e efetuamos a limpeza da shared que nos leva a concluir que foi efetuado apenas um hard parse (na
pool (linha 03). Foi ento executado um bloco PL/SQL annimo primeira execuo) e nove soft parses (nas execues restantes).
que efetua uma estrutura de repetio alterando o valor que ser
concatenado na instruo SQL, fazendo com que, desta forma, sejam Otimizao da consulta original
enviados valores literais para o banco de dados (linhas 07 a 20). Agora que j foi demostrado que a utilizao de bind variables
Ao consultar as views V$MYSTAT e V$STATNAME possvel realmente resulta em melhoria de performance, hora de otimizar
verificar a utilizao de CPU (linhas 24 a 31). Perceba que 630 a consulta original encontrada no ambiente de produo.
milisegundos de tempo de CPU foram utilizados para executar A Listagem 8 apresenta a mesma consulta, porm otimizada
o parse durante a sesso. Ao consultar a view V$SQL (linhas 35 a para utilizar bind variables. Inicialmente declaramos as variveis
54) percebe-se tambm que a shared pool contm dez instrues com os respectivos tipos de dados (linhas 01 a 05). O prximo
SQL distintas usando literais. passo atribuir os valores requeridos a cada uma das variveis

48 SQL Magazine Edio 130


Listagem 6. Medio de performance utilizando literais.

01. SQL> CONN / AS SYSDBA 29. NAME VALUE


02. Connected. 30. ------------------------------------------------------------- ----------
03. SQL> ALTER SYSTEM FLUSH SHARED_POOL; 31. parse time cpu 63
04. 32.
05. System altered. 33. 1 row selected.
06. 34.
07. SQL> DECLARE 35. SQL> COLUMN SQL_TEXT FORMAT A60
08. 2 L_DUMMY DUAL.DUMMY%TYPE; 36. SQL> SELECT SQL_TEXT, EXECUTIONS
09. 3 BEGIN 37. 2 FROM V$SQL
10. 4 FOR I IN 1 .. 10 LOOP 38. 3 WHERE INSTR(SQL_TEXT, SELECT DUMMY FROM DUAL WHERE DUMMY) > 0
11. 5 BEGIN 39. 4 AND INSTR(SQL_TEXT, sql_text) = 0
12. 6 EXECUTE IMMEDIATE SELECT DUMMY FROM DUAL WHERE DUMMY = 40. 5 AND INSTR(SQL_TEXT, DECLARE) = 0
|| TO_CHAR(I) || 41. 6 ORDER BY SQL_TEXT;
13. 7 INTO L_DUMMY; 42.
14. 8 EXCEPTION 43. SQL_TEXT EXECUTIONS
15. 9 WHEN NO_DATA_FOUND THEN 44. ------------------------------------------------------------ -----------------------
16. 10 NULL; 45. SELECT dummy FROM dual WHERE dummy = 1 1
17. 11 END; 46. SELECT dummy FROM dual WHERE dummy = 10 1
18. 12 END LOOP; 47. SELECT dummy FROM dual WHERE dummy = 2 1
19. 13 END; 48. SELECT dummy FROM dual WHERE dummy = 3 1
20. 14 / 49. SELECT dummy FROM dual WHERE dummy = 4 1
21. 50. SELECT dummy FROM dual WHERE dummy = 5 1
22. PL/SQL procedure successfully completed. 51. SELECT dummy FROM dual WHERE dummy = 6 1
23. 52. SELECT dummy FROM dual WHERE dummy = 7 1
24. SQL> SELECT SN.NAME, MS.VALUE 53. SELECT dummy FROM dual WHERE dummy = 8 1
25. 2 FROM V$MYSTAT MS, V$STATNAME SN 54. SELECT dummy FROM dual WHERE dummy = 9 1
26. 3 WHERE MS.STATISTIC# = SN.STATISTIC# 55.
27. 4 AND SN.NAME = parse time cpu; 56. 10 rows selected.
28.

Listagem 7. Medio de performance utilizando bind variables.

01. SQL> CONN / AS SYSDBA 25. SQL> SELECT SN.NAME, MS.VALUE


02. Connected. 26. 2 FROM V$MYSTAT MS, V$STATNAME SN
03. SQL> ALTER SYSTEM FLUSH SHARED_POOL; 27. 3 WHERE MS.STATISTIC# = SN.STATISTIC#
04. 28. 4 AND SN.NAME = parse time cpu;
05. System altered. 29.
06. 30. NAME VALUE
07. SQL> DECLARE 31. ------------------------------------------------------------- ----------
08. 2 L_DUMMY DUAL.DUMMY%TYPE; 32. parse time cpu 40
09. 3 BEGIN 33.
10. 4 FOR I IN 1 .. 10 LOOP 34. 1 row selected.
11. 5 BEGIN 35.
12. 6 EXECUTE IMMEDIATE SELECT DUMMY FROM DUAL WHERE DUMMY = 36. SQL>
TO_CHAR(:DUMMY) 37. SQL> COLUMN SQL_TEXT FORMAT A60
13. 7 INTO L_DUMMY USING I; 38. SQL> SELECT SQL_TEXT, EXECUTIONS
14. 8 EXCEPTION 39. 2 FROM V$SQL
15. 9 WHEN NO_DATA_FOUND THEN 40. 3 WHERE INSTR(SQL_TEXT, SELECT DUMMY FROM DUAL WHERE DUMMY) > 0
16. 10 NULL; 41. 4 AND INSTR(SQL_TEXT, sql_text) = 0
17. 11 END; 42. 5 AND INSTR(SQL_TEXT, DECLARE) = 0
18. 12 END LOOP; 43. 6 ORDER BY SQL_TEXT;
19. 13 END; 44.
20. 14 / 45. SQL_TEXT EXECUTIONS
21. 46. ------------------------------------------------------------ ------------------
22. PL/SQL procedure successfully completed. 47. SELECT DUMMY FROM DUAL WHERE DUMMY = TO_CHAR(:DUMMY) 10
23. 48.
24. SQL> 49. 1 row selected.

Edio 130 SQL Magazine 49


Como usar corretamente Bind Variables

(linhas 07 a 11) e, finalmente, utilizar as bind variables na instruo Este um exemplo clssico de problema que a falta de conheci-
SQL (linhas 13 a 23). mento de uma funcionalidade do banco de dados pode ocasionar
O cdigo ficou sensivelmente maior. No entanto, o ganho de quando implementa-se uma soluo mal escrita em ambiente de
performance em consultas deste tipo, que so executadas centenas produo.
e at milhares de vezes no banco de dados, justificam plenamente
qualquer aumento na quantidade de linhas de cdigo.
Autor
Ricardo Rezende
Listagem 8. Consulta otimizada utilizando bind variables.
DBA Oracle certificado pela Oracle University (DBA 9i track e
01. VARIABLE B1 VARCHAR2(13); DBA OCP 10g). IBM Certified Database Associate DB2 9. DBA
02. VARIABLE B2 VARCHAR2(13); Oracle na IBM do Brasil em projeto internacional administrando
03. VARIABLE B3 CHAR(1); ambiente de produo de alta criticidade. Lider de equipe de DBAs envolv
04. VARIABLE B4 DATE;
05. VARIABLE B5 CHAR(1);
endo Brasil e Filipinas. Palestrante em vrios eventos em diversas univer-
06. sidades e institutos. Editor tcnico da revista SQL Magazine. Mestrando em Cincia da
07. EXEC :B1 := 328740000006; Computao pelo Instituto de Computao da Universidade Estadual de Campinas IC
08. EXEC :B2 := 516250001260; UNICAMP. Cursando MBA em Gesto de Projetos na Faculdade Anhanguera de Indaiatuba.
09. EXEC :B3 := R;
Docente na Fundao Indaiatubana de Educao e Cultura FIEC. Docente na Faculdade
10. EXEC :B4 := 04/28/2010;
11. EXEC :B5 := I; de Informtica e Adminstrao Paulista FIAP.
12.
13. SELECT *
14. FROM (SELECT /*+INDEX (item IX_RT_ACCT_ST_SN) */ ITEM.* Links:
15. FROM ITEM, RECONCILE_GROUP
16. WHERE ((ITEM.REC_TYPE = :B1) GREEN, Russell. Understanding Shared Pool Memory Structure. An Oracle White
17. AND (ITEM.REC_GROUP = RECONCILE_GROUP.OBJECT_ID)
18. AND (ITEM.ACCOUNT = :B2)
Paper, California, Setembro 2005, 22p.
19. AND (ITEM.STATE = :B3)
20. AND (ITEM.RECONCILED_DATE = :B4) HALL, TIM. Literals, Substitution Variables and Bind Variables
21. AND (RECONCILE_GROUP.LOCATION = :B5) ) http://oracle-base.com/articles/misc/literals-substitution-variables-and-bind-variables.php.
22. ORDER BY UPPER(ITEM.SERIAL_NUMBER))
23. WHERE ROWNUM <= 1500;

Voc gostou deste artigo?


Conforme apresentado neste artigo, o uso de bind variables efe-
D seu voto em www.devmedia.com.br/sqlmagazine/feedback
tivamente gera ganho de performance substancial. A consulta
utilizada neste artigo real e o problema de performance foi Ajude-nos a manter a qualidade da revista!
realmente solucionado atravs da abordagem utilizada nesta
otimizao.

50 SQL Magazine Edio 130


Edio 130 SQL Magazine 51
Conhea prticas de
controle de bugs no
banco de dados
T Fique por dentro
odo projeto que envolve desenvolvimento de
software acaba gerando bugs, ou seja, problemas
relacionados com o funcionamento do software. Este artigo apresenta recomendaes, prticas e sugestes para o
Alm do controle de bugs tambm comum que a equipe controle e a gesto de defeitos de software. Em particular, discutiremos
responsvel pelo projeto implemente novas funcionali- como tratar estas questo sob a perspectiva de defeitos presentes
dades e altere o software para atender a mudanas ou em bancos de dados. A aplicao do conhecimento apresentado
novos requisitos. essencial no sentido de manter o banco de dados funcional ao longo
A organizao e gesto de atividades possui um impac- do ciclo de vida do produto. Outros benefcios do entendimento dos
to muito grande na forma como os membros da equipe conceitos apresentados neste artigo so: melhoria na comunicao
de desenvolvimento se comunicam e realizam o trabalho da equipe, agilizao dos processos, reduo de conflitos internos e
que deve ser feito, mesmo no caso onde existem bugs re- agregao de qualidade ao software.
lacionados ao banco de dados que devem ser resolvidos
por um DBA. Com base neste cenrio, este artigo visa
abordar atividades do controle de projetos de software
e outros detalhes relacionados com a organizao e Durante todo o projeto, novas verses do software so liberadas
gerenciamento do acesso aos membros da equipe que quase diariamente de acordo com a correo de bugs e implemen-
precisam resolver bugs envolvendo de alguma forma o tao de novas funcionalidades. E devido necessidade de novas
banco de dados. verses frequentes, no h um planejamento estratgico e crono-
A partir da anlise e estudo dos problemas discuti- grama ligando a verso do software com as requisies aos mem-
dos sero sugeridas recomendaes com o objetivo de bros da equipe, tarefas realizadas e lista de bugs corrigidos.
auxiliar a gesto de artefatos associados ao software comum algum usurio final ligar e conversar diretamente com
e ao banco de dados junto com o gerenciamento dos membros da equipe sobre algum bug ou nova funcionalidade.
membros da equipe. Como resultado, diversas vezes os usurios acabam modificando
a prioridade de bugs e interrompem tarefas que j estavam sendo
Cenrio de exemplo: projeto de software com banco realizadas anteriormente pelos profissionais tcnicos.
de dados Neste projeto de software h tambm o clssico cenrio onde
Como cenrio podemos imaginar um projeto de soft- um usurio final privilegiado, tal como o presidente da empresa
ware de qualquer tipo (aplicao desktop, Web, mobile, ou o cliente mais importante, exige que um bug ou funcionali-
etc.) que conta com uma equipe de desenvolvedores e dade especfica seja tratada o mais rpido possvel, sem levar
demais profissionais (designers, DBAs, DevOps). Cada em considerao o que cada membro do projeto est fazendo no
membro desta equipe possui habilidades diferentes e momento.
eles so coordenados por um gerente de projeto, que pos- Outra caracterstica deste cenrio a falta de controle de
sui pouco conhecimento tcnico de programao, banco modificaes e correo de bugs. Tambm comum observar
de dados, design e infraestrutura. Na teoria o gerente de desenvolvedores que se auto gerenciam e, muitas vezes, acabam
projeto responsvel pela atribuio de tarefas, controle se empolgando com novas tecnologias, frameworks e bibliotecas
de prazos, organizao da equipe, produo de alguns ao ponto de gastarem muito tempo atrs destas abordagens
artefatos (diagramas, documentao, relatrios) e gesto sem nenhum critrio que avalie qual ser o valor agregado ao
completa dos aspectos de qualidade do software. software final.

52 SQL Magazine Edio 130


Controle inadequado de bugs e requisies plicador adicional: um problema no banco pode comprometer a
O cenrio descrito no tpico anterior possui diversos problemas aplicao como um todo. Para ilustrar, imagine um cenrio onde
em vrios nveis. Muitos leitores podem atribuir todos os proble- um problema levou o banco a um estado inconsistente. Isso faria
mas m gesto do gerente de projeto, mas pensar desta maneira com que parte das informaes ali cadastradas perdesse o sentido
simplista e representa um comportamento inocente, uma vez o que levaria, como consequncia, a apresentaes incorretas de
que existem algumas causas, origens e responsveis pela falta de informaes para o usurio.
organizao do projeto. Do ponto de vista gerencial, a falta de planejamento, metas e
Apesar de existirem vrios problemas na maneira com que o pro- rastreamento do histrico de bugs mostra que no h um cuidado
jeto de software descrito a pouco est sendo conduzido, este tpico em relao qualidade e evoluo desejvel do software. Isso
se concentrar apenas nos problemas relacionados ao controle de uma indicao que possivelmente o software esteja evoluindo,
bugs voltados para bancos de dados e nas requisies desenfrea- mas no no ritmo ou direo desejada.
das aos membros da equipe. Em um cenrio real, importante que
tanto o controle de bugs, voltado para o banco de dados, quanto Melhores prticas para controle de bugs e requisies
as demais requisies sejam tratadas em paralelo para viabilizar Para simplificar a tarefa de controle de bugs e requisies, iremos
um bom andamento das atividades do projeto. considerar a seguinte equao:
Alm do claro problema de acesso direto aos membros da equipe
de desenvolvimento e DBA, a falta de controle sobre a quantidade, Controle de bugs = Pessoas + Processo + Ferramentas
status e detalhes de bugs representa um grande entrave para o
projeto. Um exemplo de implicao grave deste descontrole a Este tpico vai descrever diversas recomendaes, prticas e
falta de sincronia entre as atividades dos membros da equipe e as sugestes para cada um destes elementos com o objetivo de tentar
etapas do processo de desenvolvimento software, considerando auxiliar a gesto e controle de bugs e requisies.
que o projeto ao menos siga um processo ou algumas partes de Existem vrias maneiras de classificar pessoas envolvidas no
processos de desenvolvimento. projeto de desenvolvimento de software e aqui vamos considerar
Outro problema gerado pela frequente interrupo do trabalho apenas dois tipos: os membros internos da equipe e os usurios
dos membros da equipe a confuso de nomenclatura e termos externos.
utilizados. Esta mistura pode complicar a comunicao geral, pois Em primeiro lugar, importante deixar claro que todo o acesso
se um bug tratado como uma nova funcionalidade ou vice-versa, dos usurios aos membros da equipe deve ser controlado (ou
a equipe ter srios problemas na organizao das suas tarefas. seja, deve-se evitar contatos informais, como os que ocorrem via
Por exemplo, para um DBA uma nova funcionalidade pode ser telefone, skype, dentre outros) e que o gerente do projeto deve
encarada como um bug. J para um programador, esta mesma sempre estar ciente de qualquer comunicao, compromisso ou
funcionalidade pode ser vista como uma modificao no sistema. interao dos membros da equipe com os usurios finais. Do
Esta diferena de nomenclatura faz com que as prioridades sejam ponto de vista da gerncia de bugs, este controle pode ser feito
diferentes para o DBA e para o programador, levando os profis- de diversas formas, mas o mais comum a implementao de
sionais a lidar com estas requisies em momentos distintos. um sistema que permita o cadastro, controle e acompanhamento
Tambm comum encontrar problemas relacionados com o ban- das ocorrncias.
co quando h falta de sincronizao entre a verso do modelo de Vamos agora citar alguns pontos que devem ser lembrados e
dados e o software. Isto quer dizer que provavelmente o modelo devidamente considerados:
de banco de dados de um servidor de produo, por exemplo, 1. importante tomar cuidado com a nomenclatura. Defina
est com campos, tabelas ou relacionamentos a mais ou a menos dentro da equipe qual termo ser utilizado e evite que palavras
do que o modelo esperado pela aplicao. Tal falta de sincronia alternativas sejam empregadas para descrever um bug. Por exem-
pode gerar vrios problemas quando no h nenhum tipo de plo, deixe claro entre a equipe o que significa erro, defeito, falha,
mecanismo que garanta que o deploy de uma verso especfica do issue, glitch, no conformidade ou ticket e reforce o uso correto
software tenha o modelo de dados e os objetos do banco corretos destes termos;
e de acordo com o que esperado pela aplicao. 2. Assim como existem bons e maus professores e alunos, existem
Quando falamos em banco de dados, relativamente raro encon- bons e maus usurios finais. Se h um canal de comunicao co-
trar um bug no banco, modelo ou script, pois a maior parte de um mum para submeter bugs, garanta que os usurios saibam como
software composto de cdigo fonte criado a partir do uso de uma fornecer de forma adequada as informaes corretas relacionadas
linguagem de programao. Em geral, comum a implementao ao bug. A seo Links deste artigo contm alguns artigos de refe-
de modificaes e inseres de novas funcionalidades no modelo rncia que podem ajudar a montar uma poltica de como reportar
de dados e em instrues SQL, porm no se deve menosprezar bugs corretamente. Obviamente, o relatrio de bug depende muito
um bug no banco de dados ou classific-lo de forma diferencia- da aplicao e contexto e ele deve ser customizado de acordo
da. Isto porque alm dele ser um bug como outro qualquer que com cada tipo de aplicao. Algumas informaes comumente
necessita ser ajustado, o fato de ser no banco pode trazer um com- encontradas em relatrios de bugs so:

Edio 130 SQL Magazine 53


Conhea prticas de controle de bugs no banco de dados

Ttulo: nome representativo associado negativas em relao ao sistema, inte- mento considerando suas necessidades
ao bug identificado; ressante compartilhar as solicitaes de de informao;
Data/Hora: data e hora em que o pro- melhoria e manter os bugs visveis para configurao do fluxo de trabalho, que
blema foi identificado. Esta informao controle interno ou evitar que a lista de possibilita que equipes diferentes tambm
muitas vezes utilizada pela equipe de bugs se torne muito grande e contenha possam efetuar o controle de bugs seguin-
desenvolvimento para encontrar a fonte itens de severidade alta; do um fluxo de atividades diferente;
do problema analisando o arquivo de 4. Reforce a documentao e treinamento notificaes para acompanhamento da
log do sistema; tanto dos membros da equipe como dos evoluo do pedido, tornando possvel
Severidade: indica o quanto o proble- usurios externos. Desta forma evita-se configurar que os interessados em um
ma reportado compromete o funciona- ouvir as desculpas por omisso e falta de determinado bug sejam notificados du-
mento do sistema; conhecimento dos procedimentos e eta- rante sua evoluo criao, ajuste, teste,
Localizao: indica o local do sistema pas necessrias para o controle de bugs, validao;
onde o problema foi identificado; incluindo o envio, o tempo de resposta e relatrios personalizados, que permitem
Procedimento: explica os passos como se comportar durante todas as etapas um acompanhamento geral dos problemas
seguidos para que o problema seja do processo; reportados pelo sistema.
apresentado pelo sistema; 5. Procure evitar realizar de forma autom-
Evidncia: descreve o problema tica algumas etapas do controle de bugs, Uma vez que este controle j esteja ajus-
identificado; pelo menos inicialmente. Neste item, tado e com as arestas aparadas, possvel
Imagem: tela capturada do problema fundamental contar com o apoio de uma cuidadosamente pensar na automao
identificado. ferramenta para reporte e gerenciamento de algumas partes deste controle, porm
3. A deciso de tornar pblica (a qualquer dos bugs do sistema. Este tipo de ferramen- sempre com muita cautela.
pessoa interessada no projeto, incluindo o ta permite, dentre outras coisas: Quando falamos sobre pessoas vale a
cliente) ou no a lista de bugs pode gerar acompanhamento do ciclo de vida do pena destacar que nem sempre os usurios
implicaes para a equipe, tal como a bug do seu cadastrado at seu encerra- finais so os nicos a reportar bugs. Isso
presso por resoluo de certos bugs. A mento; quer dizer que preciso considerar que
disponibilizao deste tipo de informao rastreamento de um bug identificando um bug pode ser sugerido pela equipe
deve ser avaliada de acordo com a conside- a situao atual de um determinado pro- interna de desenvolvedores, descoberto
rao de vantagens e desvantagens que tal blema reportado; pela anlise de logs do software (plata-
acesso s informaes internas do projeto anexao de arquivos ao pedido, o que forma, sistema operacional ou banco de
pode proporcionar. Em projetos comer- permite anexar imagens que representem dados), informado por um pblico geral
ciais (diferente do que vemos ao analisar o bug reportado; (em redes sociais, fruns ou comentrios),
projetos open source, onde as informaes campos personalizados, fazendo com reportado pela equipe de suporte ou testes
so normalmente disponibilizadas para que seja possvel a customizao da (QA Quality Assurance), encontrado por
todos), para evitar desgastes e percepes ferramenta pela equipe de desenvolvi- novos desenvolvedores (caso de projetos
de software livre) ou at explorado por
hackers que se aproveitam das brechas
de segurana.
Em geral, lidar com as pessoas a princi-
pal dificuldade quando se fala em gesto
de bugs. Portanto, h de se estabelecer
uma sequncia de passos e atividades que
padronizem o que deve ser feito e garantir
que sempre que um novo bug for reporta-
do, h um caminho correto, padronizado
e testado a ser seguido para lidar com ele.
O nome disso processo e ele geralmente
representado por algum diagrama contendo
etapas e ao menos uma sequncia de passos
a serem seguidos. A Figura 1 apresenta um
diagrama que representa de forma genrica
o ciclo de vida de um defeito.
Antes de entrar em detalhes do processo
Figura 1. Ciclo de vida de um defeito vale a pena destacar que muitas pessoas

54 SQL Magazine Edio 130


tm uma impresso errada quando se deparam ou precisam comum que no incio de sua adoo ele precise ser consultado
seguir um processo. De fato, comum encontrar profissionais e, por isso, recomenda-se deixar os diagramas do processo sempre
que ao ouvir a palavra processo j pensam em algo burocrtico, vista em quadros ou locais pblicos.
engessado e que inibe a criatividade e liberdade de trabalho. Em Todo o processo de controle de bugs j vai implementar al-
algumas situaes tal comportamento faz com que certas pessoas gum tipo de organizao e gerenciamento das ocorrncias. Um
no sigam o processo e apresentem atitudes rebeldes que certa- ponto importante que deve ser considerado quando se fala em
mente so prejudiciais ao projeto. organizao, gerenciamento e controle de bugs a integrao
responsabilidade do gerente de projeto disseminar o conceito com o processo de desenvolvimento. Praticamente todos os pro-
que um processo no deve ser encarado como algo negativo pe- cessos de desenvolvimento mais populares e comuns contm
los membros da equipe e usurios externos. Uma das melhores ao menos uma etapa que lida com a manuteno de software
maneiras para se demonstrar isso deixar claro que processos e neste ponto que o controle de bugs deve ser encaixado. Por
no so imutveis e que eles podem e devem ser modificados exemplo, em processos geis como o SCRUM, existe a diviso
quando no fizerem mais sentido, no forem geis o suficiente de trabalho em unidades como Sprints. comum que a meta
ou quando no segui-los gera mais benefcio do que seguir o a ser atingida para que um Sprint seja fechado e outro se ini-
processo ou parte dele. cie seja a quantidade de bugs corrigidos. Outro exemplo de
Muitas vezes preciso lidar com diversos aspectos psicolgicos e integrao com processo pode ser a associao do controle de
culturais para que o processo seja utilizado. Em casos extremos, bugs com as etapas de build e deploy, geralmente realizadas
preciso lidar com questes disciplinares de acordo com as polticas de forma automtica por ferramentas como o ANT, Maven ou
e tcnicas suportadas e adotadas pela empresa, que podem incluir Gradle da plataforma Java.
desde simples comentrios at avisos, notificaes e punies. O processo envolvido no controle e gerenciamento de bugs deve
Uma vez que o processo j seja definido, ele deve estar claro e ser suportado por uma ou mais ferramentas que permitam a cus-
compreendido por todos os membros da equipe. tomizao de acordo com a maneira na qual a equipe trabalha.

Edio 130 SQL Magazine 55


Conhea prticas de controle de bugs no banco de dados

Atualmente existem muitas ferramentas para auxiliar o controle des e datas. Como o Road Map apresentado para pessoas no
de bugs independentemente do tipo ou contexto em que eles tcnicas preciso tomar cuidado com o nvel de detalhamento
ocorrem (como o banco de dados). Talvez a mais popular delas das funcionalidades descritas.
seja o Bugzilla, porm existem outras, inclusive no formato SaaS
(Software as a Service), que podem ser utilizadas diretamente no
navegador sem a necessidade de instalao de software.
De qualquer maneira, preciso saber customizar a ferramenta,
conhecer seus limites e particularidades, treinar a equipe e tornar
claro, simples e fcil a utilizao desta para o controle de bugs, evi-
tando que seu uso acabe gerando mais trabalho do que o necessrio.
A seo Links apresenta algumas aplicaes que auxiliam o con-
trole de bugs em processos de desenvolvimento de software.
Um ponto importante que deve ser discutido e esclarecido entre
todos os membros do projeto como ser feita a diviso dos en-
tregveis do software. Isso quer dizer que preciso definir com
critrios sem ambiguidade como ser a nomenclatura comercial
das edies, o codinome interno do projeto, quais sero as verses
e como a numerao do release incrementada. Por exemplo: o
SQL Server possui verses com os nomes SQL Server 7.0, 2000,
2005, 2008 e 2014 e edies Enterprise (com todas as funcionali-
dades), Developer (para desenvolvedores), Express (gratuita, mas
com limitaes), dentre outras edies. Figura 2. Exemplo de Road Map do software OpenShift
Outro aspecto relacionado imagem do produto a deciso de
quando lanar um service pack, um patch ou uma atualizao de
segurana (security update). Os critrios para estas definies so
intimamente ligados quantidade e nvel de vulnerabilidade asso-
ciados aos bugs que devem ser avaliados caso a caso. Novamente,
o leitor pode analisar softwares muito utilizados como sistemas
operacionais, bancos de dados, jogos de grandes estdios e outros
para ter como base quais critrios vo ditar como e quando ser
a liberao de novas verses, service packs, patchs e atualizaes
de segurana. Independentemente de quais forem os critrios
para o versionamento e liberao dos pacotes de atualizao do
software, preciso que eles sejam claros e de conhecimento geral
entre todos os membros da equipe.
Figura 3. Exemplo de Road Map de software associado a Sprints do processo de desenvolvimento
Acompanhamento de bugs
Quando se utiliza uma ferramenta para o controle de bugs
possvel gerar alguns documentos que vo ajudar tanto a gesto Um Road Map uma representao de alto nvel dos objetivos
atual do projeto como o planejamento futuro. Em particular, futuros do projeto de software que geralmente apresentado para
possvel pensar na criao dos documentos Road Map, Release usurios finais ou patrocinadores (sponsors) do projeto. Para um
Schedule e Release Notes. Estes documentos recebem como detalhamento mais preciso utiliza-se o artefato Release Schedule,
entrada informaes sobre o controle de bugs e auxiliam o pla- pois este documento se parece mais com um cronograma que
nejamento e organizao dos prximos passos na execuo do conter etapas concretas, nmero de verso, plataforma, edio
projeto de software. do software e outros detalhes mais especficos do projeto.
O Road Map algo que pode ser comparado com um mapa ro- Um bom exemplo de Release Schedule apresentado na Figura 4,
dovirio contendo o caminho a ser seguido. Geralmente este tipo que mostra a separao entre as datas de lanamento e descontinui-
de artefato contm datas associadas a verses do software que, dade (fim do suporte e trmino da criao de novas funcionalidades)
por sua vez, so associadas a funcionalidades ou recursos a serem das verses do sistema operacional Ubuntu. Alm de facilitar a
corrigidos ou implementados. No h um guia para a definio visualizao e andamento do projeto, o Release Schedule mostra
deste tipo de artefato, mas comum a apresentao de verses que h perspectivas futuras para o software e d um toque de
junto com uma linha do tempo. As Figuras 2 e 3 mostram exemplos profissionalismo ao desenvolvimento de software que evidencia
de Road Maps de softwares com destaque para as funcionalida- o compromisso das pessoas envolvidas no projeto.

56 SQL Magazine Edio 130


O profissional que nunca trabalhou em equipe ou possui pou-
ca experincia na coordenao de atividades relacionadas ao
desenvolvimento tem neste artigo um guia bsico com algumas
atitudes, recomendaes e comportamentos que se pode esperar
tanto de usurios finais como de membros da equipe, inclusive
do profissional que assume o papel de gerente de projeto, pois
tal cargo possui responsabilidades centrais no gerenciamento e
controle de bugs de software.

Autor
Mauro Pichiliani
mauro@pichiliani.com.br / @pichiliani
bacharel em Cincia da Computao, mestre e doutorando
Figura 4. Exemplo de Release Schedule do sistema operacional Ubuntu
pelo ITA (Instituto Tecnolgico de Aeronutica) e MCP, MCDBA
e MCTS. Trabalha h mais de 10 anos utilizando diversos bancos de dados
Por fim, o documento Release Notes assume a forma de uma SQL e NoSQL. colunista de SQL Server do web site iMasters (http://www.
lista de notas associadas a um release, que pode ser uma nova imasters.com.br) e mantenedor do DatabaseCast (@databasecast), o podcast brasileiro
verso, service pack, patch ou atualizao de segurana. As notas sobre banco de dados.
so organizadas no formato de lista e contm um detalhamento
curto do que mudou em relao ao release anterior, sem entrar Links:
em muitos detalhes de como os bugs forram corrigidos. Existe
muita variao do que colocar nos itens de um Release Note e Artigo Como Relatar Bugs de Maneira Eficaz.
no raro encontrar comentrios de desenvolvedores inseridos http://www.chiark.greenend.org.uk/~sgtatham/bugs-br.html
quando um commit (envio do cdigo fonte para um sistema de Artigo em ingls It Doesnt Work and the Art of Reporting Bugs.
versionamento) foi feito, algum tipo de identificador interno do http://ronwhitman.com/it-doesnt-work-and-the-art-of-bug-reports/
sistema de controle de bugs e at crditos de reconhecimento da
pessoa que encontrou o bug. Artigo 7 tips to file useful Debian bug reports and get your problem solved.
http://bit.ly/1rPsU6Q
O documento Release Notes assume a forma de um arquivo
texto ou HTML disponibilizado junto com os arquivos binrios do Ferramenta de controle de bugs Bugzilla.
release ou em uma local especial do site ou da aplicao mobile. http://www.bugzilla.org/
A seo Links contm dois exemplos de Release Notes para uma
Ferramenta de controle de bugs (SaaS) Damm Bugs.
nova verso do sistema operacional Ubuntu e para um patch do https://bugtrack.in/
jogo The Elders Scrolls V: Skyrim.
As recomendaes, prticas, sugestes e esclarecimentos apre- Ferramenta de controle de bugs (SaaS) BugTracker.nET.
sentados neste artigo possuem o potencial de auxiliar a falta de http://ifdefined.com/bugtrackernet.html
cuidado e acompanhamento de bugs. Apesar do que foi apresenta- Release notes (no oficial) do patch para o jogo The Elders Scrolls V: Skyrim.
do neste artigo se concentrar em projetos de software corriqueiros, http://www.uesp.net/wiki/Skyrim:Patch
tudo que foi sugerido pode ser aplicado em outros contextos, pois
onde h algum tipo de software sendo desenvolvido por uma equi-
Voc gostou deste artigo?
pe necessrio aplicar tcnicas e prticas para a gesto de bugs.
Mesmo em situaes onde apenas a concepo e o design abstrato
D seu voto em www.devmedia.com.br/sqlmagazine/feedback
e de alto nvel de solues computacionais responsabilidade da
equipe faz-se necessrio, dentre outras atitudes, restringir o acesso Ajude-nos a manter a qualidade da revista!
direto do usurio final e organizar prioridades.

Edio 130 SQL Magazine 57


Conhea prticas de controle de bugs no banco de dados

58 SQL Magazine Edio 130


Como integrar SQLite
em aplicaes C++
U
m banco de dados uma coleo de dados Fique por dentro
inter-relacionados, ou seja, quando possuir-
mos algum dado e este possuir qualquer Nem sempre necessitamos de um SGBD para resolver nosso pro-
relacionamento com outro dado, ento temos um blema quando utilizamos de uma base de dados para armazenar
banco de dados. configuraes ou quaisquer outras informaes que necessariamente
Este conceito tambm pode ser aplicado quando no so acessadas em rede. Para isso, o SQLite uma soluo em
nos referimos ao exemplo de dados temporrios ou banco de dados acoplado e de cdigo aberto. Utilizando-se SQLite,
de configuraes de uma aplicao ou parte dela. podemos facilmente compil-lo junto com a aplicao e utilizar de
Esses dados so normalmente acessados com bastante seus recursos atravs de uma interface de mtodos nativos para a
frequncia e a criao e manuteno de arquivos de linguagem C++.
configurao no seria a melhor soluo, visto que Atravs da implementao de uma aplicao na linguagem C++,
encontraramos vulnerabilidade na segurana das in- ser demonstrado o funcionamento do SQLite embutido no mesmo
formaes possibilitando que qualquer usurio possa cdigo fonte que a aplicao, usando de seus principais recursos
visualizar ou editar, alm do controle transacional de disponveis, como a criao de um banco de dados em arquivo e
escrita e gravao em um mesmo arquivo, bem notvel in-memory, consultas, atualizaes, inseres e excluses de dados
quando utilizamos vrios segmentos paralelos efetu- atravs da chamada de suas funes de persistncia. Verificaremos
ando essas operaes simultaneamente. tambm como realizar manuteno e algumas configuraes, bem
O SQLite um banco de dados open-source em con- como a leitura das mesmas.
tnuo desenvolvimento e manuteno e desenvolvido
na linguagem C e mantido pela SQLite Consortium,
uma associao dedicada em mant-lo e continu-lo. mente utilizado no iOS e nos demais sistemas operacionais
Segundo a mesma, cerca de 95% do cdigo fonte possui mobile.
teste, alm de possuir alto nvel de comentrio, facili- Este conceito de banco de dados embarcados ganha mais fora
tando que qualquer pessoa consiga alterar e utilizar. quando trabalhamos com informaes locais e com quantidade
Existem vrias formas de utiliz-lo, JDBC, ODBC de informaes grandes ou no, j que necessitamos de agi-
ou mesmo com o prprio cdigo fonte dentro da lidade com baixo processamento. O SQLite implementa este
aplicao. Nesta ltima, destaca-se quando utilizada conceito e um dos mais conhecidos na atualidade. Sua base
a linguagem C++, nativo na linguagem C, ele dispe de dados fica concentrada em um arquivo nico no sistema
de funes simples e objetivas. Na prtica, isso corres- e sua leitura permitida por vrias transaes simultneas,
ponde a conter seu cdigo fonte e efetuar a chamada porm limitado a uma transao quando realizadas inseres
destas funes de persistncia sem a necessidade de ou atualizaes de dados.
um mecanismo de comunicao (database driver im- Este artigo demonstrar a chamada das funes bsicas e es-
plementation) entre a aplicao e o banco de dados. senciais para utilizao do SQLite, visualizaremos a criao de
A aplicao deve interagir com o SQLite atravs dos um banco de dados, insero de dados, atualizao e excluso
comandos padres SQL ANSI 92 e com a chamada de atravs do uso de SQL em uma aplicao C++.
funes de persistncia; o SQLite interpreta, executa e Podemos baixar o cdigo fonte no site oficial e adicionar ao
retorna os dados. Na prtica, isso bem peculiar, uma projeto sem dificuldade. A implementao na linguagem C e
simples chamada de funo pode inserir, alterar ou com isso tambm utilizvel na linguagem C++. O cabealho
excluir um dado dentro de seu banco de dados. com as funes pblicas esto em sqlite3.h e pode ser includo
Compatvel com Visual Studio e GCC para desktop, em qualquer outro lugar no projeto. O tamanho do cdigo
pode ser compilado e utilizado em qualquer sistema um pouco maior do que 1 MB e significa pouco em um contexto
operacional desktop. Contudo, toma sua maior fora total de projeto de porte mesmo pequeno, mdio ou grande.
de utilizao em sistemas mobile. No Android, j Seu cdigo fonte livre para quem queira baixar, alterar,
o banco de dados mais utilizado e tambm ampla- compilar e usar, ou mesmo redistribuir.

Edio 130 SQL Magazine 59


Como integrar SQLite em aplicaes C++

O SQLite uma boa soluo em banco de dados principalmente com que essas pginas sejam deslocadas ficando com endere-
quando precisamos trabalhar com bases de dados que no neces- amento invlido ou no contendo dados. Para isso, existem
sitem de grande gerenciamento de concorrncia de transaes e ferramentas, normalmente nativas de cada banco de dados
que a base de dados pode ser mantida localmente e com acesso para realizar um reindexamento e correo dessas pginas
pouco concorrido. Outros exemplos de cenrios onde ele pode invlidas, podendo ser automtico ou manual, isso depende
ser utilizado so estudos de bancos de dados, aprendizados de de cada banco de dados.
SQL, aplicaes desktop que no trabalhem na estrutura cliente/ Para realizar manuteno na base de dados, o SQLite con-
servidor ou mesmo aplicaes ou sistemas embarcados. tm a opo de vacuum automtico e que pode ser habilitado
Uma das caractersticas do SQLite manter o padro de atravs do comando PRAGMA auto_vacuum ou a execuo
propriedades ACID considerando os padres SQL, sendo um manual atravs de chamada de funo. Sua utilidade bem
banco de dados completo para quem quiser simplicidade, com notada quando trabalhamos com excluso fsica de registros,
segurana e muita velocidade de interao com completa faci- o SQLite no remove fisicamente at que um vacuum seja
lidade de manuteno ou criao de extenses SQL atravs de executado, assim, o tamanho da base e a velocidade afetada
seu cdigo aberto e livre. diretamente.

SQL Utilizando as principais funes


O SQLite suporta quase todos os comandos presentes no Atravs de uma interface grfica desenvolvida em C++, ire-
SQL92. Com ele possvel criar, inserir, atualizar e excluir mos efetuar a chamada de algumas funes de persistncia
registros de forma padro e mais simples possvel, e oferece do SQLite, utilizaremos seu cdigo fonte na verso 3 e sistema
tambm suporte a triggers, functions e views. A restrio operacional Windows. As funes bsicas que sero utilizadas
por chave estrangeira pode ser habilitada ou desabilitada de so para criao de uma base de dados em arquivo com inser-
forma total no banco de dados, ou seja, pode restringir chave o, atualizao e excluso de dados. Para isso, utilizaremos
estrangeira ou no. Caso no seja habilitada, a restrio quando Eclipse IDE Kepler com CDT plugin e GCC 4.7.
infligida no causa erro na execuo do comando. A Figura 1 exibe onde colocaremos os fontes do SQLite3. Neste
Algumas das implementaes que o SQLite no suporta so projeto exemplo, optamos coloc-lo dentro da pasta src/sqlite.
RIGHT e FULL OUTER JOIN, alguns comandos de alterao de No necessrio realizar nenhuma alterao para funcionar,
tabela, completo suporte a gatilhos e permisses de acesso. os cdigos fontes no possuem dependncias externas:
Vale lembrar que para o objetivo que o SQLite foi criado, O arquivo sqlite3.h e sqlite3ext.h so cabealhos e atravs de
podemos afirmar que faz tudo o que se prope. Seu propsito suas incluses podemos acessar a implementao das funes
manipular dados de forma rpida, embutida e com padro do SQLite. Estes arquivos foram baixados do site oficial e in-
SQL contendo cdigo fonte aberto e livre. cludos ao projeto;
Podemos acessar o catlogo do SQLite fazendo uma seleo O arquivo Main.cpp contm a implementao do cdigo de
em uma tabela do banco de dados. Alm do tipo dos objetos, inicializao e criao da janela, incluso e chamada das fun-
podemos obter o nome, nmero da pgina e seu SQL. A tabela es do cabealho sqlite3.h.
sqlite_master possui todos os dados estruturais de todo o banco
de dados, suas tabelas, funes, gatilhos e vises.

Configuraes
Para iniciar e utilizar uma base de dados SQLite, no neces-
sitamos de nenhuma configurao administrativa, ou seja, as
configuraes padro j possuem a melhor performance que
ele pode oferecer, porm podemos alterar outros parmetros.
Para isso, utilizaremos o comando PRAGMA. Com ele podemos
visualizar ou alterar configuraes.
Existe uma lista de todas as configuraes que o comando
trabalha, todas disponveis no site oficial, entre algumas delas
e as principais esto comandos como ativao de checagem de
chave estrangeira (foreign_key_check), contador de pginas Figura 1. Estrutura do projeto
(page_count), vacum (auto_vacuum) dentre outras.
A Figura 2 exibe uma janela simples que contm alguns botes
Manuteno e uma caixa de texto que servir para entrada de SQL para exe-
Os bancos de dados relacionais possuem pginas com os da- cutarmos no SQLite. Para a criao ou abertura de um banco de
dos gravados, e esses dados so alterados ou excludos fazendo dados, utilizamos o boto sqlite3_open que executar a funo

60 SQL Magazine Edio 130


de criao do banco de dados sqlite3_database.db na pasta c:\.
Veremos o quanto simples essa funo na Listagem 1.
Na linha 01 temos a incluso do cabealho sqlite3.h. J na linha 05
efetuamos a chamada da funo sqlite3_open com os parmetros:
Filename - Caminho relativo ou absoluto contendo o nome do
banco de dados. Para criarmos um banco de dados in-memory,
utilizamos file::memory: neste parmetro;
ppDb - Referncia de sada a varivel do tipo sqlite3 (instncia
do banco de dados).

Figura 3. Criando uma tabela

Listagem 2. Cdigo para execuo no SQLite

01 #include sqlite/sqlite3.h
02
03 sqlite3 * db;
04
05 static int callback(void *NotUsed, int argc, char **argv, char **azColName) {
06 for (int i = 0; i < argc; i++) {
07 printf(Coluna: %s Valor: %s, azColName[i], argv[i]);
08 }
Figura 2. Iniciando um banco de dados
10 return 0;
11 }
12
Listagem 1. Iniciando o banco de dados 13 void sqlite3_exec_exemplo(){
14 char * sql= new char[256];
01 #include sqlite/sqlite3.h 15 GetWindowText(hwndEdit, sql, 256);
02 16 if(!db){
03 sqlite3 * db; 17 sqlite3_open_exemplo();
04 void sqlite3_open_exemplo(){ 18 }
05 int rc = sqlite3_open(C://sqlite3_database.db, &db); 19
06 if (rc != SQLITE_OK) { 20 char *zErrMsg = 0;
07 MessageBox(NULL, Falha ao abrir o banco de dados, SQLite, 21 int rc = sqlite3_exec(db, (const char*)sql, callback, 0, &zErrMsg);
MB_ICONINFORMATION | MB_OK); 22 if (rc != SQLITE_OK) {
08 return; 23 MessageBox(NULL, Falha ao executar, SQLite,
09 } MB_ICONINFORMATION | MB_OK);
10 MessageBox(NULL, Sucesso ao abrir o banco de dados, SQLite, 24 return;
MB_ICONINFORMATION | MB_OK); 25 }
11 } 26 MessageBox(NULL, Sucesso ao executar, SQLite,
MB_ICONINFORMATION | MB_OK);
27 }

Na Figura 3 temos o SQL de criao de uma tabela simples. Uti-


lizaremos duas colunas com apenas restrio de chave primria:
uma com tipo inteiro e outra do tipo texto. Este mtodo ser executado automaticamente quando retornado
Na Listagem 2 veremos o cdigo fonte que executa o SQL informado algum registro do banco de dados. Seus parmetros so:
no campo de digitao. Neste momento veremos que para obtermos NotUsed - Este parmetro reservado e no utilizado;
o resultado dessas execues, utilizaremos o conceito de callback, o Argc - Quantidade de argumentos recebidos na instruo;
qual executado automaticamente a cada registro retornado. Argv - Vetor com os valores afetados, a quantidade de posies
Na linha 03 mantemos a declarao da instncia da base de da- referenciada em argc;
dos, enquanto na linha 05 criamos um mtodo esttico call-back. azColName Vetor contendo o nome da coluna afetada.

61 SQL Magazine Edio 130 Edio 130 SQL Magazine 61


Como integrar SQLite em aplicaes C++

verificada a presena de um lao para percorrer todos os re-


gistros recebidos. Neste exemplo executamos apenas a exibio,
ficando como no exemplo: Coluna: teste_id Valor: 1.
Na linha 21 fazemos a chamada da funo sqlite3_exec. Esta
responsvel pela execuo das instrues SQL no SQLite.
O parmetro que contm o SQL obtido do campo de texto da
tela. Os argumentos desta funo so:
sqlite3* - Referncia a uma base de dados. Neste cdigo efe-
tuamos o teste se o banco no estiver aberto, ento chamada a
funo sqlite3_open para realizar esta operao;
sql - Instruo SQL que ser executada. Para esta funo
podemos utilizar qualquer instruo de CRUD, parmetros de
configurao ou mesmo manuteno;
callback - Referncia a uma funo que tenha a seguinte assi-
natura: int (*callback)(void*, int, char**, char**). Para este exemplo
foi criada anteriormente na linha 05 a funo callback;
argc - argc- A quantidade de argumentos para o callback. Neste Figura 4. SQL de insero, atualizao e excluso
exemplo, utilizaremos a quantidade 0.
errmsg - Referncia a uma varivel texto que receber o erro caso
ocorra. Esta deve ser inicializada de acordo com o exemplo.

Com a funo sqlite3_exec, podemos executar qualquer instruo


SQL suportada pelo SQLite. Neste exemplo, usaremos instrues
simples de insero, atualizao e excluso de dados. Vale lembrar
que toda a criao de gatilhos, funes do banco de dados e vises
tambm devem ser criadas por esta funo (Figura 4).
Com a funo sqlite3_exec, podemos executar tambm consul-
tas de dados. Na Figura 5 vemos um exemplo com a insero de
alguns registros em uma tabela e na Figura 6 podemos observar
uma seleo simples. Na Listagem 3 observamos a sada da se-
leo no terminal.

Listagem 3. Dados retornados na seleo

Coluna: teste_id Valor: 1


Figura 5. Insero de vrios registros
Coluna: descricao Valor: descricao
Coluna: teste_id Valor: 2
Coluna: descricao Valor: descricao2
Coluna: teste_id Valor: 3
Coluna: descricao Valor: descricao3

Figura 6. Seleo dos registros da tabela

62 SQL Magazine Edio 130


Estes dados foram impressos no terminal atravs da funo mesmo processo (thread), ou seja, para realizar a interrupo de
printf, usada no mtodo call-back. O mtodo foi invocado auto- uma instruo necessitamos ter acesso referncia da base de
maticamente a cada registro retornado na consulta. dados. Como observamos na Listagem 4, veremos que em uma
Este um exemplo simples de sada de dados, porm podemos das threads temos a instruo que realiza a chamada do SQLite e
utilizar estes dados em outros locais da aplicao. Para isso utili- outra que realiza sua interrupo.
zaramos, por exemplo, uma estrutura de dados dinamicamente Este exemplo utiliza para criar e iniciar uma thread cdigo
alocada. nativo da API Windows, com a funo CreateThread na linha 04.
Na linha 07 colocamos um tempo limite antes de executar a
Interrompendo instrues interrupo. Esse tempo simblico e apenas demonstrativo, e
Existem algumas operaes que podem demasiar um grande com isso interrompemos a transao na linha 09. Outro exemplo
tempo para executar e podem necessitar que sejam encerradas til de interrupo de transaes ocorre em caso de lock quando
antes mesmo de sua concluso. Para isso, o SQLite permite atravs podemos encerrar e realizar outro tratamento.
da chamada da funo sqlite3_interrupt essa interrupo.
Uma interrupo de instruo s possvel com a utilizao de Vises
mais de um segmento utilizando a mesma base de dados em um O SQLite permite a criao de vises ou views de forma bem
simples, assim como mostra a Listagem 5.
Listagem 4. Interrupo usando thread
Neste exemplo vemos a criao de uma viso no SQLite atravs
da funo sql3_exec, novamente utilizando essa mesma funo de
01 #include sqlite/sqlite3.h interao podemos perceber que atravs dela podemos realizar a
02 maioria das nossas necessidades relacionadas com persistncia.
03 sqlite3 * db; Esta viso bem simples, somente a seleo de colunas em uma
04 DWORD WINAPI sqlite3_interrupt_exemplo_thread(void* threadParams) {
tabela com a aplicao de filtro simples. As vises em qualquer
05 printf(esperando...);
banco de dados possuem melhor desempenho que a execuo
06
repetitiva de instrues de seleo pela aplicao j que a instruo
07 Sleep(2000);
08 armazenada internamente em sua base de dados.
09 sqlite3_interrupt(db); Existe no SQLite a possibilidade da criao de vises tem-
10 porrias. Para isso, acrescentamos uma das palavras TEMP
11 printf(Interrupo enviada); ou TEMPORARY e o SQLite bloquear a view somente ao
12 processo que a criou e a excluir automaticamente aps seu
13 return 1; encerramento.
14 }
15
16 void sqlite3_interrupt_exemplo() {
17 DWORD threadDescriptor;
18
19 HANDLE thdHandle = CreateThread(NULL, 0, sqlite3_interrupt_exemplo_
thread, NULL, CREATE_SUSPENDED, &threadDescriptor);
20
21 SetThreadPriority(thdHandle, THREAD_PRIORITY_LOWEST);
22
23 char *zErrMsg = 0;
24 ResumeThread(thdHandle);
25
26 if (!db) {
27 sqlite3_open_exemplo();
28 }
29
30 const char * sql = vacuum;;
31 int rc = sqlite3_exec(db, sql, callback, 0, &zErrMsg);
32 if (rc != SQLITE_OK) {
33 MessageBox(NULL, Falha ao vacuum, SQLite,
MB_ICONINFORMATION | MB_OK);
34 return;
35 }
36 }

Edio 130 SQL Magazine 63


Como integrar SQLite em aplicaes C++

Listagem 5. Views no SQLite padro de linhas afetadas com NEW e OLD para controle em
nvel de registro.
01 #include sqlite/sqlite3.h Quando no especificada a ordem de execuo do gatilho, o
02 SQLite toma o padro AFTER, ou seja, sempre executa o gatilho
03 sqlite3 * db;
aps alterar os dados na tabela. Para alterar para BEFORE sim-
04
ples, devemos utilizar BEFORE UPDATE ou BEFORE DELETE
05 static int callback(void *NotUsed, int argc, char **argv, char **azColName) {
06 for (int i = 0; i < argc; i++) {
na criao do gatilho.
07 printf(Coluna: %s Valor: %s, azColName[i], argv[i]);
08 } Fechando um banco de dados
10 return 0; Necessitamos, aps a utilizao do banco de dados, fech-lo. Para
11 } isso, existe a funo sqlite3_close. Na Listagem 7 ser exibido o
12 cdigo para fechar o banco de dados aberto anteriormente pela
13 void sqlite3_view_exemplo(){ funo sqlite3_open.
14
Observamos na linha 05 o teste de validao. Se o banco estiver
15 const char * sql = CREATE VIEW teste_view AS SELECT teste_id,
realmente aberto, na linha 06 a funo sqlite3_close chamada para
descricao FROM teste WHERE teste_id IN(1, 2, 3);
destruir o objeto de conexo e referncia ao banco de dados aberto.
16
17 if (!db) {
Na Listagem 8 veremos a execuo do comando de manu-
18 sqlite3_open_exemplo(); teno vacum. possvel notar a utilizao da mesma funo
19 } sqlite3_exec.
20 Na linha 03 vemos novamente a declarao da referncia a um
21 char *zErrMsg = 0; objeto de banco de dados do SQLite, e na linha 05 novamente o
22 int rc = sqlite3_exec(db, sql, callback, 0, &zErrMsg); mtodo callback que ser executado automaticamente pela cha-
23 if (rc != SQLITE_OK) {
mada do sqlite3_exec.
24 MessageBox(NULL, Falha ao executar, SQLite,
No primeiro exemplo, na linha 21, executamos um vacuum para
MB_ICONINFORMATION | MB_OK);
manuteno no banco de dados. Aps isso, na linha 26 executa-
25 return;
26 }
remos a tarefa de checagem de integridade da base utilizando o
27 } comando PRAGMA nativo do SQLite e, para finalizar, na linha 33
executaremos a checagem de codificao do banco de dados.

Gatilhos
Podemos criar gatilhos no SQLite normalmente atravs da sin-
taxe CREATE TRIGGER a qual tambm usamos para definir em
que momento sero disparados. Diferentemente de alguns outros
bancos de dados, a codificao dentro do prprio gatilho e no
em um procedimento armazenado separado, assim como mostra
a Listagem 6.
Neste exemplo utilizamos os elementos INSERT, UPDATE e
DELETE para adicionar na tabela teste_bkp um registro igual ao
alterado quando cada um dos gatilhos for disparado.
Primeiro, na linha 07, criamos uma tabela idntica tabela teste,
desconsiderando apenas a chave primria, pois o propsito man-
ter um histrico das alteraes. Aps isso, na linha 16 criamos o
gatilho teste_trigger_insert que ser disparado automaticamente
quando inserido algum registro na tabela teste, valendo a mesma
regra para o gatilho de UPDATE e DELETE presentes nas linhas
30 e 45 respectivamente.
O exemplo apresentado utiliza UPDATE, DELETE e INSERT
para demonstrar quando sero disparados e qual a operao
realizada. No existe limites de quantidades de gatilhos que
podem ser criados em uma tabela e muito menos em um banco
de dados.
O padro de criao dos gatilhos o mesmo entre as operaes
possveis (insero, atualizao ou excluso) e segue o mesmo

64 SQL Magazine Edio 130


Listagem 6. Triggers no SQLite

01 #include sqlite/sqlite3.h descricao ON teste


02 31 BEGIN
03 sqlite3 * db; 32 INSERT INTO teste_bkp(teste_id, descricao)
04 VALUES(NEW.teste_id, NEW.descricao);
05 void sqlite3_trigger_exemplo(){ 33 END;
06 34
07 const char * sql = CREATE TABLE teste_bkp(teste_id INTEGER, 35 sqlite3_exec(db, sql, callback, 0, &zErrMsg);
descricao VARCHAR(12) NOT NULL);; 36
08 37 sql = UPDATE teste SET descricao = descricao alterada WHERE teste_id = 4;;
09 char *zErrMsg = 0; 38
10 int rc = sqlite3_exec(db, sql, callback, 0, &zErrMsg); 39 rc = sqlite3_exec(db, sql, callback, 0, &zErrMsg);
11 if(rc != SQLITE_OK) { 40 if(rc != SQLITE_OK) {
12 MessageBox(NULL, Falha ao criar tabela espelho, SQLite, 41 MessageBox(NULL, Algum erro ocorreu ao atualizar os dados na tabela,
MB_ICONINFORMATION | MB_OK); SQLite,MB_ICONINFORMATION | MB_OK);
13 return; 42 return;
14 } 43 }
15 44
16 sql = CREATE TRIGGER teste_trigger_insert INSERT ON teste 45 sql = CREATE TRIGGER teste_trigger_delete DELETE ON teste
17 BEGIN 46 BEGIN
18 INSERT INTO teste_bkp(teste_id, descricao) 47 INSERT INTO teste_bkp(teste_id, descricao)
VALUES(NEW.teste_id, NEW.descricao); VALUES(OLD.teste_id, OLD.descricao);
19 END; 48 END;
20 49
21 sqlite3_exec(db, sql, callback, 0, &zErrMsg); 50 sqlite3_exec(db, sql, callback, 0, &zErrMsg);
22 51
23 sql = INSERT INTO teste(teste_id, descricao) VALUES(4, descricao4);; 52 sql = DELETE FROM teste WHERE teste_id = 4;;
24 rc = sqlite3_exec(db, sql, callback, 0, &zErrMsg); 53
25 if(rc != SQLITE_OK) { 54 rc = sqlite3_exec(db, sql, callback, 0, &zErrMsg);
26 MessageBox(NULL, Algum erro ocorreu ao inserir os dados na tabela, 55 if(rc != SQLITE_OK) {
SQLite,MB_ICONINFORMATION | MB_OK); 56 MessageBox(NULL, Algum erro ocorreu ao excluir dados na tabela,
27 return; SQLite,MB_ICONINFORMATION | MB_OK);
28 } 57 return;
29 58 }
30 sql = CREATE TRIGGER teste_trigger_update UPDATE OF 59 }

Listagem 7. Cdigo para fechar um banco de dados

01 #include sqlite/sqlite3.h
02
03 sqlite3 * db;
04 void sqlite3_close_exemplo(){
05 if(db){
06 sqlite3_close(db);
07 }
08 }

Vale lembrar que a sada de dados sempre no mtodo call-


back. Neste exemplo ser exibido no terminal atravs da funo
printf.
Com o surgimento da computao e mais tarde, suas aplicaes,
surgiu tambm a necessidade do armazenamento de dados, mes-
mo sendo uma massa pequena ou grande deles, arquivos de leitura
e escrita manual foram e so, em alguns casos a soluo, porm
nem sempre so a melhor sada. O conceito de banco de dados
embutidos surgiu com a finalidade de deixar esse gerenciamento
mais fcil, mais seguro e usando o padro SQL.

Edio 130 SQL Magazine 65


Como integrar SQLite em aplicaes C++

Listagem 8. Vacuum e PRAGMA Vale lembrar tambm que alguns bancos de dados embutidos
podem suportar quantidades relevantes de dados, um exemplo
01 #include sqlite/sqlite3.h
o SQLite com suporte a bases com at 2 TB de dados.
02
03 sqlite3 * db;
Aplicando a uma tcnica de componentes ou bibliotecas em
04 nossa aplicao, podemos utiliz-lo de forma que seus fontes
05 static int callback(void *NotUsed, int argc, char **argv, char **azColName) { estejam includos no projeto. Com isso, notvel o ganho de
06 for (int i = 0; i < argc; i++) { desempenho, manuteno e ajuste para resolver nosso problema
07 printf(Coluna: %s Valor: %s, azColName[i], argv[i]);
sem a necessidade de um SGBD instalado.
08 }
10 return 0;
11 } Autor
12
13 void sqlite3_exec_exemplo(){
Flvio Jos Vodzinski
14 const char * sql = vacuum;; flaviovodzinski@outlook.com
15 Acadmico do curso de Sistemas de Informao pela Unio
16 if(!db){ de Ensino do Sudoeste do Paran UNISEP, atua como de-
17 sqlite3_open_exemplo(); senvolvedor de aplicaes corporativas e fiscais nas linguagens C/C++,
18 } Java e Powerscript com utilizao de banco de dados relacionais e no
19 relacionais a mais de 4 anos.
20 char *zErrMsg = 0;
21 int rc = sqlite3_exec(db, sql, callback, 0, &zErrMsg);
22 if (rc != SQLITE_OK) {
Links:
23 MessageBox(NULL, Falha ao executar vacuum,
SQLite, MB_ICONINFORMATION | MB_OK);
24 } [1] Korth, H.F. e Silberschatz, A.; Sistemas de Bancos de Dados, Makron Books,
25 2a. edio revisada, 1994.
26 sql = PRAGMA integrity_check;
27 rc = sqlite3_exec(db, sql, callback, 0, &zErrMsg);
[2] SQLite
28 if (rc != SQLITE_OK) { http://sqlite.org
29 MessageBox(NULL, Falha ao executar integrity_check,
[3] SQLite Consortium
SQLite, MB_ICONINFORMATION | MB_OK);
30 }
http://sqlite.org/consortium.html
31
32 sql = PRAGMA encoding;
33 rc = sqlite3_exec(db, sql, callback, 0, &zErrMsg); Voc gostou deste artigo?
34 if (rc != SQLITE_OK) {
35 MessageBox(NULL, Falha ao executar encoding,
SQLite, MB_ICONINFORMATION | MB_OK);
D seu voto em www.devmedia.com.br/sqlmagazine/feedback
36 } Ajude-nos a manter a qualidade da revista!
37 }

66 SQL Magazine Edio 130


Como integrar SQLite em aplicaes C++

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