【发布时间】:2013-03-09 21:34:07
【问题描述】:
我有一个由 sql server 支持的 MSAccess .mdb 文件。 当我尝试打开表单时,需要很长时间才能显示 我知道我在表单的加载事件中有一些东西。
有没有办法像 SQL Profiler 一样在 MSAccess 中跟踪执行时间?
【问题讨论】:
标签: ms-access profiler sql-server-profiler
我有一个由 sql server 支持的 MSAccess .mdb 文件。 当我尝试打开表单时,需要很长时间才能显示 我知道我在表单的加载事件中有一些东西。
有没有办法像 SQL Profiler 一样在 MSAccess 中跟踪执行时间?
【问题讨论】:
标签: ms-access profiler sql-server-profiler
法希姆; 我从来没有见过这样的跟踪软件。
一种简单的“老派”方法: 在每个函数调用的末尾放置一个 msgBox。 一旦您确定了哪个函数的运行时间比预期的要长,请检查该函数。您的记录集是否使用索引字段?避免同时打开多个记录集。你是否尽量减少循环的使用?你的循环优化了吗?
要检查的另一件事是使用 Access 宏来计算聚合(总和、平均值)。 这会导致 Access 重复运行单个查询。如果您有处理超过 100,000 条记录和 2 打列的情况,Access 宏将触发 2 打(每列一次)。
使用上面概述的方法,我制作了一个大型 DB Warehouse 应用程序(主数据表中的 25 万条记录,40 列)并简化了需要一小时处理的报告,将处理时间缩短到 5 秒。客户非常高兴。
【讨论】:
我真的不明白你所说的“我知道我在表单的加载事件上有东西”是什么意思。您不能检查附加到您的表单的宏/VBA 吗?你在负载上做什么?
查看此链接: http://bytes.com/topic/access/answers/204374-timer-function-determining-code-execution-speed
Dim sngStart As Single
Dim sngEnd As Single
Dim sngElapsed As Single
Dim time As Single
sngStart = Timer ' Get start time
'your code here
sngEnd = Timer 'get stop time
sngElapsed = sngEnd - sngStart
time = Format(sngElapsed, "######0.0000000000")
MsgBox "Time elapsed: " & time, vbInformation, "Time Elapsed"
【讨论】:
Option Compare Database
Option Explicit
Private Declare Function timeGetTime _
Lib "winmm.dll" () As Long
Private mlngStartTime As Long
Private Function ElapsedTime() As Long
ElapsedTime = timeGetTime() - mlngStartTime
End Function
Private Sub StartTime()
mlngStartTime = timeGetTime()
End Sub
Public Function MyTest()
Call StartTime
DoCmd.OpenQuery "Query1"
DoCmd.GoToRecord acDataQuery, "Query1", acLast
Debug.Print ElapsedTime() & _
Call StartTime
DoCmd.OpenQuery "Query2"
DoCmd.GoToRecord acDataQuery, "Query2", acLast
Debug.Print ElapsedTime() & _
End Function
另外,请检查您的表单设计。是否有很多子表单/主/子链接?有多少聚合?等等。
【讨论】: