Změna plánu SQL dotazů vykonávaných z omezení v agendách a číselnících - platí jen pro Firebird a MSSQL

Na začátku je třeba uvést, že níže uvedené je až poslední možností, jak vyřešit urychlení vykoná SQL dotazů. Před použitím vynucení plánu sql serveru musí vždy předcházet:

  1. Ověření vhodnosti používaného omezení. Obvykle pomáhá logické zamyšlení a doplnění případné dodatečné další podmínky, která více omezuje výsledný počet záznamů.

  2. Ověření existence vhodných indexů pro možnost rychlého dohledání vyhledávaných řádků. Ve většině případů je řešením doplnění chybějícího indexu za nejvíce omezující zadané podmínky.

Získat přesný text volaného SQL dotazu, který je volán do databáze je možné zachycením pomocí interní profiler nebo pomocí databázových nástrojů dané databázové platformy.

Ukážeme si postup zachycení volaného SQL dotazu pomocí interního profileru zabudovaného přímo v ABRA Gen:
  1. Před otevřením problémového pomalého místa (vykonáním omezení, změnou filtru), spustíme interní profiler pomocí klávesové zkratky CTRL+ALT+SHIFT+F11 interní profiler.

  2. V otevřeném okně profileru zahájíme profilování tlačítkem Start nebo klávesovou zkratkou CTRL+F1

    Tlačítkem Start zahájíme profilování.

  3. Přepneme se zpět do okna dané agendy provedeme vykonání omezení nebo filtru a počkáme na doběhnutí pomalého dotazu.

  4. Otevřeme znovu profiler pomocí klávesové zkratky CTRL+ALT+SHIFT+F11.

  5. V pravé části si necháme zobrazit jen SQL volání, to se provede volbou filtru v pravé části s obsahem ^PA|^PC

    Zobrazené SQL.

V zobrazených řádcích vidíme pomalé volání a ve spodní části máme možnost si zkopírovat volený SQL dotaz.

Zachycený SQL dotaz ověříme, že může běžet rychleji pokud by byl opatřen vynucením použitím explicitně určeného plánu.

Příklad syntaxe explicitně určeného plánu do SQL dotazu:

databáze Firebird

SELECT … FROM … WHERE … PLAN (A ORDER IA_V03K1VUSVAUOPIQTO4DG5JDNDO) ORDER BY ..

databáze MSSQL

SELECT … FROM … WHERE … ORDER BY .. OPTION (TABLE HINT(A, INDEX(IA_V03K1VUSVAUOPIQTO4DG5JDNDO)))

Vynucení plánu, si ukážeme na příkladu, kdy máme nadefinovaný zakázkový definovatelný číselník s názvem “Prodeje čerpacích stanic“ kde nám uložený filtr s názvem “Nespárované vše“ generuje SQL dotaz, který databázový server nevhodně vykonává a mi máme pro dané SQL lepší plán (výběr vhodnějšího plánu je komplexní úloha a tento návod postup nemá možnost popsat):

  1. V nástroji DynSQLEditor.exe otevřeme uživatelskou definici vybraného definovatelného číselníku.

  2. Upravíme SQL tak, že přidáme šablonu, která dynamicky vkládá SQL fragment do výsledného SQL dotazu.

    Přidáme šablonu, která dynamicky vkládá SQL fragment do výsledného SQL dotazu.

    Pro databázi Firebird přidáme sekci za {WHERE}, pro databázi MSSQL přidáme sekci za {ORDERBY}

    ##QREXPRBEGIN#
    IF({$SQLHINT} <> '', {$SQLHINT}, '')
    ##QREXPREND#

  3. Do seznamu podmínek přidáme textovou podmínku pomocí, které půjde přidat v každém omezení, resp. filtru samostatně změnu používaného plánu.
    Nová podmínku nastavíme následovně:

    Přidáme novou podmínku

    • Typ dat: ctString

    • Nadpis: SQL HINT

    • Speciální parametry:

    • ReplacementLink=True

    • SQLHINT=VALUE;''

    • Zatrhnout Použij v Single záložce

  4. Uložit změny pomocí exportu definice

  5. Spustit danou agendu a v omezení vyplnit novou podmínku SQL hint hodnotou, která se propíše čistě do SQL výsledného dotazu.

    V omezení vyplníme novou podmínku SQL hint

    Výsledkem je upravené finální SQL používající jiný plán.

    Výsledkem je upravené finální SQL používající jiný plán.

Upozornění změna je vhodná jen u předdefinovaných omezení a filtru, kde uživatel již nemění vybrané použité podmínky. Pro jiné podmínky by logicky nemusel vynucený plán být optimální a dotaz by mohl trvat opět velice dlouho.