2014-11-08 123 views
0

使用ADODB - 是否有一個函數來檢索結果查詢的實際大小? (vb6)vb6 ADODB記錄集大小檢索

我不是說它的數量我的意思是它的實際大小, 我想知道需要多少數據才能通過網絡來檢索我的查詢結果。如果沒有這樣的事情存在我想我總是可以把所有的數據檢索,把它轉換爲字節,並開始計算,但我想避免它,如果有東西已經建成(應該是)。

謝謝!

PS 使用.mdb文件,使用ADODB 2.0文庫

+1

用於測試或作爲應用程序內的設施?您應該添加標識您使用的數據庫系統的標籤。 – 2014-11-08 14:30:58

+0

大約8年前,我將一些代碼拼湊在一起,然後按照你的要求去做。我被要求提高性能,因此創建了一些將「開始追蹤」和「結束追蹤」調用放入每個子程序的代碼。這些會得到像CPU,磁盤I/O和字節發送/接收並登錄到表。因此,我們將關閉工作站上不需要的所有內容,然後運行我們的測試,然後運行報告以關注最差的代碼。這是Office 2002和Win-XP,所以不知道它是否仍然有效。如果您有興趣,請告訴我。 – 2014-11-08 21:00:05

+0

由於需要大量I/O來完成最終結果,因此無法對結果內容進行估算。 – Bob77 2014-11-09 19:35:11

回答

0

下面是獲取使用ADO

Option Explicit 

Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long) 
Private Declare Function GetCurrentProcess Lib "kernel32"() As Long 
Private Declare Function GetProcessMemoryInfo Lib "psapi" (ByVal hProcess As Long, ppsmemCounters As PROCESS_MEMORY_COUNTERS, ByVal cb As Long) As Long 

Private Type PROCESS_MEMORY_COUNTERS 
    cb      As Long 
    PageFaultCount   As Long 
    PeakWorkingSetSize  As Long 
    WorkingSetSize   As Long 
    QuotaPeakPagedPoolUsage As Long 
    QuotaPagedPoolUsage  As Long 
    QuotaPeakNonPagedPoolUsage As Long 
    QuotaNonPagedPoolUsage As Long 
    PagefileUsage   As Long 
    PeakPagefileUsage  As Long 
    PrivateUsage   As Long 
End Type 

Private Function pvGetWorkingSetSize() As String 
    Dim uCounters  As PROCESS_MEMORY_COUNTERS 

    On Error GoTo QH 
    If GetProcessMemoryInfo(GetCurrentProcess(), uCounters, Len(uCounters)) <> 0 Then 
     pvGetWorkingSetSize = Format$(pvToUnsigned(uCounters.WorkingSetSize)/1024/1024, "0.00") & "MB" 
    End If 
QH: 
End Function 

Private Function pvToUnsigned(ByVal lValue As Long) As Currency 
    Call CopyMemory(pvToUnsigned, lValue, 4) 
    pvToUnsigned = pvToUnsigned * [email protected] 
End Function 

'--- UI stuff 

Private Sub Command1_Click() 
    Const CONN_STR As String = "Provider=SQLOLEDB;Data Source=UCSDB\R2;Initial Catalog=Dreem15_IVB_2;Integrated Security=SSPI" 
    Dim rs   As ADODB.Recordset 

    pvLog "Starting" 
    Set rs = New ADODB.Recordset 
    pvLog "After loading ADO" 

    Set rs = New ADODB.Recordset 
    rs.CursorLocation = adUseClient 
    rs.Open "SELECT 1 AS ID", CONN_STR, adOpenStatic, adLockBatchOptimistic 
    pvLog "After loading SQLOLEDB" 

    Set rs = New ADODB.Recordset 
    rs.CursorLocation = adUseClient 
    rs.Open "SELECT TOP 10000 * FROM inv_Docs", CONN_STR, adOpenStatic, adLockBatchOptimistic 
    pvLog "After fetching 10000 records" 
    With New PropertyBag 
     .WriteProperty "rs", rs 
     pvLog "Propbag size: " & Format$(UBound(.Contents)/1024/1024, "0.00") & "MB" 
    End With 
    pvLog "After destroy propbag" 
    Set rs = Nothing 
    pvLog "After destroy recordset" 
End Sub 

Private Sub Command2_Click() 
    pvLog "Ping" 
End Sub 

Private Sub pvLog(sText As String) 
    Text1.Text = Text1.Text & Format$(Timer, "0.00") & ": " & pvGetWorkingSetSize() & ", " & sText & vbCrLf 
    Text1.SelStart = &H7FFF 
    Refresh 
End Sub 

這裏客戶機側的記錄之後報告WorkingSetSize的樣品是經過三個連續的結果處決

60366.48: 17.71MB, Starting 
60366.48: 18.04MB, After loading ADO 
60366.51: 22.00MB, After loading SQLOLEDB 
60366.74: 48.49MB, After fetching 10000 records 
60368.34: 62.81MB, Propbag size: 6.04MB 
60368.34: 50.73MB, After destroy propbag 
60368.34: 28.63MB, After destroy recordset 

60369.45: 28.67MB, Starting 
60369.45: 28.68MB, After loading ADO 
60369.47: 28.90MB, After loading SQLOLEDB 
60369.71: 53.28MB, After fetching 10000 records 
60371.30: 67.41MB, Propbag size: 6.04MB 
60371.30: 55.33MB, After destroy propbag 
60371.30: 33.88MB, After destroy recordset 

60371.95: 33.88MB, Starting 
60371.95: 33.88MB, After loading ADO 
60371.96: 33.91MB, After loading SQLOLEDB 
60372.20: 56.37MB, After fetching 10000 records 
60373.80: 69.11MB, Propbag size: 6.04MB 
60373.80: 57.03MB, After destroy propbag 
60373.80: 34.09MB, After destroy recordset