Kích thước cột với số thập phân kiểu dữ liệu


7

Theo BOL cho SQL Server 2008 R2, số thập phân kiểu dữ liệu yêu cầu các byte lưu trữ sau:

Precision  Storage bytes

1 - 9      =>   5

10-19      => 9

20-28      => 13

29-38      => 17

Tuy nhiên, khi tôi thực hiện một datalength () trên một cột được định dạng thập phân (19,5) và có giá trị 10999.99999 tôi có nhận được 5 byte không? Theo hiểu biết của tôi, độ chính xác là 10 chứ không phải 9 và sẽ dẫn đến 9 byte.

Điều này dẫn đến hai câu hỏi:

  1. kích thước của bảng với cột này không phụ thuộc vào định nghĩa cột, thay vào đó các giá trị thực trong cột xác định kích thước bảng?

  2. tại sao thông tin trong BOL không khớp với datalength () trả về?


vui lòng cho chúng tôi biết chính xác SQL
gbn

Điểm cắt để DATALENGTHbáo cáo 5 hoặc 9 byte trong trường hợp này dường như là 42949.67295(được lưu trữ dưới dạng 01 FF FF FF FF 00 00 00 00) và 42949.67296(được lưu trữ dưới dạng 01 00 00 00 00 01 00 00 00). Không chắc chính xác hành vi đó hữu ích như thế nào!
Martin Smith

CREATE TABLE [Test195]( [Date] [date] NULL, [Time] [time](3) NULL, [CCYPairID] [tinyint] NULL, [Price] [decimal](19, 5) NULL, [Amount] [bigint] NULL, ) SELECT [Date] ,[Time] ,[CCYPairID] ,DATALENGTH([CCYPairID]) as CByte ,[Price] ,DATALENGTH([Price]) as PByte ,[Amount] ,DATALENGTH([Amount]) as AByte FROM [Test195]
nojetlag

Câu trả lời:


6

Không trộn bộ nhớ (5 hoặc 9 byte) và những gì bạn nhận lại

Trong cột thập phân (19,5), nó luôn có 9 byte trên đĩa. Vì vậy, số không sẽ mất chín byte.

Số của bạn 10999.99999chỉ đơn thuần là một đại diện cho số được lưu trữ sau đó được phân tích thành 10999.99999 bởi DATALENGTH

Biên tập:

DATALENGTH sẽ trả về số byte cần thiết để lưu trữ biểu thức đã cho. Nó bỏ qua datatype là chủ yếu. Vì vậy, 10999.99999được coi là thập phân (10,5) có thể được lưu trữ trong 5 byte chứ không phải 9 như Martin đã chỉ ra trong một nhận xét.

Vì vậy, một cột thập phân (19,5) luôn là 9 byte. Cơ sở dữ liệu không quan tâm. Nó nhìn vào biểu thức 10999.99999và quyết định nó có thể được lưu trữ trong 5 byte. Nhưng tất nhiên là không thể.

Cá nhân, tôi chưa bao giờ sử dụng DATALENGTH ngoại trừ để tìm các dấu cách hoặc tương tự.

Về cơ bản, không sử dụng DATALENGTH trên các kiểu dữ liệu không phải chuỗi.

Trả về số byte được sử dụng để biểu diễn bất kỳ biểu thức nào.

DATALENGTH đặc biệt hữu ích với các kiểu dữ liệu varchar, varbinary, text, image, nvarchar và ntext vì các kiểu dữ liệu này có thể lưu trữ dữ liệu có độ dài thay đổi.

Lưu ý: LEN cho bạn biết thời gian biểu diễn chuỗi là bao lâu

DECLARE @i decimal(19,5)
SET @i ='10999.99999'
SELECT @i,LEN(@i),DATALENGTH(@i)
SET @i ='-90999.99999'
SELECT @i,LEN(@i),DATALENGTH(@i)

Vì vậy, bạn đang nói rằng datalength () chỉ cung cấp cho tôi các byte cần thiết để hiển thị cột đã cho nhưng kích thước thực tế trên đĩa sẽ thay đổi? Tôi đã thực hiện một số thử nghiệm với tinyint và tiền và ở đó số lượng byte đã khớp với những gì tôi mong đợi theo tài liệu. Tôi đang hỏi những câu hỏi này bởi vì tôi có khoảng 13 tỷ hàng trong một bảng và muốn tối ưu hóa thông lượng ngay cả trong trường hợp xấu nhất là quét toàn bộ bảng. Trong trường hợp này, kích thước byte từ lưu trữ hoặc kích thước byte cho vấn đề hiển thị? (tại thời điểm tôi cần aprox. 15 phút để quét toàn bộ bảng)
nojetlag

không có tối ưu hóa cho quét toàn bộ bảng. Đừng tập trung vào những gì một chức năng không phù hợp mang lại cho bạn: nghĩ về lập chỉ mục hoặc phân vùng hoặc lưu trữ
gbn
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.