인덱스 비교
개발DB와 테스트DB, 또는 테스트DB와 운영DB간 인덱스를 비교할 때는 다음 쿼리를 사용할 수 있다.
내 이 세상 도처에서 쉴 곳을 찾아보았으나, 마침내 찾아낸, 컴퓨터가 있는 구석방보다 나은 곳은 없더라.
오라클에 factorial
함수가 없지만 다음과 같이 구할 수 있다.
개발DB와 테스트DB, 또는 테스트DB와 운영DB간 인덱스를 비교할 때는 다음 쿼리를 사용할 수 있다.
프로젝트를 하다보면 개발DB와 테스트DB 또는 테스트DB와 운영DB간 스키마를 비교해 차이점이 없는지 확인할 일이 많다. 다음은 테이블과 컬럼을 비교하는 스크립트다.
현재 우리 운영DB는 db_files
파라미터 값이 매우 작게 잡혀있다. 따라서 빨리 값을 늘려줘야 하는데, 당장 운영중인 DB를 내리고 파라미터 값을 바꿀 수는 없다. 그런데 여기서 궁금증 하나 생겼다. db_files
는 데이터 파일 개수만 제한하는 것일까, 아니면 temp 파일도 여기에 포함되는 것일까? 혹시 온라인 리두로그는? 혹시 컨트롤 파일도 포함되는 것일까?
select한 결과를 shell에서 참조해야 하는 경우 다음과 같이 하면 된다.
문자열 자체에 &
가 포함되어 있는 경우 SQL*Plus에서 &
뒤의 단어를 변수로 인식해 그에 대한 값의 입력을 요구한다.
테이블을 다른 테이블스페이스로 옮기려면 다음과 같이 한다.
ALTER TABLE t MOVE TABLESPACE ts_name;
그러나 LONG
형 컬럼을 포함하고 있는 테이블에 위 명령을 실행하면 ora-00997
에러가 발생한다. CTAS를 사용해 테이블 복사를 시도해도 같은 에러가 발생한다.
SQL*Plus의 프롬프트를 username@INSTANCE_NAME >
과 같은 식으로 설정하면 현재 로그인한 인스턴스와 사용자 이름을 확인할 수 있어 편하다. logn.sql 스크립트를 만들어 여기에 프롬프트 설정 코드를 넣어두면 된다. Effective Oracle 책(p79)에는 설정 코드가 조금 복잡하게 나와 있다.
테이블 T에 다음과 같은 인덱스가 있다면 ix01
은 삭제해야 한다고 생각했다.
ix01
: a
ix02
: a+b
ix02
을 이용하면 ix01
을 사용해야 하는 경우를 모두 포괄할 수 있으니 ix02
만 남겨놓고 나머지는 삭제하는 것이 맞다고 생각했던 것이다. 그러나 문제가 항상 그렇게 단순하지만은 않은 듯 하다.
불필요한 데이터베이스 링크가 난무하는 것 같아 정리하기로 마음을 먹었다. 일단 개발DB에서 운영DB로의 데이터베이스 링크는 허용할 수 없으므로 이것부터 삭제하기로 했다. 개발DB에 sys
계정으로 로그인한 다음 dba_db_links
테이블을 조회해 개발DB에서 운영DB로 연결되는 데이터베이스 링크를 하나씩 확인했다.