Jump to content


Photo

Indice De Multiplas Colunas


  • Faça o login para participar
16 replies to this topic

#1 osvaldo luso

osvaldo luso

    Novato no fórum

  • Usuários
  • 21 posts
  • Sexo:Não informado

Posted 28/09/2009, 22:39

Pessoal,
No Mysqk consigo localizar um registro em uma table que possui indice composto por várias colunas?
ex:
Tenho um índice na table "B" que se chama "Procura" e este indice é composto pelos campos
Banco - Agencia - Nr_Cheque e Valor. Preciso que o programa leia a tabela "A" e localize o
a informação na table "B" através do índice citado. Como fazer?? Ah, as tables possui milhares
de registros.

#2 Felipe Pena

Felipe Pena

    O temor do Senhor é o princípio da sabedoria

  • Ex-Admins
  • 6441 posts
  • Sexo:Masculino

Posted 29/09/2009, 10:37

Basta você usar na query os campos que compõe o índice, lembrando que você precisa ter no mínimo o campo mais a esquerda do índice composto para que ele possa ser usado.
Felipe Pena
[...] ó terra, terra, terra; ouve a palavra do Senhor. — Jeremias 22:29

#3 osvaldo luso

osvaldo luso

    Novato no fórum

  • Usuários
  • 21 posts
  • Sexo:Não informado

Posted 29/09/2009, 19:34

Basta você usar na query os campos que compõe o índice, lembrando que você precisa ter no mínimo o campo mais a esquerda do índice composto para que ele possa ser usado.


Na realidade, no momento em que o registro for encontrado na tabela "B" este deverá ser editado e seu campo chamado
"Tipo" receberá "4". Ou seja, o programa deve percorrer a tabela "A", ler seus registro um a um, comparar com cada
registro da tabela "B" através do índice "Procura" e se localizar deverá editá-lo na "B", inserindo "4" no campo "Tipo".
Alguem poderia me enviar um modelo desse script?? Grato.

#4 Felipe Pena

Felipe Pena

    O temor do Senhor é o princípio da sabedoria

  • Ex-Admins
  • 6441 posts
  • Sexo:Masculino

Posted 29/09/2009, 20:04

Ops, desconsidere minha resposta anterior. Eu estava pensando em outra coisa. :P

Enfim, então você quer atualizar os registros da tabela B onde exista na tabela A, checando isso por: banco + agencia + nr_cheque e valor.

Então ficaria, por exemplo:

update b, a set b.tipo = 4 where (b.banco, b.agencia, b.nr_cheque, b.valor) = (a.banco, a.agencia, a.nr_cheque, a.valor);

Felipe Pena
[...] ó terra, terra, terra; ouve a palavra do Senhor. — Jeremias 22:29

#5 osvaldo luso

osvaldo luso

    Novato no fórum

  • Usuários
  • 21 posts
  • Sexo:Não informado

Posted 29/09/2009, 21:43

Ops, desconsidere minha resposta anterior. Eu estava pensando em outra coisa. :P

Enfim, então você quer atualizar os registros da tabela B onde exista na tabela A, checando isso por: banco + agencia + nr_cheque e valor.

Então ficaria, por exemplo:

update b, a set b.tipo = 4 where (b.banco, b.agencia, b.nr_cheque, b.valor) = (a.banco, a.agencia, a.nr_cheque, a.valor);


Consegui localizar e atualizar conforme abaixo. A sintaxe para utilização de índice composto está correta????:

$rsCheques = $mySQL->sql("UPDATE B USE INDEX (Procura30) SET Tipo = 4  WHERE   Banco = 1 AND Agencia = 32 AND Numero = 850518 AND Valor = 2493.00;");

Então gostaria de saber como faço para receber os dados da tabela "A" através de um loop e atualizar os dados em "B" de
forma que quando terminar de percorrer a tabela "A" todos os dados localizados em "B" estarão atualizados.

#6 Felipe Pena

Felipe Pena

    O temor do Senhor é o princípio da sabedoria

  • Ex-Admins
  • 6441 posts
  • Sexo:Masculino

Posted 29/09/2009, 22:46

Seus updates estão muito lentos? A documentação do MySQL diz que você pode usar esses hints de índices, porém eles não serão usados em comandos UPDATE.

A instrução que lhe passei anteriormente já faz o "loop" de cada linha da tabela b e tenta encontrar os dados que batam na tabela a, se encontrar ele altera o tipo.
Felipe Pena
[...] ó terra, terra, terra; ouve a palavra do Senhor. — Jeremias 22:29

#7 osvaldo luso

osvaldo luso

    Novato no fórum

  • Usuários
  • 21 posts
  • Sexo:Não informado

Posted 30/09/2009, 01:49

Seus updates estão muito lentos? A documentação do MySQL diz que você pode usar esses hints de índices, porém eles não serão usados em comandos UPDATE.

A instrução que lhe passei anteriormente já faz o "loop" de cada linha da tabela b e tenta encontrar os dados que batam na tabela a, se encontrar ele altera o tipo.



Com seu exemplo o tempo browser utrapassou 60 segundos e programa parou. Com o código abaixo o processamento
foi realizado em 9 segundos pois a localização utilizando indice é mais rapido, cfe doc Mysql:

$rsCheques = $mySQL->sql("SELECT  Banco, Agencia, Numero, Valor FROM A;");    while ($row_rsCheques = mysql_fetch_array($rsCheques))  {          $mySQL->sql("UPDATE B USE INDEX (Procura) SET Tipo = 4  WHERE   Banco = $row_rsCheques[0] AND Agencia = $row_rsCheques[1] AND Numero = $row_rsCheques[2] AND  Valor = $row_rsCheques[3] LIMIT(1);");    }

Desculpe mas gostaria de saber se tem forma ainda mais rápida pois as minhas tabela possuem mais de 60.000 linhas.
e o teste foi realizado com tabela de 30.000 linhas.

#8 Felipe Pena

Felipe Pena

    O temor do Senhor é o princípio da sabedoria

  • Ex-Admins
  • 6441 posts
  • Sexo:Masculino

Posted 30/09/2009, 07:48

Tudo bem, eu sei que o uso de índice otimiza as consultas. Eu só quis dizer que o USE INDEX é inútil em UPDATE (a doc. diz que aceita a sintaxe, mas não tem significado no UPDATE). O que lhe ajudou foi o SELECT para direcionar as possíveis linhas.

O que você pode fazer é melhorar o SELECT, pegando somente os registros que existem em A e B, e que o tipo não seja 4 para fazer o UPDATE.

SELECT B.Banco, B.Agencia, B.Numero, B.Valor
  FROM B FORCE INDEX (Procura)
	STRAIGHT_JOIN A
	ON A.Banco = B.Banco
	  AND A.Agencia = B.Agencia
	  AND A.Numero = B.Numero
	  AND A.Valor = B.Valor
  WHERE B.Tipo <> 4

E claro, se a tabela B é a que tem menos registros, é melhor utilizá-la para fazer a busca. Além do mais, como você está fazendo o UPDATE na B, é melhor guiar-se pela existência de registro nela, não na tabela A. Onde possivelmente está fazendo rodar vários UPDATE que não encontram linha alguma. (Não sei como estão os dados em ambas) Sem falar que você está apenas alterando para um valor fixo. Sem obter qualquer correspondente na outra tabela.
Felipe Pena
[...] ó terra, terra, terra; ouve a palavra do Senhor. — Jeremias 22:29

#9 osvaldo luso

osvaldo luso

    Novato no fórum

  • Usuários
  • 21 posts
  • Sexo:Não informado

Posted 01/10/2009, 00:09

Tudo bem, eu sei que o uso de índice otimiza as consultas. Eu só quis dizer que o USE INDEX é inútil em UPDATE (a doc. diz que aceita a sintaxe, mas não tem significado no UPDATE). O que lhe ajudou foi o SELECT para direcionar as possíveis linhas.

O que você pode fazer é melhorar o SELECT, pegando somente os registros que existem em A e B, e que o tipo não seja 4 para fazer o UPDATE.

SELECT B.Banco, B.Agencia, B.Numero, B.Valor
  FROM B FORCE INDEX (Procura)
	STRAIGHT_JOIN A
	ON A.Banco = B.Banco
	  AND A.Agencia = B.Agencia
	  AND A.Numero = B.Numero
	  AND A.Valor = B.Valor
  WHERE B.Tipo <> 4

E claro, se a tabela B é a que tem menos registros, é melhor utilizá-la para fazer a busca. Além do mais, como você está fazendo o UPDATE na B, é melhor guiar-se pela existência de registro nela, não na tabela A. Onde possivelmente está fazendo rodar vários UPDATE que não encontram linha alguma. (Não sei como estão os dados em ambas) Sem falar que você está apenas alterando para um valor fixo. Sem obter qualquer correspondente na outra tabela.

Gostei da sua sujestão. Vou implementá-la.

Muito obrigado!



#10 RonsisM

RonsisM

    Super Veterano

  • Usuários
  • 15724 posts
  • Sexo:Masculino
  • Localidade:Plovdiv

Posted 26/09/2017, 05:03

Prix Du Cialis 10mg En Pharmacie online pharmacy Propecia Merck Active Ingredient
Cialis With Priligy Pills Propecia New York cialis online Preisvergleich Viagra Generika Best On Line Viagra Sellers Priligy Que Es

#11 Miguceamma

Miguceamma

    MiguPenjisse

  • Usuários
  • 11724 posts

Posted 26/09/2017, 12:22

Can Cephalexin Cure Chlamydia Dutasteride No Doctor Il Cialis Non Fa Effetto buy cialis Walmart Alli 60 Mg Buy Kamagra Oral Jelly Australia

#12 RonsisM

RonsisM

    Super Veterano

  • Usuários
  • 15724 posts
  • Sexo:Masculino
  • Localidade:Plovdiv

Posted 09/10/2017, 23:52

Amoxicillin And Hives Viagra Junge Manner Buy Clomid Online Zest Creative buy viagra No Prescription Levothyroxine Discount Cialis 10mg Forum Tratamiento Propecia
Sky Pharmacy Canada viagra Prezzo Viagra Italia Chewable Visgra Best Prices For Viagra Cialis
100 Mg Viagra Pfizer levitra generico miglior prezzo india Alcool Et Tadalis Sx

#13 RonsisM

RonsisM

    Super Veterano

  • Usuários
  • 15724 posts
  • Sexo:Masculino
  • Localidade:Plovdiv

Posted 25/10/2017, 14:17

Cialis Achat Avis Cialis Preis Preise Triameterene For Sale viagra Vente Propecia Au Canada Worldwide Cheapeast Dutasteride Duagen Buy Oklahoma
Buy Orlistat 60 Mg With No Prescription Propecia Uk 1mg viagra Discount Zentel Where To Order With Next Day Delivery
Levitra Barato Can I Mix Amoxicillin With Water cialis Cialis Once Day Discount Real On Line Elocon Tablet Medicine Overseas Mastercard Propecia Buy Uk

#14 LarPhozyHah

LarPhozyHah

    Super Veterano

  • Usuários
  • 14515 posts
  • Sexo:Masculino
  • Localidade:San Miguel de Tucuman

Posted 27/10/2017, 13:47

Amoxicillin And Hives viagra Kamagra Directions
Levitra Purchase Uk Off Shore Viagra Compare Avelox To Keflex generic viagra Prednisone Orders Canada

#15 Miguceamma

Miguceamma

    MiguPenjisse

  • Usuários
  • 11724 posts

Posted 28/10/2017, 01:39

Propecia Dutasterida Find Stendra Discount With Free Shipping Without Rx viagra Expert Clinic Cialis




1 user(s) are reading this topic

0 membro(s), 1 visitante(s) e 0 membros anônimo(s)

IPB Skin By Virteq