Autor Zpráva
JosPol
Profil
Ahojte,

pokouším se z jedné tabulky doplnit do druhé tabulky data pomocí INNER JOIN. Dotaz se spustí, ale trvá do nekonečna.

TabulkaA (ta, kterou chci doplnit)
adresa_psc | adresa_okres_id | adresa_kraj_id | + dalších x
index nad PSČ, tabulka obsahuje 1 mio. záznamů, vč. duplicitních

TabulkaB (ta, z které doplňuji)
psč | okres_id | kraj_id
index nad všemi, tabulka obsahuje pouze unikátní PSČ = cca 3k záznamů

Páruji podle PSČ a doplňuji okres a kraj do TabulkaA

Použil jsem následující query:
UPDATE tabulkaA INNER JOIN tabulkaB ON tabulkaA.adresa_psc = tabulkaB.psc
SET tabulkaA.adresa_kraj_id = tabulkaB.kraj_id;

Jednou se mi to povedlo (nevím proč a jak), ale u záznamů v tabulceA byly místy zapsány špatné hodnoty.
Dělám to localhostu, mám INNODB.

Nevíte jak z toho?

Doplňující dotazy:
1. Jak při používání JOIN nastavovat správně indexy? Stačí pouze nad párovanými nebo i nad doplňovanými sloupci?
2. Mohu kombinovat v jednom query vícekrát "SET" - tzn. aktualizovat více sloupců najednou nebo je lepší postupně?
3. Má smysl mít čísla v obou tabulkách seřazena vzestupně?

Děkuji mnohokrát.

JP


Částečně se podařilo pomocí:
- sjednocením datových typů u PSČ
- omezení rozsahu (WHERE BETWEEN x AND y), které radil KAJMAN v předchozím dotazu
- a zaindexováním se seřazením ASC
Kajman
Profil
Více sloupců jedním update měnit lze...
SET tabulkaA.adresa_kraj_id = tabulkaB.kraj_id, tabulkaA.adresa_okres_id = tabulkaB.okres_id

U mysql je volba ASC a DESC u indexu ignorována. Tahle databáze umí stejný index číst zepředu i zezadu.

Je možné, že na locale máte pomalé disky nebo jste dal databázi k dispozici v konfiguraci méně paměti. Upravit jeden sloupec v milionu záznamů by nemělo dělat problémy.

Při hromadné úpravě může být lepší zrušit případné indexy nad sloupci adresa_okres_id a adresa_kraj_id v tabulceA a po úpravě je zase vytvořit.
JosPol
Profil
Kajman:
Děkuji. Tedy indexovat pouze to, co se "páruje" nikoli to, co se doplňuje.

Z hlediska výpočetní náročnosti je úprava více sloupců v jednom query totožná / nižší / vyšší?
Keeehi
Profil
JosPol:
Update více sloupců v jednom dotazu bude efektivnější než postupný update více dotazy, kde se mění vždy jen jeden sloupec. To spojování a vyhledání záznamů se totiž provede jen jednou.

Samozřejmě, že update více sloupců je o něco náročnější než update jednoho sloupce, ale samotné přepsání hodnot je řádově jednodušší než ten join.
JosPol
Profil
Keeehi:
Díky za doplnění. Otestoval jsem a máte pravdu :)

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: