2010-05-09 4 views
169

SQL 설정 스크립트를 만들고 있는데 다른 사람의 스크립트를 예로 사용하고 있습니다. 다음은 스크립트의 예입니다.ON [PRIMARY]의 의미는 무엇입니까?

SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
CREATE TABLE [dbo].[be_Categories](
    [CategoryID] [uniqueidentifier] ROWGUIDCOL NOT NULL CONSTRAINT [DF_be_Categories_CategoryID] DEFAULT (newid()), 
    [CategoryName] [nvarchar](50) NULL, 
    [Description] [nvarchar](200) NULL, 
    [ParentID] [uniqueidentifier] NULL, 
CONSTRAINT [PK_be_Categories] PRIMARY KEY CLUSTERED 
(
    [CategoryID] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 
GO 

ON [PRIMARY] 명령의 기능을 아는 사람이 있습니까?

답변

182

Microsoft SQL Server에서 데이터베이스를 만들 때 저장소가 여러 위치, 디렉터리 또는 디스크에 만들어지는 여러 파일 그룹을 가질 수 있습니다. 각 파일 그룹의 이름을 지정할 수 있습니다. PRIMARY 파일 그룹은 항상 만들어지는 기본 파일 그룹이므로 주어진 SQL은 PRIMARY 파일 그룹에 테이블을 만듭니다.

전체 구문은 MSDN을 참조하십시오.

+115

이것은 일반적으로 ** 쓸모없고 스크립트에서 안전하게 제거 할 수 있음을 의미합니다 **. – MGOwen

+0

예, 같은 방법으로 변수 초기화를 0과 false로 생략 할 수 있습니다. 단지 기본값이기 때문입니다. 맞습니까? –

+9

@ MarkSowul이 기능을 사용하여 성능을 최적화해야하는 좋은 이유가 없으면이를 생략하고 기본값을 사용하는 것이 좋습니다. (따라서 "일반적으로"MGOwen이 포함됩니다.) 변수를 '0'또는 'false'로 초기화하는 것은 코드가 알려진 상태에서 작동하는지 확인하는 것입니다. 이는 논리적이고 정확성의 문제이며 최적화 문제가 아닙니다. – jpmc26

11

ON [PRIMARY]는 "Primary"파일 그룹에 구조를 만듭니다. 이 경우 기본 키 인덱스와 테이블은 데이터베이스 내의 "기본"파일 그룹에 배치됩니다.

26

만들고있는 개체가있는 파일 그룹을 나타냅니다. 따라서 주 파일 그룹은 서버의 D : \ 드라이브에있을 수 있습니다. 그런 다음 Indexes라는 다른 파일 그룹을 만들 수 있습니다. 이 파일 그룹은 서버의 E : \ 드라이브에있을 수 있습니다.

+3

RTFM 대신 현실 세계 예제 용으로 012v를 할당했습니다. – JumpingJezza

+0

다른 파일 그룹의 PRIMARY 파일 그룹 및 테이블 제약 조건 또는 인덱스 데이터 구조에 테이블을 저장하면 성능에 부정적인 영향을 줍니까? – RBT

+0

@RBT이 문제에 영향을 미칠 수있는 많은 변수가 있으며 일반적으로 많은 답변이 "It depends but ..."로 시작됩니다. http : //dba.stackexchange를 참조하십시오.com/questions/2626/non-clustered-index-be-on-separate-filegroups 및 관련 질문 – codingbadger

3

Mark S.가 그의 게시물에서 언급 한 것에 매우 중요한 메모를 추가하십시오. 질문에 언급 된 특정 SQL 스크립트에서는 데이터 행과 인덱스 데이터 구조를 저장하기 위해 두 개의 다른 파일 그룹을 언급 할 필요가 없습니다.

이유는이 경우 생성되는 인덱스가 기본 키 열의 클러스터 된 인덱스이기 때문입니다. 클러스터 된 인덱스 데이터와 테이블의 데이터 행은 서로 다른 파일 그룹에있을 수 없습니다..

따라서 데이터베이스에 두 개의 파일 그룹이있는 경우 PRIMARY 및 SECONDARY 다음에 언급 한 스크립트는 테이블 데이터에 대해 다른 파일 그룹 ([SECONDARY])을 언급했지만 행 데이터와 클러스터 된 인덱스 데이터를 모두 PRIMARY 파일 그룹 자체에 저장합니다. 더욱 흥미롭게도 스크립트는 성공적으로 실행됩니다 (내가 두 개의 다른 파일 그룹을 부여 했으므로 오류가 발생할 것으로 예상했을 때 : P). SQL Server는 자동으로 장면 뒤에 숨어있는 트릭을 수행합니다.

CREATE TABLE [dbo].[be_Categories](
    [CategoryID] [uniqueidentifier] ROWGUIDCOL NOT NULL CONSTRAINT [DF_be_Categories_CategoryID] DEFAULT (newid()), 
    [CategoryName] [nvarchar](50) NULL, 
    [Description] [nvarchar](200) NULL, 
    [ParentID] [uniqueidentifier] NULL, 
CONSTRAINT [PK_be_Categories] PRIMARY KEY CLUSTERED 
(
    [CategoryID] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [SECONDARY] 
GO 

참고 : 인덱스가 생성되는 경우에만 다른 파일 그룹에 상주 할 수 있습니다 귀하의 인덱스는 클러스터되지 않은 자연을입니다.

테이블 데이터가 이미 [PRIMARY] 파일 그룹에있는 대신 할 때 클러스터되지 않은 인덱스가 [SECONDARY] 파일 그룹에 생성 얻을 것이다 생성 아래 스크립트 : 당신은 어떻게 비 저장에 대한 자세한 정보를 얻을 수 있습니다

CREATE NONCLUSTERED INDEX [IX_Categories] ON [dbo].[be_Categories] 
(
    [CategoryName] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [Secondary] 
GO 

다른 파일 그룹에 클러스터 된 인덱스를 사용하면 쿼리 성능이 향상됩니다. Here은 그러한 링크 중 하나입니다.