Dnes: 17. prosince 2017    | Registrace | Hledáme | Redakce | Info | Testy | Školení | Ocenění | Nápověda | Čtenář: nepřihlášen

Rychlé odkazy
  • Hlavní stránka
  • Seznam rubrik
  • Ankety
  • Editoriály
  • TOP 15
  • KONFERENCE 2008
  • KONFERENCE 2007
  • KONFERENCE 2006
  • KONFERENCE 2005
  • KONFERENCE 2004
  • Sborník
  • Testy
  • Virtuální školení
  • Personalizace


  • Hledáte práci?
    Hledáme redaktora - pojďte s námi tvořit Databázový svět!

    Vyhledávání

    Hledej
    na Databázovém světě!



    Rozšířené vyhledávání

    Rubriky
    Aktuality
    Bezpečnost
    Business
    Česká scéna
    Datové sklady
    Dokumentace
    Dotazovací jazyky
    Hardware
    Historie
    Komentáře
    Literatura
    Metodologie
    Nondb
    Open Source
    Poradna
    Produkty
    Případové studie
    Redakce
    Rozhovory
    Standardy
    Technologie
    Tipy - triky
    Tiskové zprávy
    Vývoj
    Vývojové nástroje
    Zajímavosti

    Co je to?
    SQL
    (Structured Query Language)

    Jedná se o neprocedurální jazyk, používaný v databázových technologiích. Počátky tohoto jazyka spadají do druhé poloviny minulého století.

    Akce
    Dynamická Datová Centra
    - na semináři se seznámíte s komplexním řešením a koncepcí Dynamických Datových Center od Fujitsu Siemens Computers se speciálním důrazem na řešení FlexFrame.

    Textová inzerce
    IBPhoenix - Vše o InterBase a Firebirdu.

    Smějete se rádi? - Pak je pro vás Vtipník to pravé!

    Prodejce reklamy - Hledáme schopného prodejce reklamního prostoru, možnost i externí spolupráce.

    Přihlášený čtenář
    Nepřihlášený čtenář

    O portálu
    Databázový svět
    ISSN: 1213-5933

    Web je optimalizován pro rozlišení 1024x768, nicméně kromě větších rozlišení podporujeme i 800x600. Podrobnosti najdete zde.

    Chcete-li mít kdykoliv možnost zkontrolovat obsah našeho portálu, můžete využít podporu rss. Podrobnosti najdete zde.
    Firebird – kompozitní rychlost


    [Tipy - triky] - Dnes se podíváme na podstatu jednoho z dřívějších tipů triků pro zrychlení dotazu na databázové platformě Firebird. Zaměříme se na využití tzv. kompozitních indexů.



    Předpokladem pro použití toho triku je následující situace:

    CREATE TABLE Devices(
      Id  INTEGER PRIMARY KEY
    );
    
    CREATE TABLE Products(
      IdDevice INTEGER 
               FOREIGN KEY 
                 REFERENCES Devices.id
      TDate TIMESTAMP
    );
    
    CREATE INDEX PRODUCTSDEVCNT 
      ON Products(idDevice, tDate);
    CREATE INDEX DESCENDING RODUCTSDEVCNTDESC 
      ON Products(idDevice, tDate);
    

    Úkolem je najít od kdy a do kdy jsou záznamy produktů pro všechna nebo některá zařízení. Původní dotazy by mohly vypadat nějak takto:

    SELECT MIN(eDate) FROM Products
    
    PLAN (PRODUCTS NATURAL)
    
            MIN 
    =========== 
    
    29-JUN-2002 
    
    Current memory = 785252
    Delta memory = -360
    Max memory = 1522140
    Elapsed time= 10.40 sec
    Buffers = 2048
    Reads = 17260
    Writes 0
    Fetches = 4182504
    
    
    SELECT MIN(eDate) FROM Products where idDevice in (8,9)
    
    PLAN (PRODUCTS INDEX (RDB$FOREIGN79,RDB$FOREIGN79))
    
            MIN 
    =========== 
    
    30-JUN-2002 
    
    Current memory = 2702068
    Delta memory = 1916816
    Max memory = 2702068
    Elapsed time= 7.50 sec
    Buffers = 2048
    Reads = 16084
    Writes 0
    Fetches = 1732917
    

    První dotaz by šel zrychlit (velmi podstatně) nadefinováním indexu nad polem tDate, druhý dotaz by to ovšem nezrychlilo, ale jak si ukážeme dále, nebude nutné přidávat další "pomocné" indexy.

    Při hledání rychlejšího řešení použijeme znalosti o tom, jaké hodnoty může nabývat pole idDevice. Tato znalost nám umožní klást dotazy pro konkrétní zařízení takto (viz článek o tom, jak na rychlejší Min a Max):

    SELECT FIRST 1 edate 
      FROM Products WHERE iddevice=1 
      ORDER BY iddevice, edate
    
    PLAN (PRODUCTS ORDER PRODUCTSDEVCNT)
    
          EDATE 
    =========== 
    
    29-JUN-2002 
    
    Current memory = 1841928
    Delta memory = 0
    Max memory = 2756528
    Elapsed time= 0.11 sec
    Buffers = 2048
    Reads = 0
    Writes 0
    Fetches = 247
    

    Zde se nesmíme nechat zmást časem pro jedno zařízení, ale musíme si uvědomit, že příprava dotazu může trvat podstatnou část celkového času. Ideální je, pokud se nám podaří vše vyřešit v SQL bez kódu aplikace a pokud možno i bez úložných procedur, které mají sloužit k uložení logiky a ne drobný optimalizací. Takže je třeba vytvořit ještě vnější smyčku, která proběhne všechna, nebo vybraná zařízení. To uděláme takto:

    SELECT MIN((
      SELECT FIRST 1 edate 
        FROM Products WHERE iddevice=1 
        ORDER BY iddevice, edate ))
      FROM Devices D
    
    PLAN (D NATURAL)
    PLAN (PRODUCTS ORDER PRODUCTSDEVCNT)
    
            MIN 
    =========== 
    
    29-JUN-2002 
    
    Current memory = 1873016
    Delta memory = -1520
    Max memory = 2756528
    Elapsed time= 0.11 sec
    Buffers = 2048
    Reads = 0
    Writes 0
    Fetches = 277
    

    Případně pro vybraná zařízení takto:

    SELECT MIN((
      SELECT FIRST 1 edate 
        FROM Products 
        WHERE iddevice=1 
        ORDER BY iddevice, edate ))
      FROM Devices D 
      WHERE id IN(8,9)
    
    PLAN (D INDEX (RDB$PRIMARY10,RDB$PRIMARY10))
    PLAN (PRODUCTS ORDER PRODUCTSDEVCNT)
    
            MIN 
    =========== 
    
    29-JUN-2002 
    
    Current memory = 1874536
    Delta memory = 1520
    Max memory = 2756528
    Elapsed time= 0.10 sec
    Buffers = 2048
    Reads = 0
    Writes 0
    Fetches = 284
    

    Pokud nám uvedené zrychlení nestačí, tak můžeme sáhnout k ručnímu naplánování dotazu:

    SELECT MIN((
      SELECT FIRST 1 edate 
        FROM Products 
        WHERE iddevice=1 
        PLAN (PRODUCTS ORDER PRODUCTSDEVCNT)
        ORDER BY iddevice, edate ))
      FROM Devices D
    
    PLAN (D NATURAL)
    PLAN (PRODUCTS ORDER PRODUCTSDEVCNT)
    
            MIN 
    =========== 
    
    29-JUN-2002 
    
    Current memory = 818204
    Delta memory = -1056332
    Max memory = 2756528
    Elapsed time= 0.00 sec
    Buffers = 2048
    Reads = 1
    Writes 0
    Fetches = 71
    

    Případně pro vybraná zařízení takto:

    SELECT MIN((
      SELECT FIRST 1 edate 
        FROM Products 
        WHERE iddevice=1 
        PLAN (PRODUCTS ORDER PRODUCTSDEVCNT)
        ORDER BY iddevice, edate ))
      FROM Devices D 
      WHERE id IN(8,9)
      PLAN (D INDEX (RDB$PRIMARY10,RDB$PRIMARY10))
    
    PLAN (D INDEX (RDB$PRIMARY10,RDB$PRIMARY10))
    PLAN (PRODUCTS ORDER PRODUCTSDEVCNT)
    
            MIN 
    =========== 
    
    29-JUN-2002 
    
    Current memory = 819984
    Delta memory = 0
    Max memory = 2756528
    Elapsed time= 0.01 sec
    Buffers = 2048
    Reads = 0
    Writes 0
    Fetches = 96
    

    Trik využívá schopnosti FB rychle prohledávat indexy – pokud dostane „vhodné“ zadání. O vhodné zadání jsme se postarali nahrazením obecného dotazu na první datum, se kterým si FB nevěděl rady rozkladem na dotazy jednotlivých zařízení.

    Tento způsob byl testován na FB 1.5.1. Výsledné časy byly měřeny při 2.1 milionu záznamů na CPU Intel Celeron@550 MHz.

    Prosím podělte se s ostatními o vlastními zkušenostmi s optimalizací dotazů pro (nejen) Firebird, případně se nebojte zeptat, co vás při práci s Firebirdem trápí.

    O autorovi
    Slavomír Skopalík vystudoval kybernetiku na VUT Brno se zaměřením na měření a systémové inženýrství. Podílel se na návrhu tvorbě regresních testů pro Firebird. V současné době je jednatelem firmy Elekt Labs, která se zaměřuje především na dodávky malých informačních systémů s vysokou přidanou hodnotou postavených na SQL databázi Firebird. Autor pracuje s databázemi Interbase a Firebird od roku 1994, posledních pět let především v průmyslu při řešení plánování a monitorování výroby.

    ( Celý článek! | Autor: Slavomír Skopalík | Počet komentářů: 2 | Přidat komentář | Informační e-mailVytisknout článek )

    Vyhledávání
     

    Anketa
    Kolik ročně utratíte za dovolené?

    Nic 
     (1507 hl.)
    Do 1 000,- Kč 
     (1044 hl.)
    Do 10 000,- Kč 
     (978 hl.)
    Do 25 000,- Kč 
     (1347 hl.)
    Do 50 000,- Kč 
     (994 hl.)
    Do 75 000,- Kč 
     (1151 hl.)
    Více než 75 000,- Kč 
     (993 hl.)

    Celkem hlasovalo: 8014


    Poslední komentáře
    frontierd@126.com
    frontierd@126.com
    frontierd@126.com
    c
    http://www.coachoutl

    Newsletter
    Přihlaste si nezávazně - i bez registrace - odběr informačního newsletteru. Podrobné informace najdete zde.

    Emailová adresa:


    Kalendář
    <<  Prosinec  >>
    PoÚtStČtSoNe
        123
    45678910
    11121314151617
    18192021222324
    25262728293031

    Redakci připojuje


    Nejčtenější

    Databáze je prázdná!


    Nejvíce komentářů

    Databáze je prázdná!


    Reklama






    Nenechte si ujít články na dalších webech




    Na této stránce použité názvy programových produktů, firem apod. mohou být ochrannými známkami
    nebo registrovanými ochrannými známkami příslušných vlastníků.

    Databázový svět | dfKlub - digitální fotografie | Vtipník - vtipy přímo k Vám | Reminder - přestaňte zapomínat | Databázový svět

    Copyright (c) 2004 AVRE Publishing, spol. s r.o. Všechna práva vyhrazena