Msg 성장일기
Mssql vs Oracle 비교 본문
## 아키텍처 및 용어 매핑 (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 |