PostgreSQL : 데이터를 메모리에 강제 적용


32

PostgreSQL이 특정 테이블을 메모리에로드하거나 시스템에서 캐시 할 수 있도록 디스크에서 적어도 테이블을 읽도록하는 체계적인 방법이 있습니까?

답변:


25

톰 레인 (핵심 개발자)이 답변 한 메일 링리스트 주제 중 하나에 관심을 가질 수 있습니다 .

[..] 그러나 저의 의견은 LRU 캐싱 알고리즘보다 똑똑하다고 생각하는 사람들은 일반적으로 착각합니다. 테이블이 많이 사용되면 메모리에 그대로 유지됩니다. LRU 알고리즘에 따라 메모리에 머무르는 데 충분히 사용되지 않으면 메모리 공간을 실제로 다른 곳에 사용해야합니다. [..]

당신은 또한 SO 질문에 interessted 될 수 있습니다 https://stackoverflow.com/questions/486154/postgresql-temporary-tables 어쩌면 더 suiteable https://stackoverflow.com/questions/407006/need-to-load-the -전체 postgresql- 데이터베이스


1
+1 같은 아이디어가 다른 RDBMS에도 적용됩니다.
gbn

25
예, 아니오 우리는 자주 사용되지 않을 수도 있다는 것을 알고 있기 때문에 일부 Oracle 테이블을 메모리에 잠급니다. DB는 항상 DBA에게 마지막 말을해야합니다 (또 다른 예는 쿼리 최적화 프로그램을 암시합니다).
Gaius

35

Postgres 9.4는 마지막으로 관계에서 OS 또는 데이터베이스 버퍼 캐시로 데이터를 사전로드하는 확장 기능을 추가했습니다 (원하는 경우).

pg_prewarm

이를 통해 전체 운영 성능을보다 빠르게 달성 할 수 있습니다.

데이터베이스에서 한 번 실행하십시오 (자세한 지침은 여기 참조 ).

CREATE EXTENSION pg_prewarm;

그런 다음 주어진 관계를 미리로드하는 것이 간단합니다. 기본 예 :

SELECT pg_prewarm('my_tbl');

my_tbl검색 경로에 이름이 지정된 첫 번째 테이블 을 찾아 Postgres 버퍼 캐시에로드합니다.

또는:

SELECT pg_prewarm('my_schema.my_tbl', 'prefetch');

prefetch지원되는 경우 운영 체제에 비동기 프리 페치 요청을 발행하거나 그렇지 않으면 오류를 발생시킵니다. read 요청 된 블록 범위를 읽습니다. 와 달리 prefetch이것은 동기화되어 모든 플랫폼 및 빌드에서 지원되지만 느려질 수 있습니다. buffer요청 된 블록 범위를 데이터베이스 버퍼 캐시로 읽습니다.

기본값은 buffer가장 큰 영향을 미칩니다 (높은 비용, 최상의 효과).

자세한 내용은 설명서를 참조하십시오 .
Depesz도 그것에 대해 블로그 를 작성했습니다.


4

일반적으로 RAM이 충분한 경우 일반적으로 RAM에서 정기적으로 사용하는 작업을 잘 수행하기 위해 데이터베이스 서비스를 신뢰할 수 있습니다. 일부 시스템에서는 테이블을 항상 RAM에 보관해야한다고 암시 할 수 있습니다 (자주 사용되지 않는 작은 테이블에는 유용하지만 사용시 가능한 빨리 응답하는 것이 중요합니다). 그러나 pgsql에 이러한 테이블 힌트가있는 경우 다른 것을 캐싱하는 데 사용할 수있는 메모리 양을 줄이면 전체적으로 응용 프로그램 속도가 느려질 수 있으므로 사용에 매우주의해야합니다.

시작시 데이터베이스의 페이지 캐시를 프라이밍하려는 경우 (예 : 재부팅 또는 DB가 캐시 된 모든 것을 잊게하는 기타 유지 관리 작업 후) 다음을 수행하는 스크립트를 작성하십시오.

SELECT * FROM <table>
SELECT <primary key fields> FROM <table> ORDER BY <primary key fields>
SELECT <indexed fields> FROM <table> ORDER BY <indexed fields>

(각 인덱스 또는 코스에 대해 마지막 단계를 반복하고 ORDER BY 절의 필드를 올바른 순서로 유지하도록주의하십시오)

위의 모든 데이터 및 인덱스 페이지를 읽은 후에는 RAM 페이지 캐시에 있어야합니다 (적어도 당분간). 우리는 응용 프로그램 데이터베이스에 대해 이와 같은 스크립트를 가지고 있습니다.이 데이터베이스는 재부팅 후 실행되므로 나중에 시스템에 로그인하는 첫 번째 사용자는 응답 속도가 느리지 않습니다. MSSQL에서 sys.objects/ sys.indexes/ 와 같은 db 정의 테이블을 스캔하는 대신 이러한 스크립트를 수동으로 작성 sys.columns하는 것이 좋습니다 . 그러면 더 오래 걸리는 모든 것을 스캔하는 대신 가장 일반적으로 사용되는 인덱스를 선택적으로 스캔 할 수 있습니다 .


3
적어도 PostgreSQL에서는 작동하지 않습니다. 전체 버퍼 캐시가 사용되지 않도록 순차적 스캔을 위해 공유 버퍼에서 작은 (256KB) 링 버퍼가 할당됩니다. 자세한 내용은 github.com/postgres/postgres/blob/master/src/backend/storage/… 를 참조 하십시오. 큰 테이블에서 SELECT *를 수행 한 다음 pg_buffercache 테이블 (pg_buffercache 확장)을보고이를 확인할 수 있습니다.
hbn

@ hbn 안녕하세요,하지만이 저장 스레드 에서이 동료 사람은 작동한다고 말합니다 -dba.stackexchange.com/a/36165/55752
scythargon

@ scythargon OS 캐시로 끝나고 PostgreSQL 버퍼 캐시로 가져 가지 않습니다. 당신이 나를 믿지 않으면 내가 위에서 제안한 것을 시도하십시오.
hbn

Postgres 9.5에서는 SELECT * FROM schema.table전체 60GiB 테이블을 100GiB PostgreSQL 버퍼 캐시에로드 하려고 시도 했습니다.
sudo

1

비슷한 문제가 발생했습니다.
서버 서비스를 다시 시작한 후 모든 현금 데이터가 삭제 된 후 많은 쿼리가 처음에는 실제로 느려졌으며 쿼리의 특정 복잡성으로 인해 필요한 모든 인덱스와 데이터가 현금화 될 때까지 호출되었습니다. 즉, 예를 들어 사용자는 "항목"(1-3 초 실행 시간) 및 관련 데이터를 5 천만 행마다 한 번씩 공격해야하므로 더 이상 원치 않는 지연이 발생하지 않습니다. 가장 많이 사용되는 데이터가 현금화되고 프로그램이 생산 성능으로 최고 수준을 망칠 때까지 사용자가 성가신 중단을 경험하는 데 처음 3 시간이 걸립니다. 통계 데이터 등

이 문제를 해결하기 위해 인덱스가 큰 가장 많이 사용되는 테이블에서 선택을 수행하는 작은 파이썬 스크립트를 작성했습니다. 실행하는 데 15 분이 걸렸으며 성능 지연이 없습니다.


0

흠, COPY 명령이 도움이 될 수 있습니다. stdout에 COPY를 실행하고 읽으십시오. pg_dump를 사용하여 가능합니다 :

pg_dump -U <user> -t <table> <database> > /dev/null

다른 방법은 모든 테이블 파일을 찾아서 실행하는 것 cat <files> > /dev/null입니다.

다음은 테이블 파일 이름을 얻는 방법에 대한 예입니다.

# SELECT oid, datname FROM pg_database ;
  oid  |  datname  
-------+-----------                                                                                                                                          
<...>
 16384 | test
-- out of database is 16384
# SELECT oid, relname FROM pg_class WHERE relname like 'fn%';
  oid  | relname 
-------+---------
 24576 | fn
(1 row)
-- oid of our table is 24576

따라서 테이블의 파일은 / path / to / pgsql / data / base / 16384 / 24576 *입니다.

이주는 인덱스와 토스트 테이블도 읽고, 같은 방식으로 OID를 원합니다.

BTW, 왜 필요한가요? postgresql과 OS는 가장 인기있는 데이터를 캐시하고 유지 관리하기에 충분히 똑똑하다고 생각합니다. 캐시 효율.


0

Windows에서 가장 빠른 램 디스크 로 벤치마킹 된 QSoft의 RamDrive 를 사용 합니다. 방금 사용한

initdb -D e:\data

여기서 e : \는 RamDisk의 위치입니다.


5
Windows의 PG는 * nix (RAM과 무관)보다 Windows에서 속도가 느리기 때문에 프로덕션 사이트에는 매우 용감한 선택입니다.
DrColossos
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.