Jeśli chcesz skopiować wygodę posiadania przypisanego automatycznie unikalnego klucza INT po wstawieniu, możesz dodać wyzwalacz INSTEAD OF INSERT
, który używa MAX istniejącej kolumny +1 w celu ustalenia następnej wartości.
Jeśli kolumna z wartością tożsamości jest pierwszym kluczem w indeksie, zapytanie MAX będzie prostym wyszukiwaniem indeksu, bardzo wydajnym.
Transakcje zapewniają przypisanie unikalnych wartości, ale to podejście będzie miało inne semantyki blokowania niż standardowa kolumna tożsamości. IIRC, SQL Server może przydzielić inną wartość tożsamości dla każdej transakcji, która zażąda go równolegle, a jeśli transakcja zostanie wycofana, wartości przypisane do niej są odrzucane. Podejście MAX pozwoli tylko na jedną transakcję wstawiania wierszy do tabeli na raz.
Podejściem pokrewnym może być posiadanie dedykowanej tabeli wartości kluczy wpisywanej przez nazwę tabeli, identyfikator dzierżawcy i bieżącą wartość tożsamości. Wymagałoby to tego samego wyzwalacza INSTEAD OF INSERT
i większej liczby elementów, aby można było wyszukiwać i aktualizować tę tabelę kluczy. Nie usprawniłoby to jednak operacji równoległych; zamek byłby po prostu na innym stole.
Jedną z możliwości naprawienia wąskiego gardła blokującego byłoby włączenie bieżącego SPID do wartości klucza (teraz klucz tożsamości jest kombinacją sekwencyjnego int i tego, co przydzielił mu SPID, a nie po prostu sekwencyjny), użyj dedykowanej tożsamości tabelę wartości i wstaw tam rekordy według SPID, jeśli to konieczne; tabela tożsamości PK będzie (nazwa tabeli, dzierżawca, SPID) i mieć kolumnę bez klucza z bieżącą wartością sekwencyjną. W ten sposób każdy identyfikator SPID będzie miał swoją własną, przydzielaną dynamicznie pulę tożsamości i będzie miał zablokowane tylko własne rekordy SPID.
Kolejną wadą jest utrzymywanie wyzwalaczy, które należy aktualizować za każdym razem, gdy zmienia się kolumny w dowolnej ze specjalnych tabel tożsamości.
"Naprawdę nie chcę, aby zastępcze przyrostowe wartości kluczowe spadały między klientami ..." Jestem ciekawa, dlaczego tego nie chcesz? –
Głównie dlatego, że dadzą ludziom pojęcie o tym, ile rzędów zajmuję, w moim utopijnym świecie powinny one być całkowicie odgrodzone od siebie. –
W rzeczywistości możesz mieć oba - zastępczy klucz podstawowy dla integralności referencyjnej (ukryty przed klientami) i unikalne indeksy dwukolumnowe, np .: (Cust_id, Order_Number) – alexm