none
Mudei para um servidor melhor mas o desempenho dos relatorios piorou. RRS feed

  • Pergunta

  • Boa tarde pessoal

    Estou tendo um problema e não estou conseguindo achar a causa.

    Tenho na minha empresa um sistema web, com a aplicação e banco de dados instalados em um servidor, um micro comum ( processador core i5 2.5, 6gb de memoria, win server 2008 32bits).

    Funciona perfeitamente. Para ex. peguei um relatorio que leva 10min para ser gerado e exibido.

    Como o sistema trabalha com "explosoes de cardapio" e gera relatorios pesados, a empresa diponibilizou um servidor Dell poweredge (processador Xeon 2.4 2 processors, 8gb de memoria, hd SAS15k 2x160gb, win server 2008 64bits).

    Instalei e configurei o sistema e o banco de dados. Ai o problema, esse mesmo relatorios que leva 10min para ser gerado no Micro, agora no servidor dell esta levando cerca de 25min à 30min para ser gerado e exibido.

    Para tentar resolver essa diferença pesquisei algumas sugestoes e fiz algumas tentativas:

    1. Mudei a versao do SQL EXPRESS para a versao STANDARD

    2. O servidor estava funcionando em Raid1, reinstalei o sistema operacional para funcionar em Raid0.

    Nenhuma das tentativas surtiu efeito. Gostaria que alguem pudesse me dar alguma sugestao para identificar a causa desse problema, pois com um hardware claramente superior o desempenho deveria melhorar e nao piorar.

    Agradeço a atenção

    Miguel.

    sexta-feira, 15 de março de 2013 20:48

Respostas

  • Miguel, bom dia!

     

    De cara me atentaria no plano de execução da consulta, provavelmente essa consulta do relatório não está bem otimizada :) . Além do mais, se você realizou a migração do banco de dados faça um REBUILD de todas as bases, Verifique também como estão as opções da instância do banco de dados  como Max Server Memory e Max Degree of Paralelism.

    Para sintetizar melhor faça o seguinte:

    1 - Realize o Rebuild de todos os índices desse banco de dados

    2 - Verifique as opções  Max Server Memory e Max Degree of Paralelism

    3 - Verifique o plano de execução da consulta que gera o relatório.

    Após isso, publique seus resultados aqui para lhe ajudarmos melhor.


    /* Se útil por favor classifique a resposta */

    sábado, 16 de março de 2013 13:54
  • Isso é uma misconception onde servidor melhor significa SQL Server rodando melhor. Ja peguei inúmeros casos onde isso aconteceu, e o que o que resolveu foi a criação de índices no banco de dados. Os passos acima descritos pelo Luan irão te dar os primeiros passos. Uma coisa que eu também utilizaria é a procedure sp_WHoIsActive. No link abaixo você pode realizar o download e realizar a criação e no momento que você estiver executando o seu relatorio rode essa procedure.

    http://sqlblog.com/blogs/adam_machanic/archive/2012/03/22/released-who-is-active-v11-11.aspx

    Se a resposta foi útil, classifique-a


    Att,
    Marcos Freccia [MTA|MCTS|MCITP|MCT SQL Server 2008]
    Blog|Twitter
    Assine também os feeds clicando aqui

    sábado, 16 de março de 2013 15:16
  • Miguel,

    Além disso, verifique as Estatísticas das Tabelas de Usuários e Tabelas Internas e de Sistema.

    Utilize a System Stored Procedure SP_UpdateStats para realizar todas as estruturas e estatísticas de tabelas de sistema que os bancos de dados possuem.


    Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | SorBR.Net | Professor Universitário | MSIT.com]

    segunda-feira, 18 de março de 2013 18:31
    Moderador

Todas as Respostas

  • Miguel, bom dia!

     

    De cara me atentaria no plano de execução da consulta, provavelmente essa consulta do relatório não está bem otimizada :) . Além do mais, se você realizou a migração do banco de dados faça um REBUILD de todas as bases, Verifique também como estão as opções da instância do banco de dados  como Max Server Memory e Max Degree of Paralelism.

    Para sintetizar melhor faça o seguinte:

    1 - Realize o Rebuild de todos os índices desse banco de dados

    2 - Verifique as opções  Max Server Memory e Max Degree of Paralelism

    3 - Verifique o plano de execução da consulta que gera o relatório.

    Após isso, publique seus resultados aqui para lhe ajudarmos melhor.


    /* Se útil por favor classifique a resposta */

    sábado, 16 de março de 2013 13:54
  • Isso é uma misconception onde servidor melhor significa SQL Server rodando melhor. Ja peguei inúmeros casos onde isso aconteceu, e o que o que resolveu foi a criação de índices no banco de dados. Os passos acima descritos pelo Luan irão te dar os primeiros passos. Uma coisa que eu também utilizaria é a procedure sp_WHoIsActive. No link abaixo você pode realizar o download e realizar a criação e no momento que você estiver executando o seu relatorio rode essa procedure.

    http://sqlblog.com/blogs/adam_machanic/archive/2012/03/22/released-who-is-active-v11-11.aspx

    Se a resposta foi útil, classifique-a


    Att,
    Marcos Freccia [MTA|MCTS|MCITP|MCT SQL Server 2008]
    Blog|Twitter
    Assine também os feeds clicando aqui

    sábado, 16 de março de 2013 15:16
  • Luan e Marcos

    Obrigado pela atenção, estou agora junto ao DBa da empresa que forneceu o sistema, e iremos buscar uma solução, apartir do caminho indicado por vocês. Em breve publico os resultados.

    At.

    Miguel

    segunda-feira, 18 de março de 2013 17:31
  • Miguel,

    Além disso, verifique as Estatísticas das Tabelas de Usuários e Tabelas Internas e de Sistema.

    Utilize a System Stored Procedure SP_UpdateStats para realizar todas as estruturas e estatísticas de tabelas de sistema que os bancos de dados possuem.


    Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | SorBR.Net | Professor Universitário | MSIT.com]

    segunda-feira, 18 de março de 2013 18:31
    Moderador
  • Boa tarde pessal

    Ainda nao obtive progresso.

    Entrei em contato com o Dba do sistema, mostrei o topico, inicialmente ele me mandou um script com SP_UpdateStats para recriar e atualizar os indices e as estatisticas

    USE EFOOD

    GO

    EXEC sp_MSforeachtable@command1="print '?' DBCC DBREINDEX ('?', ' ', 80)"

    GO

    EXEC sp_updatestats

    GO

    As tabelas foram atualizadas mas não ouve melhora no desempenho no servidor dell.

    Em seguida criei a procedure sp_WHoIsActive, e executei nos dois servidores, notei que no "dell" a coluna Wait_info aparece mais constante e com o valor ( ms)writelog, comparado ao "micro".

    Tambem notei que durante o processo, no activity monitor, o disco i/o no "dell" roda em media 137kb/sec enquanto no "micro" a media é de 230kb/sec

    Obrigado pela atenção

    se souberem de mais possibilidades, por favor me informem

    terça-feira, 19 de março de 2013 17:26
  • Miguel, boa tarde!

    Nos passe por gentileza as informações de disco dos dois servidores. O que está parecendo é que seu problema está no novo disco.


    /* Se útil por favor classifique a resposta */

    terça-feira, 19 de março de 2013 18:27
  • são 2 discos fisicos 146gb HD DELL SAS15k em raid0

    o servidor é este http://www.dell.com/us/business/p/poweredge-r610/pd

    ja o micro que esta tendo desempenho melhor que o dell, possui um HD ST500DM002 ATA


    terça-feira, 19 de março de 2013 18:47
  • são 2 discos fisicos 146gb HD DELL SAS15k em raid0

    o servidor é este http://www.dell.com/us/business/p/poweredge-r610/pd

    ja o micro que esta tendo desempenho melhor que o dell, possui um HD ST500DM002 ATA


    Miguel, já identificou a causa? Por favor, colabore com o fórum e passe pra gente o que era o seu problema.

    Numa R610 com disco SAS principalmente em RAID0 (não recomendado mas é realmente mais rápido) o desempenho deveria ser superior.

    Se ainda estiver com o problema retorna pra gente poder continuar te ajudando.

    Abs!


    Luiz Mercante
    MCITP SQL 2008 | MCTS SQL 2008 | MCTS Windows Apps | MCTS Windows Network | MCP 2003
    sqldicas@outlook.com
    http://sqldicas.com.br


    Se a resposta foi útil de alguma forma, classifique.

    terça-feira, 14 de maio de 2013 23:39
    Moderador
  • Boa tarde Luiz

    Nos havíamos congelado esse caso, pois não achamos uma solução, e mantemos o servidor antigo. 

    Agora nas próximas semanas, mais efetivamente em janeiro, iremos rever o caso e trabalhar novamente para buscar uma solução. 

    Manterei o tópico atualizado.

    Obrigado

    Miguel

    sexta-feira, 13 de dezembro de 2013 18:15
  • Legal Miguel, valeu pelo retorno, deixa a gente continuar te ajudando nisso. Abs!

    Luiz Mercante MCITP SQL 2008 | MCTS SQL 2008 | MTA Database Fundamentals | MCTS Windows Apps | MCTS Windows Network | MCP 2003 sqldicas@outlook.com http://sqldicas.com.br Se a resposta foi útil de alguma forma, classifique como resposta ou vote como útil.

    sábado, 14 de dezembro de 2013 03:57
    Moderador
  • Boa noite,

    Você pode estar tendo problemas do tipo Latch Contention.

    Com o aumento do poder de processamento, você aumenta a capacidade do SQL Server processar os comandos, com isso, em alguns casos raros, como o seu pode causar esse problema.

    Execute isso várias vezes no seu banco de dados: select * from sys.sysprocesses where waitresource <> '' 

    A consulta retorna vários registros?

    Se tiver, quais são os waitresources que mais se apresentam?


    Jefferson Santos [MCTS SQL Server]

    terça-feira, 17 de dezembro de 2013 00:22
  • Apenas 1 ou 2 processos em cada tomada.  SEGUE:

    21          5652      0             0x0044  8             PAGEIOLATCH_EX                          5:1:938208                                                                                                                                                                                                                                                                     5             1             47          1949      0             2013-12-18 04:11:48.323             2013-12-18 04:11:48.323      0             0             background                                   0x0100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000                                                                                                                                                                                                                                                                                                                  GHOST CLEANUP                                                                                                                                                                                                                                                                                                                               sa                                                                                                                                             0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000               0x0000000000000000000000000000000000000000         0             0             0

    54          3328      0             0x0042  16          PAGEIOLATCH_SH                          5:1:540660                                                                                                                                                                                                                                                                     5             1             32457691            1759738              3             2013-12-19 14:38:33.650               2013-12-20 11:14:24.013             0             2             suspended                                    0x0100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000               SRV-TESTE                                                                                                                                .Net SqlClient Data Provider                                                                                                            10856                  INSERT                                                                                                                                                                                                                                                                                                             050C39204BE6  LPC                       sa                                                                                                                                             0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000               0x01000500E3682A0A3030A4C90200000000000000        514        -1           0

    sexta-feira, 20 de dezembro de 2013 13:39
  • Boa noite,

    Temos dois wait types sendo apresentados, o PAGEIOLATCH_SH e o PAGEIOLATCH_EX. Um para o processo de GHOST CLEANUP e o outro para .Net SqlClientData em uma operação de INSERT.

    A operação GHOST CLEANUP aplica-se para registros de Índice Cluster, todos Índices Não-Cluster e registros do tipo Text. Quando um registro é apagado da tabela (e o registro seja do tipo citado anteriormente), a engine de banco de dados do SQL Server marca o registro como 'GHOSTED', ou seja, deletado. A verdadeira remoção ocorre somente quando a transação é comitada, e ela é realizada por uma background task chamada de: The Ghost Cleanup Task. O que confirma é o SPID dele que é 21 ou seja, menor que 50, representando um processo interno do SQL Server. O SQL Server faz isso porque se deletamos um registro e ele ainda não foi comitado... e se o SQL Server liberar o espaço? Outras transações poderão utilizar aquele espaço! e se um rollback acontecer? cadê o espaço do registro deletado?

    A operação de insert é um insert!!! Não precisamos detalhar.

    O que está acontecendo com seu ambiente, é uma sobrecarga no subsistema de IO no banco de dados 5 que provavelmente será o ReportServer que está recebendo uma carga muito grande de insert(.Net SqlCliente) e também de delete (que explicaria o GHOST CLEANUP).

    O que você pode fazer é, rode os comandos:

    DBCC TRACEON(3604) /* Trace flag para retornar o resultado do comando DBCC na conexão atual. */ 

    DBCC PAGE(5, 1, 938208, 1) /* Dbcc page no dbid 5, arquivo 1 (MDF), página 938208 */ 

    Quando você rodar o comando dbcc page, você vai ver uma propriedade chamada:

    Metadata: ObjectId = 1605580758

    Pegue o valor de Metadata: ObjectID e faça uma consulta conforme SQL abaixo:

    select name, id, xtype from sys.sysobjects where id = 1605580758

    Dessa forma você vai ver o nome do objeto, e o xtype dele. Caso xtype dele seja igual a "U" (como eu acredito que seja), então significa que o objeto é uma tabela de usuário, e a contenção está sendo nela.

    name          id                 xtype
    page_io_latch 1605580758

    Agora temos que confirmar! A operação de insert está na mesma tabela? Para confirmar execute o comando DBCC abaixo:

    DBCC PAGE(5, 1, 540660, 1) /* Dbcc page no dbid 5, arquivo 1 (MDF), página 540660*/ 

    Veja a propriedade Metadata ObjectID e consulte a tabela sys.sysobjects conforme foi demonstrado, e confirme se é a mesma tabela (objeto).

    Se for, descobrimos qual é a tabela que está sofrendo com IO. E é partir para o Tunning. 

    Confirme isso! Que te ajudamos com o Tunning.




    Jefferson Santos [MCTS SQL Server]

    sábado, 21 de dezembro de 2013 02:20
  • Miguel,

    As esperas do tipo PAGEIOLATCH_XX tem um outro significado importante. As páginas de dados necessárias para gerar o relatório não estavam em memória, estavam em disco. Em qualquer SQL Server haveria esta espera pois o SQL só trabalha com páginas de dados em memória, mas uma demora acentuada pode ser uma configuração equivocada. 

    Vi que o PC tinha 6GB de RAM e o servidor possui 8GB de RAM. Como estão as configurações de MAX SERVER MEMORY e MIN SERVER MEMORY de cada um deles?

    No Perfmon, como está a porcentagem de uso do Page File dos dois ambientes?

    Como se trata de operações de INSERT, seus arquivos de dados estão juntos com os arquivos de Transaction Log? Como é esta divisão no PC e no servidor DELL?

    O RAID foi feito pela controladora da R610? Qual o tamanho do stripe? E o tamanho do Allocation Unit, que você usou na hora de formatar o volume?

    Dá uma olhada nos contadores do Perfmon, passa pra gente as informações dos contadores do grupo Physical Disk, configurando o Perfmon da seguinte forma:

    -exibir em formato Report;

    -exibir 120 segundos;

    -exibir média;

    Com estes contadores vamos saber a quantidade de IOPS que você está requisitando por segundo, a latência do disco, etc.

    Em algum dos ambientes está habilitado o Lock Pages in Memory?

    Dá uma olhada nos contadores aqui:

    http://sqldicas.com.br/dicas/perfmon-e-sql-server/

    Antes de rodar o relatório, limpe as esperas do seu ambiente assim:

    DBCC SQLPERF ('sys.dm_os_wait_stats', CLEAR);

    Em seguida, rode seu relatório e vá acompanhando as esperas com este outro script aqui do Paul Randal:

    WITH [Waits] AS

        (SELECT

            [wait_type],

            [wait_time_ms] / 1000.0 AS [WaitS],

            ([wait_time_ms] - [signal_wait_time_ms]) / 1000.0 AS [ResourceS],

            [signal_wait_time_ms] / 1000.0 AS [SignalS],

            [waiting_tasks_count] AS [WaitCount],

            100.0 * [wait_time_ms] / SUM ([wait_time_ms]) OVER() AS [Percentage],

            ROW_NUMBER() OVER(ORDER BY [wait_time_ms] DESC) AS [RowNum]

        FROM sys.dm_os_wait_stats

        WHERE [wait_type] NOT IN (

            N'CLR_SEMAPHORE',    N'LAZYWRITER_SLEEP',

            N'RESOURCE_QUEUE',   N'SQLTRACE_BUFFER_FLUSH',

            N'SLEEP_TASK',       N'SLEEP_SYSTEMTASK',

            N'WAITFOR',          N'HADR_FILESTREAM_IOMGR_IOCOMPLETION',

            N'CHECKPOINT_QUEUE', N'REQUEST_FOR_DEADLOCK_SEARCH',

            N'XE_TIMER_EVENT',   N'XE_DISPATCHER_JOIN',

            N'LOGMGR_QUEUE',     N'FT_IFTS_SCHEDULER_IDLE_WAIT',

            N'BROKER_TASK_STOP', N'CLR_MANUAL_EVENT',

            N'CLR_AUTO_EVENT',   N'DISPATCHER_QUEUE_SEMAPHORE',

            N'TRACEWRITE',       N'XE_DISPATCHER_WAIT',

            N'BROKER_TO_FLUSH',  N'BROKER_EVENTHANDLER',

            N'FT_IFTSHC_MUTEX',  N'SQLTRACE_INCREMENTAL_FLUSH_SLEEP',

            N'DIRTY_PAGE_POLL', N'SP_SERVER_DIAGNOSTICS_SLEEP')

        )

    SELECT

        [W1].[wait_type] AS [WaitType],

        CAST ([W1].[WaitS] AS DECIMAL(14, 2)) AS [Wait_S],

        CAST ([W1].[ResourceS] AS DECIMAL(14, 2)) AS [Resource_S],

        CAST ([W1].[SignalS] AS DECIMAL(14, 2)) AS [Signal_S],

        [W1].[WaitCount] AS [WaitCount],

        CAST ([W1].[Percentage] AS DECIMAL(4, 2)) AS [Percentage],

        CAST (([W1].[WaitS] / [W1].[WaitCount]) AS DECIMAL (14, 4)) AS [AvgWait_S],

        CAST (([W1].[ResourceS] / [W1].[WaitCount]) AS DECIMAL (14, 4)) AS [AvgRes_S],

        CAST (([W1].[SignalS] / [W1].[WaitCount]) AS DECIMAL (14, 4)) AS [AvgSig_S]

    FROM [Waits] AS [W1]

    INNER JOIN [Waits] AS [W2]

        ON [W2].[RowNum] <= [W1].[RowNum]

    GROUP BY [W1].[RowNum], [W1].[wait_type], [W1].[WaitS],

        [W1].[ResourceS], [W1].[SignalS], [W1].[WaitCount], [W1].[Percentage]

    HAVING SUM ([W2].[Percentage]) - [W1].[Percentage] < 95; -- percentage threshold

    GO

    Por favor, tire um print ao invés de colar o texto pra ficar mais fácil o entendimento.

    Abs


    Luiz Mercante MCITP SQL 2008 | MCTS SQL 2008 | MTA Database Fundamentals | MCTS Windows Apps | MCTS Windows Network | MCP 2003 sqldicas@outlook.com http://sqldicas.com.br Se a resposta foi útil de alguma forma, classifique como resposta ou vote como útil.

    sábado, 21 de dezembro de 2013 12:25
    Moderador
  • Porque meu pc não a quem consiga resolver o problema hein?

    nada pra mim da certo!!!!!! valeu você querer AJUDAR Mais não deu... deve ser o DLL QUE VI APARECER NA MENSAGEM...OLHEI SEU PERFIL NO FACE, OU TENTEI MAIS SO VI UMA FOTO TUA... ESSA MESMO... RS

    que odio !!!!...lene.mfilie@hotmail.com

    abraço.

    obrigada

    sexta-feira, 2 de maio de 2014 03:08