Tôi đã viết ngắn gọn về JetShowPlan trong bài viết của tôi về Điều chỉnh Hiệu suất Truy vấn Truy cập. Như tôi đã viết trong bài báo đó, SQL là một ngôn ngữ khai báo. Khi bạn viết một truy vấn, bạn đang nói với công cụ cơ sở dữ liệu cái gì bạn muốn. Công cụ cơ sở dữ liệu quyết định cách thức tốt nhất để hoàn thành điều đó cho bạn. Điều này nói chung là tốt, vì việc tối ưu hóa các hoạt động dựa trên tập hợp là rất khó và việc để công cụ cơ sở dữ liệu làm điều đó cho bạn cho phép bạn tận dụng kiến thức của những người cống hiến cả đời cho vấn đề cụ thể đó.
Nhược điểm là cách trở thành hộp đen. Bạn đưa một số SQL vào hộp đen và đưa ra một tập hợp kết quả với một loạt dữ liệu. Cơ sở dữ liệu cực kỳ đáng tin cậy trong việc cung cấp cho bạn chính xác dữ liệu bạn yêu cầu. Vấn đề là hiệu suất của việc truy xuất dữ liệu có thể ở khắp nơi. Để rõ ràng, hiệu suất kém gần như không bao giờ là lỗi của công cụ cơ sở dữ liệu. Thông thường, vấn đề là chúng tôi đang thiếu một chỉ mục hoặc bộ lọc trên kết quả của một hàm VBA hoặc kết hợp trên hai bảng được liên kết được lưu trữ ở các vị trí vật lý riêng biệt.
Khi vấn đề này phát sinh, chúng tôi cần một cách để khắc phục sự cố. Nhập JetShowPlan. Hãy coi đây là một chiếc tuốc nơ vít đặc biệt cho phép chúng ta tháo hộp đen và nhìn vào bên trong để xem cách công cụ cơ sở dữ liệu đang thực hiện các lệnh SQL mà chúng tôi cung cấp cho nó. Với kiến thức này, chúng ta có thể điều chỉnh SQL, thêm chỉ mục hoặc giải quyết nguồn gốc của nút cổ chai hiệu suất của chúng ta.
Hãy bắt đầu.
Khóa đăng ký
JetShowPlan hoạt động bằng cách ghi kế hoạch truy vấn (tức là nội dung của hộp đen) vào tệp văn bản bất cứ khi nào công cụ cơ sở dữ liệu ACE / Jet thực thi bất kỳ truy vấn. Tệp văn bản này đầy nhanh. Việc tạo tệp văn bản yêu cầu các tài nguyên làm giảm hiệu suất truy vấn. Do đó, chúng tôi chỉ muốn bật tính năng này khi chúng tôi đang tích cực khắc phục sự cố.
Vì đây là công cụ dành cho người dùng nâng cao, không có cài đặt nào trong giao diện người dùng Access để bật chế độ này. Cách duy nhất để bật hoặc tắt nó là đặt một giá trị trong sổ đăng ký. Giá trị đăng ký phù hợp với mẫu sau (văn bản bên trong dấu ngoặc nhọn đóng vai trò là trình giữ chỗ):
[HKEY_LOCAL_MACHINE\SOFTWARE{\Wow6432Node}\Microsoft\Office\{xx}.0\Access Connectivity Engine\Engines\Debug]
"JETSHOWPLAN"="ON"
Cân nhắc về phiên bản và bitness
Mẫu giá trị sổ đăng ký mà tôi đã trình bày ở trên sử dụng một số văn bản giữ chỗ để giải thích sự khác biệt giữa các môi trường Access. Văn bản số phiên bản \{xx}.0\
sẽ được thay thế bằng số phiên bản tương ứng với phiên bản Access được cài đặt trên máy của bạn:
-
12.0
:Truy cập 2007 -
13.0
: đã bỏ qua để tránh kích hoạt triskaidekaphobes -
14.0
:Truy cập 2010 -
15.0
:Truy cập 2013 -
16.0
:Truy cập 2016 &2019
\Wow6432Node
('Wow' là viết tắt của "Windows 32-bit trên Windows 64-bit") chỉ được yêu cầu nếu bạn đang chạy phiên bản 32-bit của Microsoft Access trên phiên bản Windows 64-bit. Nếu Access và Windows đều là 32 bit hoặc cả 64 bit, thì "thư mục" (hoặc "khóa" trong biệt ngữ đăng ký) là không cần thiết.
Ở dạng VBA:
If Is32BitAccess Xor Is32BitWindows Then
IncludeWow6432Key = True
Else
IncludeWow6432Key = False
End If
Ví dụ:bản cài đặt Access 2010 32 bit chạy trên Windows 64 bit sẽ yêu cầu mục đăng ký sau:
[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Office\14.0\Access Connectivity Engine\Engines\Debug]
"JETSHOWPLAN"="ON"
Tương tự như vậy, quá trình cài đặt Access 2019 64 bit trên Windows 64 bit sẽ yêu cầu:
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\16.0\Access Connectivity Engine\Engines\Debug]
"JETSHOWPLAN"="ON"
Tôi cũng nên lưu ý rằng lần đầu tiên bạn tạo mục nhập này, bạn có thể sẽ cần thêm khóa "Gỡ lỗi" (thư mục) và tên và dữ liệu giá trị JETSHOWPLAN.
Dưới đây là các bước để thực hiện việc này:
- Chạy regedit với tư cách là quản trị viên
- Điều hướng đến phím "\ Engines" theo các ghi chú ở trên
- Nhấp chuột phải vào "\ Engines" và chọn Mới -> Khoá
- Đổi tên khóa từ "Khóa mới # 1" thành "Gỡ lỗi"
Sau đó, bạn sẽ cần thêm giá trị chuỗi "JETSHOWPLAN" với Dữ liệu " BẬT "để cho phép thêm vào showplan.out tệp hoặc " TẮT "để ngừng thêm vào tệp.
- Nhấp chuột phải vào phím "\ Debug" và chọn Mới -> Giá trị chuỗi
- Đổi tên giá trị từ "Giá trị mới # 1" thành "JETSHOWPLAN"
- Nhấp chuột phải vào tên giá trị "JETSHOWPLAN" và chọn Sửa đổi ...
- Đặt dữ liệu Giá trị thành BẬT sau đó nhấp vào nút [OK]
Lần tiếp theo khi bạn khởi động phiên bản Access mới, nó sẽ bắt đầu thêm dữ liệu vào tệp Showplan.out. Mọi phiên bản Access đã chạy khi bạn thực hiện các thay đổi trên sẽ không bị ảnh hưởng. Điều này cũng xảy ra tương tự khi bạn TẮT cài đặt . Các thay đổi không có hiệu lực cho đến khi bạn bắt đầu một msaccess.exe mới ví dụ. Không cần thiết phải đóng các phiên bản Access hiện có; có thể có một phiên bản Access đang mở đang tích cực ghi vào showplan.out trong khi một phiên bản Access khác thì không.
Tập lệnh Autohotkey
Tôi sẽ không nói dối; nhảy vào regedit Mỗi lần tôi muốn BẬT hoặc TẮT JetShowPlan thật khó chịu. Nếu tôi phải làm điều đó, tôi sẽ hầu như không bận tâm. Nhưng tôi không cần phải làm thế! Tôi đã tạo một phím nóng trong Autohotkey để bật tắt JetShowPlan BẬT và TẮT.
^#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
Bây giờ khi tôi muốn điều chỉnh các truy vấn của mình, tôi nhấn [Ctl] + [Win] + [Q] và tôi thấy một hộp thông báo cho biết "JetShowPlan được đặt thành BẬT". Khi hoàn tất, tôi đóng Access, nhấn [Ctl] + [Win] + [Q] và tôi thấy "JetShowPlan được đặt thành TẮT".
Điều chỉnh quyền
Tôi có hai tài khoản người dùng Windows khác nhau:một tài khoản có quyền tiêu chuẩn mà tôi sử dụng cho công việc hàng ngày và tài khoản khác có quyền quản trị viên để cài đặt phần mềm, v.v. Đây là phương pháp bảo mật phổ biến nhất.
Vấn đề là khóa đăng ký JetShowPlan nằm trong tổ hợp HKLM. Theo mặc định, chỉ quản trị viên mới có thể thực hiện thay đổi các giá trị trong tổ ong đó. Điều này thật khó chịu vì khi tôi cố gắng chạy tập lệnh Autohotkey của mình, tôi nhận được thông báo lỗi sau:
Tuy nhiên, không phải lo lắng. Như thông báo trên gợi ý, chúng tôi có thể khắc phục điều này. Phần tốt nhất là chúng tôi có thể làm cho nó thuận tiện mà không làm giảm thế trận an ninh của chúng tôi. Đây là mẹo.
- Mở regedit với tư cách là quản trị viên
- Điều hướng đến \ Debug chìa khóa
- Nhấp chuột phải vào \ Debug và chọn Quyền ...
- Nhấp vào nút [Thêm ...]
- Nhập tên người dùng từ hộp thông báo ở trên ('Mike'), nhấp vào [Kiểm tra tên], sau đó nhấp vào [OK]
- Cho phép [√] "Toàn quyền kiểm soát" cho người dùng
- Nhấp vào [OK] để lưu các thay đổi
Bây giờ khi tôi nhấn [Ctl] + [Win] + [Q], nó sẽ BẬT và TẮT JetShowPlan, cập nhật sổ đăng ký tự động.
Tìm Showplan.out
Access sẽ không thông báo cho bạn biết nơi công cụ cơ sở dữ liệu Jet / ACE đang bổ sung thông tin kế hoạch truy vấn khi JetShowPlan được bật. Tôi đã dành nhiều thời gian hơn những gì tôi quan tâm để thừa nhận việc tìm kiếm một bản sao giả mạo của showplan.out . Phần này sẽ giúp bạn không phải chịu chung số phận đó.
Vị trí mặc định
Nơi đầu tiên cần xem là trong thư mục Documents của người dùng hiện tại. Ví dụ:tên người dùng Windows của tôi là "Mike", vì vậy nơi đầu tiên tôi muốn tìm tệp là:C:\Users\Mike\Documents\showplan.out
.
Sử dụng CurDir ()
Về mặt kỹ thuật, showplan.out tệp được tạo trong thư mục làm việc hiện tại. Đó thường là thư mục Documents của người dùng hiện tại, nhưng không phải lúc nào cũng vậy. Cách tốt nhất để tìm vị trí của tệp là sử dụng CurDir () chức năng.
Bạn có thể sao chép, dán và thực thi dòng mã sau trong cửa sổ VBA IDE ngay lập tức để mở tệp showplan.out (giả sử bạn đã bật JetShowPlan trong sổ đăng ký):
Shell "notepad """ & CurDir & "\showplan.out""", vbNormalFocus
Thay đổi vị trí đầu ra qua ChDir ()
Nếu vì lý do nào đó bạn muốn chỉ định một vị trí khác cho showplan.out , bạn có thể làm điều đó bằng cách sử dụng hàm ChDir (). Chức năng đó thay đổi thư mục làm việc hiện tại. Và, như tôi đã đề cập trước đó, thư mục hiện tại là nơi chứa showplan.out tập tin cư trú. Ngay sau khi bạn thay đổi thư mục làm việc hiện tại, JetShowPlan bắt đầu ghi vào thư mục mới; không cần phải đóng và mở lại Access.
Tại sao bạn có thể muốn làm điều này? Giả sử bạn muốn so sánh ba cách tiếp cận khác nhau để truy xuất cùng một dữ liệu. Bạn viết ba truy vấn khác nhau để xem những thay đổi bạn thực hiện tác động như thế nào đến kế hoạch truy vấn. Kể từ showplan.out quá dài dòng, sẽ rất tuyệt nếu có mỗi kế hoạch truy vấn trong tệp riêng của nó. Điều này sẽ làm cho các kế hoạch truy vấn dễ so sánh hơn. Đây là cách tôi có thể làm điều đó. Bước đầu tiên là đảm bảo rằng mỗi thư mục này tồn tại. Sau đó, thực thi các dòng mã sau:
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"
Sử dụng Mọi thứ bạn có (hoặc tải xuống nếu bạn không có 'chưa có nó)
Trong khi CurDir () sẽ cung cấp cho bạn vị trí chính xác cho những thay đổi gần đây nhất đối với showplan.out tệp, nó không thể cho bạn biết các thư mục làm việc trước đó là gì. Và, nếu bạn đã đóng phiên bản Access đã tạo showplan.out , không có gì đảm bảo rằng phiên bản Access tiếp theo mà bạn mở sẽ có cùng thư mục hiện tại.
Gần đây tôi đã bắt gặp một tiện ích nhỏ tiện dụng có tên là "Mọi thứ". Đó là một tệp thực thi nhỏ có thể lập chỉ mục toàn bộ ổ cứng của bạn chỉ trong vài giây. Sau khi lập chỉ mục hoàn tất, bạn có thể tìm kiếm ngay lập tức các tệp hoặc thư mục ở bất kỳ đâu trên ổ đĩa của mình.
Bạn có thể tải xuống Mọi thứ từ đây hoặc qua Chocolatey:choco install everything
. Mở Mọi thứ , tìm kiếm showplan.out
và trong vòng chưa đầy một giây, bạn sẽ thấy mọi phiên bản của showplan.out trên máy tính của mình cùng với ngày sửa đổi cuối cùng. Tôi ước tôi có công cụ này nhiều năm trước.
Hiểu về Showplan.out
Lần đầu tiên bạn mở showplan.out tệp, dự kiến sẽ bị xáo trộn. Có rất nhiều văn bản và phần lớn là tiếng ồn. Đây là đoạn trích từ tệp được tạo khi tôi mở cơ sở dữ liệu mẫu Northwind:
Các truy vấn bắt đầu bằng dấu ngã (~
) đại diện cho SQL thô được lưu trong Trang thuộc tính của biểu mẫu hoặc báo cáo và không được lưu dưới dạng đối tượng QueryDef vĩnh viễn. Điểm quan tâm chính là các bước được đánh số cho mỗi truy vấn:01)
, 02)
, 03)
, v.v. Bạn muốn làm theo các bước sau để tìm những dấu hiệu tốt và dấu hiệu xấu có thể gợi ý nơi có vấn đề.
Theo hiểu biết của tôi, không có tài liệu chính thức nào về định dạng và nội dung của showplan.out tập tin. Tuy nhiên, điều đó không sao, bởi vì chúng tôi sẽ không bị cuốn vào những điều vụn vặt. Mục tiêu chính của chúng tôi là xác định những vấn đề rõ ràng và giải quyết những vấn đề đó. Quy tắc 80/20 áp dụng ở đây. Hầu hết hiệu suất đạt được sẽ đến từ một hoặc hai chỉnh sửa đơn giản đối với các truy vấn của chúng tôi.
Những dấu hiệu tốt
Đây là tất cả về chỉ mục. Chúng tôi muốn kế hoạch truy vấn sử dụng các chỉ mục, đặc biệt là trong các bước đầu của truy vấn nhiều bước. Hai từ khóa khác nhau cho biết rằng các chỉ mục đang được sử dụng:index
và rushmore
. Rushmore là tên mã của công nghệ tối ưu hóa truy vấn ban đầu được phát triển bởi Fox Software vào đầu những năm 1980. Microsoft đã mua công ty vào năm 1992 và kết hợp công nghệ này vào công cụ cơ sở dữ liệu Jet.
Các truy vấn sử dụng công nghệ Rushmore để xử lý chỉ mục chạy nhanh hơn những truy vấn sử dụng chỉ mục theo kiểu truyền thống hơn. Công nghệ Rushmore chỉ có thể được sử dụng với các bảng Access (cả cục bộ và liên kết), cùng với các bảng FoxPro và dBASE được liên kết. Đáng chú ý, Rushmore không thể được sử dụng với các bảng SQL Server được liên kết. Để tăng hiệu suất của các bảng SQL Server được liên kết, bạn thường nên viết các truy vấn chuyển qua, nhưng điều đó nằm ngoài phạm vi của bài viết này.
Dấu hiệu xấu
Có một vài dấu hiệu xấu cần lưu ý trong showplan.out tập tin. Sự hiện diện đơn giản của những dấu hiệu này không nhất thiết có nghĩa là có vấn đề. Điều đó nói rằng, nếu bạn đang gỡ rối một truy vấn có hiệu suất kém, bạn có thể coi những từ này như là cờ cảnh báo cho các sự cố tiềm ẩn:X-Prod
, scanning
, temp
, temporary
.
X-Prod từ khóa xuất hiện khi bạn có một truy vấn với phép nối Descartes (còn được gọi là phép nối chéo hoặc sản phẩm chéo). Điều này thường xảy ra do nhầm lẫn khi bạn quên nối hai bảng trong trình soạn thảo Truy vấn theo ví dụ (QBE). Kết quả là mọi bản ghi trong bảng 1 được khớp với mọi bản ghi trong bảng 2. Tổng số bản ghi là tích của hai số đếm trong bảng. Vì vậy, nếu bảng 1 có 7 bản ghi và bảng 2 có 9 bản ghi, phép nối chéo của hai bảng trả về 63 bản ghi. Bạn có thể hình dung vấn đề nếu cả hai bảng có hàng nghìn bản ghi trở lên.
01) Inner Join table 'Table1' to table 'Table2'
using X-Prod join
Từ khóa tiếp theo cần theo dõi là quét . Nếu công cụ cơ sở dữ liệu không thể sử dụng một chỉ mục để lọc kết quả, nó sẽ quay trở lại quá trình quét. Điều này có nghĩa là nó phải kiểm tra từng hàng riêng lẻ để xem liệu nó có đáp ứng các tiêu chí truy vấn hay không. Khi bạn nhìn thấy từ này trong showplan.out , nó thường có nghĩa là bạn cần thêm chỉ mục vào cột đang được quét. Nhưng không phải lúc nào cũng vậy! Đối với các cột có số lượng thấp (chỉ một số giá trị duy nhất, chẳng hạn như cột trạng thái), việc thêm chỉ mục thường có chút khó khăn. Sau khi được thêm vào, chỉ mục phải được duy trì. Điều này làm chậm quá trình chèn và chiếm dung lượng đĩa. Ngoài ra, nếu hiệu suất truy vấn có thể chấp nhận được trên dữ liệu sản xuất, thì việc thêm chỉ mục vào cột được quét là một cách tối ưu hóa quá sớm (bạn nên tránh).
Cuối cùng, có tạm thời và tạm thời từ khóa. Những điều này chỉ ra rằng công cụ cơ sở dữ liệu đã phải thực hiện một số loại hoạt động trên cơ sở tạm thời. Khi chúng tôi tạo và lưu một querydef, đối tượng đó sẽ được lưu với một số siêu dữ liệu nhất định để tối ưu hóa việc thực thi lặp lại. Rõ ràng, siêu dữ liệu như vậy sẽ bị mất khi các chỉ mục hoặc liên kết tạm thời vượt ra ngoài phạm vi. Những từ khóa này thường có thể bị bỏ qua, nhưng chúng có thể chỉ cho bạn đi đúng hướng nếu bạn gặp khó khăn trong một truy vấn hoạt động kém mà không có sai sót rõ ràng nào khác.
Để tóm tắt lại các thuật ngữ quá đơn giản:
TỐT>>>>> XẤU:
Rushmore> chỉ mục> tạm thời / tạm thời> quét> X-Prod
Ngôn ngữ tùy chỉnh của Notepad ++
Nếu bạn đã đọc tác phẩm khác của tôi, bạn biết rằng tôi có cảm xúc mạnh mẽ về việc tăng tỷ lệ Tín hiệu trên Tiếng ồn trong lập trình (và cuộc sống nói chung). Để làm được điều này, tôi đã tạo tệp "Ngôn ngữ do người dùng xác định" trong Notepad ++ để thêm tô sáng cú pháp vào showplan.out các tập tin. Bây giờ, khi tôi mở showplan.out , chúng trông giống như ảnh chụp màn hình bên dưới. Các từ khóa "TỐT" được tô màu trong văn bản màu xanh lam và các từ khóa "XẤU" được tô màu bằng văn bản màu đỏ. Đây là một ví dụ về việc Làm sai mã trông sai.
Để thiết lập, hãy làm theo các bước sau:
- Mở Notepad ++
- Ngôn ngữ -> Ngôn ngữ do Người dùng Xác định -> Xác định ngôn ngữ của bạn ...
- Nhấp vào [Tạo mới ...]
- Nhập Tên: showplan.out
- Nhấp vào [OK]
- Đi tới _ | Thư mục &tab Mặc định | _
- Trong "Gấp theo kiểu mã 2", hãy nhập
Inputs
cho các đầu vào Mở vàEnd inputs
cho Đóng - Chuyển đến tab _ | Danh sách Từ khoá | _
- Nhấp vào [Trình tạo kiểu] trong nhóm đầu tiên và đặt màu Nền trước thành màu đỏ
- Nhập các từ khoá "XẤU" sau vào nhóm đầu tiên:
temp temporary scanning X-Prod
- Nhấp vào [Trình tạo kiểu] trong nhóm thứ 2 và đặt màu Nền trước thành xanh lam
- Nhập các từ khoá "TỐT" sau vào nhóm thứ 2:
rushmore index
- Nhập Ext: out
Suy nghĩ cuối cùng
Không giống như SQL Server, công cụ cơ sở dữ liệu Jet / ACE không cho phép bạn sửa đổi trực tiếp kế hoạch thực thi truy vấn. Điều đó có nghĩa là chúng ta có thể nhìn vào bên trong hộp đen với JetShowPlan, nhưng chúng ta không thể rewire nó để làm những gì chúng ta muốn. Thay vào đó, chúng ta phải tập trung vào những gì chúng ta có thể kiểm soát:SQL chính xác mà chúng ta cung cấp cho nó, các chỉ mục và mối quan hệ giữa các bảng có liên quan.
Sử dụng JetShowPlan có cả lợi ích ngắn hạn và dài hạn. Trước mắt, tính năng này cho phép bạn khắc phục các nút thắt cổ chai trong các ứng dụng Access của mình. Về lâu dài, bạn có được cái nhìn sâu sắc về hoạt động bên trong của Access, điều này giúp bạn tránh được những nút thắt cổ chai ngay từ đầu.