Jak można utworzyć indeksy klastrowane z płynnym NHibernate?

Używam Fluent-NHibernate (z automatycznym) do generowania moich tabel, ale chciałbym wybrać inny indeks klastrowany niż pole ID, które jest używane domyślnie. Jak można utworzyć indeksy klastrowane z Fluent NHibernate na polu innym niż domyślne pole Klucz podstawowy?

Główne uzasadnienie tego jest proste. Używam Guidów do moich podstawowych pól klucza. Domyślnie NHibernate tworzy indeksy klastrowe w polach klucza podstawowego. Ponieważ Guidy zwykle nie są sekwencyjne, klastrowanie w polu klucza podstawowego powoduje problem z wydajnością.

Jak wszyscy wiemy, dołączanie rekordów na końcu tabeli jest znacznie tańszą operacją niż wstawianie rekordów do tabeli. Ponadto rekordy w tabeli są fizycznie przechowywane w kolejności elementów w indeksie klastrowym. Ponieważ Guidy są nieco „losowe” i nie są sekwencyjne, mogą zostać wygenerowane nowe Guidy, które są mniejsze niż wartość innych Identyfikatorów Id już w tabeli - co powoduje, że wstawki w tabeli zamiast się dołączają.

Aby to zminimalizować, mam kolumnę o nazwie CreatedOn, która jest typu DateTime. Potrzebuję, aby tabela była skupiona na tej kolumnie CreatedOn, aby wszystkie nowe rekordy były dołączane, a nie wstawiane.

Wszelkie pomysły, jak to osiągnąć, są mile widziane !!!

Uwaga: zdaję sobie sprawę, że mogę używać sekwencyjnych Guidów, ale wolę nie podążać tą ścieżką ze względów bezpieczeństwa.

Uwaga: wciąż nie mam odpowiedzi na ten post, ale mam kilka pomysłów, nad którymi obecnie się zastanawiam.

Korzystając z NHibernate bez Fluent, myślę, że możliwe jest utworzenie indeksów klastrowanych bezpośrednio w NHibernate. Nie wiem jeszcze wystarczająco dużo o NHibernate, aby wiedzieć, jak to zrobić. Jestem po prostu ładna (jak prawie absolutnie) pewna, że ​​można to zrobić.

Fluent-NHibernate używane do włączenia sposobu ustawiania atrybutów (np. Indeks klastrowany) na obiekt SQL przed ostatnim przepisaniem. Wydaje się, że ta opcja zniknęła. Prawdopodobnie opublikuję pytanie, aby sprawdzić, czy ta opcja jest nadal dostępna. Jeśli tak, mógłbym prawdopodobnie użyć tego do ustawienia indeksu klastrowego.

Fluent-NHibernate zapewnia możliwość ujawnienia konfiguracji do ręcznej edycji po płynnym zbudowaniu. Nie wypróbowałem tej funkcjonalności, ale oczekuję, że może oferować poziom szczegółowości potrzebny do ustawiania indeksów klastrowych.

Najgorszy scenariusz: mogę napisać skrypt SQL, aby zmienić indeksy klastrowane na wszystkich moich tabelach po ich wygenerowaniu. Mam jednak kilka pytań dotyczących tego podejścia. A. Ponieważ używam automatycznego generowania schematu, czy NHibernate „cofnie” mój indeks klastrowy zmieni się przy następnej ocenie konfiguracji? 2. Czy błąd NHibernate, jeśli wykryje, że indeks klastrowy został zmieniony? Muszę to przetestować, ale jeszcze tego nie zrobiłem. Naprawdę nienawidzę tego rozwiązania. Testuję moją bazę danych przeciwko SQLServer2008 i MySQL. Częścią piękna NHibernate jest agnostyka bazy danych. Po wprowadzeniu skryptów wszystkie zakłady są wyłączone.

Istnieje interfejs używany w płynnych konwencjach o nazwie IPropertyInstance. Klasy dziedziczące z tego interfejsu mają właściwość Index, która umożliwia utworzenie indeksu na polu. Problem polega na tym, że nie ma flagi ani innej opcji umożliwiającej utworzenie indeksu jako klastrowanego. Najprostszym rozwiązaniem byłoby dodanie właściwości do tej metody, aby umożliwić tworzenie indeksów klastrowych. Myślę, że mogę zasugerować to twórcom Fluent-NHibernate.

questionAnswers(4)

yourAnswerToTheQuestion