Re[10]: Чтение записей из базы со коростью O(1)
От: Softwarer http://softwarer.ru
Дата: 21.08.12 11:15
Оценка:
Здравствуйте, MasterZiv, Вы писали:

MZ>Если при росте N будет расти число партиций, то поиск нужной партиции уже не

MZ>O(1),

У меня складывается ощущение, что Вы забываете читать перед ответом. Он не O(1), он O(log p). На практике этот O(log p) оказывается << O(1) (второго слагаемого, которое "поиск в выбранной партиции"). Соответственно, O(log p) + O(1) оказывается практически неотличимым от O(1). Неужели так упорно непонятно?

Ну ладно, объясняю совсем на пальцах. Допустим, у нас в партиции P записей, Т — время поиска среди них нужной. Тогда если у нас P партиций, время поиска будет примерно T + T = 2T, то есть пока партиций меньше, чем записей в партиции, мы можем оценить время доступа как <2T = O(1). Чтобы логарифм стал ролять, партиций должно стать больше, чем записей в партиции.

Сколько же у нас записей в партиции? Ну у меня, например, типичный размер — 50.000.000. Соответственно, чтобы оценка О(1) начала быть неудовлетворительной, нам потребуется таблица на 2.5E15 записей. Как, поди, каждый день с такими работаете? :-D
Re[11]: Чтение записей из базы со коростью O(1)
От: MasterZiv СССР  
Дата: 21.08.12 15:08
Оценка:
> У меня складывается ощущение, что Вы забываете читать перед ответом. Он не O(1),
> он O(log p).

А ты пиши почаще, чтобы люди не успевали забывать, о чём речь...

На практике этот O(log p) оказывается << O(1) (второго слагаемого,
> которое "поиск в выбранной партиции"). Соответственно, O(log p) + O(1)
> оказывается практически неотличимым от O(1). Неужели так упорно непонятно?
Неа. Ладно, читаем дальше.


> Ну ладно, объясняю совсем на пальцах. Допустим, у нас в партиции P записей, Т —

> время поиска среди них нужной. Тогда если у нас P партиций, время поиска будет
> примерно T + T = 2T, то есть пока партиций меньше, чем записей в партиции, мы
> можем оценить время доступа как <2T = O(1). Чтобы логарифм стал ролять, партиций
> должно стать больше, чем записей в партиции.

Как бы если Nпартициз зависит от Nобщих записей, то из O(Nпартиций) делать
O(1) нельзя. Если это константа -- можно. Всё ж просто...


Лучше бы сказал, как ведётся поиск и конечную полную формулу...
Posted via RSDN NNTP Server 2.1 beta
Re: Чтение записей из базы со коростью O(1)
От: vromanov Россия  
Дата: 24.08.12 18:57
Оценка:
TimesTen
По умолчанию выборка по первичному ключу — O(1). работает ОЧЕНЬ быстро
Vladimir Romanov
http://www.livejournal.com/users/vromanov/
Re: Чтение записей из базы со коростью O(1)
От: Ромашка Украина  
Дата: 24.08.12 19:08
Оценка:
Здравствуйте, objMihail, Вы писали:

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


Ну, как тебе сказать... На запросах select someone from table where id = @id все будет быстро, зато select top 10 someone from table where id > @id order by id будет table scan.

M>Например, можно было бы сделать таблицу со столбцами Key (string), Value (binary). Возможно ещё для поддержки алгоритма хеширования можно сделать поле hash и вручную туда что-нибудь писать (с клиента).


Можно, да.

M>Я думал использовать SqlServer, но там индексы реализованы через B-деревья, а у них сложность логарифмическая. Может есть какая-нибудь специализированная БД или какой-то способ реализовать чтение с постоянной сложностью на sqlserver?


На SQL Server вышеописанный вариант будет единственно возможным. Остальные мейнстимовые БД (Oracle, FB, MySQL) вроде как поддерживают hash индексы.


Всё, что нас не убивает, ещё горько об этом пожалеет.
Re[2]: Чтение записей из базы со коростью O(1)
От: vromanov Россия  
Дата: 24.08.12 19:10
Оценка:
Здравствуйте, Ромашка, Вы писали:

Р>Ну, как тебе сказать... На запросах select someone from table where id = @id все будет быстро, зато select top 10 someone from table where id > @id order by id будет table scan.


Делаются два индекса. Один деревянный, другой хешовый.
Vladimir Romanov
http://www.livejournal.com/users/vromanov/
Re[3]: Чтение записей из базы со коростью O(1)
От: Ромашка Украина  
Дата: 24.08.12 21:02
Оценка:
Здравствуйте, vromanov, Вы писали:
V>Делаются два индекса. Один деревянный, другой хешовый.

Зачем?


Всё, что нас не убивает, ещё горько об этом пожалеет.
Re[4]: Чтение записей из базы со коростью O(1)
От: vromanov Россия  
Дата: 24.08.12 21:12
Оценка:
Здравствуйте, Ромашка, Вы писали:

Р>Здравствуйте, vromanov, Вы писали:

V>>Делаются два индекса. Один деревянный, другой хешовый.
Хешовый позволяет быстро получить одну запись по ключу (O(1)). Второй (деревянный) позволяет, например, выдать запись с максимальным значением ключа без фулскана. Если это не нужно, то деревянный индекс можно не создавать.
Vladimir Romanov
http://www.livejournal.com/users/vromanov/
Re[12]: Чтение записей из базы со коростью O(1)
От: Softwarer http://softwarer.ru
Дата: 26.08.12 18:47
Оценка:
Здравствуйте, MasterZiv, Вы писали:

MZ>А ты пиши почаще, чтобы люди не успевали забывать, о чём речь...


Пробовал — тогда не успевают понять.

MZ>Как бы если Nпартициз зависит от Nобщих записей, то из O(Nпартиций) делать

MZ>O(1) нельзя. Если это константа -- можно. Всё ж просто...

Ok, я понял. Тебе шашечки, мне ехать.
Re[13]: Чтение записей из базы со коростью O(1)
От: MasterZiv СССР  
Дата: 27.08.12 23:08
Оценка:
> MZ>Как бы если Nпартициз зависит от Nобщих записей, то из O(Nпартиций) делать
> MZ>O(1) нельзя. Если это константа -- можно. Всё ж просто...
>
> Ok, я понял. Тебе шашечки, мне ехать.

Я-то тут при чём ? И мне как раз ехать, а оно быстрее O(log N) не поедет.
Posted via RSDN NNTP Server 2.1 beta
Re[2]: Чтение записей из базы со коростью O(1)
От: MasterZiv СССР  
Дата: 27.08.12 23:08
Оценка:
> TimesTen
> По умолчанию выборка по первичному ключу — O(1). работает ОЧЕНЬ быстро

Не бывает.
Posted via RSDN NNTP Server 2.1 beta
Re[3]: Чтение записей из базы со коростью O(1)
От: vromanov Россия  
Дата: 28.08.12 04:07
Оценка:
Здравствуйте, MasterZiv, Вы писали:

MZ>Не бывает.

Обоснуйте!
Vladimir Romanov
http://www.livejournal.com/users/vromanov/
Re[4]: Чтение записей из базы со коростью O(1)
От: MasterZiv СССР  
Дата: 28.08.12 10:30
Оценка:
> MZ>Не бывает.
> Обоснуйте!

Так это ты обоснуй, как ты (они) добиваются O(1).
Posted via RSDN NNTP Server 2.1 beta
Re[5]: Чтение записей из базы со коростью O(1)
От: vromanov Россия  
Дата: 28.08.12 10:52
Оценка:
Здравствуйте, MasterZiv, Вы писали:

MZ>Так это ты обоснуй, как ты (они) добиваются O(1).


А какова сложность получения элемента при использовании хешфункции? Как раз константная и есть. Вот при использовании дерева — иам логарифмическая.
Vladimir Romanov
http://www.livejournal.com/users/vromanov/
Re: Чтение записей из базы со коростью O(1)
От: Sinclair Россия https://github.com/evilguest/
Дата: 29.08.12 06:03
Оценка: 24 (2) +2
Здравствуйте, objMihail, Вы писали:

M>Есть ли такая база данных, которая позволяет сделать что-то типа хэш-таблицы.

Да. hash-based indexes существуют, и применяются довольно много где. Например, в Оракле.
M>Чтобы по мере роста этой таблицы скорость доступа (для чтения) не росла.
Нет. Бесплатного сыра не бывает. Скорость доступа к хеш таблице вовсе не O(1). Точнее, она O(1) только в том случае, если размер таблицы фиксирован. А при фиксированном размере даже линейный перебор будет иметь "асимптотику" O(1).

M>Я думал использовать SqlServer, но там индексы реализованы через B-деревья, а у них сложность логарифмическая. Может есть какая-нибудь специализированная БД или какой-то способ реализовать чтение с постоянной сложностью на sqlserver?

Имхо, вы некорректно ставите вопрос.
Вам нужно
а) Оценить количество записей и его динамику
б) Оценить требования к быстродействию.
На всякий случай напомню очевидное: основание логарифма в B-tree получается обычно очень большим. Скажем, на одну страницу в SQL Server влазит 622 32х-битных ключа. Т.е. мы имеем log(N, 622) чтений для поиска одной из N строк по целочисленному идентификатору.
Из очевидных соображений получаем, что поведение этой функции будет примерно таким:
N от         0 до             622 - одно чтение
N от        623 до         386 884 - два чтения
N от    386 885 до     240 641 848 - три чтения
N от 240 641 849 до 149 679 229 456 - четыре чтения

На самом деле, в 32 бита всунуть 149 миллиардов разных значений не получится. Так что SQL Server достанет любую строку в таблице по целочисленному идентификатору за 4 обращения.
Вы можете провести самостоятельные расчёты и оценить, каков будет разброс времён доступа для ваших параметров задачи.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[6]: Чтение записей из базы со коростью O(1)
От: MasterZiv СССР  
Дата: 29.08.12 11:15
Оценка:
On 08/28/2012 02:52 PM, vromanov wrote:

> А какова сложность получения элемента при использовании хешфункции? Как раз

> константная и есть.

0) только в теории.
1) в СУБД они малоприменимы. Ограниченно.
Posted via RSDN NNTP Server 2.1 beta
Re[7]: Чтение записей из базы со коростью O(1)
От: vromanov Россия  
Дата: 29.08.12 11:32
Оценка:
Здравствуйте, MasterZiv, Вы писали:

MZ>0) только в теории.

MZ>1) в СУБД они малоприменимы. Ограниченно.
Смотри TimesTen. Там все в практике
Vladimir Romanov
http://www.livejournal.com/users/vromanov/
Re[8]: Чтение записей из базы со коростью O(1)
От: MasterZiv СССР  
Дата: 30.08.12 17:30
Оценка:
> MZ>0) только в теории.
> MZ>1) в СУБД они малоприменимы. Ограниченно.
> Смотри TimesTen. Там все в практике

в памяти ? Ну, да...
Posted via RSDN NNTP Server 2.1 beta
Re[2]: Чтение записей из базы со коростью O(1)
От: LelicDsp Россия  
Дата: 05.09.12 11:18
Оценка:
S>На всякий случай напомню очевидное: основание логарифма в B-tree получается обычно очень большим. Скажем, на одну страницу в SQL Server влазит 622 32х-битных ключа. Т.е. мы имеем log(N, 622) чтений для поиска одной из N строк по целочисленному идентификатору.
S>Из очевидных соображений получаем, что поведение этой функции будет примерно таким:
S>
S>N от         0 до             622 - одно чтение
S>N от        623 до         386 884 - два чтения
S>N от    386 885 до     240 641 848 - три чтения
S>N от 240 641 849 до 149 679 229 456 - четыре чтения
S>


при чем первые два, а то и три уровня дерева будут лежать в кэше СУБД. Так что практически получим O(1)
Re[3]: Чтение записей из базы со коростью O(1)
От: Sinclair Россия https://github.com/evilguest/
Дата: 06.09.12 03:19
Оценка:
Здравствуйте, LelicDsp, Вы писали:


LD>при чем первые два, а то и три уровня дерева будут лежать в кэше СУБД. Так что практически получим O(1)

Ну, это уже сильно зависит от всяких дополнительных условий. Первый уровень — одна страница; второй — 622, третий — уже таки 386884 страницы. Это 3 гигабайта. Не всякий сервер отдаст три гига под кэш одного индекса.
Но вы правы в том, что в целом зависимостью от N в данном случае можно и пренебречь.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[2]: Чтение записей из базы со коростью O(1)
От: Nuzik Россия  
Дата: 16.09.12 03:51
Оценка:
Здравствуйте, MasterZiv, Вы писали:

MZ>Да, конечно могут быть "СУБД" работающие in-memory, там такие вещи

MZ>делать можно. Примеры не знаю.

Насколько я знаю (к сожалению, только в теории, на практике не пробовал), hash индексы есть в MySQL. Также там есть MEMORY storage engine, которая, как можно догадаться из названия, хранит данные в RAM. Насколько данная связка работоспособна, не знаю.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.