![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
При интенсивной работе с таблицами Paradox, они начинают умирать [D6, Paradox]
djmixer © (2006-04-04 03:07:00)Привык я работать с MySQL и PHP.
Но тут пришлось написать програмку для локального компа и черт меня дернул написать ее на Delphi 6.0.
Мало того что работают таблицы Paradox ужасно медленно, например при количестве записей более 20 000 вообще тяжело,
так еще со временем таблицы начинают подыхать, то есть например в таблице у меня 500 записей, а через запрос select * from base выдается только 300, а вот если запрос поставить так:
select * from base order by ID, то уже выдаются все поля.
Теперь например я в среди этих 500 записей не могу выбрать запрос с последним ID(это ключ аутоинкремент), а только с предпоследним(select * from base where ID=).
Помогает мне только переписывание всего содежимого таблицы в файл, потом удаление и создание таблицы и снова внесения в нее всех записей.
Но через некоторое время проблема повторяется.
Я был бы очень благодарен если б мне кто нибудь подсказал как можно предовратить подобные явления,
Или хотя бы как восстанавливать таблицу проще чем это делаю я.
Если интересно привожу структуру таблицы:
'create table base(ID autoinc, '+
'filename char(250),bdate date,maker integer,kad_num char(25),bright '+
'integer,bplace integer,seria char(220),number char(240),ind_kod char(240),pdv integer,tochok integer,'+
'userer char(255),bmark char(255),added char(250),bary integer,rdate date,sk2 integer,'+
'dilard char(255),pidst char(255),userard char(255),dildest char(255),restvid char(255),plosha char(255),sam integer,primary key (ID))'
MsGuns (2006-04-07 12:54:00) [1]>djmixer (07.04.06 01:34) [25]
>Как я понял ответа на вопрос почему таблицы парадокса умирают и как их восстановить никто не знает, но все знают что такое бывает.
Умирают "ключи" потому, что парадокс для открытой таблицы хранит их в спец.файлах - кэшах, откуда потом переписывает в физ.таблицы и "клиентам". Уж так у него организован многопользовательский доступ. Если не все обновленные ключи из кэша перепишутся в таблицу (например, при выключении питания, обрыве сети или "вылету" приложения, обновления которого "зависли" в кэше, то при попытке переоткрытия таблицы (например при перезапуске "вылетевшего" приложения) возникнет именно та ситуация с "поломанными" ключами (индексами). Лечится достаточно просто: таблица освобождается (все клиентские приложения закрываются), убивается кэш (.lck) и далее:
1 Запускаются приложения и все работает до след.слета.
Если не помогает, то
2.Грохаются еще и ключи с индексами (соотв.файлы) и восстанавливаются реструктурированием таблицы (потери данных, как правило, отсутствуют)
Если не помогает, то
3. БД восстанавивается из архива
Если нет архива, то вызывается спец, который за хорошую денюшку "поднимает" таблицы вручную
Если нет спеца или денюшки, то БД вместе с программой выбрасывается и все делается в экселе и ворде.
Anatoly Podgoretsky (2006-04-07 11:11:00) [2]ЮЮ © (07.04.06 10:10) [29]
Сказали ждемс! Это был не вопрос, а дополнение к ЮЮ © (07.04.06 07:52) [27]
И для порядка, какие файлы индексов в FireBird
ЮЮ (2006-04-07 10:10:00) [3]1) Убить индексы (удалить файлы индексов)
2) Восстановить индексы
a) ручками в DBD
б) программно. При реализации этого пункта включить сюда и 1)
Anatoly Podgoretsky (2006-04-07 09:11:00) [4]и как их восстановить
ЮЮ (2006-04-07 07:52:00) [5]>Попробую перейти на FireBird.
Ждем новой ветки " При интенсивной работе с сервером FireBird он начинает умирать" :)
Бугага (2006-04-07 05:09:00) [6]
> почему таблицы парадокса умирают
потому что
> перейти на FireBird.
.
ИМХО.
djmixer (2006-04-07 01:34:00) [7]Как я понял ответа на вопрос почему таблицы парадокса умирают и как их восстановить никто не знает, но все знают что такое бывает.
Попробую перейти на FireBird.
atruhin (2006-04-06 16:35:00) [8]
> for i:=1 to query1.recordcount do
> begin
> memo1.lines.add(inttostr(i)+query1.fieldbyname('userer'));
> query1.next;
> end;
Не знаю как в BDE с SQL выборками, но на других серверах таким образом можно получить совсем другой результат, я не зря спрашивал. Попробуй так:
> while not query1.eof do
> begin
> memo1.lines.add(inttostr(i)+query1.fieldbyname('userer'));
> query1.next;
> end;
carmen (2006-04-06 10:20:00) [9]
> другой движок
бери FireBird.
> И можно ли переделать как нибудь безболезненно
Можно перетянуть Paradox-базы в Firebird, с минимум переделок, но это плохо. Лучше пересмотреть структуру в отношении нового движка.
> Нет никаких индексов. Я их не создавал
Таблица з таким количеством записей и без индексов - это ОРИГИНАЛЬНО!
Виталий Панасенко (2006-04-06 09:56:00) [10]
> Пересчитать количество результатов запроса очень просто,
> не знаю почему ты не догадался.
> Первое то что количество записей есть в query1.recordcount,
>
> если же этому не поверить, то количество выведеных записей
> можно узнать так
> for i:=1 to query1.recordcount do
> begin
> memo1.lines.add(inttostr(i)+query1.fieldbyname('userer'));
>
> query1.next;
> end;
А разницу мне обьясни ?:-)))
Если бы так, то совсем другое дело(хотя бы по виду):
while not query1.eof do
begin
memo1.lines.add(inttostr(i)+query1.fieldbyname('userer'));
query1.next;
end;
Да, для драйвера Paradox выставь LOCAL SHARE=TRUE.(Это в BDEAdministrator)
Ильш (2006-04-06 06:31:00) [11]
> Я уже сказал что работаю только через запросы.
замкнуло что ли ???!!!!!
> К программе это никак не относится, так как я уже сказал,
> что у меня все через SQL
дядя, вы что-то путаете, движок БД относится к программе очень даже сильно, в завивимости от движка порой многое меняется
> Все название типа FibPlus, IBX ничего мне не говорят
а вот это зря!!! Firebird ничего не говорит тоже??? ibase.ru - туда глянь
И вообще почитай про Firebird. Будет тебе отличная замена Парадоксу!!!
Чуствуется воинственность, но не ощущуается знаний! :(
ЮЮ (2006-04-06 03:02:00) [12]> Последний номер как раз нам и надо.
Вот только если бы не ограничение TMemo на количество данных :)
Лучше первой добавляй RecordCount - это больше похоже на то что нам надо.
djmixer (2006-04-06 02:05:00) [13]Так как я могу быть в сети только по ночам, то и отвечать буду по ночам по очереди всем:
Вопрос, ответ
1.И как ты их пересчитываешь? Руками в гриде или как?
Я уже сказал, что я работаю только через sql, поэтому гридов тоже нет, все данные обрабатываются и выводятся напрямую.
Пересчитать количество результатов запроса очень просто, не знаю почему ты не догадался.
Первое то что количество записей есть в query1.recordcount,
если же этому не поверить, то количество выведеных записей можно узнать так
for i:=1 to query1.recordcount do
begin
memo1.lines.add(inttostr(i)+query1.fieldbyname('userer'));
query1.next;
end;
В резьтате получим перенумерованый список результатов. Последний номер как раз нам и надо. Это только по какой то причине записей окажется меньше чем recordcount.
2. Все название типа FibPlus, IBX ничего мне не говорят. Я никогда не работал с базами данных через delphi.
У мене вся работа с базой происходит через sql, Хотя это оказалось тяжело, так как почему-то тут sql очень ограничен. Из всех компонетов для баз данных из делфи я использую только tquery.
Делфи мне нужна просто для отображения и обработки полученных результатов.
ТО есть мне нужно заменить чем то paradox и больше ничего.
В BDE адмистраторе у меня есть еще DBASE и FOXPRO. Можно ли как нибудь переформатировать базу данных в этот формат.
К программе это никак не относится, так как я уже сказал, что у меня все через SQL. Таблицы создаются тоже через запрос, но так как алиас я при создании указал как paradox формата, то и они все в парадоксе сейчас.
3.Если кто нибудь читал первое мое сообщение, то мог там увидеть структуру таблицы. В конце есть такое primary key (ID) так что первичный ключ есть.
Вы говорите повреждается первичный ключ.
Почему? И как это узнать?
4. Я уже сказал что работаю только через запросы.
Anatoly Podgoretsky (2006-04-06 00:49:00) [14]Для надежности можно ограничиться только первичным ключом и работа через запросы.
Mike Kouzmine (2006-04-05 23:26:00) [15]Индексы (хотя бы первичный) нужны. Иначе не будет корректно работать.
Скорость работы достаточно высока. 20000 записей - ерунда - сортировка, фильтрация - глазом не моргнешь\. даже на 700 п3 с 128 памятью.
Anatoly Podgoretsky (2006-04-05 19:51:00) [16]Romkin © (05.04.06 16:36) [15]
Да переиндексация может не помочь.
Romkin (2006-04-05 16:36:00) [17]По симтомам, именно индекс-то и повреждается. Это когда не все записи выдаются. Так что индексы явно есть, а именно первичный ключ. Повреждается по нескольким причинам, проверять надо. И когда он поврежден, я не видел способа лучше его удаления и создания заново.
Виталий Панасенко (2006-04-05 15:58:00) [18]
> atruhin © (05.04.06 15:15) [13]
>
> > [12] Megabyte © (05.04.06 14:34)
> > Тогда IbX :)
>
> Я за то же :), хотя сам FIB пользуюсь
После FIBPlus - IBX "АЦТОЙ"!;-))
atruhin (2006-04-05 15:15:00) [19]
> [12] Megabyte © (05.04.06 14:34)
> Тогда IbX :)
Я за то же :), хотя сам FIB пользуюсь
Megabyte (2006-04-05 14:34:00) [20]Тогда IbX :)