Jim Dettman
jimdettman at verizon.net
Wed Sep 30 17:36:28 CDT 2009
Below is some code that may come a bit closer, but even so field size
measures characters, not storage space. Plus your not taking into account
variable length fields, any of the database overhead (page and DB), or
indexes associated with a table.
So even at best, all this will be off by quite a bit.
Jim.
Public Sub showSizes()
Dim sql As String
Dim td As TableDef
Dim recordSize As Long
Dim numRecords As Long
Dim inMemos As Long
Dim CurrentDb As Database
Set CurrentDb = gTL1DB
' Create a temporary table for results:
' delete the table first, in case it's still there
On Error Resume Next
CurrentDb.Execute "DROP TABLE T___tmp"
On Error GoTo 0
sql = "CREATE TABLE T___tmp(name TEXT (100), size INTEGER,"
sql = sql & " recordSize INTEGER, numRecords INTEGER, inMemos INTEGER)"
CurrentDb.Execute sql
Dim rs As Recordset
Set rs = CurrentDb.OpenRecordset("T___tmp")
' for each table, add a record in T___tmp with its size info.
For Each td In CurrentDb.TableDefs
recordSize = 0
numRecords = 0
inMemos = 0
rs.AddNew
rs!name = td.name
rs!size = sizeEstimate(td.name, recordSize, numRecords, inMemos)
rs!recordSize = recordSize
rs!numRecords = numRecords
rs!inMemos = inMemos
rs.Update
Next td
rs.Close
' print table size info in decreasing order of size
Set rs = CurrentDb.OpenRecordset("SELECT * FROM T___tmp ORDER BY size DESC")
Do Until rs.EOF
If rs!size > 0 Then
Debug.Print rs!name; Tab(20); rs!size; Tab(30); " = "; rs!inMemos;
Debug.Print Tab(45); "+ ("; rs!recordSize; Tab(55); " * ";
rs!numRecords; ")"
Else
Exit Do
End If
rs.MoveNext
Loop
rs.Close
End Sub
Public Function sizeEstimate(tableName As String, recordSize As Long,
numRecords As Long, inMemos As Long) As Long
Dim rs As Recordset
Dim fld As field
Dim msg As Integer
Dim CurrentDb As Database
Dim colMemos As New Collection
Set CurrentDb = gTL1DB
On Error Resume Next
Set rs = CurrentDb.OpenRecordset(tableName)
If Err Then
sizeEstimate = 0
Exit Function
End If
If rs.EOF Then
sizeEstimate = 0
Exit Function
End If
rs.MoveLast
numRecords = rs.RecordCount
'Debug.Print
'Debug.Print tableName
' get the size of the fixed-size fields
For Each fld In rs.Fields
recordSize = recordSize + fld.size
If fld.Type = dbMemo Or fld.Type = dbLongBinary Then
colMemos.Add fld.name
End If
' Debug.Print fld.name; " size "; fld.size
Next fld
sizeEstimate = (recordSize * numRecords) 'Bytes
Dim ff As Variant
' add up all the memo and long binary fields in
' all the records.
If colMemos.count > 0 Then
rs.MoveFirst
Do Until rs.EOF
For Each ff In colMemos
inMemos = inMemos + rs.Fields(ff).FieldSize
Next ff
rs.MoveNext
Loop
End If
sizeEstimate = sizeEstimate + inMemos
'If SizeEstimate > 1073741824 Then '1073741824 Bytes per GigaByte
' msg = MsgBox("This view may still be larger than 1 GB. Do you wish to
continue?", vbOKCancel + vbCritical, "View Size Warning")
' If msg = 2 Then GoTo SizeEstimate_Exit
'End If
sizeEstimate_Exit:
rs.Close
End Function
-----Original Message-----
From: accessd-bounces at databaseadvisors.com
[mailto:accessd-bounces at databaseadvisors.com] On Behalf Of Max Wanadoo
Sent: Wednesday, September 30, 2009 6:13 PM
To: 'Access Developers discussion and problem solving'
Subject: Re: [AccessD] Table size
You could try something like this (below).
Knowing how many records you deal with, I have made the variable DOUBLES
Not entirely sure it is accurate as I have only just written it and never
tested it in real life, but it may help.
Max
Sub sGetTableSizes()
Dim dbs As DAO.Database, tbl As DAO.TableDef
Dim sql As String, fld As Field, dblTotSize As Double
Dim dblFldSize As Double, dblRecCount As Double, dblTableSize As Double
Set dbs = CurrentDb
For Each tbl In CurrentDb.TableDefs
If Not Left(tbl.Name, 1) = "~" And Not Left(tbl.Name, 4) = "Msys" Then
dblRecCount = DCount("*", tbl.Name)
dblFldSize = 0
For Each fld In tbl.Fields
dblFldSize = dblFldSize + fld.Size
Next fld
dblTableSize = dblFldSize * dblRecCount
Debug.Print tbl.Name, dblTableSize
End If
dblTotSize = dblTotSize + dblTableSize
Next tbl
MsgBox "Total Size: " & Format(dblTotSize, "##,##")
exithere:
Set dbs = Nothing: Set tbl = Nothing
Exit Sub
End Sub
-----Original Message-----
From: accessd-bounces at databaseadvisors.com
[mailto:accessd-bounces at databaseadvisors.com] On Behalf Of jwcolby
Sent: 30 September 2009 20:21
To: Access Developers discussion and problem solving
Subject: [AccessD] Table size
Is there any direct way to obtain the total storage used for each table. A
client is approaching
the 2 gb limit and needs to split the BE.
--
John W. Colby
www.ColbyConsulting.com
--
AccessD mailing list
AccessD at databaseadvisors.com
http://databaseadvisors.com/mailman/listinfo/accessd
Website: http://www.databaseadvisors.com
--
AccessD mailing list
AccessD at databaseadvisors.com
http://databaseadvisors.com/mailman/listinfo/accessd
Website: http://www.databaseadvisors.com