- saxus blogja
- A hozzászóláshoz be kell jelentkezni
- 1627 megtekintés
Hozzászólások
De ugye nem ugyanott update-elsz, ahonnan a subquery select-álna?
- A hozzászóláshoz be kell jelentkezni
Subquery-ben szerepel az a tábla, amelyet updatelek. Most *TÉNYLEG* ez lenne a problémája a MySQL-nek?
----------------
Lvl86 Troll, "hobbifejlesztő" - Think Wishfully™
- A hozzászóláshoz be kell jelentkezni
Akkor minek a subselect? Az update WHERE feltetele legyen ugyanaz, mint a subselect WHERE feltetele es kesz.
- A hozzászóláshoz be kell jelentkezni
Hogy mivan?
--
Ki oda vagyik, hol szall a galamb, elszalasztja a kincset itt alant. | Gentoo Portal
- A hozzászóláshoz be kell jelentkezni
Ha egy egy X tablaban akar updatelni olyan sorokat, amelynek az id-je megegyezik az X tablanak az id-t kivalaszto subselectjevel, akkor annak az eredemenye ugyanaz, mintha nem lenne subselect, hanem az update where feltetele ugyanaz lenne, mint a subselect where feltetele.
Matematikaval leirva:
Legyen X az a relacio, ami a tablat leirja.
Legyen S egy predikatum X-en (ez reprezentalja a subselectet). Ekkor az { x : x in X and S(x) } halmaz pont ugyanazokat az elemeket fogja tartalmazni, mint az {x' : x'.id in { x.id : x in X and S(x) } }, ha id egyedi kulcsa a tablanak. Hiszen pontosan ugyanaz az egy db S predikatum vonatkozik X-re mindket esetben, nincs mas feltetel.
- A hozzászóláshoz be kell jelentkezni
UPDATE cucc
SET fooid = null
WHERE cuccid IN (
SELECT cuccid
FROM cucc
LEFT JOIN akarmi ON (cucc.akarmiid = akarmi.akarmiid)
WHERE cucc.valami <> NEHANY_FUGGVENY(akarmi.valami)
)
Ezt hogyan rakom subquery nélkül where-be? Vagy, ha még meg lenne toldva néhány GROUP BY és társaival a subqueryben? (Már többször volt rá szükségem).
----------------
Lvl86 Troll, "hobbifejlesztő" - Think Wishfully™
- A hozzászóláshoz be kell jelentkezni
Ezt nyilvan nem tudod megoldani, fent irtam, hogy az S feltetel X-re vonatkozik, itt ez mar nem igaz, hiszen X LEFT JOIN Y-ra vonatkozik a felteteled. Ezt tenyleg nem tudod atirni.
- A hozzászóláshoz be kell jelentkezni
Ok, lehettem volna egyertelmubb is. Azonban nem ezen van a lenyeg, hogy at lehet-e irni vagy sem*, hanem, hogy miert kezeli ennyire mostohan a subqueryket update eseten a mysql. Syntax errort nem dob ra, elvileg kepes ra, aztan meg latjuk azeredmenyet. Es ez nem az elso eset, hogy mysql+update+subqueryvel szivas van.
* Pl. ha nem kodhoz keszul a query, hanem csak szimplan modositok valamit, csinaok eloszor egy selectet, hogy ellenorizzem, mit fogok modositani es utana akore epitem az updatet, deletet. Ilyenkor edesmindegy, hogy most 0.1 vagy 3 masodpercig fut a query, de az nem, hogy 15 percet elpocsekolok a semmiert.
----------------
Lvl86 Troll, "hobbifejlesztő" - Think Wishfully™
- A hozzászóláshoz be kell jelentkezni
Syntax errort csak akkor kell dobni, ha szintatikailag helytelen amit futtatni akarsz. Ha jól értem, itt nem erről van szó.
- A hozzászóláshoz be kell jelentkezni
Ennyire azért nem egyszerű az a subquery, hogy simán where-be be lehessen rakni. Egy-két másik táblából is húz még adatokat, amely alapján kijön az, hogy mely ID-ket kell updatelni.
----------------
Lvl86 Troll, "hobbifejlesztő" - Think Wishfully™
- A hozzászóláshoz be kell jelentkezni
Az mar mas. Maga a subselect meddig tart? Mert ugye itt most arrol van szo, hogy timeoutolt a szerver, mielott vegzett volna a muvelettel.
- A hozzászóláshoz be kell jelentkezni
1-2 mp.
----------------
Lvl86 Troll, "hobbifejlesztő" - Think Wishfully™
- A hozzászóláshoz be kell jelentkezni
Oracle-ben is szívtam már hasonló miatt (update-ben használt függvényben select ugyanabból a táblából, ha jól rémlik), valamilyen szinten általános lehet a probléma.
- A hozzászóláshoz be kell jelentkezni
Oraclevel (szerencsére) utoljára az egyetemen találkoztam. Eddig sem PostgreSQL, sem MSSQL alatt nem volt ebből problémám.
----------------
Lvl86 Troll, "hobbifejlesztő" - Think Wishfully™
- A hozzászóláshoz be kell jelentkezni
Nem, a subselect-et nem szereti egyaltalan. Nekem egy ilyen subselectes query 200%-on hajtotta a procit es eleg sokaig gondolkodott ugy, hogy a ket query nem is ugyanabbol a tablakbol taplalkozott.
De ez valami bug lesz az 5.1-es MySQL-ben, mert korabban az ilyen query-kkel ha nem is volt nagysagrendekkel gyorsabb (a subselectet a Postgres szereti jobban), de ennyire baja nem volt.
Kotozkodes: s/Mapi/Napi/
--
Ki oda vagyik, hol szall a galamb, elszalasztja a kincset itt alant. | Gentoo Portal
- A hozzászóláshoz be kell jelentkezni
Ez mondjuk ezt vallja magáról: 5.0.51a-24+lenny5-log.
De itt most nem arról van szó, hogy lassabban végzi el, hanem arról, hogy sehogy. Miközben a 400 rekord updateja töredék mp alatt lemegy kigyűjtött ID-kkel.
Typo hiba fixálva.
----------------
Lvl86 Troll, "hobbifejlesztő" - Think Wishfully™
- A hozzászóláshoz be kell jelentkezni
MySQL 5-ben már van multi-table update, próbáld azzal.
- A hozzászóláshoz be kell jelentkezni
sub
- A hozzászóláshoz be kell jelentkezni
+1
- A hozzászóláshoz be kell jelentkezni
Csinálj view táblát a subqueryből.
pch
--
http://www.buster.hu "A" számlázó
--
- A hozzászóláshoz be kell jelentkezni
Egy darab kósza update erejéig? Ez most valami vicc? :)
----------------
Lvl86 Troll, "hobbifejlesztő" - Think Wishfully™
- A hozzászóláshoz be kell jelentkezni
Ez nem fog segiteni. MySQL-nel a view mindig futtatja az alatta levo selectet. A problema a fenti queryvel az, hogy a plan-je DEPENDENT subquery, amit rosszul optimalizal a MySQL, ezert a kulso tablan mindig full scan lesz. A fenti queryt joinra kell atirni ahhoz, hogy normalisan fusson. Az 5.0-s MySQL mar 2009 ota nem tamogatott. Az optimizer 5.6-ban eleg sokat fejlodott, es jol optimalizalja az ilyen queryket is. Az, hogy kozben ilyen hibauzenetet kapsz, valoszinu azt jelenti, hogy valami kegyetlenul el van konfiguralva, es kifutsz a memoriabol. Az error logot kell megnezni mi tortenik, log_warnings=2 is segithet.
- A hozzászóláshoz be kell jelentkezni
Igaz elég régi az írás, de:
MyISAM vagy InnoDB (esetleg más) engine-t használtál a táblákhoz?
Úgy tudom, hogy az InnoDB jobban kezeli a subquery-ket, lehet csak ennyi volt a gond.
- A hozzászóláshoz be kell jelentkezni
Oszinten szolva fogalmam sincs mar. Nem en terveztem a DB-t (kulonben mind InnoDB PostgreSQL lett volna), de amennyire remlik vegyesen volt ossze-vissza, gondolom ahogy esik ugy puffan elv alapjan.
De ha tippelni kellene, InnoDB, mert egy par dolgot mar ujra kellett tervezni benne es szerintem ez is beleesett azok koze. Egyebkent ugyanez a kedves "MySQL has gone away" ugyanugy elojott InnoDB-vel is nekem regen meg csak nem is nagy tablakra is.
----------------
Lvl86 Troll, "hobbifejlesztő" - Think Wishfully™
- A hozzászóláshoz be kell jelentkezni