2009-10-07 18 views

Odpowiedz

2

do funkcjonowania baz danych Access można uzyskać prostego narzędzia Access Memory Reporter 1.0 który pokazuje ilość pamięci tabel i indeksów potrzeb. Zauważ, że sam nie wypróbowałem tego narzędzia.

Jaki jest twój cel, gdy odkryjesz największy stół? Jak duży jest twój MDB? Czy ostatnio zagęściłeś go?

Ile kurczy się podczas kompaktowania? Czy tworzysz i usuwasz wiele tabel/rekordów? Jeśli tak, zobacz stronę TempTables.MDB page na mojej stronie internetowej, która przedstawia sposób korzystania z tymczasowego pliku MDB w aplikacji.

Czy używasz dużej ilości grafik w tabelach?

+0

Dzięki za wskazanie tego narzędzia. Niestety, narzędzie mówi mi tylko, że większość miejsca zajmuje dane "Memo/OLE", ale nie mówi mi, która tabela zawiera dane "Memo/OLE". Zamiast tego wszystkie dane "Memo/OLE" są zgrupowane pod nagłówkiem "## niezwiązanym bezpośrednio z jedną tabelą ##". Kompresowanie bazy danych nie pomaga; plik MDB wcale się nie kurczy. - Frank –

+0

Jako obejście, zaimportowałem teraz bazę danych MDB do serwera SQL, aw SQL Server Management Studio dodałem kolumnę "Wykorzystane miejsce danych" do widoku listy. To mówi mi, która tabela używa ile miejsca. Korzystając z tej procedury, dowiedziałem się, że pojedyncza tabela w mojej bazie danych prawie wykorzystuje całą przestrzeń dyskową. –

+0

Dane Memo/OLE nie są faktycznie przechowywane w rekordzie. Zamiast tego znajduje się wskaźnik do strony, na której zapisane są wszystkie notatki/OLE. Więc tak naprawdę nie jest z tą płytą. Istnieje jednak kod VBA, który można uruchomić w celu określenia, które tabele mają pola Memo/OLE i ile z nich istnieje. Hmm, i prawdopodobnie każdy z nich, ale musiałbym trochę o tym pogadać. Chociaż wydaje się, że zorientowałeś się, który stół zajmuje miejsce. –

3

Jest to rzeczywiście interesujący problem, ponieważ program Access używa rekordów o zmiennej długości do przechowywania danych.

Najlepszym sposobem, aby to zrobić dokładnie, byłoby przejrzenie każdego rekordu i każdego pola tabeli i zsumowanie długości pól. Może minąć trochę czasu, jeśli stoły są duże. Nie zwiększyłoby to rozmiaru ze względu na indeksy i relacje.

W naszym programie Total Access Analyzer mamy kilka raportów, które przedstawiają szacunkową wielkość tabeli za pomocą prostego szacunku rozmiaru rekordu pomnożonego przez liczbę rekordów. Przykład pokazano tutaj: http://fmsinc.com/MicrosoftAccess/Documentation/Reports/Table_SizeBySize.html

To może wystarczyć do oszacowania pola walki lub porównania względnej wielkości.

Innym i prawdopodobnie bardzo dokładnym sposobem pomiaru byłoby utworzenie nowej bazy danych i wyeksportowanie do niej tabeli. Kompaktuj bazę danych i odejmij od niej rozmiar pustej bazy danych, aby uzyskać rozmiar tabeli.

+2

+ 1 dla "Utwórz nową bazę danych i wyeksportuj tabelę" zamiast bezwstydnej wtyczki;) – onedaywhen

1

Używam programu Access 2003, łatwo jest uzyskać liczbę rekordów tabeli. Liczba rekordów w tabeli oznacza rozmiar rozmiaru tabeli. Im więcej rekordu, tym większy rozmiar. Jak uzyskać numer rekordu tabeli?

  1. Otwórz bazę danych przez program Access 2003,
  2. wybierz zakładkę "Narzędzia bazy danych"
  3. Kliknij "Document Database Zarządzanie Tool" (może być inna nazwa).
  4. Kliknij "All", a " OK "
  5. Zobaczysz nową białą stronę główną zawierającą informacje o stole dla wszystkich tabel. Eksportuj do txt, kliknij "TXT" (pod ikoną Word)
  6. Zapisujesz TXT do pliku. Nazwijmy go tableinfor.txt
  7. Otwórz "tableinfo.txt" przez edytor txt. wyszukaj słowa kluczowe "RecordCount". Myślę, że wiesz, która tabela zajmuje najwięcej miejsca.
+1

Nie sądzę, że to pomoże: załóżmy, że masz dwie tabele T1 i T2, każda z jednym polem typu Memo. T1 ma 1 milion rekordów, a każde pole memo zawiera 1 znak; T2 ma 1000 rekordów, a każde pole memo zawiera 10 000 znaków. Następnie T2 zużywa wyraźnie więcej miejsca niż T1 (a mianowicie około 10 razy więcej). Ale rekordowa liczba T2 będzie znacznie mniejsza niż T1. –

0

Można skopiować każdą tabelę indywidualnie do oddzielnych baz danych programu Access, a następnie porównać jej rozmiar. Chociaż nie dałoby to dokładnego rozmiaru samych tabel, rozmiar każdego pliku pokazuje w przybliżeniu rozmiar każdej tabeli.

2

Wiem, że to stary post, ale mam rozwiązanie oparte na moim własnym doświadczeniu z tym samym pytaniem. Moim rozwiązaniem jest eksportowanie wszystkich tabel do plików tekstowych. Rozmiar każdego pliku tekstowego jest w przybliżeniu proporcjonalny do tego, ile miejsca zajmuje w pliku mdb/accdb.

Poniższy kod utworzy podfolder "temp_table_size" w bieżącym folderze bazy danych i wyeksportuje do niego wszystkie tabele. Możesz przekazać mu parametr, który przetwarza tylko lokalne tabele. Po zakończeniu informuje, ile tabel zostało wyeksportowanych i zapyta, czy chcesz otworzyć folder. Sortuj ten folder według rozmiaru, aby szybko zidentyfikować winnych. Korzystam z tej procedury, aby znaleźć tabele, które być może zapomniałem wyczyścić przed wdrożeniem lub aby pomóc mi zrozumieć, gdzie znajdują się duże tabele, gdy dziedziczę bazę danych innej osoby.

Aby ta procedura była dla mnie jeszcze bardziej przydatna, dodałem ten kod do dodatku Access, dzięki czemu mogę go uruchomić w dowolnej bazie danych. Ten dodatek ma również funkcje eksportowania wszystkich innych obiektów programu Access, dzięki czemu widzę, jakie formularze/raporty zajmują miejsce w bazie danych. Może znajdę miejsce, w którym mógłbym je udostępnić, jeśli są jakieś zainteresowania.

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 
Powiązane problemy