sql >> Database >  >> RDS >> Sqlserver

Retourneer alle rijen van een specifieke partitie in SQL Server (T-SQL)

Wanneer u een gepartitioneerde tabel in SQL Server maakt, geeft u op welke waarden in elke partitie worden geplaatst.

Dit wordt gedaan wanneer u de partitiefunctie maakt. Wanneer u de partitiefunctie maakt, specificeert u grenswaarden, die bepalen welke waarden in elke partitie gaan.

Nadat u uw gepartitioneerde tabel hebt gemaakt en gegevens hebt ingevoegd, kunt u een normale SELECT uitvoeren instructie om gegevens te retourneren, net zoals u zou doen met een niet-gepartitioneerde tabel (eigenlijk hebben zelfs niet-gepartitioneerde tabellen één partitie).

Maar wist u dat u ook kunt specificeren van welke partitie u gegevens wilt hebben?

U kunt dit doen met behulp van de $PARTITION systeemfunctie in uw WHERE clausule.

Voorbeeld

Stel je voor dat we een gepartitioneerde tabel hebben die de volgende gegevens bevat:

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

En CatId is de partitioneringskolom.

En we hebben de volgende partitiefunctie gebruikt om de partities te maken:

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

Dit vertelt ons hoe de gegevens worden opgeslagen, volgens de waarden in de partitioneringskolom.

We kunnen nu dus een query uitvoeren die alleen gegevens van een specifieke partitie retourneert.

Gegevens van de tweede partitie retourneren

Hier is hoe we alle rijen van de tweede partitie kunnen retourneren.

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

Resultaat:

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

Gegevens van de derde partitie retourneren

En hier zijn alle gegevens van de derde partitie.

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

Resultaat:

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

Gegevens retourneren van de eerste en laatste partities

In dit geval is mijn eerste partitie leeg, omdat er geen negatieve waarden zijn in de CatId kolom.

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

Resultaat:

(0 rows affected)

Evenzo is de laatste partitie ook leeg, omdat er niet genoeg rijen zijn om die partitie te vullen.

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

Resultaat:

(0 rows affected)

Dit is in overeenstemming met de aanbeveling van Microsoft om de eerste en laatste partitie leeg te laten, om gegevensverplaatsing te voorkomen in het geval dat de partities in de toekomst worden gesplitst of samengevoegd.


  1. Hoe koppel ik een hele dag aan een datetime-veld?

  2. Hoe meerdere databases dynamisch te gebruiken voor één model in CakePHP

  3. Omvang van tijdelijke tabellen in SQL Server

  4. MySQL-verbinding op afstand mislukt met onbekende authenticatiemethode