Arquivo

Arquivo do Autor

Arquivos – WebCast DBA CheckList

28 de junho de 2012 2 comentários

Galera, conforme combinado segue o link para download dos arquivos que utilizei na WebCast da Sr.Nimbus onde falamos sobre tarefas que todo DBA deve analisar em um ambiente SQL Server.

https://skydrive.live.com/redir?resid=52EFF7477E74CAA6!2051

Para baixar o PPT de uma olhada aqui no post do Luti: http://luticm.blogspot.com.br/2012/06/dba-checklist-gravacao-e-material-do.html

Para quem perdeu a sessão ou não sabe do que eu estou falando, segue abaixo o video da sessão:

 

WebCast Sr.Nimbus–DBA CheckList

 

http://youtu.be/dfUGDfS1Qv0

Abs.

SQLSat 147 Recife dia 25/08 e TDC dia 06/07

27 de junho de 2012 3 comentários
image
image

Galera, duas novidades rápidas, na próxima sexta-feira dia 06/07/2012 irei ministrar uma palestra no TDC (The Developers Conference), e no dia 25 de agosto irei ministrar a mesma sessão no SQL Saturday (#sqlsat147) que será em Recife.

O tema da sessão é a seguinte:

Ei dev, aprenda 7 maneiras diferentes para matar um DBA do coração

Descrição:

Nesta sessão o MVP em SQL Server Fabiano Amorim (@mcflyamorim) irá demonstrar 7 técnicas de desenvolvimento que irão fazer um DBA morrer do coração. Piores práticas para escrever uma consulta T-SQL (problemas com triggers, procedures, views e functions), piores práticas para desenvolver uma tela de consulta, desenvolvendo para não ter segurança. Performance? Não é preciso! Aprenda o que fazer e o que não fazer quando desenvolver para SQL Server.

Espero nos ver por lá Smile.

Abs.

Categorias:Evento, Virtual PASS BR

WebCast Sr.Nimbus–DBA CheckList dia 21/06/2012

1 de junho de 2012 11 comentários

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 Smile. Segue abaixo o resultado:

clip_image001

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.

Treinamentos SQL07 (QueryPlans) e SQL11 (T-SQLExpert) em SP

31 de maio de 2012 2 comentários

Galera, depois de muitos pedidos estamos abrindo turmas para horários noturno e diurno dos treinamentos de SQL Server da Sr.Nimbus…

Mais detalhes no site da Sr.Nimbus http://intranet.srnimbus.com.br/paginas/default.aspx

Qq coisa sabem onde me achar…

Abs.

Categorias:Treinamento

Hypothetical indexes, making it easy to use…

Hi there, yes, I know, it’s being a while since I wrote something here… So, sorry about that.

Yesterday the guy I’m a big fan (if you already join one of my SQL trainings you know that Smile) Query Optimizer Guru Paul White (blog|twitter) answered a question on twitter (#sqlhelp hash tag) and he mentioned a post I wrote some time ago about hypothetical indexes on SQL Server. That is a very nice feature but unfortunately is not pretty to use because it requires you to use DBCC AUTOPILOT and set AUTOPILOT to ON…

The parameters you have to use are not straightforward to find and may discourage you to use it… I’ve created a procedure to make it a little easier to use.

Originally I created this procedure after a student question about how to make it easier to use hypothetical indexes on SQL Server. So I thought you may like it.

Unfortunately it relies on a CLR stored procedure to SET the AUTOPILOT, but if you don’t mind to use it in a develop environment (which is something normal to do) then you can use it, following is the CLR code, and if you are interested you can download the project code here:

-- CLR Proc
/*
using System;
using System.Data;
using System.Data.SqlClient;
using System.Data.SqlTypes;
using Microsoft.SqlServer.Server;

public partial class StoredProcedures
{
    [Microsoft.SqlServer.Server.SqlProcedure]
    public static void CLR_GetAutoPilotShowPlan
    (
         SqlString SQL,
         out SqlXml PlanXML
    )
    {
        //Prep connection
        SqlConnection cn = new SqlConnection("Context Connection = True");

        //Set command texts
        SqlCommand cmd_SetAutoPilotOn = new SqlCommand("SET AUTOPILOT ON", cn);
        SqlCommand cmd_SetAutoPilotOff = new SqlCommand("SET AUTOPILOT OFF", cn);
        SqlCommand cmd_input = new SqlCommand(SQL.ToString(), cn);

        if (cn.State != ConnectionState.Open)
        {
            cn.Open();
        }

        //Run AutoPilot On
        cmd_SetAutoPilotOn.ExecuteNonQuery();

        //Run input SQL
        SqlDataAdapter da = new SqlDataAdapter();
        DataSet ds = new DataSet();

        da.SelectCommand = cmd_input;
        ds.Tables.Add(new DataTable("Results"));

        ds.Tables[0].BeginLoadData();
        da.Fill(ds, "Results");
        ds.Tables[0].EndLoadData();

        //Run AutoPilot Off
        cmd_SetAutoPilotOff.ExecuteNonQuery();

        if (cn.State != ConnectionState.Closed)
        {
            cn.Close();
        }

        //Package XML as output
        System.Xml.XmlDocument xmlDoc = new System.Xml.XmlDocument();
        //XML is in 1st Col of 1st Row of 1st Table
        xmlDoc.InnerXml = ds.Tables[0].Rows[0][0].ToString();
        System.Xml.XmlNodeReader xnr = new System.Xml.XmlNodeReader(xmlDoc);
        PlanXML = new SqlXml(xnr);
    }
};
*/

Following is the code to compile it on SQL Server and to create another procedure to simulate the hypothetical indexes:

-- Publishing Assembly
IF EXISTS(SELECT * FROM sys.assemblies WHERE name = 'CLR_ProjectAutoPilot')
BEGIN
  IF OBJECT_ID('st_CLR_GetAutoPilotShowPlan') IS NOT NULL
    DROP PROC st_CLR_GetAutoPilotShowPlan

  DROP ASSEMBLY CLR_ProjectAutoPilot
END
GO
CREATE ASSEMBLY CLR_ProjectAutoPilot FROM 'C:\ProjectAutoPilot\ProjectAutoPilot\bin\Release\ProjectAutoPilot.dll' WITH PERMISSION_SET = SAFE
GO

CREATE PROCEDURE st_CLR_GetAutoPilotShowPlan (@Query NVarChar(MAX), @ShowPlan XML OUTPUT)
AS
  EXTERNAL NAME CLR_ProjectAutoPilot.StoredProcedures.CLR_GetAutoPilotShowPlan
GO

IF OBJECT_ID('st_TestHipotheticalIndexes', 'p') IS NOT NULL
  DROP PROC dbo.st_TestHipotheticalIndexes
GO
CREATE PROCEDURE dbo.st_TestHipotheticalIndexes (@SQLIndex NVarChar(MAX), @Query NVarChar(MAX))
AS
BEGIN
  SET NOCOUNT ON;
  BEGIN TRY
    BEGIN TRAN
    DECLARE @CreateIndexCommand NVarChar(MAX),
            @IndexName NVarChar(MAX),
            @TableName NVarChar(MAX),
            @SQLIndexTMP NVarChar(MAX),
            @SQLDropIndex NVarChar(MAX),
            @SQLDbccAutoPilot NVarChar(MAX),
            @i Int,
            @QuantityIndex Int,
            @Xml XML

    IF SubString(@SQLIndex, LEN(@SQLIndex), 1) <> ';'
    BEGIN
      RAISERROR ('Last caracter in the index should be ;', -- Message text.
                 16, -- Severity.
                 1 -- State.
                 );
    END

    SET @SQLDropIndex = '';
    SET @QuantityIndex = LEN(@SQLIndex) - LEN(REPLACE(@SQLIndex, ';', ''))
    SELECT @SQLIndexTMP = SUBSTRING(@SQLIndex, 0, CharIndex(';', @SQLIndex))

    SET @i = 0
    WHILE @i < @QuantityIndex
    BEGIN
      SET @SQLIndexTMP = SUBSTRING(@SQLIndex, 0, CharIndex(';', @SQLIndex))
      SET @CreateIndexCommand = SUBSTRING(@SQLIndexTMP, 0, CharIndex(' ON ',@SQLIndexTMP))
      SET @IndexName = REVERSE(SubString(REVERSE(@CreateIndexCommand), 0, CharIndex(' ', REVERSE(@CreateIndexCommand))))
      SET @TableName = SUBSTRING(REPLACE(@SQLIndexTMP, @CreateIndexCommand + ' ON ', ''), 0, CharIndex(' ', REPLACE(@SQLIndexTMP, @CreateIndexCommand + ' ON ', '')))
      IF ISNULL(@TableName,'') = ''
        SET @TableName = SUBSTRING(REPLACE(@SQLIndexTMP, @CreateIndexCommand + ' ON ', ''), 0, CharIndex('(', REPLACE(@SQLIndexTMP, @CreateIndexCommand + ' ON ', '')))
      SET @SQLIndex = REPLACE(@SQLIndex, @SQLIndexTMP + ';', '')
      --SELECT @SQLIndex, @SQLIndexTMP, @CreateIndexCommand, @TableName, @IndexName

      -- Creating hypotetical index
      IF CharIndex('WITH STATISTICS_ONLY =', @SQLIndexTMP) = 0
      BEGIN
        SET @SQLIndexTMP = @SQLIndexTMP + ' WITH STATISTICS_ONLY = -1'
      END
      -- PRINT @SQLIndexTMP
      EXEC (@SQLIndexTMP)

      -- Creating query to drop the hypotetical index
      SELECT @SQLDropIndex = @SQLDropIndex + 'DROP INDEX ' + @TableName + '.' + @IndexName + '; '
      -- PRINT @SQLDropIndex

      -- Executing DBCC AUTOPILOT
      SET @SQLDbccAutoPilot = 'DBCC AUTOPILOT (0, ' + 
                                               CONVERT(VarChar, DB_ID()) + ', '+ 
                                               CONVERT(VarChar, OBJECT_ID(@TableName),0) + ', ' +
                                               CONVERT(VarChar, INDEXPROPERTY(OBJECT_ID(@TableName), @IndexName, 'IndexID')) + ')'

      EXEC (@SQLDbccAutoPilot)
      --PRINT @SQLDbccAutoPilot

      SET @i = @i + 1
    END

    -- Executing Query
    DECLARE @PlanXML xml

    EXEC st_CLR_GetAutoPilotShowPlan @Query = @Query, 
                                     @ShowPlan = @PlanXML OUT
    SELECT @PlanXML

    -- Droping the indexes
    EXEC (@SQLDropIndex)

    COMMIT TRAN
  END TRY
  BEGIN CATCH
    ROLLBACK TRAN
    -- Execute error retrieval routine.
    SELECT ERROR_NUMBER()    AS ErrorNumber,
           ERROR_SEVERITY()  AS ErrorSeverity,
           ERROR_STATE()     AS ErrorState,
           ERROR_PROCEDURE() AS ErrorProcedure,
           ERROR_LINE()      AS ErrorLine,
           ERROR_MESSAGE()   AS ErrorMessage;
  END CATCH;
END
GO

The proc st_TestHipotheticalIndexes expect two input parameters:

  • @SQLIndex: Here you should specify the command to create the index you and to try (the hypothetical indexes), if you want to try more than one index, just call it separating many “create index” commands by coma. For instance:
@SQLIndex = 'CREATE INDEX ix_12 ON Products (Unitprice, CategoryID, SupplierID) INCLUDE(ProductName);CREATE INDEX ix_Quantity ON Order_Details (Quantity);',
  • @Query: Here you should write the query you want to try.

Here is a sample of how to call it on :

-- Sample 1
EXEC dbo.st_TestHipotheticalIndexes @SQLIndex = 'CREATE INDEX ix ON Order_Details(Quantity);', 
@Query = 'SELECT * FROM Order_Details WHERE Quantity < 1'

The results of the query above is an XML with the query plan considering the suggested index:

clip_image001

Another sample:

— Sample 2

-- Sample 2
EXEC dbo.st_TestHipotheticalIndexes @SQLIndex = 'CREATE INDEX ix_12 ON Products (Unitprice, CategoryID, SupplierID) INCLUDE(ProductName);CREATE INDEX ix_Quantity ON Order_Details (Quantity);', 
                                    @Query = 'SELECT p.ProductName, p.UnitPrice, s.CompanyName, s.Country, od.quantity FROM Products as P INNER JOIN Suppliers as S ON P.SupplierID = S.SupplierID INNER JOIN order_details as od ON p.productID = od.productid WHERE P.CategoryID in (1,2,3) AND P.Unitprice < 20 AND S.Country = ''uk'' AND od.Quantity < 90'

clip_image002

Yep, now it is easier… Let me know what do you think and please don’t mind on the crappy code Smile  in the proc to get the tablename, indexname…

Have fun…

SQLSat127 – Rio de Janeiro 14/04

10 de abril de 2012 2 comentários

image

image

Galera, depois de um tempo off participando do MVPSummit e do SQLBits (quando sair o vídeo eu falo melhor sobre isso aqui no Blog) estou aqui para falar do SQL Saturday 127.

Dessa vez o evento será no Rio de Janeiro e vou fazer a primeira sessão do dia falando sobre DBA CheckList, que por sinal, é o tema vencedor da enquete que publiquei no Blog… (faremos a WebCast depois que eu voltar do Rio).

Esses dias eu twitei dizendo que tinha tido uma ideia bem legal para o SQLSat127, e já que minha sessão foi aceita, vou colocar a ideia em prática. O que é? Surpresa Smile.

Quer saber? Venha assistir minha sessão no evento! Sarcastic smile

Uma coisa posso dizer, com certeza vai ser algo que você nunca viu em apresentações por ai… E se der certo (espero que de!) vai ser bem legal…

Também posso dizer que minha sessão não terá NENHUM slide, exatamente NENHUM… Ficou curioso? Que bom! Sarcastic smile

Abs.

Categorias:Evento

Treinamento – TSQL Expert dia 17 de Abril em SP

14 de março de 2012 6 comentários

Essa foi a reação do Chuck Norris ao ler a ementa desse treinamento!

image

Galera, dia 17 de Abril, irei ministrar um treinamento de T-SQL, é um novo treinamento que criamos na SrNimbus chamado T-SQLExpert, a ideia é que assuntos complexos e problemáticos no que diz respeito a performance sejam cobertos com vários exemplos e cases do dia a dia.

A ementa do treinamento ficou sensacional, eu confesso que eu mesmo ficaria doido para fazer um treinamento desses Smile.

http://intranet.srnimbus.com.br/treinamento/paginas/curso.aspx?COD=SQL11

Esse é um treinamento de T-SQL, se você gosta, te prometo que veremos MUITO desse tal de SQL durante o treinamento. PPTs de 40 slides? Nãaaaaaaaao! Vamos para prática!

Segue abaixo alguns comentários sobre cada módulo.

Módulo 01: Query Tuning
Neste módulo queremos tratar sobre metodologia para analise e performance de consultas, onde olhar? Como olhar? O que importa? Que ferramentas podem me ajudar? Tá bom ou tá ruim? Como simular 100 usuários rodando essa consulta? Debug ajuda?

Essas são algumas perguntas que quero responder neste módulo…

Módulo 02: Functions

Functions são comumente utilizadas, ainda que nem sempre com boa performance, elas tem suas vantagens e desvantagens. Quero mostrar neste modulo onde a coisa começa a ficar ruim, muito ruim e extremamente ruim?… Estatísticas em functions?… View ou function? Formatação no banco ou na app? Conheça as ciladas e cuidados…

Function é uma coisa boa apenas quando usada corretamente, aprenda como fazer isso.

Módulo 03: Views

Views indexada é uma das minhas opções prediletas em relação a tuning, eu normalmente digo que elas podem salvar o seu dia. Entenda neste módulo como usar, quando usar, e como contornar limitações das views indexadas.

Como analisar o impacto das views indexadas?

Date correlation optimization também será analisado neste módulo, que tal copiar a lógica do date correlation e usar no meu ambiente?….

Módulo 04: Objetos temporários, CTEs e TVP

Tabelas temporárias, CTEs, variáveis do tipo table, Table valued parameters… Esses são alguns itens que iremos analisar com detalhe.

Uma CTE por si só é melhor que uma subquery? Fazer “pre filtros” em uma CTE é uma boa técnica? E a recursividade, como uso? CTE + FOR XML?

E aqui, uso variável do tipo table ou tabela temporária? Qual a diferença entre esses objetos?

Módulo 05: Cursores e Funções de Ranking (windowing functions)

Aaaa nesse módulo eu vou me esbaldar… Smile

Windows function é tudo aquilo que você sempre precisou, mas não sabia que precisava. Neste módulo irei explicar como elas funcionam e todos os detalhes em relação ao processamento interno e controle do frame de uma window.

Modulo 06: Triggers

Triggers são do capeta! Você já ouviu isso? Eu já, e concordo!

Agora, a pergunta é: Elas são sempre ruim?

Quando posso usar? Quais os prós e contras em relação ao uso de triggers, como otimizar o uso de triggers?

Modulo 07: TOP e CROSS APPLY

TOP e Apply? Sério um módulo inteiro só para isso?

Pois é se você não sabe porque incluí um modulo só para falar sobre isso, definitivamente você precisa ver esse módulo.
Muitas vezes, consultas complexas podem se resolvidas de forma bem simples utilizando estes comandos.

Módulo 08: Modificação de dados avançada

Sério, acho que dava para fazer um treinamento só sobre isso… Como importar os dados de forma mais rápida possível?

Como excluir uma grande massa de dados sem acabar com o servidor? Como fazer expurgo de dados? Como fazer um insert e um delete com apenas um comando? Como alterar o valor de uma coluna identity? Quem é melhor, MERGE ou UPDATE/INSERT/DELETE ? …

Módulo 09: Boas práticas e quebrando mitos

Quero acabar com todas suas dúvidas… por favor, me pergunte!

Além de acabar com os mitos, quero perder um tempo falando sobre alguns problemas comuns e mostrar soluções espetaculares (não tem outro nome, realmente é espetacular).

Preciso dizer algo? Leia os itens que veremos por aqui:
• Dicas avançadas de T-SQL
    o Resolvendo o problema de consultas com LIKE ‘’%%”
    o Consultando intersecções de datas – RI-Tree
    o Consultas dinâmicas
    o Muito mais…
• Quebrando mitos
    o COUNT(1) versus COUNT(*)
    o JOIN versus EXISTS
    o DISTINCT versus GROUP BY
    o SET versus SELECT
    o TOP 1 ORDER BY DESC versus MAX
    o UNION versus UNION ALL
    o NOT IN versus NOT EXISTS
    o CURSOR versus WHILE
    o Ordem das tabelas no JOIN
    o Joins – Merge vs Loop vs Hash
    o Foreign Key ou não?

Modulo10: Unit Test com T-SQL

Testes unitários é um módulo que o Luti fez eu incluir no treinamento Smile. Ele escreveu sobre isso no MVP Deep Dives 2, vai por mim, é muito mais importante do que você pensa. Já pensou ter um código para teste de TUDO o que sua equipe de desenvolvimento escreve em T-SQL? Só vai para homologação depois de passar pelos testes, aumenta qualidade, diminui custo de manutenção, bugs… Sonho? Não, longe disso, pura realidade.

Modulo11: Stored Procedures

Neste módulo quero criar polemica, e ver os alunos nervosos! Smile.

Sim, vamos criar uma proc para cada tabela? Ou melhor, 4 procs para cada tabela? Regras de negócio, vai no banco ou fica na App? Ora, usar procedures tem algum beneficio? Eu acho que não, mas também acho que sim! Ou seja, quero que você me convença da sua ideologia (Laughing out loud) em relação a isso, vamos ver os detalhes de cada um destes itens, e após conhecer tudo sobre elas, dai sim, decidiremos se damos fim a elas, ou se desejaremos vida longa as procedures!

 

O treinamento é de apenas 4 dias, mais informações aqui no site da SrNimbus http://intranet.srnimbus.com.br/paginas/noticia.aspx?ID=33 não deixe de perguntar caso tenha alguma dúvida, vocês sabem onde me achar… Winking smile

Este treinamento está tendo bastante procura, portanto não deixe pra se inscrever de última hora ok ? As vagas são limitadas.

Abs.

Categorias:Evento, T-SQL, Treinamento

WebCast gratuita – Sr.Nimbus

30 de janeiro de 2012 9 comentários

Pessoal, a Sr.Nimbus planejando uma sessão online gratuita de aproximadamente 2 horas e queremos ouvir de você qual é o tema que devemos falar!

Confesso que a lista poderia ser GIGANTE, então limitei a alguns tópicos, nada impede que você nos de outra sugestão usando a opção others(outros).

E ai?

Categorias:Enquete, Sr.Nimbus

Fabiano VS PerfMon Counters que não aparecem

25 de janeiro de 2012 1 comentário

Já aconteceu com você de precisar ler alguns contadores de performance do SQL Server no PerfMon e eles não aparecerem?

Eu já havia passado por esse problema e confesso que não entendia porque os contadores do SQL não estavam lá na listinha do perfmon.

Estou trabalhando em mais um script para o repositório do DBCC CHECK_BD () da SrNimbus e os contadores relacionados ao SQL Server da minha máquina não estavam disponíveis, o que fazer?

Eu precisei reinstalar os contadores da minha instancia SQL. Para fazer isso execute os seguintes passos:

1. Abrir o cmd.exe (linha de comando)

 

2. Desinstalar os contadores relacionados a instancia:

a. Instancia default: unlodctr MSSQLSERVER

b. Instancia nomeada: unlodctr MSSQL$NOMEDAINSTANCIA

 

3. Instalar os contadores usando o arquivo de configuração dos contadores (arquivo .ini). Este arquivo fica na pasta BINN do SQL Server, no meu caso estava em “C:\Program Files\Microsoft SQL Server\MSSQL10_50.SQL2008R2_1\MSSQL\Binn”

a. lodctr /T:”C:\Program Files\Microsoft SQL Server\MSSQL10_50.SQL2008R2_1\MSSQL\Binn\perf-MSSQL$SQL2008R2_1sqlctr.ini”

b. O parâmetro /T é importante para marcar os contadores como uma fonte confiável (T de trusted)

 

4. Reiniciar o serviço do SQL Server. L deve ter um jeito mais fácil, sem necessitar reiniciar o serviço, mas eu só consegui assim. Se você descobrir/souber me avisa.

Segue um print dos comandos que rodei na minha maquina.

clip_image001

Após isso os contadores devem aparecer por lá.

Abs.

Categorias:Perfmon, Virtual PASS BR

SQLSaturday 127–Rio de Janeiro 14/04

24 de janeiro de 2012 Deixe um comentário

Ano passado tive o prazer de participar do SQLSaturday100 em São Paulo.

O evento foi sensacional, com repercussão muito boa e palestras excelentes. Foi novamente uma ótima oportunidade para rever os amigos e fazer novos.

Sempre acho que além de fazer amigos e aprender com os palestrantes, o evento é sem dúvida um ótimo lugar para fazer networking.

image

Depois do sucesso do #SQLSat100 o próximo encontro já está marcado, será no Rio de Janeiro no dia 14/04. Anote na sua agenda, estarei lá, ainda não sei se estarei como palestrante ou ouvinte. Eu submeti duas sessões, agora é esperar e torcer pra ver se me escolhem como palestrante novamente. O call for speakers esta aberto, se você deseja participar como palestrante e quer submeter uma palestra clique no seguinte link http://www.sqlsaturday.com/127/callforspeakers.aspx

Mais informações sobre o evento: http://www.sqlsaturday.com/127/eventhome.aspx

Para ver as sessões submetidas: http://www.sqlsaturday.com/127/schedule.aspx

See you there!

Categorias:Evento, Virtual PASS BR