2013-07-28 12 views
12

Czy funkcja NEWID() nigdy nie daje tego samego identyfikatora, co już zrobiła? Powiedzmy, że wybieram NEWID() i zwraca mi "1" (tak jak przykład), czy już nigdy nie zwróci "1"? Czy to niemożliwe?Serwer SQL: czy NEWID() zawsze daje unikalny identyfikator?

+5

jeśli tak, zabrakło i kupić bilet na loterię. –

+4

To nie jest niemożliwe, ale bardzo, mało prawdopodobne. –

+3

Prawdopodobieństwo jest tak niskie, że dla wszystkich intencji i celów jest to niemożliwe. –

Odpowiedz

12

Zarówno NEWID(), jak i NEWQSEQUENTIALID() nadają globalnie unikalne wartości typu uniqueidenitifier.

NEWID() dotyczy losowej aktywności, dlatego następna wartość jest nieprzewidywalna i jest wolniejsza do wykonania.

NEWQSEQUENTIALID() nie obejmuje losowej aktywności, czyli the next generated value can be predicted (niełatwo!) I działa szybciej niż NEWID().

Tak więc, jeśli nie przejmujesz się przewidywaniem następnej wartości (ze względów bezpieczeństwa), możesz użyć NEWSEQUENTIALID(). Jeśli obawiasz się przewidywalności lub nie masz nic przeciwko niewielkiej kardzie za wydajność, możesz użyć NEWID().

Jednak w ścisłym sensie nadal istnieją znikome szanse, że identyfikatory GUID generowane przez różne urządzenia mają tę samą wartość. W praktyce uważa się to za niemożliwe.

Jeśli chcesz dalsze informacje, przeczytaj to: Which method for generating GUID's is best for ensuring the GUID is really unique?

Uwaga NEWID() zgodny RFC 4122. Druga funkcja wykorzystuje algorytm Microsoftu do generowania wartości.

6

Jeśli używasz NEWID() na tym samym komputerze, wartość zwracana będzie zawsze unikatowa, ponieważ zawiera bieżący znacznik czasu w swoich obliczeniach.

Na oddzielnych maszynach/systemach można jednak technicznie uzyskać ten sam identyfikator, ale prawdopodobieństwo tego zdarzenia jest tak niskie, że dzisiejsza społeczność SQL DB zasadniczo zaakceptowała fakt, że jest to niemożliwe. Microsoft w mniejszym lub większym stopniu zapisał na nim swoją reputację.

Powiązane

+0

co z operacjami asynchronicznymi, które mają ten sam znacznik czasu? – Muflix

+1

ok, wypróbowałem kilka małych testów i wydaje się, że jest OK, rekordy z tym samym znacznikiem czasu mają inny newid na tej samej maszynie .. prawdopodobnie z powodu losowej części tej funkcji. – Muflix

1

Miałem to samo pytanie, więc wpadłem to proste zapytanie, aby zobaczyć, jak wyjątkowy newid() może być, jak zobaczysz nie ma powtarzających się identyfikatorów nawet w tym samym milisekundą:

DECLARE @TRIES BIGINT, @ID UNIQUEIDENTIFIER, @REPEATED_ID UNIQUEIDENTIFIER 
SET @TRIES = 1 
SET @REPEATED_ID=NEWID() 
WHILE @TRIES <= 1000 
BEGIN 
    SET @ID=NEWID() 
    IF @[email protected] 
     PRINT 'SAME -> ID '+CONVERT(NVARCHAR(MAX),@TRIES)+': '+ CONVERT(CHAR(36),@ID) 
    ELSE 
     PRINT 'DISTINCT -> ID '+CONVERT(NVARCHAR(MAX),@TRIES)+': '+ CONVERT(CHAR(36),@ID) + ' AT ' + CONVERT(VARCHAR,CAST(GETDATE() AS DATETIME2(3)) 
) 
    SET @TRIES += 1 
    SET @[email protected] 
END 

Możesz zdefiniować @TRIES, jak chcesz.

+0

To niewiele, ponieważ 1) interpreter T-SQL jest dość powolny, a 2) nie uzyskiwanie tych samych identyfikatorów w tej samej milisekundy nie dowodzi, że, powiedzmy, wartości nie będą poddane recyklingowi następnego dnia, następnego miesiąca lub następnego rok. Identyfikatory GUID * są * unikalne, ale ustalenie tego empirycznie nie jest praktyczne. –

+0

dokładnie, ale to tylko przypomnienie. Wszystko zależy od tego, co chcesz zrobić i do czego potrzebujesz tych identyfikatorów. –

Powiązane problemy