webForumDet fria alternativet

Raderar tusentals poster i Accessdatabas men samma filstorlek

Databaser & SQL

18 svar · 632 visningar · startad av bassebhu

Medlem sedan nov. 20016 480 inlägg
Frågan#1

Hej!

Har en accessdatabas som är på 23MB! Körde lite delete-funktioner och raderade sisådär 30 000 poster. När jag uppdaterar listan i mitt ftp-program säger den fortfarande att databasen är 23MB! Vad göra?

Lagrar den raderade poster i nån slags temporär osynlig trashtabell i databasen? Hur tömmer man den i så fall?

Jag kan nämlien inte ladda ner och ändra i databasen själv då MS Access inte finns till mac som bekant.

Tack!

Mvh,

R// Ja, det finns ett Access-forum men min fundering är om jag via ASP kan tömma databasen?
Och varför Access? Jadu, ung och dum ;) Nån som kan säga hur jag på ett smidigt sätt ska få över 23MB till mysql utan MS Access? Någon smidig ASP-lösning till och med? :D

Medlem sedan sep. 20011 722 inlägg
#2

Ta och öppna databasen i Access och välj repare databas som finns under verktyg om jag inte minns fel. Borde göra susen!

Medlem sedan mars 20015 287 inlägg
#3

Låt någon som har tillgång till Access ladda ner databasen och reparera/optimera den kanske.

Medlem sedan juli 200012 978 inlägg
#4

Reparera / Komprimera gör hela jobbet
Om du inte har tillgång till det kanske du kan ta och importera samt Exportera.
Skall inte vara några problem Jag tror att ver 2002 och senare gör vissa sådana saker med automatik.

Medlem sedan feb. 200112 078 inlägg
#5

Access har, enligt vad jag vet, den lilla egenheten att inte radera rader, utan snarare inaktivera raden det handlar om. Det är antagligen därför din databas inte minskar i storlek.

Jag har varit med om exakt samma sak, och med risk för att låta tjatig; komprimera / reparera databasen.

Medlem sedan juni 20022 599 inlägg
#6

OveRRidE skrev:

Access har, enligt vad jag vet, den lilla egenheten

Nån egenhet för Access är det väl knappast? Den databas som började skyffla X MB ett steg åt vänster därför att man plockade bort byte nummer 1 skulle ju få svarstider som inte liknade nånting.

SQL Server uppför sig på exakt samma sätt (förutom att det finns bättre möjligheter att schemalägga komprimeringar/shrinks).

Medlem sedan dec. 200012 464 inlägg
#7

Flyttas från ASP.

Medlem sedan nov. 20016 480 inlägg
#8

Lasp skrev:

Reparera / Komprimera gör hela jobbet
Om du inte har tillgång till det kanske du kan ta och importera samt Exportera.
Skall inte vara några problem Jag tror att ver 2002 och senare gör vissa sådana saker med automatik.

Ok, tack för svaren.

Om jag inte har tillgång till? MS Access? Så ska jag importera och exportera med? Version 2002 av vad? :)

Tack!

Medlem sedan juli 200012 978 inlägg
#9

Du kan ju komma åt data med flera typer av verktyg.
Det finns ju typ AQT eller Dbmgr2 som borde kunna hantera detta.
Alternativ är ju som någon skrev zippa hem den och låt någon köra komprimering. Hör av dig om du inte finner någon i närheten.

Medlem sedan juni 20022 599 inlägg
#10

Det går även bra att komprimera direkt på plats via ADO eller DAO (om man ser till att ha exklusiv låsning på databasen under tiden).

http://www.askasp.com/articles.asp?ArtID=29

Medlem sedan feb. 200112 078 inlägg
#11

niko skrev:

OveRRidE skrev:

Access har, enligt vad jag vet, den lilla egenheten

Nån egenhet för Access är det väl knappast? Den databas som började skyffla X MB ett steg åt vänster därför att man plockade bort byte nummer 1 skulle ju få svarstider som inte liknade nånting.

Som sagt, jag har ingen aning om hur en DBMS (eller Access) kärnfunktioner fungerar, så det vet nog du bäst. Jag vidhåller dock att det förefaller sig ganska underligt att den behåller sin storlek, hela tiden. Därav uttrycket 'egenhet', som jag tycker passar ganska bra, eftersom det resulterar i det fenomen som diskuteras.

Rensas dessa rader efter ett tag? Finns det någon lösning, programmatiskt, att lösa en komprimering?

RED. Där kom den länken, ja. Tackar. :)

Medlem sedan juni 20022 599 inlägg
#12

OveRRidE skrev:

Jag vidhåller dock att det förefaller sig ganska underligt att den behåller sin storlek

Och jag vidhåller att det inte är underligt eller specifikt för Access om man tänker på två saker:

1. Databaser växer ofta, men krymper sällan.
2. Folk förväntar sig att databaser ska vara snabba.

Om vi tänker oss att du har en databas på X Gig och via en UPDATE ändrar 'pelle' till 'per' så har databasmotorn två val:

A. Sätta igång som en vettvilling och skyffla/packa data fram och tillbaka för att du ska tjäna 4(!) bytes diskutrymme.

B. Behålla diskallokeringen och bara ändra längdmarkeringen på datan och iskallt räkna med att du (eller nån annan) för eller senare kanske ändrar tillbaka till 'pelle' (eller nåt ännu längre).

Taktik B är nog det som används av de flesta databaser oftast (finns säkert undantag i olika sammanhang).

OveRRidE skrev:

Rensas dessa rader efter ett tag? Finns det någon lösning, programmatiskt, att lösa en komprimering?

Ja, det flesta databaser har ju just separata funktioner för komprimering av den anledningen att det är bättre krympa mycket men sällan, än att krympa lite men ofta. Desa funktioner går väl sen i allmänhet att komma åt programmatiskt om man vill det.

Medlem sedan feb. 200112 078 inlägg
#13

Klart som korvspad. :)

Det jag menade var dock att jag tycker att Access borde ha sin 'komprimerings'-runda lite oftare än.. låt säga aldrig, som jag upplever det i vissa fall i dagsläget.

Extra frågor; ponera dessa två händelser i databasen med förutsättningen att tabellen 'qwerty' innehåller 5000 rader med ganska lika mängd data på varje rad.

1. En DELETE på alla rader i 'qwerty' körs.
2. En INSERT med 5000 nya rader i 'qwerty' körs.

Gäller samma princip då också?

RED. Tilläggsfråga; Om jag kör DROP på en tabell full med data och sedan skapar en identisk tom tabell, hur ser det ut då?

Medlem sedan nov. 20016 480 inlägg
#14

Tack ska kolla in det som stod i länken sen. Undrar om webbhotellet har stöd för det.

Anledningen till att jag inte vill skicka iväg databasen till någon är för att det finns en mängd personuppgifter i den och hur mycket man än litar på någon så känns det fel. Dessutom har jag redan skickat iväg databaser till folk i 2 år nu och känns som att jag vill kunna ändra när jag vill själv trots att jag har mac. Dumt att köra access från början men nu blev det så. Ska se om jag kan få tag på MS Access och köra det via mitt Virtual PC Windows 98. Segt men kanske bästa alternativet ändå.

Medlem sedan juni 20022 599 inlägg
#15

OveRRidE skrev:

Det jag menade var dock att jag tycker att Access borde ha sin 'komprimerings'-runda lite oftare än.. låt säga aldrig, som jag upplever det i vissa fall i dagsläget.

Jag vet inte hur det är med nyare access-versioner, men vad jag vet kör inte Access några "komprimerings-rundor" alls av den anledningen att den inte vet hur den kommer att belastas och därför inte kan avgöra när det skulle vara lämpligt att göra det. Det överlåter den till användaren.

OveRRidE skrev:

Extra frågor; ponera dessa två händelser i databasen med förutsättningen att tabellen 'qwerty' innehåller 5000 rader med ganska lika mängd data på varje rad.

1. En DELETE på alla rader i 'qwerty' körs.
2. En INSERT med 5000 nya rader i 'qwerty' körs.

Gäller samma princip då också?

RED. Tilläggsfråga; Om jag kör DROP på en tabell full med data och sedan skapar en identisk tom tabell, hur ser det ut då?

Jag har verkligen ingen aning om hur access (eller nån annan databas) fungerar internt så jag misstänker att du får experimentera. Det enda man kan säga är att de flesta kanske använder principer som:

1. Det är snabbare att förallokera 1 MB en gång (även om man behöver mindre) än att allokera 1 KB 1024 ggr just i det ögonblick man behöver det.

2. Det är snabbare att behålla en redan allokerad struktur därför att man förmodligen kan återanvända den senare, än att riva ner allt och bygga upp på nytt vid varje fråga.

Vad gäller just DROP så säger mig min erfarenhet att du kan droppa samtliga tabeller i en fet SQL Server-databas utan att den fysiska MDF-filen på disk minskar med en enda byte (förrän man gör en manuell "shrink" eller kör nån "Autoshrink").

Medlem sedan feb. 200112 078 inlägg
#16

Undrar om webbhotellet har stöd för det.

JRO gick ju att använda ifall MDAC 2.1 eller senare är installerat på servern, vilket de borde ha vid det här laget.

Medlem sedan nov. 20016 480 inlägg
#17

Härligt! De tre asp-koderna spann som katten jansson.

<%
Set Engine = CreateObject("JRO.JetEngine")
Engine.CompactDatabase "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=db.mdb", _
"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=komprimerad_db.mdb"
%>

Jag fick ta hela sökvägen dock. Hur skriver man om det till direkt sökväg nu igen?

Körde filen i webbläsaren och det tog ett ganska bra tag :) Eller den gav ett fel efter typ 5min. Men databasen blev från 23MB till 9MB och jag märker inget fel på nya databasen trots webbläsarens fel så allt är väl frid och fröjd :D

Ska ändå testa med Access i virtual pc också.

Tack!

Medlem sedan feb. 200112 078 inlägg
#18

Jag fick ta hela sökvägen dock. Hur skriver man om det till direkt sökväg nu igen?

Jag antar att du menar från virtuell sökväg till fysisk?

Isåfall:

<%
Set Engine = CreateObject("JRO.JetEngine")
Engine.CompactDatabase "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & server.mappath("db.mdb"), _
"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & server.mappath("komprimerad_db.mdb")
%>
Medlem sedan nov. 20016 480 inlägg
#19

ahh, just så. tack :D

264 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e
123 ms — deklarationer (db)
0 ms — hämta statistik (cache)
138 ms — hämta tråd, inlägg och bilagor (db)
120 ms — ändringar (db)