Usuário com melhor resposta
Esta procedure está boa?

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
++++++++++++++++++++++++++++++++++++++++++++++++++++++
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
Todas as 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
-
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