在上周的技巧中,我向您展示了如何使用DBEngine(DAO)的ISAMStats方法返回有关查询执行的重要统计信息,例如:磁盘读写,缓存读写以及放置和释放的锁。 按照承诺,在本周的技巧中,我将演示如何使用连接对象的OpenSchema方法在ADO上下文中完成并行功能。
我们通过向其提供一个称为GUID的魔术数字(而不是表示特定模式的传统常量值)来向OpenSchema方法指示我们想要一组特定于提供商的信息。 随后,记录集将充满我们所需的信息。
与ISAMStats方法不同,我们可以一次重置所有统计信息。 重置统计信息后,我们可以执行查询以重新填充统计信息,然后检索它们。 为此,我们使用连接对象的OpenSchema方法,该方法返回一个单行Recordset对象,其中填充了各个字段中的统计信息。
我知道你们都在焦急地等待着,所以让我们开始学习本技巧的内容。 我已经将所有逻辑封装在一个名为GetADO_ISAMStats的子例程过程中,该例程具有两个参数。 在这种特定情况下,我将把存储查询的名称(qrySelect)和布尔值(True)传递给例程,该名称指示代码将尝试打开Recordset而不是执行查询。 我完全可以通过例程传递一个反映操作查询(更新,删除,追加,创建表)的SQL语句,然后传递值False来执行该SQL语句。
qrySelect是一个简单的Select查询,它从包含1,101,764条记录的表中返回值。 在两个字段上设置标准只是为了使事情变得有趣。
下面列出了子例程代码,对例程的调用以及生成的统计信息,以供您查看。 如果您愿意,请参阅上周的技巧作为参考。
Public Sub GetADO_ISAMStats(strQuery As String, Optional blnUseRecordset As Boolean)
'1st set a Reference to the 'Microsoft ActiveX Data Objects X.X Library'
Dim cnn As ADODB.Connection
Dim rst As ADODB.Recordset
Set cnn = CurrentProject.Connection
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 lngDiskReads As Long, lngDiskWrites As Long, lngReadsFromCache As Long
Dim lngReadsFromReadAheadCache As Long, lngLocksPlaced As Long
Dim lngLocksReleased As Long
DoCmd.Hourglass True
'Reset the Statistics all at once
cnn.Properties("Jet OLEDB:Reset ISAM Stats") = 1
If blnUseRecordset Then
Set rst = cnn.Execute(strQuery) 'used for this Tip
Else
cnn.Execute (strQuery)
End If
Set rst = cnn.OpenSchema(Schema:=adSchemaProviderSpecific, SchemaID:="{8703b612-5d43-11d1-bdbf-00c04fb92675}")
lngDiskReads = rst.Fields(conDisk_Reads)
lngDiskWrites = rst.Fields(conDisk_Writes)
lngReadsFromCache = rst.Fields(conReads_From_Cache)
lngReadsFromReadAheadCache = rst.Fields(conReads_From_Read_Ahead_Cache)
lngLocksPlaced = rst.Fields(conLocks_Placed)
lngLocksReleased = rst.Fields(conLocks_Released)
Debug.Print "==========================================="
Debug.Print "Statistics for (" & strQuery & ") - [" & IIf(blnUseRecordset, "Recordset", "Query") & "]"
Debug.Print "[ADO Method] - 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 "==========================================="
DoCmd.Hourglass False
End Sub
'Procedure Call
Call GetADO_ISAMStats("qrySelect", True)
输出:
===========================================
Statistics for (qrySelect) - [Recordset]
[ADO Method] - Number of Records: 1,101,764
===========================================
Disk Reads : 6,970
Disk Writes : 22
Reads From Cache : 7,546
Reads From Read-Ahead Cache : 968
Locks Placed : 31
Locks Released : 28
===========================================
From: https://bytes.com/topic/access/insights/749805-generate-statistics-openschema-method