Resultados da pesquisa
PodCast3 – Delete Sem Where com Fabiano Amorim e Luciano Moreira (aka Luti) – SQLInternals e Nuvem
Fala galera, eu finalmente tirei do papel meu plano de começar um PodCast sobre banco de dados…
Segue o tereciro episódio que tive como convidado meu amigo Luciano Moreira, nesse Cast Conversamos bastante sobre SQL Internals, Nuvem e outras coisas…
Nesse episódio eu também falei sobre um case interessante sobre análise de uso de índices em um ambiente que trabalhei recentemente em um cliente…
Link para o vídeo no Youtube:
Espero que vocês gostem…
O script que usei foi o seguinte:
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
GO
SELECT TOP 100
s.plan_id,
q.query_id,
t.query_sql_text AS QueryText,
OBJECT_NAME(q.object_id) AS parent_object,
SUM(s.count_executions) AS CountExecutions,
CONVERT(DECIMAL(18,2),AVG(s.avg_logical_io_reads)) AS AvgLogicalReads,
CONVERT(DECIMAL(18,2),AVG(s.avg_physical_io_reads)) AS AvgPhysicalReads,
CONVERT(DECIMAL(18,2),AVG(s.avg_cpu_time)) AS AvgCpuTime,
CONVERT(DECIMAL(18,2),AVG(s.avg_duration)) AS AvgDuration
FROM sys.query_store_query_text t
JOIN sys.query_store_query q
ON t.query_text_id = q.query_text_id
JOIN sys.query_store_plan p
ON q.query_id = p.query_id
JOIN sys.query_store_runtime_stats s
ON p.plan_id = s.plan_id
WHERE t.query_sql_text LIKE N’%FM_Schedule%’
GROUP BY s.plan_id,
q.query_id,
t.query_sql_text,
OBJECT_NAME(q.object_id)
ORDER BY CountExecutions DESC
GO
— Find Plan(s) Associated with a Query
SELECT t.query_sql_text, q.query_id, p.plan_id, object_name(q.object_id) AS parent_object,
CONVERT(XML, p.query_plan) AS qPlan
FROM sys.query_store_query_text t JOIN sys.query_store_query q
ON t.query_text_id = q.query_text_id
JOIN sys.query_store_plan p ON q.query_id = p.query_id
WHERE q.query_id = 4305750
— OR t.query_sql_text LIKE N’%SELECT c1, c2 FROM dbo.db_store%’
— OR object_name(q.object_id) = ‘proc_1’
Abs.
Fabiano Amorim
Treinamento SQL25 em São Paulo, aos sábados, Junho/Julho 2016
Notícia boa para todos nós…
“No dia mais claro, na noite mais escura, no tuning mais desafiador e plano de execução mais sombrio nenhum problema de performance escapará da minha visão. As queries que assombram os servidores sucumbirão diante do meu conhecimento!” |
![]() |
Nosso treinamento de performance está de volta! Não deixe de ver a ementa, tenho certeza de que você vai gostar!
Meu último treinamento SQ25 foi entregue em Brasília, foi uma experiência sensacional… Palavras do Luciano:
Tive a oportunidade de participar do treinamento, aprendi muito com o Fabiano, e ter a chance de colocar 3 instrutores da Nimbus na mesma sala foi fantástico. TODAS as avaliações do treinamento e instrutor foram Excelente/Excelente. Destaco alguns comentários dessa turma:
- “Superou as minhas expectativas, além do conhecimento obtido, a troca de experiências e network foram pontos positivos no treinamento.”
- “Ótimo. Pessoas altamente capacitadas e ao mesmo tempo humildes, fazem os melhores e mais confiáveis treinamentos do Brasil.”
- “Estão de parabéns toda a equipe, Fabiano, Luciano e companhia. Mantiveram um ótimo clima, incentivando a integração das pessoas, e alta qualidade do curso”
- “Por ter sido meu primeiro curso com a Sr. Nimbus, gostei bastante do curso de uma forma geral. O conteúdo apresentado, conhecimento do instrutor (e demais instrutores presentes nesse curso em específico), disposição da matéria, enfim, achei o layout do curso muito interessante. Com certeza, faria novamente um curso com a Sr. Nimbus.”
Destaque para as avaliações que pela primeira vez, consegui receber um EXCELENTE em tudo… Sempre tinha um ou dois que avaliavam o treinamento como BOM, pelo jeito dessa vez o pessoal gostou mesmo 🙂
Definitivamente um bom resultado.
Abrimos uma nova turma presencial aos sábados em São Paulo, seguem mais informações sobre:
- Quando: 25 de Junho, 02, 09 e 16 de Julho de 2016
- Onde: São Paulo – Local a definir (próximo da Avenida Paulista)
- Carga horária: 32 horas de treinamento período integral das 08:00 as 17:00
- Mais detalhes e inscrição: http://www.srnimbus.com.br/calendario/sql25_sp_jun2016/
- Algumas fotos da galera dos últimos treinamentos dessa turma:
![]() |
![]() |
Nos vemos lá!…
Demonstração – Execplans on demand
Treinamento on-demand de planos de execução e otimização no SQL Server.
Galera depois de váras semanas trabalhando na produção do nosso treinamento on-demand, estou MUITO feliz com o resultado… o treinamento está no ar e gravei um total de 5 horas 51 minutos 34 segundos de vídeos falando sobre otimização no SQL Server.
Eu editei um “teaser“ com 10 mins de “melhores momentos” do treinamento… tem bastante coisa legal. Eu tenho certeza de que qualquer geek ficará muito feliz em ver o que acontece por dentro de um HD ao rodar uma consulta no SQL Server … pois é, eu abri um só pra te mostrar isso!
Abaixo você pode conferir o vídeo:
Demonstração do treinamento OnDemand – ExecPlans Parte I from Sr. Nimbus on Vimeo.
O Luciano também divulgou um teaser com o treinamento de Transaction Log… terminar o video com WinDbg foi pra fechar com chave de ouro SENSACIONAL!
Veja o video dele aqui:
Sr. Nimbus Demonstração do treinamento OnDemand – Transaction Log from Sr. Nimbus on Vimeo.
Se interessou? Basta comprar o acesso ao treinamento, esperar receber o acesso aos vídeos e ser feliz . É sério, R$150,00 reais por isso, tá muito barato…
WebCast Sr.Nimbus–DBA CheckList dia 21/06/2012
Ok, já sei, demorei, desculpa. Graças a Deus as coisas na Sr.Nimbus estão indo MUITO bem, o que nos fez atrasar um pouco em relação a nossa prometida, esperada e votada webcast.
Para quem não sabe do que estou falando, segue o link do post que falei sobre a WebCast da Sr.Nimbus.
O resultado da enquete foi bem interessante, e me mostrou que sim, tem gente que realmente lê o que eu escrevo neste blog . Segue abaixo o resultado:
Como vocês podem ver, e para minha surpresa a WebCast sobre DBA CheckList foi a grande campeã com 39% dos votos, seguido do tema relacionado a T-SQL Avançado com 24%. Digo que fiquei surpreso porque sempre achei que o público do meu blog era maior por parte dos desenvolvedores e não de DBAs…
Bom, vamos a boa notícia. A boa notícia é que a WebCast já tem data, e será na quinta-feira dia 21/06, segue um resumo abaixo:
- Tema: DBA CheckList o que analisar?
- Apresentadores: Fabiano Amorim e Luciano Caixeta Moreira (blog|twitter) (a.k.a. Luti)
- Moderação: Um quando o outro estiver apresentando, e outro quando o um estiver apresentando. (e vice e versa)
- Data: Quinta-feira dia 21/06/2012
- Horário: Das 19:30 as 21:30
- Onde: Online
- Link para inscrição: http://tinyurl.com/WebCastSrNimbus
Caso qualquer problema ocorra antes/durante a apresentação, iremos atualizar este blogpost como mais detalhes.
Estou indo para Sr.Nimbus!
– “A partir do dia 01/11/2011 estarei com a cabeça nas nuvens (Sr.Nimbus)”.
Pra quem ainda não conhece, a Sr.Nimbus é uma empresa de consultoria e treinamento em tecnologias Microsoft, com uma frente muito forte em SQL Server. Tudo o que eu gosto de fazer, treinamentos, e consultoria. É a minha cara.
Um dos profissionais que fazem parte do time de SQL Server da Nimbus, é o Luciano Caixeta Moreira o Luti. Eu não vou dizer novamente que devo muito ao Luti, que ele me ajudou bastante, que aprendi muito com ele e blablabla… Eu já disse isso várias vezes aqui no meu Blog. O que quero dizer é que iremos criar muita coisa boa, e que vocês podem ter certeza de que teremos o melhor time de tuning e especialistas SQL Server do Brasil, tenho várias ideias que na Nimbus vou poder colocar em pratica, e iremos oferecer serviços fantásticos relacionados a SQL Server. | ![]() |
Tenho tudo a ver com a Sr.Nimbus e com o Luti, nossa ideias batem muito bem, ele gosta de SQL Server (será?) e eu também, ele endoidou com o final de The Dig e eu também, ele gosta de jogar futebol e eu também (apesar de eu ser totalmente diferenciado neste quesito, leia-se, craque), ele gosta de ensinar a comunidade e eu também, ele gosta de treinar pessoas e eu também. Tenho certeza que vai dar certo, tem tudo pra dar “liga”.
É isso, não quero deixar este post muito longo, mas quero dizer que estou extremamente ansioso para começar logo. Muita coisa boa virá, aaa com certeza.
Agora é trabalho meu filho.
Abraços
Eu, MVP?
Na sexta-feira passada nessa hora (12:17) eu estava tremendo com o coração batendo a mil por hora…
O Luti falando no skype – Ei não vai twittar não? Conta logo se não eu conto!
Eu tentando me controlar pra conseguir escrever sem errar… porque? Porque eu havia acabado de receber um e-mail com o seguinte assunto “Congratulations 2011 Microsoft MVP!”.
Quando comecei a blogar e me envolver com a comunidade SQL Server eu jamais poderia imaginar onde isso me levaria, e o quanto isso seria tão importante para minha vida profissional e pessoal.
Simple-Talk, Marília TechDay, Amizades, SolidQ, MVP… coisas que não tem preço e já marcaram minha vida. #fato
Estou extremanente orgulhoso e honrado em dizer que sou MVP em SQL Server, na verdade morro de vergonha de dizer isso… não sei se vou me acostumar … parece que estou falando de outra pessoa, ou estou me “achando”
… é estranho é estranho…
Só de pensar de que faço parte do time de MVPs em SQL Server do Brasil já fico emocionado… Luti, Nilton, Gustavo, Diego, Zava, Laerte… caramba só a galera marvada…
Tenho que agradecer a várias pessoas por me ajudar diretamente ou indiretamente nessa conquista, talvez a lista seja grande mas espero não me esquecer de ninguem então vamos lá…
Primeiramente, todos os créditos ao Deus que sivro e que tem me abençoado com saúde para trabalhar e conseguir fazer o que gosto. “Faz sentido servir alguem melhor que eu!”
Leda Amorim (meu braço direito e esquero)… Obrigado por me suportar, e me incentivar a fazer o que gosto, te amo!
Marcos Amorim (mentor, professor, irmão)… Incontáveis ensinamentos, desde a dirigir na marginal sem carta com seu Corola, a me levar nas reuniões com clientes importantes só pra eu ficar queto, ouvindo, sem fazer nada… aprendendo… isso não tem preço. Obrigado!
Luti – Alguns já sabem, mais o Luti quem começou com essa idea de, Ei porque você não cria um blog e tals… Luti sou muito grato por todas as dicas e direcionamentos que você me deu e pelas conversamos que já tivemos… você é o cara de SQL Server no Brasil, #fato… não tem pra ninguêm… Lembro até hoje quando te mandei o primeiro e-mail, procurei sei e-mail no google, achei em uma webcast sua.. mandei o e-mail e quando recebi a resposta pensei… Caraca o cara respondeu mesmo . Obrigado!
Laerte – Porra, esse é o cara! É o cara mais loco que conheço… Laerte me indicou pro Simple-Talk, me chamou pra participar do Marília TechDay, me apresentou a SolidQ… lembro que no Marília TechDay ele disse… Ei ta vendo aquele cara ali? É o Fernando Guerreiro, CIO Global da SolidQ, cola nele! Não deu outra, foi o que eu fiz eeee… deu certo . Valeu brother, pode contar com seu irmão aqui, sempre!
Caramba… a lista vai longe… mas vou tentar não fazer deste post um livro, vão aqui alguns nomes:
Zava, Diego, Felipe, Thiago Cruz, Evil, Eladio, Fernando Guerreiro, Maycon, Alex Rosa(lembro quando vi ele no teched e pensei, opa, esse é aquele carequinha do Blog KeepLearning ), Junir Galvão, Nilton, Arnaldo, Vladmir, Rodolpho, Luis, Douglas, Cinéia, Marcondes, JP, Hara, Fabricio, Alx, Andressa, MaryHelpa, Sandro, Claudio, Edvaldo, Zé, João, Thiago, Luciana, Galera da CNP, Mauro Pichiliani, Roberto Fonseca, Rodrigo Souza, Catae, João Polisel, Marcelo Ferandes, Luciano Palma, Paul White, Conor, Craig, Enrique Puig, Brent Ozar, Elvis, Eduardo Santarem, Paul Randal, Paulo (SQLFromHell), Pinal Dave, Rodolfo Roim, Grant Fritchey, Cris, Andrew, Benjamin Nevarez, Holger Schmeling, Phil Factor, Demétrio, Fernando Garcia, Rony Gabriel, Djonatas, FatherJack… Se eu esqueci de você me avisa que coloco aqui :-).
Comunidade pode contar comigo para o que precisar… tamo na área.
Abraços
Fabiano Amorim – SQL Server MVP
My Precious conhecimento!
Meu primeiro post no novo Blog… vamos ver o que vai sair.
My Precious conhecimento!
Nos últimos anos/meses tenho dedicado uma boa parte de meu tempo mais valioso (quando estou em casa) escrevendo artigos, blogs posts e me preparando para eventos ou webcasts. Por que isso?
Bom vamos começar do começo.
- Dia 11 de Dezembro de 2006 fiz minha primeira prova de certificação em SQL Server, o exame 70-431. Eu já estava apaixonado pelo SQL Server há algum tempo, a partir deste colocamos a aliança.
- Em 30 de Novembro de 2007 eu escrevi meu primeiro Post de Blog. Viciei, e desde lá já se foram 189 posts.
- Dia 07 de Abril de 2008 recebi o seguinte e-mail do Luciano Caixeta Moreira, que na época estava trabalhando na Microsoft:
“Cara, está rolando uma coisa bacana de SQL Server nesse momento e acho que podemos tentar te colocar”.
O e-mail era pra me convidar para fazer uns vídeos para a Microsoft, os vídeos seriam publicados no programa MSDN Experience. No final acabou que não deu certo de eu ir para São Paulo para gravar os Vídeos, e fiquei só na expectativa.
- Dia 14 de Maio de 2008 para minha alegria recebi um e-mail do Daniel Ferreira da Microsoft, me convidando para fazer uma WebCast para o MSDN, falando sobre Upgrade para SQL Server 2008.
Depois disso definitivamente eu já sabia que quanto mais eu compartilhava meu precioso conhecimento, mais precioso ele se tornava.
Após minha primeira WebCast, varias outras oportunidades surgiram, mais WebCasts, eventos em Faculdades, eventos Microsoft, artigos para o Simple-Talk, artigos para Revistas e por ai vai… Oportunidade de compartilhar meu conhecimento é o que não faltava…
O que me faz continuar nessa vida loca (agora são 01:17 da madruga)?… Eu adoro isso tudo. Fico honrado em saber que o que escrevo pode ajudar alguém, seja pra resolver um problema, ou para aprimorar seus conhecimentos. Quando estou ministrando um treinamento de SQL Server e um aluno realmente interessado faz uma pergunta que tem tudo a ver com o que estou falando, me sinto realizado.
Eu adoro escrever, amo ensinar as pessoas porque eu aprendo com elas, uma vez ouvi uma pessoa dizer, “- Eu entendi que você só aprende mesmo uma coisa, quando tem que ensinar para alguém.” Isso é a mais pura verdade.
Aonde esse meu prazer em escrever e ensinar me levou?… Para maior empresa de consultoria de SQL Server do mundo.
Contrato assinado com a SolidQ e perspectivas surreais para os próximos meses.
Obrigado a todos que acreditaram em mim, e aos que me ajudaram a chegar até aqui. Comunidade SQL, conte comigo. SolidQ I’m yours, count on me and all my hard work to build a big company here in Brazil .
Obrigado Deus, porque sei que não sou digno de nada disso. Sua graça me constrange.
Indice / Lookup / Recompile
Recentemente o Luciano Moreira publicou um post no seu blog perguntando porque as vezes o SQL Server não usa um determinado índice, aproveitando a deixa resolvi escrever um pouco sobre isso.
O link para o post do Luciano é este Exibir artigo…
DROP TABLE TMP
CREATE TABLE TMP(ID INT IDENTITY(1,1) PRIMARY KEY, NOME VARCHAR(200), Nome2 VarChar(200))
CREATE INDEX ix_Teste on TMP(Nome)
SET NOCOUNT ON
DECLARE @I INT
SET @I = 0
WHILE @I < 1000
BEGIN
INSERT INTO TMP(NOME, Nome2) VALUES(‘A’, NewID())
INSERT INTO TMP(NOME, Nome2) VALUES(‘B’, NewID())
INSERT INTO TMP(NOME, Nome2) VALUES(‘C’, NewID())
INSERT INTO TMP(NOME, Nome2) VALUES(‘D’, NewID())
INSERT INTO TMP(NOME, Nome2) VALUES(‘E’, NewID())
SET @I = @I + 1;
END
— Foram incluidos 5000 registros na tabela TMP
SELECT COUNT(*) FROM TMP
/*
Pressione CTRL-M para incluir o plano de execução no resultado da consulta e execute o comando abaixo.
O Select irá selecionar 1/5 dela
*/
SELECT * FROM TMP
WHERE Nome = ‘A’
/*
Repare que o SQL Server não utilizou o indice pela coluna Nome e achou
melhor fez um clustered scan, Vamos analisar melhor este comportamento.
Primeiramente vamos ver quantas páginas o SQL Server terá que ler para
retornar os dados da consulta, para isso vamos ligar o statistics io e rodar
o select novamente.
*/
SET STATISTICS IO ON
SELECT * FROM TMP
WHERE Nome = ‘A’
/*
Table ‘TMP’. Scan count 1, logical reads 37, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Podemos observar que o SQL leu 37 páginas de dados para retornar o resultado.
Agora vamos forçar o uso do indice por nome para fazer o Seek e não o Clustered Scan,
repare no plano de execução que o SQL fez um Seek e um bookmark para
pegar o valor da coluna Nome2 que não faz parte do indice nonclustered ix_teste.
No indice cluster(no nosso exemplo é o campo ID que é a primary key) temos as informações de todos
os dados da tabela, portanto sempre que uma consulta seleciona campos a mais do que os cobertos pelo
indice nonclustered o SQL irá no indice cluster ler esta informação.
No nosso exemplo abaixo isso aconteceu porque a coluna Nome2 não pertence ao indice nonclustered,
portanto o SQL fez o lookup para ler esta informação no indice cluster.
*/
SELECT * FROM TMP WITH(INDEX = ix_teste)
WHERE Nome = ‘A’
/*
Table ‘TMP’. Scan count 1, logical reads 2076, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Podemos observar que desta vez o SQL leu 2076 páginas de dados para retornar o resultado.
Com isso podemos concluir que o Lookup é MUITO "caro" para sua consulta e o
SQL só irá optar fazer o lookup se a quantidade de linhas que será retornada for
aproximadamente menor que 0,1% do total de sua tabela.
Uma solução para forçar o uso do indice sem perder tanto em performance
seria incluir a coluna Nome2 no indice noncluster,
No SQL 2000
CREATE INDEX ix_Teste on TMP(Nome, Nome2)
No SQL 2005 poderiamos utilizar a clausula INCLUDE
CREATE INDEX ix_Teste on TMP(Nome) INCLUDE(Nome2)
*/
/*
Vamos incluir uma linha na tabela TMP com o valor X e efetuar
o select para retonar apenas o valor X e ver o plano de execução.
*/
INSERT INTO TMP(NOME, Nome2) VALUES(‘X’, NewID())
SELECT * FROM TMP
WHERE Nome = ‘X’
GO
SELECT * FROM TMP
WHERE Nome = ‘A’
GO
/*
Repare que no primeiro select o SQL usou o Indice e no
segundo não usou porque irá retornar muitas linhas
*/
/*
Um outro comportamento interessante é quando o valor do filtro é passado
por uma variável, vimos no select acima que o SQL usou o indice para
o filtro nome = ‘X’, vamos passar o valor ‘X’ para uma variável
e utiliza-la no where.
*/
DECLARE @var VarChar(200)
SET @var = ‘X’
SELECT * FROM TMP
WHERE Nome = @var
/*
Desta vez o SQL não usou o indice e fez o Scan mesmo a consulta retornando
apenas 1 registro, isso acontece porque o SQL não sabe o valor de @var
por este motivo ele opta por fazer o Scan porque ele não sabe se @var irá retornar
1 linha ou 5000.
Existem várias soluções para este problema, a idéia a fazer o SQL compilar
o código com o valor de @var.
Você poderia utilizar a SP_EXECUTESQL
Ou então criar uma procedure e executar a consulta na procedure
Ou então utilizar o Hint RECOMPILE
Veja um exemplo do uso das 3 opções
*/
— SP_EXECUTESQL
DECLARE @SQL NVARCHAR(200)
SET @SQL = ‘SELECT * FROM TMP WHERE Nome = @Var’
EXEC SP_EXECUTESQL @SQL, N’@Var VarChar(200)’, @Var = ‘X’
— Procedure
— Criei a proc utilizando a clausula WITH RECOMPILE
— mas esse assunto fica pra uma 2 Parte do post
CREATE PROC st_Teste @Var VarChar(200)
WITH RECOMPILE AS
SELECT * FROM TMP
WHERE Nome = @var
GO
EXEC st_Teste @Var = ‘A’
— HINT – RECOMPILE
DECLARE @var VarChar(200)
SET @var = ‘X’
SELECT * FROM TMP
WHERE Nome = @var
OPTION(RECOMPILE)
_________________________________________________________________
Fabiano Neves Amorim
Análise – NewCon Enterprise
* fabiano@cnpm.com.br – http://fabianosqlserver.spaces.live.com/
TempDB
Em relação a performance um problema muito comum é a contenção no TempDB.
O Banco de dados TempDB é utilizado para várias operações, ao invés de escrever aqui quais são estas operações eu vou de CTRL-C + CTRL+V do Books Online que é mais facil.
The tempdb system database is a global resource that is available to all users connected to the instance of SQL Server and is used to hold the following:
· Temporary user objects that are explicitly created, such as: global or local temporary tables, temporary stored procedures, table variables, or cursors.
· Internal objects that are created by the SQL Server Database Engine, for example, work tables to store intermediate results for spools or sorting.
· Row versions that are generated by data modification transactions in a database that uses read-committed using row versioning isolation or snapshot isolation transactions.
· Row versions that are generated by data modification transactions for features, such as: online index operations, Multiple Active Result Sets (MARS), and AFTER triggers.
No site do TechNet tem um excelente artigo falando sobre o TempDB no SQL Server 2005, segue o link Working with tempdb in SQL Server 2005.
No artigo acima podemos observar em “Troubleshooting contention caused by to DML operations” que quando temos problema de performance no TempDB é recomendado criar um arquivo de dados para cada processador existente no servidor e habilitar o trace flag 1118.
Obs.: Neste caso um processador Dual Core é considerado como 2 processadores, ou seja, criar 2 arquivos.
Conforme o artigo Q328551 a mesma recomendação também foi feita pela Microsoft para servidores rodando SQL Server 2000.
No TechEd 2007 participei de uma mesa redonda sobre Otimização de Performance com o SQL Server 2005 – Dicas e Truques e discutimos sobre o TraceFlag 1118, e os profissionais da Microsoft presentes reforçaram o que os artigos acima recomendam.
Lembro do Fabricio Catae Premier Field Engineer dizer o seguinte:
· Por precaução e para não ter futuros problemas nós recomendamos o uso do TraceFlag 1118 e criamos um arquivo do TempDB para cada processador.
Concordo com ele, na duvida se o TempDB está sendo um problema ou não, antes de ter problema habilite o TraceFlag e crie um arquivo para cada processador do servidor.
Antes de continuar a falar sobre isso vamos entender um pouco mais sobre os Extents pois eles tem tudo a ver com o TraceFlag 1118.
No SQL Server existem dois tipos de extents, os extents mistos e extents uniformes.
Assim como o extent uniforme o extent misto tem 64 kb(8 páginas de 8k). A diferença entre eles é que um extent misto pode ter páginas de mais de um objeto diferente. Veja o exemplo abaixo.
Repare que no Extent Misto temos informações de vários objetos, Table2, Index1, Index2 e etc…
O SQL Server usa 2 tipos de controladores para alocação dos extents, o GAM e o SGAM.
· GAM – Para os extents uniformes o SQL irá usar a Global Allocation Map que é responsável por registrar as alocações dos extents uniformes de todos os objetos do banco de dados. O GAM usa um bit para controlar se o extent está livre ou alocado. Se o bit valer 1 o extent está livre se o bit valor 0 o extent está alocado.
· SGAM – Para os extents mistos o SQL irá usar a Shared Global Allocation Map como o próprio nome diz “Shared” ele é responsável por registrar quais são os extents mistos e qual deles tem páginas livres para uso. O SGAM também usa um bit para fazer este controle, se o bit for 1 então o extent é misto e tem pelo menos uma página livre para utilização, se o bit for 0 então o extent não é um extent misto ou então todas as páginas já estão utilizadas.
Vamos imaginar o seguinte cenário, um simples insert um uma nova tabela temporária.
Todo objeto criado no banco de dados é iniciado com um extent misto até que a tabela ocupe 8 páginas de dados, sabendo disso então podemos dizer que o SQL irá alocar um extend misto para gravar minha informação nesta tabela temporária. Para chegar neste extent misto e na página onde minha informação será gravada o DataBase Engine usa a controladora SGAM.
Ok já sei que o SQL aloca extents mistos para novos objetos, mas o que isso tem a ver com o TraceFlag e o TempDB?
Tem a ver que quando habilitamos o TraceFlag 1118 o SQL passará a não mais alocar extents mistos e sim extents uniformes, pulando a etapa que usa a SGAM para achar um extent misto.
Podemos observar que o SQL tem o trabalho de alocar extents mistos e conforme a tabela vai crescendo o SQL tem controlar se no extent atual cabe os dados que estão sendo inseridos ou se ele precisa alocar um novo extent,isso irá acontecer quando a tabela ficar maior que 64 k, para fazer este controle o SQL irá utilizar a SGAM e a PFS(controla o espaço livre dentro de uma página). Ao alocar direto um extend uniforme o SQL não precisa toda hora consultar a SGAM e a PFS para verificar se ele necessita alocar outro extent para inserir os dados.
O Luciano Moreira deu um show de explicação sobre como, quando, onde e porque utilizar o TraceFlag 1118 o artigo pode ser lido em Analisando o trace flag 1118.
Um detalhe importante é que recentemente(não tão recente assim) a Microsoft divulgou um artigo dizendo que ao fazer o que ela diz você pode ter problemas de desempenho. O artigo pode ser lido aqui Q936185,
O MVP Linchi Shea escreveu um artigo no seu blog falando sobre esse problema, Reduce the Contention on tempdb with Trace Flag 1118: To Enable, or Not to Enable?
Até a próxima e stay tuned!
______________________________________________________________
Fabiano Neves Amorim (MCP – MCTS – SQL Server)
Análise – NewCon Enterprise
* fabiano@cnpm.com.br – http://fabianosqlserver.spaces.live.com/