segunda-feira, 2 de maio de 2011

MCC: Microsoft Community Contributor




No último dia 27/04 recebi um email da Microsoft referente a este novo programa reconhecendo a algumas pessoas que contribuem em seus fóruns ajudando a resolver dúvidas e problemas de usuários dos seus produtos, além de propor melhorias.

Muita gente não sabe que existe uma equipe responsavel por manter os foruns do TechNet e MSDN com bons niveis de respostas e gerenciado.

Recentemente a Microsoft passou a reconhecer as pessoas que mais colaboram com o Forum. Este reconhecimento chama-se Microsoft Community Contributor Award e é um titulo que passa a valer para o Brasil tambem.




Aproveito para incentivar a todos a participarem dos fóruns e tb serem reconhecidos.

segunda-feira, 11 de abril de 2011

PIVOT

Olá a todos,

Depois de um longo e tenebroso inverno, voltei a atualizar o blog. E nessa reestreia achei interessante citar sobre um tema bem interessante.

PIVOT TABLE !!!

Participando de alguns fóruns e discussões verifiquei que muitas pessoas, inclusive eu mesmo, tinha dúvidas sobre o tema.

Vamos começar de forma conceitual. O que é PIVOT TABLE?

De forma simples e rápida o pivot é uma forma que o SQL Server disponibiliza para transformarmos linhas em colunas nas nossas consultas.

Muito usado para quem trabalha com BI, é um recurso que possibilita fazer uma visualização em colunas das linhas do resultado da consulta facilitando a analise das informações.

Segue um exemplo:

Create table #Exemplo (codigo int, nome varchar(10))


insert into #Exemplo (codigo, nome) Values (1,'jose')
insert into #Exemplo (codigo, nome) Values (2,'mario')
insert into #Exemplo (codigo, nome) Values (1,'jose')
insert into #Exemplo (codigo, nome) Values (2,'mario')
insert into #Exemplo (codigo, nome) Values (3,'celso')
insert into #Exemplo (codigo, nome) Values (4,'andre')


Select [jose],[mario],[celso],[andre] from #exemplo
Pivot (count(codigo) for nome in ([jose],[mario],[celso],[andre])) p

O resultado trará:

Jose = 2
Mario = 2
Celso = 1
Andre = 1

Que é a quantidade de cada nome na tabela.

Observações:

- Se usado em versões do SQL 2005 ou superior, o nivel de compatibilidade deverá ser no minimo o 90.
- Valores nulos não são computados.

Para SQL 2000 a sintaxe já muda, segue um exemplo:

create table venda (ano int, mes int, valor numeric(9,2))


insert venda values (2003, 2, 10)
insert venda values (2003, 2, 1)
insert venda values (2003, 3, 20)
insert venda values (2003, 4, 30)
insert venda values (2004, 1, 40)
insert venda values (2004, 2, 50)
insert venda values (2004, 3, 60)
insert venda values (2004, 4, 70)
insert venda values (2005, 1, 80)


select * from venda order by 1,2,3


Para fazer um Pivot Table na versão 2000 é necessário você utilizar função de grupo e a cláusula group by.

select ano
, mes_1 = sum(case when mes=1 then valor end)
, mes_2 = sum(case when mes=2 then valor end)
, mes_3 = sum(case when mes=3 then valor end)
, mes_4 = sum(case when mes=4 then valor end)

from tb_venda
group by ano
order by ano;


Então é isso...

Até o próximo post.

Abraço.

segunda-feira, 8 de novembro de 2010

Ordenação de colunas em uma tabela.

Quem nunca teve o seguinte problema...

Ao acessar a estrutura de uma tabela através do comando SP_HELP, você tem a intenção de identificar as configurações de uma determinada coluna. Para qualquer pessoa que mexa com banco de dados a dois dias, sabe como fazer.

Mas o problema que vejo com muitas pessoas e até eu ver isso em um fórum, também achava muito chato, era quando este comando é executado em uma tabela com centenas de colunas!!!! Isso mesmo, CENTENAS...Ficar na barra de rolagem não é muito agradavél...

No SQL quando criamos colunas nas tabelas, elas são armazenadas na ordem em que são criadas, e isso dá muito trabalho para ficar achando a informação da coluna conforme já mencionado acima.

Com a consulta abaixo, resolveremos isso. Conseguiremos trazer as informações por qualquer ordem que desejarmos.

SELECT TABLE_NAME, COLUMN_NAME, ORDINAL_POSITION
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'TABLE1'
ORDER BY COLUMN_NAME

Resolvi postar esta informação depois de ouvir vários comentários a respeito. Com isso diminuimos um pouco a chatice da barra de rolagem....rsrsrs.

Obs.: Apenas como informação complementar, podemos ter as informações das colunas das tabelas pela view de sistema SYS.COLUMNS. Interessante ver o último post com um link para maiores detalhes.

Até a próxima,

Quando uma tabela foi criada?

Durante um processo de analise de algumas bases, onde estava sendo feita uma comparação de duas bases afim de garantir que os objetos/estrutura estavam iguais, identifiquei que alguns objetos estavam diferentes.

Diante disto precisei da seguinte informação (E creio que muita gente já fez a mesma pergunta): QUANDO ESTA TABELA FOI CRIADA???? Todo DBA já fez este questionamento....
Outro questionamento também é: QUANDO FOI A ÚLTIMA VEZ QUE MINHA TABELA SOFREU UMA ALTERAÇÃO?

Venho através deste post responder a estas perguntas.

Com a consulta abaixo conseguiremos responder ao questionamento:

SELECT SCHEMA_NAME(SCHEMA_ID) As Esquema, Name As Nome, Create_Date As Criacao, Modify_Date As Modificacao

FROM SYS.TABLES
ORDER BY Modificacao DESC

Através da SYS.TABLES temos algumas informações das tabelas de nosso banco.

Uma dica que gostaria que todos pudessem fazer, é averiguar sobre estas views de sistema.

Acessem o link: http://msdn.microsoft.com/pt-br/library/ms189783.aspx

e estudem sobre os principais tipos. Elas são muito utéis e ajudam muito a resolver vários problemas no processo de desenvolvimento.

Até mais,

Encontrando tabelas no SQL e no Oracle

Segue aqui informação importante e consideravel para agilizar busca de tabelas no SQL Server e também no Oracle.

Temos situações importantes em que precisamos encontrar algumas tabelas dentro do banco de dados. A medida em que o banco de nossa empresa vai crescendo, temos que ter formas rápidas de encontrar estes objetos.

No SQL 2008 temos duas formas:
SELECT * FROM SYS.TABLES e SELECT * FROM SYS.OBJECTS WHERE TYPE = 'U'

Onde na segunda consulta temos o filtro TYPE = 'U' que significa USER_TABLE, ou Tabela de Usuário. Pois temos no SQL o conceito de schema, que podemos ter objetos de mesmo nome mas em schemas diferentes.

No Oracle temos o seguinte comando:
SELECT * FROM DBA_TABLES ou SELECT * FROM USER_TABLES

Assim como no SQL o Oracle tem o conceito de owner ou o dono da tabela. O que significa isso?

Quando estamos no Oracle, acessamos sempre com algum usuário. Se estamos logados no Oracle com o usuário USER1, criamos a tabela CLIENTES e se logarmos com outro usuário, por exemplo, USER2 e rodarmos a segunda consulta buscando pela tabela CLIENTES nada será retornado.
Diferente da primeira consulta, que traz todas as tabelas independente do owner, a segunda filtra sempre pelo usuário logado naquela seção.

Então esta foi uma demonstração de como realizar busca de tabelas no SQL e no Oracle.

quinta-feira, 30 de setembro de 2010

Boas práticas em banco de dados...

Vou descrever abaixo algumas boas práticas que podemos atuar dentro de uma administração em banco de dados.

- Manutenção de banco de dados inclui um conjunto de tarefas pró-ativas que precisam ser realizadas periodicamente para garantir um desempenho ótimo das bases de dados e manter a alta disponibilidade.

- Banco de dados e arquivos de log devem ser manualmente pré-dimensionados para o tamanho final quando eles são criados. Só use aumento automático(autogrowth) para cobrir eventos inesperados, e não para gerir o crescimento do arquivo.

- Como ocorre com bancos de dados de produção, o tempdb deve ser pré-dimensionadas para o seu tamanho normal, de modo que quando SQL Server é reiniciado, o tempdb é instantaneamente dimensionados corretamente.

- Não ative a opção de banco de dados "Auto Shrink", nem criar automaticamente um JOB para diminuir qualquer do banco de dados ou arquivos de log.

- O banco de dados msdb pode crescer ao longo do tempo, e os dados mais antigos precisam ser excluídos usando ao SP's: sp_delete_backuphistory, sp_purge_jobhistory, e sp_maintplan_delete_log.

- Reconstruir (REBUILD) ou reorganizar (REORGANIZE) índices para eliminar a fragmentação. Só desfragmentar índices que forem necessários. Índices e estatísticas devem ser mantidos. Se você usar REBUILD para desfragmentar índices, esta estatística é automaticamente atualizado. Se você usar REORGANIZE para desfragmentar índices, as estatísticas devem ser atualizados separadamente.

- Todos os bancos devem ter a opção CHECKSUM ligado.

- Executar o comando DBCC CHECKDB para controle de possiveis inconsistências na base de dados.

- Realize backups completos diários do banco de dados e logs de transações por hora (ou conforme necessário para atender metas de alta disponibilidade).

- Ao agendar um JOB de manutenção no banco de dados, programa-los para que eles não se sobrepõem, e que eles sejam executados durante o tempo de menor trafego no banco.

- Confira todos os processos, como: cluster, replicação, o service broker, log shipping, espelhamento de banco de dados, para verificar se estão funcionando corretamente.

- Monitorar o espaço em disco para garantir que seus servidores SQL não vão ficar sem espaço em disco. Para melhor desempenho, todos os discos devem ter 15% ou mais de espaço livre.

- Durante o dia, monitorar periodicamente o desempenho do SQL Server usando o Monitor de desempenho, Profiler / SQL Trace, ou monitoramento do desempenho de outros ferramentas.

- Manter um registro de todas as alterações feitas nos servidores, incluindo a documentação de qualquer espécie e se necessário identificar e corrigir.

- Regularmente restaurar backups para um servidor de teste, a fim de verificar se é possível restaurá-los. Você não precisa de restaurar todos os backups de todos os dias, mas fazê-lo muitas vezes para garantir que você está confiante de que boas cópias de segurança estejam disponivéis.

- Tire algum tempo para aprender algo novo como um DBA para promover seu desenvolvimento profissional.

- Criar uma "receita" de como reconstruir cada instância em caso de uma reinstalação.

Essas são somente algumas dicas do que atuar durante o nosso dia a dia. Poderia ficar citando muitos mais itens, mas acredito que esses são os principais.

Bom trabalho!!!

Até mais,

Marco Pinheiro.

quarta-feira, 8 de setembro de 2010

Comandos RESTORE II

Continuando ainda com os comandos RESTORE, não podia deixar de comentar sobre o comando para voltar um backup, ou RESTORE DATABASE.

No SQL Server, o processo para voltar um backup é muito tranquilo. Temos uma ferramenta gráfica bem intuitiva que é o Management Studio (SQL 2005 e 2008).

Contudo, podemos ter um questionamento do outro post: "Qual o tamanho exato dos arquivos de dados e de log?" Porque deste questionamento....

Hoje nem tanto, devido ao baixo custo de espaço em HD's que não é tão pesado. Mas num passado não muito distante fazer um upgrade em estações e/ou servidores era (e ainda é um pouco....) uma barreira em várias corporações. Falou em custo a empresa não quer nem ouvir!!!! kkkkkkk....

Mas o intuito deste post é tentar suprir um pouco destes problemas de espaço. Vamos a um exemplo prático...

Temos uma empresa que presta suporte a vários clientes que usam bases de dados SQL Server. Um dia um desses clientes entra em contato informando um sério problema em seu sistema. A equipe de suporte não consegue resolver o problema do cliente e solicita sua base de dados para uma analise mais aprofundada da situação tentando simular o mesmo ambiente do cliente.

Entretanto, a base chega com um tamanho de 50GB e ao mandar restaurar pelo Management Studio ocorre o erro de espaço em disco insuficiente.

Acredito que o exemplo acima já deve ter ocorrido com muitaaaaa gente...

A resposta para solucionar esta questão vem com outra pergunta: Tenho alguma outra máquina (digo: Qualquer outra máquina!!!) com este espaço de 50GB disponiveis? Se a resposta é SIM, excelente!!!! Problema resolvido. Basta copiar o arquivo de 50GB para a outra máquina e pronto!!!!!

Mas.....NÃOOOOOOOOOO....Resposta errada!!!! Assim fica muito fácil.....Vamos dificultar um pouco...hehehehe

O que iremos fazer é uma restauração pela rede. Como????? Através do comando RESTORE DATABASE.

Inspirado no nosso exemplo vamos montar a sintaxe do comando:

RESTORE DATABASE BaseCliente FROM DISK = N'\\SERVIDOR1\BASECLIENTE\Backup.bak'
WITH

MOVE N'Oficial_Data' TO N'E:\ClienteX\Oficialdata1.mdf',
MOVE N'Oficial2_Log' TO N'E:\ClienteX\Oficial_log2.ldf',

NOUNLOAD, STATS = 10

Explicando o comando:

1) "RESTORE DATABASE BaseCliente"...Onde 'BaseCliente' é o nome que vou dar para a base de dados que irei restaurar.

2) "FROM DISK = N'\\SERVIDOR1\BASECLIENTE\Backup.bak'"....Onde '\\SERVIDOR1\BASECLIENTE\Backup.bak' é o caminho de rede onde está o arquivo de backup que o cliente enviou.

3) "MOVE N'Oficial_Data' e MOVE N'Oficial2_Log'"....Onde 'Oficial_Data' e
'Oficial2_Log' são os nomes lógicos que vieram na base. Para saber estes nomes use o comando RESTORE FILELISTONLY do último post.

4) "'E:\ClienteX\Oficialdata1.mdf' e 'E:\ClienteX\Oficial_log2.ldf'"....onde esta descrição é o caminho que irá salvar os arquivos de dados e de log. Caso você queira, este caminho também poderá ser salvo em uma outra máquina, basta informar o caminho de rede desejado.

Lembrando que onde envolver um caminho de rede, é necessário a sua devida permissão de compartilhamento.

Então com o comando acima podemos restaurar uma base na rede enviando os arquivos de dados e de log para qualquer máquina da rede. Assim ganhamos um leque de facilidades dentro dos processos do nosso ambiente corporativo.

Então é isso. Conseguimos restaurar um backup utilizando várias máquinas. Pode ter uma que é apenas o servidor de arquivos, outra o servidor de banco e outra como uma simples estação de trabalho.

Para maiores detalhes do comando RESTORE DATABASE vide o books online do SQL.

Até mais pessoal,

Abraço.

Marco.

domingo, 15 de agosto de 2010

Comandos RESTORE

Nesta seção vamos falar sobre o argumento RESTORE do SQL Server.

Dias atrás me deparei com uma questão na minha empresa. Estavamos com um backup de uma base de dados de mais de 100 GB.

Ao tentar restaurá-la ocorreram alguns erros incomuns.
Daí surgiram algumas dúvidas:
- O backup está corrompido?
- Qual a versão do SQL dessa base de dados. É compativel com a do meu servidor?
- Qual o tamanho exato dos arquivos de dados e de log?

Enfim, estes foram meus questionamentos para uma analise primária. Mas como respondê-los?

No SQL Server temos alguns argumentos que podem nos auxiliar em problemas como esse.

Seguem os tópicos:

RESTORE FILELISTONLY: Este argumento possibilita ver os dados do(s) arquivo(s) de log e de dados do backup. Informações como: Tamanho do arquivo, local onde estão os arquivos de dados e de log na máquina em que a base se encontra, dentre outros dados.

No editor de querys execute o comando:
RESTORE FILELISTONLY FROM DISK = 'C:\SQLSERVER\BLOG.BAK'

Será mostrada uma imagem parecida com a que segue abaixo:




RESTORE HEADERLONLY: Com este argumento é possível verificar dados sobre os backup sets armazenados. Com esta instrução pdemos verificar o nome do servidor, a data da criação da base, é possível averiguar a versão em que essa base foi "backupeada". Particularmente, é um dos comandos que mais uso no dia a dia.

No editor de querys execute o comando:
RESTORE HEADERLONLY FROM DISK = 'C:\SQLSERVER\BLOG.BAK'

Será mostrada uma imagem parecida com a que segue abaixo:




RESTORE LABELONLY: Este argumento nos fornece informações sobre as midias do backup especificado.

No editor de querys execute o comando:
RESTORE LABELONLY FROM DISK = 'C:\SQLSERVER\BLOG.BAK'

Será mostrada uma imagem parecida com a que segue abaixo:




RESTORE REWINDONLY: Este argumento somente será usado para verificação de backup de fitas.


RESTORE VERIFYONLY: Este argumento verifica a integridade do arquivo de backup. Ele checa se o arquivo poderá ser lido durante uma possivel restauração.

No editor de querys execute o comando:
RESTORE VERIFYONLY FROM DISK = 'C:\SQLSERVER\BLOG.BAK'

Ao rodar este comando é verificado a consistência do backup e caso esteja integro será mostrada a mensagem: The backup set on file 1 is valid.

Uma observação sobre este comando: Em bases muito grande, pode demorar bastante até o retorno da mensagem aparecer.

Até o próximo tópico.

Abraço.

Marco.

segunda-feira, 19 de julho de 2010

Certificação SQL Server 2008

Pensando em uma melhor divulgação de informações sobre as tão desejadas certificações microsoft, venho através deste post compartilhar a experiência vivenciada por mim.

No dia 08/07/2010 tive a felicidade de ser contemplado no exame 70-433: Microsoft SQL Server 2008, Database Development (MCTS). Para mais informações: http://www.microsoft.com/learning/en/us/exam.aspx?ID=70-433&locale=en-us

Com uma prova composta de 50 questões, todas em inglês, são cobrados assuntos básicos de UPDATE, SELECT, etc...assim como questões de XML e PowerShell.

O que é pretendido na prova, não é um detalhamento, digamos a "baixo nivel" sobre cada processo do SGDB....Mas sim se você sabe sobre um pouco de tudo. Bem voltado por sintaxe de comandos MERGE, Table Partition, dentre outros.

A grande sacada é o estudo de simulados. Não tem como fugir disso....Ficar só no estudo de documentos em PDF, livros de 1000 páginas, acredito não ser tão proveitoso quanto os simulados.

Acredito que seguindo esta linha outras pessoas conseguirão grandes resultados nas provas.

Agora vamos em busca de novas certificações!!!!!!

Até mais,

Marco.