Dynamics AX에는 테이블을 메모리에로드하고 캐시하도록 구성 할 수있는 캐싱 메커니즘이 있습니다. 이 캐시는 메모리 문제를 방지하기 위해 특정 양의 KB로 제한됩니다. 내가 말하고있는 설정이 호출 entiretablecache
되고 단일 레코드가 요청되는 즉시 전체 테이블을 메모리에로드합니다.
최근까지이 설정이있는 테이블의 크기를 확인하여 테이블 크기가이 제한을 초과하는지 확인하기 위해 일부 스크립트를 사용했습니다.
그러나 이제 압축이 시작되고 sp_spaceused 또는 sys.allocation_units 와 같은 것이 압축 된 데이터에서 실제로 사용 된 공간을보고하는 것 같습니다.
분명히 응용 프로그램 서버는 압축되지 않은 데이터로 작업하므로 SQL Server의 디스크에있는 데이터 크기는 관련이 없습니다. 압축되지 않은 데이터의 실제 크기가 필요합니다.
sp_estimate_data_compression_savings는 알고 있지만 이름에서 알 수 있듯이 이는 추정치 일뿐입니다.
가능한 한 정확한 크기를 선호합니다.
내가 생각할 수있는 유일한 방법은 압축 된 테이블과 동일한 구조로 압축되지 않은 테이블을 작성하고 해당 새도우 테이블에 압축 된 데이터를 삽입 한 다음 해당 새도우 테이블의 크기를 확인하는 복잡한 동적 SQL이었습니다.
말할 것도없이, 이것은 약간 지루하며 수백 GB의 데이터베이스에서 실행하는 데 시간이 걸립니다.
Powershell은 옵션이 될 수 있지만 모든 테이블을 반복 select *
하여 스크립트에서 크기를 확인 하기 위해 모든 테이블을 반복하고 싶지는 않습니다 . 캐시가 쇄도하고 시간이 오래 걸릴 수 있기 때문입니다.
간단히 말해서, 각 테이블의 크기를 한 번 압축하지 않고 가능한 경우 응용 프로그램에 표시된 방정식에서 조각화하여 크기를 얻는 방법이 필요합니다. 나는 다른 접근 방식에 개방적이며 T-SQL이 선호되지만 Powershell 또는 다른 창조적 인 접근 방식에는 반대하지 않습니다.
응용 프로그램의 버퍼가 데이터의 크기라고 가정하십시오. bigint는 항상 bigint의 크기이며 문자 데이터 유형은 문자 당 2 바이트 (유니 코드)입니다. BLOB 데이터는 데이터 크기도 사용하며, 열거 형은 기본적으로 int이고 숫자 데이터는 숫자 (38,12), datetime은 날짜 / 시간의 크기입니다. 또한 NULL
값 이 없으며 빈 문자열로 저장 1900-01-01
되거나 0입니다.
이것이 어떻게 구현되는지에 대한 문서는 없지만 가정은 PFE와 지원 팀이 사용하는 일부 테스트 및 스크립트를 기반으로합니다 (검사는 응용 프로그램에 내장되어 있으며 응용 프로그램에서 알 수 없으므로 압축을 무시합니다) 기본 데이터가 압축되어 있으면 테이블 크기도 확인합니다. 이 링크 의 예는 다음과 같습니다.
큰 테이블에 대해서는 WholeTable 캐시를 사용하지 마십시오 (AX 2009에서는 128KB 또는 16 페이지 이상, AX 2012에서는 '전체 테이블 캐시 크기'응용 프로그램 설정 [기본값 : 32KB 또는 4 페이지]) – 대신 레코드 캐싱으로 이동하십시오.