sql >> Base de Datos >  >> RDS >> Sqlserver

¿Cómo se llega a los límites de 8060 bytes por fila y 8000 por valor (varchar, nvarchar)?

Dentro del motor de almacenamiento:anatomía de un registro

Esto es para SQL Server 2005

  • encabezado de registro
    • 4 bytes de longitud
    • dos bytes de metadatos de registro (tipo de registro)
    • dos bytes apuntando hacia adelante en el registro al mapa de bits NULL
  • parte de longitud fija del registro, que contiene las columnas que almacenan tipos de datos que tienen longitudes fijas (por ejemplo, bigint, char(10), datetime)
  • mapa de bits NULO
    • dos bytes para el conteo de columnas en el registro
    • número variable de bytes para almacenar un bit por columna en el registro, independientemente de si la columna es anulable o no (esto es diferente y más simple que SQL Server 2000 que tenía un bit por columna anulable solamente)
    • esto permite una optimización al leer columnas que son NULL
  • matriz de desplazamiento de columna de longitud variable
    • dos bytes para el recuento de columnas de longitud variable
    • dos bytes por columna de longitud variable, dando el desplazamiento al final de la etiqueta de versión de valor de columna
  • esto es solo en SQL Server 2005 y es una estructura de 14 bytes que contiene una marca de tiempo más un puntero al almacén de versiones en tempdb

Entonces, por un carácter (8000)

  • 4 bytes (encabezado de registro)
  • 8000 longitud fija
  • 3 mapas de bits nulos
  • 2 bytes para contar de longitud variable
  • 14 marcas de tiempo

Sin embargo, si tuviera 40 columnas varchar(200)

  • 4 bytes (encabezado de registro)
  • 0 longitud fija
  • 6 mapas de bits nulos
  • 2 bytes para contar de longitud variable
  • 202x40 =8080
  • 14 marcas de tiempo

Total =8080 + 4 + 6 + 2 + 14 =8106. WTF? Recibes una advertencia cuando creas esta tabla

No me obsesionaría demasiado:esta información no valor práctico en el día a día