Чтение записей из базы со коростью O(1)
От: objMihail Россия  
Дата: 15.08.12 08:22
Оценка:
Есть ли такая база данных, которая позволяет сделать что-то типа хэш-таблицы. Чтобы по мере роста этой таблицы скорость доступа (для чтения) не росла.

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

Я думал использовать SqlServer, но там индексы реализованы через B-деревья, а у них сложность логарифмическая. Может есть какая-нибудь специализированная БД или какой-то способ реализовать чтение с постоянной сложностью на sqlserver?
sqlserver hashtable
Re: Чтение записей из базы со коростью O(1)
От: WadeOne  
Дата: 15.08.12 09:32
Оценка:
Здравствуйте, objMihail, Вы писали:

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


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


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


Посмотри в сторону Redis, просто key-value хранилище
Re: Чтение записей из базы со коростью O(1)
От: watch-maker  
Дата: 15.08.12 09:43
Оценка:
Здравствуйте, objMihail, Вы писали:

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

BerkeleyDB.
Re: Чтение записей из базы со коростью O(1)
От: Аноним  
Дата: 15.08.12 10:36
Оценка:
Посмотри на колонку Hash здесь:
http://en.wikipedia.org/wiki/Comparison_of_relational_database_management_systems#Indexes

Например mysql InnoDB вроде как умеет:
http://dev.mysql.com/doc/refman/5.0/en/innodb-adaptive-hash.html
Re: Чтение записей из базы со коростью O(1)
От: MasterZiv СССР  
Дата: 15.08.12 12:26
Оценка: +2 -1
> Есть ли такая база данных, которая позволяет сделать что-то типа хэш-таблицы.
> Чтобы по мере роста этой таблицы скорость доступа (для чтения) не росла.

все врут в топике. Нет такой СУБД.
Все реализуют O(log N), но это, если подумать, немногим хуже O(1).
Хэш-таблицы невыгодно применять во внешней памяти, потому что
они могут терять эффективность за счёт статистически неподходящих
данных и их надо рехэшировать, а во внешнем хранилище это смерть.
B+tree ненамного хуже по производительности но намного стабильнее
в работе.

Да, конечно могут быть "СУБД" работающие in-memory, там такие вещи
делать можно. Примеры не знаю.
Posted via RSDN NNTP Server 2.1 beta
Re[2]: Чтение записей из базы со коростью O(1)
От: BrainSlug Израиль  
Дата: 15.08.12 12:30
Оценка:
согласен.
MZ>Да, конечно могут быть "СУБД" работающие in-memory, там такие вещи
MZ>делать можно. Примеры не знаю.
могу ошибаться, но моему memcached, правда под задачи ТС он не подходит.
.
Re: Чтение записей из базы со коростью O(1)
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 15.08.12 12:45
Оценка:
Здравствуйте, objMihail, Вы писали:

У хэш таблицы есть минусы. Это рехэширование. Хоть и не часто но зато скопом. Даже если данные находятся в памяти, все равно будут тормоза при доступе к данным которые лежат вне кэша.
Вот сравнение. В которых Б+ деревья сливают всего в 4 раза.
http://rsdn.ru/article/alg/tlsd.xml
Автор(ы): Сергей Смирнов (Serginio1)
Дата: 14.08.2004
Пример реализации двухуровневого массива с помощью нового средства С# — generics. Сравнение производительности различных реализаций сортированных списков.
и солнце б утром не вставало, когда бы не было меня
Re: Чтение записей из базы со коростью O(1)
От: Softwarer http://softwarer.ru
Дата: 16.08.12 04:31
Оценка:
Здравствуйте, objMihail, Вы писали:

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


Такой способ существует, думаю, уже давно во всех основных СУБД, называется "партиционирование".
Re[2]: Чтение записей из базы со коростью O(1)
От: MasterZiv СССР  
Дата: 16.08.12 06:54
Оценка:
On 08/16/2012 08:31 AM, Softwarer wrote:

> Такой способ существует, думаю, уже давно во всех основных СУБД, называется

> "партиционирование".

Это не O(1), это
p O( log N/p ) , где p -- число партиций.
вместо O( log N )
Posted via RSDN NNTP Server 2.1 beta
Re[3]: Чтение записей из базы со коростью O(1)
От: Softwarer http://softwarer.ru
Дата: 16.08.12 07:05
Оценка:
Здравствуйте, MasterZiv, Вы писали:

MZ>Это не O(1), это

MZ>p O( log N/p ) , где p -- число партиций.
MZ>вместо O( log N )

(скучая) Во-первых, партиционирование бывает разное. Вы написали формулу, немного смахивающую на формулу для хэш-партиционирования, но зачем-то множите на p вместо O(1). Во-вторых, для типичного случая range-партиционирования формула принимает вид O(log p) + O(1), где p — количество партиций. На практике это не имеет заметных отличий от O(1) + O(1).
Re[4]: Чтение записей из базы со коростью O(1)
От: MasterZiv СССР  
Дата: 16.08.12 08:07
Оценка:
On 08/16/2012 11:05 AM, Softwarer wrote:

> (скучая) Во-первых, партиционирование бывает разное. Вы написали формулу,

> немного смахивающую на формулу для хэш-партиционирования, но зачем-то множите на
> p вместо O(1).

Ну да.

Во-вторых, для типичного случая range-партиционирования формула
> принимает вид O(log p) + O(1), где p — количество партиций. На практике это не

Почему O(log p) ?
Posted via RSDN NNTP Server 2.1 beta
Re[5]: Чтение записей из базы со коростью O(1)
От: Softwarer http://softwarer.ru
Дата: 16.08.12 09:14
Оценка:
Здравствуйте, MasterZiv, Вы писали:

MZ>Почему O(log p) ?


Ну на самом деле О(1), но чтобы формально правильно. Есть упорядоченный набор партиций, сколько времени занимает поиск нужной?
Re[6]: Чтение записей из базы со коростью O(1)
От: MasterZiv СССР  
Дата: 16.08.12 09:58
Оценка:
> Ну на самом деле О(1), но чтобы формально правильно. Есть упорядоченный набор
> партиций, сколько времени занимает поиск нужной?

log p.

Ну а потом -то надо ещё внутри партиции искть, или как ?
Posted via RSDN NNTP Server 2.1 beta
Re[7]: Чтение записей из базы со коростью O(1)
От: Softwarer http://softwarer.ru
Дата: 19.08.12 19:14
Оценка:
Здравствуйте, MasterZiv, Вы писали:

>> Ну на самом деле О(1), но чтобы формально правильно. Есть упорядоченный набор

>> партиций, сколько времени занимает поиск нужной?
MZ>log p.
MZ>Ну а потом -то надо ещё внутри партиции искть, или как ?

Нужно, конечно. И занимает это О(1) времени. Как и любая операция над данными фиксированного размера.
Re[8]: Чтение записей из базы со коростью O(1)
От: MasterZiv СССР  
Дата: 19.08.12 21:17
Оценка:
> Нужно, конечно. И занимает это О(1) времени. Как и любая операция над данными
> фиксированного размера.

Ничего не перепутал ?

Может тогда сразу: "размер таблицы N записей. N фиксировано, поэтому результат
поиска одной из N записй будет O(1)"

В партиции-то как искать запись будем ?
Posted via RSDN NNTP Server 2.1 beta
Re[4]: Чтение записей из базы со коростью O(1)
От: Аноним  
Дата: 20.08.12 04:45
Оценка:
S> для типичного случая range-партиционирования формула принимает вид O(log p) + O(1), где p — количество партиций. На практике это не имеет заметных отличий от O(1) + O(1).

Мне понравился твой фокус. Теперь ты следи за руками — принимаем p=1 (одна партиция == обычная база данных) и получаем O(1) + O(1) на любой базе данных Вывод: партиционирование не нужно?

S>(скучая)


ну-ну
Re[8]: Чтение записей из базы со коростью O(1)
От: fmiracle  
Дата: 20.08.12 04:58
Оценка:
Здравствуйте, Softwarer, Вы писали:

>>> Ну на самом деле О(1), но чтобы формально правильно. Есть упорядоченный набор

>>> партиций, сколько времени занимает поиск нужной?
MZ>>log p.
MZ>>Ну а потом -то надо ещё внутри партиции искть, или как ?

S>Нужно, конечно. И занимает это О(1) времени. Как и любая операция над данными фиксированного размера.


Если размер партиции фиксирован, то при росте N будет расти число партиций, и значит p зависит от N, и значит нельзя O( log p ) свести к O(1)
Фактически p = N/psize => сложность O( log(N/psize) )
Re[9]: Чтение записей из базы со коростью O(1)
От: MasterZiv СССР  
Дата: 20.08.12 05:53
Оценка:
> Если размер партиции фиксирован, то при росте N будет расти число партиций, и
> значит p зависит от N, и значит нельзя O( log p ) свести к O(1)
> Фактически p = N/psize => сложность O( log(N/psize) )

Если при росте N будет расти число партиций, то поиск нужной партиции уже не
O(1), т.е. мы выбросили его стоимость на предыдущем шаге совершенно зря.
Posted via RSDN NNTP Server 2.1 beta
Re[5]: Чтение записей из базы со коростью O(1)
От: MasterZiv СССР  
Дата: 20.08.12 06:03
Оценка:
> S>(скучая)
>
> ну-ну

Да, не сходятся у него концы с концами.
Чем зря спорить ни о чём, я предлагаю описать подробнее,
что за партицирование имеется в виду, структуры данных
и базовые алгоритмы, и таким образом будет хотя бы видно,
что имеется в виду и какие там должны быть O().

Что до начала дискуссии, я лично более чем удовлетворён
тем, что мы всегда можем иметь O(log N) и я сам лично
имел счастье наблюдать разницу в 12 порядков между
числом записей в БД и временем выполнения запроса
(поиск по селективному индексу).
Т.е. представьте десятки миллиардов записей в БД и
запрос, выполняющийся за несколько десятков милисекунд.
Это очень здорово, мне лично никакого O(1) не нужно.
Posted via RSDN NNTP Server 2.1 beta
Re[10]: Чтение записей из базы со коростью O(1)
От: fmiracle  
Дата: 20.08.12 06:19
Оценка:
Здравствуйте, MasterZiv, Вы писали:


>> Если размер партиции фиксирован, то при росте N будет расти число партиций, и

>> значит p зависит от N, и значит нельзя O( log p ) свести к O(1)
>> Фактически p = N/psize => сложность O( log(N/psize) )

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

MZ>O(1), т.е. мы выбросили его стоимость на предыдущем шаге совершенно зря.

Ну так я про это и написал
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.