none
Esta procedure está boa? RRS feed

  • Pergunta

  • Pessoal,

    Estou desenvovendo um sistema de pagamentos par minha empresa e gostaria de saber se essa parte da procedure que gera um numero de pedido está boa e se não estiver como posso otimizá-la?

    ++++++++++++++++++++++++++++++++++++++++++

    -- numero da compra (pedido)
    DECLARE @nr_compra int;

    -- data da transacao
    DECLARE @dt_transacao date;

    -- Identificacao do nr_compra
    DECLARE @cd_compra_gerada int;
    SET @dt_transacao = GETDATE();
    BEGIN
        SET NOCOUNT ON;
                BEGIN
                    -- verifica se existe transacoes para o dia corrente
                    IF NOT EXISTS (SELECT 1 FROM gerador_pedido_amex WHERE dt_gerador_pedido_amex = CONVERT(CHAR(10), @dt_transacao, 23))
                        BEGIN
                            -- se nao existir transacoes para o dia, entao cria com valor 1
                            INSERT INTO gerador_pedido_amex (cd_gerador_pedido_amex,dt_gerador_pedido_amex) VALUES (1,GETDATE());
                        END
                    ELSE
                        BEGIN
                            -- atualiza o gerador com proximo numero
                            UPDATE gerador_pedido_amex SET cd_gerador_pedido_amex=cd_gerador_pedido_amex+1 WHERE dt_gerador_pedido_amex = CONVERT(CHAR(10), @dt_transacao, 23);
                        END          
                      
                    -- coloca o numero de compra (pedido) gerado na variavel
                    SET @nr_compra = (SELECT cd_gerador_pedido_amex FROM gerador_pedido_amex WHERE dt_gerador_pedido_amex = CONVERT(CHAR(10), @dt_transacao, 23));
                  
                    -- insere a compra
                    INSERT INTO compras
                    (cd_tipo_pagamento,id_usuario,nr_compra,vlr_total_compra,dt_compra,cd_compras_status) VALUES
                                (@cd_tipo_pagamento,@id_usuario,
                                CAST(YEAR(@dt_transacao) as varchar) + '' +
                                CAST(MONTH(@dt_transacao) as varchar) + '' +
                                CAST(DAY(@dt_transacao) as varchar) + '' +
                                CAST(@nr_compra as varchar),@total_compra,GETDATE(),1);
                        IF @@ROWCOUNT > 0
                            BEGIN
                                SET @cd_compra_gerada = (SELECT @@IDENTITY)
                                -- insere na tabela de informacoes da compra
                                INSERT INTO amex_transacoes (cd_compra) VALUES (@cd_compra_gerada)
                                -- retorna a compra gerada (pedido)
                                SELECT
                                    co.cd_compra,
                                    co.nr_compra,
                                    co.vlr_total_compra
                                FROM
                                    compras as co
                                JOIN amex_transacoes as amt ON    co.cd_compra = amt.cd_compra
                                AND     co.cd_compra = @cd_compra_gerada
                                RETURN
                            END
                        ELSE
                            BEGIN
                                SELECT resposta = -1
                                RETURN
                            END
                END
    END
    ++++++++++++++++++++++++++++++++++++++++++++++++++++++

    quinta-feira, 15 de abril de 2010 14:34

Respostas

  • fabiolg82,
    Boa noite!

    Analisando sua procedure por alto verifiquei que não tem nenhum trecho do código T-SQL que teria problemas maiores de performance, mas acho que você deveria eliminar a variável @dt_transacao, pois você em alguns momentos utiliza a variável e em outros a função getdate(), por que você não utiliza a função em todos, ou deixa a variável e utiliza ela nos locais que há necessidade de trabalhar com a data atual? Os JOINs estão corretos? Está faltando algum filtro? Se todos os questionamentos que fiz estiver OK, o melhor a fazer é realizar testes de execução em um ambiente de homologação e validar tempo de execução da procedure.

     Espero ter lhe ajudado.

    Grande Abraço,
    Gabriel B Azevedo | Especializando em Engenharia de Software e Banco de Dados|
    gabriel.ccomputacao@hotmail.com
    http://gbabarroso.spaces.live.com/default.aspx


    Classifique as respostas. O seu feedback é imprescindível. Obrigado!
    • Marcado como Resposta Fernanda Simões segunda-feira, 19 de abril de 2010 14:15
    sexta-feira, 16 de abril de 2010 02:29

Todas as Respostas

  • ng? :(
    quinta-feira, 15 de abril de 2010 20:55
  • fabiolg82,
    Boa noite!

    Analisando sua procedure por alto verifiquei que não tem nenhum trecho do código T-SQL que teria problemas maiores de performance, mas acho que você deveria eliminar a variável @dt_transacao, pois você em alguns momentos utiliza a variável e em outros a função getdate(), por que você não utiliza a função em todos, ou deixa a variável e utiliza ela nos locais que há necessidade de trabalhar com a data atual? Os JOINs estão corretos? Está faltando algum filtro? Se todos os questionamentos que fiz estiver OK, o melhor a fazer é realizar testes de execução em um ambiente de homologação e validar tempo de execução da procedure.

     Espero ter lhe ajudado.

    Grande Abraço,
    Gabriel B Azevedo | Especializando em Engenharia de Software e Banco de Dados|
    gabriel.ccomputacao@hotmail.com
    http://gbabarroso.spaces.live.com/default.aspx


    Classifique as respostas. O seu feedback é imprescindível. Obrigado!
    • Marcado como Resposta Fernanda Simões segunda-feira, 19 de abril de 2010 14:15
    sexta-feira, 16 de abril de 2010 02:29
  • fabiolg82,
    Boa noite!

    Analisando sua procedure por alto verifiquei que não tem nenhum trecho do código T-SQL que teria problemas maiores de performance, mas acho que você deveria eliminar a variável @dt_transacao, pois você em alguns momentos utiliza a variável e em outros a função getdate(), por que você não utiliza a função em todos, ou deixa a variável e utiliza ela nos locais que há necessidade de trabalhar com a data atual? Os JOINs estão corretos? Está faltando algum filtro? Se todos os questionamentos que fiz estiver OK, o melhor a fazer é realizar testes de execução em um ambiente de homologação e validar tempo de execução da procedure.

     Espero ter lhe ajudado.

    Grande Abraço,
    Gabriel B Azevedo | Especializando em Engenharia de Software e Banco de Dados|
    gabriel.ccomputacao@hotmail.com
    http://gbabarroso.spaces.live.com/default.aspx


    Classifique as respostas. O seu feedback é imprescindível. Obrigado!


    Bom dia Gabriel,

    Primeiro agradeço pela resposta. Os JOINS e filtros estão corretos.

    Meu maior medo é de requisoções concorrentes. Acho que vou criar UNIQUE em alguns campos da tabela compras pra garantir. 
    Qual melhor jeito de realizar testes de stress e validar o tempo de execução da procedure? A tabela de compras deve gerar uns 2000 registros por dia.

    Abs

    sexta-feira, 16 de abril de 2010 12:16