Snowflake Postgres 인사이트¶
각 Snowflake Postgres 인스턴스의 Snowsight 세부 정보 페이지에서 사용할 수 있는 데이터베이스 인사이트는 데이터베이스에 대한 특정 시점 인사이트와 성능 향상을 위해 취할 수 있는 조치에 대한 권장 사항을 제공합니다.
인스턴스의 인사이트를 보려면 다음을 수행합니다.
탐색 메뉴에서 Postgres 를 선택합니다.
표시된 인스턴스의 목록에서 인스턴스를 선택하여 세부 정보 페이지를 로드합니다.
Details 탭 머리글 바로 아래에 표시된 Insight 선택 상자로 볼 인사이트를 선택합니다.
사용 가능한 인사이트는 다음과 같습니다.
캐시 및 인덱스 적중률
사용되지 않는 인덱스
비대화
이상값 쿼리
장기 실행 쿼리
배큠 통계
테이블 크기
연결
캐시 적중¶
Postgres는 일반적으로 사용자가 가장 자주 액세스하는 데이터를 공유 버퍼 캐시에 유지하려고 시도합니다. 캐시 적중률은 수신하는 요청 수와 비교하여 버퍼 캐시가 처리할 수 있는 콘텐츠 요청 수를 측정합니다. 캐시 적중은 성공적으로 처리된 요청이며 누락은 처리되지 않은 요청입니다. 누락은 캐시를 넘어 파일 시스템으로 이동하여 요청을 이행합니다.
따라서 캐시 적중 횟수가 100회이고 누락 횟수가 2회인 경우 캐시 적중률은 100/102로 98%가 됩니다.
Postgres의 정상적인 작업과 성능을 위해서는 Postgres 캐시 적중률을 약 99%로 유지하는 것이 좋습니다.
캐시 적중률이 그 미만이면 메모리가 더 큰 인스턴스로 이동하는 방법을 살펴봐야 할 수 있습니다.
인덱스 적중률¶
데이터베이스에 인덱스를 추가하는 것은 쿼리 및 애플리케이션 성능에 매우 중요합니다. 인덱스는 대규모 테이블에서 특히 유용합니다.
인덱스 적중률은 인덱스를 성공적으로 활용한 총 쿼리 수 또는 쿼리 실행 수를 실행된 총 쿼리 수로 나눈 비율이나 백분율로 측정됩니다. 인덱스 적중률이 높을수록 인덱스 사용률과 전반적인 쿼리 성능이 향상됩니다.
일반적으로, 10,000개 행을 초과하는 테이블에서 99% 이상의 성능을 목표로 합니다. 인덱스 사용량이 없거나 낮은 테이블이 10,000개를 초과하는 경우 인덱스 추가부터 시작하는 것이 가장 좋습니다.
사용되지 않는 인덱스¶
PostgreSQL에서 사용되지 않는 인덱스는 테이블에 생성되었지만 활발히 사용되지 않는 인덱스를 나타냅니다. 이러한 인덱스는 디스크 공간을 소비하고 유지 관리가 필요하며 성능에 부정적인 영향을 미칠 수 있습니다.
다음은 Postgres에서 사용되지 않는 인덱스에 주의해야 하는 몇 가지 이유입니다.
저장소 및 디스크 공간: 사용되지 않은 인덱스는 다른 목적으로 더 잘 활용할 수 있는 디스크 공간을 차지합니다. 이로 인해 저장소 비용이 증가하고 다른 데이터베이스 오브젝트를 위한 사용 가능한 공간이 감소할 수 있습니다.
성능 영향: 인덱스는 삽입, 업데이트, 삭제와 같은 데이터 수정 작업 중에 오버헤드를 발생시킵니다. 사용되지 않는 인덱스가 많은 경우 데이터베이스는 테이블 외에도 여러 인덱스를 업데이트해야 하므로 이러한 작업에 시간이 더 오래 걸립니다.
느려지는 쿼리 실행: Postgres의 쿼리 최적화 프로그램은 쿼리에 대한 실행 계획을 생성할 때 사용 가능한 모든 인덱스를 고려합니다. 사용되지 않는 인덱스가 있는 경우 최적화 프로그램이 이러한 인덱스를 고려하는 데 추가 시간을 할애하여 쿼리 계획이 최적화되지 않고 쿼리 실행 속도가 느려질 수 있습니다.
유지 관리 오버헤드: 인덱스를 유지 관리하려면 CPU 및 디스크 I/O를 포함한 리소스가 필요합니다. 사용하지 않는 인덱스가 많은 경우 이러한 리소스는 불필요한 인덱스 유지 관리 작업에 낭비됩니다.
중요
기본 인스턴스에서는 사용되지 않지만 복제본에서는 사용되는 인덱스가 있을 수 있습니다.
비대화¶
비대화는 데이터베이스에 활성화되지 않고 사용되지 않는 행이 누적되어 디스크 공간이 사용되고 성능이 저하되는 것을 말합니다. 이는 주로 트랜잭션 워크로드가 높은 데이터베이스에 영향을 줍니다. Postgres’ MVCC 시스템은 동시 트랜잭션을 처리하기 위해 여러 버전의 행을 생성합니다. 행이 업데이트되거나 삭제되면 새 버전이 생성되는 반면, 이전 버전은 비활성 상태로 표시됩니다. 활성화되지 않는 이러한 행은 트랜잭션 무결성을 유지하고 동시 작업 중에 데이터 일관성을 보장하기 위해 테이블에서 즉시 제거되지 않습니다.
활성화되지 않는 행이 차지하는 디스크 공간을 회수하기 위해 Postgres는 주기적으로 데이터를 제거합니다. 이 프로세스에서는 테이블에서 활성화되지 않는 행을 식별하고 제거하여 재사용할 수 있도록 디스크 공간을 확보합니다. 비대화는 높은 트랜잭션으로 인해 배큠 프로세스 간에 많은 수의 활성화되지 않는 행이 생성될 때 발생합니다.
테이블 또는 인덱스의 총 크기와 비교하여 활성화되지 않는 행이 차지하는 공간의 양을 보여주기 위해 비대화 백분율을 제공합니다. 표시된 비대화는 추정치 또는 근사치입니다. 테이블의 비대화에 대한 더 많은 데이터가 필요한 경우 확장 `pgstattuple<https://www.postgresql.org/docs/current/pgstattuple.html>`_을 사용할 수 있지만, 이는 리소스를 많이 사용하는 작업일 수 있습니다.
낮은 비대화: 50% 미만의 비대화는 일반적으로 허용 가능한 것으로 간주되며 보통 조치가 필요하지 않습니다. 추가 증가를 위해 비대화를 계속 모니터링하고 배큠 구성 및 설정을 확인하는 것이 좋습니다.
높은 비대화: 50%를 초과하는 비대화는 성능과 디스크 공간 사용에 심각한 영향을 미치기 시작할 수 있는 높은 수준의 비대화를 나타냅니다. 쿼리 속도가 느려지거나 성능 문제가 발생하는 경우에는 수동 배큠 작업 수행 또는 배큠 설정 변경과 같은 작업을 고려해야 할 수도 있습니다.
1GB 미만이거나 비대화 백분율이 10% 미만인 테이블에 대한 비대화 백분율은 표시되지 않습니다.
이상값 쿼리¶
이러한 쿼리는 비례 실행 시간이 가장 높은 쿼리입니다. 여기에는 매우 느리지만 상대적으로 빈도가 낮은 쿼리 및 약간 느리지만 매우 일반적인 쿼리가 포함될 수 있습니다. 비례 실행 시간이 가장 높은 쿼리는 애플리케이션 수준 또는 인덱싱에서 데이터베이스 쿼리 튜닝을 위한 최상의 시작점입니다.
장기 실행 쿼리¶
PostgreSQL의 장기 실행 쿼리는 데이터베이스와 애플리케이션에 여러 가지 부정적인 영향을 미칠 수 있습니다. 장기 실행 쿼리가 일반적으로 바람직하지 않은 것으로 간주되는 몇 가지 이유는 다음과 같습니다.
성능 영향: 장기 실행 쿼리는 CPU, 메모리, 디스크 I/O를 포함한 데이터베이스 리소스를 장기간 점유합니다.
경합 증가: 장기 실행 쿼리는 데이터베이스 오브젝트에 대한 잠금 및 동시 액세스와 같은 공유 리소스에 대한 경합을 증가시킬 수 있습니다.
처리량 감소: 쿼리를 완료하는 데 시간이 오래 걸리면 주어진 시간 프레임 내에 실행할 수 있는 쿼리 수가 제한될 수 있습니다.
열악한 사용자 환경: 애플리케이션이 시기적절한 쿼리 실행을 사용하는 경우 장기 실행 쿼리는 사용자 환경에 부정적인 영향을 미칠 수 있습니다. 사용자는 지연이나 응답이 없어 애플리케이션에 대한 불만과 불만족을 경험할 수 있습니다.
리소스 고갈: 장기 실행 쿼리는 과도한 메모리를 사용하여 메모리 사용량이 증가하고 메모리 부족 오류가 발생할 수 있습니다. 또한 디스크에 대용량 임시 파일을 생성하여 잠재적으로 디스크 공간 문제를 일으킬 수 있습니다.
배큠¶
인사이트 패널에는 배큠 통계도 포함됩니다. 테이블 이름, 마지막 배큠 및 마지막 자동 배큠에서 확인할 수 있습니다. 또한 활성화되지 않은 상태로 존재하는 행의 수, 배큠이 활성화되지 않는 행을 마지막으로 정리한 시점 등에 대한 인사이트를 얻을 수도 있습니다.
배큠 통계에는 다음이 포함됩니다.
테이블 이름
마지막 배큠: 수동 배큠 작업이 마지막으로 실행된 시간
마지막 자동 배큠: 자동 배큠이 마지막으로 실행된 시간
행 수: 테이블의 총 행 수
활성화되지 않는 행 수: 현재 테이블에서 배큠되지 않은 행 수/활성화되지 않는 행 수
배율: 자동 배큠 설정에 지정된 현재 배율
임계값: 배큠 작업이 필요하며 배율을 사용한 총 행 수
배큠해야 함: 테이블을 수동으로 배큠해야 하는 경우
테이블 크기¶
Postgres 테이블 크기에 대한 세부 정보는 인스턴스 인사이트의 테이블 크기에서 확인할 수 있습니다. 이는 다음과 같은 테이블 정보를 표시합니다.
테이블 이름
대략적인 행 수
총 테이블 크기
테이블의 인덱스 크기
TOAST 테이블의 테이블 바이트 수
원시 행 테이블 크기
연결¶
연결 인사이트는 데이터베이스 인스턴스에서 현재 활성 및 유휴 연결을 모두 표시합니다. 활성 연결은 현재 데이터베이스에 연결되어 있고 쿼리를 실행 중이거나 쿼리 실행을 대기 중인 세션에 있습니다.
유휴 연결은 일반적이며 본질적으로 문제가 되지 않지만, 워크로드 및 구성에 따라 문제가 될 수 있습니다. 유휴 연결은 메모리를 사용하므로 많은 수의 연결은 과도한 메모리 사용으로 이어질 수 있습니다. 높은 유휴 연결은 일반적으로 데이터베이스가 연결 풀링의 이점을 누릴 수 있음을 나타냅니다.
실행 중인 각 세션에는 각 활성 백엔드 연결에 할당된 고유 식별자인 프로세스 ID(pid)가 있습니다.
연결, 쿼리 또는 처리를 취소하지만 세션을 열린 상태로 두려면 다음 문을 사용합니다.
SELECT pg_cancel_backend(<pid>);
연결을 종료하고 모든 트랜잭션을 롤백하는 보다 강력한 작업은 다음과 같습니다.
SELECT pg_terminate_backend(<pid>);