SQL baze podataka - Sponzor: Baze-Podataka.net MySQL, MSSQL, Oracle, Access, ODBC. Ako imate problem brže i preciznije ćete dobiti odgovor ako priložite strukturu tabela ili skript koji kreira tabele i puni ih test podacima umesto što to problem opisujete samo rečima. Sponzor: Baze-Podataka.net - Blog o bazama podataka |
![]() |
|
Alati teme | Način prikaza |
![]() |
#11 |
Boris
Grand Master
Datum učlanjenja: 01.12.2005
Lokacija: Novi Sad
Poruke: 775
Hvala: 5
156 "Hvala" u 2 poruka
![]() ![]() |
![]() Pa da, moze i tako a i bolje je - prvobitno sam uradio isto sto i ti pa sam posle rastavio na dva subselecta, za svaki slucaj
![]()
__________________
"It’s important to have goals when you pet. Otherwise you’re just rubbing another mammal for no reason." - Scott Adams |
![]() |
![]() |
![]() |
#12 |
Dejan Katašić
Wrote a book
Datum učlanjenja: 10.06.2005
Lokacija: Novi Sad
Poruke: 1.017
Hvala: 129
86 "Hvala" u 43 poruka
![]() |
![]() Hm, Stripy, kad si već ostavio ovo, jel možeš malo da rastumačiš ... nemam pojma o "explain plan" komandi, a deluje mi kao korisna stvar.
|
![]() |
![]() |
![]() |
#13 |
Boris
Grand Master
Datum učlanjenja: 01.12.2005
Lokacija: Novi Sad
Poruke: 775
Hvala: 5
156 "Hvala" u 2 poruka
![]() ![]() |
![]() Mene cudi output ove explain komande - nije bio takav kad sam ja poslednji put gledao
![]() Explain komanda pomaze kod optimizacije upita koji se proteze na nekoliko tabela (npr 10) - pokazuje da li se definisani indeksi koriste efikasno, i da li se uopste koriste. Nije zgodno bas otvoriti 10 tabela, i procitati ih od pocetka do kraja u svakom upitu... Upotreba: prefiksujes kompletan SELECT upit sa EXPLAIN i rastumacis tabelu sa rezultatima ![]() Imas vise o tome ovde: http://dev.mysql.com/doc/refman/4.1/en/explain.html
__________________
"It’s important to have goals when you pet. Otherwise you’re just rubbing another mammal for no reason." - Scott Adams |
![]() |
![]() |
![]() |
#14 |
old school
Professional
|
![]() @zextra: Da, pogodio si - nije rijec o MySQL-ovom Explainu, nego o TOAD-ovom za Oracle, posto nemam pri ruci MySQL.
![]() Doduse, to je cisti SQL ... @noviKorisnik: Eto, dao ti je zextra link, pa malo prolistaj... Zna biti jako korisno kod velikih i komplikovanih upita, u kojima imas nekoliko tabela, subselecta i td. |
![]() |
![]() |
![]() |
#15 | |
Ivan Dilber
Sir Write-a-Lot
|
![]() Citat:
Cisto na osnovu neke logike pricam, nisam merio, znaci ne kazem da nisi u pravu, nego me samo zanima da li pricas na osnovu nekog benchmarka ili odokativno?
__________________
Leadership is the art of getting people to want to do what you know must be done. |
|
![]() |
![]() |
![]() |
#16 |
old school
Professional
|
![]() @ivanhoe: Radio sam neke benchmarkove, ali davno jos, na verziji 3.23.*. Ne bi bilo lose uraditi i neki benchmark sa stored procedurom na verziji 5.*, sta kazes? Steta samo sto nemam pri ruci MySQL sa tom verzijom, ali ako ugrabim volje i vremena, sklepacu neki benchmark u vezi doticne situacije: temp tabela vs. subselect.
Mi u firmi radimo iskljucivo na Oracle-u i vrlo rijetko koristimo DDL komande (CREATE temp tabele i DROP temp tabele) u procedurama, osim kad bas moramo. Konkretno, temp tabele koristimo za proces obrade racuna za Telekom Austria, a koji traje nekoliko sati. Zbog intezivnog sortiranja, grupisanja i td., ne smijemo da zatrpamo memoriju (za one koji poznaju Oracle - TEMP tablespace i SGA memorija), nego se sluzimo pomocnim temp tabelama, ali ih ne dropujemo, nego samo uradimo truncate tabele sa opcijom REUSE STORAGE, sto daleko poboljsava performanse cijelog procesa... Iskreno, do sada u praksi jos nikada nisam imao potrebu da radim sa temp tabelama u MySQL-u. Osim toga, zasto kreirati temp tabelu, kad se u novijim verzijama MySQL-a moze koristiti i View, koji je daleko performantniji od kreiranja i brisanja temp tabele? |
![]() |
![]() |
![]() |
#17 |
old school
Professional
|
![]() Evo obavih par testova nabrzaka, da provjerim/dokazem da li je i koliko je brze koristiti podupite (subselects), nego privremene (temporary) tabele...
Kreirao sam dvije procedure - jednu sa privremenim tabelama, a drugu sa podupitom. Osnovna tabela sa podacima se zove table1 i ima polja id, value i descr, pri cemu je value auto_increment. Tu tabelu sam popunio koristeci obicnu proceduru: Kôd:
DELIMITER $$ DROP PROCEDURE IF EXISTS `testDB`.`fill_table1` $$ CREATE PROCEDURE `fill_table1`(INOUT broj_redova INT, OUT poruka VARCHAR(45)) BEGIN -- deklaracija potrebnih varijabli DECLARE v_counter INT DEFAULT 0; DECLARE v_id INT DEFAULT 1; DECLARE v_descr VARCHAR(45); DECLARE v_ostatak INT DEFAULT 1; DECLARE exit HANDLER FOR SQLEXCEPTION ROLLBACK; -- oznacimo pocetak transakcije START TRANSACTION; -- petlja_za_unos_podataka WHILE v_counter < broj_redova DO -- povecaj brojac za 1 SET v_counter = v_counter + 1; -- na osnovu ostatka dobijenog kada brojac podijelimo sa 7, -- odredjivacemo vrijednost v_id, odnosno kolone id: SET v_ostatak = MOD (v_counter, 7); IF v_ostatak = 1 THEN SET v_id = 1; ELSEIF v_ostatak = 2 THEN SET v_id = 2; ELSEIF v_ostatak = 3 THEN SET v_id = 3; ELSEIF v_ostatak = 4 THEN SET v_id = 4; ELSE SET v_id = 5; END IF; -- ovdje vrsimo unos podataka INSERT INTO table1 (id, descr) VALUES (v_id, CONCAT('description var ', v_counter)); -- nakon svakih 100 iteracija (unosa), potvrdi unos sa COMMIT IF MOD (v_counter, 100) = 0 THEN COMMIT; END IF; END WHILE; COMMIT; SET poruka = CONCAT('Ukupno je uneseno ', v_counter, ' redova u tabelu'); END $$ DELIMITER ; Prva procedura sa temp tabelama - proc_temp(): Kôd:
DELIMITER $$ DROP PROCEDURE IF EXISTS `testDB`.`proc_temp` $$ CREATE PROCEDURE `testDB`.`proc_temp` () LANGUAGE SQL NOT DETERMINISTIC READS SQL DATA SQL SECURITY DEFINER BEGIN CREATE TABLE tempdata AS SELECT id, MIN(value) min_value, MAX(value) max_value FROM table1 GROUP BY id ORDER BY id; SELECT t1.id, t1.descr "Description za min", t2.descr "Description za max" FROM table1 t1, table1 t2, tempdata t WHERE t1.id = t.id AND t1.value = t.min_value AND t2.value = t.max_value; DROP TABLE tempdata; END $$ DELIMITER ; Kôd:
DELIMITER $$ DROP PROCEDURE IF EXISTS `testDB`.`proc_subselect` $$ CREATE PROCEDURE `testDB`.`proc_subselect` () LANGUAGE SQL NOT DETERMINISTIC READS SQL DATA SQL SECURITY DEFINER BEGIN SELECT t1.id, t1.descr, t2.descr FROM table1 t1, table1 t2, (select min(value) min_value, max(value) max_value from table1 group by id) sub WHERE t1.id = t2.id AND t1.value = sub.min_value AND t2.value = sub.max_value; END $$ DELIMITER ; Kôd:
mysql> call proc_temp(); +----+--------------------+---------------------+ | id | Description za min | Description za max | +----+--------------------+---------------------+ | 1 | description var 1 | description var 498 | | 2 | description var 2 | description var 499 | | 3 | description var 3 | description var 500 | | 4 | description var 4 | description var 494 | | 5 | description var 5 | description var 497 | +----+--------------------+---------------------+ 5 rows in set (0.05 sec) Query OK, 0 rows affected (0.06 sec) mysql> Kôd:
mysql> call proc_subselect(); +----+-------------------+---------------------+ | id | descr | descr | +----+-------------------+---------------------+ | 1 | description var 1 | description var 498 | | 2 | description var 2 | description var 499 | | 3 | description var 3 | description var 500 | | 4 | description var 4 | description var 494 | | 5 | description var 5 | description var 497 | +----+-------------------+---------------------+ 5 rows in set (0.00 sec) Query OK, 0 rows affected (0.01 sec) mysql> |
![]() |
![]() |
![]() |
Alati teme | |
Način prikaza | |
|
|
![]() |
||||
Tema | Početna poruka teme | Forum | Odgovori | Poslednja poruka |
Složen MySQL upit | Marko Medojevic | SQL baze podataka - Sponzor: Baze-Podataka.net | 2 | 03. 11. 2008. 21:05 |
mysql upit | pele | Sva početnička pitanja | 1 | 14. 08. 2007. 05:13 |
Google, indeksiranje Flash sadržaja i nezgodan klijent... | BRATISLAV | Marketing i SEO | 20 | 22. 01. 2007. 14:59 |
Upit: daj kolonu x ako kolona2 ima vrednost x | Dzordz | SQL baze podataka - Sponzor: Baze-Podataka.net | 2 | 03. 05. 2006. 12:09 |
i opet pitanje za upit | ivanhoe | SQL baze podataka - Sponzor: Baze-Podataka.net | 16 | 24. 02. 2006. 14:40 |