2009-03-01 4 views
1

In MSDN über Partition Funktion von hier, $PARTITION(Transact-SQL).Partition -Funktion in SQL Server 2005

Ich bin verwirrt darüber, was das folgende Beispiel zugrunde liegt. Nach meinem Verständnis wird diese SQL-Anweisung alle Zeilen in der Tabelle Production.TransactionHistory durchlaufen, und da für alle Zeilen, die auf dieselbe Partition mappen, $ PARTITION.TransactionRangePF1 (TransactionDate) den gleichen Wert zurückgibt, dh die Partitionsnummer für alle solche Reihen. So führen zum Beispiel alle Zeilen in Partition 1 dazu, dass eine Zeile das Ergebnis zurückgibt, da sie alle denselben Wert von $ PARTITION.TransactionRangePF1 (TransactionDate) haben. Mein Verständnis richtig?

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

Antwort

0

Sie gibt die Anzahl der Datensätze in jedem der nicht leeren Partitionen in der partitionierten Tabelle Production.TransactionHistory, also ja Ihre Argumentation richtig ist.

+0

Ich verstehe das Endergebnis, Mitch. :-) Meine Frage ist, was intern ausgeführt wird, um das Ergebnis zu erhalten. Könnten Sie mir helfen, meinen Beitrag zu überprüfen und zu sehen, ob mein Verständnis korrekt ist? :-) – George2

0

Haben Sie versucht, einen Ausführungsplan für die Anweisung zu generieren? Das könnte dir einen Einblick geben, was es tatsächlich unter dem Cover tut.

Klicken Sie auf "Control-L", um einen Ausführungsplan zu erstellen, und senden Sie ihn hier, wenn Sie eine Interpretation wünschen.

1

Wenn Ihre parition Funktion wie

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

, dann dieser Klausel definiert:

$PARTITION.TransactionRangePF1(TransactionDate) 

entspricht:

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 

Wenn alle Ihre Daten vor '2007-01-01' fallen, dann die erste WHEN Klausel wird immer ausgelöst und es wird immer 01 zurückgegeben.

Die von Ihnen gepostete Abfrage gibt maximal 1 Zeilen für jede Partition zurück, da sie alle Zeilen der Partition (falls vorhanden) in einer Gruppe gruppieren.

Wenn für eine Partition keine Zeilen vorhanden sind, werden keine Zeilen dafür im Resultset zurückgegeben.