2012-08-28 7 views
10

Sto cercando di calcolare la dimensione del mio database. Avrò una tabella con 3 colonne (id, int, money) avrò 26 milioni di righe con tutte le colonne occupate. Quanto sarà grande il mio database? Inoltre, dove posso trovare la dimensione di tutti i tipi di dati di SQL Server?Dove trovare la dimensione dei tipi di dati di SQL Server

+4

Probabilmente un buon inizio: http://msdn.microsoft.com/en-us/library/ms175991.aspx –

+3

Ti rendi conto che devi conoscere MOLTO su internals DB per arrivare a un numero preciso? Probabilmente è più facile creare una tabella di quelle dimensioni con dati fittizi con le impostazioni che desideri e quindi controllare la dimensione. Ci sono un centinaio di preoccupazioni di basso livello che possono aggiungere o sottrarre dal numero di byte necessari. – delnan

risposta

18

tuo grado di utilizzare al di sotto di query:

SELECT * FROM sys.types 

risultato di sopra della query è qui sotto:

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  

è possibile utilizzare max_length per dimensione di ogni tipo di dati.

+0

questo non mostra la dimensione. per esempio, la dimensione di una variabile vuota XML è 5, dove lo dice lì? –

+0

puoi vedere un buon complemento (se non un'opzione migliore) per questa risposta [qui] (http://dba.stackexchange.com/questions/147296/where-to-find-the-size-of-sql-server -data-types/147315 # 147315) –

+1

nvarchar ha una larghezza di 2 byte. quindi sys.columns.max_length = 44. ma la lunghezza effettiva è 22. dove verrà visualizzata la dimensione effettiva del tipo di dati? Non la dimensione massima che può essere una colonna di quel tipo. – TamusJRoyce

0

Se la tabella specificata nella clausola where contiene un nvarchar, questa query fornirà quanti caratteri ci sono per quella colonna correttamente!

Questo rileva se la colonna è "ampia" e sostanzialmente si divide per 2. Più ampia di 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 

Naturalmente, si può semplicemente dividere il max_length sys.columns per 2 se si conosce la colonna è un nvarchar. Questo è più utile per scoprire lo schema della tabella in un modo che sembra migliore se i nuovi tipi di dati SQL vengono introdotti in futuro. E tu, scegli di aggiornarlo. Astuccio dal bordo piuttosto piccolo.

Si prega di modificare e correggere questa risposta se si trova un caso limite in cui byte e bit sono corretti.

Dettagli:

-- ([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 

Se qualcuno sa che SQL Server archivia le dimensioni bit e byte per ciascun tipo di dati. O un modo migliore per ottenere la dimensione di sys.columns, per favore lascia un commento!

Problemi correlati