Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Query ne stigne do kraja da se izvrsi

[es] :: MySQL :: Query ne stigne do kraja da se izvrsi

[ Pregleda: 1959 | Odgovora: 15 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

kiklop74
Darko Miletić
Buenos Aires

Član broj: 78422
Poruke: 569
*.telecentro-reversos.com.ar.

Sajt: ar.linkedin.com/pub/darko..


+13 Profil

icon Query ne stigne do kraja da se izvrsi14.07.2012. u 19:49 - pre 142 meseci
Imam bazu podataka sa tablom koja ima sledeću definiciju:

Code:

CREATE TABLE `context` (
  `id` bigint(10) unsigned NOT NULL AUTO_INCREMENT,
  `contextlevel` bigint(10) unsigned NOT NULL DEFAULT '0',
  `instanceid` bigint(10) unsigned NOT NULL DEFAULT '0',
  `path` varchar(255) DEFAULT NULL,
  `depth` tinyint(2) unsigned NOT NULL DEFAULT '0',
  PRIMARY KEY (`id`),
  UNIQUE KEY `mdl_cont_conins_uix` (`contextlevel`,`instanceid`),
  KEY `mdl_cont_ins_ix` (`instanceid`),
  KEY `mdl_cont_pat_ix` (`path`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8


Tabla ima preko 250000 slogova.

Kada izvršim ovaj upit server počne da ludački jede CPU i posle 10 minuta se izgubi konekcija:

Code:

SELECT ctx.path
FROM context ctx
LEFT JOIN context parent ON ctx.path LIKE CONCAT('%/', parent.id, '/', ctx.id) 
WHERE parent.id IS NULL OR ctx.path <> CONCAT(parent.path, '/', ctx.id)


OS: Windows 7 Prof. 64bit
RAM: 8Gb
MySQL: 5.1.62 GA 64bit
db engine: Innodb

Šta bih mogao dodatno da podesim u my.ini da bih mogao da izvršim ovaj upit?


Tko leti vrijedi
 
Odgovor na temu

bogdan.kecman
Bogdan Kecman
"specialist"
Oracle
srbistan

Član broj: 201406
Poruke: 15887
95.180.61.*

Sajt: mysql.rs


+2377 Profil

icon Re: Query ne stigne do kraja da se izvrsi14.07.2012. u 20:00 - pre 142 meseci
Citat:
kiklop74:
Šta bih mogao dodatno da podesim u my.ini da bih mogao da izvršim ovaj upit?


sta pise u error logu? sort aborted ili nesto drugo? najverovatnije ti rsne zato sto nemas dovoljno mesta na disku za temp fajlove
 
Odgovor na temu

bogdan.kecman
Bogdan Kecman
"specialist"
Oracle
srbistan

Član broj: 201406
Poruke: 15887
95.180.61.*

Sajt: mysql.rs


+2377 Profil

icon Re: Query ne stigne do kraja da se izvrsi14.07.2012. u 20:04 - pre 142 meseci
nadam se da si svestan da je taj upit los i da pravi temp tabelu od 62500000000 slogova koja moze da bude 30 terabajta velika ?! i pri tome ne koristi nikakve indexe
 
Odgovor na temu

kiklop74
Darko Miletić
Buenos Aires

Član broj: 78422
Poruke: 569
*.telecentro-reversos.com.ar.

Sajt: ar.linkedin.com/pub/darko..


+13 Profil

icon Re: Query ne stigne do kraja da se izvrsi14.07.2012. u 20:32 - pre 142 meseci
Svestan sam da je upit los ali moram da ga izvrsim da bih odredio neke stvari.

Prostora na disku ima sasvim dovoljno.

Nema nikakve greske u logu. Samom imam timeout na konekciju posle 600 sekundi. Inače sam koristio MySQL Workbench.

Probao sam i ovu varijantu:

Code:

SELECT ctx.id, ctx.path
FROM mdl_context ctx
LEFT JOIN mdl_context parent ON ctx.path LIKE CONCAT('%/', parent.id, '/', ctx.id) 
WHERE parent.id IS NULL OR ctx.path <> CONCAT(parent.path, '/', ctx.id)


Koja navodno kaže da se koristi index mdl_cont_pat_ix kada uradim explain.




Tko leti vrijedi
 
Odgovor na temu

bogdan.kecman
Bogdan Kecman
"specialist"
Oracle
srbistan

Član broj: 201406
Poruke: 15887
95.180.61.*

Sajt: mysql.rs


+2377 Profil

icon Re: Query ne stigne do kraja da se izvrsi14.07.2012. u 20:37 - pre 142 meseci
imas 30T slobodno na disku?

Izvrsi upit direktno iz mysql klijenta, preskoci workbench, pogledaj error log na mysql serveru, ne error log na workbenchu

uradi copy paste tog explain-a ovde
 
Odgovor na temu

kiklop74
Darko Miletić
Buenos Aires

Član broj: 78422
Poruke: 569
*.telecentro-reversos.com.ar.

Sajt: ar.linkedin.com/pub/darko..


+13 Profil

icon Re: Query ne stigne do kraja da se izvrsi14.07.2012. u 20:45 - pre 142 meseci
Code:

EXPLAIN SELECT ctx.id, ctx.path FROM context ctx 
LEFT JOIN context parent ON ctx.path LIKE CONCAT('%/', parent.id, '/',ctx.id)  
WHERE parent.id IS NULL OR ctx.path <> CONCAT(parent.path, '/', ctx.id);

+----+-------------+--------+-------+---------------+-----------------+---------+------+--------+--------------------------+
| id | select_type | table  | type  | possible_keys | key             | key_len | ref  | rows   | Extra                    |
+----+-------------+--------+-------+---------------+-----------------+---------+------+--------+--------------------------+
|  1 | SIMPLE      | ctx    | index | NULL          | mdl_cont_pat_ix | 768     | NULL | 270617 | Using index              |
|  1 | SIMPLE      | parent | index | NULL          | mdl_cont_pat_ix | 768     | NULL | 270617 | Using where; Using index |
+----+-------------+--------+-------+---------------+-----------------+---------+------+--------+--------------------------+
2 rows in set (0.00 sec)


Sad ću da probam da izvršim query.
Tko leti vrijedi
 
Odgovor na temu

kiklop74
Darko Miletić
Buenos Aires

Član broj: 78422
Poruke: 569
*.telecentro-reversos.com.ar.

Sajt: ar.linkedin.com/pub/darko..


+13 Profil

icon Re: Query ne stigne do kraja da se izvrsi14.07.2012. u 20:51 - pre 142 meseci
Upit se izvršava, mysqld jede 50% cpu


Tko leti vrijedi
 
Odgovor na temu

bogdan.kecman
Bogdan Kecman
"specialist"
Oracle
srbistan

Član broj: 201406
Poruke: 15887
95.180.61.*

Sajt: mysql.rs


+2377 Profil

icon Re: Query ne stigne do kraja da se izvrsi14.07.2012. u 20:53 - pre 142 meseci
vidis da ti kaze da je possible key null i da svaki upit prolazi kroz 270k slogova ... to ti je 17T temp tabela (270k*270k*(256+10)) pogledaj gde ti pokazuje tmpdir u mysql-u i onda pogledaj da li na toj particiji imas 17T slobodno ako ti operativni sistem uopste dozvoli da kreiras toliki fajl
 
Odgovor na temu

bogdan.kecman
Bogdan Kecman
"specialist"
Oracle
srbistan

Član broj: 201406
Poruke: 15887
95.180.61.*

Sajt: mysql.rs


+2377 Profil

icon Re: Query ne stigne do kraja da se izvrsi14.07.2012. u 20:54 - pre 142 meseci
verovatno imas 2 jezgra pa zato trosi samo 50% posto se taj upit izvrsava samo u jednom tredu ..
 
Odgovor na temu

kiklop74
Darko Miletić
Buenos Aires

Član broj: 78422
Poruke: 569
*.telecentro-reversos.com.ar.

Sajt: ar.linkedin.com/pub/darko..


+13 Profil

icon Re: Query ne stigne do kraja da se izvrsi14.07.2012. u 21:04 - pre 142 meseci
Znaci ovo ne moze da se resi upitom. Moracu da napisem neki skript i da samo prosledim jednostavan select.
Tko leti vrijedi
 
Odgovor na temu

bogdan.kecman
Bogdan Kecman
"specialist"
Oracle
srbistan

Član broj: 201406
Poruke: 15887
95.180.61.*

Sajt: mysql.rs


+2377 Profil

icon Re: Query ne stigne do kraja da se izvrsi14.07.2012. u 21:07 - pre 142 meseci
Citat:
kiklop74:
Znaci ovo ne moze da se resi upitom. Moracu da napisem neki skript i da samo prosledim jednostavan select.


vidi sta se desava na disku, da li stvarno zabode resurse (napuni disk) ili je neki drugi problem, koliko ja vidim on tebi kaze "koristim index" i onda kaze isto da ce da trosi 270k slogova * 270k slogova .. ili napisi drugacije upit (like koji pocinje sa % ne moze da koristi index) ili probaj da napravis sam temp tabele koje su undexirane ... pa da radis upit iz tih temp tabela, ili da joinujes te temp tabele .. umesto da radis 270k * 270k slogova (nisam skonto sta ti je ideaja upita .. vidim da ga mnozis samim sobom al ne kapiram uslove)


 
Odgovor na temu

kiklop74
Darko Miletić
Buenos Aires

Član broj: 78422
Poruke: 569
*.telecentro-reversos.com.ar.

Sajt: ar.linkedin.com/pub/darko..


+13 Profil

icon Re: Query ne stigne do kraja da se izvrsi14.07.2012. u 21:21 - pre 142 meseci
Poenta upita je da se odredi da li je ispravna rekurzivna putanja. Svaki slog u ovoj putanji ima neku poziciju u hijerarhiji. Ako je na vrhu onda ce polje parent da bude 0 a polje path ce da ima vrednost /<record id> . Ako je slog unutar hijerarhije onda ce parent da ima vrednost id za slog koji je direktno iznad a sama putanja (path) ce da bude u sledecoj formi: /<root id>/.../<parent>/<id>

E sad zasto je to tako ne bih da ulazim u to jer nisam ja to osmisljavao. Sistem je tako napravljen i sta je tu je. Ovaj ludacki upit ima nameru da odredi da li postoje neki slogovi gde postoji razlika u odnosu na record id, parent i path, odnosno gde je ili path ili parent neispravan.

Ako imas neki bolji predlog samo napred.
Tko leti vrijedi
 
Odgovor na temu

bogdan.kecman
Bogdan Kecman
"specialist"
Oracle
srbistan

Član broj: 201406
Poruke: 15887
95.180.61.*

Sajt: mysql.rs


+2377 Profil

icon Re: Query ne stigne do kraja da se izvrsi14.07.2012. u 21:26 - pre 142 meseci
da bi to odradio ti i moras da prodjes sekvencijalno kroz tabelu bar jednom, ali je fora da za drugi prolaz (za svaki slog iz prvog prolaza) tebi treba jedan ili nijedan slog iz te tabele (ne mozes da imas dva parenta jel tako, znaci ili ces da nadjes parent ili neces) .. na zalost ovaj upit ce za svaki slog ad prodje jos jednom kroz celu tabelu posto mysql nece umeti da iskoristi index...

ili da napravis externo neki skript koji radi prvo select * pa onda za svaki izvrsava po jedan upit (ukupno 270k upita sto bi opet bilo brze negko ovaj jedan ja mislim) ili da spustis to na nivo baze i da napises stored proceduru koaj ce da izvrsi tu pricu (jedan upit, pa kursor koji pici kroz rezultate i pravi dodatne upite) .. bojim se da upit ovako kako je nece zavrsiti u realnom vremenu
 
Odgovor na temu

kiklop74
Darko Miletić
Buenos Aires

Član broj: 78422
Poruke: 569
*.telecentro-reversos.com.ar.

Sajt: ar.linkedin.com/pub/darko..


+13 Profil

icon Re: Query ne stigne do kraja da se izvrsi14.07.2012. u 21:29 - pre 142 meseci
OK, hvala u svakom slucaju. BTW imas li nekih preporuka vezano za cuvanje hijerarhije u tabli? Ima li boljih resenja od ovog sa stringom?
Tko leti vrijedi
 
Odgovor na temu

bogdan.kecman
Bogdan Kecman
"specialist"
Oracle
srbistan

Član broj: 201406
Poruke: 15887
95.180.61.*

Sajt: mysql.rs


+2377 Profil

icon Re: Query ne stigne do kraja da se izvrsi14.07.2012. u 21:41 - pre 142 meseci
Citat:
kiklop74:
imas li nekih preporuka vezano za cuvanje hijerarhije u tabli? Ima li boljih resenja od ovog sa stringom?


sve je bolje od stringa :D

pisao sam ovde na forumu o nested modelu, pogledaj ovde: http://www.elitesecurity.org/p2964587

 
Odgovor na temu

kiklop74
Darko Miletić
Buenos Aires

Član broj: 78422
Poruke: 569
*.telecentro-reversos.com.ar.

Sajt: ar.linkedin.com/pub/darko..


+13 Profil

icon Re: Query ne stigne do kraja da se izvrsi14.07.2012. u 22:47 - pre 142 meseci
Hvala :)
Tko leti vrijedi
 
Odgovor na temu

[es] :: MySQL :: Query ne stigne do kraja da se izvrsi

[ Pregleda: 1959 | Odgovora: 15 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.