내 질문은 포스트 그레스의 작동 방식의 내장에 관한 것이다 other_table_id1, 주 및 other_table_id2에 추가 인덱스와Postgres : 여러 개의 열이있는 테이블 또는 더 적은 수의 열이있는 여러 개의 테이블?
CREATE TABLE A (
id SERIAL,
name VARCHAR(32),
type VARCHAR(32) NOT NULL,
priority SMALLINT NOT NULL,
x SMALLINT NOT NULL,
y SMALLINT NOT NULL,
start timestamp with time zone,
end timestamp with time zone,
state Astate NOT NULL,
other_table_id1 bigint REFERENCES W,
other_table_id2 bigint NOT NULL REFERENCES S,
PRIMARY KEY(id)
);
:
나는 테이블을 가지고있다.
테이블이 상당히 크고 열에 대한 업데이트가 많이 있습니다 : other_table_id1, state. 시작 및 끝 열에 대한 몇 가지 업데이트가 있지만 나머지는 변경되지 않습니다. (Astate는 열 상태에 대한 열거 형입니다.)
가장 자주 업데이트되는 두 개의 열을 별도의 테이블로 분리하는 것이 적합한 지 궁금합니다. 내가 얻고 자하는 것은 성능에 관한 것인데, 그 정보를 찾거나 업데이트의 무게를 줄이려면 (아마도?) 더 짧은 행을 읽고 쓰는 데 드는 비용이 적기 때문입니다. 그러나 특정 항목의 모든 데이터를 한꺼번에 가져올 때 (때때로) 조인 비용과 비교할 필요가 있습니다.
한순간에 나는 각 열이 별도로 저장된다는 인상하에있었습니다. 하지만 나중에 다른 열을 사용하여 데이터를 조회 할 때 테이블의 한쪽에있는 열의 너비를 줄이면 성능이 영향을받습니다 (행이 함께 저장되므로 전체 행 길이가 더 짧아 라.) 그래서 나는 행에 대한 모든 데이터가 물리적으로 디스크에 함께 저장된다는 인상을 받고 있습니다. 그래서 제안 된 테이블 분할은 도움이 될 것입니다. 현재 상태를 업데이트하는 데 4 바이트를 쓸 때 실제로 변경하지 않는 텍스트 (이름, 유형)의 64 바이트를 다시 작성한다고 생각합니까?
저는 테이블 "정규화"에 익숙하지 않고 Postgres의 내부에 익숙하지 않으므로 먼저 작업을 수행하지 않고도 트레이드 오프를 예측하기위한 조언과 권장 사례를 찾고 있습니다. 그 일은 가치가있었습니다. 변경 작업을 수행하려면 이미 최적화 된 쿼리를 다시 작성해야하기 때문에 기대할 수있는 결과를 잘 이해하고 있어야합니다. 고마워, M.
감사합니다 켄, 이것은 내가 가려고하는 방향입니다. U1과 U2 (와 U)가 모두 열 너비에 비례한다고 가정 해주십시오. 오버 헤드 (U1 + U2 <1.2 * U)의 여백 내에서 (U1 + U2) == U라고 말하겠습니까? –
그리고 두 테이블의 행 사이에 1 : 1 관계가 있으므로 조인 비용 (U1 + U2)을 말할 수 있습니까? –
정정 : 가입 (S1 + S2) 비용이 부과 될지도 모른다고 생각합니다 ... –