ÎNSCRIEȚI Performanță: cheie compozit versus bigint cheie primară

voturi
1

Avem un tabel care va fi spune 100 de milioane la un miliard de rânduri (Tabel nume: Arhiva)

Acest tabel se va face referire la o altă masă, Utilizatori.

Avem 2 opțiuni pentru cheia primară pe masa Arhiva:

Opțiunea 1: dataID (bigint)

Opțiunea 2: UserID + datetime (4 versiune octet).

Schemă:

Utilizatori - identificator de utilizator (int)

Arhiva - UserID - datetime

SAU

Arhiva - dataID (int mare)

Care dintre ele ar fi mai rapid?

Suntem departe de shying folosind opțiunea # 1, deoarece bigint este de 8 octeți și cu 100 de milioane de rânduri, care se vor adăuga alocarea de stocare.

Actualizați Ok pare rău că am uitat să menționez, și UserID datetime trebuie să fie independent, astfel că a fost motivul pentru care nu a adăuga o altă coloană, dataID, la masă.

Întrebat 12/03/2009 la 14:49
sursa de către utilizator
În alte limbi...                            


4 răspunsuri

voturi
1

Unele gânduri, dar nu există, probabil, o soluție clară:

  • Dacă aveți un miliard de rânduri, de ce să nu utilizați int care merge -2100000000-2100000000?

  • Idutilizator, int, 4 octeți + smalldatetime, 4 octeți = 8 octeți, la fel ca și bigint

  • Dacă sunteți de gândire de idutilizator + smalldatetime, atunci cu siguranță acest lucru este util, oricum. Dacă este așa, adăugând un surogat „archiveID“ coloana va crește spațiu oricum

  • Ai nevoie de filtrare / sortare de idutilizator + smalldatetime?

  • Asigurați-vă că modelul dvs. este corectă, vă faceți griji cu privire la mai târziu ... se alatura

Publicat 12/03/2009 la 14:55
sursa de către utilizator

voturi
0

Ce-i cu opțiunea 3: Efectuarea dataID un int 4 octet?

De asemenea, dacă am înțeles corect, tabelul de arhivă se va face referire din tabelul de utilizatori, așa că nici măcar nu ar mai avea sens să aibă userid tabelul de arhivă.

Publicat 12/03/2009 la 14:56
sursa de către utilizator

voturi
0

Vă recomandăm să setați o simulare pentru a valida acest lucru în mediul dumneavoastră, dar presupunerea mea ar fi că singura bigint ar fi mai rapid, în general; Cu toate acestea, atunci când interogare tabel ce ai de gând să fie interoghează pe?

Dacă am fost construirea o arhiva, s-ar putea să se aplece cu un câmp de identitate autoincrement, și apoi folosind un sistem de partioning la partion bazat pe DateTime și, probabil, UserID-ul, dar care ar depinde de circumstanțe.

Publicat 12/03/2009 la 14:59
sursa de către utilizator

voturi
1

Îngrijorare: Utilizarea IDutilizator / datetime [mici] poartă cu ea un risc ridicat de a nu fi unic.

Iată câteva schema reală. Asta e ceea ce vorbești?

-- Users (regardless of Archive choice)
CREATE TABLE dbo.Users (
    userID      int           NOT NULL  IDENTITY,
    <other columns>
    CONSTRAINT <name> PRIMARY KEY CLUSTERED (userID)
)

-- Archive option 1
CREATE TABLE dbo.Archive (
    dataID      bigint        NOT NULL  IDENTITY,
    userID      int           NOT NULL,
    [datetime]  smalldatetime NOT NULL,
    <other columns>
    CONSTRAINT <name> PRIMARY KEY CLUSTERED (dataID)
)

-- Archive option 2
CREATE TABLE dbo.Archive (
    userID      int           NOT NULL,
    [datetime]  smalldatetime NOT NULL,
    <other columns>
    CONSTRAINT <name> PRIMARY KEY CLUSTERED (userID, [datetime] DESC)
)
CREATE NONCLUSTERED INDEX <name> ON dbo.Archive (
    userID,
    [datetime] DESC
)

Dacă acest lucru ar fi decizia mea, aș primit cu siguranță cu opțiunea 1. Disk este ieftin.

Dacă te duci cu opțiunea 2, este probabil că va trebui să adăugați o altă coloană pentru PK-ul pentru a face unic, atunci design-ul începe degradant.

Publicat 12/03/2009 la 16:04
sursa de către utilizator

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more