2009-10-07 9 views

Respuesta

2

Para bases de datos de acceso que funcionen puede obtener la herramienta sencilla Access Memory Reporter 1.0 que muestra la cantidad de memoria las tablas e índices necesidades. Tenga en cuenta que no he probado esta herramienta yo mismo.

¿Cuál es su objetivo una vez que descubre la tabla más grande? ¿Qué tan grande es tu MDB? ¿Lo has compactado recientemente?

¿Cuánto se contrae al compactarlo? ¿Es así que creas y eliminas muchas tablas/registros? Si es así, vea el TempTables.MDB page en mi sitio web que ilustra cómo usar un MDB temporal en su aplicación.

¿Utiliza muchos gráficos en las tablas?

+0

Gracias por señalar esa herramienta. Desafortunadamente, la herramienta me dice solo que la mayor parte del espacio está ocupado por datos "Memo/OLE", pero no me dice qué tabla contiene cuántos datos "Memo/OLE". En cambio, todos los datos "Memo/OLE" se agrupan bajo un encabezado "## no relacionado directamente con una tabla ##". Comprimir la base de datos no ayuda; el archivo MDB no se contrae en absoluto. - Frank –

+0

Como solución alternativa, ahora importé la base de datos MDB a SQL Server, y en SQL Server Management Studio, agregué la columna "Espacio de datos utilizado" a la vista de lista. Esto me dice qué tabla usa cuánto espacio. Usando ese procedimiento, descubrí que una sola tabla en mi base de datos casi usa todo el espacio en disco. –

+0

Los datos Memo/OLE no se almacenan realmente en el registro. En su lugar, hay un puntero a una página donde se almacena realmente cada Memo/OLE. Por lo tanto, no es realmente con el registro. Sin embargo, hay algún código VBA que podría ejecutar para determinar qué tablas tienen campos Memo/OLE y cuántos de ellos hay. Hmm, y posiblemente el tamaño de cada uno, pero tendría que insistir un poco en eso. Aunque ahora parece haber descubierto qué tabla ocupa el espacio. –

3

Esto es realmente un problema interesante porque Access usa registros de longitud variable para almacenar sus datos.

La mejor manera de hacerlo con precisión sería pasar por cada registro y cada campo de la tabla y sumar la longitud de los campos. Podría tomar un tiempo si las tablas son grandes. No aumentaría el tamaño debido a los índices y las relaciones.

En nuestro programa Total Access Analyzer, tenemos algunos informes que proporcionan una estimación del tamaño de la tabla utilizando una estimación de tamaño de registro simple por el número de registros. Aquí se muestra un ejemplo: http://fmsinc.com/MicrosoftAccess/Documentation/Reports/Table_SizeBySize.html

Eso podría ser suficiente para las estimaciones de los estadios o las comparaciones de tamaño relativo.

Otra forma, y ​​probablemente muy precisa, de medir esto sería crear una nueva base de datos y exportarla a ella. Compacte la base de datos y reste el tamaño de la base de datos en blanco para obtener el tamaño de la tabla.

+2

+ 1 para la sugerencia "crear una nueva base de datos y exportar la tabla" en lugar del enchufe desvergonzado;) – onedaywhen

1

Estoy usando Access 2003, es fácil obtener el recuento de registros de la tabla. Recuento de registros de tabla significa el tamaño del tamaño de la tabla. Cuanto más registro, mayor tamaño. ¿Cómo obtener el recuento de registros de la tabla?

  1. Abrir la base de datos de Access 2003,
  2. Haga clic en la pestaña "Herramientas de base de datos"
  3. Haga clic en "Base de datos documental herramienta Administrar" (puede ser algún otro nombre.)
  4. Haga clic en "Todos", y " OK "
  5. Verá una nueva página de fondo blanco que muestra la información de la tabla de todas las tablas. Exportar a txt haciendo clic en "TXT" (debajo del ícono de Word)
  6. Guardarás el TXT en un archivo. Vamos a llamarlo tableinfor.txt
  7. Abra "tableinfo.txt" por el editor txt. palabras clave de búsqueda "RecordCount". Creo que sabes qué mesa ocupa más espacio.
+1

No creo que ayude: supongamos que tiene dos tablas T1 y T2, cada una con un campo de tipo Memo. T1 tiene 1 millón de registros, y cada campo memo contiene 1 carácter; T2 tiene 1,000 registros, y cada campo memo contiene 10,000 caracteres. Entonces, T2 claramente consume más espacio que T1 (es decir, aproximadamente 10 veces más). Pero el recuento de registros de T2 será mucho menor que T1. –

0

Puede copiar cada tabla individualmente en bases de datos de Access separadas, luego comparar el tamaño de cada una. Aunque no le daría el tamaño exacto de las tablas, el tamaño de cada archivo muestra aproximadamente el tamaño de cada tabla.

2

Sé que esta es una publicación anterior, pero tengo una solución basada en mi propia experiencia con la misma pregunta. Mi solución es exportar todas las tablas a archivos de texto. El tamaño de cada archivo de texto es aproximadamente proporcional a la cantidad de espacio que utiliza en el archivo mdb/accdb.

El código siguiente creará una subcarpeta "temp_table_size" en la carpeta de la base de datos actual y exportará todas las tablas a la misma. Puede pasarle un parámetro para procesar solo las tablas locales. Cuando termina, le dice cuántas tablas se exportaron y le pregunta si desea abrir la carpeta. Ordene esa carpeta por Tamaño e identificará rápidamente a los culpables. Utilizo esta rutina para buscar tablas que pueda haber olvidado borrar antes de la implementación, o para ayudarme a entender dónde están las tablas cuando heredo la base de datos de otra persona.

Para que esta rutina sea aún más útil para mí, agregué este código a un complemento de Access para poder ejecutarlo en cualquier base de datos. Ese complemento también tiene características para exportar todos los demás objetos de acceso para que pueda ver qué formularios/informes ocupan espacio en la base de datos. Tal vez encuentre un lugar para compartirlo si hay algún interés.

Public Sub DocDatabase_Table(Optional bolLocalTablesOnly As Boolean = False) 
'==================================================================== 
' Name: DocDatabase_Table 
' Purpose: Exports the tables in this database to a series of 
'   text files. The size of each text file will give you 
'   an idea of what tables use the most disk space. 
' 
' Author: Ben Sacherich 
' Date: 5/2/2011 
'==================================================================== 
    On Error GoTo ErrorHandler 

    Dim dbs As Database 
    Dim td As TableDef 
    Dim strSaveDir As String 
    Dim lngObjectCount As Long 
    Dim lngCount As Long 
    Dim strMsg As String 
    Dim varReturn As Variant 

    Set dbs = CurrentDb() ' use CurrentDb() to refresh Collections 

    ' Export to a subfolder of the current database folder. 
    strSaveDir = CurrentProject.path & "\temp_table_size\" 

    If Len(strSaveDir) > 0 Then 

     strMsg = "This feature exports all of the tables in this database to a series of " _ 
      & "comma delimited text files. The size of each text file will give you " _ 
      & "an idea of what tables use the most disk space." & vbCrLf & vbCrLf 

     ' Get a count of the tables, minus the system tables. 
     If bolLocalTablesOnly = True Then 
      lngObjectCount = DCount("Name", "MSysObjects", "Type=1 AND Name not like 'MSys*' AND Name not like '~*'") 
      strMsg = strMsg & "There are " & lngObjectCount & " local tables in this database. " _ 
       & vbCrLf & vbCrLf 
     Else 
      ' Include Local, Linked, and ODBC tables 
      lngObjectCount = DCount("Name", "MSysObjects", "Type in (1,4,6) AND Name not like 'MSys*' AND Name not like '~*'") 
      strMsg = strMsg & "There are " & lngObjectCount & " tables in this database " _ 
       & "(including local, linked, and ODBC)." & vbCrLf & vbCrLf 
     End If 
     strMsg = strMsg & "The tables will be exported to a subfolder of the current database: " _ 
      & strSaveDir & vbCrLf & vbCrLf 
     strMsg = strMsg & "Do you want to continue?" 

     If MsgBox(strMsg, vbYesNo + vbInformation, "Export Tables") = vbYes Then 

      If Dir(strSaveDir, vbDirectory) = "" Then 
       MkDir strSaveDir 
      End If 

      ' Initialize and display message in status bar. 
      varReturn = SysCmd(acSysCmdInitMeter, "(" & Format((lngCount)/lngObjectCount, "0%") & ") Preparing tables", lngObjectCount) 

      dbs.TableDefs.Refresh 
      For Each td In dbs.TableDefs ' Tables 
       If (bolLocalTablesOnly = True And Len(td.Connect) = 0) _ 
        Or (bolLocalTablesOnly = False) Then 

        If Left(td.Name, 4) <> "MSys" And Left(td.Name, 1) <> "~" Then 
         Debug.Print td.Name, td.Attributes 

         ' Update message in status bar. 
         varReturn = SysCmd(acSysCmdSetStatus, "(" & Format((lngCount + 1)/lngObjectCount, "0%") _ 
          & ") Exporting table: " + td.Name) 

         DoCmd.TransferText acExportDelim, , td.Name, strSaveDir & "Table_" & td.Name & ".txt", True 
         lngCount = lngCount + 1 

        End If 
       End If 
      Next td 

      'Remove the Progress Meter 
      varReturn = SysCmd(acSysCmdRemoveMeter) 

      If MsgBox("Exported " & lngCount & " object(s)." _ 
       & vbCrLf & vbCrLf & "Do you want to open the destination folder: " & strSaveDir & " ? " _ 
       , vbSystemModal + vbYesNo + vbInformation, "Table Size") = vbYes Then 

       ' Open the output folder in Windows Explorer 
       Call Shell("explorer.exe " & strSaveDir, vbNormalFocus) 
      End If 
     End If 
    End If 

Exit_Sub: 
    Set td = Nothing 
    Set dbs = Nothing 

    Exit Sub 

ErrorHandler: 

    Debug.Print Err.Number, Err.Description 
    Select Case Err 
     Case "3011" 
      MsgBox "Table '" & td.Name & "' could not be found or has a broken link." _ 
       & vbCrLf & vbCrLf & "Link: " & td.Connect _ 
       & vbCrLf & vbCrLf & "Click OK to continue.", vbExclamation, "Error 3011" 
      Resume Next 
     Case "75" 
      ' This happens when you try to create a folder name that already exists. 
      ' For this Q&D function, ignore the error. 
      Resume Next 
     Case Else 
      MsgBox Err.Description 
      Resume Next 
    End Select 

    GoTo Exit_Sub 

End Sub 
Cuestiones relacionadas