Trong Dynamics AX có một cơ chế lưu trữ trong đó các bảng có thể được cấu hình để được tải vào bộ nhớ và lưu vào bộ đệm. Bộ đệm này được giới hạn ở một lượng KB nhất định để ngăn ngừa các vấn đề về bộ nhớ. Cài đặt tôi đang nói đến được gọi entiretablecache
và tải toàn bộ bảng trong bộ nhớ ngay khi một bản ghi được yêu cầu.
Gần đây, chúng tôi đã dựa vào một số tập lệnh để xác minh kích thước của các bảng có cài đặt này để xem kích thước bảng có vượt quá giới hạn này không.
Tuy nhiên, bây giờ, nén đã phát huy tác dụng và những thứ như sp_spaceuse hoặc sys.allocation_units dường như báo cáo không gian thực sự được sử dụng bởi dữ liệu nén.
Rõ ràng, máy chủ ứng dụng đang làm việc với dữ liệu không nén nên kích thước dữ liệu trên đĩa trong SQL Server là không liên quan. Tôi cần kích thước thực tế dữ liệu không nén sẽ có.
Tôi biết về sp_estimate_data_compression_savings nhưng như tên gọi, đây chỉ là ước tính.
Tôi muốn có kích thước càng chính xác càng tốt.
Cách duy nhất tôi có thể nghĩ đến là một số SQL động phức tạp tạo các bảng không nén có cùng cấu trúc với các bảng được nén, chèn dữ liệu nén vào bảng bóng đó và sau đó kiểm tra kích thước của bảng bóng đó.
Không cần phải nói, điều này là một chút tẻ nhạt và mất một thời gian để chạy trên cơ sở dữ liệu vài trăm GB.
Powershell có thể là một tùy chọn, nhưng tôi không muốn lặp lại tất cả các bảng để thực hiện select *
trên chúng để kiểm tra kích thước trong tập lệnh vì điều đó sẽ làm ngập bộ đệm và có lẽ cũng sẽ mất nhiều thời gian.
Nói tóm lại, tôi cần một cách để có được kích thước cho mỗi bảng vì nó sẽ không bị nén và bị phân mảnh khỏi phương trình như được trình bày cho ứng dụng, nếu điều đó có thể. Tôi cởi mở với các cách tiếp cận khác nhau, T-SQL được ưa thích nhưng tôi không phản đối Powershell hoặc các cách tiếp cận sáng tạo khác.
Giả sử bộ đệm trong ứng dụng là kích thước của dữ liệu. Một bigint luôn có kích thước của một bigint và một kiểu dữ liệu ký tự là 2 byte cho mỗi ký tự (unicode). Dữ liệu BLOB cũng có kích thước của dữ liệu, enum về cơ bản là dữ liệu int và số là số (38,12), datetime là kích thước của datetime. Ngoài ra, không có NULL
giá trị, chúng được lưu trữ dưới dạng một chuỗi rỗng 1900-01-01
hoặc bằng không.
Không có tài liệu nào về cách thực hiện, nhưng các giả định dựa trên một số thử nghiệm và tập lệnh được sử dụng bởi PFE và nhóm hỗ trợ (cũng bỏ qua việc nén rõ ràng, vì kiểm tra được xây dựng trong ứng dụng và ứng dụng không thể biết nếu dữ liệu cơ bản được nén) cũng kiểm tra kích thước bảng. Liên kết này cho ví dụ:
Tránh sử dụng bộ đệm EntireTable cho các bảng lớn (trong AX 2009 trên 128 KB hoặc 16 trang, trong AX 2012 trên cài đặt ứng dụng 'toàn bộ kích thước bộ đệm của bảng [mặc định: 32KB hoặc 4 trang]) - thay vào đó, hãy chuyển sang ghi bộ đệm.