Arquivo
Table Variables e Transactions
Hoje um amigo perguntou sobre o conceito de transações no SQL Server,
Ele queria fazer o seguinte, chamar um processo para fazer alguns cálculos, depois gravar o resultado disso em uma tabela, e depois efetuar um rollback, pois o processo seria de simulação.
A dúvida era que quando ele efetuava um rollback o SQL fazia um rollback de tudo, inclusive no insert que ele havia feito para pegar o resultado da simulação.
Ou seja, ele queria guardar o valor da simulação em uma tabela para exibir na tela.
Mesmo não concordando muito com a lógica aplicada, sugeri para ele usar uma variável de tabela para guardar o resultado, já que ela não faz parte do escopo de uma transação portanto não afetada pelo rollback.
Por ex:
BEGIN TRAN
DECLARE @TMP TABLE (LETRA CHAR(2))
INSERT INTO @TMP(LETRA)
VALUES(‘EU’)
ROLLBACK TRAN
SELECT LETRA + ‘ ‘ + ‘CONTINUO AQUI!’ FROM @TMP
Uma outra solução seria usar SavePoints, mas também não acho que seria legal, maasss fica a dica sobre as variáveis do tipo table.
Scalar Functions e Analysis Services – Named Calculation
Scalar functions são bastante utilizadas em banco de dados, mas elas são verdadeiras killers de CPU…
Estou trabalhando na manutenção de um projeto ETL para BI e me deparei com um desses casos onde vale a pena escrever…
Tenho uma consulta que retorna aproximadamente 800 mil linhas o que é bastante comum quando estamos falando de bases DW, mas o interessante aqui é que o select que retorna os dados para criação da minha dimensão usa uma function para gerar o Ano, Mês e Dia a partir de uma Data existente na tabela. Depois de converter a data para Ano usando a function YEAR do SQL eu pego o valor de Ano e jogo em uma outra tabela na coluna Ano, e depois uso ela na dimensão de tempo no meu cubo Analysis Services.
Bom vou resumir para ver se da pra ficar mais fácil de entender, eu tenho uma Data e preciso do Ano, Mês e Dia desta data em colunas separadas para poder efetuar os filtros por um determinado período no Cubo.
Ai é que ta, na verdade eu nem precisava fazer a conversão no SQL para jogar no AS, mas eu posso simplesmente criar uma Named Calculation na tabela do DataSource View no AS, antes de mostrar isso, vamos ver porque Scalar Functions são bad.
Vamos criar uma base para os testes,
use tempdb
SET NOCOUNT ON
IF OBJECT_ID(‘TabTeste’) IS NOT NULL
DROP TABLE TabTeste
GO
CREATE TABLE TabTeste (ID Int Identity(1,1),
Nome VarChar(200) DEFAULT NEWID(),
Data DateTime DEFAULT GETDATE())
GO
— Vamos inserir um registro para simular o problema
INSERT INTO TabTeste(Nome, Data) VALUES(‘Teste’, ‘20050101’)
GO
— Massa aleatoria de dados.
INSERT INTO TabTeste DEFAULT VALUES
GO 1000000
Agora vamos criar uma Scalar Function para usar nos testes.
IF OBJECT_ID(‘fn_PreencheComZeros’) IS NOT NULL
DROP FUNCTION dbo.fn_PreencheComZeros
GO
CREATE FUNCTION dbo.fn_PreencheComZeros(@Coluna VarChar(250), @Qtde_Zeros Int)
RETURNS Varchar(200)
AS
BEGIN
DECLARE @Result VarChar(200)
SET @Result = RIGHT(REPLICATE(‘0’, @Qtde_Zeros) + @Coluna, @Qtde_Zeros)
RETURN @Result;
END
GO
Agora um exemplo simples de um select para retornar os dados que eu preciso.
— Retorna os dados com da tabela criando 3 colunas, Ano, Mes e Dia.
SELECT YEAR(Data) AS Ano,
MONTH(Data) AS Mes,
DAY(Data) AS Dia,
*
FROM TabTeste
— Rodou em 31 segundos e usou 1109 ms de CPU
/* Exemplo do resultado
Ano Mes Dia ID Nome Data
2005 1 1 1 Teste 2005-01-01 00:00:00.000
2008 10 21 2 E09D7055-CC12-40FC-8D3E-F7A28521D601 2008-10-21 11:35:46.087*/
Repare que na data de 01/01/2005 o Mês veio como "1" e não "01" a mesma coisa acontece com o dia, eu sei que existem outras formas de fazer retornar o "01" mas vamos dizer que eu me depare com uma solução que usa a função para formatar os valores para retornar conforme o desejado. É bem comum usar funções deste tipo para fazer diversas formatações desde concatenações até cálculos super complexos.
— Com a simples função de Preencher com Zero o SQL ficaria assim:
SELECT dbo.fn_PreencheComZeros(YEAR(Data),4) AS Ano,
dbo.fn_PreencheComZeros(MONTH(Data),2) AS Mes,
dbo.fn_PreencheComZeros(DAY(Data),2) AS Dia,
*
FROM TabTeste
— Rodou em 35 segundos e usou 22438 ms de CPU
/* Exemplo do resultado
Ano Mes Dia ID Nome Data
2005 01 01 1 Teste 2005-01-01 00:00:00.000
2008 10 21 2 E09D7055-CC12-40FC-8D3E-F7A28521D601 2008-10-21 11:35:46.087*/
Agora imagine que uma mente Brilhante resolva sofisticar a função e usa-lá para diversas formatações deixando o código dentro dela um pouco maior…
— Conforme mais código na function pior fica a coisa…
SELECT DBO.fn_PreencheComZerosSuper(YEAR(Data),4,0) AS Ano,
DBO.fn_PreencheComZerosSuper(MONTH(Data),2,0) AS Mes,
DBO.fn_PreencheComZerosSuper(DAY(Data),2,0) AS Dia,
*
FROM TabTeste
— Rodou em 1:15 e usou 73515 ms de CPU, ou seja o dobro do tempo inicial.
Mas o que fazer neste caso?
Bom a resposta é, evite usar Functions de qualquer tipo que seja em colunas, caso enha que fazer alguma formatação tente formatar o código direto na coluna por ex:
— Exemplo de uma solução
SELECT RIGHT(‘0000’ + Convert(VarChar(4),YEAR(Data)),4) AS Ano,
RIGHT(’00’ + Convert(VarChar(2), MONTH(Data)),2) AS Mes,
RIGHT(’00’ + Convert(VarChar(2), DAY(Data)),2) AS Dia,
*
FROM TabTeste
— Rodou em 33 segundos e usou 1984 ms de CPU
Named Calculation são colunas calculadas que você pode criar no seu DataSource View sem que você tenha que alterar a estrutura de suas tabelas, ou seja, não precisa gastar tempo para popular e espaço para armazenar os dados sendo que você pode criar uma Named Calculation que irá retornar o valor que você deseja.
No meu exemplo acima, optei por ao invés de ter que calcular e gravar os dados de Ano, Mês e Dia em uma tabela e depois ler estes valores, achei melhor criar 3 novas Named Calculation direto no AS, segue um print das telas para ficar mais claro.
Depois de clicar no OK a coluna ficará disponível como todas as outras mas com um ícone() diferente.
That’s all folks…
Page Verify – CheckSum
CheckSum é uma nova feature do SQL Server 2005 que permite que o SQL identifique uma possível corrupção nas páginas de dados. O CheckSum pode ser habilitado ou desabilitado a nível de banco de dados.
Ele funciona da seguinte maneira, sempre que o SQL Server escreve ou lê uma página ele calcula o CheckSum e grava esta informação no header da página depois ele usa este CheckSum para verificar possíveis problemas de IO, por exemplo, estou inserindo um registro em uma determinada tabela, ao gravar os dados do registro na página o SQL irá gerar um CheckSum e gravar esta informação no Header da página, quando eu efetuar um select para retornar este registro, o SQL gera novamente o CheckSum baseado nos dados da página e compara com o valor gravado no Header, caso os valores sejam diferentes então uma possível corrupção aconteceu.
O algorítimo para gerar o CheckSum é bem complexo e pode representar uma possível queda de desempenho de CPU, aja visto que sempre que o SQL ler ou escrever uma página ele irá fazer o calculo do CheckSum, não estou dizendo para que você desabilite esta opção, apenas informando que pode haver um possível overhead de CPU.
Estou preparando um vídeo sobre a nova feature de Automatic Page Repair no Database Mirroring do SQL Server 2008 para mostrar como o SQL Server identifica que uma página esta corrompida e então automaticamente lê os dados do Mirror e corrige o valor corrompido no servidor principal.
Keep eye…
Revista Codificando .Net e-Magazine N.8
Está disponível a 8º edição da Revista Codificando .Net e-Magazine,
Vale a pena baixar e dar uma olhada, desta vez o MVP Diego Nogare publicou 3 das respostas dos questionários que fiz sobre SQL Server.
Quem respondeu desta foi o próprio Diego, o MVP Marcelo Colla e a pedido do Diego acabei respondendo também J.
Segue o link da revista.
Entrevista 2 – Gustavo Maia Aguiar
Olá galera, segue mais uma da série de entrevistas com especialistas em SQL Server.
Desta vez o entrevistado foi o futuro MVP Gustavo Maia Aguiar, mais conhecido por “01”, se você aparecer nos fóruns TechNet e MSDN vai entender o porque ele ganhou este apelido.
Gustavo Maia Aguiar é administrador de Empresas pela Universidade de Brasília (UnB) e pós-graduado em bancos de dados pela Universidade Católica de Brasília (UCB), atua na área de tecnologia de informação desde 2001, exercendo funções de desenvolvedor, analista, administrador de banco de dados (DBA) e administrador de dados (AD). É profissional certificado (MOS, MCDBA, MCAD, MCTS (SQL 2005), MCITP (DB Dev), MCITP (DB Admin), MCT e Itil Certified Professional). Já trabalhou em instituições do governo, iniciativa privada e parceiros Microsoft em atividades de suporte, consultoria e treinamento. É membro ativo e moderador do fórum MSDN e da comunidade SQL Server Brasil (Orkut).
1. Vamos começar falando da novidade do momento, quais as novas features do SQL Server 2008 que você acha mais importante, e porque? Nomeie pelo menos 3.
a. Eu tive pouco contato com o SQL Server 2008, mas dentre as funcionalidades que tive a oportunidade de conhecer acredito que algumas mereçam destaque como a Auditoria, o suporte a dados geográficos e o Resource Governor.
b. Anteriormente, as funções de uma área de auditoria eram praticamente direcionadas a áreas administrativas e financeiras. O avanço de determinadas normas, padronizações e regulamentações (Sarbanes-Oxley, Basiléia II, ISO/IEC, etc) em relação a área de TI acaba forçando com que diversos processos (em especial a segurança da informação) sejam auditados e se seguirmos alguns dos princípios básicos da segurança (confidencialidade e integridade) é necessário saber quando um dado foi lido e (ou) alterado se necessário.
c. O suporte a dados geográficos é mais uma iniciativa da Microsoft na ampliação do SQL Server para não apenas um sistema gerenciador de banco de dados relacional, mas sim uma suíte de produtos preparada para trabalhar com potencialmente qualquer tipo de dados. Embora o mundo relacional seja sem dúvida a implementação mais dominante existem outras como bancos de dados textuais, xml, etc. A presença de dados geográficos é mais um ADD-IN para lidar com esse mundo híbrido.
d. O recurso Resource Governor é uma ferramenta bastante esperada pelos DBAs em SQL Server. Alguns recursos como CPU, Memória e Discos podiam ser administrados mas a principal limitação era alocar um pool de recursos por usuário (ou aplicação indiretamente) e é certamente frustrante ver uma aplicação crítica ser comprometida por uma aplicação mais simples (porém mal codificada). Ainda que pudéssemos resolver isso com instâncias separadas, trabalhar o pool de recursos na mesma instância de forma flexível é sem dúvida um grande avanço. Pode-se por exemplo limitar os recursos já na fase de desenvolvimento para verificar se a aplicação responderá adequadamente.
2. Em relação a performance no SQL Server 2005, quais as features você acha mais importante?
a. Existem algumas features chaves para o desempenho no SQL Server como views indexadas, cobertura de índices, etc mas especificamente sobre o SQL Server 2005, na minha opinião, destacam-se o particionamento de tabelas, a cláusula INCLUDE e o HINT Recompile em nível de instrução dentro de Stored Procedures. São recursos adicionais em relação as features já existentes que podem fazer bastante diferença principalmente em ambientes mais críticos e complexos.
3. Quais suas dicas para um profissional que está iniciando em SQL Server?
a. Leia o máximo de livros e revistas que puder, mexa bastante no produto (mesmo que somente em casa ou em laboratório), converse com o maior número de profissionais que conseguir e participe de fóruns, eventos e cursos sempre que possível.
4. O que é necessário para se tornar um usuário Master em SQL Server?
a. Depois que você tiver lido o maior número de livros e revistas possível sobre o assunto, tiver uma boa experiência no produto, ter participado de fóruns, eventos e cursos acredito que fique faltando ainda a vivência em um ambiente bastante crítico (para tornar prático o conhecimento que muitas vezes é teórico) e uma dose de outras tecnologias (rede, desenvolvimento, storage, etc). O SQL Server é um produto bem abrangente mas não funciona sozinho. Um profissional “master” deve saber bastante de SQL Server, mas o mínimo de outras tecnologias que interagem com ele para não ficar imóvel se um recurso de cluster não subir, se um erro com o SSPI acontecer, se uma conexão dar TimeOut ou quando tiver que decifrar um XML Schema. Essa pode ser uma sutil diferença entre um DBA que decorou o Books OnLine e o que resolve os problemas.
5. O que é necessário para se tornar um usuário Master em Transact SQL Server?
a. Manipular dados usando o TSQL e fazer alguns truques que às vezes são necessários demandam bastante criatividade. Normalmente o hábito de programar impulsiona o raciocínio para desenvolver soluções TSQL mais elaboradas, mas independente disso, acho que observar e analisar soluções de especialistas ajuda bastante. Muitas vezes alguém já “pensou” em muitos detalhes e você pode adaptar uma determinada lógica a outras situações similares.
6. Qual sua opinião em relação ao uso excessivo de Triggers no banco de dados?
a. Não sou muito adepto de triggers, mas reconheço que em algumas situações elas são realmente necessárias. No entanto sua utilização deve ser a exceção e não a regra. Se um banco de dados possui utilização excessiva de triggers existe uma grande possibilidade de que existam problemas ocultos que podem ser melhor trabalhados (modelo de dados incorreto, local para lógica de negócio inadequado, mecanismos de validação ineficientes, etc.)
7. Qual o maior erro que uma pessoa pode cometer ao analisar um plano de execução?
a. Achar que um Clustered Index Scan é eficiente e está usando um índice somente por ter a palavra Index.
8. Quando usar um Clustered Index e quando usar um Non Clustered Index?
a. Essa é sem dúvida uma pergunta sem resposta exata e cada caso é um caso. Via de regra, o Clustered Index é recomendável para colunas que não tem seus valores alterados, são inseridas seqüencialmente e são pequenas e pesquisadas por intervalo e utilizadas nas cláusulas ORDER BY e GROUP BY. Índices NonClustered são ótimos candidatos para colunas que quando pesquisadas retornam poucos registros. Uma recomendação que não funciona para todos os casos mas que se adéqua em muitos casos é usar o índice clustered para chaves primárias e nonclustered para chaves estrangeiras.
9. Porque estatísticas são importantes?
a. Através das estatísticas que o otimizador de consultas poderá tomar decisões de como recuperar dados de uma determinada consulta. Se não há estatísticas, o otimizador pode desprezar decisões que potencialmente o ajudariam a recuperar dados mais rapidamente. É importante mantê-las atualizadas para que as decisões que o otimizador realizar sejam de fato as melhores possíveis.
10. O quanto fragmentação no banco de dados pode afetar performance? Existe algum beneficio em ter fragmentação no banco?
a. Fragmentação é, de certa maneira, ter os dados espalhados. Isso significa que no momento de juntá-los um esforço adicional será necessário, pois, será necessário juntar todos os fragmentos e nesse caso o desempenho é prejudicado. Alguns cenários podem se beneficiar de algum grau de fragmentação (na figura do Fill Factor), mas cada caso é um caso. A recomendação é mantê-la ao mínimo possível, mas não devemos tentar eliminá-la completamente.
11. Afinal paralelismo é bom ou ruim?
a. Na maioria das vezes é benéfico, até porque o próprio SQL Server se encarrega de avaliar quando utilizá-lo (não é porque existem múltiplos processadores que toda consulta, reindexação ou ordenação será processada com paralelismo). No entanto, muitos processadores rodando uma mesma consulta em paralelo podem gerar um Deadlock de processador assim como tarefas muito demoradas rodando com paralelismo podem alocar processadores em demasia e provocar lentidão em outras requisições. Felizmente para situações como essa temos a disposição o MAXDOP.
12. Você utiliza alguma ferramenta para auxiliar na resolução de problemas de performance? Quais?
a. Normalmente as organizações não tem à disposição ferramentas auxiliares para monitoramento. Já utilizei algumas como o Mom e o NetIQ e já vi algumas funcionando como o System Center. No entanto, quase sempre utilizo as ferramentas disponíveis (Perfmon, Profiler, Performance Dashboard e DMVs).
13. Em um banco de dados em produção você utiliza algum TraceFlag habilitado?
a. Quando trabalho com grandes volumes de dados alguns TraceFlags acabam tornando-se obrigatórios. Costumo utilizar quase que por Default o T1118 para o TempDB. Existem outros igualmente interessantes como o T1204, o T2551, além da utilização de parâmetros de inicialização. No entanto, evito utilizar Trace Flags a menos que realmente necessários.
14. Cite 3 livros que não podem faltar na coleção de um especialista SQL Server.
a. Existem tantas obras excelentes sobre SQL Server que é difícil escolher apenas três, mas considerando o SQL Server 2005 eu citaria os seguintes títulos:
1. Inside Microsoft SQL Server 2005 – The Storage Engine (Kallen Delaney)
2. Troubleshooting SQL Server 2005 (Ken Henderson)
3. The SQL Server 2005 Unleashed
15. Nestes anos de experiência, Qual foi o problema mais difícil de resolver que encontrou?
a. Existem alguns que não me recordo no momento, mas um que me lembro foi reconstruir um servidor de banco de dados SQL Server 2000 que foi danificado sem possuir um backup ou utilizar uma ferramenta de terceiros.
16. Já passou por algum daqueles problemas que resolveu mas até hoje não sabe o que era?
a. Sim. Algumas vezes, a instalação do SQL Server em Cluster pode apresentar falhas na primeira tentativa e funcionar na segunda tentativa sem que nenhuma configuração tenha sido realizada.
17. Qual o maior banco de dados que já trabalhou e quantas linhas tinha a maior tabela que já viu?
a. Até a presente data, o maior banco de dados em SQL Server que já me deparei tinha 413GB e a maior tabela desse banco de dados possui 260 milhões de linhas.
18. Como diria o Tobby(charges.com.br) – Bate bola jogo rápido:
a. Um concorrente digno do SQL Server: DB2
b. Uma feature: DMV (Dynamic Management Views)
c. Um comando SQL: ALTER DATABASE Banco SET READ_ONLY WITH ROLLBACK IMMEDIATE
d. Um livro: Há muitos empates, mas sugiro o Inside SQL Server 2005 – T-SQL Querying
19. Você tem algum blog? Site? Msn?… Como os usuários da comunidade podem entrar em contato com você?
a. Costumo ser facilmente encontrado no fórum do MSDN para dúvidas de SQL Server (é mais rápido até do que o e-mail). Também sou moderador da comunidade “SQL Server Brasil” no Orkut onde participo ativamente. Meu blog é: http://gustavomaiaaguiar.spaces.live.com/blog e meu e-mail é gmaguiar2004@hotmail.com
20. Deseja deixar alguma consideração final?
a. A busca pelo conhecimento é uma estrada sem fim e bastante difícil. Quando vierem as recompensas e as conquistas chegarem você terá orgulho de ter andado por ela e estar no ponto em que está. Quando vierem as dificuldades e você achar que andou demais e que ainda assim pareceu pouco, pare, respire e olhe para trás. Você pode ser surpreender com o tamanho do conhecimento que você adquiriu.
PodCasts at RunAsRadio, DotNetRocks and SQLDownUnder
Legal, tem várias entrevistas com “Judge“s em SQL Server… Excelente para treinar our listen…
http://www.runasradio.com/archives.aspx
http://www.sqldownunder.com/PreviousShows/tabid/98/Default.aspx
Logical Reads, Physical Reads
Tai uma pergunta que é bem comum de se ouvir, qual a diferença de Logical Reads para Physical Reads.
Logical Read acontece sempre que uma página é acessada. Independente se a página está em memória ou não, sempre que a página é acessada uma leitura lógica irá ocorrer.
Physical Reads é quando uma página é acessada e não está em memória e o SQL tem que ler a informação no disco. Toda leitura física é uma leitura lógica mas não necessáriamente uma leitura lógica irá gerar uma leitura fisica.
Esses carinhas aparecem pra todo lado no SQL Server e as vezes gera uma certa dúvida.
Entrevista 1 – Mauro Pichiliani
Pessoal vou dar inicio ao que imagino que seja a primeira de muitas entrevistas que virão.
Minha idéia é a seguinte, iniciar uma séria de entrevistas com especialistas em SQL Server, inicialmente com os MVPs e Colunistas brasileiros, depois com funcionários da Microsoft e então partirei para os MVPs gringos e funcionários da Microsoft Corp.
Já tenho alguns questionários respondidos, irei tentar publicar 1 por semana.
O primeiro da Lista é o Mauro Pichiliani que é colunista no imasters.uol.com.br.
Sem mais, vamos ao questionário. Espero que gostem…
1. Vamos começar falando da novidade do momento, quais as novas features do SQL Server 2008 que você acha mais importante, e porque? Nomeie pelo menos 3.
a. Bom, o SQL Server 2008 traz uma série de novas funcionalidades. Eu escrevi uma coluna explicando as 10 funcionalidades que mais me impressionaram, a coluna pode ser visualizada no link abaixo:
http://imasters.uol.com.br/artigo/9712/sql_server/top_10_funcionalidades_do_sql_server_2008/
b. Dentre as três principais posso citar:
1. As melhorias no Reporting Services, que facilitam a vida de quem precisa criar relatórios bem apresentáveis.
2. Os recursos para compactação, que vão reduzir sensivelmente o espaço utilizado por bancos de dados.
3. Algumas mudanças na linguagem, como o operador MERGE, que é bem interessante e vai facilitar a comparação de dados entre tabelas.
2. Em relação a performance no SQL Server 2008, quais as features você acha mais importante?
a. São várias, mas creio que a utilização de filtros nos índices é a feature mais importante que pode melhorar muito a performance se utilizada corretamente.
3. Quais suas dicas para um profissional que está iniciando em SQL Server?
a. Eu sempre recomendo a quem está iniciando procurar estudar muito. Outro ponto importante é possuir uma mente aberta, ser criativo e saber improvisar. Muitas vezes os profissionais são conservadores e não arriscam muito, o que pode fazer a diferença no final do dia.
4. O que é necessário para se tornar um usuário Master em SQL Server?
a. Apenas uma palavra: Estudo. Obviamente é preciso também muita prática e o famoso jogo de cintura, mas com certeza o estudo é o principal.
5. O que é necessário para se tornar um usuário Master em Transact SQL Server?
a. Mais uma vez, muito estudo. O Transact-SQL, em particular, é uma linguagem fácil se comparada com outras, mas mesmo assim é preciso conhecê-la muito bem para dominar suas particularidades e saber utilizá-la a seu favor.
6. Qual sua opinião em relação ao uso excessivo de Triggers no banco de dados?
a. Bem, o uso de Triggers deve ser ponderado e utilizado com bom senso. Em algumas situações vale a pena utilizar triggers, pois um trigger é um ótimo mecanismo para programar regras de negócio. Contudo, já observei usos irracionais de triggers que apenas tornaram o banco de dados mais complexo e suscetível a erros.
7. Qual o maior erro que uma pessoa pode cometer ao analisar um plano de execução?
a. Analisar o plano de execução e tomar uma decisão errada. Isso sem contar que para analisar o plano de execução é preciso conhecer os seus componentes, algo que muitas pessoas ignoram.
8. Quando usar um Clustered Index e quando usar um Non Clustered Index?
a. Depende muito da situação. Em geral o uso do índice clusterizado já é implementado automaticamente quando se cria uma chave primária e, a partir daí, todos os outros índices criados são do tipo não clusterizados. Porém isso não deve ser visto como uma regra e sim como uma diretriz.
9. Porque estatísticas são importantes?
a. As estatísticas são importantes para avaliar a densidade e seletividade de índices e são utilizadas pelo SQL Server, de forma automática ou não. Há casos onde o SQL Server pode atualizar as estatísticas e gerar um plano de execução melhor. Devido a esta característica vale a pena ver se no plano de execução há alguma mensagem sobre a falta de estatísticas atualizadas.
10. O quanto fragmentação no banco de dados pode afetar performance? Existe algum beneficio em ter fragmentação no banco?
a. Mais uma vez esta questão depende muito de cada cenário. Em tabelas grandes que fazem o uso de muitos índices é possível que a fragmentação prejudique o desempenho, porém há casos onde a fragmentação pode fazer sentido, principalmente quando se utiliza opções como o FILLFACTOR e PAD_INDEX.
11. Afinal parallelismo é bom ou ruim?
a. Com certeza é algo bom, mais isso vai depender de cada instrução. Em geral o otimizador de consultas já avalia o paralelismo automaticamente e não precisamos nos preocupar muito com isso.
12. Você utiliza alguma ferramenta para auxiliar na resolução de problemas de performance? Quais?
a. Sim, utilizo. Com certeza o Profiler é uma das ferramentas mais adequadas para isso. Outra ferramenta muito importante é o próprio Management Studio, pois ele permite a visualização gráfica do plano de execução das instruções.
13. Em um banco de dados em produção você utiliza algum TraceFlag habilitado?
a. Raramente. O motivo de não utilizar TraceFlags é que alguns deles requerem a reinicialização do servidor, algo que não pode ser feito em bancos de dados que requerem alta disponibilidade.
14. Cite 3 livros que não podem faltar na coleção de um especialista SQL Server.
a. “Introduction to Database Systems” do C. J. Data, “SQL Server Resouce Kit”, da própria Microsoft e o “Inside SQL Server” da Kalen Delaney.
15. Nestes anos de experiência, Qual foi o problema mais difícil de resolver que encontrou?
a. Com certeza foram vários. Porém cito problemas de desempenho em bancos de dados com mais de 100 GB de dados como um deles. Além de ser complicado realizar qualquer manutenção em uma base dom este tamanho estas modificações requerem muito esforço e testes.
16. Já passou por algum daqueles problemas que resolveu mas até hoje não sabe o que era?
a. Sim, com certeza. Geralmente problemas relacionados a bugs internos do SQL Server não há como saber exatamente o que é. O máximo que dá para fazer é abrir um chamado no suporte da Microsoft e utilizado uma solução temporária (workaround) até um patch ou Service Pack ser liberado.
17. Qual o maior banco de dados que já trabalhou e quantas linhas tinha a maior tabela que já viu?
a. Bom, isso é difícil de dizer pois existem bancos de dados que crescem muito rapidamente. No momento posso dizer que já cheguei a trabalhar com bancos de dados que ultrapassam 1 TB de tamanho. Quanto à tabelas, procuro sempre evitar sobrecarregar uma mesma tabela com muitos dados, pois isso evita vários problemas. Mas já encontrei ambientes em que uma tabela apenas ocupava mais de 50 GB de espaço.
18. Como diria o Tobby(charges.com.br) – Bate bola jogo rápido:
Um concorrente digno do SQL Server: O Oracle
a. Uma feature: O recurso Time Machine do Oracle
Um comando SQL(o meu predileto é o SHUTDOWN WITH NOWAIT J) : Com certeza o comando SELECT, preferencialmente com a cláusula WITH CUBE.
b. Um livro: Indiscutivelmente o “Introduction to Database Systems” do Date.
19. Você tem algum blog? Site? Msn?… Como os usuários da comunidade podem entrar em contato com você?
a. Não tenho blog, mas o meu principal contato é através do iMasters (www.imasters.com.br) onde os usuários da comunidade podem entrar em contato comigo por meio dos comentários nas colunas ou pelo e-mail.
20. Deseja deixar alguma consideração final?
a. Vou deixar uma mensagem que ouvi recentemente e que aborda a questão da tecnologia versus o lado humano:
b. “Todos somos exploradores, que procuram saber o que está mais à frente do horizonte, o que está no outro lado. E ainda assim, quanto mais experimentei, mais aprendi…que não importa quão longe viajemos, ou quão rápido cheguemos ali, os mais profundos descobrimentos… não estão necessariamente mais à frente… da próxima estrela. Eles estão dentro de nós…tecendo os fios que nos unem, a todos nós, uns aos outros.”
Bug SQL Server 2008 RTM
Pois é tai um bug(ou não?) interessante do SQL Server 2008 RTM.
O Código abaixo roda no SQL 2000 e 2005 mas não roda no SQL 2008.
DECLARE @I Int
SET @I = -1
SELECT 1
WHERE CONVERT(Numeric(2,0),@i) = 0
Agora vamos dar uma olhada no plano de execução de cada versão.
SQL Server 2000 SP4
SQL Server 2005 SP2
SQL Server 2008 RTM
O que acontece é que o SQL Server 2008 converte(ummm interessante no SQL 2005 ele usou o CONVERT e no 2008 usou o CONVERT_IMPLICIT e no 2000 ele nem gerou o Compute Scalar) o valor de CONVERT(Numeric(2,0),@i) para um tinyint, sabemos o tinyint vai de 0 até 255 portanto quando ele tenta converter o -1 da erro.
Agora a pergunta que fica é, porque o SQL Server considerou o “0” como um tinyint?
Talvez por questões de performance já que ele só ocupa 1 byte.
Já foi aberto um comentário no Microsoft Connect para falar do assunto…
https://connect.microsoft.com/SQLServer/feedback/ViewFeedback.aspx?FeedbackID=363428&wa=wsignin1.0
Licenciamento SQL Server 2008
Muito bom este documento onde é explicado os possíveis cenários de licenciamento do SQL Server 2008.
Por exemplo, ao contrário do Oracle o SQL é cobrado por processador e não por core, pode haver uma outra instancia instalada em outra máquina como backup para failover usando Mirroring, Cluster ou Log Shipping… o servidor de BackUp pode ficar no ar por até 30 dias sem ter que pagar por outra licença desde que o número de Processadores seja igual ou inferior ao do servidor de produção.
Segue o link para o documento, Licensing Overview





