Hibernate быстрый способ поиска уникальной строки в таблице - PullRequest
0 голосов
/ 25 февраля 2011

У меня есть таблица, содержащая ряд уникальных строк, которые мне нужны для быстрого поиска (кроме кэширования памяти).

@Entity
public class UniqueString {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @Basic
    @NaturalId
    private String stringId;
}

Изначально у меня была переменная stringId как @Id, однако оказалось, что некоторые базы данных (например, oracle) перешли в full table scan при получении объекта по строковому идентификатору;следовательно я переключился на длинный вместо.

Как быстро получить доступ к объекту UniqueString из строки stringId.Пока я вижу два решения:

  • Опять аннотируем stringId с помощью @id и пытаюсь найти решение, почему full table scans встречается в некоторых базах данных
  • Хеширование строкив long (при этом теряя точность) и используйте таблицу поиска для возврата всех объектов, соответствующих хешу, затем сравните их свойство stringId на равенство, чтобы найти искомое совпадение, например:

.

LookupTable                    UniqueString
+----+------+                +----+----+----------+
|hid | hash |                | id |hid | stringId |
+----+------+                +----+----+----------+
| 1  |  123 | -------------> | .. | 1  |  ....    |
| 2  |  321 |        `-----> | .. | 1  |  ....    |
+----+------+                +----+----+----------+

Мнения, предложения?

[РЕДАКТИРОВАТЬ] Хорошо, я понимаю, что моя приведенная выше таблица может быть просто нормализована до

UniqueString
+----+-----+----------+
| id |hash | stringId |
+----+-----+----------+
| .. | 123 |  ....    |
| .. | 123 |  ....    |
| .. | 321 |  ....    |
+----+-----+----------+

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

  • from UniqueString where hash='123'
  • from UniqueString where stringId='abc'

Ответы [ 2 ]

4 голосов
/ 25 февраля 2011
  1. убедитесь, что в базе данных есть индекс столбца stringId

  2. просто запросите базу данных, используя hql или критерий API

  3. настроить кеш запросов для кеширования запросов такого типа.

1 голос
/ 25 февраля 2011

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

...