Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2006.10.08;
Скачать: [xml.tar.bz2];

Вниз

поиск "дыр" в ID   Найти похожие ветки 

 
cp.Silver ©   (2006-09-15 21:24) [0]

Привет, мастера!
Чтобы не устанавливать сервер на машине пользователя и не использовать BDE, программа использует сл. механизм для доступа к БД dbase: ADO -> ODBC -> dbase.
Предполагаемый размер таблиц в БД: 30000-40000 записей. При этом будут постоянно выполняться операции DELETE/INSERT. Вся работа происходит на SQL-запросах без исп. TADOTable.
Как можно догадаться в поле ID таблиц будет очень много "дыр".

Вопрос следующий: какой существует самый надежный и быстрый способ найти "дыру" и вставить запись именно туда?

Метод перебора или даже бинарный поиск будут работать очень медленно. Чтобы не использовать поиск была идея при удалении записи помещать ее ID в отдельную таблицу и потом при вставке новой записи брать ID из этой таблицы. Но этот метод еализовать пока не получается.
Какие будут предложения, примеры (если есть)?


 
Shaman_ ©   (2006-09-15 22:05) [1]

Предложение не тормозить...
Извини за грубость


 
SergP ©   (2006-09-15 23:02) [2]

Например в упрощенном варианте можно типа так...:

select id+1 from table where id+1 not in (select id from table)

По идее такой запрос должен выдать список дыр (но не всех). но если "заделать" эти дыры и повторить запрос, то он выдаст новые дыры.


 
cp.Silver ©   (2006-09-15 23:31) [3]

2 Shaman_
Тип ответа называется "лишь бы что-то написать"

2 SergP
Спасибо, вариант неплохой. Но у меня существуют опасения, что при огромном кол-ве записей dbase может повиснуть...


 
SergP ©   (2006-09-15 23:58) [4]

> [3] cp.Silver ©   (15.09.06 23:31)
> 2 SergP
> Спасибо, вариант неплохой. Но у меня существуют опасения,
> что при огромном кол-ве записей dbase может повиснуть...


Ну я написал для примера... Но я аналогичным способом пользовался для нахождении "дыр" в оракловских таблицах. Ничего, оракл не повис. Ну запрос конечно выполнялся несколько секунд... Но у меня записей тоже было несколько десятков тысяч. Кроме того поле было текстовым (на преобразование к числовому тоже получается время тратилось), и индекса не было по этому полю.
Думаю если имеется индекс и поле числовое, то не должно особо тормозить либо виснуть.


 
Desdechado ©   (2006-09-16 12:27) [5]

Какой смысл в поиске дыр?


 
Shaman_ ©   (2006-09-16 12:44) [6]

>2 Shaman_
>Тип ответа называется "лишь бы что-то написать"

Сам проанализируй что написал:
>Метод перебора или даже бинарный поиск будут работать очень медленно.
:
1. Это что это у тебя за теория насчет бинарного поска такая? С чего бы это такие дыры оказывали влияние на бинарный поиск? Для бинарного поиска вообще всеравно нарушена последовательность или нет, для него единственное условие это отсортированная последовательность чисел- и не имеет значения есть в ней разрывы или нет
2. Подскажи темному проггаммеру как ты в SQL запросах умудряешься использовать метод перебора? Или может выбираешь все подряд на клиента и там перебором ищешь нужную запись? =) Хочу тебя ратроить- в этом случае "дыры" тоже не имеют значения, если ты конечно не поставишь перед собой задачу написать код, скорость которого зависила бы от наличия дыр в индексе. Теоретический такой код можно написать =)
3. Индекс на то и нужен чтобы обеспечить абсолютную уникальность записи, и мудреж с ним ничем хорошим не обернется

Рекомендую не заниматься очень странными эксперементами а почитать литературу по основам БД


 
cp.Silver ©   (2006-09-16 13:56) [7]

2 Shaman_

Да, я действительно ТОРМОЗ, да еще какой!!!
Я совершенно забыл, что в SQL-запросе поддерживается арифметика (вроде select id+1...). И раньше я действительно думал сначала выбрать все записи, а потом используя ADOQuery.FieldValues[] искать дыры бинарным поиском... Согласен на все 100% - ТУПО...

2 SergP

Несколько секунд не сравнимо со временем перебора, согласись :) А твой запрос я проанализировал и его надо только немного приспособить под мои нужды. Все ОК, спасибо еще раз :)


 
SergP ©   (2006-09-16 14:41) [8]

> [5] Desdechado ©   (16.09.06 12:27)
> Какой смысл в поиске дыр?


Вы не поверите, но он бывает.... причем не единственный...


 
Desdechado ©   (2006-09-16 15:30) [9]

SergP ©   (16.09.06 14:41) [8]
Верю, но не вижу смысла. Примерчик бы...


 
cp.Silver ©   (2006-09-16 16:11) [10]


> Desdechado ©   (16.09.06 15:30) [9]
>
> SergP ©   (16.09.06 14:41) [8]
> Верю, но не вижу смысла. Примерчик бы...
>


Вот даже два примера:
1. Если в таблице постоянно происходит удаление/вставка новых записей (скажем около 3000 операций за сеанс работы), то если каждый раз вставлять запись в конец таблицы существует реальная угроза, что рано или поздно следующая операция вызовет переполнение максимального значения ID.
2. Во многих случаях проектирование приложений для работы с БД без учета "дыр" считается плохим тоном, но это зависит от задач, стоящих перед системой.


 
Shaman_ ©   (2006-09-16 16:48) [11]

> рано или поздно следующая операция вызовет переполнение максимального значения ID
Если я ничего не путаю, FoxPro позволяет создавать автоинкремент по integer полям. Максимальное значение  2147483647. На операциях с удалением/добавлением 3000 записей за сессию имеем запас разрядности ключа на 715827 сессий. 1 сессия в день, хватит на 1961 год непрерывной работы. Если же нагрузка будет выше, то стоит вообще подумать о переходе на другую СУБД. Многие СУБД позволяют строить автоинкрементный индекс по полям большей разрядности, тогда уж точно хватит на пару миллиардов лет


 
C@N ©   (2006-09-16 17:37) [12]

to [11]
а прикинь размерчик этой базы???)))


 
Desdechado ©   (2006-09-16 18:31) [13]

> удаление/вставка новых записей (скажем около 3000 операций за сеанс работы)
если еще учесть, что операций вставки наверно столько же, сколько и удалений, то за чеанс только 1.5 тыс новых записей.

> 2. Во многих случаях проектирование приложений для работы с БД без учета "дыр" считается плохим тоном
Я считаю (и я не одинок), что проектирование приложений, работающих с дырами, - это плохой тон. Потому как приложению должно быть все равно, какими механизмами обеспечивается ID и есть ли в нем дыры.


 
Johnmen ©   (2006-09-16 22:16) [14]

Ещё раз прошу любителей затыкать дыры обосновать своё желание. Без детского сада...


 
cp.Silver ©   (2006-09-16 23:38) [15]


Desdechado
> Потому как приложению должно быть все равно, какими механизмами
> обеспечивается ID и есть ли в нем дыры.


Так в том то и дело, что используется старая версия dbase, у которой в принципе нет механизмов вроде автоинкремента для автоматизации и контроля работы с ID. Поэтому и вопрос возник.


 
Anatoly Podgoretsky ©   (2006-09-16 23:48) [16]

dbase поддерживает до 10^20 знаков, итого если делать по 3000 операций в секунду, то потребуется 1 056 993 066 лет до переполнения.


 
Desdechado ©   (2006-09-17 12:42) [17]

> нет механизмов вроде автоинкремента для автоматизации и контроля работы с ID
Автоинкремента действительно нет, но это не повод искать дыры. Если бы автоинкремент был, ты бы ведь смирился с тем, что использовать дыру нельзя.
А контроль ID простой - уникальный индекс.


 
Anatoly Podgoretsky ©   (2006-09-17 13:00) [18]

Вообще то у dbase есть автоинкримент и уникальные индексы тоже.


 
Desdechado ©   (2006-09-17 13:23) [19]

Аnatoly Podgoretsky ©   (17.09.06 13:00) [18]
> Вообще то у dbase есть автоинкримент
В какой старой версии он появился?


 
Anatoly Podgoretsky ©   (2006-09-17 14:04) [20]

Появились в версии 7 и не только эти типы.


 
Sergey13 ©   (2006-09-18 09:10) [21]

> [0] cp.Silver ©   (15.09.06 21:24)
> Чтобы не устанавливать сервер на машине пользователя и не
> использовать BDE, программа использует сл. механизм для
> доступа к БД dbase: ADO -> ODBC -> dbase.
> Предполагаемый размер таблиц в БД: 30000-40000 записей.
> При этом будут постоянно выполняться операции DELETE/INSERT.
> Вся работа происходит на SQL-запросах без исп.

Что бы не ходить в гараж за машиной, мы решили взвалить на себя по 50 кг груза, сначала ехали 3 часа в переполненом автобусе, а потом еще шли под дождем 10 км в гору.


 
MsGuns ©   (2006-09-18 10:27) [22]

>SergP ©   (15.09.06 23:02) [2]
>Например в упрощенном варианте можно типа так...:
>select id+1 from table where id+1 not in (select id from table)

 "Простота хуже воровства" (с)

Не надо советовать глупости. К тому же глупости вредные.

Вся ветка напоминает фразу "Когда коту делать нечего, он яйца лижет"


 
MsGuns ©   (2006-09-18 10:34) [23]

Еще поражает стоеросовое упорство в преследовании галактической важности цели. Ведь десять человек уже твердят НАФИГА СДАЛИСЬ ТЕБЕ ЭТИ ДЫРЫ ? Ан нет. Все эти десятеро ничего не смыслят в космичности задумок, грандиозности цели..
А ведь дело-то скорее всего в том, что на счетчик хотят повесить несвойственные ему цели: что вроде номера чего-то там. Хотя назначение у него совершенно иное: всего-навсего однозначно и уникально идентифицировать запись в МНОЖЕСТВЕ записей, принаждежащих ОДНОЙ таблице.
Представляю себе картину:
чувак получает паспорт, смотрит в серию и номер и недоумевает почему у его старшего брата номер МЕНЬШЕ, чем у него.

Идиотизм какой-то, порожденный дремучим невежеством и упертым нежеланием попытаться понять то, что ему толкуют.


 
MsGuns ©   (2006-09-18 10:35) [24]

Пардон,
>почему у его старшего брата номер БОЛЬШЕ, чем у него.


 
Плохиш ©   (2006-09-18 10:40) [25]


> C@N ©   (16.09.06 17:37) [12]
> to [11]
> а прикинь размерчик этой базы?

Какое отношение наличие/отсутствие "дыр" имеет к размеру базы?


 
Barloggg   (2006-09-18 15:59) [26]

действительно, дались вам эти дыры...

я помню у нас работала программка, она не удаляла записи, а быстренько ставила им пометки "стерто", а новые записи дописывала в конец.

а в конце дня рекомендовала запустить процедуру "оптимизация" и тогда начинала шуршать винчестером компонуя новый файл базы без стертых записей...

и все проблемы...
запускать такую процедуру раз в неделю/месяц и никаких проблем...


 
Desdechado ©   (2006-09-18 16:02) [27]

> она не удаляла записи, а быстренько ставила им пометки "стерто"
типичный механизм в DBF

> запустить процедуру "оптимизация" и тогда начинала шуршать винчестером
> компонуя новый файл базы без стертых записей
а это упаковка DBF

если, конечно, при упаковке не пересчитывались ключи для устранения дыр
а то бред выйдет, а не оптимизация


 
MikhailV   (2006-09-18 16:05) [28]


> Johnmen ©   (16.09.06 22:16) [14]
> Ещё раз прошу любителей затыкать дыры обосновать своё желание.
>  Без детского сада...

Табельный номер ?


 
Desdechado ©   (2006-09-18 16:06) [29]

> Табельный номер ?
Глупости. Типичное символьное поле, тем паче повторяться может.


 
MikhailV   (2006-09-18 16:10) [30]


> Глупости. Типичное символьное поле, тем паче повторяться
> может.

Но проблема-то есть.


 
Johnmen ©   (2006-09-18 16:13) [31]


> MikhailV   (18.09.06 16:05) [28]
> ..Табельный номер ?


См. MsGuns ©   (18.09.06 10:34) [23] со слов "А ведь дело-то скорее всего в том..." и далее.


 
MikhailV   (2006-09-18 16:20) [32]


> Johnmen ©

Да я и не спорю. Просто, видимо, задача выбора "свободных" номеров из таблицы "занятых" извечна.


 
Johnmen ©   (2006-09-18 16:35) [33]


> MikhailV   (18.09.06 16:20) [32]
> Да я и не спорю. Просто, видимо, задача выбора
> "свободных" номеров из таблицы "занятых" извечна.


Если мы говорим про идентификатор, то такой проблемы просто не существует.
Если про что-то другое, то проблемы опять-таки нет. Всё зависит от предметной области и алгоритма...


 
MsGuns ©   (2006-09-18 16:41) [34]

>MikhailV   (18.09.06 16:10) [30]
>Но проблема-то есть.

"Разруха  в головах" (с)


 
MikhailV   (2006-09-18 16:44) [35]


> Если мы говорим про идентификатор, то такой проблемы просто
> не существует.

Безусловно.

> Если про что-то другое, то проблемы опять-таки нет. Всё
> зависит от предметной области и алгоритма

Воистину правда, трудно не согласиться :))


 
Barloggg   (2006-09-18 16:53) [36]

а в чем проблема-то? в том что неохота весь файл перепахивать в поисках дыры?
я чего-то не понял?

а индексация спрашивается кому нужна?
вот и весь ответ.

индексировать всю базу в несколько уровней и вносить изменения сразу в несколько файлв где один - главный сама база, а остальные - оглавление для этой базы по каждому полю... на каждый файл...

это единственный вариант обеспечить идеальное быстродействие... при действительно больших объемах...


 
Sergey13 ©   (2006-09-18 16:57) [37]

> [36] Barloggg   (18.09.06 16:53)

Расскажи поподробнее про "индексирование всей базы в несколько уровней" плиз. А то упустил я что то видимо.


 
MikhailV   (2006-09-18 16:59) [38]


> индексировать всю базу в несколько уровней и вносить изменения
> сразу в несколько файлв где один - главный сама база, а
> остальные - оглавление для этой базы по каждому полю...
> на каждый файл...
Что, простите?


 
MsGuns ©   (2006-09-18 17:03) [39]

>Barloggg   (18.09.06 16:53) [36]
>а индексация спрашивается кому нужна?
>вот и весь ответ.

Каким боком тут стояла индексация ?

Следующие 2 абзаца вообще бред какой-то. С претензиями на фиг знает какие обстоятельства ;)


 
Barloggg   (2006-09-18 17:05) [40]

о это просто поэма... можно даже сказать произведение искусства.

сказал мне заказчик. значит так: есть у меня база. большая база. нужно ее сделать настолько быстрой, чтобы в контекстном поиске не тормозило.
и чтобы шло на ноуте.

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

думал я думал и додумался до независимого оглавления по каждому полю и более того по несколькоуровневому оглавлению для каждого конкретного поля.
т.е. первый файл - первая буква. постоянно в памяти. второй файл - первая и вторая буква - загружаем кусками. третий файл первая, вторая и третья буква - загружаем кусками и наконец прямая ссылка на нужную запись в главной базе. которая кстати может быть в нескольких файлах... один от федерации, другой свой собственный... "в работе" так сказать...

и таких оглавлений для каждого поля наделано...

и тоже есть процедура оптимизация, которая трет нафиг все оглавления, потом компонует новый файл и восстанавливает оглавления по новой. ну не совсем в таком порядке, но примерно так.

вот такая вот история...



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

Форум: "Начинающим";
Текущий архив: 2006.10.08;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.56 MB
Время: 0.028 c
3-1154527729
Scorpio
2006-08-02 18:08
2006.10.08
Получение номера из БД в программу


6-1147672723
Pop3
2006-05-15 09:58
2006.10.08
Sender.Name:= Кузнецов не пашет


2-1158403002
Id
2006-09-16 14:36
2006.10.08
Динамический запуск формы


2-1158514780
Doblclick
2006-09-17 21:39
2006.10.08
Как в Richedit вставить strings?


15-1158409873
Kerk
2006-09-16 16:31
2006.10.08
Как за неделю научиться выглядеть крутым сишником?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский