programing

SQL SELECT 속도 대 varchar

mailnote 2023. 5. 31. 18:23
반응형

SQL SELECT 속도 대 varchar

저는 지금 테이블을 만드는 중인데 그것이 저를 궁금하게 만들었습니다.

예를 들어, 제조업체(fxBMW, Audiect.)가 있는 자동차를 저장할 경우, 제조업체를 인토바차로 저장하면 쿼리 속도에 차이가 있습니까?

그렇습니다

SELECT * FROM table WHERE make = 5 AND ...;

보다 빠름/느림

SELECT * FROM table WHERE make = 'audi' AND ...;

아니면 속도가 비슷할까요?

int 비교는 int가 varchar 비교보다 빠릅니다. int가 varchar보다 훨씬 적은 공간을 차지하기 때문입니다.

이는 색인되지 않은 액세스와 색인된 액세스 모두에 적용됩니다.가장 빠른 방법은 인덱스된 int 열입니다.


postgreql 질문에 태그를 지정한 것으로 보아 다양한 날짜 유형의 공간 사용에 관심이 있을 수 있습니다.

  • int필드는 2바이트에서 8바이트 사이를 차지하며, 4바이트는 보통 충분합니다(-2147483648 ~ +2147483647).
  • 문자 유형은 4바이트에 실제 문자열을 더한 값을 차지합니다.

몇 가지 대략적인 벤치마크:

Postgres 9.x에서 4백만 개의 레코드를 기록했습니다.

Table A = base table with some columns
Table B = Table A + extra column id of type bigint with random numbers
Table C = Table A + extra column id of type text with random 16-char ASCII strings

8GB RAM, i7, SSD 노트북에 대한 결과:

Size on disk:                A=261MB        B=292MB        C=322MB
Non-indexed by id: select count(*), select by id: 450ms same on all tables
Insert* one row per TX:       B=9ms/record        C=9ms/record
Bulk insert* in single TX:    B=140usec/record    C=180usec/record
Indexed by id, select by id:  B=about 200us       C=about 200us

* inserts to the table already containing 4M records

따라서 인덱스가 RAM에 맞는 한 bigint와 16자 텍스트는 속도에 차이가 없습니다.

바르샤르 대신 인트를 사용하는 것이 조금 더 빠를 것입니다.속도에 있어 더 중요한 것은 쿼리가 레코드를 찾는 데 사용할 수 있는 필드에 인덱스를 두는 것입니다.

int를 사용해야 하는 또 다른 이유는 데이터베이스를 정규화하는 것입니다.'Mercedes-Benz'라는 텍스트를 수천 번 표에 저장하는 대신 ID를 저장하고 브랜드 이름을 별도의 표에 한 번 저장해야 합니다.

문자열 대 비부동 비교의 실제 성능으로 요약하면, 이 경우 서명되지 않은 크기와 서명된 크기는 중요하지 않습니다.크기는 실제로 성능의 진정한 차이입니다.1바이트+(최대 126바이트) 대 1,2,4 또는 8바이트 비교...분명히 비부동은 문자열과 플로트보다 작기 때문에 어셈블리에서 CPU 사용이 더 쉽습니다.

모든 언어의 문자열 대 문자열 비교는 CPU의 1개 명령에서 비교할 수 있는 것보다 느립니다.32비트 CPU에서 8바이트(64비트)를 비교해도 VARCHAR(2) 이상보다 빠릅니다.다시 한 번 생산된 어셈블리(수동으로도)를 보면 1-8바이트 CPU 숫자보다 문자별로 비교하는 데 더 많은 지침이 필요합니다.

자, 얼마나 더 빨라요?또한 데이터 볼륨에 따라 다릅니다.5를 단순히 'audi'와 비교하는 것으로 DB에 있는 것이 그것뿐이라면, 결과적인 차이가 너무 미미해서 결코 볼 수 없을 것입니다.CPU, 구현(클라이언트/서버, 웹/스크립트 등)에 따라 DB 서버에서 수백 개의 비교 결과를 확인하기 전까지는 확인할 수 없습니다.

  • 해시 비교에 대한 잘못된 논쟁을 방지합니다.대부분의 해싱 알고리즘 자체는 느리기 때문에 CRC64 이하에서는 이점을 얻을 수 없습니다.저는 12년 넘게 여러 카운티 검색 엔진에 대한 검색 알고리즘을 개발했고 신용 부서에 대한 검색 알고리즘을 7년 동안 개발했습니다.숫자로 빠르게 기록할 수 있는 건...예를 들어, 전화 번호, 우편 번호, 짝수 통화 * 1000(저장) 통화 div 1000(검색)이 비교를 위한 DECTIC보다 빠릅니다.

오즈

색인이든 아니든 int는 훨씬 빠릅니다(바하가 길수록 느려집니다).

또 다른 이유는 varchar 필드의 인덱스가 int보다 훨씬 클 것입니다.더 큰 테이블의 경우 수백 메가바이트(및 수천 페이지)를 의미할 수 있습니다.인덱스를 읽는 데만 많은 디스크 읽기가 필요하기 때문에 성능이 훨씬 저하됩니다.

일반적으로 int가 더 빠를 것입니다.막대가 길수록 속도가 느려집니다.

힌트: 필드에서 만들 수 있는 값이 변경되지 않거나 거의 변경되지 않는 경우 ENUM을 사용할 수 있습니다.그것은 좋은 속도와 좋은 가독성을 결합합니다.

두 필드 중 하나에서 인덱싱을 설정하면 속도가 더 빨라집니다.당신의 질문에 대해서, 나는 생각합니다.int보다 .varchar.

약간 상대적인.네, INT가 더 빠르겠지만, 문제는 당신의 상황에서 그것이 눈에 띄느냐 하는 것입니다.VARCHAR는 단지 작은 단어인가요, 아니면 더 긴 텍스트인가요?그리고 테이블에는 몇 줄이 있습니까?행이 몇 개만 있으면 메모리에 완전히 버퍼링될 가능성이 높습니다(자주 요청할 때). 이 경우 큰 차이가 없습니다.물론 지수화도 있습니다. 표가 커질수록 더 중요해집니다.최적화된 쿼리를 사용하는 HD보다 SSD를 사용하는 것이 더 빠를 수 있습니다.또한 우수한 디스크 컨트롤러를 사용하면 쿼리 속도가 10배 이상 빨라지기도 있습니다.이를 통해 읽기 및 쓰기 쿼리를 더 쉽게 만들고(복잡한 조인을 작성할 필요가 없음) 개발 속도를 높일 수 있는 VARCHAR를 사용할 수 있습니다.하지만 순수주의자들은 동의하지 않을 것이고 항상 모든 것을 정상화할 것입니다.

데이터베이스의 개발자로서, 우리의 데이터베이스는 추가적인 메모리 소비를 줄이기 위해 힙 기반 정렬 알고리즘을 사용할 것입니다. 그러나 우리가 버킷 기반 정렬 알고리즘을 사용하여 개선할 때 int32와 int64에서는 작동합니다(40% 오프, 1억 레코드).하지만 바르샤르에서는 훨씬 더 나쁘게 작용하고 거의 변하지 않는 것처럼 보입니다.오라클에서도 VARCHAR-SORTING 알고리즘이 다른 언어로 된 복잡한 정렬 규칙을 통해 지금보다 더 빠르게 실행할 수 있는 것으로 보입니다.

언급URL : https://stackoverflow.com/questions/2346920/sql-select-speed-int-vs-varchar

반응형