2013-10-22 15 views
8

Desidero conoscere i tipi di dati di archiviazione di SQL Server in memoria.In che modo i tipi di dati "monetari" e "decimali" in SQL Server sono archiviati in memoria?

Come viene memorizzato il tipo di dati money in SQL Server? So che money è memorizzato in 8 byte e smallmoney è memorizzato in 4 byte. Ma non so come?

Ad esempio quando si dispone di 123400.93 per il denaro, come viene memorizzato in 8 byte?

Ho la stessa domanda sui tipi di dati decimal e DATE.

Soprattutto per DATE, il formato è AAAA-MM-GG, ma come viene memorizzato in 3 byte? È memorizzato come descritto qui: http://dev.mysql.com/doc/internals/en/date-and-time-data-type-representation.html o il numero di giorni da un giorno specifico è memorizzato?

+0

È ** non ** memorizzato in una stringa (carattere). Per favore conferma che lo sai. –

+0

Ti interessa l'archiviazione di memoria e non i file di dati? – StingyJack

+0

Sì! So che non è memorizzato in char. – Nooshin

risposta

10

Solo l'aggiunta di un po 'qui ...

Una singola byte è costituito da 8 bits. A bit può contenere 2 valori (0 o 1).

Quindi 4 byte sono 32 bit (4 x 8). Il che significa che l'intervallo numerico di ciò che può essere memorizzato è compreso tra 0 e 2^32, che fornisce un intervallo totale di 4.294.967.296 valori.

smallmoney è firmato in modo da eliminare uno dei bit da utilizzare per il segno, che lascia 2^31 o 2.147.483.648 valori possibili e il segno +/-.

Ora prendiamo in considerazione che le ultime 4 cifre di un tipo di denaro sono sempre dopo il punto decimale e si finisce con una serie di -214,748.3648 per 214,748.3647

Tecnicamente, denaro e valori smallmoney vengono memorizzati lanciando bit in una parola o in un byte, proprio come tutto il resto.Se avete bisogno di maggiori informazioni, leggere http://computer.howstuffworks.com/bytes.htm

Oppure si potrebbe vedere questo per la gamma possibile valore del denaro e smallmoney: http://technet.microsoft.com/en-us/library/ms179882.aspx

aggiornamento
Per il tipo di dati DATETIME, è lo stesso concetto con un piccola svolta. In MS SQL a DATETIME viene memorizzato utilizzando 2 numeri. Il primo è il numero di giorni trascorsi dal 1/1/1900 e il secondo è il numero di zecche dalla mezzanotte: Vedi http://blogs.lessthandot.com/index.php/DataMgmt/DataDesign/how-are-dates-stored-in-sql-server e When storing a datetime in sql server (datetime type), what format does it store it in?

+0

Grazie mille! Penso di averlo capito. Che mi dici della "DATA"? sai come viene memorizzato? – Nooshin

+0

@ user2908422: consultare l'aggiornamento – NotMe

+0

Per l'aggiornamento, si dovrebbe fare riferimento a 'datetime', non' date'. SQL Server ha avuto un tipo di dati 'date' specifico dalla versione 2008, e certamente * non * memorizza un componente orario. –

1

penso che si può trovare questo interessante Performance/Storage Comparisons : MONEY vs. DECIMAL

La persona sostenendo per MONEY ha mostrato lo spazio utilizzato da denaro rispetto alle stesse informazioni memorizzate in una colonna DECIMAL (20,4). Non tutto il che sorprendentemente, quest'ultimo era leggermente più grande. Ma questa è l'intera storia di ? No, per due ragioni. Uno è che le prestazioni di non sono state confrontate, e l'altra è che DECIMAL (20,4) è non un requisito molto realistico per l'archiviazione dei dati di valuta. A meno che non stia memorizzando le informazioni sui prezzi per gli yacht di lusso o gli aeromobili , in tal caso è possibile eliminare le cifre decimali e utilizzare INT o BIGINT. Per il resto di noi, una scelta migliore sarebbe DECIMALE (8,2) o DECIMALE (10,2).

controllare anche questa domanda correlata: Should you choose the MONEY or DECIMAL(x,y) datatypes in SQL Server?

+0

Grazie per la risposta, ma non sono preoccupato per le prestazioni e lo spazio di archiviazione. Voglio sapere che "Come viene memorizzato nella memoria?" – Nooshin

+0

Non sono sicuro al 100%, ma penso che sarebbe memorizzato in modo simile come sono memorizzati i valori decimali.! http://en.wikipedia.org/wiki/Binary-coded_decimal :) –

3

Come sono il "denaro" [...] i tipi di dati in SQL Server memorizzato nella memoria ?

Se volete vedere come è memorizzato un prezzo (8 byte) di valore, allora si potrebbe eseguire seguente script step/step:

CREATE DATABASE TestMoneyDT; 
GO 
USE TestMoneyDT; 
GO 

CREATE TABLE dbo.MyMoney -- :-) 
(
    Col1 CHAR(5) NOT NULL, 
    Col2 MONEY NOT NULL, 
    Col3 CHAR(5) NOT NULL 
); 
GO 

INSERT dbo.MyMoney (Col1, Col2, Col3) 
VALUES ('AAAAA',12345678.0009,'BBBBB'); 
GO 

-- Install http://www.sqlskills.com/blogs/paul/inside-the-storage-engine-sp_allocationmetadata-putting-undocumented-system-catalog-views-to-work/ 
EXEC sp_AllocationMetadata 'dbo.MyMoney' 
GO 
/* 
Stored procedure output: 

Object Name Index ID Alloc Unit ID  Alloc Unit Type First Page Root Page First IAM Page 
----------- -------- ----------------- --------------- ---------- --------- -------------- 
MyMoney  0  72057594039697408 IN_ROW_DATA  (1:147) (0:0)  (1:150) 
*/ 

SELECT DB_ID() AS DBID 
GO 
/* 
DBID 
---- 
13 
*/ 

-- Reading data from page (1:147) (file id 1, page number 147) 
DBCC TRACEON(3604);   -- http://technet.microsoft.com/en-us/library/ms187329.aspx 
DBCC PAGE(13, 1, 147, 3); -- http://blogs.msdn.com/b/sqlserverstorageengine/archive/2006/06/10/625659.aspx 
DBCC TRACEOFF(3604);  -- http://technet.microsoft.com/en-us/library/ms174401.aspx 
GO 

-- See [Memory dump @0x0000000014AEA060] of DBCC PAGE output 
/* 
Memory Dump @0x000000000E76A060 

0000000000000000: 10001600 41414141 41e9f698 be1c0000 †....AAAAAéö.¾... 
0000000000000010: 00424242 42420300 00†††††††††††††††††.BBBBB... 

41414141 41 = AAAAA <- Col1 CHAR(5) 
e9f698 be1c0000  <- Col2 MONEY take this string and run following script (look at SumOverAll values) 
424242 4242 = BBBBB <- Col3 CHAR(5) 
*/ 
GO 

DECLARE @HexString VARBINARY(8) = 0xE9F698BE1C; -- One MONEY value consumes 8 bytes 
WITH N10 
AS 
(
    SELECT * 
    FROM (VALUES (1), (2), (3), (4), (5), (6), (7), (8), (9), (10)) x(Num) 
) 
SELECT src.*, 
     SUM(src.IntValueMultipliedByte) OVER() AS SumOverAll 
FROM 
(
    SELECT n.Num, 
      SUBSTRING(@HexString, n.Num, 2) AS HexValue, 
      CONVERT(INT, SUBSTRING(@HexString, n.Num, 1)) AS IntValue, 
      POWER(CONVERT(NUMERIC(38,0), 256), n.Num-1) AS Byte, 
      CONVERT(INT, SUBSTRING(@HexString, n.Num, 1)) * POWER(CONVERT(NUMERIC(38,0), 256), n.Num-1) AS IntValueMultipliedByte 
    FROM N10 n 
    WHERE n.Num <= LEN(@HexString) 
) src; 
GO 

/* 
NumHexValue IntValue Byte  IntValueMultipliedByte SumOverAll 
----------- ----------- ---------- ---------------------- ------------ 
1 0xE9F6 233   1   233     123456780009 
2 0xF698 246   256  62976     123456780009 
3 0x98BE 152   65536  9961472    123456780009 
4 0xBE1C 190   16777216 3187671040    123456780009 
5 0x1C  28   4294967296 120259084288   123456780009 
*/ 

Nota: ho usato SQL2008R2.

Problemi correlati