viernes, 2 de agosto de 2013

Update en mysql con subconsulta

El problema al que me enfrento es a tener que actualizar un registro en una tabla muy grande, que debe de ser igual que el valor que me devuelve una subconsulta, abajo pongo un ejemplo


update tabla1 set atributo1 = (select valor1 from tblvalores where valor2 = 'XXXXX') where ..........;

La subconsulta devuelve un solo registro para valor1, pero lo que hace es al recorrer toda la tabla1 para cada uno de los registros a actualizar se va a realizar la consulta anterior, haciendo que esto sea menos performante que un update sin la subconsulta, sino que con el valor1 directamente.

Entonces buscando soluciones encontramos  que en un script podemos con @id podemos registrar el valor de la subconsulta y luego hacer el update utilizando este valor.

Ejemplo de como quedaría la consulta de arriba.

select @id:= valor1 from tblvalores where valor2 = 'XXXXX';
update
tabla1 set atributo1 = @id where .......;

Esto es mas performante, ya que en la primer consulta realizamos 2n consultas, mientras que en la segunda n+1.