2012-06-10 7 views
2

낮은 수준의 큐로 설계된 테이블에서 처음 N 개의 행을 가져 오는 SQL 쿼리가 있습니다.where 절의 열을 사용하여 쿼리 최적화

  • 먼저이 질문에 내 구현은 SQL 서버, 오라클, DB2 및 사이베이스를 지원하므로, 데이터베이스 불가지론 될 것입니다, 다음과 같이

    select top N * from my_table where status = 0 order by date asc 
    

    이 쿼리 뒤에 의도이다. 위의 "상위 N"구문은 예제 일뿐입니다.

  • 표에는 수백만 개의 행이 포함될 수 있습니다. 예를 들면, N은 비교적 작은 수이다. 100.
  • 행이 대기열에 있으면 상태는 0입니다. 나중에 처리 중임을 나타 내기 위해 1로 변경됩니다. 처리 후 삭제됩니다. 따라서 테이블의 행 중 90 % 이상이 상태 0을 가질 것으로 예상됩니다.
  • 테이블의 행은 날짜에 따라 반입되어야하므로 order by 절입니다.

이 쿼리를 가장 빠르게 만드는 데 가장 적합한 인덱스는 무엇입니까?

처음에는 색인이 (date, status)이어야한다고 생각했지만 더 이상 확신 할 수 없습니다. 상태 열은 주로 0을 포함하므로 부가 가치가 있습니까? (date)만으로도 색인을 생성하는 것으로 충분합니까?
또는 (status, date)일까요?

답변

2

RDMS에 독립적 인 효율적인 솔루션이 없다고 생각합니다. 예를 들어 오라클에는 비트 맵 인덱스가 있으며 SQLServer에는 부분 인덱스가 있습니다. 예를 들어 Mysql이나 Sqlite와 비슷한 것이없는 경우에는 사용하지 않을 이유가 없습니다. 또한 역사적으로 SQLServer는 Oracle보다 클러스터 된 테이블 (또는 Oracle 세계에서 IOT)을 구현하기 때문에 날짜 열에 클러스터 된 인덱스를 사용하면 Oracle에서는 완벽하게 작동하지만 SQLServer에서는 완벽하게 작동하지 않을 수 있습니다.

다소 접근 방식을 변경하고 싶습니다. 90 %의 행이 status=0 조건을 만족시키지 않는다면 스키마 리팩토링을 시도하고 관심있는 레코드 만 포함하는 새로운 테이블 (또는 구체화 된 뷰)을 추가하는 것이 좋습니다. RDMS가 구체화 된 뷰를 직접 지원하지 않더라도 해당 테이블을 최신 상태로 유지하고 원본 테이블과 데이터를 병합하는 데 필요한 새 프로그램 가능 객체의 수는 비교적 적습니다. 또한 기본 논리를 다시 디자인 할 수 있으므로 행이 업데이트되지 않고 삽입되거나 삭제 된 경우 잠금 경합을 피하는 데 도움이되므로 전체 시스템의 성능이 향상됩니다.

+0

행의 90 %는 상태 = 0입니다. 나는 리팩터링하는 것을 원하지 않습니다. 전체적인 요점은 테이블에서 레코드를 꺼내고 status = 1로 변경 한 다음 몇 가지 작업을 수행하는 것입니다. 처리가 끝나면 해당 레코드가 삭제됩니다. HA를 유지하기 위해 정기적으로 status = 1 인 레코드 (예 : 서버를 가져온 후 서버가 다운 됨)가 있는지 검사합니다. – Yoni

+0

상태 필드별로 테이블을 파티셔닝 할 수 있습니다. 따라서 논리적으로 2 개의 파티션에 저장된 1 개의 테이블을 갖게됩니다. 내가 아는 한, 대부분의 RDMS는 파티셔닝을 지원합니다 ... – a1ex07

0

날짜에 클러스터 된 인덱스가 있고 상태에 클러스터되지 않은 인덱스가 있습니다.

+1

날짜에 클러스터 된 인덱스를 갖는 것이 SQL 서버에 대해서는 의미가 있지만 오라클에서 IOT 테이블을 만들기 전에 두 번 이상 생각할 것입니다. 날짜 열이 고유하지 않으면 가능한 성능 오버 헤드 외에도 추가 열이 필요합니다. 상태 - 오라클 비트 맵 인덱스의 인덱스와 정반대로 그 목적을 달성하는 데는 큰 도움이됩니다. SQLServer (b-tree) 인덱스는 그렇지 않습니다. – a1ex07

+0

이유를 설명하고 설명 할 수 있습니까? – Yoni

+0

@ a1ex07이 주석을 달았으므로 SQL Server를 염두에 두라는 것이 좋습니다. 자세한 내용은 SQL Server에서 클러스터 된 인덱스와 클러스터되지 않은 인덱스의 차이를 검색 할 수 있습니다. – Luftwaffe