View Full Version : [FireBird] Qual'è il comando equivalente di OPTIMZE TABLE ?
Vorrei riuscire a deframmentare il database in firebird ma non riesco a capire come si fa.
Da ricerche su internet mi sembra di aver capito che si usi il comando SWEEP, ma come lo posso dare tramite una query un po' come si fa con OPTIMIZE in mysql ?
Grazie.
cdimauro
19-11-2008, 08:15
Al volo, che come al solito sono di corsa.
Per deframmentare il db devi necessariamente effettuare un suo backup e successivo restore.
Se invece vuoi ottimizzare gli indici, devi cancellarli e ricrearli (è consigliabile farlo ogni tanto).
Se vuoi ottimizzare le query sulle tabelle perché non ti piace il risultato dell'ottimizzatore, devi usare PLAN alla fine delle istruzioni (nel manuale di InterBase c'è una ricca e dettagliata sezione su come verificare il plan che tira fuori automaticamente l'ottimizzatore, e su come forzarne uno manualmente uno tramite la sezione PLAN, appunto).
Ok, però sul software IBOConsole c'è la funzione SWEEP.
Come fa ad ottenerla ?
Che comando da ?
cdimauro
19-11-2008, 19:04
IBOConsole s'interfaccia direttamente con la libreria fbclient.dll che espone tutte le API per accedere al server, fra cui quella che permette di forzare lo sweep.
Non mi risulta sia possibile invocare lo sweep tramite un comando SQL.
IBOConsole s'interfaccia direttamente con la libreria fbclient.dll che espone tutte le API per accedere al server, fra cui quella che permette di forzare lo sweep.
Non mi risulta sia possibile invocare lo sweep tramite un comando SQL.
Ma lo sweep automatico ogni tot transazioni funziona anche in modalità embedded o solo in modalità server ?
cdimauro
20-11-2008, 07:27
In entrambi i casi.
Non ci sono sostanziali differenze con FireBird usato come server o embedded, a parte ovviamente collegarti in locale e farlo girare nello stesso processo dell'applicazione in quest'ultimo caso.
In entrambi i casi.
Non ci sono sostanziali differenze con FireBird usato come server o embedded, a parte ovviamente collegarti in locale e farlo girare nello stesso processo dell'applicazione in quest'ultimo caso.
Allora quando voglio fare lo sweep manuale potrei impostare a 2 lo Sweep interval e poi creare e cancellare un record in una qualsiasi tabella, poi rimettere lo Sweep interval a 0.
Ma il client come fa ad accorgersi che lo sweep è in corso ? E quanto manca alla fine? Può usare il database anche durante lo sweep ?
Allora quando voglio fare lo sweep manuale potrei impostare a 2 lo Sweep interval e poi creare e cancellare un record in una qualsiasi tabella, poi rimettere lo Sweep interval a 0.
Ma il client come fa ad accorgersi che lo sweep è in corso ? E quanto manca alla fine? Può usare il database anche durante lo sweep ?
Se chiudo l'applicazione client mentre il database embedded sta facendo lo sweep poi quando riavvio l'applicazione riparte anche lo sweep da dove era rimasto?
cdimauro
21-11-2008, 19:23
Allora quando voglio fare lo sweep manuale potrei impostare a 2 lo Sweep interval e poi creare e cancellare un record in una qualsiasi tabella, poi rimettere lo Sweep interval a 0.
Puoi usare il comando gfix per far partire lo sweep manualmente, oppure utilizzare le API di fbclient.dll per invocarlo.
Ma il client come fa ad accorgersi che lo sweep è in corso ?
Non se ne accorge: è un processo totalmente trasparente, e il client può continuare a lavorare normalmente.
E quanto manca alla fine?
Non lo sa.
Può usare il database anche durante lo sweep ?
Sì, puoi farlo.
Se chiudo l'applicazione client mentre il database embedded sta facendo lo sweep poi quando riavvio l'applicazione riparte anche lo sweep da dove era rimasto?
Per le applicazioni embedded se parte lo sweep, dovrebbe continuare finché non ha finito.
Il mio consiglio in questi casi è quello di disabilitarlo, e di eseguirlo manualmente una tantum.
Ho recuperato 3 paginette che ti potrebbero essere utili per capire meglio come funziona questo meccanismo di garbage collection:
http://www.firebirdfaq.org/faq321/
http://www.firebirdfaq.org/faq312/
http://www.firebirdfaq.org/faq13/
Puoi usare il comando gfix per far partire lo sweep manualmente, oppure utilizzare le API di fbclient.dll per invocarlo.
Non se ne accorge: è un processo totalmente trasparente, e il client può continuare a lavorare normalmente.
Non lo sa.
Sì, puoi farlo.
Per le applicazioni embedded se parte lo sweep, dovrebbe continuare finché non ha finito.
Il mio consiglio in questi casi è quello di disabilitarlo, e di eseguirlo manualmente una tantum.
Ho recuperato 3 paginette che ti potrebbero essere utili per capire meglio come funziona questo meccanismo di garbage collection:
http://www.firebirdfaq.org/faq321/
http://www.firebirdfaq.org/faq312/
http://www.firebirdfaq.org/faq13/
Grazie per i link.
Comunque quello che non riesco a capire è questo (parlando sempre di embedded):
se il client non può sapere se lo sweep è terminato oppure no, come faccio a sapere se posso chiuderlo o no ?
E' vero che nei link sopra c'è scritto che in ogni caso non si rischia la corruzione dei dati, ma è vero anche che resta il lavoro fatto a metà.
cdimauro
21-11-2008, 20:38
Ma è un lavoro di pulizia. Lo sweep attiva il garbage collector, che non fa altro che rimuovere i record inutilizzati e liberare le pagine. Se ci sono n record inutilizzati, e ne libera soltanto m < n, non cambia nulla per il database; vuol dire che il lavoro di pulizia lo finirà la prossima volta, se avrà il tempo e la possibilità di completarlo. ;)
Ma è un lavoro di pulizia. Lo sweep attiva il garbage collector, che non fa altro che rimuovere i record inutilizzati e liberare le pagine. Se ci sono n record inutilizzati, e ne libera soltanto m < n, non cambia nulla per il database; vuol dire che il lavoro di pulizia lo finirà la prossima volta, se avrà il tempo e la possibilità di completarlo. ;)
Ok, ora mi è chiaro. Thanks
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.