-
elasticsearch storefield and docvalues and _source 비교elasticsearch 2021. 4. 26. 21:40반응형
store field와 docvalues가 각각 어떻게 저장되는지 알아보고 퍼포먼스가 어떻게 될지 확인해본다
store field는 검색하기 위해 사용되는 필드이다 https://www.elastic.co/guide/en/elasticsearch/reference/current/mapping-store.html#mapping-store
docvalue는 해당 링크 참조 https://ksk-developer.tistory.com/29
stored_field의 내부 구조
stored_field는 행 방식으로 디스크에 저장된다
위의 이미지에서 보는 것과 같이 field3에 접근하기 위해서는 문서 x의 행에 접근하고 field3 이전에 모든 필드를 건너 뛰어야 한다 필드를 건너뛰기 위해서는 필드 길이를 알아야 하는데 건너뛰는 것은 필드를 읽는 것 만큼 비용이 들지는 않지만 비용이 드는 작업임은 분명하다
docvalue의 내부 구조
docvalue는 각 필드마다 따로 저장소를 만들게 된다
즉 컬럼 지향 저장소인데 필드 A의 값을 읽기 위해서 다른 필드 값을 읽지도 건너뛰지 않아도 되므로 stored_field 처럼 특정 필드를 읽기 위해 부가적인 비용을 들이지 않아도 된다
_source field의 내부구조
_source는 index time에 입력되는 모든 필드를 json으로 저장하는 큰 필드이며 해당 행의 첫번재 필드로 저장된다
_source에 있는 일부 데이터만 읽으려고 해도 전체 _source를 읽어야 하기 때문에 불필요한 비용이 들게된다
벤치마킹
3가지 유형의 필드를 벤치마킹하기 위해 elasticsearch에서 3 가지 다른 인덱스를 만들었다. 위키백과에서 가져온 문서 1백만 개를 색인화했으며 각 문서에 대해 15 개의 문자로 100 개의 문자열 필드를 색인화했다 첫 번째 색인에서는 필드를 저장된 것으로 설정하고 두 번째 색인에서는 docvalue로 설정했다. 이 두 인덱스에서 소스 필드를 비활성화했다. 대신 세 번째 인덱스에서는 소스 필드를 활성화 된 상태로 두었다
벤치 마크 결과는 예상했던 결과인데 해당 쿼리에서 필요한 필드가 소수일 경우에는 docvalue를 사용하는 것이 제일 좋다 반면 _source 필드는 많은 필드가 있는 상황에서 거의 전체 필드를 읽어야 할 경우에 source를 사용하는 것이 좋고 stored는 둘 사이에 절충안이 된다
docvalues는 하나의 field 만 원하는 경우 _source field보다 거의 두 배 빠르며 반대로 모든 필드를 반환하려는 경우 차트는 거의 2 배의 속도 향상을 보여준다 docvalue 대신 _source 필드를 사용해야한다
{ "fields": [ "sv1", "sv2", ...], "docvalue_fields": [ "dv1", "dv2", ...], "stored_fields": [ "s1", "s2", ...], "_source": [ "sv1", "sv2" ] }
반응형'elasticsearch' 카테고리의 다른 글
분석기 성능 튜닝(정규식) (0) 2021.12.05 elasticsearch failed to flush export bulk [default_local] (0) 2021.05.02 elasticsearch index sorting으로 퍼포먼스 향상 (0) 2021.04.21 elasticsearch는 어떤 segment 부터 읽을까? (0) 2021.04.16 elasticsearch sprase docvalue (0) 2021.04.13