Access
 sql >> Teknologi Basis Data >  >> RDS >> Access

JetShowPlan:Sebuah Primer

Saya menulis secara singkat tentang JetShowPlan dalam artikel saya tentang Tuning Access Query Performance. Seperti yang saya tulis di artikel itu, SQL adalah bahasa deklaratif. Saat Anda menulis kueri, Anda memberi tahu mesin basis data apa kamu ingin. Mesin database memutuskan bagaimana terbaik untuk mencapai itu untuk Anda. Ini umumnya baik, karena mengoptimalkan operasi berbasis himpunan itu sulit dan membiarkan mesin database melakukannya untuk Anda memungkinkan Anda memanfaatkan pengetahuan orang-orang yang mengabdikan hidup mereka untuk masalah khusus itu.

Kelemahannya adalah bagaimana menjadi kotak hitam. Anda memasukkan beberapa SQL ke dalam kotak hitam dan keluarlah hasil yang ditetapkan dengan banyak data. Mesin database sangat andal dalam menyediakan data yang Anda minta. Masalahnya adalah bahwa kinerja pengambilan data dapat terjadi di mana-mana. Untuk menjadi jelas, kinerja yang buruk hampir tidak pernah kesalahan mesin database. Biasanya, masalahnya adalah bahwa kita kehilangan indeks atau pemfilteran pada hasil fungsi VBA atau bergabung pada dua tabel tertaut yang disimpan di lokasi yang terpisah secara fisik.

Ketika masalah ini muncul, kita membutuhkan cara untuk memecahkannya. Masukkan JetShowPlan. Anggap ini sebagai obeng khusus yang memungkinkan kita membongkar kotak hitam dan mengintip ke dalamnya untuk melihat bagaimana mesin database mengimplementasikan perintah SQL yang kami berikan. Dengan pengetahuan ini, kita dapat mengubah SQL, menambahkan indeks, atau mengatasi sumber hambatan kinerja kita.

Mari kita mulai.

Kunci Registri

JetShowPlan bekerja dengan menulis rencana kueri (yaitu, isi kotak hitam) ke file teks setiap kali mesin database ACE/Jet mengeksekusi apa saja pertanyaan. File teks ini terisi dengan cepat. Membuat file teks memerlukan sumber daya yang semakin mengurangi kinerja kueri. Jadi, kami hanya ingin mengaktifkan fitur ini ketika kami secara aktif memecahkan masalah.

Karena ini adalah alat untuk pengguna tingkat lanjut, tidak ada pengaturan di antarmuka pengguna Access untuk mengaktifkan mode ini. Satu-satunya cara untuk mengaktifkan atau menonaktifkannya adalah dengan menetapkan nilai di registri. Nilai registri sesuai dengan pola berikut (teks di dalam kurung kurawal berfungsi sebagai pengganti):

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

Pertimbangan versi dan bitness

Pola nilai registri yang saya tunjukkan di atas menggunakan beberapa teks placeholder untuk memperhitungkan perbedaan di antara lingkungan Access. Teks nomor versi \{xx}.0\ harus diganti dengan nomor versi yang sesuai dengan versi Access yang diinstal pada mesin Anda:

  • 12.0 :Akses 2007
  • 13.0 :dilewati untuk menghindari pemicu triskaidekaphobes
  • 14.0 :Akses 2010
  • 15.0 :Akses 2013
  • 16.0 :Akses 2016 &2019

\Wow6432Node ('Wow' adalah singkatan dari "Windows 32-bit pada Windows 64-bit") hanya diperlukan jika Anda menjalankan Microsoft Access versi 32-bit pada Windows versi 64-bit. Jika Access dan Windows keduanya 32-bit atau keduanya 64-bit, maka "folder" (atau "kunci" dalam jargon registri) tidak diperlukan.

Dalam bentuk VBA:

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

Misalnya, penginstalan Access 2010 32-bit yang berjalan di Windows 64-bit akan memerlukan entri registri berikut:

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

Demikian juga, penginstalan Access 2019 64-bit pada Windows 64-bit akan memerlukan:

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

Saya juga harus mencatat bahwa pertama kali Anda membuat entri ini, Anda mungkin perlu menambahkan kunci (folder) "Debug" dan nama serta data nilai JETSHOWPLAN.

Berikut langkah-langkah untuk melakukannya:

  1. Jalankan regedit sebagai administrator
  2. Navigasikan ke tombol "\Engines" mengikuti catatan di atas
  3. Klik kanan "\Engines" dan pilih Baru -> Kunci
  4. Ganti nama kunci dari "Kunci Baru #1" menjadi "Debug"

Kemudian, Anda perlu menambahkan nilai string "JETSHOWPLAN" dengan Data "ON " untuk mengaktifkan penambahan ke showplan.out file atau "MATI " untuk berhenti menambahkan ke file.

  1. Klik kanan tombol "\Debug" dan pilih Baru -> Nilai String
  2. Ganti nama nilai dari "Nilai Baru #1" menjadi "JETSHOWPLAN"
  3. Klik kanan nama nilai "JETSHOWPLAN" dan pilih Ubah...
  4. Setel data Nilai ke AKTIF lalu klik tombol [OK]

Saat berikutnya Anda memulai instance baru Access, itu akan mulai menambahkan data ke file Showplan.out. Setiap instance Access yang sudah berjalan saat Anda membuat perubahan di atas tidak akan terpengaruh. Hal yang sama berlaku saat Anda mengubah setelan MATI . Perubahan tidak berlaku sampai Anda memulai msaccess.exe baru contoh. Tidak perlu menutup instance Access yang ada; dimungkinkan untuk memiliki satu instance Access terbuka yang secara aktif menulis ke showplan.out sementara instance Access yang berbeda tidak.

skrip Autohotkey

Saya tidak akan berbohong; melompat ke regedit setiap kali saya ingin MENGAKTIFKAN atau MATI JetShowPlan mengganggu. Jika saya harus melakukan itu, saya tidak akan repot-repot. Tapi aku tidak perlu melakukan itu! Saya membuat hotkey di Autohotkey yang mengaktifkan dan menonaktifkan 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

Sekarang ketika saya ingin menyetel kueri saya, saya menekan [Ctl] + [Win] + [Q] dan saya melihat kotak pesan yang mengatakan "JetShowPlan disetel ke ON". Setelah selesai, saya menutup Access, tekan [Ctl] + [Win] + [Q] dan saya melihat "JetShowPlan disetel ke OFF".

Menyesuaikan izin

Saya memiliki dua akun pengguna Windows yang berbeda:satu dengan izin standar yang saya gunakan untuk pekerjaan sehari-hari dan satu lagi dengan izin administrator untuk menginstal perangkat lunak, dll.  Ini adalah praktik terbaik keamanan umum.

Masalahnya adalah kunci registri JetShowPlan ada di sarang HKLM. Secara default, hanya administrator yang dapat membuat perubahan pada nilai dalam sarang tersebut. Ini menjengkelkan karena ketika saya mencoba menjalankan skrip Autohotkey saya, saya mendapatkan pesan kesalahan berikut:

Tidak perlu khawatir. Seperti yang disarankan oleh pesan di atas, kami dapat memperbaikinya. Bagian terbaiknya adalah kita bisa membuatnya nyaman tanpa mengurangi postur keamanan kita. Berikut triknya.

  1. Buka regedit sebagai administrator
  2. Navigasi ke \Debug kunci
  3. Klik kanan pada \Debug kunci dan pilih Izin...
  4. Klik tombol [Tambah...]
  5. Masukkan nama pengguna dari kotak pesan di atas ('Mike'), klik [Periksa Nama], lalu klik [OK]
  6. Izinkan [√] "Kontrol Penuh" untuk pengguna
  7. Klik [OK] untuk menyimpan perubahan

Sekarang ketika saya menekan [Ctl] + [Win] + [Q], JetShowPlan ON dan OFF, memperbarui registri secara otomatis.

Menemukan Showplan.out

Access tidak akan memberi tahu Anda di mana mesin database Jet/ACE menambahkan informasi rencana kueri saat JetShowPlan diaktifkan. Saya telah menghabiskan lebih banyak waktu daripada yang saya akui untuk mencari salinan nakal showplan.out . Bagian ini akan menyelamatkan Anda dari berbagi nasib itu.

Lokasi default

Tempat pertama yang harus dilihat adalah di folder Documents pengguna saat ini. Misalnya, nama pengguna Windows saya adalah "Mike", jadi tempat pertama yang saya harapkan untuk menemukan file tersebut adalah:C:\Users\Mike\Documents\showplan.out .

Menggunakan CurDir()

Secara teknis, showplan.out file dibuat di direktori kerja saat ini. Itu biasanya folder Dokumen pengguna saat ini, tetapi tidak selalu. Cara yang sangat mudah untuk menemukan lokasi file adalah dengan menggunakan CurDir() fungsi.

Anda dapat menyalin, menempel, dan mengeksekusi baris kode berikut di jendela langsung VBA IDE untuk membuka file showplan.out (dengan asumsi Anda telah mengaktifkan JetShowPlan di registri):

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

Mengubah lokasi keluaran melalui ChDir()

Jika karena alasan tertentu Anda ingin menentukan lokasi yang berbeda untuk showplan.out file, Anda dapat melakukannya menggunakan fungsi ChDir(). Fungsi itu mengubah direktori kerja saat ini. Dan, seperti yang saya sebutkan sebelumnya, direktori saat ini adalah tempat showplan.out file berada. Segera setelah Anda mengubah direktori kerja saat ini, JetShowPlan mulai menulis ke folder baru; tidak perlu menutup dan membuka kembali Access.

Mengapa Anda ingin melakukan ini? Katakanlah Anda ingin membandingkan tiga pendekatan berbeda untuk mengambil data yang sama. Anda menulis tiga kueri berbeda untuk melihat bagaimana perubahan yang Anda buat memengaruhi rencana kueri. Sejak showplan.out sangat bertele-tele, akan menyenangkan untuk memiliki setiap rencana kueri dalam filenya sendiri. Ini akan membuat rencana kueri lebih mudah untuk dibandingkan. Inilah cara saya bisa melakukannya. Langkah pertama adalah memastikan masing-masing folder ini ada. Kemudian, jalankan baris kode berikut:

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"

Gunakan Semua yang Anda miliki (atau unduh jika tidak 'belum memilikinya)

Sementara CurDir() akan memberi Anda lokasi pasti untuk perubahan terbaru pada showplan.out file, itu tidak dapat memberi tahu Anda apa direktori kerja sebelumnya. Dan, jika Anda telah menutup instance Access yang membuat showplan.out file, tidak ada jaminan bahwa instance Access berikutnya yang Anda buka akan memiliki direktori saat ini yang sama.

Saya baru-baru ini menemukan utilitas kecil yang berguna yang disebut "Semuanya." Ini adalah executable kecil yang mengindeks seluruh hard drive Anda hanya dalam beberapa detik. Setelah pengindeksan selesai, Anda dapat langsung mencari file atau folder di mana saja di drive Anda.

Anda dapat mengunduh Semuanya dari sini atau melalui Chocolatey:choco install everything . Buka Semuanya , cari showplan.out , dan dalam waktu kurang dari satu detik Anda akan melihat setiap contoh showplan.out di komputer Anda bersama dengan tanggal modifikasi terakhir. Saya berharap saya memiliki alat ini bertahun-tahun yang lalu.

Memahami Showplan.out

Pertama kali Anda membuka showplan.out file, berharap akan bingung. Ada banyak teks dan sebagian besar adalah noise. Berikut kutipan dari file yang dihasilkan ketika saya membuka database sampel Northwind:

Kueri yang dimulai dengan tilde (~ ) mewakili SQL mentah yang disimpan di Lembar Properti formulir atau laporan dan tidak disimpan sebagai objek QueryDef permanen. Poin utama yang menarik adalah langkah-langkah bernomor untuk setiap kueri:01) , 02) , 03) , dll.  Anda ingin mengikuti langkah-langkah berikut untuk mencari pertanda baik dan pertanda buruk yang mungkin menunjukkan adanya masalah.

Sepengetahuan saya, tidak ada dokumentasi resmi untuk format dan konten showplan.out mengajukan. Tidak apa-apa, karena kita tidak akan terjebak dalam hal-hal kecil. Tujuan utama kami adalah untuk mengidentifikasi masalah yang sangat jelas dan mengatasinya. Aturan 80/20 berlaku di sini. Sebagian besar peningkatan kinerja akan datang dari satu atau dua penyesuaian sederhana pada kueri kami.

Pertanda baik

Ini semua tentang indeks. Kami ingin rencana kueri menggunakan indeks, terutama di langkah awal kueri multi-langkah. Dua kata kunci yang berbeda menunjukkan bahwa indeks sedang digunakan:index dan rushmore . Rushmore adalah nama kode untuk teknologi pengoptimalan kueri yang awalnya dikembangkan oleh Fox Software pada awal 1980-an. Microsoft membeli perusahaan tersebut pada tahun 1992 dan memasukkan teknologi tersebut ke dalam mesin database Jet.

Kueri yang menggunakan teknologi Rushmore untuk memproses indeks berjalan lebih cepat daripada kueri yang menggunakan indeks dengan cara yang lebih tradisional. Teknologi Rushmore hanya dapat digunakan dengan tabel Access (baik lokal maupun tertaut), bersama dengan tabel FoxPro dan dBASE yang ditautkan. Khususnya, Rushmore tidak dapat digunakan dengan tabel SQL Server tertaut. Untuk meningkatkan kinerja tabel SQL Server tertaut, Anda sering kali lebih baik menulis kueri terusan, tetapi itu di luar cakupan artikel ini.

Pertanda buruk

Ada beberapa tanda buruk yang harus diperhatikan di showplan.out mengajukan. Kehadiran sederhana dari tanda-tanda ini tidak selalu berarti ada masalah. Karena itu, jika Anda memecahkan masalah kueri dengan kinerja buruk, Anda dapat menganggap kata-kata ini sebagai tanda peringatan untuk potensi masalah:X-Prod , scanning , temp , temporary .

Prod X kata kunci muncul ketika Anda memiliki kueri dengan gabungan Cartesian (juga dikenal sebagai gabungan silang atau produk silang). Ini biasanya terjadi karena kesalahan saat Anda lupa menggabungkan dua tabel di editor Query-by-Example (QBE). Hasilnya adalah setiap record di tabel 1 dicocokkan dengan setiap record di tabel 2.  Jumlah total record adalah perkalian dari dua jumlah tabel. Jadi, jika tabel 1 memiliki 7 record dan tabel 2 memiliki 9 record, gabungan silang dari kedua tabel menghasilkan 63 record. Anda dapat membayangkan masalah jika kedua tabel memiliki ribuan record atau lebih.

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

Kata kunci berikutnya yang harus diperhatikan adalah memindai . Jika mesin basis data tidak dapat menggunakan indeks untuk memfilter hasil, mesin basis data akan kembali ke pemindaian. Ini berarti bahwa ia harus memeriksa setiap baris satu per satu untuk melihat apakah memenuhi kriteria kueri. Saat Anda melihat kata ini di showplan.out file, itu sering berarti Anda perlu menambahkan indeks ke kolom yang sedang dipindai. Tapi tidak selalu! Untuk kolom dengan kardinalitas rendah (hanya beberapa nilai unik, seperti kolom status), biasanya ada sedikit keuntungan untuk menambahkan indeks. Setelah ditambahkan, indeks harus dipertahankan. Ini memperlambat sisipan dan menghabiskan ruang disk. Selain itu, jika kinerja kueri dapat diterima pada data produksi, maka menambahkan indeks ke kolom yang dipindai adalah pengoptimalan prematur (yang harus Anda hindari).

Terakhir, ada temp dan sementara kata kunci. Ini menunjukkan bahwa mesin database harus melakukan beberapa jenis operasi secara sementara. Saat kami membuat dan menyimpan querydef, objek tersebut disimpan dengan metadata tertentu untuk mengoptimalkan eksekusi berulang. Jelas, metadata tersebut hilang ketika indeks atau gabungan sementara keluar dari ruang lingkup. Kata kunci ini biasanya dapat diabaikan, tetapi mungkin dapat mengarahkan Anda ke arah yang benar jika Anda menemukan kueri berkinerja buruk tanpa cacat lain yang lebih jelas.

Untuk meringkas dalam istilah yang terlalu disederhanakan:

      BAIK  >  >  >  >  >  BURUK:
Rushmore> indeks> temp/sementara> pemindaian> X-Prod

Bahasa khusus Notepad++

Jika Anda telah membaca karya saya yang lain, Anda tahu bahwa saya memiliki perasaan yang kuat untuk meningkatkan rasio Signal to Noise dalam pemrograman (dan kehidupan secara umum). Untuk tujuan ini, saya membuat file "Bahasa yang ditentukan pengguna" di Notepad++ untuk menambahkan penyorotan sintaks ke showplan.out file. Sekarang, ketika saya membuka showplan.out file, mereka terlihat seperti tangkapan layar di bawah ini. Kata kunci "BAIK" diwarnai dengan teks biru dan kata kunci "BURUK" diwarnai dengan teks merah. Ini adalah contoh Membuat Kode Yang Salah Terlihat Salah.

Untuk menyiapkannya, ikuti langkah-langkah berikut:

  1. Buka Notepad++
  2. Bahasa -> Bahasa Buatan Pengguna -> Tentukan bahasa Anda...
  3. Klik [Buat Baru...]
  4. Masukkan Nama:showplan.out
  5. Klik [Oke]
  6. Buka _| Folder &Default|_ tab
  7. Di bawah "Folding in code 2 style" masukkan Inputs untuk Buka dan End inputs untuk Tutup
  8. Buka tab _|Daftar Kata Kunci|_
  9. Klik [Styler] di bawah grup pertama dan atur warna Foreground menjadi merah
  10. Masukkan kata kunci "BURUK" berikut di grup pertama:
    temp temporary scanning X-Prod
  11. Klik [Styler] di bawah grup ke-2 dan atur warna Foreground menjadi biru
  12. Masukkan kata kunci "BAIK" berikut di grup ke-2:
    rushmore index
  13. Masukkan Ext.:keluar

Pemikiran terakhir

Tidak seperti SQL Server, mesin database Jet/ACE tidak mengizinkan Anda untuk secara langsung mengubah rencana eksekusi kueri. Itu berarti kita dapat melihat ke dalam kotak hitam dengan JetShowPlan, tetapi kita tidak dapat menghubungkannya kembali untuk melakukan apa yang kita inginkan. Sebaliknya, kita harus fokus pada apa yang dapat kita kendalikan:SQL yang tepat yang kita berikan dan indeks serta hubungan di antara tabel yang terlibat.

Menggunakan JetShowPlan memiliki manfaat jangka pendek dan jangka panjang. Dalam jangka pendek, fitur ini memungkinkan Anda memperbaiki kemacetan di aplikasi Access Anda. Dalam jangka panjang, Anda mendapatkan wawasan tentang cara kerja Access yang membantu Anda menghindari kemacetan.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Mengatur Izin Akses Basis Data

  2. Parameter String Koneksi untuk Schema.ini

  3. Apa Artinya Membagi Basis Data Microsoft Access?

  4. Driver Baru Untuk SQL Server… Yang Perlu Anda Ketahui

  5. Cara Membuat Subformulir dari Tabel di Access 2016