Msg 성장일기

Mssql vs Oracle 비교 본문

study_DB/MSSQL

Mssql vs Oracle 비교

공부하는 어른이 2026. 5. 11. 23:57

## 아키텍처 및 용어 매핑 (Oracle vs Mssql)

1. Instance & Database

가. Oracle : Instance 하나가 하나의 데이터베이스를 관리하는 구조 (보통)
나. Mssql : 하나의 Instance(서비스) 안에 여러 개의 독립적인 Database가 존재함

 

2. Schema & User

가. Oracle : User = Schema (거의 동일)
나. Mssql : User와 Schema가 분리됨 / 하나의 DB안에 여러 Schema가 있고, 사용자가 특정 Schema에 권한 가짐


3. Storage

가. Oracle : Tablespace > Datafile
나. Mssql : Filegroup > Datafile (.mdf, .ndf) 및 Log file (.ldf)

-------------------------------------------------------------------------------------------------------------------

## 메타데이터 및 딕셔너리

1. Oracle view 와 Mssql view 비교 (Mssql 딕셔너리 뷰는 보통  sys.으로 시작함)

가. 테이블 메타데이터 : DBA_TABLES → sys.tables
나. 테이블 뷰  : DBA_VIEWS → sys.views
다. DB 유저  :  DBA_USERS → sys.database_principals (login은 sys.server_principals)
라. 세그먼트 (용량)  : DBA_SEGMENTS → sys.dm_db_partition_stats 또는 sp_spaceused
마. 유저 역할 :  dba_roles → sys.database_roles
바. 역할 부여 현황 :  dba_role_prvis  → sys.database_role_members
사. 객체별 권한 현황 :  dba_tab_privs  →  sys.database_permissions
아. 현재 접속된 세션 : v$session → sys.dm_exec_sessions
자. 쿼리 통계 정보 :  v$sql  → sys.dm_exec_query_stats
차. 실시간 세션 정보 :  v$active_session_history  → sys.dm_exec_requests 

  1-1. 현재 실행중인 쿼리와 성능 확인

가. sys.dm_exec_requests : 현재 실행 중인 요청
나. sys.dm_exec_sessions : 세션정보
다. sys.dm_exec_sql_text(handle) : SQL 텍스트 추출 함수
라. sys.dm_exec_query_plan(handle) : 실행계획(XML) 추출함수


  1-2. 인덱스 효율성 확인 (Oracle에는 없는 기능)

가. sys.dm_db_index_usage_state : 인덱스 사용빈도 (Unused index 찾기용)
나. sys.dm_db_missing_index_details : 누락된 인덱스 추천


  1-3. 서버 전체 대기 통계 (서버에 병목이 CPU인지, I/O인지, Lock인지 판단할 떄 사용)

가. sys.dm_os_wait_stats : 인스턴스 시작 이후 누적된 대기 통계

2. 정보 스키마 (표준): INFORMATION_SCHEMA.으로 시작함  (sys. 뷰가 기억안날때 사용하면됨)

가.SELECT * FROM INFORMATION_SCHEMA.TABLES
가.SELECT * FROM INFORMATION_SCHEMA.Columns

 

3. 동적 관리 뷰 (Performance): Oracle의 V$ 뷰에 해당하며 sys.dm_으로 시작함

가. v$session → sys.dm_exec_requests (현재 실행 중인 세션/쿼리)
sys.dm_os_wait_stats (Wait Event 분석)
나. sys.dm_exec_... : 실행 중인 쿼리, 세션 관련
다. sys.dm_os_... : OS자워느 메모리, 스케줄러 관련
라. sys.dm_db_... : 인덱스 사용량 등 DB 내부 통계 관련
마. 예시
1) 현재 접속한 세션과 실행중인 쿼리 확인
SELECT s.session_id, s.login_name, r.status, r.wait_type, t.text
FROM sys.dm_exec_sessions s
JOIN sys.dm_exec_requests r ON s.session_id = r.session_id
CROSS APPLY sys.dm_exec_sql_text(r.sql_handle) t;

4. sys.all_objects 또는 sys.system_objects

가. Oracle의 dict와 가장 유사하게 시스템 개체들이 모여있는 카탈로그 뷰를 조회할 수 있음
나. sp_help: 특정 객체(테이블, 뷰 등)의 구조를 보고 싶ㅣ을 때 사용함 (Oracle의 DESC) / 단축키 alt + F1
다. sp_helpdb: DB 목록 및 요약 정보를 보여줌
라. sp_helplogins: 로그인 계정 정보를 보여줌


-------------------------------------------------------------------------------------------------------------------

## SQL 문법 차이 (PL/SQL vs T-SQL)

1. 기본 문법

가. DECODE → CASE WHEN 
나. NVL → ISNULL 또는 COALESCE 
다. SYSDATE → GETDATE().


2. 결과셋 제한

가. WHERE ROWNUM <= 10 → SELECT TOP 10.


3. 스케줄러

가. DBMS_JOB / DBMS_SCHEDULER → SQL Server Agent가 모든 자동화 작업을 담당함


4. Login과 User 관계

가. Oracle  
  1) create user 유저명 identified by 패스워드
나. MSSQL
  1) Login 생성: CREATE LOGIN 유저명 WITH PASSWORD = '패스워드'; 
  2) User 생성 및 매핑: CREATE USER 유저명 FOR LOGIN 유저명; (사무실 열쇠 발급 및 출입증과 연결)
  3) Create Login의 정보는 master DB에 저장하고 Create User의 정보는 각 DB에 저장됨
  4) 패스워드 추출
SELECT 
     'CREATE LOGIN [' + sp.name + '] 
     WITH PASSWORD = ' + CONVERT(VARCHAR(MAX), sl.password_hash, 1) + ' HASHED,
    SID = ' + CONVERT(VARCHAR(MAX), sp.sid, 1)
FROM sys.sql_logins sl
JOIN sys.server_principals sp ON sl.principal_id = sp.principal_id;


5. Commit

가. Oracle은 모든 DML은 암시적으로 트랜잭션이 시작되며, 반드시 Commit을 해야 확정됨
나. Mssql은 Auto-Commit이라 DML치면 즉시 커밋되어 복구 불가능함
다. 해결책은 Begin Tran 쓰는 것
BEGIN TRAN; -- 트랜잭션 시작
UPDATE Employees SET Salary = 0;
-- 확인 후
ROLLBACK; -- 또는 COMMIT;

'study_DB > MSSQL' 카테고리의 다른 글

Linked server (Oracle DB 연결)  (0) 2026.05.25
mssql to mssql  (0) 2026.05.08
MSSQL 설치  (2) 2025.07.31