J'ai une table contenant une série de chaînes uniques dont j'ai besoin pour fournir des recherches rapides (en plus de la mémoire cache).Hibernate façon rapide de rechercher chaîne unique dans la table
@Entity
public class UniqueString {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@Basic
@NaturalId
private String stringId;
}
Au départ, j'avais la variable stringId
comme @Id
, mais il est apparu que certaines bases de données (par exemple, Oracle) sont entrés dans full table scan
lors de la récupération par l'objet string id; donc je suis passé à un long à la place.
Comment puis-je accéder rapidement à l'objet UniqueString
à partir d'une chaîne stringId
. Je vois deux solutions à ce jour:
- Encore une fois, annoter
stringId
avec@id
et essayer de trouver une solution pour pourquoifull table scans
se produisent dans certaines bases de données - Hash la chaîne dans un
long
(tout en perdant la précision) et utiliser une recherche table pour renvoyer tous les objets correspondant au hachage, puis comparez leur propriétéstringId
pour l'égalité afin de trouver la correspondance recherchée, par exemple:
.
LookupTable UniqueString
+----+------+ +----+----+----------+
|hid | hash | | id |hid | stringId |
+----+------+ +----+----+----------+
| 1 | 123 | -------------> | .. | 1 | .... |
| 2 | 321 | `-----> | .. | 1 | .... |
+----+------+ +----+----+----------+
Opinions, suggestions?
[EDIT] Ok je me rends compte que mon illustration tableau ci-dessus pourrait simplement être normalisée à
UniqueString
+----+-----+----------+
| id |hash | stringId |
+----+-----+----------+
| .. | 123 | .... |
| .. | 123 | .... |
| .. | 321 | .... |
+----+-----+----------+
Cela fait toute la différence que je soupçonne que les deux requêtes suivantes exécuterait à peu près le même:
from UniqueString where hash='123'
from UniqueString where stringId='abc'