1

ここからパーティション関数についてのMSDNでは、$PARTITION(Transact-SQL) .

以下のサンプルが根本的に何をしているのか混乱しています。私の理解では、この SQL ステートメントはテーブル Production.TransactionHistory のすべての行を反復し、同じパーティションにマッピングされるすべての行に対して、$PARTITION.TransactionRangePF1(TransactionDate) は同じ値、つまりすべてのパーティション番号を返します。そのような行。したがって、たとえば、パーティション 1 のすべての行は、$PARTITION.TransactionRangePF1(TransactionDate) の値がすべて同じであるため、結果を返すのに 1 つの行になります。私の理解は正しいですか?

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

3 に答える 3

1

パーティション関数が次のように定義されている場合

CREATE PARTITION FUNCTION TransactionRangePF1(DATETIME)
AS RANGE RIGHT FOR VALUES ('2007-01-01', '2008-01-01', '2009-01-01')

、次にこの節:

$PARTITION.TransactionRangePF1(TransactionDate)

次と同等です。

CASE
  WHEN TransactionDate < '2007-01-01' THEN 1
  WHEN TransactionDate < '2008-01-01' THEN 2
  WHEN TransactionDate < '2009-01-01' THEN 3
  ELSE 4
END

すべての日付が より前'2007-01-01'の場合、最初のWHEN句が常に起動し、常に返され1ます。

投稿したクエリは1、パーティション (存在する場合) のすべての行を 1 つのグループにグループ化するため、パーティションごとに多くても行を返します。

どのパーティションにも行がない場合、その行は結果セットに返されません。

于 2009-03-02T15:21:45.077 に答える
0

ステートメントの実行計画を生成しようとしましたか? これにより、カバーの下で実際に何をしているのかについての洞察が得られるかもしれません.

「Control-L」を押して実行計画を生成し、解釈が必要な場合はここに投稿してください。

于 2009-03-02T15:06:53.943 に答える
0

partitioned table の空でない各パーティションのレコード数を返すProduction.TransactionHistoryので、あなたの推論は正しいです。

于 2009-03-01T14:01:16.777 に答える