본문 바로가기

MSSQL/SQL Server 2005 new Feature

향상된 인덱싱된 뷰


향상된 인덱싱된 뷰를 설명하기 전에 뷰에 대해 간략히 설명을 하자면...

뷰라는것은 가상테이블의 개념으로서,
사용자의 입장에선 테이블과 동일하게 보이지만, 실제로는 행 데이터를 가지고 있지 않으며, 테이블의 링크된 개념으로 존재한다.


 

위의 예시를 보면 Table1, Table2에 사용자의 실제 SELECT 권한이 존재하게 된다면 중요한 데이터
가 유출될
가능성이 존재한다.

따라서 Table3이라는 뷰를 생성하여 Table3의 뷰에만 권한을 주게 된다면 중요 정보의
유출가능성을 최소화 할 수 있을 것이다.


이럴경우, 뷰의 생성시 필요한 필수 데이터의 컬럼만을 나열하여 그 데이터만 접근가능하게 해야 할것이다.

 

뷰의 종류는 표준뷰, 분할 뷰, 인덱싱된 뷰가 있다.

 

1. 표준뷰 - 한개이상의 테이블을 이용 (사용빈도가 제일 높다.)

2. 분할뷰 - 한대이상의 서버에 존재하는 테이블등을 조인해서 뷰로 만들어 하나의 테이블처럼 보이게 한다.

 

분할뷰에는 로컬분할뷰와 분산형 분할뷰가 있다.

2.1. 로컬분할뷰 - 여러개의 테이블이 한 서버내에 존재한다. (2005부터는 권장하지 않는다.)

2.2. 분산형 분할뷰 - 한대이상의 서버에 존재하는 분할된 뷰를 사용한다.

 

--테이블생성

CREATE TABLE [dbo].[Table1](

       [id] [nvarchar](20) NOT NULL,

       [pass] INT NOT NULL CHECK(pass=10),

       --pass10인값만TABLE1로입력

 

 CONSTRAINT [PK_Table1] PRIMARY KEY(id, pass)

)

 

CREATE TABLE [dbo].[Table2](

       [id] [nvarchar](20) NOT NULL,

       [pass] INT NOT NULL CHECK(pass<>10),

       --pass10이아닌값만TABLE2로입력

 CONSTRAINT [PK_Table2] PRIMARY KEY(id, pass)

)

 

INSERT INTO dbo.Table1 VALUES ('aa', '10')

INSERT INTO dbo.Table2 VALUES ('bb', '11')

 

--뷰생성

CREATE VIEW dbo.Table3

WITH SCHEMABINDING

AS

SELECT id, pass, 'Table1' AS TableName FROM dbo.Table1

UNION ALL

SELECT id, pass, 'Table2' AS TableName FROM dbo.Table2

 

--뷰로입력

INSERT INTO dbo.Table3 VALUES ('cc', '10')

 

SELECT * FROM dbo.Table3

 

 

3. 인덱싱된 뷰

뷰는 기본적으로 SELECT 문이며 뷰를 호출시 링크된 뷰가 실제 테이블에 쿼리하게 됀다.

대량의 데이터를 조인할 경우 실제 테이블에 쿼리가 수행되므로 DB서버내에 부하가 생길 수 있다.

 

이것을 보완해서 나온것이 인덱싱된 뷰를 이용하여 실제데이터를 가져오는데, 인덱싱된 뷰는

대량의 데이터를 조인할 때 직접 뷰에서 데이터를 가져오기 때문에 성능향상을 꾀할 수 있다.

 

다만, 인덱싱된 뷰는 실제 데이터를 가지고 있기 때문에 그만큼의 공간이 별도로 필요하며,

데이터의 변경이 이루어지게 되면 인덱싱된 뷰의 데이터도 변경이 되어야 하기 때문에

데이터의 변경이 자주 이루어지는 상황에서는 오히려 시스템 성능저하를 유발할 수 있다.

 

따라서, 가급적이면 데이터의 변경 빈도수가 낮고, 데이터의 조회 빈도수가 높은 상황에

적용하여 사용하는것이 바람직하다.

 

--테이블생성

CREATE TABLE [dbo].[Table1](

       [id] [nvarchar](20) NOT NULL,

       [pass] INT NOT NULL,

 CONSTRAINT [PK_Table1] PRIMARY KEY(id, pass)

)

 

INSERT INTO dbo.Table1 VALUES ('aa', '10')

 

--뷰생성

CREATE VIEW dbo.Table3

WITH SCHEMABINDING

AS

SELECT id, pass FROM dbo.Table1

 

--뷰의PRIMARY KEY설정

CREATE UNIQUE CLUSTERED INDEX PK_Table3_1 ON dbo.Table3 ( id ASC )

 

--뷰로입력

INSERT INTO dbo.Table3 VALUES ('cc', '10')

 

 

Express Edition 버젼의 경우에는 인덱싱된 뷰 쿼리를 실행하면 설정되어 있는 인덱스를 사용하지

않기 때문에 쿼리 구문에 WITH 옵션을 지정해야 사용할 수 있다.

 

SELECT * FROM dbo.Table3 WITH (NOEXPAND)

 

Enterprise Edition 의 경우에는 WITH 를 설정하지 않아도 뷰와 인덱스가 사용된다.