Array
(
)

Performance Select.

Madrick
   - 23 jul 2009

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

Emerson
   - 24 jul 2009

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

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

Emerson
   - 24 jul 2009

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.

Madrick
   - 24 jul 2009

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
1002 20
1002 300
1002 56

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.

Emerson
   - 25 jul 2009

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.

Madrick
   - 25 jul 2009

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 where PRDCODIGO in (20,300,56)

1000 20
1001 20
1001 56
1002 20
1002 300
1002 56
1001 10

O meu problema é que o where PRDCODIGO in (20,300,56)
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

Emerson
   - 27 jul 2009

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

Bride
   - 18 ago 2009

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))