늒네 기록

[postgresql] 칼럼 순서 바꾸기 본문

DB 공부 기록/postgresql

[postgresql] 칼럼 순서 바꾸기

jaeha lee 2020. 10. 3. 02:45

mysql을 쓸때와 또 달랐던 점은, 한 번 만들어놓은 칼럼들이 순서가 마음에 안 들어서 바꾸려고 했더니 pgadmin 페이지에서 방법이 바로 제공되지 않는 것으로 보였던 것이다.

 

그래서 구글링을 해봤더니, 흥미로운 글을 찾을 수 있었다.

https://stackoverflow.com/questions/285733/how-do-i-alter-the-position-of-a-column-in-a-postgresql-database-table

 

How do I alter the position of a column in a PostgreSQL database table?

I've tried the following, but I was unsuccessful: ALTER TABLE person ALTER COLUMN dob POSITION 37;

stackoverflow.com

http://wiki.postgresql.org/wiki/Alter_column_position

 

Alter column position - PostgreSQL wiki

Many people new to postgresql often ask if it has support for altering column positions within a table. Currently it does not; if you want to change column positions, you must either recreate the table, or add new columns and move data. The idea of allowin

wiki.postgresql.org

첫 번째 링크가 사실상 두 번째 링크의 요약본이다. 한국어로 간단히 정리하면 아래와 같다.

 

"Postgres는 pg_attribute 테이블의 attnum 칼럼에 다른 테이블들의 칼럼 순서를 정의해두므로, 테이블의 칼럼 순서를 바꾸기 위해서는 1) 새로 테이블을 만들거나, 2) 테이블에 새 칼럼들을 만들고 데이터를 옮기고 기존 칼럼들을 지우거나, 3) 뷰를 활용해서 기존 테이블의 칼럼 순서가 어찌 되든 신경쓰지 않으면 된다."

 

두 번째 링크 초장에 postgres에서 칼럼 순서를 변경할만한 이유는

- 크기가 고정된 칼럼들을 앞쪽에 배치해서 물리적 공간 활용을 최적화하거나

- 시각적으로 보기 편하도록 칼럼들을 배치하기 위해서

라고 써있는데, 첫 번째 이유를 달성하는 것이 목적이라면 뷰를 활용하는 것이 궁극적인 답은 아닐 것이라는 생각이 들었다. 유사한 맥락에서, 두 번째 링크 마지막 파트에서는 아래와 같은 이야기를 한다.

 

"... it would also be desirable for postgres to automatically order columns physically for optimum layout, regardless of the logical order they are given in. ..."

 

즉, 칼럼의 논리적 순서는 논리적 순서대로 두고, 물리적 순서는 공간 활용에 최적이 되도록 알아서 postgres에서 관리하면 좋지 않겠냐는 말. 하지만 이러한 기능 구현에 걸림돌이 되는 것에 대한 내용이 이어지는데,

 

"...The current problem with implementing this lies in that currently postgres uses the same identifiers for both the logical and physical position within a table. The current hot plan for solving this would be to change the system to reference three identifiers... a permanent identifier for the column, as well as a separate logical and physical identifier. ..."

 

postgres 구조상 logical, phyical 위치를 정하는 데에 같은 id를 사용하고 있다는 것이 문제. 이를 해결하기 위해 칼럼들마다 영구적으로 쓸 수 있는 칼럼 id를 부여하고, 물리적 순서와 논리적 순서를 결정하는 id를 분리하는 방법을 쓸 수 있지 않을까 하는 제안이 있었다고 하는데,

 

https://www.postgresql.org/message-id/20414.1166719407@sss.pgh.pa.us

 

PostgreSQL: Re: column ordering, was Re: [PATCHES] Enums patch v2

Andrew Dunstan <andrew(at)dunslane(dot)net> writes: > Tom Lane wrote: >> You could make a case that we need *three* numbers: a permanent column >> ID, a display position, and a storage position. > Could this not be handled by some catalog fixup after an ad</andrew(at)dunslane(dot)net>

www.postgresql.org

이 링크를 보면 이런 제안이 오간 것이 2006년으로 14년 전의 이야기다. 지금은 어떻게 흘러갔을지 모르겠다.

 

처음에 "Postgres는 pg_attribute 테이블의 attnum 칼럼에 다른 테이블들의 칼럼 순서를 정의해둔다"는 이야기가 있었는데, 그렇다면 attnum 칼럼의 내용물만 바꿔치기하면 칼럼 순서를 바꿀 수 있지 않을까 하는 생각을 할 수도 있겠다.

 

https://www.postgresql.org/message-id/1181138388.508384.51110%40q75g2000hsh.googlegroups.com

 

PostgreSQL: Change order of table-columns in pg_catalog.pg_attribute.attnum

Hi group! If I want to change the default order of two columns of a table, can I just manipulate the values in pg_catalog.pg_attribute.attnum? I am trying to do this in pg 8.1.9. Works the same in pg 8.2.x I would assume? BEGIN; UPDATE pg_catalog.pg_attrib

www.postgresql.org

위의 링크에서 이 실험을 실제로 해본 것에 대한 내용이 이어지는데, 4번째 스레드에 아래와 같은 말이 나온다.

 

"I had tried it with data in the table and it seemed to work, but it does mess up views referencing the table. So, no go."

 

즉, 칼럼 순서를 바꾸는 데에는 성공했지만, 테이블에 레퍼런스를 두고 있는 뷰들이 엉망진창이 되었다는 이야기. pg_attribute 테이블이 어떤 기능을 하고, 어떤 칼럼들이 어떻게 엮여있는지 추후에 더 살펴볼만 하겠다는 생각이 들었다.

 

 

반응형
Comments