Академический Документы
Профессиональный Документы
Культура Документы
Sumrio
06 Modelo de dados para anlise de informaes educacionais
[ Pricles Magalhes e Rodrigo Oliveira Spnola ]
sobre e
Artigo no estilo Mentoring
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.
Figura 1. Modelo de dados proposto para estudos com minerao de dados 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
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.
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.
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
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:
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
Figura 5. Plano de execuo da consulta. SELECT * FROM produto WHERE data_alteracao = 01/01/2015
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
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.
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.
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.
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
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
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
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
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.
Listagem 1. Script SQL usado para criao do Banco de Dados Relacional (LjRelacional) Parte 1
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
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.
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.
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
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
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*/
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:
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.
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
(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;
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
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.
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.
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.
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
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 }
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
01 #include sqlite/sqlite3.h
02
03 sqlite3 * db;
04 void sqlite3_close_exemplo(){
05 if(db){
06 sqlite3_close(db);
07 }
08 }
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 }