(새 문서: == 테이블 생성 == === 기본 테이블 생성 === <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...) |
(→테이블 생성) |
||
| (같은 사용자의 중간 판 2개는 보이지 않습니다) | |||
| 1번째 줄: | 1번째 줄: | ||
== 테이블 생성 == | == MS-SQL SERVER 테이블 / 인덱스 생성 == | ||
=== 기본 테이블 생성 === | === 기본 테이블 생성 === | ||
<source lang=sql> | <source lang=sql> | ||
| 64번째 줄: | 64번째 줄: | ||
CREATE UNIQUE NONCLUSTERED INDEX IX_Employees_Email | CREATE UNIQUE NONCLUSTERED INDEX IX_Employees_Email | ||
ON Employees (Email); | ON Employees (Email); | ||
</source> | |||
=== 포함 열(Included Columns)을 사용한 인덱스 === | |||
<source lang=sql> | |||
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> | |||
=== 필터링된 인덱스 === | |||
<source lang=sql> | |||
CREATE NONCLUSTERED INDEX IX_Employees_Active | CREATE NONCLUSTERED INDEX IX_Employees_Active | ||
ON Employees (Department) | ON Employees (Department) | ||
WHERE IsActive = 1; | WHERE IsActive = 1; | ||
</source> | |||
=== 인덱스 관리 === | |||
* 인덱스 확인 | |||
<source lang=sql> | |||
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> | |||
* 인덱스 삭제 | |||
<source lang=sql> | |||
DROP INDEX IX_Employees_LastName ON Employees; | DROP INDEX IX_Employees_LastName ON Employees; | ||
</source> | |||
* 인덱스 재구성/재구축 (성능 유지) | |||
<source lang=sql> | |||
-- 재구성 (가벼운 작업) | -- 재구성 (가벼운 작업) | ||
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; | ||
</source> | |||
== (실습용) 전체 예제 == | |||
<source lang=sql> | |||
-- 데이터베이스 생성 | -- 데이터베이스 생성 | ||
CREATE DATABASE TestDB; | CREATE DATABASE TestDB; | ||
| 222번째 줄: | 146번째 줄: | ||
FROM Customers | FROM Customers | ||
WHERE City = '서울'; | WHERE City = '서울'; | ||
</source> | |||
2026년 9월 14일 (월) 10:53 기준 최신판
MS-SQL SERVER 테이블 / 인덱스 생성
기본 테이블 생성
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 = '서울';