2012-08-28 9 views
10

Estoy tratando de calcular el tamaño de mi base de datos. Tendré una tabla con 3 columnas (id, int, money) Tendré 26 millones de filas con todas las columnas ocupadas. ¿Qué tan grande será mi base de datos? Además, ¿dónde puedo encontrar el tamaño de todos los tipos de datos de SQL Server?Dónde encontrar el tamaño de los tipos de datos de SQL Server

+4

Probablemente sea un buen comienzo: http://msdn.microsoft.com/en-us/library/ms175991.aspx –

+3

¿Se da cuenta de que debe saber MUCHO acerca de las partes internas de DB para llegar a un número preciso? Probablemente sea más fácil crear una tabla de ese tamaño con datos ficticios con la configuración que desee, y luego verificar el tamaño. Hay un centenar de preocupaciones de bajo nivel que pueden sumar o restar del número de bytes necesarios. – delnan

Respuesta

18

Su puede utilizar a continuación consulta:

SELECT * FROM sys.types 

resultado de la consulta anterior es el siguiente:

name     system_type_id user_type_id schema_id principal_id max_length precision scale collation_name is_nullable is_user_defined is_assembly_type default_object_id rule_object_id is_table_type 
-------------------- -------------- ------------ --------- ------------ ---------- --------- ----- ----------------- ----------- --------------- ---------------- ----------------- -------------- ------------- 
image    34    34   4   NULL   16   0   0  NULL    1   0    0    0     0    0 
text     35    35   4   NULL   16   0   0  Persian_100_CI_AI 1   0    0    0     0    0 
uniqueidentifier  36    36   4   NULL   16   0   0  NULL    1   0    0    0     0    0 
date     40    40   4   NULL   3   10  0  NULL    1   0    0    0     0    0 
time     41    41   4   NULL   5   16  7  NULL    1   0    0    0     0    0 
datetime2   42    42   4   NULL   8   27  7  NULL    1   0    0    0     0    0 
datetimeoffset  43    43   4   NULL   10   34  7  NULL    1   0    0    0     0    0 
tinyint    48    48   4   NULL   1   3   0  NULL    1   0    0    0     0    0 
smallint    52    52   4   NULL   2   5   0  NULL    1   0    0    0     0    0 
int     56    56   4   NULL   4   10  0  NULL    1   0    0    0     0    0 
smalldatetime  58    58   4   NULL   4   16  0  NULL    1   0    0    0     0    0 
real     59    59   4   NULL   4   24  0  NULL    1   0    0    0     0    0 
money    60    60   4   NULL   8   19  4  NULL    1   0    0    0     0    0 
datetime    61    61   4   NULL   8   23  3  NULL    1   0    0    0     0    0 
float    62    62   4   NULL   8   53  0  NULL    1   0    0    0     0    0 
sql_variant   98    98   4   NULL   8016  0   0  NULL    1   0    0    0     0    0 
ntext    99    99   4   NULL   16   0   0  Persian_100_CI_AI 1   0    0    0     0    0 
bit     104   104   4   NULL   1   1   0  NULL    1   0    0    0     0    0 
decimal    106   106   4   NULL   17   38  38 NULL    1   0    0    0     0    0 
numeric    108   108   4   NULL   17   38  38 NULL    1   0    0    0     0    0 
smallmoney   122   122   4   NULL   4   10  4  NULL    1   0    0    0     0    0 
bigint    127   127   4   NULL   8   19  0  NULL    1   0    0    0     0    0 
hierarchyid   240   128   4   NULL   892  0   0  NULL    1   0    1    0     0    0 
geometry    240   129   4   NULL   -1   0   0  NULL    1   0    1    0     0    0 
geography   240   130   4   NULL   -1   0   0  NULL    1   0    1    0     0    0 
varbinary   165   165   4   NULL   8000  0   0  NULL    1   0    0    0     0    0 
varchar    167   167   4   NULL   8000  0   0  Persian_100_CI_AI 1   0    0    0     0    0 
binary    173   173   4   NULL   8000  0   0  NULL    1   0    0    0     0    0 
char     175   175   4   NULL   8000  0   0  Persian_100_CI_AI 1   0    0    0     0    0 
timestamp   189   189   4   NULL   8   0   0  NULL    0   0    0    0     0    0 
nvarchar    231   231   4   NULL   8000  0   0  Persian_100_CI_AI 1   0    0    0     0    0 
nchar    239   239   4   NULL   8000  0   0  Persian_100_CI_AI 1   0    0    0     0    0 
xml     241   241   4   NULL   -1   0   0  NULL    1   0    0    0     0    0 
sysname    231   256   4   NULL   256  0   0  Persian_100_CI_AI 0   0    0    0     0    0 
CalculatedCreditInfo 243   257   9   NULL   -1   0   0  NULL    0   1    0    0     0    1 
udt_QoutaDetail  243   258   21  NULL   -1   0   0  NULL    0   1    0    0     0    1 
BeforeUpdate   243   259   22  NULL   -1   0   0  NULL    0   1    0    0     0    1 
udt_StoreInventory 243   260   26  NULL   -1   0   0  NULL    0   1    0    0     0    1 
udt_WKFHistory  243   261   32  NULL   -1   0   0  NULL    0   1    0    0     0    1 
IDTable    243   262   1   NULL   -1   0   0  NULL  

puede utilizar max_length para el tamaño de cada tipo de datos.

+0

esto no muestra el tamaño. por ejemplo, el tamaño de una variable vacía XML es 5, ¿dónde lo dice allí? –

+0

puede ver un buen complemento (si no es una mejor opción) para esta respuesta [aquí] (http://dba.stackexchange.com/questions/147296/where-to-find-the-size-of-sql-server -data-types/147315 # 147315) –

+1

nvarchar tiene 2 bytes de ancho. entonces sys.columns.max_length = 44. pero la longitud real es 22. ¿dónde se mostraría el tamaño real del tipo de datos? No es el tamaño máximo que puede tener una columna de ese tipo. – TamusJRoyce

0

Si la tabla especificada en la cláusula where contiene un nvarchar, esta consulta le dará la cantidad de caracteres que hay para esa columna correctamente.

Esto detecta si la columna es "amplia" y esencialmente se divide en 2. Más amplia que solo nvarchar.

SELECT c.name, (CASE WHEN LEFT(ts.name, 1) = 'n' AND ts.[precision] = 0 AND ts.[scale] = 0 THEN c.max_length/ts.[bytes] ELSE c.max_length END) AS [length] 
FROM sys.columns AS c 
    INNER JOIN sys.tables AS t 
     ON t.object_id = c.object_ID 
    INNER JOIN 
    (
     SELECT *, (CASE WHEN [bits] = -1 THEN -1 ELSE ([bits] + 7)/8 END) AS [bytes] 
     FROM (
      SELECT *, (CASE WHEN max_length >= 256 THEN (CASE WHEN LEFT(name, 1) = 'n' AND [precision] = 0 AND [scale] = 0 THEN 16 ELSE 8 END) ELSE max_length END) AS [bits] 
      FROM sys.types AS iits 
     ) AS its 
    ) AS ts 
     ON ts.user_type_id = c.user_type_id 
WHERE t.name LIKE 'tb_tablename' -- LIKE is case insensitive 

Por supuesto, sólo puede dividir en max_length sys.columns por 2 si conoce la columna es un nvarchar. Esto es más para descubrir el esquema de tabla de una manera que parece mejor si se introducen nuevos tipos de datos sql en el futuro. Y tú eliges actualizar a él. Caja de borde bastante pequeña.

Edite y corrija esta respuesta si encuentra una caja marginal donde bytes y bits son incorrectos.

Detalles:

-- ([bits] + 7)/8 means round up 
-- 
-- Proof: 
-- o (1 bit + 7 = 8)/8 = 1 byte used 
-- o ((8 + 8 + 1 = 17 bytes) + 7 = 24)/8 = 3 byes used 
-- o ((8 + 8 + 7 = 23 bytes) + 7 = 30)/8 = 3.75 = integer division removes decimal = 3 
SELECT *, (CASE WHEN [bits] = -1 THEN -1 ELSE ([bits] + 7)/8 END) AS [bytes] 
FROM (
    SELECT *, (CASE WHEN max_length >= 256 THEN (CASE WHEN LEFT(name, 1) = 'n' AND [precision] = 0 AND [scale] = 0 THEN 16 ELSE 8 END) ELSE max_length END) AS [bits] 
    FROM sys.types AS its 
) AS ts 

Si alguien sabe que SQL Server almacena los tamaños de bits y bytes para cada tipo de datos. O una mejor manera de obtener el tamaño de sys.columns, ¡por favor deje un comentario!

Cuestiones relacionadas