Discussion:
Indeksowanie DBF
(Wiadomość utworzona zbyt dawno temu. Odpowiedź niemożliwa.)
AbiX
2007-05-28 07:28:22 UTC
Permalink
Witam!
Dostałem ostatnio do przerobienia program który pracuje na dbf'ach.
Program ma jedną wadę. Indeksowanie bazy w programie rozwiązane jest w
dziwny sposób. Otóż, poszczególne tabele są kopiowane do innych
tymczasowych, właściwe tabele są usuwane, i tworzone od nowa.
Może wystarczy tylko usunąć pliki indeksów .mdx i zrobić je od nowa.
Może ktoś robił coś takiego. Proszę o sugestie.
ZbyszekZ
2007-05-28 07:38:12 UTC
Permalink
Post by AbiX
Witam!
Dostałem ostatnio do przerobienia program który pracuje na dbf'ach.
Program ma jedną wadę. Indeksowanie bazy w programie rozwiązane jest w
dziwny sposób. Otóż, poszczególne tabele są kopiowane do innych
tymczasowych, właściwe tabele są usuwane, i tworzone od nowa.
Może wystarczy tylko usunąć pliki indeksów .mdx i zrobić je od nowa.
Może ktoś robił coś takiego. Proszę o sugestie.
Reindeks to nie to samo.
Widać że stary praktyk napisał tą procedurę, metoda najskuteczniejsza,
nie tylko poprawia indeksy ale również usuwa rekordy zaznaczone do
skasowania i pakuje plik memo.. Standardowa procedura pakowania robi
to w zasadzie tak samo, przepisuje dane do nowej tabeli temp i
zamienia pliki, ale nie wiem czemu pozostawia memo (plikt dbt czy
jakoś tak) nie ruszony.

--
***@private
AbiX
2007-05-28 10:31:55 UTC
Permalink
Post by ZbyszekZ
Reindeks to nie to samo.
Fakt, tylko nie dopisałem dlaczego chcę coś zmieniać.
Otóż zdarza się coraz częściej, w miarę rozrastania się baz że nagle
zgubiła się jakaś tabela. Doszedłem że dzieje się to tylko w momencie
odbudowywania baz.
Post by ZbyszekZ
Widać że stary praktyk napisał tą procedurę, metoda najskuteczniejsza,
nie tylko poprawia indeksy ale również usuwa rekordy zaznaczone do
skasowania i pakuje plik memo. Standardowa procedura pakowania robi
to w zasadzie tak samo, przepisuje dane do nowej tabeli temp i
zamienia pliki, ale nie wiem czemu pozostawia memo (plikt dbt czy
jakoś tak) nie ruszony.
Wnioskując z tego spróbuję tak:
-stworzyć kopie tabel
-skopiować stare w bezpieczne miejsce
-zamienić kopię z oryginałem
Stracić mogę jedynie na szybkości odbudowywania baz, ale coś za coś, nic
za darmo.

Pozdrawiam
Sławek
ZbyszekZ
2007-05-28 13:35:19 UTC
Permalink
Post by AbiX
-stworzyć kopie tabel
-skopiować stare w bezpieczne miejsce
-zamienić kopię z oryginałem
Na 90% przekonany jestem że tak jest to zrobione, plus usunięcie
kopii.

***@private
yankee
2007-06-01 23:04:21 UTC
Permalink
Post by AbiX
Witam!
Dostałem ostatnio do przerobienia program który pracuje na dbf'ach.
Program ma jedną wadę. Indeksowanie bazy w programie rozwiązane jest w
dziwny sposób. Otóż, poszczególne tabele są kopiowane do innych
tymczasowych, właściwe tabele są usuwane, i tworzone od nowa.
Może wystarczy tylko usunąć pliki indeksów .mdx i zrobić je od nowa.
Może ktoś robił coś takiego. Proszę o sugestie.
... Standardowa procedura pakowania robi
to w zasadzie tak samo, przepisuje dane do nowej tabeli temp i
zamienia pliki, ale nie wiem czemu pozostawia memo (plikt dbt czy
jakoś tak) nie ruszony.
Może miałeś jakąś inną metodę na myśli... ale DbiPackTable ?
Używam tego "od zawsze" i na pewno czyści również plik DBT.

Generalnie procedura jest taka:
- usunięcie pliku .mdx
- wyzerowanie znacznika w nagłówku dbf (bajt 28)
- otwarcie tabeli w trybie exclusive
- DbiPackTable(DBHandle, Handle, nil, nil, False)
- odtworzenie indeksów
Skuteczne w 100%


Co innego, jeśli potrzeba przebudować plik DBT, aby wykorzystywał
inny rozmiar bloku (MEMO FILE BLOCK SIZE). Wtedy ZTCP jedyną radą
jest założenie tabeli na nowo... i być może o to chodziło w tym
przypadku.


pozdr. Yankee
ZbyszekZ
2007-06-02 10:04:50 UTC
Permalink
Post by yankee
Może miałeś jakąś inną metodę na myśli... ale DbiPackTable ?
Używam tego "od zawsze" i na pewno czyści również plik DBT.
Sokoro używasz to wiesz, ostatni raz pisałem aplikację z dbf jakieś 10
lat temu.
Jak się głębiej zastanowię to faktycznie problem pól memo pochodził z
Clippera gdzie pack nie czyścił.
Miałem aplikację gdzie pola memo rosły bardzo szybko i musiałem
napisać dodatkową procedurę która sobie z tym radział.
Czy kiedykolwiek miałem tego typu problem w Delphi to już nie pamiętam
(ale raczej nie).

--
***@private

Jarosław Zielewski
2007-05-28 07:41:33 UTC
Permalink
pewno ktoś kto to pisał nie bardzo wiedział jak usunąc indeksy ;)
jak się wywali MDX (przez np DeleteFile()) to w dbf zostaje znacznik, ze jest z tą tabelą
powiazany index MDX trzeba chyba 28 bajt w pliku ustawić na zero.
A po za tym to można poszukać funkcji w stylu "reindex" albo
"deleteindex".
--
Archiwum grupy: http://niusy.onet.pl/pl.comp.lang.delphi.bazy-danych
Loading...