2012-10-30 2 views
3

"상태"열이있는 테이블로 작업하고 있는데 일반적으로 2 또는 3 개의 다른 값만 있습니다. 이 테이블은 SQL 문 다음과 같은 몇 만 행을 보유 할 때 때때로, 느린 (I는 전체 테이블 스캔이 완료 가정)된다 : 기본적으로 (SQLite : COUNT 및 GROUP BY가 포함 된 speedup SQL 문

disabled | 500000 
enabled | 2000000 

:

SELECT state, count(*) FROM mytable GROUP BY state 

나는 이런 식으로 뭔가를 얻을 것으로 예상 얼마나 많은 항목이 "활성화"되어 있고 얼마나 많은 항목이 "비활성화"되어 있는지 알고 싶습니다. 실제로는 실제 응용 프로그램의 텍스트 대신 숫자입니다.

내 상태 열에 대한 색인을 추가하는 것이 꽤 쓸모없는 것 같아요. 그곳에는 매우 다른 값만 발견 될 수 있기 때문입니다. 다른 옵션은 무엇입니까?

"타임 스탬프"열 (색인 포함)도 있습니다. 내가 sqlite3를 데이터베이스를 사용하고 지금

WHERE timestamp BETWEEN x AND y 

을하지만, 다른 DB 엔진을위한 솔루션으로 흥미로운 일이 될 수 있도록 다른 데이터베이스 엔진이 너무 다르지 않다 같습니다 이상적 솔루션은 내가 추가 할 경우 잘 작동한다 잘.

감사합니다.

+2

실행 계획은 어떻게됩니까? –

+0

SQLite는 "detail"열에 "TABLE mytable"이라고하는 행 하나를 제공합니다 (전체 테이블 스캔이라고 생각합니다). – Jens

+0

그러나 MS SQL은 동일한 조건 (위 조건과 2 백만 행이없는 위 문장)을 알려줍니다. SELECT 0 %, Compute Scalar 0 %, Hash Match (Aggregate) 65 %, Clustered Index Scan 35 % – Jens

답변

1

타임 스탬프, 상태 (순서대로)에 커버 인덱스를 넣을 것입니다. 이론적 근거는 다음과

  • 소인의 조건 (즉, 덮고 인덱스) 상태 상태는 인덱스 여전히 경우

  • 보다 더 선택 될 것, 엔진 만 생성하는 (테이블의 주요 데이터에 액세스하기 위해 랜덤 I/O를 지불하지 않고도) 인덱스 자체에 대해 범위 스캔을 수행 할 수 있습니다.

참고 : 타임 스탬프 범위가 너무 넓 으면 인덱스에도 불구하고 느려집니다. 무작위 입출력은 순차 I/O보다 비용이 높기 때문에 인덱스 범위 스캔이 테이블 스캔보다 비쌉니다. 일반적으로 테이블의 10 % 이상을 스캔해야하는 경우 엔진은 테이블 스캔을 유지하고 인덱스를 무시하는 것을 고려해야합니다. 나는 sqlite가 이런 종류의 최적화를 지원할만큼 충분히 똑똑하다고 확신한다.

+0

감사합니다. . 내가 미리 계산 된 값을 와이드 타임 스탬프 범위의 쿼리에 대해 어쨌든 (며칠 또는 몇 주 동안 합계) 저장할 필요가있는 것처럼 보입니다. – Jens