Krátce jsem psal o JetShowPlan ve svém článku o ladění výkonu dotazu na přístup. Jak jsem psal v tom článku, SQL je deklarativní jazyk. Když píšete dotaz, říkáte databázovému stroji co ty chceš. Databázový stroj rozhoduje jak nejlépe to pro vás splnit. To je obecně dobré, protože optimalizace operací založených na množinách je obtížná a nechat databázový stroj, aby to udělal za vás, vám umožní využít znalosti těch, kteří tomuto konkrétnímu problému věnují svůj život.
Nevýhodou je, že jak se stane černou skříňkou. Vložíte nějaké SQL do černé skříňky a vyjde výsledná sada s hromadou dat. Databázový stroj je extrémně spolehlivý při poskytování přesně těch dat, která jste požadovali. Problém je v tom, že výkon načítání dat může být všude. Aby bylo jasno, špatný výkon není téměř nikdy chybou databázového stroje. Obvykle je problém v tom, že nám chybí index nebo filtrování výsledků funkce VBA nebo spojení dvou propojených tabulek, které jsou uloženy ve fyzicky oddělených umístěních.
Když se objeví tento problém, potřebujeme způsob, jak jej vyřešit. Zadejte JetShowPlan. Představte si to jako speciální šroubovák, který nám umožňuje rozebrat černou skříňku a nahlédnout dovnitř, abychom viděli jak databázový stroj implementuje příkazy SQL, které mu dodáváme. S těmito znalostmi můžeme vyladit SQL, přidat index nebo jinak řešit zdroj našeho úzkého hrdla výkonu.
Začněme.
Registrační klíč
JetShowPlan funguje tak, že zapíše plán dotazů (tj. obsah černé skříňky) do textového souboru vždy, když databázový stroj ACE/Jet spustí jakýkoli dotaz. Tento textový soubor se rychle zaplní. Vytvoření textového souboru vyžaduje prostředky, které dále snižují výkon dotazu. Tuto funkci tedy chceme povolit pouze tehdy, když aktivně řešíme problém.
Protože se jedná o nástroj pro pokročilé uživatele, v uživatelském rozhraní Access není žádné nastavení, které by tento režim povolilo. Jediným způsobem, jak jej zapnout nebo vypnout, je nastavení hodnoty v registru. Hodnota registru odpovídá následujícímu vzoru (text uvnitř složených závorek slouží jako zástupný symbol):
[HKEY_LOCAL_MACHINE\SOFTWARE{\Wow6432Node}\Microsoft\Office\{xx}.0\Access Connectivity Engine\Engines\Debug]
"JETSHOWPLAN"="ON"
Aspekty verze a bitness
Vzor hodnot registru, který jsem ukázal výše, používá nějaký zástupný text k zohlednění rozdílů mezi prostředími Accessu. Text čísla verze \{xx}.0\
by mělo být nahrazeno číslem verze, které odpovídá verzi aplikace Access nainstalované na vašem počítači:
12.0
:Access 200713.0
:přeskočeno, aby nedošlo ke spuštění triskaidekafoby14.0
:Access 201015.0
:Access 201316.0
:Přístup 2016 a 2019
\Wow6432Node
(„Wow“ znamená „Windows 32-bit on Windows 64-bit“) je vyžadován pouze v případě, že používáte 32bitovou verzi Microsoft Access na 64bitové verzi Windows. Pokud jsou Access i Windows 32bitové nebo oba 64bitové, pak je tato „složka“ (nebo „klíč“ v žargonu registru) zbytečná.
Ve formě VBA:
If Is32BitAccess Xor Is32BitWindows Then
IncludeWow6432Key = True
Else
IncludeWow6432Key = False
End If
Například 32bitová instalace aplikace Access 2010 spuštěná v 64bitovém systému Windows by vyžadovala následující položku registru:
[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Office\14.0\Access Connectivity Engine\Engines\Debug]
"JETSHOWPLAN"="ON"
Podobně by 64bitová instalace Accessu 2019 v 64bitovém systému Windows vyžadovala:
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\16.0\Access Connectivity Engine\Engines\Debug]
"JETSHOWPLAN"="ON"
Měl bych také poznamenat, že při prvním vytvoření této položky budete pravděpodobně muset přidat klíč (složku) „Debug“ a název a data hodnoty JETSHOWPLAN.
Zde jsou kroky, jak to udělat:
- Spusťte regedit jako správce
- Přejděte na klávesu "\Engines" podle výše uvedených poznámek
- Klikněte pravým tlačítkem na "\Engines" a zvolte Nový -> Klíč
- Přejmenujte klíč z „Nový klíč #1“ na „Ladit“
Poté budete muset přidat hodnotu řetězce "JETSHOWPLAN" s údaji "ON ", abyste umožnili připojení k showplan.out soubor nebo „VYPNUTO ", abyste zastavili přidávání k souboru.
- Klikněte pravým tlačítkem na klávesu "\Debug" a zvolte Nový -> Hodnota řetězce
- Přejmenujte hodnotu z „Nová hodnota #1“ na „JETSHOWPLAN“
- Klikněte pravým tlačítkem na název hodnoty "JETSHOWPLAN" a zvolte Upravit...
- Nastavte Údaj hodnoty na ZAPNUTO poté klikněte na tlačítko [OK]
Při příštím spuštění nové instance Accessu začne připojovat data k souboru Showplan.out. Žádné instance Accessu, které jsou již spuštěny, když provedete výše uvedené změny, nebudou ovlivněny. Totéž platí, když nastavení vypnete VYPNUTO . Změny se neprojeví, dokud nespustíte nový msaccess.exe instance. Není nutné zavírat existující instance Accessu; je možné mít jednu otevřenou instanci Accessu, která aktivně zapisuje do showplan.out, zatímco jiná instance Access nikoli.
Autohotkey skript
Nebudu lhát; skok do regedit pokaždé, když chci zapnout nebo vypnout JetShowPlan, je nepříjemné. Kdybych to měl udělat, sotva bych se tím obtěžoval. Ale to nemusím! Vytvořil jsem klávesovou zkratku v Autohotkey, která zapíná a vypíná JetShowPlan.
^#q:: ; Ctl + Win + Q (feel free to use your own key combination)
;--== Toggle JETSHOWPLAN ==--
;----- BEGIN CONFIGURATION (make all changes here) -------------
ShowPlanRegView = 64 ; set to 32 for 32-bit Access
ShowPlanKey = SOFTWARE\Microsoft\Office\16.0\Access Connectivity Engine\Engines\Debug ; change 16.0 to match Access version
;----- END CONFIGURATION ---------------------------------------
SetRegView %ShowPlanRegView%
RegRead ShowPlanSetting, HKEY_LOCAL_MACHINE\%ShowPlanKey%, JETSHOWPLAN
If ( ShowPlanSetting = "OFF" ) {
RegWrite REG_SZ, HKEY_LOCAL_MACHINE\%ShowPlanKey%, JETSHOWPLAN, ON
If ErrorLevel
MsgBox Error enabling JetShowPlan. Check permissions on:`n`nHKLM\%ShowPlanKey%`n`nfor user '%A_UserName%'
Else
MsgBox JetShowPlan set to ON
} Else {
RegWrite REG_SZ, HKEY_LOCAL_MACHINE\%ShowPlanKey%, JETSHOWPLAN, OFF
If ErrorLevel
MsgBox Error disabling JetShowPlan. Check permissions on:`n`nHKLM\%ShowPlanKey%`n`nfor user '%A_UserName%'
Else
MsgBox JetShowPlan set to OFF
}
SetRegView Default
Return
Nyní, když chci vyladit své dotazy, stisknu [Ctl] + [Win] + [Q] a zobrazí se okno se zprávou, že „JetShowPlan nastaven na ON“. Až skončím, zavřu Access, stisknu [Ctl] + [Win] + [Q] a zobrazí se "JetShowPlan nastaven na OFF".
Úprava oprávnění
Mám dva různé uživatelské účty Windows:jeden se standardními oprávněními, které používám pro každodenní práci, a druhý s oprávněními správce k instalaci softwaru atd. Toto je běžný osvědčený postup zabezpečení.
Problém je v tom, že klíč registru JetShowPlan je v podregistru HKLM. Ve výchozím nastavení mohou provádět změny hodnot v tomto podregistru pouze správci. To je nepříjemné, protože při pokusu o spuštění skriptu Autohotkey se zobrazí následující chybová zpráva:
Ale nebojte se. Jak naznačuje výše uvedená zpráva, můžeme to opravit. Nejlepší na tom je, že to můžeme usnadnit, aniž bychom snížili naši bezpečnostní pozici. Tady je trik.
- Otevřete regedit jako správce
- Přejděte do \Debug klíč
- Klikněte pravým tlačítkem na \Debug a vyberte Oprávnění...
- Klikněte na tlačítko [Přidat...]
- Zadejte uživatelské jméno z pole zprávy výše („Mike“), klikněte na [Zkontrolovat jména] a poté klikněte na [OK]
- Povolit uživateli [√] "Plnou kontrolu"
- Kliknutím na [OK] uložíte změny
Nyní, když stisknu [Ctl] + [Win] + [Q], zapíná a vypíná JetShowPlan a automaticky aktualizuje registr.
Vyhledání Showplan.out
Access vás neupozorní, kam databázový stroj Jet/ACE připojuje informace o plánu dotazů, když je povolen JetShowPlan. Strávil jsem více času, než jsem chtěl přiznat, hledáním nepoctivé kopie showplan.out . Tato sekce vás zachrání před sdílením tohoto osudu.
Výchozí umístění
První místo, kam se podíváte, je složka Dokumenty aktuálního uživatele. Například mé uživatelské jméno Windows je „Mike“, takže první místo, kde bych očekával, že najdu soubor, je:C:\Users\Mike\Documents\showplan.out
.
Použití CurDir()
Technicky vzato, showplan.out soubor je vytvořen v aktuálním pracovním adresáři. Obvykle je to složka Dokumenty aktuálního uživatele, ale ne vždy. Spolehlivý způsob, jak najít umístění souboru, je použít CurDir() funkce.
Chcete-li otevřít soubor showplan.out (za předpokladu, že jste v registru povolili JetShowPlan), můžete zkopírovat, vložit a spustit následující řádek kódu v bezprostředním okně IDE VBA:
Shell "notepad """ & CurDir & "\showplan.out""", vbNormalFocus
Změna umístění výstupu pomocí ChDir()
Pokud jste z nějakého důvodu chtěli zadat jiné umístění pro showplan.out soubor, můžete to udělat pomocí funkce ChDir(). Tato funkce změní aktuální pracovní adresář. A jak jsem již zmínil dříve, aktuální adresář je místo showplan.out soubor sídlí. Jakmile změníte aktuální pracovní adresář, JetShowPlan začne zapisovat do nové složky; není třeba zavírat a znovu otevírat Access.
Proč byste to mohli chtít udělat? Řekněme, že jste chtěli porovnat tři různé přístupy k získávání stejných dat. Napíšete tři různé dotazy, abyste viděli, jak provedené změny ovlivní plán dotazů. Od showplan.out je tak podrobný, že by bylo hezké mít každý plán dotazů ve vlastním souboru. To usnadní porovnání plánů dotazů. Zde je návod, jak bych to mohl udělat. Prvním krokem je ujistit se, že každá z těchto složek existuje. Potom spusťte následující řádky kódu:
ChDir "C:\Users\Mike\Documents\Showplan\A"
DoCmd.OpenQuery "CollectTax1"
ChDir "C:\Users\Mike\Documents\Showplan\B"
DoCmd.OpenQuery "CollectTax2"
ChDir "C:\Users\Mike\Documents\Showplan\C"
DoCmd.OpenQuery "CollectTax3"
ChDir "C:\Users\Mike\Documents"
Použijte vše, co máte (nebo si to stáhněte, pokud nemáte ještě to nemám)
Zatímco CurDir() vám poskytne definitivní umístění pro nejnovější změny v showplan.out soubor, nemůže vám říci, jaké byly předchozí pracovní adresáře. A pokud jste zavřeli instanci Accessu, která vytvořila showplan.out neexistuje žádná záruka, že příští instance Accessu, kterou otevřete, bude mít stejný aktuální adresář.
Nedávno jsem narazil na šikovnou malou utilitku s názvem „Všechno“. Je to malý spustitelný soubor, který indexuje celý pevný disk během několika sekund. Jakmile je indexování dokončeno, můžete okamžitě vyhledávat soubory nebo složky kdekoli na disku.
Můžete si stáhnout Vše odtud nebo přes Chocolatey:choco install everything
. Otevřete Vše , vyhledejte showplan.out
a za méně než sekundu uvidíte každou instanci showplan.out na vašem počítači spolu s datem poslední změny. Kéž bych měl tento nástroj před lety.
Dávání smyslu Showplan.out
Při prvním otevření showplan.out souboru, očekávejte, že budete zmateni. Je tam hodně textu a hodně z toho je šum. Zde je výňatek ze souboru vygenerovaného při otevření ukázkové databáze Northwind:
Dotazy, které začínají vlnovkou (~
) představují nezpracované SQL, které je uloženo v seznamu vlastností formuláře nebo sestavy a není uloženo jako trvalý objekt QueryDef. Hlavními body zájmu jsou očíslované kroky pro každý dotaz:01)
, 02)
, 03)
atd. Chcete postupovat podle těchto kroků a hledat dobré a špatné příznaky, které by mohly naznačovat, kde jsou problémy.
Pokud je mi známo, neexistuje žádná oficiální dokumentace pro formátování a obsah showplan.out soubor. To je ale v pořádku, protože se nenecháme chytit do detailů. Naším hlavním cílem je identifikovat do očí bijící zjevné problémy a řešit je. Platí zde pravidlo 80/20. Většina zvýšení výkonu bude pocházet z jednoho nebo dvou jednoduchých vylepšení našich dotazů.
Dobrá znamení
To je vše o indexech. Chceme, aby plán dotazů používal indexy, zejména v počátečních krocích vícekrokového dotazu. Dvě různá klíčová slova naznačují, že se používají indexy:index
a rushmore
. Rushmore je kódové označení pro technologii optimalizace dotazů původně vyvinutou společností Fox Software na počátku 80. let. Microsoft koupil společnost v roce 1992 a začlenil technologii do databázového stroje Jet.
Dotazy, které ke zpracování indexů používají technologii Rushmore, běží rychleji než ty, které používají indexy tradičnějším způsobem. Technologie Rushmore lze použít pouze s tabulkami Accessu (místními i propojenými) spolu s propojenými tabulkami FoxPro a dBASE. Rushmore zejména nelze použít s propojenými tabulkami SQL Server. Chcete-li zvýšit výkon propojených tabulek SQL Serveru, je často lepší psát průchozí dotazy, ale to je nad rámec tohoto článku.
Špatné známky
Na showplan.out je třeba sledovat několik špatných znamení soubor. Pouhá přítomnost těchto příznaků nutně neznamená, že existuje problém. To znamená, že pokud řešíte problém s dotazem se slabým výkonem, můžete tato slova považovat za varovné příznaky potenciálních problémů:X-Prod
, scanning
, temp
, temporary
.
X-Prod klíčové slovo se zobrazí, když máte dotaz s kartézským spojením (také známým jako křížové spojení nebo křížový produkt). Obvykle se to stane omylem, když zapomenete spojit dvě tabulky v editoru Query-by-Example (QBE). Výsledkem je, že každý záznam v tabulce 1 se porovná s každým záznamem v tabulce 2. Celkový počet záznamů je součin dvou počtů v tabulce. Pokud tedy tabulka 1 má 7 záznamů a tabulka 2 má 9 záznamů, křížové spojení dvou tabulek vrátí 63 záznamů. Můžete si představit problém, pokud obě tabulky mají tisíce záznamů nebo více.
01) Inner Join table 'Table1' to table 'Table2'
using X-Prod join
Dalším klíčovým slovem, které je třeba sledovat, je skenování . Pokud databázový stroj nemůže použít index k filtrování výsledků, vrátí se ke skenování. To znamená, že musí prozkoumat každý řádek samostatně, aby zjistil, zda splňuje kritéria dotazu. Když toto slovo uvidíte v showplan.out často to znamená, že je potřeba přidat index do skenovaného sloupce. Ale ne vždy! Pro sloupce s nízkou kardinalitou (pouze několik jedinečných hodnot, jako je sloupec stavu), přidání indexu má obvykle malou výhodu. Po přidání je nutné index udržovat. To zpomaluje vkládání a zabírá místo na disku. Pokud je také výkon dotazu přijatelný na produkční data, je přidání indexu do naskenovaného sloupce předčasnou optimalizací (které byste se měli vyhnout).
Nakonec jsou zde teplota a dočasné klíčová slova. Ty naznačují, že databázový stroj musel dočasně provést nějakou operaci. Když vytvoříme a uložíme querydef, tento objekt se uloží s určitými metadaty pro optimalizaci opakovaného provádění. Je zřejmé, že taková metadata se ztratí, když dočasné indexy nebo spojení přejdou mimo rozsah. Tato klíčová slova lze obvykle ignorovat, ale mohou vás nasměrovat správným směrem, pokud narazíte na špatně fungující dotaz bez dalších zjevných nedostatků.
Pro rekapitulaci v příliš zjednodušených termínech:
DOBRÉ > > > > > ŠPATNÉ:
Rushmore> indexy> dočasný/dočasný> skenování> X-Prod
Vlastní jazyk programu Notepad++
Pokud jste četli mé další práce, víte, že mám silné pocity ohledně zvýšení poměru signálu k šumu v programování (a životě obecně). Za tímto účelem jsem vytvořil soubor "User-defined language" v Notepad++, abych přidal zvýraznění syntaxe do showplan.out soubory. Nyní, když otevřu showplan.out soubory, vypadají jako na snímku obrazovky níže. Klíčová slova „DOBRÉ“ jsou obarvena modrým textem a klíčová slova „ŠPATNÁ“ červeně. Toto je příklad toho, jak udělat špatný kód, aby vypadal špatně.
Chcete-li to nastavit, postupujte takto:
- Otevřete Notepad++
- Jazyk -> Jazyk definovaný uživatelem -> Definujte svůj jazyk...
- Klikněte na [Vytvořit nový...]
- Zadejte název:showplan.out
- Klikněte na [OK]
- Přejděte na _| Složka a výchozí|_ karta
- V části „Styl skládání kódu 2“ zadejte
Inputs
pro vstupy Open aEnd inputs
pro Zavřít - Přejděte na kartu _|Seznam klíčových slov|_
- Klikněte na [Styler] pod 1. skupinou a nastavte barvu popředí na červenou
- Do 1. skupiny zadejte následující klíčová slova „ŠPATNÁ“:
temp temporary scanning X-Prod
- Klikněte na [Styler] pod 2. skupinou a nastavte barvu popředí na modrou
- Do 2. skupiny zadejte následující klíčová slova „DOBRÁ“:
rushmore index
- Zadejte Ext.:out
Poslední myšlenky
Na rozdíl od SQL Server vám databázový stroj Jet/ACE neumožňuje přímo upravovat plány provádění dotazů. To znamená, že se můžeme podívat dovnitř černé skříňky s JetShowPlan, ale nemůžeme ji přepojit, aby dělala, co chceme. Místo toho se musíme zaměřit na to, co můžeme ovládat:přesný SQL, který do něj dodáváme, a indexy a vztahy mezi příslušnými tabulkami.
Používání JetShowPlan má krátkodobé i dlouhodobé výhody. Krátkodobě vám tato funkce umožní opravit úzká místa ve vašich aplikacích Access. Z dlouhodobého hlediska získáte vhled do vnitřního fungování Accessu, což vám pomůže vyhnout se úzkým místům.