PostgreSQL 비트 문자열을 사용해야합니까?


18

bit string최근 데이터 유형 에 대해 배우고 있으며 다음 과 같이 궁금합니다.

  1. 이 문서 페이지 의 맨 아래에는 다음같은 문장이 있습니다.

    ... 문자열 길이에 따라 5 또는 8 바이트의 오버 헤드

  2. Npgsql, ODBC 등과 같은 드라이버를 통해 비트 문자열을 PHP, Java, C #, C ++ 등과 같은 다른 언어로 처리하는 방법

질문 # 1의 경우 smallint 또는 bigint를 사용하면 스토리지 효율성이 훨씬 높아지고 정수가 모든 곳에서 지원되므로 성능이 향상 될 수 있습니다. 대부분의 프로그래밍 언어는 정수에서 비트 연산을 쉽게 처리합니다. 이 경우 비트 열 데이터 유형을 도입하는 요점은 무엇입니까? 많은 양의 비트 마스크가 필요한 경우에만 해당됩니까? 비트 필드 인덱싱? PostgreSQL에서 비트 필드 인덱싱이 어떻게 수행되는지 궁금합니다.

# 2의 경우, 나는 호기심 이상으로 혼란스러워합니다. 예를 들어 요일 비트 마스크를 비트 (7) 필드에 하루에 한 비트 씩 저장하면 가장 낮은 비트는 월요일을 나타냅니다. 그런 다음 PHP와 C ++에서 값을 쿼리합니다. 무엇을 얻을 수 있습니까? 설명서에는 비트 문자열이 있지만 비트 문자열은 정수처럼 직접 사용할 수있는 것이 아닙니다. 그렇다면이 경우 비트 필드를 포기해야합니까?

비트 및 비트를 변경해야하는 이유와시기를 누구나 자세히 설명 할 수 있습니까?



2
SO에 대한 Erwin의 대답은 훌륭합니다 (@Erwin을 통해 복사하는 것이 마음에 들지 않는다면 여기에있는 것이 유용 할 것입니다).하지만 나는주의를 기울이고 싶습니다 : 대부분의 경우 정보 저장을 고려하지 않을 것입니다 RDBMS의 비트 문자열-스토리지 '효율'에 관계없이 일반 솔루션에서 별도의 부울 열을 사용합니다.
Jack Douglas

@ JackDouglas : 대답을 복사해도 괜찮습니다. 그래도 나는 SE 사이트에서 답변을 복제하는 것이 좋은 생각인지 궁금합니다.
Erwin Brandstetter

@ Erwin 왜 안되는지 모르겠습니다. 사이트 사이에 약간의 겹침이 있고 둘 다 독립적으로 있어야합니다 (예를 들어 우리는 그렇지 않을 수도 있고 어쨌든 할 수 없었습니다) SO에 대한 동일한 질문). 우리의 초점은 '전문가'문제에 더 초점을 맞추고 있지만 IMO는 귀하의 답변이 해당 카테고리에 적합합니다. :)
Jack Douglas

@JackDouglas : 글쎄요. 어쨌든 당신이 칭찬 한 후에 어떻게 동의하지 않을 수 있습니까? ;)
Erwin Brandstetter

답변:


18

몇 가지 변수 만있는 경우 별도의 boolean열을 유지하는 것이 좋습니다.

  • 인덱싱이 쉽습니다. 특히 표현식에 대한 색인 이 쉽습니다.
  • 쿼리 조건과 부분 인덱싱은 쓰기와 읽기가 쉽고 의미가 있습니다.
  • 부울 열은 1 바이트를 차지합니다. 소수의 변수에 대해서만 가장 적은 공간을 차지합니다.
  • 다른 옵션과 달리 부울 열 NULL은 필요한 경우 개별 비트 값을 허용 합니다. NOT NULL그렇지 않은 경우 언제든지 열을 정의 할 수 있습니다 .

스토리지 최적화

손 전체 변수보다 많지만 33 개 미만인 경우 integer 가장 적합 할 수 있습니다. (또는 bigint최대 64 개의 변수의 경우 a )

  • 디스크에서 4 바이트를 차지합니다.
  • 정확한 일치를위한 매우 빠른 인덱싱 ( =연산자).
  • 개별 값을 처리하는 것이 또는를 사용하는 것보다 느리 bit string거나 편리하지 않을 수 있습니다 boolean.

더 많은 변수를하거나 많이 값, 또는 큰 테이블과 디스크 공간이없는 경우 / RAM 아무 문제 없다, 또는 당신이 선택해야할지 확실하지 않은 경우, 나는 고려할 조작하려는 경우 bit(n)bit varying(n) .

  • 최소 5 바이트 (매우 긴 문자열의 경우 8)와 8 비트의 각 그룹에 대해 1 바이트 (반올림)를 차지합니다.
  • 비트 문자열 함수와 연산자를 직접 사용할 수 있습니다 .

단지 3 비트 의 정보를 위해, 개별 boolean열은 3 바이트, integer4 바이트 및 bit string6 바이트 (5 + 1)가 필요합니다.

들면 32 비트 의 정보, integer여전히은은 4 바이트를 필요로 bit string동일한 (5 + 4)에 대해 9 바이트를 차지하고 boolean열은 32 바이트를 차지한다.

추가 자료


그래 나도 너와 같은 생각이야. 현재 samllint를 사용하여 평일의 비트 마스크를 저장하고 있습니다. 스토리지 효율성 / 성능이 넓은 경우에 적합합니다. 그러나 비트 마스크에 인덱싱 / 필터링이 더 있으면 성능이 저하되어 실패합니다.
Jackey Cheung

3

모든 PostgreSQL 유형은 어떤 것에는 유용하고 다른 것에는 덜 유용합니다. 일반적으로 기능에 대해 먼저 걱정하고 나중에 성능에 대해 걱정하지 않아도됩니다. PostgreSQL에는 다양한 종류의 데이터 유형을 조작 할 수있는 많은 기능이 있으며 이것도 예외는 아닙니다.

db 드라이버가 일종의 유형 변환을 통해 처리하지 않는 한 응용 프로그램 계층에서 문자열 표현을 가져 와서 처리해야합니다. 따라서 해당 용량에서 유용하거나 유용하지 않을 수 있습니다.

비트 또는 비트와 같은 비트 연산을 기반으로 레코드를 선택하거나 SQL 쿼리에서 데이터를 조작하려는 경우 유용 할 수 있습니다. 이 작업을 수행하지 않으면 PostgreSQL의 더욱 난해한 기능 중 많은 부분이 도움이되지 않습니다.

또한 이진 정보의 긴 문자열에는 스트리밍 등을 수행 할 수있는 큰 객체 인터페이스와보다 작은 문자열 표현을 허용하는 bytea 인터페이스가 있습니다.

tl; dr : 필요할 경우 알 것입니다. 그렇지 않으면 마음의 "나중에 사용하기 위해 예약 됨"섹션에 보관하십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.