2009-03-01 7 views
1

Dans MSDN sur la fonction de partition à partir d'ici, $PARTITION(Transact-SQL).fonction de partition dans SQL Server 2005

Je suis confus au sujet de ce que fait l'échantillon ci-dessous. Ma compréhension est, cette instruction SQL va itérer toutes les lignes dans la table Production.TransactionHistory, et puisque pour toutes les lignes qui seront mappées à la même partition, $ PARTITION.TransactionRangePF1 (TransactionDate) retournera la même valeur, c'est à dire le numéro de partition pour tous ces rangées. Ainsi, par exemple, toutes les lignes de la partition 1 se traduiront par une ligne dans le résultat renvoyé car elles ont toutes la même valeur que $ PARTITION.TransactionRangePF1 (TransactionDate). Ma compréhension est-elle correcte?

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

Répondre

0

Il renvoie le nombre d'enregistrements dans chacune des partitions non vides dans la table partitionnée Production.TransactionHistory, donc oui votre raisonnement est correct.

+0

Je comprends le résultat final, Mitch. :-) Ma question concerne ce qui est exécuté en interne pour obtenir le résultat. Pourriez-vous m'aider à revoir mon message et à voir si ma compréhension est correcte? :-) – George2

0

Avez-vous essayé de générer un plan d'exécution pour l'instruction? Cela pourrait vous donner un aperçu de ce qu'il fait réellement sous la couverture.

Appuyez sur "Ctrl-L" pour générer un plan d'exécution et affichez-le ici si vous souhaitez une interprétation.

1

Si votre fonction parition est définie comme

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

, cette clause:

$PARTITION.TransactionRangePF1(TransactionDate) 

équivaut à:

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 

Si vos dates tombent avant '2007-01-01', puis la première clause WHEN tirera toujours et elle reviendra toujours 1.

La requête que vous avez publiée renverra au plus 1 ligne pour chaque partition, car elle regroupera toutes les lignes de la partition (le cas échéant) dans un groupe.

S'il n'y a aucune ligne pour aucune partition, aucune ligne ne sera retournée dans le jeu de résultats.