로그가 정말 큽니다. (수백만 행)URL 또는 유사한 문자열을 나타 내기 위해 binary_checksum()을 사용하는 데 제한이 있습니까?
LogTable
-------
ID
DATE
BASEURL
QUERYSTRING
USER
REFERRER
USERAGENT
SERVER
데이터를 정규화하여이 테이블을 줄이십시오. (슬림 한 사이즈)
나는 알고있다! 알아! 로그는 초고속 인서트 여야합니다. 반면에 로그 테이블은 너무 커서 유지 관리 계획이 추해지고 있습니다. 그래서 저는 BASEURL, USER, SERVER, USERAGENT와 같이 반복적 인 컬럼에만 관심이 있습니다.
는 지금, 나는 로깅이 여전히 빨라야 알고, 그래서 내 질문에 이르게하는 문자열 비교하고 싶지 않아 :
내가 LOGTABLE에
binary_checksum(COLUMN_VALUE)
를 저장에 의존 할 수 , 별도의 테이블에 COLUMN_VALUE와 체크섬 매핑을 유지 하시겠습니까?
내 응용 프로그램에서는 모든 요청에 대해 데이터베이스 서버로 돌아갈 필요가 없도록 매핑 캐시를 보관할 것입니다. (새로운 체크섬 값이있는 경우에만 매핑 테이블에 삽입해야합니다.)
주요 목표는 테이블에 대한 간단한 분석 쿼리를 실행하고 데이터를 추출 할 수있게하는 것입니다. 데이터베이스 (및 내 응용 프로그램)를 완전히 정지시키는 것입니다.
다음은 간단한 쿼리는 예를 들어, :
select
count(1)
, [user] /* This is a checksum value, which I can lookup in my cache */
from
LogTable
where date between @from and @to
group by [user]
당신은 어떻게 생각하십니까? 이 체크섬 접근은 괜찮습니까?
편집 :
- 내 모든 열은 VARCHAR (2000) 이하이다.
- 데이터를 더 빨리 인덱싱 할 수 있다고 가정합니까? (오프라인/변형 복사본의 색인을 생성합니다)
내 질문에 간접적으로 대답했다고 생각합니다. 각 값에 대해 고유 한 해시가있는 한 (해시 할 각 열에 대해 고유 한 값이 10k 미만입니다.) 괜찮을 것입니다. ... 그런 간단한 해시가 아주 약해 보이는 것이 분명 해지고 있습니다. –
대신에 MD5를 사용할 수 있으며, 매우 빠르며 128 비트에서 충돌 가능성이 훨씬 적습니다. –
감사합니다. MD5를 사용한다고 가정 할 때 다른 함정이 있습니까? –