5

私はこの記事に従いました: http ://www.mssqltips.com/sqlservertip/1796/creating-a-table-with-horizo​​ntal-partitioning-in-sql-server/ これは本質的に次のことを行います。

  1. 3つのファイルグループでデータベースを作成し、それらをA、B、およびCと呼びます
  2. 3つのファイルグループにマッピングするパーティションスキームを作成します
  3. テーブルを作成します-パーティションスキームを使用してSalesArchival
  4. テーブルにいくつかの行を挿入し、ファイルグループに分割します。

このようなクエリを実行したい(擬似コードを失礼します)

select * from SalesArchival
where data in filegroup('A')

これを行う方法はありますか、そうでない場合はどうすればよいですか。

私が達成したいのは、90日より古いデータを別のファイルグループに移動するバッチを毎日実行し、「現在の」ファイルグループに対してのみフロントエンドクエリを実行することです。

4

3 に答える 3

2

特定のファイルグループを取得するには、述語でパーティションの削除を常に利用して、最小限のレコードが確実に読み取られるようにする必要があります。パーティショニングから利益を得るには、これは非常に重要です。

アーカイブについては、範囲を分割してマージする方法を探していると思います。最初と最後のパーティションは常に空にしておく必要がありますが、これにより、アーカイブにパーティションを使用する方法がわかります。参考までに、あるファイルグループから別のファイルグループにデータを移動することは、非常に多くのリソースを消費します。さらに、範囲右pfを使用すると、結果がわずかに異なります。パーティショニングを行っているので、ベストプラクティスをよく読んでください。

本番環境で実行しないでください。これは、学ぶための単なる例です。

この例では、4つのファイルグループ(FG1、FG2、FG3、および[PRIMARY])が定義されていることを前提としています。

IF EXISTS(SELECT NULL FROM sys.tables WHERE name = 'PartitionTest')
    DROP TABLE PartitionTest;
IF EXISTS(SELECT NULL FROM sys.partition_schemes WHERE name = 'PS')
    DROP PARTITION SCHEME PS;
IF EXISTS(SELECT NULL FROM sys.partition_functions WHERE name = 'PF')
    DROP PARTITION FUNCTION PF;
CREATE PARTITION FUNCTION PF (datetime) AS RANGE LEFT FOR VALUES ('2012-02-05', '2012-05-10','2013-01-01');
CREATE PARTITION SCHEME PS AS PARTITION PF TO (FG1,FG2,FG3,[PRIMARY]);
CREATE TABLE PartitionTest( Id int identity(1,1), DT datetime) ON PS(DT);

INSERT PartitionTest (DT) SELECT '2012-02-05' --FG1 UNION ALL SELECT '2012-02-06' --FG2(This is the one 90 days old to archive into FG1) UNION ALL SELECT '2012-02-07' --FG2 UNION ALL SELECT '2012-05-05' --FG2 (This represents a record entered recently)

各レコードに関連付けられているファイルグループを確認します。
SELECT O.name TableName, fg.name FileGroup, ps.name PartitionScheme,pf.name PartitionFunction, ISNULL(prv.value,'Undefined') RangeValue,p.rows
FROM sys.objects O
INNER JOIN sys.partitions p on P.object_id = O.object_id
INNER JOIN sys.indexes i on p.object_id = i.object_id and p.index_id = i.index_id
INNER JOIN sys.data_spaces ds on i.data_space_id = ds.data_space_id
INNER JOIN sys.partition_schemes ps on ds.data_space_id = ps.data_space_id
INNER JOIN sys.partition_functions pf on ps.function_id = pf.function_id
LEFT OUTER JOIN sys.partition_range_values prv on prv.function_id = ps.function_id and p.partition_number = prv.boundary_id
INNER JOIN sys.allocation_units au on p.hobt_id = au.container_id
INNER JOIN sys.filegroups fg ON au.data_space_id = fg.data_space_id
WHERE o.name = 'PartitionTest' AND i.type IN (0,1) --Remove nonclustereds. 0 for heap, 1 for BTree
ORDER BY O.name, fg.name, prv.value
これは、2012-02-05がFG1にあり、残りがFG2にあることを証明しています。

アーカイブするためのあなたの最初の本能は、データを移動することです。ただし、パーティション化する場合は、実際にはパーティション関数の範囲の値をスライドさせる必要があります。

それでは、2012-02-06(あなたの場合は90日以上)をFG1に移動しましょう。

--Move 2012-02-06 from FG2 to FG1
ALTER PARTITION SCHEME PS NEXT USED FG1;
ALTER PARTITION FUNCTION PF() SPLIT RANGE ('2012-02-06');
ファイルグループクエリを再実行して、2012-02-06がFG1に移動したことを確認します。

于 2012-05-06T06:05:15.363 に答える
1

$ PARTITION(Transact-SQL)には、やりたいことがあるはずです。

次のコマンドを実行して、パーティションのサイズとIDを確認します。

USE AdventureWorks2012;
GO
SELECT $PARTITION.TransactionRangePF1(TransactionDate) AS Partition, 
COUNT(*) AS [COUNT] FROM Production.TransactionHistory 
GROUP BY $PARTITION.TransactionRangePF1(TransactionDate)
ORDER BY Partition ;
GO

そして、以下はあなたに与えられたパーティションIDからのデータを与えるはずです:

SELECT * FROM Production.TransactionHistory
WHERE $PARTITION.TransactionRangePF1(TransactionDate) = 5 ;
于 2015-05-26T22:41:58.597 に答える
0

いいえ。パーティション関数で使用するのとまったく同じ条件を使用する必要があります。これはおそらく次のようなものです

where keyCol between 3 and 7
于 2012-05-04T20:33:59.817 に答える