it-swarm-eu.dev

Velikost databáze serveru SQL se po odstranění velkého počtu řádků nesnížila.

Nejsem dobrý v SQL, ale musím udržovat databázi.

Nemá téměř žádné místo, takže jsem se rozhodl smazat všechna data pro, řekněme, rok 2008. Po provedení smazacího dotazu (měl asi 10 000 000 řádků vyčištěno) a vyčištění protokolu transakcí jsem zjistil, že můj akce neměly žádný vliv na velikost databáze. Musím ještě něco udělat?

30
Marat

Zatímco smršťování je skutečně nebezpečné z důvodů uvedených zde. Mezi Jimboho odpovědí a Johnovou odpovědí existuje šťastné médium ... Vždy byste měli vážně zvážit, zda chcete databázi zmenšit či nikoli.

V ideálním světě - vytvořili byste svou databázi se spoustou volného místa, do kterého byste se mohli rozrůst. Tuto databázi nazývám „správná velikost“. Umožnili byste, aby byl tento volný prostor k dispozici, a nesnažte se jej vrátit a udržet svou celkovou velikost přímo na použité velikosti. Proč? Protože vaše databáze nakonec poroste znovu. Pak se znovu zmenšíte .. A budete uvíznuti v tomto strašném vzoru zbytečných smršťování následovaných růsty - a celou dobu, jak několik poukázalo, budete zvýšení fragmentace indexu.

Blogoval jsem o tom, kde jsem napomenul lidi na " Nedotýkejte se toho zmenšovacího tlačítka! ", ale někdy ... Někdy musíte. Pokud máte rozsáhlou databázi, právě jste uvolnili významný prostor a neočekáváte, že se do ní někdy vrátí - dobře, pak je v pořádku zvážit zmenšení jako jednorázovou operaci, pokud se budete moci postarat o fragmentaci vašeho indexu později přestavbou jim. Operace smršťování může být časově náročná, takže byste ji měli naplánovat na dobu, kdy můžete zaplatit tuto cenu běžícího smršťování. Postup vytváření prázdné DB a kopírování dat do něj funguje - ale to se může stát velmi obtížným u větších databází a mnoha dat.

Pokud plánujete přidat tento prostor zpět do DB pomocí běžného využití a růstových vzorců do budoucna, pak možná budete chtít místo ponechat.

Také Řekli jste, že jste „vymazali“ svůj protokol transakcí. Byl bych zvědavý, jak jste to udělali, ale když čtete příspěvek, který jsem sdílel, a ostatní v řadě uvidíte několik tipů na správu protokolu transakcí. Ale zkrátka - pokud jste v režimu úplného zotavení, měli byste brát pravidelné zálohy protokolu, abyste si udrželi opakované použití protokolu. V opačném případě - bez záloh protokolu v režimu Full - soubor protokolu neustále roste a roste a roste a vždy ukládá to, co jste udělali, protože jste řekli SQL, že nechcete jen udržovat tento protokol pro zotavení po havárii, ale chcete zachovat jeho ruční zálohování pro přehrání transakcí/vrácení transakcí pro obnovení do určitého bodu v čase pro účely obnovy ... Pokud jste v jednoduchosti a vidíte, jak se protokol rozrůstá, může to být znak (obvykle), že děláte LOT práce v jedné transakci (ať už jste řekli BEGIN TRAN ... do work.... COMMIT TRAN nebo zda jste právě vydali jeden velký příkaz DELETE a odstranili jste celou nepořádek dat v jedné implicitní transakci.)

Předpokládám také, že hledáte toto volné místo ve vašem systému souborů. Pokud to hledáte v rámci SQL a v tak velkém souboru, který máte - mohlo by to být tak, že čekáte na vyčištění ducha, aby se dokončilo, pokud se budete dívat ihned po operaci. Paul Randal blogy o Ghost Cleanup .

18
Mike Walsh

Odstranění řádků v databázi nezmění skutečnou velikost souboru databáze.

Po smazání řádku musíte databázi zkomprimovat.

SQL Server 2005 DBCC SHRINKDATABASE (Transact-SQL)

Po spuštění budete chtít znovu vytvořit indexy. Zmenšení obvykle způsobuje fragmentaci indexu, což by mohlo představovat značné náklady na výkon.

Doporučuji také, abyste po zmenšení soubory znovu pěstovali, abyste měli dostatek volného místa. Tímto způsobem, když přicházejí nové řádky, nespouštějí automatický růst. Autogrowth má náklady na výkon a je něco, čemu byste se chtěli vyhnout (prostřednictvím správného dimenzování databáze), kdykoli je to možné.

9
John Siu

NEZARUČUJTE DATABÁZE!

„Proč se to děje? Operace zmenšení datového souboru pracuje najednou na jednom souboru a pomocí bitmapy GAM (viz Inside The Storage Engine: GAM, SGAM, PFS a další mapy přidělení) najde nejvyšší stránku přidělenou v posune jej tak daleko dopředu, jak to jde, a tak dále atd. Ve výše uvedeném případě zcela obrátil pořadí seskupeného indexu, přičemž jej převedl z dokonale defragmentovaného na dokonale fragmentovaný. "

http://www.sqlskills.com/BLOGS/PAUL/post/Why-you-should-not-shrink-your-data-files.aspx

„Podívejte se na ironii zmenšující se databáze. Jedna osoba zmenší databázi, aby získala prostor (domnívala se, že to pomůže výkonu), což povede ke zvýšení fragmentace (snížení výkonu). Chcete-li snížit fragmentaci, jeden znovu vytvoří index, což povede k velikosti databáze, která má zvětšit cestu více, než je původní velikost databáze (před smrštěním). Tím, zmenšovat, člověk nezískal to, co obvykle hledal. "

http://blog.sqlauthority.com/2011/01/19/sql-server-shrinking-database-is-bad-increases-fragmentation-reduces-performance/

4
Jimbo

Když odstraníte data, SQL Server si vyhrazuje prostor pro pozdější použití pro vkládání nových dat. Musíte zmenšit databázi. Více informací zde .

2
Amrinder Singh

Našel jsem to, protože jsem právě smazal spoustu záložních tabulek, protože moje databáze byla „maximalizována“. Pořád jsem se díval na vlastnost „Velikost“ a přemýšlel proč se to nezmenšuje?. Po přečtení tohoto, ne, já nechci zmenšit databázi. Co chci udělat, je „získat zpět“ místo pro nevyžádanou poštu, kterou jsem právě smazal. To, na co jsem se musel dívat, bylo „dostupné místo“. Myslím, že to je to, co by se na to mohl podívat i někdo jiný.

1
Josetta Caudill

Za zmínku také stojí, že pokud tabulka obsahuje indexy, může fragmentace po odstranění velkých datových toků existovat. Dnes jsem měl stůl, který měl v něm ~ 70 milionů záznamů, což trvalo asi 13 GB. Vyčistil jsem to až na 1639 záznamů (ostatní byly generovány jednou chybou), ale tabulka stále zabírala kolem 4,5 GB. Poté, co jsem znovu vytvořil všechny indexy v tabulce, trvalo to pouze 85 stránek (680kb). Poté jsem použil inkrementální smršťovací soubor k získání prostoru (a opravil chybu v systému, aby se zabránilo opakování).

0
G.Smith