Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.07.18;
Скачать: CL | DM;

Вниз

Задолбали индексы в Paradox e   Найти похожие ветки 

 
Weare ©   (2002-06-21 17:27) [0]

Подскажите, пожалуйста. У меня часто при работе программы выскакивает "Index is out of date". В Desktope это исравлял, но ведь хочеться, чтобы программа сама это исправляла.(кстати почему вообще это так часто появляется)
Тогда я решил вставить в код программы перегенерацию индексов:

DataModule2.Users.Exclusive:=True;
DataModule2.Users.Open;
Check(dbiRegenIndexes(DataModule2.Users.Handle));

Для этой таблицы все нормально отрабатывает, а для другой пишет:
"Must use baseorder for this operation".Подскажите, в чем тут дело и есть ли другое решение проблемы.
Заранее огромное спасибо.


 
MsGuns ©   (2002-06-21 19:47) [1]

Речь идет об индексах или первмчных ключах (Primary) ?


 
Weare ©   (2002-06-22 14:20) [2]

Речь идет об индексах. Хотя первичные ключи у меня типа autoincrement.


 
VAleksey ©   (2002-06-24 08:16) [3]

Base order означает непосредственный (прямой) доступ к таблице.
Берешь (лучше создаешь) новый объект TTable назначаешь ему имя таблицы и только затем вызываешь dbiRegenIndexes


 
Виктор ©   (2002-06-24 10:40) [4]

просто перед переиндексацией установи
DataModule2.Users.IndexName := "";



 
Weare ©   (2002-06-24 12:49) [5]

Спасибо всем,
TTable я итак использую, не помогало.
А вот ответ Виктора действительно помог (спасибо огромное, а то я зациклился на этой проблеме)- все работает.
Кстати, может кто подскажет почему вообще так часто портятся индексы (или индексные файлы).
Идея моей проги такая: у меня в моей проге к базе (около 20 таблиц) по сетке обращаются несколько человек. И в зависимости от введеного пароля таблицы фильтруются. И затем один человек с правами админа работает со всей базой.


 
VAleksey ©   (2002-06-24 13:34) [6]

Кэш почаще сбрасывай. ( dbiSaveChages )


 
Weare ©   (2002-06-24 14:11) [7]

Подожди VAleksey, ты что хочешь сказать, что индексы слетают из-за переполнения кэша. Объясни, пожалуйста, поподробнее...


 
MEgor ©   (2002-06-25 02:56) [8]

У меня похожая ситуация. Делаю Table1.EmptyTable - и после этого
получаю "Index is out of date". В этом индексе присутствует поле типа Data. На другом индексе такого не возникало (пока). Решить проблему не смог.
Пришлось удалять записи последовательным перебором.

Еще. у одной таблицы два индекса.
Добавляю в нее порядка 500 тыс. записей - ни один индекс не изменился, т.е. оба как были 2 кб., так и остались.
У другой таблицы из двух индексов меняется только один.
Короче говоря - бардак с этим парадоксом.


 
VAleksey ©   (2002-06-25 08:47) [9]


> Weare © (24.06.02 14:11)

нет. просто бывают проблемы с этим кэщированием при многопользовательском доступе к таблице, пожтому надо кэш почаще сбрасывать.


 
Evyshka   (2002-06-25 09:22) [10]

У меня эта же проблема В день восстанавливаю индексы около 2-х раз (Или сообщениу Index out of date или все виснет), база очень большая Может ли быть проблема из за частой сортировки
или при выполнении запроса?


 
alexanderK   (2002-06-25 09:40) [11]

MEgor> Еще. у одной таблицы два индекса.
MEgor> Добавляю в нее порядка 500 тыс. записей - ни один индекс MEgor> не изменился, т.е. оба как были 2 кб., так и остались.

Так будет если у таблицы не назначен Primary


 
Anatoly Podgoretsky ©   (2002-06-25 09:56) [12]

MEgor © (25.06.02 02:56)
У тебя явно не обслуживаемые индексы иди в DBD и исправь


 
Lolik ©   (2002-06-25 12:20) [13]

Если к твоей базе данных обращается, кто-то с той же машины, на которой находится база данных (предполагаю, что это админ), то в настройках BDE обязательно на этой машине должно быть установлено LOCAL SHARE = True. Иначе не происходит запись в .lck
файлы данных о блокированных в данный момент записях, летят индексы.

PS
Уже 6 лет используем Paradox в своих многопользовательских системах, индексы разваливаются довольно редко в основном по двум причинам 1. жесткий диск на ладан дышит и сбоит 2. в однопользовательском режиме выключают комп при открытых таблицах либо напруга пропадает.
Не спорю, что SQL решения надежней и современней, но не всегда оправдывается...


 
Weare ©   (2002-06-25 12:54) [14]

to Lolik
Спасибо.
Может подскажешь, какие последствия одновременного обращения к одной записи с разных машин, ведь здесь идет блокировка на уровне записи. И еще, как можно увеличить скорость открытия базы по сети, а то у меня сильно долго грузится.


 
Lolik ©   (2002-06-25 13:43) [15]

При просмотре все будет ок, правда в Grid-е запись изменится только после прорисовки Grid-а. При попытке редактироавания сообщит, что запись заблокированна таким то пользователем,и не войдет в режим редактирования.
Скорость открытия увеличить можно только уменьшив обьем того, что открывается, т.е. как можно меньше индексов и как можно короче их сделать, если индексов много, то первичный ключ автоинкрементный, у тебя вроде так и сделано. Держать таблицы
на DataModule и открывать их один раз при входе в приложение.
Никаких фильтров по большим базам, особенно установленных в дизайне. Если уж нужно фильтровать, то лучше добавить индекс и использовать SetRange, ограничивая выборку, а затем включать фильтр, если необходимо. На скорую руку ничего больше в голову не прходит.
Если позволяют средства клиента, то можно использовать терминального клиента W2000, тогда приложение будет работать на сервере и трафика по сети практически не будет, правда аппаратные требования к серверу возрастают - по крайней мере 20 Мб оперативки на каждого пользователя и хороший проц, а лучше 2.


 
Weare ©   (2002-06-25 14:02) [16]

to Lolik
Спасибо, я вроде все так и делаю. Значит у меня оптимальная скорость открытия.
Хотя еще более медленнее стало открываться, когда я вставил перегенерацию индексов и упаковывание таблиц в код программы. А то индексы слишком часто слетали (проблема в самом верху записана).Что скажешь?


 
VAleksey ©   (2002-06-25 14:17) [17]


> Weare © (25.06.02 14:02)

Так наверное такой скорости как при работе с локальнами данными трудно добиться даже от клиент-сервер :).

А притензий по надежности к парадоксу у меня лично никаких.
Lolik © от (25.06.02 12:20) все правильно сказал.


 
Lolik ©   (2002-06-25 14:27) [18]

Если перестроение индексов при входе в программу, то открываться будет долго и при одновременном входе будут проблемы, можно вынести регенерацию индексов в отдельное приложение. Если все правильно настроено, а индексы валятся часто, то возможно нужна разъяснительная работа с пользователями на предмет выхода из программы, а затем выключения компьютера (была у нас такая проблема с одним закачиком). Можно при открытии проги писать в файл или регистр признак, при нормальном закрытии его убирать, если при входе признак уже стоит выдавать пользователю сообщение, что он некорректно вышел из программы в прошлый раз и может потерять введенные данные. Можно делать принудительную регенерацию индексов, но в сетевом варианте это не проходит. Мы ограничились страшным сообщением желтыми буквами на красном фоне и помогло.


 
Weare ©   (2002-06-25 14:30) [19]

to VAleksey

>
> Так наверное такой скорости как при работе с локальнами
> данными трудно добиться даже от клиент-сервер :).

В смысле, такой высокой или медленной? Ведь некоторые клиент-серверные СУБД по скорости обгоняют локальные.


 
Lolik ©   (2002-06-25 14:36) [20]

Обгоняют только при правильно составленных запросах, которые выполняются на стороне сервера и результатом работы которых будет небольшая выборка, которая и перешлется клиенту по сети. Логика приложения другая.


 
VAleksey ©   (2002-06-25 14:42) [21]


> Ведь некоторые клиент-серверные СУБД по скорости

что-то я таких не видел :)

конечно высокой.

Здесь разница в том что локальные таблицы у тебя на винте и скорость их обработки зависит от параметров компьютера, скорость обработки данных на сетевом диске зависит от скорости работы сети. Так же от скорости сети зависит работа с клиент - серверными БД. В общих чертах преимущество использования клиент - сервер вместо простого расшаривания диска по сети это уменьшение нагрузки на сеть за счет обработки данных на сервере.


 
Weare ©   (2002-06-25 14:49) [22]

Спасибо.


 
MEgor ©   (2002-06-26 06:50) [23]

Anatoly Podgoretsky (25.06.02 09:56)
Что значит явно не обслуживаемые ?
Добавляю запись - будь добр перестройся.


 
MEgor ©   (2002-06-26 06:54) [24]

to alexanderK (25.06.02 09:40)

А мне Primary в данном случае не нужен.
Мне нужны два не уникальных индекса. Один используется при расчете(поиск идет), второй при отображении данных на экране в удобном отсортированном виде.


 
VAleksey ©   (2002-06-26 07:23) [25]


> MEgor © (26.06.02 06:54)

Тогда тебе надо программным способом создавать необновлянмые индексы.


 
MEgor ©   (2002-06-26 08:03) [26]

to VAleksey © (26.06.02 07:23)
И каким образом все это должно выглядеть ?


 
VAleksey ©   (2002-06-26 08:17) [27]

Table1.AddIndex(..,.., nonMaintained);
Что-то типа такого


 
VAleksey ©   (2002-06-26 08:18) [28]

Table1.AddIndex("NewIndex", "CustNo;CustName", [ixUnique, ixCaseInsensitive,ixNonMaintained]);



Страницы: 1 вся ветка

Текущий архив: 2002.07.18;
Скачать: CL | DM;

Наверх




Память: 0.54 MB
Время: 0.014 c
1-58184
Cherepovets
2002-07-05 11:06
2002.07.18
Я все по тому же вопросу.


1-58129
DenNNis
2002-07-05 12:19
2002.07.18
Как нарисовать плосочку в меню ???


14-58269
gss
2002-06-10 16:24
2002.07.18
Async Professional и D6


3-57996
Даурен
2002-06-24 09:33
2002.07.18
Сохранение БД


1-58058
werr
2002-07-05 17:04
2002.07.18
Как узнать каким юзером занят файл?