datetime2 (0) so với datetime2 (2)


15

Theo tài liệu datetime2 (Transact-SQL) :

Kích thước lưu trữ
6 byte cho các phân đoạn nhỏ hơn 3.
7 byte cho các phân khu 3 và 4.
Tất cả các phân khu khác yêu cầu 8 byte.

Kích thước của datetime2(0), datetime2(1), datetime2(2)sử dụng cùng một lượng lưu trữ (6 byte).

Tôi có thể đúng khi nói rằng tôi cũng có thể đi cùng datetime2(2)và đạt được lợi ích của độ chính xác mà không có bất kỳ chi phí kích thước bổ sung nào không?

Xin lưu ý:

  • Cột này được lập chỉ mục với PK để tạo thành một chỉ mục cụm tổng hợp (được sử dụng để phân vùng bảng)
  • Tôi không quan tâm đến mili giây

Sẽ datetime2(0)có hiệu quả cpu hơn khi được sử dụng trong mệnh đề where hoặc khi tìm kiếm thông qua một chỉ mục?

Đây là một bảng lớn, vì vậy tối ưu hóa nhỏ nhất sẽ tạo ra sự khác biệt lớn.

Câu trả lời:


26

Kích thước của dateTime2 (0), dateTime2 (1), dateTime2 (2), dateTime2 (3) sử dụng cùng một dung lượng lưu trữ. (6 byte)

Tôi có đúng không khi nói rằng tôi cũng có thể đi với dateTime2 (3) và đạt được lợi ích của độ chính xác mà không có bất kỳ chi phí kích thước bổ sung nào.

Không, bạn giải thích sai tài liệu. Lưu ý các trạng thái lưu trữ tài liệu kích thước 6 byte cho các phân đoạn nhỏ hơn 3 (nhấn mạnh của tôi). Vì vậy, độ chính xác bằng 3 sẽ yêu cầu 7 byte.

Nếu bạn không quan tâm đến mili giây, datetime2(0)sẽ là loại dữ liệu chính xác và chính xác. Thực tiễn tốt nhất là chỉ định loại dữ liệu phù hợp và độ chính xác dựa trên dữ liệu được lưu trữ vì điều này vốn sẽ cung cấp lưu trữ tối ưu và hiệu quả. Điều đó đang được nói, tôi sẽ không mong đợi một tác động hiệu suất đáng kể dựa trên độ chính xác datetime2 được chỉ định miễn là kích thước lưu trữ là như nhau nhưng bản thân tôi chưa kiểm tra cụ thể.

Các yêu cầu ứng dụng sẽ ra lệnh những gì phải được lưu trữ trong cơ sở dữ liệu khi có độ chính xác cao hơn trong nguồn. Ví dụ: đối với thời gian nhập đơn hàng có nguồn gốc từ SYSDATETIME(), người dùng có thể không muốn độ chính xác 100 nano giây. Một lần nữa, chọn loại dữ liệu và độ chính xác để phát triển mới theo yêu cầu và bạn thường sẽ có được hiệu suất tối ưu mà không cần suy nghĩ thêm:

Mặc dù datetime2 thích hợp nhất cho phát triển mới như được liệt kê ở trên, đôi khi người ta có thể cần sử dụng datetime (độ chính xác cố định 3 với độ chính xác 1/300 giây) để tương thích với các ứng dụng datetime kế thừa, do đó tránh chuyển đổi ngầm và hành vi so sánh bất ngờ, nhưng tại chi phí của độ chính xác thứ hai phân đoạn và tăng lưu trữ.

Xem xét rằng việc lưu trữ độ chính xác cao hơn yêu cầu cũng có thể có chi phí phát triển. Nếu một người lưu trữ một thành phần thời gian với giây phân đoạn khi chỉ yêu cầu độ chính xác toàn bộ giây, các truy vấn sẽ vẫn cần xem xét các giây phân số để trả về kết quả chính xác. Ví dụ: với một ứng dụng mà người dùng chọn phạm vi thời gian thông qua giao diện người dùng chỉ cho phép toàn bộ giây, mã ứng dụng sẽ cần tính đến các giây phân số trong giá trị phạm vi thời gian kết thúc và điều chỉnh giá trị do người dùng cung cấp cho phù hợp (ví dụ: WHERE OrderEntryTime BETWEEN '2017-01-11T08:00:00.00.00' AND '2017-01-11T08:59:59.99'hoặc WHERE OrderEntryTime >= '2017-01-11T08:00:00.00' AND OrderEntryTime < '2017-01-11T09:00:00.00'). Điều này sẽ thêm độ phức tạp mã.


Xin lỗi vì đã va vào chủ đề cũ này chỉ vì ghi chú nhỏ này, nhưng thời gian nhỏ có toàn bộ giây (ví dụ: hh: mm: ss).
pgfiore


@pgfiore, các smalldatetimetài liệu khẳng định chính xác một phút và bạn sẽ thấy nó là đúng với SELECT CAST(GETDATE() AS smalldatetime);.
Dan Guzman
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.