ISAMStats方法

本文介绍了一个PowerAccess的未公开特性-ISAMStats方法,该方法属于DBEngine对象,用于获取磁盘读写、缓存使用及锁定操作等关键统计信息,有助于优化DAO应用程序的性能。通过实例演示了如何在查询前重置计数器,执行查询后获取统计信息,以分析查询执行计划。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本周的提示主要针对Power Access用户和Gurus,他们要求在其应用程序中实现最高效率。 它涉及Jet 4的一个未记录的功能,并且是一种可用于返回与磁盘读写有关的各种信息的技术。 它是DBEngine对象的方法,因此仅限于DAO。 下周,我们将讨论ADO中的类似功能。

当您使用ISAMStats方法比较两种可能的操作方式时,该方法很有用。 使用此方法,您可以检索有关六个重要统计信息的信息:

  1. 磁盘读取-[0]
  2. 磁盘写入-[1]
  3. 从缓存读取-[2]
  4. 从预读缓存读取-[3]
  5. 放置锁-[4]
  6. 锁已释放-[5]
ISAMStats方法的基本语法如下:
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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值