本周的提示主要针对Power Access用户和Gurus,他们要求在其应用程序中实现最高效率。 它涉及Jet 4的一个未记录的功能,并且是一种可用于返回与磁盘读写有关的各种信息的技术。 它是DBEngine对象的方法,因此仅限于DAO。 下周,我们将讨论ADO中的类似功能。
当您使用ISAMStats方法比较两种可能的操作方式时,该方法很有用。 使用此方法,您可以检索有关六个重要统计信息的信息:
- 磁盘读取-[0]
- 磁盘写入-[1]
- 从缓存读取-[2]
- 从预读缓存读取-[3]
- 放置锁-[4]
- 锁已释放-[5]
lngReturn = DBEngine.ISAMStats(option, [reset])
其中option是一个Long Integer,代表每个报告的统计信息的上述列出的值之一,而reset是一个可选的布尔值,当设置为True时,它告诉Jet对该特定选项重置计数器。
我不会通过子例程过程GetDAO_ISAMStats()来演示此方法,该过程接受要执行的查询或SQL字符串的名称,以及一个可选参数,该可选参数指示代码是应尝试打开Recordset还是打开查询。
出于演示目的,我选择执行存储查询(strQuery = qryISAMStats,blnUseRecordset = False)。 该查询是一个更新查询,它基于一个表,该表包含520,000条记录,其中342,000条记录在此过程中进行了更新。 我还将向您展示该函数生成的统计信息,希望您会看到该方法在分析各种查询执行计划中的价值。
Public Sub GetDAO_ISAMStats(strQuery As String, Optional blnUseRecordset As Boolean)
Const conDisk_Reads As Integer = 0
Const conDisk_Writes As Integer = 1
Const conReads_From_Cache As Integer = 2
Const conReads_From_Read_Ahead_Cache As Integer = 3
Const conLocks_Placed As Integer = 4
Const conLocks_Released As Integer = 5
Dim dbISAM As DAO.Database, rstISAM As DAO.Recordset
Dim lngDiskReads As Long, lngDiskWrites As Long, lngReadsFromCache As Long
Dim lngReadsFromReadAheadCache As Long, lngLocksPlaced As Long
Dim lngLocksReleased As Long
DoCmd.Hourglass True
Set dbISAM = CurrentDb()
'Reset all Meters
Call DAO.DBEngine.ISAMStats(conDisk_Reads, True)
Call DAO.DBEngine.ISAMStats(conDisk_Writes, True)
Call DAO.DBEngine.ISAMStats(conReads_From_Cache, True)
Call DAO.DBEngine.ISAMStats(conReads_From_Read_Ahead_Cache, True)
Call DAO.DBEngine.ISAMStats(conLocks_Placed, True)
Call DAO.DBEngine.ISAMStats(conLocks_Released, True)
If blnUseRecordset Then
Set rstISAM = dbISAM.OpenRecordset(strQuery, dbOpenSnapshot)
Else
dbISAM.Execute strQuery
End If
lngDiskReads = DAO.DBEngine.ISAMStats(conDisk_Reads)
lngDiskWrites = DAO.DBEngine.ISAMStats(conDisk_Writes)
lngReadsFromCache = DAO.DBEngine.ISAMStats(conReads_From_Cache)
lngReadsFromReadAheadCache = DAO.DBEngine.ISAMStats(conReads_From_Read_Ahead_Cache)
lngLocksPlaced = DAO.DBEngine.ISAMStats(conLocks_Placed)
lngLocksReleased = DAO.DBEngine.ISAMStats(conLocks_Released)
Debug.Print "==========================================="
Debug.Print "Statistics for (" & strQuery & ") - [" & IIf(blnUseRecordset, "Recordset", "Query") & "]"
Debug.Print "Number of Records: " & Format$(DCount("*", "tblMain"), "#,#,#")
Debug.Print "==========================================="
Debug.Print "Disk Reads : " & Format$(lngDiskReads, "#,#,#")
Debug.Print "Disk Writes : " & Format$(lngDiskWrites, "#,#,#")
Debug.Print "Reads From Cache : " & Format$(lngReadsFromCache, "#,#,#")
Debug.Print "Reads From Read-Ahead Cache : " & Format$(lngReadsFromReadAheadCache, "#,#,#")
Debug.Print "Locks Placed : " & Format$(lngLocksPlaced, "#,#,#")
Debug.Print "Locks Released : " & Format$(lngLocksReleased, "#,#,#")
Debug.Print "==========================================="
If blnUseRecordset Then
rstISAM.Close
Set rstISAM = Nothing
End If
DoCmd.Hourglass False
End Sub
子常规通话:
'Code will Execute the Query - (blnUseRecordset = False)
Call GetDAO_ISAMStats("qryISAMTest", False)
生成的统计信息:
===========================================
Statistics for (qryISAMTest) - [Query]
Number of Records: 520,000
===========================================
Disk Reads : 21,499
Disk Writes : 17,862
Reads From Cache : 2,046,721
Reads From Read-Ahead Cache : 32,873
Locks Placed : 16,514
Locks Released : 16,256
===========================================
From: https://bytes.com/topic/access/insights/746787-isamstats-method