2.5 Partial Index
use-the-index-luke 저자 Markus Winand
---------------------------------------------
Markus Winand는 SQL에 대한 통찰력을 제공하고 다양한 시스템이 SQL을 지원하는 방법을 modern-sql.com 에서 보여줍니다. 이전에 그는 use-the-index-luke.com 을 만들었는데, 지금도 활발하게 유지되고 있습니다. Markus는 winand.at 를 통해 강사, 연사 및 컨설턴트로 고용될 수 있습니다.
---------------------------------------------
You can upload a Korean translation of use-the-index-luke.com on your blog
Thank you from the bottom of my heart to author Makus Winand for allowing me.
These are translations that I use for studying by using a papago (google translate)
The translations may not be correct or there may be a typo.
I'd appreciate it if you could point it out in the comments.
---------------------------------------------
---------------------------------------------
use-the-index-luke.com 의 한글번역본을 블로그에 업로드 해도 된다고
허락해주신 Makus Winand 저자님께 진심으로 감사합니다.
이 번역본들은 제가 공부용도로 번역기(papago, google transrate)를 돌려서
번역한 내용들이라 맞지 않거나, 오타가 있을수 있습니다.
댓글로 지적해주시면 감사하겠습니다.
---------------------------------------------
https://use-the-index-luke.com/sql/where-clause/partial-and-filtered-indexes
ㄴ 부분 인덱스
지금까지는 인덱스에 추가할 열에 대해서만 논의했습니다.
부분(PostgrsSQL) 또는 필터링된(SQL Server) 인덱스를 사용하면 인덱싱되는 행을 지정할 수도 있습니다.
----------------------------------------------------------
Caution
Oracle 데이터베이스에는 부분 인덱싱에 대한 고유한 접근 방식이 있습니다.
다음 섹션에서는 이 섹션을 기반으로 설명합니다.
DB2는 부분 인덱스를 지원하지 않지만 이 기능을 사용할때 Oracle Database 에서와 같이 EXCLUDE NULL KEYS 할 수 있습니다.
----------------------------------------------------------
부분 인덱스는다음 예제의 상태 코드와 같이 상수 값을 사용하는 일반적으로 사용되는 조건에 유용합니다.
----------------------------------------------------------
SELECT message
FROM messages
WHERE processed ='N'
AND receiver =?
----------------------------------------------------------
이와 같은 쿼리는 대기열 시스템에서 매우 일반적입니다.
쿼리는 특정 수신자에 대해 처리되지 않은 모든 메시지를 가져옵니다. 이미 처리된 메시지는 거의 필요하지 않습니다. 필요한 경우 일반적으로 기본 키와 같은 보다 구체적인 기준으로 액세스됩니다.
2열 인덱스로 이 쿼리를 최적할 수 있습니다. 이 쿼리만 고려하면 범위 조건이 없기 때문에 열 순서는 중요하지 않습니다.
----------------------------------------------------------
CREATE INDEX message_todo
on messages (receiver, processed)
----------------------------------------------------------
인덱스는 그 목적을 충족하지만 검색되지 않는 많은 행, 즉 이미 처리된 모든 메시지를 포함합니다. 그럼에도 불구하고 로그 확장성으로 인해 인덱스는 많은 디스크 공간을 낭비하더라도 쿼리를 매우 빠르게 만듭니다.
부분 인덱싱을 사용하면 처리되지 않은 메시지만 포함하도록 인덱스를 제한할 수 있습니다. 이에 대한 구문은 놀라울 정도로 간단합니다. 바로 where절 입니다.
----------------------------------------------------------
CREATE INDEX messages_todo
ON messages (receiver)
WHERE processed = 'N'
----------------------------------------------------------
인덱스에는 where 절을 충족하는 행만 포함됩니다.
PROCESSED가 특별한 경우에는 열이 항상 있기 때문에 'N' 열을 제거할 수도 있습니다. 이는 인덱스가 두 가지 차원에서 크기를 줄인다는 것을 의미합니다.
제거된 열로 인해 수평으로.
따라서 인덱스는 매우 작습니다. 대기열의 경우 테이블이 제한 없이 증가하더라도 인덱스크기는 변경되지 않은 상태로 유지된다는 의미일 수도 있습니다.
인덱스에는 모든 메시지가 포함되지 않고 처리되지 않은 메시지만 포합됩니다.
부분 인덱스의 where절은 임의로 복잡해질 수 있습니다. 유일한 근본적인 제한은 함수에 관한 것입니다. 인덱스 정의의 모든 경우와 마찬가지로 결정적 함수만 사용할 수 있습니다. 그러나 SQL Server에는 보다 제한적인 규칙이 있으며 INDEX Predicate 에서 함수나 연산자를 허용하지 않습니다.
데이터베이스는 where 절이 쿼리에 나타날때마다 부분 인덱스를 사용할 수 있습니다.