답변:
톰 레인 (핵심 개발자)이 답변 한 메일 링리스트 주제 중 하나에 관심을 가질 수 있습니다 .
[..] 그러나 저의 의견은 LRU 캐싱 알고리즘보다 똑똑하다고 생각하는 사람들은 일반적으로 착각합니다. 테이블이 많이 사용되면 메모리에 그대로 유지됩니다. LRU 알고리즘에 따라 메모리에 머무르는 데 충분히 사용되지 않으면 메모리 공간을 실제로 다른 곳에 사용해야합니다. [..]
당신은 또한 SO 질문에 interessted 될 수 있습니다 https://stackoverflow.com/questions/486154/postgresql-temporary-tables 어쩌면 더 suiteable https://stackoverflow.com/questions/407006/need-to-load-the -전체 postgresql- 데이터베이스
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도 그것에 대해 블로그 를 작성했습니다.
일반적으로 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
하는 것이 좋습니다 . 그러면 더 오래 걸리는 모든 것을 스캔하는 대신 가장 일반적으로 사용되는 인덱스를 선택적으로 스캔 할 수 있습니다 .
SELECT * FROM schema.table
전체 60GiB 테이블을 100GiB PostgreSQL 버퍼 캐시에로드 하려고 시도 했습니다.
비슷한 문제가 발생했습니다.
서버 서비스를 다시 시작한 후 모든 현금 데이터가 삭제 된 후 많은 쿼리가 처음에는 실제로 느려졌으며 쿼리의 특정 복잡성으로 인해 필요한 모든 인덱스와 데이터가 현금화 될 때까지 호출되었습니다. 즉, 예를 들어 사용자는 "항목"(1-3 초 실행 시간) 및 관련 데이터를 5 천만 행마다 한 번씩 공격해야하므로 더 이상 원치 않는 지연이 발생하지 않습니다. 가장 많이 사용되는 데이터가 현금화되고 프로그램이 생산 성능으로 최고 수준을 망칠 때까지 사용자가 성가신 중단을 경험하는 데 처음 3 시간이 걸립니다. 통계 데이터 등
이 문제를 해결하기 위해 인덱스가 큰 가장 많이 사용되는 테이블에서 선택을 수행하는 작은 파이썬 스크립트를 작성했습니다. 실행하는 데 15 분이 걸렸으며 성능 지연이 없습니다.
흠, 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는 가장 인기있는 데이터를 캐시하고 유지 관리하기에 충분히 똑똑하다고 생각합니다. 캐시 효율.
Windows에서 가장 빠른 램 디스크 로 벤치마킹 된 QSoft의 RamDrive 를 사용 합니다. 방금 사용한
initdb -D e:\data
여기서 e : \는 RamDisk의 위치입니다.