열에 대한 숫자 대 정수-크기 및 성능


11

PostgreSQL 테이블을 사용하는 응용 프로그램이 있습니다. 테이블은 매우 커서 (수십억 행) 정수인 열이 있습니다.

integer6 자리, 즉 0-999,999, 아니 악재까지 될 수 있습니다.

나는 그것을 변경하기로 생각했습니다 numeric(6,0).

이것이 좋은 생각입니까? numeric(6,0)더 적은 바이트를 사용 하시겠습니까 ? 성능은 어떻습니까 (이 테이블은 많이 쿼리되고 있습니까)?

답변:


11

이것이 좋은 생각입니까?

아니.

것입니다 numeric(6,0)적은 바이트를 가지고?

아니.

test=> SELECT pg_column_size(INT4 '999999'), pg_column_size(NUMERIC(6,0) '999999');
 pg_column_size | pg_column_size 
----------------+----------------
              4 |             10
(1 row)

성능은 어떻습니까 (이 테이블은 많이 쿼리되고 있습니까)?

느리다. 임의의 정밀도 값이므로 이진 코드 10 진수로 저장됩니다.


부수적으로 숫자는 0-999999 도메인을 자동으로 시행하므로 한 가지 장점이 있습니다. 그는 그러나 INT의 경우 별도의 제약 조건 해결 될 수있다
레나

1
numeric열을 변경하는 데 문제 가 int있습니까?
Racer SQL

@RacerSQL 예 int 크기를 오버플로하는 값이있는 경우 가능합니다.
DylanYoung

5

정답은 모든 질문에 대한 것은 아닙니다. Integer는 항상 사용할 수있는 모든 것을위한 길입니다. (예 : 돈)

잠시 생각해보십시오. 데이터베이스 엔진은 정수를 만나면 해석이 많지 않기 때문에 매우 효율적으로 처리합니다. 정수입니다. 숫자 유형은 문자열처럼 동작합니다. 엔진은 먼저 소수점 앞뒤에 어떤 부분이 있는지 알아 내고 숫자 연산을 수행하기 위해 적절히 마사지합니다.

숫자 유형은 종종 사람에게 더 편리하지만 정수를 사용하는 것이 항상 숫자보다 효율적입니다.


돈에 관해서는 동의하지 않습니다. 십진법 (달러당 1000)을 저장하는 것과 같은 스케일 정수를 사용하는 것은 좋지만 어색합니다. 빨리 사용하는 것이 더 실용적이됩니다 NUMERIC. 그래도 확장 정수는 돈에 부동 소수점 값을 사용하는 것보다 낫습니다.
Craig Ringer

2
@CraigRinger 나는 당신이 실제로 저와 동의하지 않는다고 생각합니다! 돈을 위해 10 진수를 사용하는 것이 개발자에게는 항상 덜 어색하다는 데 동의하지만 질문은 쿼리 효율성입니다. 정수 처리가 항상 빠릅니다. 또한 은행 응용 프로그램을 작성할 때 대부분의 사람들이 신경 쓰지 않지만 은행에 매우 중요한 이상한 반올림 문제가 발생할 수 있습니다. 따라서 나는 또한 돈에 부동 소수점을 사용하지 않는 것에 동의합니다!
stubsthewizard

1
반올림에 대한 좋은 지적. PostgreSQL이 반올림 정책을 지원하기를 바랍니다. 그것을 구현하기에 충분하지는 않지만;)
Craig Ringer
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.