Database/OracleDB

[OracleDB] sql에서 set unused는 왜 쓸까요?

Razelo 2021. 4. 26. 21:40

sql 공부 중에 그냥 슬쩍 지나갈법도 한데, 유난히 고민되는 구문이 하나 있었다. 

set unused인데, 평소에 그냥 읽어보고 넘어갔었는데, 오늘은 대체 이걸 왜 쓰는걸까라는 생각이 문득 들었다. 

 

그래서 검색해보았는데

www.gurubee.net/article/48959

 

칼럼 UNUSED의 용도

초보시절 Column 을 UNUSED로 변경하면 임시로 사용못하게 했다가 USED로 바꾸면 다시 사용이 되는줄 알고 쿼리 실행했다가 고생한적이 있습니다...(d..

www.gurubee.net

 

이 블로그에 너무 정리를 잘 해주셨다. 

 

간단하게 말하자면,

unused로 마킹을 해놓음으로써 그 이후로는 액세스도 할 수 없다. 

또한 다시 되돌릴 수도 없다. 

unused를 하더라도 사용된 공간을 환원받을 수도 없다. 

그렇기 때문에 나중에 drop을 수행할 때 빠르게 수행될 수 없다. 

 

내용인 즉슨 요약해보니 안쓸것같으면 일단 마킹해두고 나중에 drop unused columns 로 싸그리 잡아서 없애주는 것 같다. drop을 바로 해버리면 현업에서는 좀 속도가 걸리기 때문에 미리 unused사용한다고 한다. 

 

근데 사실 저럴때 쓴다고는 알겠는데, 내가 직접 써볼일이 없어서 크게 와닿지 않는다. (계속해서 드는 생각은 그저... 이거 굳이 있어도 안쓸것같은데...? 라는 생각... 이후에 액세스할 수 없다면 정말 신중하게 써야할 것인데, 그렇다 하더라도 그 결정이 실수일 경우가 있을 텐데 만약 실수여서 다시 사용해야하는데 그렇다면 컬럼에 적용되는 명령어이기에 스키마에 변화를 주게되어서 테이블을 다시 만들어야 하는 것인가? drop을 통해 작동하는 것으로 보아 스키마 자체에 영향이 가는 것이 분명하다. 그저 delete로 값을 버리는게 아니니까. 또한 사용된 공간을 환원받을 수도 없다는 점 또한 이해가 가지 않는다. 액세스도할 수 없고, 다시 되돌릴 수도 없다라는 제약은 아주 철저하게 막아놓겠다는 뜻이고, 이로인해 앞으로는 더이상 쓰지 않을거라면 신중하게 골라서 선택하고 다시 되돌릴 수 없으니 실수의 대가가 따르기 마련이다. 그런데 이정도 수준으로 막아놓는다면 굳이 공간을 환원해주지 않을 이유가 있을까? 즉 사용된 공간을 환원받는 것은 실제로 drop을 해야 환원받을 수 있을테니 이렇게 없애버리는게 더 빠르지 않을까? 마킹을 해두고 나중에 싹 잡아서 없애주는것이 하나씩 drop하는 것보다 빠르다고 하는데, 어떤 이유에서일까?) 

 

--> 예전에 교수님께서 말씀하신게 생각이 난다. 저장장치의 가격이 싸지고 그 용량이 커지면서 더이상 공간적인 문제는 큰 골칫거리가 되지 않는다고 말이다. 조금 더 저장한다고 해서 문제가 되지 않는다고 하셨던 말씀이 기억난다. 어떤 상황에서 하신 말씀인지는 가물가물하지만 비슷한 이야기를 하면서 하신 말씀인 것 같다. 그렇다면 이 말씀대로라면 환원해주지 않는다는 문제는 사실 별 문제가 되지 않을 수 도 있겠다. 값싸고 용량이 넘치는 현대의 저장장치에서 몇개의 컬럼이 미리 제거되지 않았다고 해서 오버헤드가 발생할 일은 없겠다싶다. 

 

그런데 이제 문제는 왜 마킹해두고 삭제하는것이 더 빠르냐는 것이다... 왤까용... 진짜모르겠네 이건... 

이럴때 쓰는 방법은 직접 해보는 것이다. 예전에 테이블을 잔뜩 묶어둔 영화관 데이터베이스가 있는데, 시간날때 그걸 대상으로 실험해봐야 겠다. 진짜 마킹이 더 빠른지 아니면 하나씩 드롭하는 것이 더 빠른지...!! 

반응형