2011-03-11 2 views
2

우리의 응용 프로그램은 클라이언트가 구성한 규칙의 구조에 따라 데이터를 처리합니다. 처리하는 동안 모든 단계에서 상세한 "로그"가 생성되므로 사용자가 최종 처리 결과 뒤에있는 이유 &의 논리를 이해하고 어떤 한계 (또는 규칙 또는 기타)가 발생했는지 이해할 수 있습니다.SQL 용 중복 텍스트 데이터 압축. 고정 된 사전?

어떻게이 데이터를 DB에 저장 하시겠습니까?

데이터의 95 % 이상이 하나의 로그 레코드에서 다음 로그 레코드까지 중복 될 수 있습니다. 나는 100 개의 레코드에서 결합 된 텍스트에 대해 LZMA를 실행했으며 출력은 2 %의 크기였습니다.

텍스트는 기본 키로 표시하기 위해 검색됩니다. 필터링이나 검색 목적으로는 절대로 질의되지 않습니다. 텍스트는 각 레코드에 대해 평균 약 25k입니다.

각 레코드의 텍스트를 압축하면 압축률이 10 % ... 2 %인데 비해 100 개 레코드가됩니다.

이상적으로 말하면 방대한 양의 기존 데이터에서 생성 된 일종의 고정 사전을 사용하고 싶습니다.

우리는 SQL 2005를 사용하고 있습니다. SQL 2008에 행 & 페이지 수준 압축 옵션이 있습니다. 그러나 전체 고객 기반을 업그레이드하는 것은 현재로서는 불가능합니다.

생각하십니까? 덕분에 !


업데이트 : 다음은 내가 수행 한 작업입니다. 실험을 읽는 1 주일 후, 나는 1000 개의 레코드가 결합 된 텍스트에 LZW 스타일 문자열 사전을 생성하는 절차를 작성했습니다. 그런 다음 다양한 방법으로 사전에 우선 순위를 매겼습니다. - 전체적으로 예상되는 비용 절감 (대체를 통해 바이트 단위) - 레코드 당 1 회 이하의 사전 항목 만 포함하는 예상 절감액.

샘플 레코드에서 가장 높은 우선 순위 X (100 & 1000 사이) 사전 항목을 단순 대체했습니다. 그런 다음 LZMA alg를 사용했습니다. 인코딩 된 출력을 압축합니다.

사전에 대해 다른 구성으로 재생하면 ... 나는 기껏해야 LZMA 압축을 약 1 % 향상시킬 수 있음을 발견했습니다. 대부분의 경우 엔 엔트로피를 더 많이 도입하기 때문에 인코딩 된 LZMA 압축 데이터는 이 더 큰 w/LZMA로 압축 된 것보다 큽니다.

LZMA에서 악용 될 수있는 각 레코드의 텍스트 내에 행 사이에있는 것보다 더 많은 중복이 있음을 확인했습니다.

아마도 나는 모든 텍스트를 LZMA하고 하루 만 부릅니다.

+0

+1 큰 질문! –

+0

은 로그의 전체 행을 다시 사용합니까? 또는 작은 차이가있는 대부분 같은 줄이 있습니까? 다시 말해, 한 로그 항목에서 다른 항목으로 동일한 정확한 텍스트를 다시 사용할 수있는 기회가 있습니까? – Randy

+0

대부분 같은 텍스트입니다 .. 약간의 차이점이 있습니다. 예를 들어 ... 각 레코드에 "2008 년 연간 제한 계산 : $ xx.xx 발견"또는 "월간 최소 $ 300. 처리 중단"과 같은 줄이있을 수 있습니다. 날짜, 달러, 중단/계속 변경됩니다. –

답변

1

SQL 2005에서 이러한 유형의 압축을 수행하는 유일한 방법은 고유 한 SQL CLR 개체를 사용하여 사용자 지정 프레임 워크를 만드는 것입니다. 이것은 꽤 복잡한 해결책이 될 것이지만 그것은 당신의 목적을 위해 작동 할 것입니다. SQL 2008로 업그레이드하는 것이 훨씬 쉽고 비용 효율적일 수 있습니다.

SQL CLR 함수 및/또는 트리거를 사용하여 압축을 관리 할 수 ​​있습니다. & 테이블의 압축 해제 작업 ... 성능이 최적보다 낮을 수 있습니다. 잘 모르겠습니다. 사전 관리 유틸리티가 필요합니다. 고정 사전을 정기적으로 업데이트하고 최적화해야하는 일종의 정기 유지 관리가 만들어 질 수 있습니다 (필요한 경우). 당신이 볼 수 있듯이, 기사의 저자가 사용하는

Using CLR integration to compress BLOBs/CLOBs in SQL Server 2005

-이 문제에 대한 직접적인 해결책은 아니지만

, 난 당신이 코드 프로젝트의 흥미에의 다음 문서를 찾을 수 있습니다 생각하십니까 SQL CLR은 SQL 2005에서 다른 압축 문제를 해결하는 매우 영리한 방법입니다.

+0

감사합니다. 나는 실제로 SQL에서 CLR을 사용하지 않는다 ... 나는 그것으로 주변을 파고 들려고 노력할 것이다. 감사! –

0

대부분 텍스트가 동일하면 db의 메시지 출력 범위를 저장하고 메시지 ID가있는 테이블과 메시지를 고유하게 만드는 다른 매개 변수가있는 관계형 방법을 사용할 수 있습니까?

+0

처음부터 이것을 설계한다면 데이터 정규화 및 다른 계몽 된 디자인 선택에 대해 절대적으로 생각할 것입니다. 기본적으로 임의 텍스트를 허용하는 구현을 슬프게도 상속합니다. –

관련 문제