메뉴 여닫기
개인 메뉴 토글
로그인하지 않음
만약 지금 편집한다면 당신의 IP 주소가 공개될 수 있습니다.

MS-SQL SERVER 테이블 생성: 두 판 사이의 차이

DB스터디
(새 문서: == 테이블 생성 == === 기본 테이블 생성 === <source lang=sql> CREATE TABLE Employees ( EmployeeID INT IDENTITY(1,1) PRIMARY KEY, FirstName NVARCHAR(50) NOT NULL, LastName NVARCHAR(50) NOT NULL, Email NVARCHAR(100) UNIQUE, Department NVARCHAR(50), Salary DECIMAL(10, 2), HireDate DATE DEFAULT GETDATE(), IsActive BIT DEFAULT 1 ); </source> === 외래 키가 있는 테이블 생성 === <source lang=sql> CREATE TABLE Departments ( Depar...)
 
64번째 줄: 64번째 줄:
CREATE UNIQUE NONCLUSTERED INDEX IX_Employees_Email
CREATE UNIQUE NONCLUSTERED INDEX IX_Employees_Email
ON Employees (Email);
ON Employees (Email);
포함 열(Included Columns)을 사용한 인덱스
</source>
sql


접기
=== 포함 열(Included Columns)을 사용한 인덱스 ==
저장
<source lang=sql>
복사
1
2
3
CREATE NONCLUSTERED INDEX IX_Employees_Dept_Include
CREATE NONCLUSTERED INDEX IX_Employees_Dept_Include
ON Employees (Department)
ON Employees (Department)
INCLUDE (FirstName, LastName, Salary);
INCLUDE (FirstName, LastName, Salary);
필터링된 인덱스
</source>
sql


접기
=== 필터링된 인덱스 ===
저장
<source lang=sql>
복사
1
2
3
CREATE NONCLUSTERED INDEX IX_Employees_Active
CREATE NONCLUSTERED INDEX IX_Employees_Active
ON Employees (Department)
ON Employees (Department)
WHERE IsActive = 1;
WHERE IsActive = 1;
3. 인덱스 관리
</source>
인덱스 확인
sql


접기
=== 인덱스 관리 ===
저장
* 인덱스 확인
복사
<source lang=sql>
1
2
3
4
5
6
7
SELECT  
SELECT  
     i.name AS IndexName,
     i.name AS IndexName,
112번째 줄: 90번째 줄:
INNER JOIN sys.tables t ON i.object_id = t.object_id
INNER JOIN sys.tables t ON i.object_id = t.object_id
WHERE t.name = 'Employees';
WHERE t.name = 'Employees';
인덱스 삭제
</source>
sql


접기
* 인덱스 삭제
저장
<source lang=sql>
복사
1
DROP INDEX IX_Employees_LastName ON Employees;
DROP INDEX IX_Employees_LastName ON Employees;
인덱스 재구성/재구축 (성능 유지)
</source>
sql


접기
* 인덱스 재구성/재구축 (성능 유지)
저장
<source lang=sql>
복사
1
2
3
4
5
6
7
8
-- 재구성 (가벼운 작업)
-- 재구성 (가벼운 작업)
ALTER INDEX IX_Employees_LastName ON Employees REORGANIZE;
ALTER INDEX IX_Employees_LastName ON Employees REORGANIZE;
142번째 줄: 107번째 줄:
-- 모든 인덱스 재구축
-- 모든 인덱스 재구축
ALTER INDEX ALL ON Employees REBUILD;
ALTER INDEX ALL ON Employees REBUILD;
4. 전체 예제 (실습용)
sql


접기
</source>
저장
 
복사
== (실습용) 전체 예제  ==
1
<source lang=sql>
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
-- 데이터베이스 생성
-- 데이터베이스 생성
CREATE DATABASE TestDB;
CREATE DATABASE TestDB;
222번째 줄: 146번째 줄:
FROM Customers  
FROM Customers  
WHERE City = '서울';
WHERE City = '서울';
</source>

2026년 9월 14일 (월) 10:48 판

테이블 생성

기본 테이블 생성

CREATE TABLE Employees (
    EmployeeID INT IDENTITY(1,1) PRIMARY KEY,
    FirstName NVARCHAR(50) NOT NULL,
    LastName NVARCHAR(50) NOT NULL,
    Email NVARCHAR(100) UNIQUE,
    Department NVARCHAR(50),
    Salary DECIMAL(10, 2),
    HireDate DATE DEFAULT GETDATE(),
    IsActive BIT DEFAULT 1
);

외래 키가 있는 테이블 생성

CREATE TABLE Departments (
    DepartmentID INT IDENTITY(1,1) PRIMARY KEY,
    DepartmentName NVARCHAR(100) NOT NULL
);

CREATE TABLE Employees2 (
    EmployeeID INT IDENTITY(1,1) PRIMARY KEY,
    FirstName NVARCHAR(50) NOT NULL,
    LastName NVARCHAR(50) NOT NULL,
    DepartmentID INT,
    CONSTRAINT FK_Department FOREIGN KEY (DepartmentID)
        REFERENCES Departments(DepartmentID)
);

CHECK 제약 조건 추가

CREATE TABLE Products (
    ProductID INT IDENTITY(1,1) PRIMARY KEY,
    ProductName NVARCHAR(100) NOT NULL,
    Price DECIMAL(10, 2) CHECK (Price > 0),
    StockQuantity INT CHECK (StockQuantity >= 0)
);

인덱스 생성

클러스터형 인덱스 (기본적으로 PK에 자동 생성)

CREATE CLUSTERED INDEX IX_Employees_EmployeeID
ON Employees (EmployeeID);

💡 PRIMARY KEY 지정 시 기본적으로 클러스터형 인덱스가 자동 생성되므로, 보통 명시적으로 만들 필요는 없습니다.

비클러스터형 인덱스 (단일 컬럼)

CREATE NONCLUSTERED INDEX IX_Employees_LastName
ON Employees (LastName);
CREATE NONCLUSTERED INDEX IX_Employees_Dept_Salary
ON Employees (Department, Salary);
CREATE UNIQUE NONCLUSTERED INDEX IX_Employees_Email
ON Employees (Email);

= 포함 열(Included Columns)을 사용한 인덱스

CREATE NONCLUSTERED INDEX IX_Employees_Dept_Include
ON Employees (Department)
INCLUDE (FirstName, LastName, Salary);

필터링된 인덱스

CREATE NONCLUSTERED INDEX IX_Employees_Active
ON Employees (Department)
WHERE IsActive = 1;

인덱스 관리

  • 인덱스 확인
SELECT 
    i.name AS IndexName,
    i.type_desc AS IndexType,
    t.name AS TableName
FROM sys.indexes i
INNER JOIN sys.tables t ON i.object_id = t.object_id
WHERE t.name = 'Employees';
  • 인덱스 삭제
DROP INDEX IX_Employees_LastName ON Employees;
  • 인덱스 재구성/재구축 (성능 유지)
-- 재구성 (가벼운 작업)
ALTER INDEX IX_Employees_LastName ON Employees REORGANIZE;

-- 재구축 (완전 재생성)
ALTER INDEX IX_Employees_LastName ON Employees REBUILD;

-- 모든 인덱스 재구축
ALTER INDEX ALL ON Employees REBUILD;

(실습용) 전체 예제

-- 데이터베이스 생성
CREATE DATABASE TestDB;
GO
USE TestDB;
GO

-- 테이블 생성
CREATE TABLE Customers (
    CustomerID INT IDENTITY(1,1) PRIMARY KEY,
    CustomerName NVARCHAR(100) NOT NULL,
    City NVARCHAR(50),
    Country NVARCHAR(50),
    RegisterDate DATETIME DEFAULT GETDATE()
);

-- 샘플 데이터 삽입
INSERT INTO Customers (CustomerName, City, Country)
VALUES 
    ('홍길동', '서울', '한국'),
    ('김철수', '부산', '한국'),
    ('이영희', '대구', '한국');

-- 인덱스 생성 (검색 성능 향상)
CREATE NONCLUSTERED INDEX IX_Customers_City
ON Customers (City);

CREATE NONCLUSTERED INDEX IX_Customers_Country_City
ON Customers (Country, City)
INCLUDE (CustomerName);

-- 인덱스 사용 확인 (실행 계획 확인용)
SELECT CustomerName, City 
FROM Customers 
WHERE City = '서울';