Espacio de disco ocupado por NULL

06/02/2009 - 14:27 por Gabriel | Informe spam
Estimados colegas:
Me surge una duda respecto de los valores NULL. ¿Cuál es el espacio
ocupado por un campo cuyo valor es NULL? En el caso de tipos de datos fijos,
como int, se me ocurre que ocupará 4 Bytes, tal como int (ojalá que no),
pero, en el caso de un variante, como VarChar, ¿ocupa el máximo definido en
el varchar o nada?
Espero haber sido explícito en mi pregunta.
Un cordial saludo.


Gabriel Dameñov

Preguntas similare

Leer las respuestas

#1 Carlos Sacristan
06/02/2009 - 14:10 | Informe spam
No, los valores NULL no ocupan espacio, sean del tipo que sean... bueno,
para hacer honor a la verdad sí lo hacen, pues SQL Server necesita cierto
espacio para indicar que esa columna es nula.

El comando DBCC PAGE (hay mucha información en Google sobre cómo usarlo) te
permite ver la estructura real de una página de datos, y uno de los valores
que te muestra es el tamaño real de la fila. Por ejemplo, si haces la prueba
con una tabla de una única columna INT, verás que si introduces el valor NULL
en un registro, éste ocupará 11 bytes, mientras que si introduces un valor
éste ocupa los 4 bytes que todos sabemos que ocupa ese tipo de datos



Un saludo
-
www.navento.com
Servicios de Localización GPS


"Gabriel" wrote:

Estimados colegas:
Me surge una duda respecto de los valores NULL. ¿Cuál es el espacio
ocupado por un campo cuyo valor es NULL? En el caso de tipos de datos fijos,
como int, se me ocurre que ocupará 4 Bytes, tal como int (ojalá que no),
pero, en el caso de un variante, como VarChar, ¿ocupa el máximo definido en
el varchar o nada?
Espero haber sido explícito en mi pregunta.
Un cordial saludo.


Gabriel Dameñov


Respuesta Responder a este mensaje
#2 Alejandro Mesa
06/02/2009 - 15:06 | Informe spam
Gabriel,

Para las columnas de longitud variable, el espacio sera la cantidad de bytes
de la data existente. Si la columna contiene NULL entonces no habra consumo
de espacio, si es varchar(25) y solo tiene dos caracteres, entonces ocupa 2
bytes.

No es facil demostrar lo dicho, pues se necesita saber con exactitud la
estrutura de la pagina de data.

Aqui te paso un link muy, pero muy interesante, donde Paul Randal quien
solia trabajar para Microsoft y quien escribio el codigo para DBCC CHECKDB,
habla sobre la estructura en disco de los archivos, paginas, etc. de una base
de datos de SQL Server 2005. Es un grupo de articulos, y vale la pena leerlos
si estas interesado en este tema.

https://blogs.msdn.com/sqlserversto...fault.aspx

Tambien puedes leer su blog en www.SQLskills.com

Veamos un ejemplo sencillo de como podemos ver que cantidad de bytes ocupa
la data o ausencia de data en una columna variable.

Vamos a creater una tabla con dos columns, una de longitud fija y otra de
longitud variable, pero ambas aceptan null. Vamos a insertar un record por
defecto (todo null en este caso), vamos a ver en que archivo de la db esta
ubicada esta tabla y vamos a ver la pagina de data donde se almacena este
primer registro, tomaremos el espacio libre en la pagina, luego vamos a
actualizar la columna de longitud fija con un valor, vamos a ver el espacio
libre en la pagina, vamos a actualizar la columna de longitud variable y
vamos a volver a ver el espacio libre en la pagina.

Si pruebas en tu computadora, debes cambiar el numero de el archivo y de la
pagina, pues estos no son fijo.

USE [master];
GO

CREATE DATABASE prueba;
GO

USE prueba;
GO

CREATE TABLE dbo.t (
c1 INT NULL,
c2 VARCHAR(25)
)
GO

INSERT INTO dbo.t DEFAULT VALUES;
GO

DBCC TRACEON (3604);
GO

DBCC IND ('prueba', 'dbo.t', 1)
GO

DBCC PAGE (prueba, 1, 152, 1);
GO

UPDATE dbo.t SET c1 = 17;
GO

DBCC PAGE (prueba, 1, 152, 1);
GO

UPDATE dbo.t SET c2 = 'Microsoft SQL Server 2008';
GO

DBCC PAGE (prueba, 1, 152, 1);
GO

UPDATE dbo.t SET c2 = 'Microsoft SS 2008';
GO

DBCC PAGE (prueba, 1, 152, 1);
GO

DBCC TRACEON (3604);
GO

DROP TABLE dbo.t
GO

USE [master];
GO

DROP DATABASE prueba;
GO

Resultado:


Nos interesa ver la primera pagina de data (PageType = 1), y que en mi
prueba es 152.


De aqui me interesa para este simple ejecrcicio, el valor de m_freeCnt, cuyo
valor creo que es la cantidad de bytes todavia libres en la pagina de data.
Fijate que digo creo porque no soy experto de la materia, asi que perdonar
cualquier error, pues no es mi intencion confundir o dar informacion
incorrecta.

Fijate que este valor es para la fila con valor NULL en ambas columnas.

m_freeCnt = 8083

Ahora actualizamos la columna de long fija y despues vemos el valor de
m_freeCnt.



m_freeCnt = 8083

Interesante, esto nos dice que el espacio se reservo desde un principio.

Ahora actualizamos la columna de long var.



m_freeCnt = 8054

Vemos que el espacio libre en la pagina disminuyo, no exactamente 25 bytes
sino 29, que son los bytes de el valor nuevo, pues algo mas ha de haber
grabado SQL Server en esa pagina.

Ahora vamos a actualizar la columna variable nuevamente, esta ves con una
cadena que tiene 8 caracteres menos.



m_freeCnt = 8062

Se puede ver que se devolvieron 8 bytes al pool de bytes libres en la pagina.


Esto es todo. Puedes encontrar mas informacion sobre este tema en los sgtes
libros.

Inside Microsoft SQL Server(TM) 2005: The Storage Engin
http://www.amazon.com/Inside-Micros..._sv_edpp_i

Microsoft SQL Server 2005 Unleashed
http://www.amazon.com/Microsoft-SQL...ks&qid33929017&sr=1-1


AMB


"Gabriel" wrote:

Estimados colegas:
Me surge una duda respecto de los valores NULL. ¿Cuál es el espacio
ocupado por un campo cuyo valor es NULL? En el caso de tipos de datos fijos,
como int, se me ocurre que ocupará 4 Bytes, tal como int (ojalá que no),
pero, en el caso de un variante, como VarChar, ¿ocupa el máximo definido en
el varchar o nada?
Espero haber sido explícito en mi pregunta.
Un cordial saludo.


Gabriel Dameñov


Respuesta Responder a este mensaje
#3 Gabriel
11/02/2009 - 18:21 | Informe spam
Muchas gracias.
Un saludo.


Gabriel Dameñov

"Alejandro Mesa" escribió en el
mensaje de noticias:
Gabriel,

Para las columnas de longitud variable, el espacio sera la cantidad de
bytes
de la data existente. Si la columna contiene NULL entonces no habra
consumo
de espacio, si es varchar(25) y solo tiene dos caracteres, entonces ocupa
2
bytes.

No es facil demostrar lo dicho, pues se necesita saber con exactitud la
estrutura de la pagina de data.

Aqui te paso un link muy, pero muy interesante, donde Paul Randal quien
solia trabajar para Microsoft y quien escribio el codigo para DBCC
CHECKDB,
habla sobre la estructura en disco de los archivos, paginas, etc. de una
base
de datos de SQL Server 2005. Es un grupo de articulos, y vale la pena
leerlos
si estas interesado en este tema.

https://blogs.msdn.com/sqlserversto...fault.aspx

Tambien puedes leer su blog en www.SQLskills.com

Veamos un ejemplo sencillo de como podemos ver que cantidad de bytes ocupa
la data o ausencia de data en una columna variable.

Vamos a creater una tabla con dos columns, una de longitud fija y otra de
longitud variable, pero ambas aceptan null. Vamos a insertar un record por
defecto (todo null en este caso), vamos a ver en que archivo de la db esta
ubicada esta tabla y vamos a ver la pagina de data donde se almacena este
primer registro, tomaremos el espacio libre en la pagina, luego vamos a
actualizar la columna de longitud fija con un valor, vamos a ver el
espacio
libre en la pagina, vamos a actualizar la columna de longitud variable y
vamos a volver a ver el espacio libre en la pagina.

Si pruebas en tu computadora, debes cambiar el numero de el archivo y de
la
pagina, pues estos no son fijo.

USE [master];
GO

CREATE DATABASE prueba;
GO

USE prueba;
GO

CREATE TABLE dbo.t (
c1 INT NULL,
c2 VARCHAR(25)
)
GO

INSERT INTO dbo.t DEFAULT VALUES;
GO

DBCC TRACEON (3604);
GO

DBCC IND ('prueba', 'dbo.t', 1)
GO

DBCC PAGE (prueba, 1, 152, 1);
GO

UPDATE dbo.t SET c1 = 17;
GO

DBCC PAGE (prueba, 1, 152, 1);
GO

UPDATE dbo.t SET c2 = 'Microsoft SQL Server 2008';
GO

DBCC PAGE (prueba, 1, 152, 1);
GO

UPDATE dbo.t SET c2 = 'Microsoft SS 2008';
GO

DBCC PAGE (prueba, 1, 152, 1);
GO

DBCC TRACEON (3604);
GO

DROP TABLE dbo.t
GO

USE [master];
GO

DROP DATABASE prueba;
GO

Resultado:


Nos interesa ver la primera pagina de data (PageType = 1), y que en mi
prueba es 152.


De aqui me interesa para este simple ejecrcicio, el valor de m_freeCnt,
cuyo
valor creo que es la cantidad de bytes todavia libres en la pagina de
data.
Fijate que digo creo porque no soy experto de la materia, asi que perdonar
cualquier error, pues no es mi intencion confundir o dar informacion
incorrecta.

Fijate que este valor es para la fila con valor NULL en ambas columnas.

m_freeCnt = 8083

Ahora actualizamos la columna de long fija y despues vemos el valor de
m_freeCnt.



m_freeCnt = 8083

Interesante, esto nos dice que el espacio se reservo desde un principio.

Ahora actualizamos la columna de long var.



m_freeCnt = 8054

Vemos que el espacio libre en la pagina disminuyo, no exactamente 25 bytes
sino 29, que son los bytes de el valor nuevo, pues algo mas ha de haber
grabado SQL Server en esa pagina.

Ahora vamos a actualizar la columna variable nuevamente, esta ves con una
cadena que tiene 8 caracteres menos.



m_freeCnt = 8062

Se puede ver que se devolvieron 8 bytes al pool de bytes libres en la
pagina.


Esto es todo. Puedes encontrar mas informacion sobre este tema en los
sgtes
libros.

Inside Microsoft SQL Server(TM) 2005: The Storage Engine
http://www.amazon.com/Inside-Micros..._sv_edpp_i

Microsoft SQL Server 2005 Unleashed
http://www.amazon.com/Microsoft-SQL...ks&qid33929017&sr=1-1


AMB


"Gabriel" wrote:

Estimados colegas:
Me surge una duda respecto de los valores NULL. ¿Cuál es el espacio
ocupado por un campo cuyo valor es NULL? En el caso de tipos de datos
fijos,
como int, se me ocurre que ocupará 4 Bytes, tal como int (ojalá que no),
pero, en el caso de un variante, como VarChar, ¿ocupa el máximo definido
en
el varchar o nada?
Espero haber sido explícito en mi pregunta.
Un cordial saludo.


Gabriel Dameñov


email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida