Форум: "Базы";
Текущий архив: 2002.07.18;
Скачать: [xml.tar.bz2];
ВнизЗадолбали индексы в 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;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.007 c