2012-08-28 74 views
10

Tôi đang cố gắng tính toán kích thước cơ sở dữ liệu của mình. Tôi sẽ có một bảng với 3 cột (id, int, tiền) Tôi sẽ có 26 triệu hàng với tất cả các cột đang bị chiếm đóng. Cơ sở dữ liệu của tôi sẽ lớn đến cỡ nào? Ngoài ra, nơi tôi có thể tìm thấy kích thước của tất cả các kiểu dữ liệu SQL Server?Nơi tìm kích thước của kiểu dữ liệu SQL Server

+4

Có lẽ là một khởi đầu tốt: http://msdn.microsoft.com/en-us/library/ms175991.aspx –

+3

Bạn nhận ra rằng bạn phải biết NHIỀU về nội bộ DB để đến một con số chính xác? Nó có thể dễ dàng hơn để tạo ra một bảng có kích thước với dữ liệu giả với các thiết lập mà bạn mong muốn, và sau đó kiểm tra kích thước. Có một trăm mối quan tâm cấp thấp có thể thêm hoặc trừ đi số byte cần thiết. – delnan

Trả lời

18

bạn có thể sử dụng dưới đây truy vấn:

SELECT * FROM sys.types 

kết quả của truy vấn trên là dưới đây:

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  

bạn có thể sử dụng max_length cho kích thước của từng loại dữ liệu.

+0

điều này không hiển thị kích thước. ví dụ, kích thước của một biến trống XML là 5, nó nói nó ở đâu? –

+0

bạn có thể thấy một bổ sung tốt (nếu không phải là một lựa chọn tốt hơn) cho câu trả lời này [ở đây] (http://dba.stackexchange.com/questions/147296/where-to-find-the-size-of-sql-server -data-types/147315 # 147315) –

+1

nvarchar rộng 2 byte. vì vậy sys.columns.max_length = 44. nhưng độ dài thực tế là 22. nơi nào kích thước thực tế của kiểu dữ liệu được hiển thị? Không phải kích thước tối đa mà một cột thuộc loại đó có thể là. – TamusJRoyce

1

http://msdn.microsoft.com/en-us/library/ms187752.aspx

Money : 8 bytes 
int : 4 bytes 
id - depends on what you mean. 
+0

+ chi phí hàng khác như 'NULL_BITMAP' và bit trạng thái có thể là con trỏ phiên bản nếu bật chế độ cô lập ảnh chụp nhanh. –

0

Nếu bảng được chỉ định trong mệnh đề where chứa nvarchar, truy vấn này sẽ cung cấp cho bạn số lượng ký tự có cho cột đó chính xác!

Điều này phát hiện nếu cột là "rộng" và về cơ bản chia cho 2. Rộng hơn chỉ 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 

Tất nhiên, bạn chỉ có thể chia max_length trên sys.columns cho 2 nếu bạn biết cột là nvarchar. Điều này là nhiều hơn cho việc khám phá lược đồ bảng theo cách có vẻ tốt hơn nếu các kiểu dữ liệu sql mới được giới thiệu trong tương lai. Và bạn chọn để nâng cấp lên nó. Khá nhỏ cạnh trường hợp.

Vui lòng chỉnh sửa và sửa câu trả lời này nếu bạn thấy một trường hợp cạnh mà byte và bit không chính xác.

chi tiết:

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

Nếu ai đó biết rằng SQL Server lưu trữ các bit và byte kích thước cho từng loại dữ liệu. Hoặc một cách tốt hơn để có được kích thước sys.columns, xin vui lòng để lại một bình luận!

Các vấn đề liên quan