Performance Select.

23/07/2009

0

Ola pessoal,
estou com uma situação que gostaria de compartilhar e ver se alguem tem alguma
solução mais performatica, gostaria de selecionar todas as VENDAS que
tenham 3 produtos especificos informado, pode até ter mais itens, mas quero apenas
as vendas que entre os produtos informados esteja estes 3, consegui com a SQL abaixo
só que como no caso tenho muitos registros na tabela VENDAITENS(mais de 20 milhões),
perco em performance, alguem tem alguma solução mais performatica do que esta?

select VNDCODIGO from VENDAITENS
where PRDCODIGO in (20,300,56)
group by VNDCODIGO
HAVING COUNT(*) = 3


Madrick

Madrick

Responder

Posts

24/07/2009

Emerson Nascimento

select VNDCODIGO
from VENDAITENS
where PRDCODIGO in (20,300,56)

a consulta se tornará rápida se houver um índice por PRDCODIGO e VNDCODIGO.


Responder

24/07/2009

Emerson Nascimento

ou

select distinct VNDCODIGO
from VENDAITENS
where PRDCODIGO in (20,300,56)

a consulta se tornará rápida se houver um índice por PRDCODIGO e VNDCODIGO.


Responder

24/07/2009

Madrick

emerson.en obrigado pelo retorno, mas cara com estes select que me passou estarei pegando todas as vendas que tiveram um destes produtos, não apenas retornando as vendas que tiveram os 3 produtos na mesma venda
tipo tenho a tabela VENDAITENS com os seguintes dados:
VNDCODIGO PRDCODIGO
1000 20
1001 20
1001 56
[b:945d95509c] 1002 20
1002 300
1002 56 [/b:945d95509c]

com o select que passei(usando o HAVING) estarei retornando apenas a venda de codigo 1002, pois apenas ela possui os 3 produtos informados, é isto que preciso, apenas de forma mais performatica. Não sei se fui claro.


Responder

25/07/2009

Emerson Nascimento

ah... agora entendi!

de qualquer forma, sua intrução está errada. aparentemente está correta porque a única venda que tem 3 itens é a venda 1002. acrescente mais um produto para a venda 1001 e você verá que ela também aparecerá no seu resultado, porque o seu select retornará qualquer venda que tenha 3 itens, desde que um deles esteja na sua relação. deu pra entender?

vou fazer uns testes aqui pra ver se consigo retornar o que você precisa.


Responder

25/07/2009

Madrick

Em parte vc tem razão, mas se eu adicionar um outro produto, como o exemplo abaixo, com esta select
select VNDCODIGO from VENDAITENS
where PRDCODIGO in (20,300,56)
group by VNDCODIGO
HAVING COUNT(*) = 3

mesmo assim, só aparecerá a venda 1002, por que o novo produto adicionado a venda 1001, não faz parte da clausula [b:901361bd4b]where PRDCODIGO in (20,300,56)[/b:901361bd4b]

1000 20
1001 20
1001 56
1002 20
1002 300
1002 56
[b:901361bd4b]1001 10[/b:901361bd4b]

O meu problema é que o [b:901361bd4b]where PRDCODIGO in (20,300,56)[/b:901361bd4b]
pode me trazer milhares de venda, o que causará uma perca de performance no having, tenho que conseguir limitar a quantidade de resultados selecionado pelo WHERE que fique mais proximo das vendas que tenha os 3 produtos


Responder

27/07/2009

Emerson Nascimento

verdade. tem razão. eu analisei de forma errada. a sua instrução está correta.

agora, para melhorar a performance, crie - se já não o tiver feito - índices pelos campos PRDCODIGO eVNDCODIGO na sua tabela VENDAITENS.
talvez especificar um campo no having também ajude.

select VNDCODIGO from VENDAITENS
where PRDCODIGO in (20,300,56)
group by VNDCODIGO
HAVING COUNT(VNDCODIGO) >= 3


Responder

18/08/2009

Bride

Fala Senhores, boa tarde. Ja pensaram em fazer a consulta conforme esta abaixo, pois ira trazer as vendas onde somente estiver estes produtos
Select VNDCODIGO From VendaItens
Where ((PrdCodigo =20)
And (PrdCodigo =300)
And (PrdCodigo =56))


Responder

Que tal ter acesso a um e-book gratuito que vai te ajudar muito nesse momento decisivo?

Ver ebook

Recomendado pra quem ainda não iniciou o estudos.

Eu quero
Ver ebook

Recomendado para quem está passando por dificuldades nessa etapa inicial

Eu quero

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar