PostgreSQL (9.4) 데이터베이스를 사용하여 Ruby on Rails에서 응용 프로그램을 개발 중입니다. 내 유스 케이스의 경우 응용 프로그램의 전체 지점이 모델에서 매우 특정한 속성을 검색하므로 테이블의 열이 매우 자주 조회됩니다.
내가 현재 사용할지 여부를 결정하고 integer
(예를 들어, 일반적인 스트링 타입 사용 단순히 유형을하거나 character varying(255)
, 레일의 기본이다 나는 확실히 성능 차이가 인덱스에 일 무슨 아니에요 같이 컬럼을).
이 열은 열거 형 입니다. 가능한 값의 크기는 고정 된 크기입니다. 대부분의 열거 길이는 5를 초과하지 않으므로 응용 프로그램 수명 동안 인덱스가 다소 고정됩니다 . 따라서 정수 및 문자열 인덱스는 노드 수에서 동일합니다.
그러나 인덱싱되는 문자열은 길이가 약 20 자일 수 있으며 메모리에서 정수의 약 5 배입니다 (정수가 4 바이트이고 문자열이 문자 당 1 바이트의 순수 ASCII 인 경우 유지됩니다). 데이터베이스 엔진이 인덱스 조회를 수행하는 방법을 모르지만 정확히 일치 할 때까지 문자열을 "스캔"해야하는 경우 본질적으로 문자열 조회가 정수 조회보다 5 배 느리다는 것을 의미합니다. 정수 조회와 일치 할 때까지 "스캔"은 20 대신 4 바이트입니다. 이것은 내가 상상하는 것입니다.
조회 값은 (정수) 4 :
스캐닝 ............................ FOUND | 레코드를 가져 오는 중 ... | BYTE_1 | BYTE_2 | BYTE_3 | BYTE_4 | BYTE_5 | BYTE_6 | BYTE_7 | BYTE_8 | ... ||
조회 값은 (문자열) "some_val"(8 바이트)입니다.
스캐닝................................................. .................................... FOUND | 레코드를 가져 오는 중 ... | BYTE_1 | BYTE_2 | BYTE_3 | BYTE_4 | BYTE_5 | BYTE_6 | BYTE_7 | BYTE_8 | ... ||
나는 그것이 의미가 있기를 바랍니다. 기본적으로 정수는 적은 공간을 차지하기 때문에 문자열보다 "일치"할 수 있습니다. 아마도 이것은 완전히 잘못된 추측 일 것입니다. 그러나 나는 전문가가 아니므로 여러분에게 묻는 이유입니다! 나는 그 생각 난 그냥 발견이 대답은 내 가설을지지하는 것 같다,하지만 확실하게합니다.
열에서 가능한 값의 수는 둘 중 하나를 사용하여 변경되지 않으므로 인덱스 자체가 변경되지 않습니다 (열거에 새로운 값을 추가하지 않은 경우). 이 경우 integer
or 사용시 성능 차이가 있거나 varchar(255)
정수 유형을 사용하는 것이 더 의미가 있습니까?
내가 묻는 이유는 Rails enum
유형이 정수를 문자열 키에 매핑하지만 사용자가 열을 의미하는 것은 아닙니다. 기본적으로 유효하지 않은 값으로 인해 ArgumentError
유효성 검사가 실행되기 전에 열거 형 값이 유효한지 확인할 수 없습니다. 사용 string
유형은 검증을 허용,하지만 성능 비용이 있다면 차라리 그냥 확인 문제를 해결 떨어져 해킹 것입니다.
varchar(255)
예를 들어 , SQL Server에는 숨겨진 최적화가 없습니다varchar(260)
. SQL Server 6.x에는 그러한 문제가 있었지만 오랫동안 사실이 아니 었습니다.