web-dev-qa-db-ja.com

SQL Server 2012のパーティションテーブルへのインデックスの追加

SQL Server 2012でテーブルパーティションを使用するように、1つの大きなテーブルを最近変換しました。

時間に基づいてログを保存するテーブルです。それで、タイプDATETIME2(2)の[time]列でテーブルを分割するパーティション関数を作成しました。次に、私のパーティションスキームは、独自のファイルグループ内の新しい.ndfファイルに毎日マッピングします。

ここで、このテーブルのインデックスを追加するためにいくつかの助けが必要です。Clusterednon-clusteredAlignedNon-alignedインデックス全体の間で少し混乱しています。インデックス作成がテーブルパーティションのパフォーマンスに大きな役割を果たすと思うので、私はここで支援を求めに来ると思いました。

だから私の質問の理由。

単一のパーティションに分類されるデータに対してSQLクエリを実行すると、リソースモニターで、このクエリの実行中にすべての.ndfファイルが読み込まれてから読み取られることがわかりました。 SQLがクエリを実行するためにすべてのパーティションを通過したかのように見えます。テーブルのパーティション分割に関する私の知識から、データが入っているパーティション/ファイルにのみアクセスする必要がありますか?

これにより、自分の索引付けが正しくないと思いました。

これが私の[Logs]テーブル構造の概要です。

Table Design

さて、ご覧のとおり、時刻とlogIDを複合PKとして設定しました。他のすべての列はこの質問には関係ありません。

したがって、現在、次の2つのインデックスがテーブルにあります。

CREATE NONCLUSTERED INDEX [NCILogIdLogs] ON [dbo].[Logs]
(
    [logId] 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)
GO


ALTER TABLE [dbo].[Logs] ADD  CONSTRAINT [PK_Logs] PRIMARY KEY CLUSTERED 
(
    [logId] ASC,
    [time] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)
GO

別のパーティションにインデックスを作成する背後にある考え方を説明できる人がいますか?.

私の理解:

テーブルをパーティション化する列で、すべてのパーティションにまたがるインデックスが必要です。これにより、SQLはクエリが存在するパーティションに直接ジャンプできます。

次に、各パーティション内に存在するインデックスが必要です。これにより、パーティション内の検索が高速になりますか?

私は完全に混乱していますか?または私は正しい軌道に乗っていますか?

[編集]

パーティション構成:

CREATE PARTITION SCHEME [PS_dbo_Date_ByDay] AS PARTITION [PF_dbo_Date_ByDay] TO ([PRIMARY], [PRIMARY], [FG_2014_09_02], [FG_2014_09_03], [FG_2014_09_04], [FG_2014_09_05], [FG_2014_09_06], [FG_2014_09_07], [FG_2014_09_08], [FG_2014_09_09], [FG_2014_09_10], [FG_2014_09_11], [FG_2014_09_12], [FG_2014_09_13], [FG_2014_09_14], [FG_2014_09_15], [FG_2014_09_16], [FG_2014_09_17], [FG_2014_09_18], [FG_2014_09_19], [FG_2014_09_20], [FG_2014_09_21], [FG_2014_09_22], [FG_2014_09_23], [FG_2014_09_24], [FG_2014_09_25], [FG_2014_09_26], [FG_2014_09_27], [FG_2014_09_28], [FG_2014_09_29], [FG_2014_09_30], [FG_2014_10_01], [FG_2014_10_02], [FG_2014_10_03], [FG_2014_10_04], [FG_2014_10_05], [FG_2014_10_06], [FG_2014_10_07], [FG_2014_10_08], [FG_2014_10_09], [FG_2014_10_10], [FG_2014_10_11], [FG_2014_10_12], [FG_2014_10_13], [FG_2014_10_14], [FG_2014_10_15], [FG_2014_10_16], [FG_2014_10_17], [FG_2014_10_18], [FG_2014_10_19], [FG_2014_10_20], [FG_2014_10_21], [FG_2014_10_22], [FG_2014_10_23], [FG_2014_10_24], [FG_2014_10_25], [FG_2014_10_26], [FG_2014_10_27], [FG_2014_10_28], [FG_2014_10_29], [FG_2014_10_30], [FG_2014_10_31], [FG_2014_11_01], [FG_2014_11_02], [FG_2014_11_03], [FG_2014_11_04], [FG_2014_11_05], [FG_2014_11_06], [FG_2014_11_07], [FG_2014_11_08], [FG_2014_11_09], [FG_2014_11_10], [FG_2014_11_11], [FG_2014_11_12], [FG_2014_11_13], [FG_2014_11_14], [FG_2014_11_15], [FG_2014_11_16], [FG_2014_11_17], [FG_2014_11_18], [FG_2014_11_19], [FG_2014_11_20], [FG_2014_11_21], [FG_2014_11_22], [FG_2014_11_23], [FG_2014_11_24], [FG_2014_11_25], [FG_2014_11_26], [FG_2014_11_27], [FG_2014_11_28], [FG_2014_11_29], [FG_2014_11_30], [FG_2014_12_01], [FG_2014_12_02], [FG_2014_12_03], [FG_2014_12_04], [FG_2014_12_05], [FG_2014_12_06], [FG_2014_12_07], [FG_2014_12_08], [FG_2014_12_09], [FG_2014_12_10], [FG_2014_12_11], [FG_2014_12_12], [FG_2014_12_13], [FG_2014_12_14], [FG_2014_12_15], [FG_2014_12_16], [FG_2014_12_17], [FG_2014_12_18], [FG_2014_12_19], [FG_2014_12_20], [FG_2014_12_21], [FG_2014_12_22], [FG_2014_12_23], [FG_2014_12_24], [FG_2014_12_25], [FG_2014_12_26], [FG_2014_12_27], [FG_2014_12_28], [FG_2014_12_29], [FG_2014_12_30], [FG_2014_12_31])
GO

そしてパーティション機能:

CREATE PARTITION FUNCTION [PF_dbo_Date_ByDay](datetime2(2)) AS RANGE RIGHT FOR VALUES (N'2014-09-01T00:00:00.000', N'2014-09-02T00:00:00.000', N'2014-09-03T00:00:00.000', N'2014-09-04T00:00:00.000', N'2014-09-05T00:00:00.000', N'2014-09-06T00:00:00.000', N'2014-09-07T00:00:00.000', N'2014-09-08T00:00:00.000', N'2014-09-09T00:00:00.000', N'2014-09-10T00:00:00.000', N'2014-09-11T00:00:00.000', N'2014-09-12T00:00:00.000', N'2014-09-13T00:00:00.000', N'2014-09-14T00:00:00.000', N'2014-09-15T00:00:00.000', N'2014-09-16T00:00:00.000', N'2014-09-17T00:00:00.000', N'2014-09-18T00:00:00.000', N'2014-09-19T00:00:00.000', N'2014-09-20T00:00:00.000', N'2014-09-21T00:00:00.000', N'2014-09-22T00:00:00.000', N'2014-09-23T00:00:00.000', N'2014-09-24T00:00:00.000', N'2014-09-25T00:00:00.000', N'2014-09-26T00:00:00.000', N'2014-09-27T00:00:00.000', N'2014-09-28T00:00:00.000', N'2014-09-29T00:00:00.000', N'2014-09-30T00:00:00.000', N'2014-10-01T00:00:00.000', N'2014-10-02T00:00:00.000', N'2014-10-03T00:00:00.000', N'2014-10-04T00:00:00.000', N'2014-10-05T00:00:00.000', N'2014-10-06T00:00:00.000', N'2014-10-07T00:00:00.000', N'2014-10-08T00:00:00.000', N'2014-10-09T00:00:00.000', N'2014-10-10T00:00:00.000', N'2014-10-11T00:00:00.000', N'2014-10-12T00:00:00.000', N'2014-10-13T00:00:00.000', N'2014-10-14T00:00:00.000', N'2014-10-15T00:00:00.000', N'2014-10-16T00:00:00.000', N'2014-10-17T00:00:00.000', N'2014-10-18T00:00:00.000', N'2014-10-19T00:00:00.000', N'2014-10-20T00:00:00.000', N'2014-10-21T00:00:00.000', N'2014-10-22T00:00:00.000', N'2014-10-23T00:00:00.000', N'2014-10-24T00:00:00.000', N'2014-10-25T00:00:00.000', N'2014-10-26T00:00:00.000', N'2014-10-27T00:00:00.000', N'2014-10-28T00:00:00.000', N'2014-10-29T00:00:00.000', N'2014-10-30T00:00:00.000', N'2014-10-31T00:00:00.000', N'2014-11-01T00:00:00.000', N'2014-11-02T00:00:00.000', N'2014-11-03T00:00:00.000', N'2014-11-04T00:00:00.000', N'2014-11-05T00:00:00.000', N'2014-11-06T00:00:00.000', N'2014-11-07T00:00:00.000', N'2014-11-08T00:00:00.000', N'2014-11-09T00:00:00.000', N'2014-11-10T00:00:00.000', N'2014-11-11T00:00:00.000', N'2014-11-12T00:00:00.000', N'2014-11-13T00:00:00.000', N'2014-11-14T00:00:00.000', N'2014-11-15T00:00:00.000', N'2014-11-16T00:00:00.000', N'2014-11-17T00:00:00.000', N'2014-11-18T00:00:00.000', N'2014-11-19T00:00:00.000', N'2014-11-20T00:00:00.000', N'2014-11-21T00:00:00.000', N'2014-11-22T00:00:00.000', N'2014-11-23T00:00:00.000', N'2014-11-24T00:00:00.000', N'2014-11-25T00:00:00.000', N'2014-11-26T00:00:00.000', N'2014-11-27T00:00:00.000', N'2014-11-28T00:00:00.000', N'2014-11-29T00:00:00.000', N'2014-11-30T00:00:00.000', N'2014-12-01T00:00:00.000', N'2014-12-02T00:00:00.000', N'2014-12-03T00:00:00.000', N'2014-12-04T00:00:00.000', N'2014-12-05T00:00:00.000', N'2014-12-06T00:00:00.000', N'2014-12-07T00:00:00.000', N'2014-12-08T00:00:00.000', N'2014-12-09T00:00:00.000', N'2014-12-10T00:00:00.000', N'2014-12-11T00:00:00.000', N'2014-12-12T00:00:00.000', N'2014-12-13T00:00:00.000', N'2014-12-14T00:00:00.000', N'2014-12-15T00:00:00.000', N'2014-12-16T00:00:00.000', N'2014-12-17T00:00:00.000', N'2014-12-18T00:00:00.000', N'2014-12-19T00:00:00.000', N'2014-12-20T00:00:00.000', N'2014-12-21T00:00:00.000', N'2014-12-22T00:00:00.000', N'2014-12-23T00:00:00.000', N'2014-12-24T00:00:00.000', N'2014-12-25T00:00:00.000', N'2014-12-26T00:00:00.000', N'2014-12-27T00:00:00.000', N'2014-12-28T00:00:00.000', N'2014-12-29T00:00:00.000', N'2014-12-30T00:00:00.000', N'2014-12-31T00:00:00.000')
GO
2
Zapnologica

テーブルをパーティション分割するには、クラスター化インデックスを次のように作成する必要があります。

ALTER TABLE [dbo].[Logs] ADD  CONSTRAINT [PK_Logs] PRIMARY KEY CLUSTERED 
(
    [logId] ASC,
    [time] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PS_dbo_Date_ByDay](Time)

次に、次のコマンドを実行して、さまざまなパーティションを表示できます。

SELECT 
    t.name AS TableName, i.name AS IndexName, p.partition_number, p.partition_id, 
    i.data_space_id, f.function_id, f.type_desc, r.boundary_id, r.value AS BoundaryValue, p.rows
FROM 
    sys.tables AS t
INNER JOIN
    sys.indexes AS i ON t.object_id = i.object_id
INNER JOIN
    sys.partitions AS p ON i.object_id = p.object_id AND i.index_id = p.index_id 
INNER JOIN
    sys.partition_schemes AS s ON i.data_space_id = s.data_space_id
INNER JOIN
    sys.partition_functions AS f ON s.function_id = f.function_id
LEFT OUTER JOIN 
    sys.partition_range_values AS r ON f.function_id = r.function_id AND r.boundary_id = p.partition_number
WHERE 
    t.name = 'Logs'
AND 
    i.type <= 1
ORDER BY p.partition_number;

テーブルは基本的に異なるセクションに分割されているため、クエリは互いにブロックせずに異なるセクションを参照できます(レコードを2つの異なるパーティションに同時に挿入してから、非パーティションテーブルで試してください)。

これは、ALIGNEDインデックスの場合も同じです。それを(クラスター化インデックスと同じ)パーティションスキームで作成すると、分割されます(上のSELECTで表示されます)。

ただし、ON-ALIGNEDインデックスを作成できます。ONPS_dbo_Date_ByDayを追加せず、PRIMARYまたは別のファイルグループを使用してください。

お役に立てれば。

編集:-主キーに、パーティションの一部ではない列(LogID)が含まれています。テーブルはパーティション化されますが、パフォーマンスに影響する可能性があります。私はしばらく前にここで同様の質問をしました、これはリンクです:-

パーティショニングクエリ

2
dbafromthecold