Форум: "Базы";
Текущий архив: 2006.05.28;
Скачать: [xml.tar.bz2];
ВнизПри интенсивной работе с таблицами Paradox, они начинают умирать Найти похожие ветки
← →
djmixer (2006-04-04 03:07) [0]Привык я работать с 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))"
← →
Ильш © (2006-04-04 06:04) [1]черт дернул тебя взять в качестве движка Paradox, а дельфи тут ни при чем!
лучше перепиши пока не поздно на другой движок
← →
atruhin © (2006-04-04 06:06) [2]>>работают таблицы Paradox ужасно медленно
BDE+Paradox один из самых быстрых локальных движков БД, что то не так в вашей консерватории
>>а через запрос select * from base выдается
только 300
Как проверял кол-во возвращаемых записей?
>>не могу выбрать запрос с последним ID(это ключ аутоинкремент),
как выбирал код плиз.
Пробовал ли, при возникновении проблем, пересоздавать индексы? Падение индексов старая проблемма.
← →
Anatoly Podgoretsky © (2006-04-04 09:00) [3]Может это на курсы?
← →
de_ICER-T44 (2006-04-04 09:02) [4]мда..
← →
djmixer (2006-04-05 02:04) [5]Нет никаких индексов. Я их не создавал, мне они не нужны, конечно так медленнее, зато надежнее.
Количество возвращаемых записей проверяется так:
ввожу запрос :
select * from base;
Выдает 300 записей.
А вот такой запрос, сделаный сразу же после вышеуказаного:
select * from base order by id;
Выдает уже 500 записей.
После восстановления таблицы вышеуказаным способом оба запроса выдают одно и то же.
Еще проблемка:
Если комп во время работы программы зависает или вырубается(свет например исчез), то таблицы умирают полностью. Как восстановить еще не придумал.
← →
djmixer (2006-04-05 02:07) [6]Еще один вопрос, вы говорите надо брать другой движок. Подскажите какой движок можно и нужно выбрать в стандартной крекнутой delphi 6.
И можно ли переделать как нибудь безболезненно, так как прога уже сделана и установлена на около 20 компах в разных районах.
← →
atruhin © (2006-04-05 04:54) [7]>>то таблицы умирают полностью.
Как она умирает, какое сообщение о ошибке, при обращении?
> select * from base;
> Выдает 300 записей.
И как ты их пересчитываешь? Руками в гриде или как?
> Подскажите какой движок можно
ADO+Access, Fireberd-embedded+ib
← →
MsGuns © (2006-04-05 13:27) [8]Парадокс может работать более-менее нормально, если соблюдать несколько рекомендаций либо сделать трехзвенку, создав свой "сервер", непосредственно работающий с BDE
← →
Megabyte © (2006-04-05 14:28) [9]
> Нет никаких индексов. Я их не создавал, мне они не нужны,
> конечно так медленнее, зато надежнее.
Объясните мне плз, как наличие индексов влияет на надежность?
> ADO+Access, Fireberd-embedded+ibX/FibPlus
← →
atruhin © (2006-04-05 14:29) [10]>>либо сделать трехзвенку, создав свой "сервер",
какой сервер? у него локальный доступ.
← →
atruhin © (2006-04-05 14:31) [11]FibPlus - это хорошо, но у меня сложилось впечатление, что автору нужны бесплатные компоненты
← →
Megabyte © (2006-04-05 14:34) [12]Тогда IbX :)
← →
atruhin © (2006-04-05 15:15) [13]
> [12] Megabyte © (05.04.06 14:34)
> Тогда IbX :)
Я за то же :), хотя сам FIB пользуюсь
← →
Виталий Панасенко (2006-04-05 15:58) [14]
> atruhin © (05.04.06 15:15) [13]
>
> > [12] Megabyte © (05.04.06 14:34)
> > Тогда IbX :)
>
> Я за то же :), хотя сам FIB пользуюсь
После FIBPlus - IBX "АЦТОЙ"!;-))
← →
Romkin © (2006-04-05 16:36) [15]По симтомам, именно индекс-то и повреждается. Это когда не все записи выдаются. Так что индексы явно есть, а именно первичный ключ. Повреждается по нескольким причинам, проверять надо. И когда он поврежден, я не видел способа лучше его удаления и создания заново.
← →
Anatoly Podgoretsky © (2006-04-05 19:51) [16]Romkin © (05.04.06 16:36) [15]
Да переиндексация может не помочь.
← →
Mike Kouzmine © (2006-04-05 23:26) [17]Индексы (хотя бы первичный) нужны. Иначе не будет корректно работать.
Скорость работы достаточно высока. 20000 записей - ерунда - сортировка, фильтрация - глазом не моргнешь\. даже на 700 п3 с 128 памятью.
← →
Anatoly Podgoretsky © (2006-04-06 00:49) [18]Для надежности можно ограничиться только первичным ключом и работа через запросы.
← →
djmixer (2006-04-06 02:05) [19]Так как я могу быть в сети только по ночам, то и отвечать буду по ночам по очереди всем:
Вопрос, ответ
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. Я уже сказал что работаю только через запросы.
← →
ЮЮ © (2006-04-06 03:02) [20]> Последний номер как раз нам и надо.
Вот только если бы не ограничение TMemo на количество данных :)
Лучше первой добавляй RecordCount - это больше похоже на то что нам надо.
← →
Ильш © (2006-04-06 06:31) [21]
> Я уже сказал что работаю только через запросы.
замкнуло что ли ???!!!!!
> К программе это никак не относится, так как я уже сказал,
> что у меня все через SQL
дядя, вы что-то путаете, движок БД относится к программе очень даже сильно, в завивимости от движка порой многое меняется
> Все название типа FibPlus, IBX ничего мне не говорят
а вот это зря!!! Firebird ничего не говорит тоже??? ibase.ru - туда глянь
И вообще почитай про Firebird. Будет тебе отличная замена Парадоксу!!!
Чуствуется воинственность, но не ощущуается знаний! :(
← →
Виталий Панасенко (2006-04-06 09:56) [22]
> Пересчитать количество результатов запроса очень просто,
> не знаю почему ты не догадался.
> Первое то что количество записей есть в 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)
← →
carmen © (2006-04-06 10:20) [23]
> другой движок
бери FireBird.
> И можно ли переделать как нибудь безболезненно
Можно перетянуть Paradox-базы в Firebird, с минимум переделок, но это плохо. Лучше пересмотреть структуру в отношении нового движка.
> Нет никаких индексов. Я их не создавал
Таблица з таким количеством записей и без индексов - это ОРИГИНАЛЬНО!
← →
atruhin © (2006-04-06 16:35) [24]
> 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;
← →
djmixer (2006-04-07 01:34) [25]Как я понял ответа на вопрос почему таблицы парадокса умирают и как их восстановить никто не знает, но все знают что такое бывает.
Попробую перейти на FireBird.
← →
Бугага © (2006-04-07 05:09) [26]
> почему таблицы парадокса умирают
потому что
> перейти на FireBird.
.
ИМХО.
← →
ЮЮ © (2006-04-07 07:52) [27]>Попробую перейти на FireBird.
Ждем новой ветки " При интенсивной работе с сервером FireBird он начинает умирать" :)
← →
Anatoly Podgoretsky © (2006-04-07 09:11) [28]и как их восстановить
← →
ЮЮ © (2006-04-07 10:10) [29]1) Убить индексы (удалить файлы индексов)
2) Восстановить индексы
a) ручками в DBD
б) программно. При реализации этого пункта включить сюда и 1)
← →
Anatoly Podgoretsky © (2006-04-07 11:11) [30]ЮЮ © (07.04.06 10:10) [29]
Сказали ждемс! Это был не вопрос, а дополнение к ЮЮ © (07.04.06 07:52) [27]
И для порядка, какие файлы индексов в FireBird
← →
MsGuns © (2006-04-07 12:54) [31]>djmixer (07.04.06 01:34) [25]
>Как я понял ответа на вопрос почему таблицы парадокса умирают и как их восстановить никто не знает, но все знают что такое бывает.
Умирают "ключи" потому, что парадокс для открытой таблицы хранит их в спец.файлах - кэшах, откуда потом переписывает в физ.таблицы и "клиентам". Уж так у него организован многопользовательский доступ. Если не все обновленные ключи из кэша перепишутся в таблицу (например, при выключении питания, обрыве сети или "вылету" приложения, обновления которого "зависли" в кэше, то при попытке переоткрытия таблицы (например при перезапуске "вылетевшего" приложения) возникнет именно та ситуация с "поломанными" ключами (индексами). Лечится достаточно просто: таблица освобождается (все клиентские приложения закрываются), убивается кэш (.lck) и далее:
1 Запускаются приложения и все работает до след.слета.
Если не помогает, то
2.Грохаются еще и ключи с индексами (соотв.файлы) и восстанавливаются реструктурированием таблицы (потери данных, как правило, отсутствуют)
Если не помогает, то
3. БД восстанавивается из архива
Если нет архива, то вызывается спец, который за хорошую денюшку "поднимает" таблицы вручную
Если нет спеца или денюшки, то БД вместе с программой выбрасывается и все делается в экселе и ворде.
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2006.05.28;
Скачать: [xml.tar.bz2];
Память: 0.54 MB
Время: 0.012 c