sql >> Databasteknik >  >> RDS >> Sqlserver

Returnera alla rader från en specifik partition i SQL Server (T-SQL)

När du skapar en partitionerad tabell i SQL Server anger du vilka värden som ska ingå i varje partition.

Detta görs när du skapar partitionsfunktionen. När du skapar partitionsfunktionen anger du gränsvärden, som bestämmer vilka värden som ingår i varje partition.

När du har skapat din partitionerade tabell och du har infogat data kan du köra en normal SELECT uttalande för att returnera data, precis som du skulle göra med en icke-partitionerad tabell (faktiskt har även icke-partitionerade tabeller en partition).

Men visste du att du också kan ange vilken partition du vill ha data från?

Du kan göra detta med hjälp av $PARTITION systemfunktion i din WHERE klausul.

Exempel

Föreställ dig att vi har en partitionerad tabell som innehåller följande data:

+---------+-------------+
| CatId   | CatName     |
|---------+-------------|
| 1       | Meow        |
| 2       | Fluffy      |
| 3       | Scratch     |
| 4       | Bulldog     |
| 5       | King George |
| 6       | Sharp       |
| 7       | Fritz       |
| 8       | Garfield    |
| 9       | Boss        |
+---------+-------------+

Och CatId är partitioneringskolumnen.

Och vi använde följande partitionsfunktion för att skapa dess partitioner:

CREATE PARTITION FUNCTION CatsPartitionFunction (int)  
    AS RANGE LEFT FOR VALUES (-1, 5, 100);

Detta berättar för oss hur data lagras, enligt värdena i partitioneringskolumnen.

Så vi kan nu köra en fråga som bara returnerar data från en specifik partition.

Returnera data från den andra partitionen

Så här kan vi returnera alla rader från den andra partitionen.

SELECT * FROM Cats
WHERE $PARTITION.CatsPartitionFunction(CatId) = 2;

Resultat:

+---------+-------------+
| CatId   | CatName     |
|---------+-------------|
| 1       | Meow        |
| 2       | Fluffy      |
| 3       | Scratch     |
| 4       | Bulldog     |
| 5       | King George |
+---------+-------------+

Returnera data från den tredje partitionen

Och här är all data från den tredje partitionen.

SELECT * FROM Cats
WHERE $PARTITION.CatsPartitionFunction(CatId) = 3;

Resultat:

+---------+-----------+
| CatId   | CatName   |
|---------+-----------|
| 6       | Sharp     |
| 7       | Fritz     |
| 8       | Garfield  |
| 9       | Boss      |
+---------+-----------+

Returnera data från den första och sista partitionen

I det här fallet är min första partition tom, eftersom det inte finns några negativa värden i CatId kolumn.

SELECT * FROM Cats
WHERE $PARTITION.CatsPartitionFunction(CatId) = 1;

Resultat:

(0 rows affected)

På samma sätt är den sista partitionen tom, på grund av att det inte finns tillräckligt många rader för att fylla den partitionen.

SELECT * FROM Cats
WHERE $PARTITION.CatsPartitionFunction(CatId) = 4;

Resultat:

(0 rows affected)

Detta följer Microsofts rekommendation att lämna de första och sista partitionerna tomma, för att undvika all dataförflyttning i händelse av att partitionerna delas eller slås samman i framtiden.


  1. Skillnad mellan Oracle jdbc-drivrutinsklasser?

  2. SQL-referenstabell:Hur man skapar och skriver grundläggande frågor

  3. Hur får jag gem-installationen att fungera på OS X Lion med Ruby 1.8.7 utan att det blir fel?

  4. Fallet med kardinalitetsuppskattningen Red Herring