[ vortex77 @ 28.10.2011. 08:18 ] @
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]
[ VladaSu @ 28.10.2011. 10:13 ] @
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)
[ vortex77 @ 28.10.2011. 10:30 ] @
@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.
[ bogdan.kecman @ 28.10.2011. 10:40 ] @
brze ti je da to radis na klijentu nego u bazi
ako bas moras u bazi onda koristi char() a ne varchar()
[ VladaSu @ 28.10.2011. 16:33 ] @
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.
[ bogdan.kecman @ 29.10.2011. 18:58 ] @
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
[ VladaSu @ 29.10.2011. 19:21 ] @
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