programing

Oracle 데이터 유형:VARCHAR2를 사용해야 합니까 아니면 CHAR를 사용해야 합니까?

skycolor 2023. 10. 24. 21:10
반응형

Oracle 데이터 유형:VARCHAR2를 사용해야 합니까 아니면 CHAR를 사용해야 합니까?

Oracle에서 VARCHAR2 또는 CHAR를 데이터 유형으로 사용해야 합니까?

처음 8개의 데이터 청크(각각 1000개 행)를 가져올 때 쿼리당 ~0.4초까지 모든 것이 정상입니다.하지만 마지막 228행을 추출하려고 하면 모든 것이 매우 느려집니다. 사용할 경우 80초입니다.LIMIT 1000 OFFSET 9000또는 LIMIT에 정확한 행 수를 사용할 때 50초.LIMIT 228 OFFSET 9000. 하지만 총 줄 수를 구하는 데 사용되는 쿼리는 30초가 걸리고, 그래서 두 쿼리는 다시 총 80초가 걸립니다.

사실은 정반대입니다.CHAR를 사용하면 문자열이 너무 짧을 경우 공백으로 추가하여 고정 길이가 됩니다.따라서 데이터를 사용하는 모든 앱에서 CHAR를 일반 문자열과 비교할 때 해당 앱은 매번 트림을 추가해야 합니다.즉, VARCHAR2는 자연스럽게 더 깨끗한 코드로 이어지는 선택입니다.

SELECT events.eventid, functions.triggerid FROM events
INNER JOIN functions ON  events.objectid = functions.triggerid
WHERE
events.name LIKE 'DISCONNECT MSK-AP%'
OR events.name LIKE 'AP MSK-AP%'    # '%MSK-AP%'  is much slower than OR
AND events.value = 1
AND events.clock >= '1588280400' 
AND events.clock <= '1590958799'
GROUP BY events.eventid
ORDER BY events.eventid DESC
LIMIT 1000 OFFSET 0;  # SO OFFSET COULD BE 0, 1000, 2000,  ... 8000, 9000

일반적으로 CHAR 열을 원하는 특별한 이유가 없는 한 항상 VARCHAR2를 사용해야 합니다.

SELECT COUNT(distinct(events.eventid)) FROM events
INNER JOIN functions ON  events.objectid = functions.triggerid
WHERE
events.name LIKE 'DISCONNECT MSK-AP%'
OR events.name LIKE 'AP MSK-AP%'
AND events.value = 1
AND events.clock >= '1588280400' 
AND events.clock <= '1590958799';

앞쪽이나 끝에 여분의 공간이 있는 문자열이 걱정된다면 몇 가지 선택 사항을 생각해 볼 수 있습니다.

protocol_version 10 슬레이브_타입_convers온
버전 5.5.60-MariaDB version_commentMariaDB Server version_compile_machine x86_64 version_compile_os Linux

삽입 전 행 수준 트리거를 추가하여 문자열을 삽입할 때 문자열을 트리밍합니다.

테이블을 쿼리할 때마다 문자열을 잘라야 합니다. 읽기:

IMT2000 3GPP - CHAR 대 VARCHAR2 시맨틱스 (문서)

LIMIT 100 OFFSET 9100;- 0.25초 그러나LIMIT 100 OFFSET 9200;- 114초!

CHAR/NCAR가 사실상 변장한 VARCHAR2/NVARCHAR2에 지나지 않는다는 사실은 실제로 고려해야 할 문자열 유형이 VARCHAR2와 NVARCHAR2 두 가지뿐이라는 의견을 갖게 합니다.저는 어떤 애플리케이션에서도 CHAR 타입의 용도를 발견한 적이 없습니다.CHAR 유형은 항상 결과 문자열을 고정된 폭으로 패드하기 때문에 테이블 세그먼트와 인덱스 세그먼트 모두에서 최대 스토리지를 소비한다는 것을 빠르게 발견합니다.그 정도면 좋겠지만, CHAR/NCAR 유형을 피할 수 있는 또 다른 중요한 이유가 있습니다. 즉, 이러한 정보를 검색해야 하는 애플리케이션에 혼란이 발생한다는 것입니다(많은 데이터가 저장된 후에 데이터를 "찾을 수 없음).그 이유는 문자열 비교의 규칙과 그것이 수행되는 엄격함에 관한 것입니다.

OFFSET성능이 떨어집니다.

A better way is to "remember where you left off".

Discussion: http://mysql.rjweb.org/doc.php/pagination

Why slower than reading all?

사용시OFFSET, 쿼리는 먼저 주어진 행의 수를 카운트합니다.OFFSET, 그런 다음 에 의해 주어진 행의 수를 전달합니다.LIMIT. 그래서 점점 더 느려집니다.최종 오프셋은 전체 테이블을 읽는 것과 거의 동일한 시간이 소요됩니다.

ReferenceURL : https://stackoverflow.com/questions/61662371/why-to-extract-the-last-portion-limit-and-offset-of-rows-from-mysql-is-much-sl

반응형