Aquí podría ser tu PUBLICIDAD


ÚNASE rendimiento: clave compuesta frente a clave principal BigInt

votos
1

Tenemos una tabla que va a ser, digamos, de 100 millones a mil millones de filas (Nombre de la tabla: Archivo)

Esta tabla se referenciará desde otra tabla, Usuarios.

Tenemos 2 opciones para la clave principal en la tabla Archivo:

opción 1: dataID (bigint)

Opción 2: ID de usuario + fecha y hora (versión de 4 bytes).

Esquema:

Usuarios - ID de usuario (int)

Archive - userID - datetime

O

Archivo - dataID (big int)

¿Cuál sería más rápido?

Estamos evitando usar la Opción # 1 porque bigint tiene 8 bytes y con 100 millones de filas que se sumarán al almacenamiento total.

Actualizar Ok, lo siento, olvidé mencionar que el ID de usuario y la fecha y hora deben ser indiferentes, por lo que esa fue la razón por la que no agregué otra columna, dataID, a la tabla.

Publicado el 12/03/2009 a las 16:49
fuente por usuario bigint
En otros idiomas...        العربية       

4 respuestas

votos
1

Preocupación: Usar UserID / [small] datetime conlleva un alto riesgo de no ser único.

Aquí hay un esquema real. ¿De esto es de lo que estás hablando?

-- 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
)

Si esta fuera mi decisión, definitivamente obtendría la opción 1. El disco es barato.

Si opta por la Opción 2, es probable que tenga que agregar alguna otra columna a su PK para que sea única, entonces su diseño comienza a degradarse.

Respondida el 12/03/2009 a las 06:04
fuente por usuario Rob Garrison


Aquí podría ser tu PUBLICIDAD


votos
1

Algunos pensamientos, pero probablemente no haya una solución clara:

  • Si tiene mil millones de filas, ¿por qué no usar int que va de -2.1 mil millones a +2.1 mil millones?

  • Userid, int, 4 bytes + smalldatetime, 4 bytes = 8 bytes, lo mismo que bigint

  • Si está pensando en userid + smalldatetime, seguramente esto sea útil de todos modos. Si es así, agregar una columna sustituta "archiveID" aumentará el espacio de todos modos

  • ¿Requiere filtrado / clasificación por ID de usuario + tiempo de baja duración?

  • Asegúrate de que tu modelo sea correcto, preocúpate por JOINs más tarde ...

Respondida el 12/03/2009 a las 04:55
fuente por usuario gbn

votos
0

Recomiendo que configure una simulación para validar esto en su entorno, pero supongo que el singleint grande sería más rápido en general; sin embargo, cuando consulta la tabla, ¿qué va a consultar?

Si estuviera construyendo un arhive, podría inclinarme a tener un campo de identidad de autoincrement, y luego usar un esquema de partición a partion basado en DateTime y tal vez userid pero eso dependería de la circunstancia.

Respondida el 12/03/2009 a las 04:59
fuente por usuario JoshBerke

votos
0

¿Qué pasa con la opción 3: hacer que dataID sea un byte de 4 bytes?

Además, si lo entiendo bien, se hará referencia a la tabla de archivos desde la tabla de usuarios, por lo que no tendría mucho sentido tener el ID de usuario en la tabla de archivos.

Respondida el 12/03/2009 a las 04:56
fuente por usuario Simon Lehmann