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

Procedura Lat2Cir - optimizacija?

[es] :: MySQL :: Procedura Lat2Cir - optimizacija?

[ Pregleda: 2041 | Odgovora: 6 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

vortex77

Član broj: 91694
Poruke: 124
*.static.sbb.rs.



+1 Profil

icon Procedura Lat2Cir - optimizacija?28.10.2011. u 08:18 - pre 152 meseci
Pozdrav svima,

Aplikacija koju razvijam treba da formira izvestaj sa ćiriličnim podacima. U bazi se nalaze podaci koje korisnici mogu uneti i latinično.
Trenutno je "prevodilac" ugradjen u samu aplikaciju i radi konverziju na već pročitanim podacima iz baze. Prosečna obrada je oko 5 min (na tabeli od 40000 slogova sa 30 polja).

Pokušao sam da ceo problem rešim na nivou baznih procedura, ali brzina obrade je i dalje vrlo mala.

Evo i funkcije:

Code:

CREATE DEFINER = `root`@`%` FUNCTION `lat2cyr`(STRING_IN VARCHAR(500))
 RETURNS varchar(500) CHARSET utf8
    DETERMINISTIC
BEGIN
   declare brojac INT DEFAULT 0;
   declare pozicija INT DEFAULT 0;
   declare STRING_OUT VARCHAR(4000);  
   declare latSingle VARCHAR(54) DEFAULT   'ABCČĆDĐEFGHIJKLMNOPRSŠTUVZŽabcčćdđefghijklmnoprsštuvzž';
   declare latDouble VARCHAR(18) DEFAULT    'DžDŽLjLJNjNJdžljnj';
   declare cirSingle VARCHAR(54) DEFAULT   'ABCČĆDĐEFGHIJKLMNOPRSŠTUVZŽabcčćdđefghijklmnoprsštuvzž';
   declare cirDouble VARCHAR(18) DEFAULT    'Dž@Dž@Lj@Lj@Nj@Nj@dž@lj@nj@';

  SELECT STRING_IN INTO STRING_OUT;
  IF ((STRING_OUT = '-') OR (ISNULL(STRING_OUT))) THEN SET STRING_OUT = '';
  ELSE
     WHILE brojac < LENGTH(STRING_OUT) DO 
         SET pozicija = LOCATE(MID(STRING_OUT,brojac+1,2), latDouble COLLATE utf8_bin);      
         IF pozicija <> 0 THEN 
                SET STRING_OUT = REPLACE(STRING_OUT,MID(STRING_OUT,brojac+1,2),MID(cirDouble,pozicija,2) COLLATE utf8_bin);
                SET brojac = brojac + 2;        
         ELSE           
              SET pozicija = LOCATE(MID(STRING_OUT,brojac+1,1), latSingle COLLATE utf8_bin);
              IF pozicija <> 0 THEN 
                   SET STRING_OUT =  REPLACE(STRING_OUT,MID(STRING_OUT,brojac+1,1),MID(cirSingle,pozicija,1) COLLATE utf8_bin);           
                   SET brojac = brojac + 1;
              ELSE  
                    SET brojac = brojac + 1;
              END IF;                   
          END IF; 
     END WHILE;     
     SET STRING_OUT = REPLACE(STRING_OUT,'@','');
   END IF;
   RETURN STRING_OUT;
END;


Da li je moguće optimizovati ovaj kod?


Tnx

[Ovu poruku je menjao vortex77 dana 28.10.2011. u 09:43 GMT+1]
 
Odgovor na temu

VladaSu

Član broj: 31634
Poruke: 1099
*.dynamic.isp.telekom.rs.



+218 Profil

icon Re: Procedura Lat2Cir - optimizacija?28.10.2011. u 10:13 - pre 152 meseci
Napravi dve tabele, Table_lat i Table_cir.
Drugacije neces dobiti poboljsanje, bez obzira da li radio na nivou MySQL-a ili PHP-a.
Mozes da napravis tigger da kada upisujes ili editujes u lat tabelu da ti napise odmah i u cir tabelu. Isto kada brises u lat da izbrise to i u cir tabeli.

Da te pitam kakav je to izvestaj sa 40.000 redova? Mozda koristis 40k slogova za dobijanje rezultata ali cisto sumnjam da prikazujes 40.000 slogova.
Ako je tacno ovo sto predpostavljam onda ti treba ovako nesto:

upit_cir -> convert_to_upit_lat -> izvrsi_upit_lat (nad 40.000 slogova) -> rezultat_lat (recimo 30 slogova) -> convert_to_rezultat_cir (samo 30 slogova)
[Ovu poruku je menjao VladaSu dana 14.06.2003. u 11:22 GMT+1]
 
Odgovor na temu

vortex77

Član broj: 91694
Poruke: 124
*.static.sbb.rs.



+1 Profil

icon Re: Procedura Lat2Cir - optimizacija?28.10.2011. u 10:30 - pre 152 meseci
@VladaSU
Hvala na odgovoru.
Ne, u pitanju je formiranje strukturnog TXT fajla prema specifikaciji korisnika. Podaci se vuku iz tabela i stvarno je potrebno prebaciti svih 40k slogova u txt fajl. Na zalost, nisam u mogucnosti da formiram dodatne tabele, vec sam ogranicen na funkcije i procedure (neke "pravne" peripetije oko admin. baze... znam da je bezveze).

Ono sto me interesuje jeste da li je funkcije nad stringovima koje sam koristio moguce zameniti i da li je moguce deklarisati drukciji tip za "drzanje" slova.
 
Odgovor na temu

bogdan.kecman
Bogdan Kecman
"specialist"
Oracle
srbistan

Član broj: 201406
Poruke: 15887
*.31.24.217.adsl2.beograd.com.

Sajt: mysql.rs


+2377 Profil

icon Re: Procedura Lat2Cir - optimizacija?28.10.2011. u 10:40 - pre 152 meseci
brze ti je da to radis na klijentu nego u bazi
ako bas moras u bazi onda koristi char() a ne varchar()

 
Odgovor na temu

VladaSu

Član broj: 31634
Poruke: 1099
*.dynamic.isp.telekom.rs.



+218 Profil

icon Re: Procedura Lat2Cir - optimizacija?28.10.2011. u 16:33 - pre 152 meseci
Pa onda koristi 2 tabele. Jednu sa latinicom i jednu sa cirilicom i napravio automatiku koja ce da odrzava te dve tabele.
To ce da ti bude najbrze.
[Ovu poruku je menjao VladaSu dana 14.06.2003. u 11:22 GMT+1]
 
Odgovor na temu

bogdan.kecman
Bogdan Kecman
"specialist"
Oracle
srbistan

Član broj: 201406
Poruke: 15887
95.180.41.*

Sajt: mysql.rs


+2377 Profil

icon Re: Procedura Lat2Cir - optimizacija?29.10.2011. u 18:58 - pre 152 meseci
rece covek da "nisam u mogucnosti da formiram dodatne tabele, vec sam ogranicen na funkcije i procedure" ..

UDF koji radi transliteraciju na cirilicu bi ovde bio super resenje kada bolje razmislim :D no ne verujem da ako ti ne daju da dodas tabele da ce da ti dozvole da dodas udf
 
Odgovor na temu

VladaSu

Član broj: 31634
Poruke: 1099
*.dynamic.isp.telekom.rs.



+218 Profil

icon Re: Procedura Lat2Cir - optimizacija?29.10.2011. u 19:21 - pre 152 meseci
Onda mozda moze da doda kolone parent_lang pa ako je parent_lang 0 onda je na latinici ako ima neki broj onda je na cirilici i zna od kojeg je prevod kako bi kod menjanja i brisanja mogao da odradi update parenta. Ovo isto moze triggerima
[Ovu poruku je menjao VladaSu dana 14.06.2003. u 11:22 GMT+1]
 
Odgovor na temu

[es] :: MySQL :: Procedura Lat2Cir - optimizacija?

[ Pregleda: 2041 | Odgovora: 6 ] > FB > Twit

Postavi temu Odgovori

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