Performance Select.
23/07/2009
0
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
Posts
24/07/2009
Emerson Nascimento
from VENDAITENS
where PRDCODIGO in (20,300,56)
a consulta se tornará rápida se houver um índice por PRDCODIGO e VNDCODIGO.
24/07/2009
Emerson Nascimento
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.
24/07/2009
Madrick
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.
25/07/2009
Emerson Nascimento
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.
25/07/2009
Madrick
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
27/07/2009
Emerson Nascimento
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
18/08/2009
Bride
Select VNDCODIGO From VendaItens
Where ((PrdCodigo =20)
And (PrdCodigo =300)
And (PrdCodigo =56))
Clique aqui para fazer login e interagir na Comunidade :)