quinta-feira, 31 de janeiro de 2013

Múltiplos arquivos por filegroup

Melhor escrever alguma coisa para vocês saberem que ainda estou por aqui, não é?
Treinamento de internals (errr, Mastering) sempre é massa, muitas perguntas novas, ex-alunos que passaram X meses estudando e voltam com perguntas escabrosas, e um material que não consigo diminuir por dor no coração de deixar alguma coisa bacana de fora. Geek total.
Ontem falávamos de múltiplos arquivos por filegroup, distribuição das operações entre eles, etc., um bom prelúdio para falarmos da tempdb, e aí veio a pergunta: E se eu tiver muitos arquivos dentro do mesmo filegroup, ajuda ou atrapalha o desempenho?
Ter mais de um arquivo pode sim te beneficiar em diversas operações (como um backup ou restore) por conta de você ter mais threads para te ajudar ou ajudar na utilização proporcional/balanceamento, mas a discussão encaminhou para: o overhead para o SQL Server identificar o espaço livre em cada arquivo para uma distribuição proporcional é significativo?
Fiz o teste na minha máquina com um disco local tomando os cuidados: não ter crescimento do arquivo de log (está em auto truncate mode), não ter crescimento dos arquivos de dados (mesmo com IFI) e executar duas baterias de teste para cada banco com a máquina relativamente parada. Eis o resultado para uma inserção de 100.000 registros (um registro por página):
·         5 arquivos de 200MB = 1:24 / 1:20
·         50 arquivos de 20MB = 1:57 / 1:50
·         100 arquivos de 20MB = 2:12 / 2:20
·         500 arquivos de 20MB = 4:12 / 3:59
De aproximadamente 1 minuto e 20 segundos para quatro minutos é uma diferença bem significativa. Então existe um overhead, mesmo para um workload simples, e quanto mais “exagerado” você for com múltiplos arquivos dentro do mesmo filegroup, maior o impacto. O problema aqui é identificar onde é o overhead, o caso mais provável é que seja uma saturação do meu subsistema de I/O e não um overhead no balanceamento, mas independente da causa fica o aviso. 

Note que esse teste foi focado em mostrar o impacto de múltiplos arquivos. Vale ressaltar que ter mais de um arquivo de dados pode beneficiar o seu workload sim! O Paul Randal já escreveu sobre isso: http://www.sqlskills.com/blogs/paul/benchmarking-do-multiple-data-files-make-a-difference/ e em seu benchmark 8 arquivos apresentou o melhor desempenho. Então a regra é: faça testes em seu ambiente para encontrar a melhor configuração.
Se quiser brincar no seu ambiente, abaixo está o script que eu criei. E não deixe de compartilhar se encontrar algo novo ou que passou despercebido neste post.
USE master
GO

IF (DB_ID('MultipleFiles') IS NOT NULL)
      DROP DATABASE MultipleFiles
GO

CREATE DATABASE MultipleFiles
  ON PRIMARY
      (NAME = N'MultipleFiles',
      FILENAME = N'C:\Temp\MultipleFiles.mdf',
      SIZE = 15MB,
      MAXSIZE = 1GB,
      FILEGROWTH = 10MB)
  LOG ON
  (NAME = N'MultipleFiles_Log',
      FILENAME = N'C:\Temp\MultipleFiles_log.ldf',
      SIZE = 50MB,
      MAXSIZE = 300MB,
      FILEGROWTH = 100MB)    
go

ALTER DATABASE MultipleFiles
ADD FILEGROUP FG01
GO

DECLARE @i INT = 1
DECLARE @FileSize VARCHAR(10) = '20MB'
DECLARE @sql VARCHAR(8000)

WHILE @i <= 500
BEGIN

      SET @sql = '
      ALTER DATABASE MultipleFiles
      ADD FILE (NAME = N''MultipleFiles_Data' + CAST(@i AS VARCHAR) + ''',
            FILENAME = N''C:\Temp\MultipleFiles_Data' + CAST(@i AS VARCHAR) + '.ndf'',
            SIZE = ' + @FileSize + ',
            MAXSIZE = 1GB,
            FILEGROWTH = 10MB)
      TO FILEGROUP FG01'

      -- PRINT @sql
      EXEC (@sql)

      SET @i = @i + 1
END
GO

ALTER DATABASE MultipleFiles
MODIFY FILEGROUP FG01 DEFAULT
GO

use MultipleFiles
go

SELECT * FROM sys.database_files
SELECT * FROM sys.filegroups
go   

IF (OBJECT_ID('TabelaTeste') IS NOT NULL)
      DROP TABLE TabelaTeste
go

CREATE TABLE TabelaTeste
(Codigo INT IDENTITY NOT NULL,
 Texto CHAR(8000) NOT NULL,
 Hora DATETIME2 NOT NULL DEFAULT SYSDATETIME())
go

-- 5x 200MB = 1:24 / 1:20
-- 50x 20MB = 1:57 / 1:50
-- 100x 20MB = 2:12 / 2:20
-- 500x 20MB = 4:12 / 3:59
INSERT INTO TabelaTeste (Texto) VALUES ('Sr. Nimbus')
GO 100000

Abraços
sr. Nimbus Serviços em Tecnologia - www.srnimbus.com.br

sexta-feira, 11 de janeiro de 2013

Material do SQLServerDF XVI

Ontem tivemos mais uma apresentação do SQLServerDF, com nosso amigo Edvaldo Castro. Quem esteve presente pode ver uma palestra de alto nível sobre AlwaysOn Availability Groups, e só posso dizer que estou muito contente de estar cedendo o palco para novos palestrantes.
No auditório não temos conexão com a internet para o LiveMeeting, que seria uma maneira fácil de registrarmos o evento, então vou trabalhar algumas alternativas na tentativa de gravarmos outras reuniões do grupo.
As fotos ficaram não ficaram boas, mas finalmente registrei um dos nossos encontros! J

E a quem interessar, o material da sessão está aqui: http://sdrv.ms/WIDWo9
Abraços
sr. Nimbus Serviços em Tecnologia - www.srnimbus.com.br

quinta-feira, 10 de janeiro de 2013

2013 – O ano em que pouco vai mudar

O ano novo chegou! E junto com ele promessas, metas, análise do que foi e não foi executado por você no ano passado, buscas por desafios, animação lá em cima, tudo muito válido, lindo e maravilhoso. E eu sempre aproveito para reler alguns posts meus, aqueles voltados à reflexões e carreira, e vejo que em geral já escrevi demais e a linha de pensamento sempre se manteve:
É preciso foco e disciplina, mais transpiração que inspiração, sorte é para poucos, já a boa sorte para os preparados, TI oferecerá por um longo tempo vagas e mais vagas e sempre teremos exemplos inspiradores para nos apoiarmos. 
Quer ler sobre isso, alguns posts que já publiquei:

Nesse ano vou fazer diferente, vou colocar algumas previsões (técnicas e gerais) para 2013 e próximos anos, sob a seguinte ótica: O que pouco vai mudar nos próximos anos...
1.       Profissionais - na média - não estarão capacitados para exercer sua função
a.       Em geral as pessoas não estão preparadas para assumir as responsabilidades que o seu cargo exige.
b.      E não digo isso porque você assumiu uma posição onde um recrutador retardado colocou que você deveria ser o mestre do universo em SQL Server, Oracle, DB2, MySQL e Postgree.
c.       Estou me referindo à execução de tarefas básicas, seja manter um ambiente SQL Server, desenvolver um módulo de uma aplicação, configurar um domain controller, ou sei lá o que mais.
d.      O que é um assustador hoje é que as pessoas aceitam executar tarefas nas quais elas não conhecem nem 3% do produto ou não tem uma base mínima, e encaram isso com a maior naturalidade! Coisas ruins acontecem por conta disso.
e.      Acho que devemos ser ousados e encarar desafios, sempre falo isso para nossa equipe, mas saiba quais são seus limites e dedique-se ao extremo, para garantir um bom resultado.
2.       Inaptidão gerencial continuará a inchar as estruturas e atrapalhar o desempenho dos negócios.
a.       É uma extensão do item anterior, falta de preparação para exercer o cargo, e por força de um mercado engessado e estruturas ruins, muitas pessoas estão no cargo por fatores diferentes do mérito.
b.      No ano passado acompanhei boas discussões sobre a necessidade de gerentes (entre outros artigos):
                                       i.      http://blog.lambda3.com.br/2011/12/fire-all-the-managers/
                                     ii.      http://elemarjr.net/2011/12/06/fire-all-the-bad-managers/
c.       Em equipes pequenas e diferenciadas, ou locais onde um líder emerge, a figura tradicional do gerente é descartável. E mesmo equipes “TOP” não resolvem tudo, é necessário processos, foco na entrega e controle, então habilidades que deveriam ser essenciais para este profissional devem estar incorporadas na organização ou no líder, para este modelo realmente funcionar.
d.      O Elemar escreveu muito bem em seu post “Fire all the BAD managers”, só que depois de anos e anos de consultoria, esse número na minha visão seria de 80% a 90%, e como a pirâmide coorporativa e outros problemas graves existem, isso significaria o caos.
e.      Dito isso, continuaremos como estamos hoje, usando gerentes ruins para supervisionar a ineficiência que existe na maioria das organizações, tentando transformar o que é feio em uma planilha apresentável.
3.       Empresa e funcionários são descartáveis entre si, e a culpa sempre é do outro.
a.       O funcionário culpa a empresa da falta de investimento, de não poder sair do trabalho para fazer um curso, do excesso de trabalho, da distribuição de bônus, das tarefas que recebeu, etc.
b.      A empresa culpa os funcionários pela falta de empenho, por não vestir a camisa da empresa, por não ter cumprido um prazo X ou por não ter se negado a executar uma tarefa que não estava dentro de conhecimento.
c.       Eu acho que esse constante estado de insatisfação é da natureza do ser humano, não sei o motivo, mas parece que tudo é fator desmotivador. Se estiver ruim para você, TROQUE DE EMPRESA! Se não consegue colocação profissional em um mercado com déficit gigante de profissionais, bem...
4.       BI vai continuar pelos próximos 10 anos na lista de maiores investimento do próximo ano.
a.       Business Intelligence é importante e lindo, tão lindo que dá vontade de investir todo meu dinheiro, mas complicado. Problemas estruturais dos bancos de dados, qualidade e integração dos dados em estado precário, e execuções medonhas de projetos complexos.
b.      Mas precisamos tirar informação para o negócio e como ainda temos problemas gigantes a ser enfrentados, além de uma maturidade empresarial e capacitação técnica de fazer chorar, BI vai continuar na lista de prioridades por um bom tempo.
5.       Casos e mais casos de desastres vão assolar o mundo dos dados
a.       Falta de segurança, nenhuma redundância de dados, zero de alta disponibilidade e bancos de dados sem nenhum cuidado especial. Empresas vão perder dados, muitas vão falir, outras vão sofrer por muitos anos.
b.      Enquanto lemos sobre Big Data (que é muito legal!) e grande tendências, vamos esquecer-nos do básico. Isso vem alinhado com a falta de preparação, uma coisa é você escrever sem seguir as melhores práticas o aplicativo de controle de ponto, outra é você ser responsável por todos os dados de uma empresa.
c.       Seu ambiente está indo para o buraco e as pessoas não tem ideia disso, ou você está andando ao lado de um desfiladeiro e acredita que está na estrada dos tijolos de ouro.
6.       Novas tecnologias milagrosas vão continuar aparecendo
a.       E vamos continuar apanhando para entender que não existe remédio universal para todos os problemas. Por exemplo, muitos vão quebrar a cara achando que é só colocar na nuvem que tudo se resolve.
                                       i.      Cloud computing é fantástico, não me entenda errado, só que precisa de entendimento para ser bem utilizado, alias como tudo.

Post pessimista? Longe disso, depende da percepção de quem está lendo. Falando de coisas que todo mundo já sabe? Talvez, mas 90% do que lemos já não foi publicado por outro em algum lugar do mundo? Seremos melhores a cada ano? Duvido.
Mas no fim sempre teremos ótimos exemplos, aquele que merece ser seguido e que vai nos inspirar e ensinar muita coisa. Eu estou constantemente olhando para minhas referências e tentando ter a humildade de aprender com quem está do meu lado, e que sabe ensinar também.
E por aí vamos, o mundo vai continuar no girando e nós dentro dele, vamos nos sentir frustrados e quem sabe até inaptos para exercer nossas funções, de pai, profissional ou amigo. Mas nesse momento é hora de sacudir a poeira e entender que grandes mudanças começam bem pequenas, e que a primeira delas seja você.
Abraços
sr. Nimbus Serviços em Tecnologia - www.srnimbus.com.br

quarta-feira, 9 de janeiro de 2013

DBCC PAGE – bug com índice filtrado

Post rápido...
Gravando o treinamento on-demand de indexação eu me deparei com um possível bug do DBCC PAGE, onde ele formata incorretamente a saída de uma página do índice cluster, quando criamos um índice não-cluster filtrado na mesma tabela.
O Fabiano Amorim reproduziu e o Paul Randall também, então é um bug. O fato de não ser um comando documentado não sei se vai ganhar muita atenção no Connect, mas registrei uma entrada mesmo assim: https://connect.microsoft.com/SQLServer/feedback/details/776144/dbcc-page-incorrect-output-with-filtered-indexes.
Se quiser reproduzir o problema, o script está aqui:
USE tempdb
GO

SELECT @@version

IF OBJECT_ID('dbo.MyTable', 'U') IS NOT NULL
      DROP TABLE dbo.MyTable
GO

CREATE TABLE dbo.MyTable (
      ID INT IDENTITY NOT NULL PRIMARY KEY
      , Name CHAR(100) NOT NULL DEFAULT ('DBCC PAGE')
      , SomeDate DATETIME2 NOT NULL DEFAULT(SYSDATETIME())
)
GO

INSERT INTO dbo.MyTable DEFAULT VALUES
GO 30000

INSERT INTO dbo.MyTable ( Name, SomeDate )
SELECT Name, DATEADD(YY, -1, SomeDate)
FROM dbo.MyTable
GO

SELECT
      OBJECT_NAME(object_id) AS ObjectName
      , AU.*
      , P.*
FROM SYS.system_internals_allocation_units AS AU
INNER JOIN SYS.Partitions AS P
ON AU.Container_id = P.Partition_id
WHERE Object_ID IN (object_id('MyTable'))
ORDER BY object_id, type
GO

DBCC TRACEON(3604)
DBCC PAGE(Tempdb, 1, 1383, 3)
GO

-- output ok

CREATE NONCLUSTERED INDEX idxNCL_MyTable_SomeDate
ON dbo.MyTable (SomeDate)
WHERE SomeDate > '2013-01-01'
go

-- Same root page for CL, as expected
SELECT
      OBJECT_NAME(object_id) AS ObjectName
      , AU.*
      , P.*
FROM SYS.system_internals_allocation_units AS AU
INNER JOIN SYS.Partitions AS P
ON AU.Container_id = P.Partition_id
WHERE Object_ID IN (object_id('MyTable'))
ORDER BY object_id, type
GO

DBCC PAGE(Tempdb, 1, 1383, 3)
GO

-- output not ok

DROP INDEX MyTable.idxNCL_MyTable_SomeDate

-- output ok again
DBCC PAGE(Tempdb, 1, 1383, 3)
GO

Abraços,
sr. Nimbus Serviços em Tecnologia - www.srnimbus.com.br