|
많은 기업 환경에서 단일한 DB
환경보다는 이기종 DB 환경을 운영하고 있다.
따라서 DB
개발자나 관리자는 되도록 더 많은
DBMS를 다룰 줄 아는 것이 업무에 도움이 된다.
특히 다양한 DBMS
중 MS SQL Server 2000(이하 MS SQL
Server)과
DB2를 함께 비교해볼
기회는
흔치
않다.
이 문서가 MS SQL
Server 그리고 DB2
환경에서 SQL
프로그래밍을 하는 개발자나 어느 한
DBMS로 마이그레이션을 검토하고 있는 운영 담당자에 조금이나마 도움이 되기를 바라고 서로의 특징을 상호 비교해보면서 MS SQL
Server와
DB2에 모두 친숙해질 수 있는 계기가 되었으면 한다.
테스트
환경
- Microsoft SQL Server 2000 - 8.00.2039 (Intel
X86)
- DB2 v9.5.0.808
- Windows Server 2003 Enterprise Edition sp2
DBMS 구조
MS SQL
Server도
DB2처럼 사용자(스키마),
데이터베이스,
인스턴스로 이어지는 데이터베이스 구조 체계를 가지고 있다.
[그림 1]을 살펴보면 두 DBMS
간의 상당히 유사한 부분을 많이 발견할 수 있을 것이다.
좀더 자세한 차이는 아래 부분에서 천천히 살펴보기로 하자.
[그림] SQL Server 2000과 DB2 UDB 구조
비교
SQL
SERVER의 경우에는 기본 시스템 테이블 스페이스 영역으로 master, msdb, model, tempdb 등이 있다.
DB2에서도 유사한 기능을 수행하는 테이블 스페이스가 구성되어 있는데 한가지 특이 사항을 언급하자면
DB2에서는 MS SQL
Server에서 DB
생성시 기준이 되는 model DB처럼 별도의 기준 DB가 존재하지는 않는다.
그리고 DB2에는 MS SQL Server의 tempdb 기능으로
시스템
임시
테이블스페이스, 사용자
임시
테이블테이블
스페이스
공간을
사용한다. DB2에서는
업그레이드와
기능이
추가됨에
따라
좀
더
다양한
시스템
스키마가
존재한다. (예: SQLJ, SYSIBMINTERNAL, SYSIBMTS 등)
[표 1] DB2
시스템
스키마
간단
설명
|
DB2
시스템 스키마
|
설명
|
|
SYSIBM
|
- 기본적인
시스템
catalog 테이블
저장소
|
|
SYSCAT
|
- 시스템 catalog 테이블
의 View 저장소
- Read only 시스템 catalog view 생성
|
|
SYSSTAT
|
– 수정
가능한
시스템 catalog 뷰
저장소
|
|
SYSFUN
|
- 사용자
정의
함수
저장소
|
|
SYSIBMADMIN
|
- Snapshot등
시스템
지원
테이블
함수
저장소
|
|
SYSPROC
|
- 시스템
지원
저장
프로시저
저장소
|
시스템
테이블
정보와
조회
방법
MS SQL Server와 DB2 모두
시스템
정보에서부터
사용자
정의
오브젝트까지
SQL 쿼리
문이나
명령문으로
관련
정보를
확인할
수
있는
시스템
테이블, 뷰를
지원하고
있다. 두 DBMS를
비교하면
[표
2]와
같다.
[표 2] 시스템
테이블
정보 catalog table
|
SQL Server system table
|
DB2 catalog table
|
|
select * from master.dbo.sysdevices
|
select * from SYSCAT.TABLESPACES
|
|
select * from INFORMATION_SCHEMA.tables
|
select * from SYSCAT.TABLES
|
|
select * from INFORMATION_SCHEMA.columns
|
select * from SYSCAT.COLUMNS
|
|
select * from INFORMATION_SCHEMA.views
|
select * from SYSCAT.VIEWS
|
|
select * from sysobjects
where type='TR'
|
select * from SYSCAT.TRIGGERS
|
|
select * from sysindexes
|
select * from SYSCAT.INDEXES
|
|
select * from INFORMATION_SCHEMA.routines
|
select * from SYSCAT.SYSPROCEDURES
select * from SYSCAT.ROUTINES
|
|
select * from INFORMATION_SCHEMA.routines
where ROUTINE_TYPE ='FUNCTION'
|
select * from SYSCAT.FUNCTIONS
|
|
select * from systypes
|
select * from SYSCAT.DATATYPES
|
|
select * from sysreferences
|
select * from
SYSCAT.REFERENCES
|
ü 물론
위의
정보를
조회하기
위해
다른
스키마의
뷰나
테이블
함수
등의
다른
포맷으로도
조회
가능하다.
MS SQL
SERVER 2000에서는 사용자와 스키마 사용에 약간 모호한 감이 있어서
DBA가 맘 편하게(?)
혼용하여 사용하는 부분이 있었다.
물론 MS SQL SERVER 버전이 올라가면서 사용자 개념보다는 확장이 가능한 스키마로 정착하고 있는 추세이다.
[표 3] 스키마
작성
문법 Check
|
SQL Server
|
DB2 UDB
|
|
CREATE SCHEMA AUTHORIZATION kishore
|
CREATE SCHEMA billing AUTHORIZATION user1;
CREATE TABLE billing.orders (......,......)
|
[표 4] 간단 지원 유틸리티 프로시저나 쿼리 부분 확인
|
SQL Server
|
DB2 UDB
|
|
SP_SERVER_INFO
Select @@version
|
Select * from sysibmadm.env_inst_info
|
|
select @@spid
|
select application_id() as appl_id
from sysibm.sysdummy1
|
|
SP_CONFIGURE
|
select * from sysibmadm.DBMCFG
select * from sysibmadm.DBCFG
select dbmconfig_type, numdb, diaglevel
from table(sysfun.get_dbm_config()) as dbmcfg
CLP>db2 get dbm cfg
CLP>db2 get db cfg
|
|
Sp_spaceused 테이블명 (건)
|
SELECT TABNAME, CARD
FROM SYSCAT.TABLES
WHERE TABNAME= 'SALES'
|
|
Sp_spaceused 테이블명 (사이징)
|
SELECT TABSCHEMA,
TABNAME,DATA_OBJECT_P_SIZE,
INDEX_OBJECT_P_SIZE,LONG_OBJECT_P_SIZE,
LOB_OBJECT_P_SIZE,XML_OBJECT_P_SIZE
FROM
SYSIBMADM.ADMINTABINFO
WHERE TABNAME ='SALES' -- 임의의
테이블
|
|
select
suser_sname()
|
values current_user
|
|
-
|
values current_path
=>
"SYSIBM","SYSFUN","SYSPROC","SYSIBMADM","ADMINISTRATOR"
|
|
sp_change_owner
|
스키마
변경은 export/import 작업으로
가능
전체
스키마
복사는
ADMIN_COPY_SCHEMA 저장프로시저
활용.
|
|
sp_helpdevice
select * from sysdevices
|
SELECT *
FROM
SYSIBMADM.DBPATHS
|
|
sp_helpdb
pubs
|
CLP>connect to sample
CLP>db2 "call
get_dbsize_info(?,?,?,0)"
|
|
sp_rename 테이블1, 테이블2
|
rename table 테이블1 to 테이블2
|
ü [MS SQL] SP_SPACEUSED ‘테이블명’ 같은
저장
프로시져
데이타는
정확한
값
조회를
위해서는 runstats 작업을
수행해야
한다. 예) isql> RUNSTATS ON TABLE ADMINISTRATOR.SALES ON ALL COLUMNS ALLOW
WRITE ACCESS ;
ü [DB2]에서도 RUNSGTATE 유틸을
수행하면 SYSCAT.TABLES에서 CARD 컬럼이
최신 value로
업데이트
된다.
[표 5] SQL문
매핑 예시문
|
SQL Server
|
DB2 UDB
|
|
SELECT getdate()
|
VALUES CURRENT TIMESTAMP
VALUES CURRENT DATE
VALUES CURRENT TIME
SELECT CURRENT TIMESTAMP FROM SYSIBM.SYSDUMMY1
|
|
TRUNCATE TABLE employee
|
db2 "import from /dev/null of del replace into inst95.empokyee"
|
|
SELECT TOP n…
|
SELECT …. FETCH FIRST n rows only
|
|
select * into test_emp
from employee WHERE
1<>1
|
CREATE TABLE TEST_EMP
LIKE EMPLOYEE
|
|
select ENAME from bi_stu1 a where not exists (select '1' from
nw_stu1 b where a.ename = b.ename)
|
select ENAME from bi_stu1 except select ENAME from
nw_stu1 |
|
ALTER TABLE TEST_EMP ALTER COLUMN EMP_ID
VARCHAR(20)
|
*ALTER TABLE INST95.TEST_REAL ALTER COLUMN NAME SET DATA TYPE
VARCHAR(30) |
|
SP_RECOMPILE ‘프로시져명’
|
SYSPROC.REBIND_ROUTINE_PACKAGE (’P’,
’MYSCHEMA.MYPROC’, ’ANY’) |
ü DB2 9.7에서는
해당
컬럼
값의
타입
변환지원이
더욱
막강해졌다.
테이블
생성에서는 SQL Server와 DB2에서는
많은
부분이
유사함을
알
수
있다.
|
댓글 없음:
댓글 쓰기