쿼리 성능 최적화 - Amazon Quantum 원장 데이터베이스(Amazon QLDB)

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

쿼리 성능 최적화

중요

지원 종료 알림: 기존 고객은 2025년 7월 31일 지원이 종료될 QLDB 때까지 Amazon을 사용할 수 있습니다. 자세한 내용은 아마존 QLDB 원장을 Amazon Aurora SQL Postgre로 마이그레이션을 참조하십시오.

QLDBAmazon은 고성능 온라인 트랜잭션 처리 (OLTP) 워크로드의 요구 사항을 해결하기 위한 것입니다. QLDB즉, SQL 유사한 쿼리 기능을 지원하지만 특정 쿼리 패턴 세트에 최적화되어 있습니다. 이러한 쿼리 패턴과 함께 작동하도록 애플리케이션과 해당 데이터 모델을 설계하는 것이 중요합니다. 그렇지 않으면 테이블이 커질수록 쿼리 지연 시간, 트랜잭션 시간 초과, 동시성 충돌 등 심각한 성능 문제가 발생할 수 있습니다.

이 섹션에서는 의 QLDB 쿼리 제약 조건에 대해 설명하고 이러한 제약 조건을 고려하여 최적의 쿼리를 작성하기 위한 지침을 제공합니다.

트랜잭션 시간 초과 제한

QLDB에서는 모든 PartiQL 문 (SELECT모든 쿼리 포함) 이 트랜잭션에서 처리되며 트랜잭션 제한 시간이 적용됩니다. 트랜잭션은 커밋되기 전까지 최대 30초 동안 실행될 수 있습니다. 이 한도를 초과하면 트랜잭션에서 수행된 모든 작업을 QLDB 거부하고 트랜잭션을 실행한 세션을 삭제합니다. 이 제한은 트랜잭션을 시작하고 커밋하거나 취소하지 않음으로써 서비스 클라이언트의 세션 유출을 방지합니다.

동시성 충돌

QLDB낙관적 동시성 제어 () 를 사용하여 동시성 제어를 구현합니다. OCC 최적이 아닌 쿼리는 충돌을 더 많이 일으킬 수도 있습니다. OCC 에 대한 자세한 내용은 을 참조하십시오. OCC 아마존 QLDB 동시성 모델

최적의 쿼리 패턴

인덱싱된 필드 또는 문서 ID를 기준으로 필터링하는 WHERE 조건자 절을 사용하여 명령문을 실행하는 것이 가장 좋습니다. QLDB문서를 효율적으로 검색하려면 인덱싱된 필드에 등호 연산자 (=또는IN) 가 필요합니다.

다음은 사용자 뷰에서 가장 적합한 쿼리 패턴의 예입니다.

--Indexed field (VIN) lookup using the = operator SELECT * FROM VehicleRegistration WHERE VIN = '1N4AL11D75C109151' --Indexed field (VIN) AND non-indexed field (City) lookup SELECT * FROM VehicleRegistration WHERE VIN = '1N4AL11D75C109151' AND City = 'Seattle' --Indexed field (VIN) lookup using the IN operator SELECT * FROM VehicleRegistration WHERE VIN IN ('1N4AL11D75C109151', 'KM8SRDHF6EU074761') --Document ID (r_id) lookup using the BY clause SELECT * FROM VehicleRegistration BY r_id WHERE r_id = '3Qv67yjXEwB9SjmvkuG6Cp'

이러한 패턴을 따르지 않는 모든 쿼리는 전체 테이블 스캔을 호출합니다. 테이블 스캔으로 인해 큰 테이블에 대한 쿼리 또는 큰 결과 집합을 반환하는 쿼리의 경우 트랜잭션 제한 시간이 초과될 수 있습니다. 또한 경쟁 트랜잭션과 OCC 충돌이 발생할 수도 있습니다.

하이 카디널리티 인덱스

카디널리티 값이 높은 필드를 인덱싱하는 것이 좋습니다. 예를 들어, VehicleRegistration 테이블의 VINLicensePlateNumber 필드는 고유하도록 인덱싱된 필드입니다.

상태 코드, 주소 주 또는 지방, 우편 번호와 같이 카디널리티가 낮은 필드는 인덱싱하지 마세요. 이러한 필드를 인덱싱하면 쿼리에서 큰 결과 집합이 생성되어 트랜잭션 시간 초과가 발생하거나 의도하지 않은 OCC 충돌이 발생할 가능성이 높습니다.

커밋된 뷰 쿼리

커밋된 뷰에서 실행하는 쿼리는 사용자 뷰 쿼리와 동일한 최적화 가이드라인을 따릅니다. 테이블에 만든 인덱스는 커밋된 뷰의 쿼리에도 사용됩니다.

기록 함수 쿼리

기록 함수 쿼리는 테이블에 생성한 인덱스를 사용하지 않습니다. QLDB기록은 문서 ID로만 색인되며 지금은 추가 기록 색인을 만들 수 없습니다.

가장 좋은 방법은 날짜 범위(시작 시간종료 시간)와 문서 ID(metadata.id)를 모두 사용하여 기록 쿼리를 한정하는 것입니다. 시작 시간과 종료 시간을 포함하는 기록 쿼리는 날짜 범위 한정이라는 이점을 갖습니다.

내부 조인 쿼리

내부 조인 쿼리의 경우 조인 오른쪽에 있는 테이블에 대해 최소한 하나의 인덱싱된 필드가 포함된 조인 기준을 사용합니다. 조인 인덱스가 없는 경우 조인 쿼리는 여러 테이블 스캔을 호출합니다. 즉, 조인의 왼쪽 테이블에 있는 모든 문서에 대해 쿼리는 오른쪽 테이블을 완전히 스캔합니다. 가장 좋은 방법은 하나 이상의 테이블에 WHERE 동등 조건을 지정하는 것 외에도 조인하는 각 테이블에 대해 인덱싱된 필드를 조인하는 것입니다.

예를 들어 다음 쿼리는 둘 다 인덱싱된 각 VIN 필드의 VehicleRegistrationVehicle 테이블을 조인합니다. 이 쿼리에는 VehicleRegistration.VIN에 동등 조건자도 있습니다.

SELECT * FROM VehicleRegistration AS r INNER JOIN Vehicle AS v ON r.VIN = v.VIN WHERE r.VIN IN ('1N4AL11D75C109151', 'KM8SRDHF6EU074761')

조인 쿼리의 조인 기준과 동등 조건자 모두에 대해 카디널리티가 높은 인덱스를 선택하세요.

피해야 하는 쿼리 패턴

다음은 대형 테이블에서는 잘 확장되지 않는 차선책 문장의 몇 가지 예입니다. QLDB 쿼리로 인해 결국 트랜잭션 제한 시간이 초과되므로, 시간이 지남에 따라 증가하는 테이블에 대해서는 이러한 유형의 쿼리를 사용하지 않는 것이 좋습니다. 테이블에는 크기가 다양한 문서가 포함되어 있기 때문에 인덱싱되지 않은 쿼리에 대한 정확한 제한을 정의하기는 어렵습니다.

--No predicate clause SELECT * FROM Vehicle --COUNT() is not an optimized function SELECT COUNT(*) FROM Vehicle --Low-cardinality predicate SELECT * FROM Vehicle WHERE Color = 'Silver' --Inequality (>) does not qualify for indexed lookup SELECT * FROM Vehicle WHERE "Year" > 2019 --Inequality (LIKE) SELECT * FROM Vehicle WHERE VIN LIKE '1N4AL%' --Inequality (BETWEEN) SELECT SUM(PendingPenaltyTicketAmount) FROM VehicleRegistration WHERE ValidToDate BETWEEN `2020-01-01T` AND `2020-07-01T` --No predicate clause DELETE FROM Vehicle --No document id, and no date range for the history() function SELECT * FROM history(Vehicle)

일반적으로 프로덕션 사용 사례에서는 다음과 같은 유형의 쿼리 패턴을 실행하지 않는 것이 좋습니다. QLDB

  • 온라인 분석 처리 (OLAP) 쿼리

  • 조건자 절이 없는 탐색적 쿼리

  • 쿼리 보고

  • 텍스트 검색

대신 분석적인 사용 사례에 최적화된 목적별 데이터베이스 서비스로 데이터를 스트리밍하는 것이 좋습니다. 예를 들어 Amazon OpenSearch Service로 QLDB 데이터를 스트리밍하여 문서에 대한 전체 텍스트 검색 기능을 제공할 수 있습니다. 이 사용 사례를 보여주는 샘플 애플리케이션은 amazon-qldb-streaming-amazonaws-samples/ - GitHub 리포지토리를 참조하십시오. opensearch-service-sample-python 스트림에 대한 자세한 내용은 을 참조하십시오. QLDB Amazon에서 저널 데이터 스트리밍 QLDB

모니터링 성능

QLDB드라이버는 사용된 I/O 사용량 및 타이밍 정보를 명령문의 결과 객체에 제공합니다. 이러한 지표를 사용하여 비효율적인 PartiQL 문을 식별할 수 있습니다. 자세히 알아보려면 PartiQL 문 통계 가져오기 섹션을 참조하세요.

CloudWatch Amazon을 사용하여 데이터 작업에 대한 원장의 성과를 추적할 수도 있습니다. 지정된 LedgerNameCommandTypeCommandLatency 지표를 모니터링합니다. 자세한 내용은 Amazon을 사용한 모니터링 CloudWatch 단원을 참조하십시오. 명령을 QLDB 사용하여 데이터 작업을 관리하는 방법을 알아보려면 을 참조하십시오드라이버를 사용한 세션 관리.