Magamról

Saját fotó
Főiskolai, majd egyetemi diplomamunkáimtól kezdve világ életemben, adatok, adatbázisok, adattárházak (leginkább Oracle) környékén mozogtam. Mostanság adattárházasként, adatbányászként élem napjaimat.

2013. november 23., szombat

SQL-forgatás

.

FELADAT: Adva van egy forrásrendszer, amire töménytelen mennyiségű, különböző komplexitású (pl.: inline view-s) lekérdezéseket írtak eddig üzleti felhasználók. Menetközben elkészült egy adattárház és hozzá egy riporting adatpiac (aminek ez a forrásrendszer csak az egyik forrása) úgy, hogy a forrásrendszer és az adatpiac között VAN egyértelmű leképezés (séma, tábla és mező-szinten, de nyilván más nevekkel). Hogyan könnyítsük meg az üzleti felhasználók életét a riporting adatpiacra való átállásban?

LEHETŐSÉGEK (amik nekem eszembe jutnak):


I. LEHETŐSÉG: CÉLIRÁNYOS SQL-PARSE LIBRARY
(A) ANTLR
http://www.antlr.org/download.html
http://www.antlr3.org/grammar/list.html

Előnye:
- open source (free)
- van oracle nyelvtan hozzá (több is)

Hátránya:
- Kérdés mennyire követődnek le az Oracle SQL-verziók, mennyire megbízhatóan. Éles enterprise könyezetben én szívesebben alapoznék támogatott, aktuálisan követett megoldást.

(B) http://www.sqlparser.com/
Ez ugyan pénzes, de az enterprise verzió is csak 90.000 forint. Nem éppen kibírhatatlan, ha egy Oracle Total Recallt könnyedén ki tudnak csengetni.
Az Oracle-verzió csak 30.000 forint (de az IBM DB2 miatt érdemes az enterprise-ban gondolkodni.
Ez supportos, karbantartott, jó cucc, csak használni kell.

(C) Oracle-specifikus:

Előnye, hogy "ingyen" van, hátránya, hogy azért küzdeni kell vele. ;)

CREATE GLOBAL TEMPORARY TABLE plans AS
SELECT * FROM TABLE(dbms_xplan.display_cursor());

DECLARE
  c NUMBER;
  i VARCHAR2(30);
  l NUMBER;
  stmt VARCHAR2(4000);
BEGIN
  DELETE FROM plans;
  stmt:='SELECT z.* FROM z, skew1 WHERE z.z=skew1.fillblocks';
  l:=LENGTH(stmt);
  c:=dbms_sql.open_cursor();
  dbms_sql.parse (c, stmt,dbms_sql.native);

  SELECT DISTINCT sql_id
  INTO i
  FROM v$open_cursor
  WHERE
    sid IN
    (
      SELECT sid
      FROM v$mystat
    ) AND
    SUBSTR(sql_text,1,l)=SUBSTR(stmt,1,l)
  ;

  INSERT INTO plans
  SELECT *
  FROM TABLE(dbms_xplan.display_cursor(i));

  dbms_output.put_Line ('sql_id:'||i);
END;

(D) Egyéb idevágó okosságok, ha ennyi nem lenne elég :)
Parser for Oracle SQL


II.LEHETŐSÉG: QUERY BUILDER-ES FRONT-END

Ha nem akarunk parse-olgatni, és pláne, ha KEVÉS tábla van, akkor lehetne írni egy checkbox klikkelgető kicsi front-end alkalmazást á lá "SQL-Builder". Ez lehetne limitált vagy teljes funkcionalitású.

Kirakjuk front-endre az ÖSSZES táblát. Be lehet pipálni ki legyen a join-ban, ebből már azonnal kiesik egy működő sql. Persze a front-end alkalmazásunk az oszlop-megfeleltetésekkel is tisztában lehet könnyedén, így a szükséges érdemi felhasználói "where feltételrendszer" is bele konstruálható az output SQL-be. Order by meg könnyedén konstruálható.

Group by-having-es, uniós, hierarchikus, analitikus, etc összetett lekérdezéseket meg rakják össze a felhasználók a front-endből kinyert mozaik darabkákból (feltéve, hogy költségesebb ezt implementálni és jellemzően nem ezek fedik le a felhasználói igények perdöntő részét) .

Teljes funkcionalitás megcélzása esetén, itt is lehet külső "query builder" könyvtárat bevetni, például : Active Query Builder


Ennek a II.lehetőség komoly hátránya, hogy from scratch zöldmezősen kell az sql-eket létrehozni, nem meglévő sql-eket fordít át.

Ilyen alkalmazás szerintem helyes programozási környezete: Free Pascal/Lazarus, és nem lehet túl nagy meló.


Megjegyzés: én alapból nem szeretem a query buidereket, de ennél a topiknál muszáj volt említeni, a minél jobb teljeskörűség érdekében.

III.LEHETŐSÉG: KOPASZ STRING-CSERE, MANUÁLIS PARSE-SZAL

Limited manuális parse (pláne, ha egyszerűek az SQL-ek), stringcserével pl.: tábláknál: "SOURCE" -> "TARGET", esetleg némi case whennel megspékelve.
Tábla alias alapján select-listát módosítása, oszlop-megfeleltetés közbeiktatásával.
Kiegészítve a plusz konstans wherekkel.
Pl.: WHERE DATE '2013-09-30' BETWEEN valid_from AND valid_to

Én ezt a metódust támogatnám legkevésbé, nem véletlen, hogy a végére hagytam..Ez csak erősen limitált tudna lenni, számomra értelmetlen erőforráspocsékolás, kétes várható eredménnyel.A komolyabb hozzáadott értékű korábbi megoldások, alig kerülnek többe.



KONKLÚZIÓ (ÉN SORRENDEM)
(1) www.sqlparser.com
(2) antlr
(3) dbms sql-parse
(4) korlátozott front-end, egyszerű zöldmezős sql-konstruálásra (join-where-ig csak)
(5) teljes active query builderes megoldás
(6) limited manuális SQL-parse

Nincsenek megjegyzések:

Megjegyzés küldése