Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Gustavo H Lima

Query MUITO demorada

Recommended Posts

Olá, estou desenvolvendo um sistema em PHP e estou com dificuldades para fazer uma consulta...

 

Query: (mais abaixo segue a explicaçao de cada campo/tabela)

SELECT

ped_num,

DATE_FORMAT(ped_data,'%d/%c/%Y') AS ped_data,

cl_nome,

rd_nome,

ped_oc,

ped_tot

FROM relatorio_ped

WHERE ped_num IN (SELECT pi_num FROM relatorio_prod WHERE pi_cod=1046341)

 

A tabela relatorio_prod é uma tabela com itens de pedidos de compra, pi_cod é o codigo de cada item(produto). Essa tabela armazena os produtos inseridos em pedidos de compra já efetuados, ou seja, cada vez que o produto 1046341 é comprado, um registro é inserido nessa tabela.

 

A tabela relatorio_ped é a tabela onde os dados simples do pedido são armazenados. Como dito, os itens de cada pedido são armazenados na tabela relatorio_prod, com uma chave estrangeira se referindo a tabela relatorio_ped.

 

Na query em questão eu tento fazer uma busca em todos os registros da tabela relatorio_prod, o resultado me traz o número dos pedidos(pi_num) onde o item 1046341 foi encontrado. Após obter o número dos pedidos, eu faço a query principal onde eu busco os dados dos pedidos encontrados pela subquery.

 

O problema é que essa query demora MUITO tempo pra me retornar. Uma query com 16 registros demorou 40 segundos....

O que tem de errado com ela?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não entendi o pq do SELECT dentro do WHERE. Isso não funciona???

 

 

SELECT
ped_num,
DATE_FORMAT(ped_data,'%d/%c/%Y') AS ped_data,
cl_nome,
rd_nome,
ped_oc,
ped_tot
FROM relatorio_ped
WHERE pi_cod=1046341

Compartilhar este post


Link para o post
Compartilhar em outros sites

ta lento por causa disso aqui

 

WHERE ped_num IN (SELECT pi_num FROM relatorio_prod WHERE pi_cod=1046341)

 

o mysql eh um jumento e nao usa o raio da chave quando taca o IN pra ele fazer e no caso faz uma consulta de matrirz todos x todos(esqueci o nome disso agora) antes de ir atras do resultado

 

sendo assim a gente tem q ensinar a ele a fazer a consulta ....lembrando claro q você tem q botar indices e chaves conforme necessario

 

 

SELECT

ped_num,

DATE_FORMAT(ped_data,'%d/%c/%Y') AS ped_data,

cl_nome,

rd_nome,

ped_oc,

ped_tot

FROM relatorio_ped , (SELECT DISTINCT pi_num as xyz FROM relatorio_prod WHERE pi_cod=1046341) as abc

WHERE ped_num = abc.xyz

 

sempre q for assim, consultas mto demoradas q deviam ser rapidas você da um EXPLAIN e ve quantas linhas ele esta usando pra cada instruçao

Compartilhar este post


Link para o post
Compartilhar em outros sites

SELECT

ped_num,

DATE_FORMAT(ped_data,'%d/%c/%Y') AS ped_data,

cl_nome,

rd_nome,

ped_oc,

ped_tot

FROM relatorio_ped , (SELECT DISTINCT pi_num as xyz FROM relatorio_prod WHERE pi_cod=1046341) as abc

WHERE ped_num = abc.xyz

 

Eu naum entendi... Pq colocar a subconsulta 'abc'???

Compartilhar este post


Link para o post
Compartilhar em outros sites

faz uma consulta de matrirz todos x todos(esqueci o nome disso agora)

Bacana, produto cartesiano!! ehehehe

 

a[0] x b[0] = aa 
a[0] x b[1] = ab 
a[0] x b[2] = ac 
a[1] x b[0] = ba 
a[1] x b[1] = bb 
a[1] x b[2] = bc 
a[2] x b[0] = ca 
a[2] x b[1] = cb 
a[2] x b[2] = cc

Na verdade, a consulta do amigo demora não por este fato, mas pelo fato de que, o MySQL não trabalha bem com Sub-Query, ainda mais com uma disjunção IN().

 

Happy MySQL'ing 4 all!! http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom, subconsulta nao eh mto prejudicial, o IN q eh

 

verifiquei isso uma vez fazendo um relatorio, um cliente ia instantaneo, outro cliente o mesmo, se eu colocasse os dois ao mesmo tempo no IN() demorava quase 90 segundos

 

aih eu fiz um teste simples

 

se eu usava IN com um valor sobre um campo com chave primaria e unica na tabela ele no EXPLAIN dava 1 row usado na consulta

 

se eu usava IN com dois valores no mesmissimo campo ele me dava 3milhoes de linhas no explain q era minha base completa

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tudo bem quanto ao IN(), não discordo e até salientei, mas de fato, e isso é um fato de muita discussão na MySQL User Conference de que, o MySQL não trabalha bem com Sub Queries. Desde a versão 3.23, quando foi introzido o InnoDB que se discute isso. . .por menor que seja, ele embanana...rs

 

Abraços meu camarada Giesta!! http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.