Access
 sql >> Baza danych >  >> RDS >> Access

JetShowPlan:podkład

Krótko pisałem o JetShowPlan w moim artykule na temat Tuning Access Query Performance. Jak pisałem w tym artykule, SQL jest językiem deklaratywnym. Pisząc zapytanie, informujesz silnik bazy danych co chcesz. Silnik bazy danych decyduje, jak najlepiej zrobić to dla ciebie. Jest to generalnie dobre, ponieważ optymalizacja operacji opartych na zbiorach jest trudna, a pozwolenie, aby silnik bazy danych zrobił to za Ciebie, pozwala wykorzystać wiedzę tych, którzy poświęcają swoje życie temu konkretnemu problemowi.

Minusem jest to, że jak staje się czarną skrzynką. Wrzucasz trochę kodu SQL do czarnej skrzynki, a na wyjściu pojawia się zestaw wyników z mnóstwem danych. Silnik bazy danych jest niezwykle niezawodny w dostarczaniu dokładnie tych danych, o które prosiłeś. Problem polega na tym, że wydajność pobierania danych może być wszędzie. Żeby było jasne, słaba wydajność prawie nigdy nie jest winą silnika bazy danych. Zwykle problem polega na tym, że brakuje nam indeksu lub filtrujemy wynik funkcji VBA lub łączymy dwie połączone tabele, które są przechowywane w fizycznie oddzielnych lokalizacjach.

Kiedy pojawia się ten problem, potrzebujemy sposobu na jego rozwiązanie. Wejdź do JetShowPlan. Pomyśl o tym jako o specjalnym śrubokręcie, który pozwala nam rozebrać czarną skrzynkę i zajrzeć do środka, aby zobaczyć jak silnik bazy danych implementuje polecenia SQL, które go karmimy. Mając tę ​​wiedzę, możemy dostosować SQL, dodać indeks lub w inny sposób zająć się źródłem naszego wąskiego gardła w wydajności.

Zacznijmy.

Klucz rejestru

JetShowPlan działa, zapisując plan zapytania (tj. zawartość czarnej skrzynki) do pliku tekstowego za każdym razem, gdy silnik bazy danych ACE/Jet wykonuje dowolny zapytanie. Ten plik tekstowy szybko się zapełnia. Utworzenie pliku tekstowego wymaga zasobów, które dodatkowo zmniejszają wydajność zapytania. Dlatego chcemy włączyć tę funkcję tylko wtedy, gdy aktywnie rozwiązujemy problem.

Ponieważ jest to narzędzie dla zaawansowanych użytkowników, w interfejsie użytkownika programu Access nie ma ustawienia umożliwiającego włączenie tego trybu. Jedynym sposobem na jego włączenie lub wyłączenie jest ustawienie wartości w rejestrze. Wartość rejestru pasuje do następującego wzorca (tekst w nawiasach klamrowych służy jako symbol zastępczy):

[HKEY_LOCAL_MACHINE\SOFTWARE{\Wow6432Node}\Microsoft\Office\{xx}.0\Access Connectivity Engine\Engines\Debug]
"JETSHOWPLAN"="ON"

Zagadnienia dotyczące wersji i bitowości

Wzorzec wartości rejestru, który pokazałem powyżej, używa tekstu zastępczego, aby uwzględnić różnice między środowiskami Access. Tekst numeru wersji \{xx}.0\ należy zastąpić numerem wersji, który odpowiada wersji programu Access zainstalowanej na twoim komputerze:

  • 12.0 :Dostęp 2007
  • 13.0 :pominięto, aby uniknąć wywołania triskaidekafobów
  • 14.0 :Dostęp 2010
  • 15.0 :Dostęp 2013
  • 16.0 :Dostęp 2016 i 2019

\Wow6432Node („Wow” oznacza „Windows 32-bitowy w 64-bitowym systemie Windows”) jest wymagane tylko w przypadku korzystania z 32-bitowej wersji programu Microsoft Access w 64-bitowej wersji systemu Windows. Jeśli Access i Windows są zarówno 32-bitowe, jak i 64-bitowe, ten „folder” (lub „klucz” w żargonie rejestru) jest niepotrzebny.

W formie VBA:

    If Is32BitAccess Xor Is32BitWindows Then
        IncludeWow6432Key = True
    Else
        IncludeWow6432Key = False
    End If

Na przykład 32-bitowa instalacja programu Access 2010 działająca w 64-bitowym systemie Windows wymagałaby następującego wpisu rejestru:

[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Office\14.0\Access Connectivity Engine\Engines\Debug]
"JETSHOWPLAN"="ON"

Podobnie, 64-bitowa instalacja Access 2019 w 64-bitowym systemie Windows wymagałaby:

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\16.0\Access Connectivity Engine\Engines\Debug]
"JETSHOWPLAN"="ON"

Powinienem również zauważyć, że przy pierwszym utworzeniu tego wpisu prawdopodobnie będziesz musiał dodać klucz (folder) „Debug” oraz nazwę i dane wartości JETSHOWPLAN.

Oto kroki, aby to zrobić:

  1. Uruchom regedit jako administrator
  2. Przejdź do klawisza „\Engines” zgodnie z powyższymi uwagami
  3. Kliknij prawym przyciskiem myszy „\Silniki” i wybierz Nowy -> Klucz
  4. Zmień nazwę klucza z „Nowy klucz nr 1” na „Debugowanie”

Następnie musisz dodać wartość ciągu „JETSHOWPLAN” z danymi „ ”, aby umożliwić dołączanie do showplan.out plik lub „WYŁ ", aby zatrzymać dołączanie do pliku.

  1. Kliknij prawym przyciskiem myszy klucz „\Debug” i wybierz Nowy -> Wartość ciągu
  2. Zmień nazwę wartości z „Nowa wartość nr 1” na „JETSHOWPLAN”
  3. Kliknij prawym przyciskiem myszy nazwę wartości „JETSHOWPLAN” i wybierz Modyfikuj...
  4. Ustaw dane wartości na następnie kliknij przycisk [OK]

Przy następnym uruchomieniu nowego wystąpienia programu Access rozpocznie się dodawanie danych do pliku Showplan.out. Nie będzie to miało wpływu na wszystkie wystąpienia programu Access, które są już uruchomione po wprowadzeniu powyższych zmian. To samo dotyczy sytuacji, gdy wyłączysz ustawienie WYŁ . Zmiany nie zaczną obowiązywać, dopóki nie uruchomisz nowego msaccess.exe instancja. Nie jest konieczne zamykanie istniejących instancji programu Access; możliwe jest posiadanie jednej otwartej instancji Access, która aktywnie pisze do showplan.out, podczas gdy inna instancja Access nie jest.

Skrypt automatycznego klawisza skrótu

nie będę kłamać; skok do regedit za każdym razem, gdy chcę włączyć lub wyłączyć JetShowPlan, jest denerwujące. Gdybym musiał to zrobić, prawie bym się tym nie przejmował. Ale nie muszę tego robić! Stworzyłem skrót klawiszowy w Autohotkey, który włącza i wyłącza 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

Teraz, gdy chcę dostroić moje zapytania, naciskam [Ctl] + [Win] + [Q] i widzę okno komunikatu z napisem „JetShowPlan ustawiony na ON”. Kiedy skończę, zamykam program Access, wciskam [Ctl] + [Win] + [Q] i widzę „JetShowPlan ustawiony na OFF”.

Dostosowywanie uprawnień

Mam dwa różne konta użytkowników systemu Windows:jedno ze standardowymi uprawnieniami, których używam do codziennej pracy, a drugie z uprawnieniami administratora do instalowania oprogramowania itp. Jest to powszechna sprawdzona metoda w zakresie bezpieczeństwa.

Problem polega na tym, że klucz rejestru JetShowPlan znajduje się w gałęzi HKLM. Domyślnie tylko administratorzy mogą wprowadzać zmiany w wartościach w tym gałęzi. Jest to denerwujące, ponieważ kiedy próbuję uruchomić mój skrypt Autohotkey, pojawia się następujący komunikat o błędzie:

Ale nie martw się. Jak sugeruje powyższa wiadomość, możemy to naprawić. Najlepsze jest to, że możemy sprawić, że będzie to wygodne bez zmniejszania naszej postawy bezpieczeństwa. Oto sztuczka.

  1. Otwórz regedit jako administrator
  2. Przejdź do \Debugu klucz
  3. Kliknij prawym przyciskiem myszy \Debuguj i wybierz Uprawnienia...
  4. Kliknij przycisk [Dodaj...]
  5. Wprowadź nazwę użytkownika z okna wiadomości powyżej („Mike”), kliknij [Sprawdź nazwy], a następnie kliknij [OK]
  6. Zezwól [√] na „Pełną kontrolę” dla użytkownika
  7. Kliknij [OK], aby zapisać zmiany

Teraz, gdy naciskam [Ctl] + [Win] + [Q], włącza i wyłącza JetShowPlan, automatycznie aktualizując rejestr.

Znajdowanie Showplan.out

Program Access nie będzie ostrzegał, gdzie aparat bazy danych Jet/ACE dołącza informacje o planie zapytań, gdy JetShowPlan jest włączony. Spędziłem więcej czasu, niż chciałbym przyznać, szukając nieuczciwej kopii showplan.out . Ta sekcja uchroni Cię przed dzieleniem się tym losem.

Domyślna lokalizacja

Pierwszym miejscem do wyszukania jest folder Dokumenty bieżącego użytkownika. Na przykład moja nazwa użytkownika Windows to „Mike”, więc pierwszym miejscem, w którym spodziewałbym się znaleźć plik, jest:C:\Users\Mike\Documents\showplan.out .

Korzystanie z CurDir()

Technicznie rzecz biorąc, showplan.out plik jest tworzony w bieżącym katalogu roboczym. Zwykle jest to folder Dokumenty bieżącego użytkownika, ale nie zawsze. Niezawodnym sposobem na znalezienie lokalizacji pliku jest użycie CurDir() funkcja.

Możesz skopiować, wkleić i wykonać następujący wiersz kodu w bezpośrednim oknie VBA IDE, aby otworzyć plik showplan.out (zakładając, że w rejestrze włączono JetShowPlan):

Shell "notepad """ & CurDir & "\showplan.out""", vbNormalFocus

Zmiana lokalizacji wyjściowej za pomocą ChDir()

Jeśli z jakiegoś powodu chcesz określić inną lokalizację dla showplan.out pliku, możesz to zrobić za pomocą funkcji ChDir(). Ta funkcja zmienia bieżący katalog roboczy. Jak wspomniałem wcześniej, w bieżącym katalogu znajduje się showplan.out plik rezyduje. Gdy tylko zmienisz bieżący katalog roboczy, JetShowPlan rozpocznie zapisywanie do nowego folderu; nie ma potrzeby zamykania i ponownego otwierania programu Access.

Dlaczego chcesz to zrobić? Załóżmy, że chcesz porównać trzy różne podejścia do pobierania tych samych danych. Piszesz trzy różne zapytania, aby zobaczyć, jak wprowadzone zmiany wpływają na plan zapytania. Od showplan.out jest tak gadatliwy, że byłoby miło mieć każdy plan zapytań w osobnym pliku. Ułatwi to porównanie planów zapytań. Oto jak mogłem to zrobić. Pierwszym krokiem jest upewnienie się, że każdy z tych folderów istnieje. Następnie wykonaj następujące wiersze kodu:

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"

Użyj wszystkiego, co masz (lub pobierz to, jeśli nie jeszcze tego nie mam)

Podczas gdy CurDir() poda ostateczną lokalizację dla najnowszych zmian w showplan.out pliku, nie może powiedzieć, jakie były poprzednie katalogi robocze. A jeśli zamkniesz instancję programu Access, która utworzyła showplan.out pliku, nie ma gwarancji, że następna instancja programu Access, którą otworzysz, będzie miała ten sam bieżący katalog.

Niedawno natknąłem się na przydatne małe narzędzie o nazwie „Wszystko”. Jest to mały plik wykonywalny, który indeksuje cały dysk twardy w ciągu zaledwie kilku sekund. Po zakończeniu indeksowania możesz natychmiast wyszukać pliki lub foldery w dowolnym miejscu na dysku.

Możesz pobrać Wszystko stąd lub przez Chocolatey:choco install everything . Otwórz Wszystko , wyszukaj showplan.out i w mniej niż sekundę zobaczysz wszystkie wystąpienia showplan.out na swoim komputerze wraz z datą ostatniej modyfikacji. Chciałbym mieć to narzędzie lata temu.

Zrozumienie Showplan.out

Przy pierwszym otwarciu showplan.out pliku, spodziewaj się, że będziesz zaskoczony. Jest dużo tekstu, a większość z nich to hałas. Oto fragment pliku wygenerowanego podczas otwierania przykładowej bazy danych Northwind:

Zapytania zaczynające się od tyldy (~ ) reprezentują surowy kod SQL, który jest zapisany w arkuszu właściwości formularza lub raportu, a nie jako stały obiekt QueryDef. Główne punkty zainteresowania to ponumerowane kroki dla każdego zapytania:01) , 02) , 03) itp.  Chcesz wykonać te czynności, szukając dobrych i złych znaków, które mogą sugerować, gdzie występują problemy.

O ile mi wiadomo, nie ma oficjalnej dokumentacji dotyczącej formatowania i zawartości showplan.out plik. Ale to jest w porządku, ponieważ nie damy się złapać w drobiazgi. Naszym głównym celem jest zidentyfikowanie rażąco oczywistych problemów i rozwiązanie ich. Tutaj obowiązuje zasada 80/20. Większość wzrostu wydajności będzie wynikać z jednej lub dwóch prostych poprawek w naszych zapytaniach.

Dobre znaki

Tu chodzi o indeksy. Chcemy, aby plan zapytania wykorzystywał indeksy, zwłaszcza w początkowych krokach zapytania wieloetapowego. Dwa różne słowa kluczowe wskazują, że indeksy są używane:index i rushmore . Rushmore to kryptonim technologii optymalizacji zapytań, pierwotnie opracowanej przez Fox Software na początku lat 80-tych. Microsoft kupił firmę w 1992 roku i włączył technologię do silnika bazy danych Jet.

Zapytania wykorzystujące technologię Rushmore do przetwarzania indeksów działają szybciej niż te, które używają indeksów w bardziej tradycyjny sposób. Technologia Rushmore może być używana tylko z tabelami Access (zarówno lokalnymi, jak i połączonymi), wraz z połączonymi tabelami FoxPro i dBASE. Warto zauważyć, że Rushmore nie może być używany z połączonymi tabelami SQL Server. Aby zwiększyć wydajność połączonych tabel SQL Server, często lepiej jest pisać zapytania przekazujące, ale to wykracza poza zakres tego artykułu.

Złe znaki

Na showplan.out jest kilka złych znaków, na które należy zwrócić uwagę plik. Sama obecność tych znaków nie musi oznaczać problemu. To powiedziawszy, jeśli rozwiązujesz problem ze słabą wydajnością, możesz pomyśleć o tych słowach jako o ostrzeżeniach przed potencjalnymi problemami:X-Prod , scanning , temp , temporary .

X-Prod słowo kluczowe pojawia się, gdy masz zapytanie ze sprzężeniem kartezjańskim (znanym również jako sprzężenie krzyżowe lub produkt krzyżowy). Zwykle dzieje się tak przez pomyłkę, gdy zapomnisz połączyć dwie tabele w edytorze kwerendy według przykładu (QBE). W rezultacie każdy rekord w tabeli 1 zostaje dopasowany do każdego rekordu w tabeli 2. Łączna liczba rekordów jest iloczynem liczby dwóch tabel. Tak więc, jeśli tabela 1 zawiera 7 rekordów, a tabela 2 9 rekordów, połączenie krzyżowe dwóch tabel zwraca 63 rekordy. Możesz sobie wyobrazić problem, jeśli obie tabele mają tysiące rekordów lub więcej.

01) Inner Join table 'Table1' to table 'Table2'
      using X-Prod join

Następnym słowem kluczowym, na które należy zwrócić uwagę, jest skanowanie . Jeśli silnik bazy danych nie może użyć indeksu do filtrowania wyników, powróci do skanowania. Oznacza to, że musi zbadać każdy wiersz z osobna, aby sprawdzić, czy spełnia on kryteria zapytania. Gdy zobaczysz to słowo na showplan.out pliku, często oznacza to, że musisz dodać indeks do skanowanej kolumny. Ale nie zawsze! Kolumny o niskiej liczności (tylko kilka unikalnych wartości, takich jak kolumna stanu), zwykle dodanie indeksu ma niewiele zalet. Po dodaniu indeks musi być utrzymany. Spowalnia to wstawianie i zajmuje miejsce na dysku. Ponadto, jeśli wydajność zapytań jest akceptowalna na danych produkcyjnych, dodanie indeksu do skanowanej kolumny jest przedwczesną optymalizacją (czego należy unikać).

Wreszcie są temp i tymczasowe słowa kluczowe. Wskazują one, że silnik bazy danych musiał tymczasowo wykonać jakąś operację. Kiedy tworzymy i zapisujemy querydef, ten obiekt jest zapisywany z pewnymi metadanymi, aby zoptymalizować powtarzalne wykonanie. Oczywiście takie metadane są tracone, gdy tymczasowe indeksy lub łączenia wychodzą poza zakres. Te słowa kluczowe zwykle można zignorować, ale mogą być w stanie wskazać właściwy kierunek, jeśli natkniesz się na słabą skuteczność zapytania bez innych bardziej oczywistych wad.

Podsumowując w uproszczeniu:

      DOBRY  >  >  >  >  >  ZŁY:
Rushmore> indexs> temp/temporary> skanowanie> X-Prod

Niestandardowy język Notepad++

Jeśli czytałeś moje inne prace, wiesz, że mam silne odczucia dotyczące zwiększania stosunku sygnału do szumu w programowaniu (i ogólnie w życiu). W tym celu utworzyłem plik „Język zdefiniowany przez użytkownika” w Notepad ++, aby dodać podświetlanie składni do showplan.out akta. Teraz, gdy otworzę showplan.out pliki, wyglądają jak na poniższym zrzucie ekranu. Słowa kluczowe „DOBRE” są oznaczone kolorem niebieskim, a słowa kluczowe „ZŁE” są oznaczone kolorem czerwonym. To jest przykład, jak sprawić, by zły kod wyglądał źle.

Aby to skonfigurować, wykonaj następujące kroki:

  1. Otwórz Notepad++
  2. Język -> Język zdefiniowany przez użytkownika -> Określ swój język...
  3. Kliknij [Utwórz nowy...]
  4. Wpisz nazwę:showplan.out
  5. Kliknij [OK]
  6. Przejdź do _| Zakładka Folder i domyślne|_
  7. W sekcji „Składanie w stylu kodu 2” wpisz Inputs dla wejść Open i End inputs do zamknięcia
  8. Przejdź do karty _|Lista słów kluczowych|_
  9. Kliknij [Styler] w pierwszej grupie i ustaw kolor pierwszego planu na czerwony
  10. Wprowadź następujące „ZŁE” słowa kluczowe w pierwszej grupie:
    temp temporary scanning X-Prod
  11. Kliknij [Styler] w drugiej grupie i ustaw kolor pierwszego planu na niebieski
  12. Wprowadź następujące „DOBRE” słowa kluczowe w drugiej grupie:
    rushmore index
  13. Wprowadź wew.:wyj

Końcowe przemyślenia

W przeciwieństwie do SQL Server, silnik bazy danych Jet/ACE nie pozwala na bezpośrednią modyfikację planów wykonania zapytań. Oznacza to, że możemy zajrzeć do wnętrza czarnej skrzynki za pomocą JetShowPlan, ale nie możemy go przeprogramować, aby robił to, co chcemy. Zamiast tego musimy skupić się na tym, co możemy kontrolować:dokładnym SQL, którym go dostarczamy, oraz indeksach i relacjach między zaangażowanymi tabelami.

Korzystanie z JetShowPlan przynosi zarówno krótko-, jak i długoterminowe korzyści. W krótkim okresie ta funkcja umożliwia naprawienie wąskich gardeł w aplikacjach programu Access. W dłuższej perspektywie zyskujesz wgląd w wewnętrzne działanie programu Access, co przede wszystkim pomaga uniknąć wąskich gardeł.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. AKTUALIZACJA:Błąd powoduje, że Microsoft Office 365 Build 2105 łamie aplikacje dostępu

  2. Nowe sterowniki dla SQL Server… Co musisz wiedzieć

  3. Najlepsze sposoby na zwiększenie wydajności bazy danych

  4. MayBeSQL już w Microsoft Access!

  5. Czy Twoi pracownicy pracują zdalnie? Oto jak zapewnić bezpieczeństwo danych.