jwcolby
jwcolby at colbyconsulting.com
Thu Oct 1 14:49:20 CDT 2009
> Remember, some of us have got pubs to go to....can't spend the day coding...LOL Precisely right! John W. Colby www.ColbyConsulting.com Max Wanadoo wrote: > Gustav, > > Remember, some of us have got pubs to go to....can't spend the day > coding...LOL > > Max > > > -----Original Message----- > From: accessd-bounces at databaseadvisors.com > [mailto:accessd-bounces at databaseadvisors.com] On Behalf Of Gustav Brock > Sent: 01 October 2009 17:37 > To: accessd at databaseadvisors.com > Subject: Re: [AccessD] Table size > > Hi Arthur > > So much talking, so little action ... > > <code> > Public Sub ListTableSize() > > Dim dbs As DAO.Database > Dim tdf As DAO.TableDef > > Dim strName As String > Dim strFile As String > Dim strPath As String > > Set dbs = CurrentDb > strName = dbs.Name > strPath = Left(strName, Len(strName) - Len(Dir(strName))) > > For Each tdf In dbs.TableDefs > strName = tdf.Name > ' Apply some filtering. > If Left(strName, 4) = "tblS" Then > strFile = strPath & strName & ".mdt" > Debug.Print strName, ; > CreateDatabase strFile, dbLangGeneral > DoCmd.TransferDatabase acExport, "Microsoft Access", strFile, acTable, > strName, strName > Debug.Print FileLen(strFile) > Kill strFile > End If > Next > > Set tdf = Nothing > Set dbs = Nothing > > End Sub > </code> > >>>> jwcolby at colbyconsulting.com 01-10-2009 14:53 >>> > Jim, > > > In fact I'm left wondering why someone hasn't done that already... > > Because we all work for a living and no one wants to pay us to develop that? > > ;) > > But you are correct, it wouldn't be that tough to do. > > John W. Colby > www.ColbyConsulting.com > > > Jim Dettman wrote: >> Max, >> >> <<Oh no, I didn't mean it that way. What I meant was the guys (and gals) > on >> this site are amazing with their knowledge and skills. Impossible to keep >> up with. I think I have done something "clever" and the say "yeah, watch >> this bud".>> >> >> Been there many times. Sometime I feel like I live in the stone age > when >> I see a lot of the stuff on EE. >> >> <<Hope I didn't offend anybody. Emails sometimes can be difficult.>> >> >> Not here and I hope the reverse is true as well. I really was just > trying >> to point out that it's a thornier problem then it first appears. To > really >> do it right, you'd need to scan every page in the DB assigned to the table >> or do a compact and then just add up all the pages assigned to the table. >> And while the data page layouts for Jet 3.0 and 4.0 are pretty well known, >> what's known about the index pages and page usage maps are fuzzy at best. >> >> And then there are details such as page padding (leaving free space for >> new data); does JET do it or not? So even scanning all the pages and >> getting a very accurate storage count of the data still might not tell you >> how much space a table would occupy. If the fill factor was 50%, you > could >> be off by quite a bit. The best approach I guess would be a compact, > then >> just count the pages assigned to the tables and indexes. >> >> Without going through all that, the only realistic approach I've found > is >> to import a single table into a fresh MDB and then check the size. That > is >> accurate, but it's a lot of manual work. And now that I say that, I > think >> between all of us we could come up with some code to do that automatically >> fairly quickly for a given DB. In fact I'll see if I can squeeze out > some >> time latter today to do that. Would not be all that hard; read the >> tabledefs, create a scratch DB, transfer the table, get the on disk size > of >> the scratch DB, save info into a table, delete scratch DB, and repeat till >> done. >> >> In fact I'm left wondering why someone hasn't done that already... >> >> Jim. >> >> >> >> -----Original Message----- >> From: accessd-bounces at databaseadvisors.com >> [mailto:accessd-bounces at databaseadvisors.com] On Behalf Of Max Wanadoo >> Sent: Wednesday, September 30, 2009 8:13 PM >> To: 'Access Developers discussion and problem solving' >> Subject: Re: [AccessD] Table size >> >> Oh no, I didn't mean it that way. What I meant was the guys (and gals) on >> this site are amazing with their knowledge and skills. Impossible to keep >> up with. I think I have done something "clever" and the say "yeah, watch >> this bud". >> >> Hope I didn't offend anybody. Emails sometimes can be difficult. >> >> Anyway, John. Hope you got something out of it all - LOL. >> >> >> But, hey, tell you what, this might develop into a useful item. I never >> even considered Indexes. What about Reference overheads. Tons of stuff. >> >> >> Max >> >> >> -----Original Message----- >> From: accessd-bounces at databaseadvisors.com >> [mailto:accessd-bounces at databaseadvisors.com] On Behalf Of jwcolby >> Sent: 01 October 2009 01:06 >> To: Access Developers discussion and problem solving >> Subject: Re: [AccessD] Table size >> >> ROTFL. Don't worry about it Max. If it was easy MS would hand it off to >> the same summer interns >> that design North Wind DB and they would screw it up. >> >> John W. Colby >> www.ColbyConsulting.com >> >> >> Max Wanadoo wrote: >>> Sometime, you guys are just impossible... >>> >>> Max >>> >>> >>> -----Original Message----- >>> From: accessd-bounces at databaseadvisors.com >>> [mailto:accessd-bounces at databaseadvisors.com] On Behalf Of Jim Dettman >>> Sent: 30 September 2009 23:36 >>> To: 'Access Developers discussion and problem solving' >>> Subject: Re: [AccessD] Table size >>> >>> >>> 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. > >