Форум: "Базы";
Текущий архив: 2003.10.30;
Скачать: [xml.tar.bz2];
ВнизСРОЧНО !! Компонент / Класс чтение DBF напрямую по номеру записи Найти похожие ветки
← →
AlexRush (2003-10-08 13:59) [0]Мужики, помогите! Нужен компонент/класс, который сможет напрямую читаль записи из DBF, осуществляя навигацию по номеру записи
P.S. Очень важна скорость, т.к. нужно перебрать таблицу более чем из 130 000 записей в произвольном порядке. SQL с WHERE здесь на катит...
← →
KSergey (2003-10-08 14:01) [1]Да возможно, что тут ничего не катит - мотыляться по базе туды-сюды... ;)
Рекомендую Halcion
← →
AlexRush (2003-10-08 14:04) [2]2 KSergey © (08.10.03 14:01) [1] Спасибо, но что это и где взять ? (я в базах дубовый вообще)
← →
zx (2003-10-08 14:14) [3]> SQL с WHERE здесь на катит...
куда на катит???
← →
AlexRush (2003-10-08 14:19) [4]2zx © (08.10.03 14:14) [3] Как бы это вам сказать... измерbв среднюю скорость поиска одной записи (select * from DB WHERE ID = X) и проведя несложные математические расчеты получил приблизительное время обработки таблицы 80 часов (на P III 500/256/1024) не кажется ли Вам, что туговато...
← →
y-soft (2003-10-08 14:21) [5]>AlexRush © (08.10.03 14:04) [2]
Структура DBF весьма проста( http://www.wotsit.org/download.asp?f=ti838d) - после заголовка расположен массив записей фиксированной длины. Это как раз тот случай, когда проще всего работать напрямую (если, конечно, не требуется блокировка записей)...
← →
Val (2003-10-08 14:34) [6]>AlexRush © (08.10.03 14:19) [4]
угу, теоретики СУБД не додумались так скорости выборок измерять, а индексы от большого ума возникли в природе и ни у кого БД больше 10 строчек в одной таблице не бывает...
← →
Vlad (2003-10-08 14:34) [7]>AlexRush © (08.10.03 14:19) [4]
80 часов ????
Батенька, вы индекс по ID не пробывали создавать ?
← →
y-soft (2003-10-08 14:40) [8]Мужики, какой еще индекс по RecNo? :)))
Записи в таблице DBF и так физически раположены в порядке номеров записей. Ну, не является DBF нормальной SQL базой (для приличной таблицы SQL номер записи, как правило, не имеет смысла)... Зачем мудрить в таком простом случае?
← →
Val (2003-10-08 14:43) [9]>y-soft © (08.10.03 14:40) [8]
автор говорит о номере записи, как о своем решении, по-моему...
задача-то неизвестна.
← →
zx (2003-10-08 14:45) [10]select * from DB WHERE ID = X <- не так!
у ДатаСета есть метод Некст.
← →
y-soft (2003-10-08 14:49) [11]>Val © (08.10.03 14:43) [9]
Судя по вопросу, автор имеет в виду именно доступ по физическому номеру записи в таблице DBF. Если осуществляется доступ только на чтение, то, учитывая структуру таблиц DBF, можно получить практически мгновенный доступ, работая с массивом записей...
← →
zx (2003-10-08 14:53) [12]я думаю ему просто по записям нужно пробещаться.
← →
y-soft (2003-10-08 14:59) [13]Вдогонку:
Сказанное, естественно, справедливо только для упакованных таблиц (без записей, помеченных на удаление)
← →
Val (2003-10-08 15:03) [14]>y-soft © (08.10.03 14:49) [11]
Я понимаю. Но, т.к. автор говорит также, что не очень силен в БД, то можно предположить, что задачу, которую он собирается решать именно таким образом, можно решить иначе. Поэтому интересно услышать/прочитать о самой задаче, для предложения возможных других вариантов решения(если они существуют), кроме вашего, несомненно хорошего.
← →
AlexRush (2003-10-08 15:03) [15]Видимо плохо сформулировал, проясняю ситуацию:
Абстрагируясь от моей конкретной ПРИКЛАДНОЙ задачи, можно сказать, что мне нужен доступ на чтение к записям из таблицы в формате DBF по их физическому номеру (порядку расположения в файле).
Если бы TDataSet.RecNo := X переводило бы курсор на запись с номером X, то проблема бы не возникала.
2zx © (08.10.03 14:45) [10]
Представьте себе:
for i:=1 to Count // Count<>MyTable.RecordCount
do begin
УстановитьКурсорНаЗаписьСномером(ФункцияПолученияНужногоНомера(i));
ДелатьПРИКЛАДНУЮработу;
end;
ФункцияПолученияНужногоНомера(i) <> i , и TDataSet.Next здесь на подходит.
← →
Anatoly Podgoretsky (2003-10-08 15:08) [16]First, Last, MoveBy, Next, and Prior (индекс должен быть оключен)
y-soft © (08.10.03 14:59) [13]
Никто не мешает упаковать или включить показ удаленных записей.
← →
AlexRush (2003-10-08 15:15) [17]2 All Учитывая AlexRush © (08.10.03 15:03) [15] снова поднимаю изначальный вопрос... Если есть компонент/класс, позволяющий осуществлять навигацию по физическому номеру в DBF файле (и чтение записей), то где его взять ?
← →
sniknik (2003-10-08 15:16) [18]может просто заменить TDataSet.RecNo := X
на
TDataSet.First;
TDataSet.MoveBy(X);
?
поменять логику
?
или перейти на датасеты в памяти, ClientDataSet, ADODataSet
возможно самый быстрый вариант, на операции с диском только чтение, дальше от размера памяти.
?
← →
KSergey (2003-10-08 15:16) [19]AlexRush © (08.10.03 13:59)
SQL с WHERE здесь на катит...
А к стати, каким образом можно при момощи WHERE переместиться на запись с указанным номером??!
> 13] y-soft © (08.10.03 14:59)
> Сказанное, естественно, справедливо только для упакованных
> таблиц (без записей, помеченных на удаление)
Да нет.
Для DBF нумерация записей включает в себя удаленные, даже если они не отображаются.
А вообще-то, Anatoly Podgoretsky прав: любым компонентом и описанными командами доступ должен получиться весьма с приличной скоростью.
← →
AlexRush (2003-10-08 15:21) [20]2KSergey © (08.10.03 15:16) [19] А к стати, каким образом можно при момощи WHERE переместиться на запись с указанным номером??! я там поле ID добавил с номером записи....
← →
zx (2003-10-08 15:22) [21]> AlexRush ©
можно узнать задачу для которой нужен доступ именно по физическому номеру в DBF файле?
← →
sniknik (2003-10-08 15:25) [22]Представьте себе:
for i:=1 to Count // Count<>MyTable.RecordCount
do begin
УстановитьКурсорНаЗаписьСномером(ФункцияПолученияНужногоНомера(i));
ДелатьПРИКЛАДНУЮработу;
end;
если номера не зависят друг от друга (следуюший от предыдущего)
то представь так (изменение логики)
ВыборкаПоПолученнымНомерам(ПолучитьСписокНомеров(Count));
while not base.eof do
ДелатьПРИКЛАДНУЮработу;
base.next;
end;
(даже если нет своего ID, то в FoxPro и (ODBC VFP) можно в селекте обращатся к RecNo())
← →
Val (2003-10-08 15:25) [23]>AlexRush © (08.10.03 15:21) [20]
ну и что? выборка и позиционирование вещи абсолютно разные.
← →
y-soft (2003-10-08 15:26) [24]>Anatoly Podgoretsky © (08.10.03 15:08) [16]
Согласен - фактически реализация TDataSet для DBF и делает то, что я раньше предлагал...
KSergey © (08.10.03 15:16) [19]
Для DBF нумерация записей включает в себя удаленные, даже если они не отображаются.
Спасибо, давненько с DBF не работал... :)
← →
AlexRush (2003-10-08 15:26) [25]Есть другая структура данных, организованная тоже записями, и соответствие ведется именно по номерам записей, но не однозначное, а по некоторым критериям...
← →
AlexRush (2003-10-08 15:29) [26]2 sniknik © (08.10.03 15:25) [22] нет, так не катит, это точно
← →
zx (2003-10-08 15:30) [27]> AlexRush ©
Често говоря, хочется по советовать почитать какую-нибудь книжку по работе с базами данных. Любо ты вопрос не можешь сформулировать, либо не понимаешь о чем говоришь.
← →
AlexRush (2003-10-08 15:32) [28]2zx © (08.10.03 15:30) [27] - при всём уважении, не исключайте и третий вариант...
← →
Anatoly Podgoretsky (2003-10-08 15:34) [29]Для реализации вышеуказанных методов достаточно переписать виртуальный метод SetRecNo
← →
KSergey (2003-10-08 15:41) [30]2 AlexRush
Я все же не пойму: совет [18] sniknik © (08.10.03 15:16) (он же [16] Anatoly Podgoretsky © (08.10.03 15:08)) - не канает?? Почему на них нет реакции?
← →
Anatoly Podgoretsky (2003-10-08 15:44) [31]Ты хочешь сказать, что эти методы у тебя не работают, на самом деле нужны только First и MoveBy, да и первый не особо нужен, можно текущий находу получать и делать вычитание?
← →
Vick (2003-10-08 15:45) [32]Люди, на сколько я помню в ДатаСетах есть такая "загадочная" операция как Locate, может вопрошающему почитать про ее возможности???
← →
y-soft (2003-10-08 15:52) [33]Для реализации вышеуказанных методов достаточно переписать виртуальный метод SetRecNo
А вообще для полноценного потомка TDataSet достаточно всего-то переписать 23 виртуальных метода :)))
IMHO, был хороший совет (KSergey © [1]) - если требуется нормальная поддержка нативного XBase - использовать уже готовые Helcyon, Apollo, Topaz etc ( http://www.kylecordes.com/bag/listbytype.html)...
← →
Anatoly Podgoretsky (2003-10-08 15:59) [34]y-soft © (08.10.03 15:52) [33]
Неужели сложно написать пару строчек
← →
y-soft (2003-10-08 16:04) [35]>Anatoly Podgoretsky © (08.10.03 15:59) [34]
В subj стоит пометка "Срочно", значит приспичило и со временем у вопрошающего туговато :))
← →
KSergey (2003-10-08 16:05) [36]> [34] Anatoly Podgoretsky © (08.10.03 15:59)
Это не прикольно.
[33] y-soft © (08.10.03 15:52)
А вообще для полноценного потомка TDataSet достаточно всего-то переписать 23 виртуальных метода :)))
А не может ли кто ткнуть носом в конкретное место, где бы об этом почитать: какие именно методы и что с ними делать (ну в смысле зачем они испольуются).
← →
y-soft (2003-10-08 16:08) [37]>KSergey © (08.10.03 16:05) [36]
А не может ли кто ткнуть носом в конкретное место, где бы об этом почитать: какие именно методы и что с ними делать (ну в смысле зачем они испольуются).
Марко Канту, Тим Гуч, Джон Ф. Лэм "Delphi. Руководство разработчика" Москва "ДЕСС" 1999
← →
y-soft (2003-10-08 16:11) [38]>KSergey © (08.10.03 16:05) [36]
Еще кое что есть в
Тодд Миллер, Дэвид Пауэлл "Специальное издание. Использование Delphi 3" "Диалектика" 1997
← →
AlexRush (2003-10-08 16:14) [39]2All
Всем спасибо за участие. Проблема решена.
P.S. Ветку можно закрывать.
← →
KSergey (2003-10-08 16:16) [40]2 y-soft
Спасибо, попробую найти.
Страницы: 1 2 вся ветка
Форум: "Базы";
Текущий архив: 2003.10.30;
Скачать: [xml.tar.bz2];
Память: 0.54 MB
Время: 0.015 c