napsali jsme  slovo odborníka               z pera našich specialistů 

Zde nás najdete - mapa
Najdete nás zde

CHIP 1/2000

Copyright © 1999
KOMIX spol. s r. o.

Architektura WOIS Napsali jsme - obsah Analytické sledování pohledávek

INFORMIX-OnLine Dynamic Server řady 7.X

Hodnocení s odstupem času z hlediska aplikačního programátora

Databázový server firmy Informix řady 7 existuje již několik let. Poslední verze této řady 7.3X je dostupná již téměř rok. Je tedy možné ji s jistým odstupem hodnotit a porovnat s předcházejícími řadami (5 a 6). Určitě lze říci, že tato řada je lepší v mnoha ohledech, mezi kterými bych zdůraznil:

  • rozšířenou funkcionalitu pro aplikační programátory
  • nové možnosti konfigurace
  • podstatně vylepšené monitorování

    Na druhé straně je třeba přiznat, že alespoň pro počáteční období nasazení klade vyšší nároky na administrativu (především znalosti administrátora databázového serveru v oblasti správy systému - UNIXu) - ovšem to je přirozená daň za novou architekturu a vylepšení databázového serveru.

    V následujícím textu bych rád zmínil část některých nových či méně známých (nebo spíš nevyužívaných) postupů, které mohou zkvalitnit aplikace ve výše uvedených oblastech. Všechny příklady jsou odzkoušené v prostředí dbaccess na databázi stores7 anebo sysmaster. Doufám, že následující řádky budou užitečné alespoň pro některé aplikační programátory (pokud zcela nevyhynuli).

    Začátek stránky

    Začneme něčím jednodušším

    Chcete-li spojit dva řetězce do jedoho bez koncových mezer za prvním z nich, využijte funkce TRIM a operátoru zřetězení (“||“) pro následující výběr:

    SELECT TRIM (fname) || “ “ || lname fullname FROM customer;

    Funkce TRIM se výborně hodí také v případě, když třeba skládáte jména adresářů a souborů uložených v databázi nebo sestavujete příkazovou řádku včetně argumentů. Bez funkce TRIM by byly tyto požadavky v uložených procedurách neřešitelné.

    Začátek stránky

    Databáze sysmaster

    Databáze sysmaster je v databázovém systému Informix poměrně dlouho. Její nezveřejněný základ obsahovala již verze 5.X. Přesto se používá poměrně málo, i když obsahuje spoustu užitečných informací, které lze s úspěchem použít v aplikacích. Její schéma (i se stručným popisem) najdete v adresáři $INFORMIXDIR/etc, pod názvem sysmaster.sql. Podrobnější popis některých tabulek a pohledů najdete v manuálu INFORMIX-OnLine Dynamic Server Administrator’s Guide.

    Najdete v ní třeba tabulku sysdatabases se seznamem databází, které jsou v daném serveru vytvořeny, včetně jejich vlastností jako je vlastník, jméno prostoru, ve kterém je databáze umístěna, datum vytvoření a typ logování databáze. Pomocí následujícího příkazu můžete ve vlastní aplikaci vytvořit podobný seznam, jaký poskytuje onmonitor v nabídce Status/Databases:

    SELECT name, (DBINFO (“dbspace”, partnum)), created, is_logging, is_buff_log, is_ansi
       FROM sysmaster:sysdatabases;

    Dáte-li si práci a napíšete uloženou proceduru, která konvertuje hodnoty ze sloupců is_logging, is_buff_log a is_ansi na kódy N, B, U a U*, dostanete výpis zcela shodný s onmonitorem. Velmi podobná je tabulka systabnames, která obsahuje seznam všech tabulek ve všech databázích serveru včetně čísla partnum, které identifikuje tblspace (adresu uložení) tabulky.

    Z tabulky sysptnhdr zase můžete zjistit skutečný počet řádek v tabulce, i když třeba do ní právě teď importujete milióny řádek a ona je zamčena. Je třeba si uvědomit, že počet řádek nrows z tabulky systables je aktualizován až příkazem update statistics, zatímco počet nrows z tabulky sysptnhdr je aktualizován průběžně. Z tabulky sysptnhdr můžete rovněž určit celkový počet tabulce přidělených stránek (nptotal) i počet skutečně použitých stránek (npused). Tabulka sysptnhdr také obsahuje příští přidělené číslo do sloupce SERIAL - serialv. Uvedené údaje můžete jinak zjistit utilitou oncheck (ta se však z aplikace volá podstatně obtížněji):

    SELECT T.tabname, T.nrows, H.nrows, H.nptotal, H.npused, H.serialv
       FROM systables T, sysmaster:sysptnhdr H
       WHERE tabid > 99 AND T.partnum = H.partnum;

    Konfigurační parametry databázového serveru lze přečíst z tabulky sysconfig. Název parametru je cf_name, platná hodnota cf_effective, hodnota parametru při startu serveru cf_original a standardní hodnota (není-li parametr uveden v $INFORMIXDIR/etc/$ONCONFIG) cf_default:

    SELECT cf_name, cf_effective, cf_original, cf_default
       FROM sysmaster:sysconfig

    Velmi jednoduše lze napsat uloženou proceduru, která jako vstupní argument dostane jméno konfiguračního parametru a vrátí jeho platnou hodnotu.

    Začátek stránky

    Funkce DBINFO

    Funkce DBINFO vám umožní přečíst velmi důležité informace, které aplikačním programátorům dlouho chyběly. Určitě mezi ně patří poslední číslo, které server přidělil do sloupce typu SERIAL – legitimní požadavek v uložené proceduře. Porovnejte c_serial, c_max:

    INSERT INTO customer (customer_num, fname, lname) VALUES (0, "Jan", "Sokol");
    SELECT DBINFO (“sqlca.sqlerrd1”) c_serial, MAX (customer_num) c_max
       FROM customer;

    Pomocí funkce DBINFO můžete také určit, kolik řádek jste posledním příkazem SQL zpracovali (vložili, smazali, opravili). Porovnejte c_before, c_plus a c_after:

    SELECT COUNT (*) c_before FROM customer WHERE state = "CO";
    UPDATE customer SET state = "CO" WHERE state = "NJ";
    SELECT DBINFO ('sqlca.sqlerrd2') c_plus, COUNT (*) c_after
       FROM customer WHERE state = "CO";

    Funkce DBINFO umožňuje zjistit i jméno počítače c_dbhost, na kterém běží databázový server, i typ databázového serveru včetně verze c_ver:

    SELECT DBINFO (“dbhostname”) c_dbhost, DBINFO (“version”, “full”) c_ver
       FROM systables T WHERE T.tabid = 1;

    Typ a verzi databázového serveru můžete pomocí funkce DBINFO vypsat i po částech:

    SELECT DBINFO (“version”, “server-type”), DBINFO (“version”, “major”),
      DBINFO (“version”, “minor”), DBINFO (“version”, “os”), DBINFO (“version”, “level”),
       FROM systables T WHERE T.tabid = 1;
    Začátek stránky

    Funkce DBINFO a databáze sysmaster

    Ještě zajímavější informace získáte zapojením funkce DBINFO při čtení sysmaster. K nejdůležitějším informacím, které DBINFO vrací, patří sid (session identifier), který je vstupním klíčem k administrátorským (nejenom) informacím v databázi sysmaster. Podle tohoto klíče můžete například zjistit aktivní otevřenou databázi z tabulky sysopendb (není zveřejněna) včetně spousty zajímavých atributů (typ logování databáze, úroveň izolace procesů, národní prostředí, příznak výlučného otevření databáze):

    SELECT * FROM sysmaster:sysopendb
    WHERE odb_sessionid = DBINFO (“sessionid”) AND odb_iscurrent = “Y”;

    Z pohledu syssession zase můžete přečíst login uživatele username, UID klienta, PID klientského procesu (ne pro vzdálené klienty ve Windows), hostname klienta, jméno terminálu tty (pro znakové klienty):

    SELECT sid, username, uid, pid, hostname, tty
       FROM sysmaster:syssessions WHERE sid = DBINFO (“sessionid”);

    Pro monitorování časově náročných klientských programů se hodí tabulka syssesprof. Z této tabulky lze pro aktuální běh programu (přesněji session) přečíst třeba počet čtení isread, zápisů iswrite, oprav isrewrite a mazání isdelete (v této tabulce je spousta dalších zajímavých údajů):

    SELECT isreads, iswrites, isrewrites, isdeletes
       FROM sysmaster:syssesprof WHERE sid = DBINFO (“sessionid”);

    Funkce DBINFO umožní pro každou tabulku určit jméno dbspace, ve kterém je uložena. První příkaz určí dbspace pro tabulky aktuální databáze a druhý pro všechny tabulky v serveru (a něco navíc):

    SELECT tabname, DBINFO (“dbspace”, partnum)
       FROM systables WHERE tabid > 99 AND tabtype =”'T”;

    SELECT dbsname, tabname, DBINFO (“dbspace”, partnum)
       FROM sysmaster:systabnames;

    Jestliže nechcete nebo nemůžete použít funkci DBINFO, můžete dbspace pro tabulky určit i jiným způsobem:

    SELECT T.tabname, D.name
       FROM systables T, sysmaster:sysdbstab D
       WHERE T.tabtype = "T" AND T.tabid > 99
          AND TRUNC (T.partnum / POW (2, 20)) = D.dbsnum;

    Uvedený příklad vychází ze všeobecně známé skutečnosti, že horních 12 bitů (z celkových 32) čísla tblspace (někdy nazývané partnum) je číslo dbspace, které se nachází v tabulce sysdbstab.

    Začátek stránky

    Pohodlnější zpracování NULL hodnot

    Hodnoty NULL v databázi ztěžují programátorům život. Už jenom proto, že filtr na ně se píše jinak než filtr na ostatní hodnoty (IS [NOT] NULL). Funkce NVL umožňuje nahradit hodnotu NULL ve sloupci libovolného typu za nějakou vhodnou zarážku, kterou lze v klientském programu nebo uložené proceduře lépe zpracovat:

    SELECT fname, lname, NVL (address2, "N/A") FROM customer;

    Uvedené nápady tvoří jen malou část nových možností aplikačních programátorů. Namátkou lze jmenovat:

  • nové vestavěné funkce pro práci s řetězci a časem
  • podmíněné příkazy
  • optimalizační direktivy
  • object-modes a diagnostické tabulky
  • role pro realizaci přístupových práv Ale to už jsou témata pro další článek.

    Martin Lipš, lips@komix.cz

  •  
     
    HOME | O FIRMĚ | SLUŽBY | REFERENCE | NAPSALI JSME | ŠKOLENÍ | SW NÁSTROJE
     
    OBSAH