Arquivo da categoria: WEBCAST

Monitorando o seu banco de dados com o Performance Studio do SQL Server 2008

Boa Noite Pessoal,

Mal cheguei de férias e fui escolhido para ministrar um Webcast sobre o Performance Studio. Tirando a correria de um DBA recém chegado no trabalho, foi muito proveitoso. Eu conhecia o Performance Studio um pouco de relance e alguns livros mas nunca tinha ido mais a fundo. O legal de um Webcast de um tema que você não domina tanto é que você é intimado a estudar sobre o assunto. Foi ótimo, aproveitei para pesquisar bastante material sobre esse assunto e me convenci ainda mais de que essa é uma funcionalidade do 2008 que realmente vale muito ser mais explorada.

Felizmente as avaliações do Webcast foram positivas. Fico satisfeito de ter tido uma boa aprovação e que o pessoal tenha gostado. Realmente foi proveitoso para todos. Infelizmente não foi possível responder a todas as perguntas e um ficou de fora.

“Os recursos do Performance Studio estão disponíveis em todas as versões ?”

De fato o Performance Studio não está disponível para todas as versões. O SQL Server Express não foi contemplado, mas ao contrário do que poderia parecer, as edições Standard, Workgroup e Web também possuem os recursos do Performance Studio. Os detalhes estão no link abaixo:

http://www.microsoft.com/sqlserver/2008/en/us/editions-compare.aspx

Gostaria de agradecer novamente aqueles que compareceram ao Webcast. Conforme prometido o link abaixo permite efetuar o download da apresentação:

http://cid-f4f5c630410b9865.skydrive.live.com/self.aspx/ProjetosSQLServer/Webcast/20090325%7C_PerformanceStudio/20090325%7C_Webcast%7C_Performance%7C_Studio%7C_SQL%7C_Server%7C_2008%7C6.pdf

Aqueles que desejarem executar o código para criar os itens de coleta personalizados segue o código abaixo:

USE MSDB;

BEGIN TRY;

BEGIN TRANSACTION;

    DECLARE @collection_set_id INT
    EXEC [dbo].[sp_syscollector_create_collection_set]
        @name = N‘Coletor de Desempenho’,
        @collection_mode = 1,
        @description = N‘Coletar dados para mensurar o desempenho’,
        @days_until_expiration = 7,
        @collection_set_id = @collection_set_id OUTPUT

DECLARE @collector_type_uid UNIQUEIDENTIFIER
    = (SELECT TOP 1 collector_type_uid
        FROM [dbo].[syscollector_collector_types]
        WHERE name = N‘Generic T-SQL Query Collector Type’)

DECLARE @CollItemID INT

EXEC [dbo].[sp_syscollector_create_collection_item]
    @Name = N‘Conexões’,
    @parameters = N‘<ns:TSQLQueryCollector xmlns:ns="DataCollectorType">
            <Query>
                <Value>
                SELECT COUNT(*) As TotConexoes
                FROM sys.dm_exec_connections
                </Value>
                <OutputTable>Conexoes</OutputTable>
            </Query>
            <Databases UseSystemDatabases="false" UseUserDatabases="true"/>
        </ns:TSQLQueryCollector>’
,
    @collection_item_id = @CollItemID OUTPUT,
    @frequency = 15,
    @collection_set_id = @collection_set_id,
    @collector_type_uid = @collector_type_uid

SET @collector_type_uid =
    (SELECT TOP 1 collector_type_uid
        FROM [dbo].[syscollector_collector_types]
        WHERE name = N‘Generic SQL Trace Collector Type’)

EXEC [dbo].[sp_syscollector_create_collection_item]
    @name = N‘Eventos do Profiler’,
    @parameters = N‘<ns:SqlTraceCollector xmlns:ns="DataCollectorType" use_default="0">
        <Events>
            <EventType name="Stored Procedures">
                <Event id="10" name="RPC:Completed" columnslist="1,3,11,35,12,28,13" />
            </EventType>
            <EventType name="TSQL">
                <Event id="12" name="SQL:BatchCompleted" columnslist="1,3,11,35,12,28,13" />
                <Event id="13" name="SQL:BatchStarting" columnslist="1,3,11,35,12,28,13" />
            </EventType>
    </Events>
            <Filters>
                <Filter columnid="35" columnname="DatabaseName"
                    logical_operator="AND" comparison_operator="LIKE"
                    value="AdventureWorks"/>
            </Filters>
        </ns:SqlTraceCollector>’
,
    @collection_item_id = @CollItemID OUTPUT,
    @frequency = 15,
    @collection_set_id = @collection_set_id,
    @collector_type_uid = @collector_type_uid

SET @collector_type_uid =
    (SELECT TOP 1 collector_type_uid
        FROM [dbo].[syscollector_collector_types]
        WHERE name = N‘Performance Counters Collector Type’)

EXEC [dbo].[sp_syscollector_create_collection_item]
    @name = N‘Contadores do Perfmon’,
    @parameters = N
        <ns:PerformanceCountersCollector xmlns:ns="DataCollectorType">
            <PerformanceCounters Objects="Processor" Counters="% Processor Time" Instances="*"/>
            <PerformanceCounters Objects="$(INSTANCE):General Statistics" Counters="User Connections"/>
            <PerformanceCounters Objects="$(INSTANCE):SQL Statistics" Counters="Batch Requests/sec"/>
        </ns:PerformanceCountersCollector>’
,
    @collection_item_id = @CollItemID OUTPUT,
    @frequency = 15,
    @collection_set_id = @collection_set_id,
    @collector_type_uid = @collector_type_uid

COMMIT TRANSACTION;
END TRY
BEGIN CATCH
    ROLLBACK TRANSACTION
;
    DECLARE @ErrorMessage NVARCHAR(4000) = ERROR_MESSAGE(),
        @ErrorSeverity INT = ERROR_SEVERITY(),
        @ErrorState INT = ERROR_STATE(),
        @ErrorNumber INT = ERROR_NUMBER(),
        @ErrorLine INT = ERROR_LINE(),
        @ErrorProcedure NVARCHAR(200) = ISNULL(ERROR_PROCEDURE(),’-‘)

    RAISERROR(14684,@ErrorSeverity,1,@ErrorNumber,@ErrorSeverity,@ErrorState,
            @ErrorProcedure, @ErrorLine, @ErrorMessage)

END CATCH
GO

O Webcast deverá estar disponível em alguns dias no site do MSDN, mas é possível acessá-lo através do link original. Aos interessados segue o link do Webcast

Monitorando o seu banco de dados com o Performance Studio do SQL Server 2008
http://msevents.microsoft.com/CUI/WebCastEventDetails.aspx?EventID=1032409545&EventCategory=4&culture=pt-BR&CountryCode=BR

[ ]s,

Gustavo

Mais dicas e mais truques sobre consultas complexas no SQL Server

Boa Noite Pessoal,

Eu gostaria de agradecer aos que estiveram presentes no meu recente Webcast que tratava sobre dicas e truques sobre consultas complexas no SQL Server (focado no SQL Server 2005). Segui nos mesmo moldes do Webcast anterior, ou seja, demonstrar como problemas complexos podem ser resolvidos de forma simples.

Infelizmente devido há alguns problemas, me parece que o link não estava acessível e diversas pessoas não assistiram o Webcast. Acho realmente uma pena, pois, dessa vez trabalhei melhor algumas falhas do Webcast anterior e acredito que esse saiu ainda melhor. Aqueles que estiveram presentes devem ter percebido que ficou melhor que o anterior (novamente meus agradecimentos a esses que conseguiram). Para aqueles que não conseguiram, vou disponibilizar a resolução de cada um dos problemas nas próximas postagens do blog. Os interessados em assistir o Webcast gravado, utilizem o link abaixo:

Mais dicas e mais truques sobre consultas complexas no SQL Server
https://msevents.microsoft.com/CUI/WebCastEventDetails.aspx?culture=pt-BR&EventID=1032392772&CountryCode=BR

Dessa vez eu testei o link e baixei o Webcast.

[ ]s,

Gustavo

Mesa Redonda – Engine relacional do SQL Server

Boa Noite Pessoal,
 
Há uma semana atrás eu apresentei mais um Webcast sobre SQL Server juntamente o Luti. Esse Webcast foi diferente dos usuais já que foi em um novo formato. Não era sobre nenhum tema específico.
 
Inicialmente fui entrevistado sobre as tarefas do meu dia a dia, o papel do DBA, estudos, etc. A segunda parte do Webcast foi direcionada para dúvidas sobre o Engine relacional do SQL Server incluindo SQL Server Express, Índices, Fragmentação, Snapshot Isolation, etc.
 
Foi uma sessão bem interessante e as dúvidas bem pertinentes. Os interessados em conhecer mais sobre esse Webcast podem pesquisar no link abaixo:
 
 
[ ]s,
 
Gustavo

Dicas e Truques sobre consultas complexas no SQL Server

Boa Tarde Pessoal,
 
Ontem fiz a apresentação do Webcast "Dicas e Truques sobre consultas complexas no SQL Server" onde demonstrei como utilizar o TSQL para elaborar consultas avançadas com foco no SQL Server 2005.
 
O objetivo do Webcast era demonstrar algumas necessidades de consultas comuns que aparecem, bem como apontar soluções para essas dúvidas e listar algumas práticas recomendadas.
 
Foram apresentados 5 problemas bem freqüentes. Posto também os scripts de forma resumida.
 
Totalização de resultados
Como elaborar uma coluna de saldo acumulando valores
 
— Tabela de Lançamentos para exemplificar o Subtotal
CREATE TABLE tblLancamentos (
    DataLancamento SMALLDATETIME,
    ValorLancamento SMALLMONEY)
 
— Insere os registros
INSERT INTO tblLancamentos VALUES (‘20080623’,100)
INSERT INTO tblLancamentos VALUES (‘20080624’,-250)
INSERT INTO tblLancamentos VALUES (‘20080625’,380)
INSERT INTO tblLancamentos VALUES (‘20080626’,200)
INSERT INTO tblLancamentos VALUES (‘20080627’,-300)
 
— Listar o saldo automático
SELECT DataLancamento, ValorLancamento,
    (SELECT SUM(ValorLancamento) FROM tblLancamentos
    WHERE DataLancamento <= QE.DataLancamento) AS Saldo
FROM tblLancamentos AS QE
 
Concatenação e delimitação
Como juntar vários resultados em uma única linha com algum caractér delimitador
 
— Cria a tabela de Clientes para exemplificar a concatenação
CREATE TABLE tblClientes (
    CodigoCli INT,
    NomeCli VARCHAR(50))
 
— Insere os registros
INSERT INTO tblClientes VALUES (1,‘Amanda’)
INSERT INTO tblClientes VALUES (2,‘Ângela’)
 
— Cria a tabela de Pedidos para exemplificar a concatenação
CREATE TABLE tblPedidos (
    CodigoCli INT,
    NumPedido INT,
    DataPedido SMALLDATETIME)
 
— Insere os registros
INSERT INTO tblPedidos VALUES (1,3310,‘20080620’)
INSERT INTO tblPedidos VALUES (1,5340,‘20080624’)
INSERT INTO tblPedidos VALUES (1,6723,‘20080628’)
INSERT INTO tblPedidos VALUES (2,4456,‘20080621’)
INSERT INTO tblPedidos VALUES (2,5219,‘20080625’)
INSERT INTO tblPedidos VALUES (2,5780,‘20080630’)
 
— Utilizar a natureza semiestruturada para concatenar valores
SELECT NomeCli, REPLACE(REPLACE(PedidosXML,‘</row>’,‘ ; ‘),‘<row>’,) AS Pedidos FROM (
    SELECT NomeCli,
        (SELECT NumPedido AS [text()] FROM tblPedidos AS PED
        WHERE CLI.CodigoCli = PED.CodigoCli FOR XML PATH) AS PedidosXML
    FROM tblClientes AS CLI) AS Res
 
O TOP “N”
Como retornar a N ocorrências relacionadas a um conjunto de registros
 
— Cria a tabela de Clientes para exemplificar o TOP 2 para cada cliente
CREATE TABLE tblClientes (
    CodigoCli INT,
    NomeCli VARCHAR(50))
 
— Insere os registros
INSERT INTO tblClientes VALUES (1,‘Amanda’)
INSERT INTO tblClientes VALUES (2,‘Ângela’)
 
— Cria a tabela de Pedidos para exemplificar o TOP 2 para cada cliente
CREATE TABLE tblPedidos (
    CodigoCli INT,
    NumPedido INT,
    DataPedido SMALLDATETIME)
 
— Insere os registros
INSERT INTO tblPedidos VALUES (1,3310,‘20080620’)
INSERT INTO tblPedidos VALUES (1,5340,‘20080624’)
INSERT INTO tblPedidos VALUES (1,6723,‘20080628’)
INSERT INTO tblPedidos VALUES (2,4456,‘20080621’)
INSERT INTO tblPedidos VALUES (2,5219,‘20080625’)
INSERT INTO tblPedidos VALUES (2,5780,‘20080630’)
 
— O operador CROSS APPLY é indicado para situações TOP "N"
SELECT CLI.NomeCli, PED.NumPedido, PED.DataPedido
FROM tblClientes AS CLI
CROSS APPLY (
    SELECT TOP 2 NumPedido, DataPedido FROM tblPedidos
    WHERE CodigoCli = CLI.CodigoCLI
    ORDER BY DataPedido) AS PED
 
PIVOT & PIVOT dinâmico
Como transformar linhas em colunas usando o Operador PIVOT e superar suas limitações
 
— Cria a tabela de Marcas para exemplificar o PIVOT
CREATE TABLE Marcas (
    CodigoCli INT,
    Marca CHAR(1))
 
— Insere os registros
INSERT INTO Marcas VALUES (1, ‘A’)
INSERT INTO Marcas VALUES (1, ‘B’)
INSERT INTO Marcas VALUES (2, ‘A’)
INSERT INTO Marcas VALUES (3, ‘B’)
 
— Criando e formatando o resultado
SELECT Cliente,
    CASE A WHEN 1 THEN ‘S’ ELSE ‘N’ END AS MarcaA,
    CASE B WHEN 1 THEN ‘S’ ELSE ‘N’ END AS MarcaB
FROM (
SELECT CodigoCli AS Cliente, [A], [B] FROM
(SELECT CodigoCli, Marca FROM Marcas) AS Marcas
PIVOT
( COUNT(Marca) FOR Marca IN ([A],[B]) ) AS PivotTable) AS Q
 
— Criando e formatando o resultado sem especificar as marcas
DECLARE
    @Marca CHAR(1),  @Marcas VARCHAR(100), @cmdSQLHeader VARCHAR(100),
    @cmdSQLAux VARCHAR(100), @cmdSQLFooter VARCHAR(1000),
    @cmdSQL VARCHAR(1500)
 
    SET @cmdSQLHeader = ‘SELECT Cliente’ + CHAR(10)
    SET @cmdSQLAux = ‘, CASE ? WHEN 1 THEN ”S” ELSE ”N” END AS Marca?’ + CHAR(10)
    SET @cmdSQLFooter =

        FROM (
        SELECT CodigoCli AS Cliente, ?
        FROM
        (SELECT CodigoCli, Marca 
            FROM Marcas) AS MarcasFormatadas
        PIVOT
        ( COUNT(Marca) FOR Marca IN (?) ) AS P) AS Q’
— Recuperar a lista de marcas existentes
DECLARE cMarcas CURSOR
FOR SELECT DISTINCT Marca FROM Marcas
FAST_FORWARD
 
OPEN cMarcas
 
FETCH NEXT FROM cMarcas INTO @Marca
SET @Marcas =
SET @cmdSQL = @cmdSQLHeader
 
WHILE @@FETCH_STATUS = 0
BEGIN
    SET @cmdSQL = @cmdSQL + REPLACE(@cmdSQLAux,‘?’,@marca)
    SET @Marcas = @Marcas + ‘[‘ + @Marca + ‘],’
    FETCH NEXT FROM cMarcas INTO @Marca
END
 
CLOSE cMarcas
DEALLOCATE cMarcas
 
— Executando o comando
SET @Marcas = LEFT(@Marcas,LEN(@Marcas)-1)
SET @cmdSQL = @cmdSQL + REPLACE(@cmdSQLFooter,‘?’,@Marcas)
EXEC(@cmdSQL)
 
Consultas Hierárquicas
Como elaborar consultas em relacionamentos hierárquicos (autorelacionamento)
 
— Cria a tabela de Funcionários para exemplificar a hierarquia
CREATE TABLE tblFuncionarios (
    IDFuncionario INT,
    NomeFuncionario VARCHAR(50),
    IDSuperior INT NULL,
    ValorVendido SMALLMONEY)
 
— Insere os registros
INSERT INTO tblFuncionarios VALUES (1,‘Thelma’,NULL,350.00)
INSERT INTO tblFuncionarios VALUES (2,‘Denise’,1,250.00)
INSERT INTO tblFuncionarios VALUES (3,‘Tamara’,2,200.00)
INSERT INTO tblFuncionarios VALUES (4,‘Herline’,3,100.00)
INSERT INTO tblFuncionarios VALUES (5,‘Ricardo’,NULL,600.00)
INSERT INTO tblFuncionarios VALUES (6,‘Cléber’,5,500.00)
INSERT INTO tblFuncionarios VALUES (7,‘Eduardo’,5,300.00)
 
— Utilização de uma CTE Recursiva
WITH Superiores
AS (
SELECT IDFuncionario, NomeFuncionario,
    IDSuperior, ValorVendido,
    CASE WHEN IDSuperior IS NULL THEN IDFuncionario
    ELSE IDSuperior END AS ID
FROM tblFuncionarios
WHERE IDSuperior IS NULL
 
UNION ALL
 
SELECT FUNC.IDFuncionario, FUNC.NomeFuncionario,
  FUNC.IDSuperior, FUNC.ValorVendido,
  SUP.ID
FROM Superiores AS SUP
INNER JOIN tblFuncionarios AS FUNC ON SUP.IDFuncionario = FUNC.IDSuperior)
 
SELECT FUNC.IDFuncionario, FUNC.NomeFuncionario, FUNC.ValorVendido,
    SUM(SUP.ValorVendido) – FUNC.ValorVendido AS VendasIndiretas,
    SUM(SUP.ValorVendido) AS TotalVendas
FROM
    tblFuncionarios AS FUNC
    INNER JOIN Superiores AS SUP ON FUNC.IDFuncionario = SUP.ID
GROUP BY
    FUNC.IDFuncionario, FUNC.NomeFuncionario, FUNC.ValorVendido
 
Assim que a data e o link do Webcast foram definidos, fiz uma divulgação nos principais grupos de SQL Server que faço parte. Fiquei muito satisfeito com a quantidade de pessoas que assistiram a apresentação (cerca de 80 pessoas). Foi muito gratificante poder levar conhecimento a um grupo tão grande já que normalmente uma apresentação no Webcast tem um quorum menor de pessoas.
 
A essas pessoas que assistiram a apresentação eu gostaria de agradecer novamente pelo comparecimento, interesse e pela avaliação. Mesmo com os problemas de áudio a avaliação foi positiva e recebi muitos feedbacks. Estou sugerindo para a equipe organizadora que façamos uma segunda apresentação. Se de fato for acontecer, divulgarei a data e o link logo que disponíveis.
 
Conforme prometido no Webcast, segue o link para efetuar o download do projeto em SQL Server 2005 com os scripts utilizados na apresentação.
 
 
O Webcast foi gravado e acredito que nos próximos dias deva estar disponível. O link original do Webcast é:
 
 
Obrigado a todos,
 
Gustavo