Оптимизация базы данных: хеширование всех значений - PullRequest
3 голосов
/ 22 января 2010

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

Имя объекта Тип Дополнительная информация

Имя сущности может быть чем-то вроде номера счета, а тип может быть похож на сбережения, текущие и т. Д. В базе данных банка, например.

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

Обычно запросы ставятся так. Найти номера счетов этого конкретного типа? Найти номера счетов типа X с балансом больше 1 миллиона?

Чтобы ответить на эти запросы, анализатор запросов будет сканировать индекс, если индекс связан с конкретным столбцом. В противном случае он выполнит полное сканирование всех строк.

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

Имеет следующие преимущества. 1. Размер таблицы будет намного меньше, потому что мы будем хранить небольшие значения размера для каждого столбца данных. 2. Мы можем построить кластерный индекс дерева B + по значениям хеш-функции для каждого столбца, чтобы получить соответствующие строки, совпадающие или большие или меньшие, чем некоторые значения. 3. Соответствующие значения могут быть легко извлечены с помощью индекса дерева B + в основной памяти и извлечения соответствующих значений. 4. Редкие значения никогда не нужно будет извлекать.

У меня все еще много оптимизаций. Я опубликую их на основе отзывов на этот вопрос.

Я не уверен, что это уже реализовано в базе данных, это всего лишь мысль.

Спасибо, что прочитали это.

- Бала

Обновление:

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

Обновления: (ответ Джо)

Как добавление индексов в каждое поле уменьшает размер базы данных? Вам все еще нужно хранить все истинные значения в дополнение к хешу; мы не просто хотим запросить существование, но хотим вернуть фактические данные.

В типичной таблице будут храниться все физические данные. Но теперь, генерируя хеш-значение для каждого столбца, я сохраняю только хеш-значение в фактической таблице. Я согласен, что это не уменьшает размер базы данных, но уменьшает размер таблицы. Это будет полезно, когда вам не нужно возвращать все значения столбца.

Большинство РСУБД теперь эффективно отвечают на большинство запросов (особенно при наличии ключевых индексов). Мне трудно формулировать сценарии, в которых ваша база данных будет более эффективной и сэкономит место.

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

Размещение индексов в физических данных - это не имеет смысла. Ключом к эффективности индексов является то, что каждый индекс хранится в отсортированном порядке. Как вы предлагаете делать это через любое возможное поле, если они хранятся только один раз в своей физической структуре? В конечном итоге фактические строки должны быть отсортированы по чему-либо (например, в SQL Server это кластеризованный индекс)?

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

Теперь таблица будет выглядеть так.

Row1 - OrderedHash (Column1), OrderedHash (Column2), OrderedHash (Column3)

Ответы [ 3 ]

1 голос
/ 23 января 2010

Google для "хэш-индекса". Например, в SQL Server такой индекс создается и запрашивается с помощью функции CHECKSUM.

Это в основном полезно, когда вам нужно проиндексировать столбец, который содержит длинные значения, например varchars, которые в среднем содержат более 100 символов или что-то в этом роде.

0 голосов
/ 22 января 2010

Я не думаю, что ваш подход очень полезен.

Хеш-значения помогают только для сравнений на равенство / неравенство, но не меньше / больше, чем сравнения, по сравнению почти со всеми индексами базы данных.

Даже с (в) равенстве хеш-функции не дают 100% гарантии того, что дали вам правильный ответ, так как могут возникнуть коллизии хеша, поэтому вам все равно придется выбирать и сравнивать исходное значение - бум, вы просто потеряли то, что Вы хотели сохранить.

Строки в таблице можно упорядочивать только по одному за раз. Поэтому, если у вас есть приложение, в котором необходимо по-разному упорядочивать строки в разных запросах (например, для запроса A нужен список клиентов, упорядоченных по их имени, для запроса B нужен список клиентов, упорядоченных по объему продаж), один из этих запросов будет иметь получить доступ к таблице вне очереди.

Если вы не хотите, чтобы база данных работала вокруг столбцов, которые вы не используете в запросе, используйте индексы с дополнительными столбцами данных - если ваш запрос упорядочен по этому индексу, а в вашем запросе используются только столбцы, находятся в индексе (coulmns индекс основан на плюс столбцы, которые вы явно добавили в индекс), СУБД не будет читать исходную таблицу.

1011 * Etc. *

0 голосов
/ 22 января 2010

Как добавление индексов в каждое поле уменьшает размер базы данных? Вам все еще нужно хранить все истинные значения в дополнение к хешу; мы не просто хотим запросить существование, но хотим вернуть фактические данные.

Большинство РСУБД в настоящее время эффективно отвечают на большинство запросов (особенно при наличии ключевых индексов). Мне трудно формулировать сценарии, в которых ваша база данных будет более эффективной и сэкономит место.

Помещение индексов в физические данные - это не имеет смысла. Ключом к эффективности индексов является то, что каждый индекс хранится в отсортированном порядке. Как вы предлагаете делать это через любое возможное поле, если они хранятся только один раз в своей физической структуре? В конечном итоге фактические строки должны быть отсортированы по чему-либо (например, в SQL Server это кластеризованный индекс)?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...