web-dev-qa-db-ja.com

ON [PRIMARY]はどういう意味ですか?

SQLセットアップスクリプトを作成しており、例として他の人のスクリプトを使用しています。スクリプトの例を次に示します。

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]コマンドの機能を知っている人はいますか?

217
Icono123

Microsoft SQL Serverでデータベースを作成するとき、ストレージが複数の場所、ディレクトリ、またはディスクに作成される複数のファイルグループを持つことができます。各ファイルグループには名前を付けることができます。 PRIMARYファイルグループはデフォルトのグループであり、常に作成されるため、指定したSQLによってPRIMARYファイルグループにテーブルが作成されます。

完全な構文については、 MSDN を参照してください。

226
blowdart

作成しているオブジェクトが存在するファイルグループを指します。したがって、プライマリファイルグループはサーバーのドライブD:\に存在する可能性があります。その後、Indexesという別のファイルグループを作成できます。このファイルグループは、サーバーのドライブE:\に配置できます。

37
codingbadger

ON [PRIMARY]は、「Primary」ファイルグループに構造を作成します。この場合、プライマリキーインデックスとテーブルは、データベース内の「プライマリ」ファイルグループに配置されます。

15
Mark S.

Mark S.が彼の投稿で言及したことに関して非常に重要なメモを追加する。質問で言及された特定のSQLスクリプトでは、データ行とインデックスデータ構造を格納するための2つの異なるファイルグループに言及することはできません。

その理由は、この場合に作成されるインデックスが主キー列のクラスター化インデックスであるという事実によるものです。 クラスター化インデックスデータとテーブルのデータ行は、異なるファイルグループに存在することはできません

したがって、データベースに2つのファイルグループがある場合、たとえばPRIMARYおよびSECONDARYは、テーブルデータに異なるファイルグループ([SECONDARY])を指定したにもかかわらず、PRIMARYファイルグループ自体に行データとクラスター化インデックスデータを格納します。さらに興味深いことに、スクリプトも正常に実行されます(2つの異なるファイルグループ: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

注:作成中のインデックスが本質的にクラスタ化されていない場合にのみ、インデックスを別のファイルグループに置くことができます

テーブルデータが[SECONDARY]ファイルグループに既に存在する場合、非クラスター化インデックスを作成する以下のスクリプトは、代わりに[PRIMARY]ファイルグループに作成されます。

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

非クラスター化インデックスを別のファイルグループに保存すると、クエリのパフォーマンスが向上する方法に関する詳細情報を取得できます。 ここ はそのようなリンクの1つです。

6
RBT