sql >> Database teknologi >  >> RDS >> Sqlserver

Returner alle rækker fra en specifik partition i SQL Server (T-SQL)

Når du opretter en partitioneret tabel i SQL Server, angiver du, hvilke værdier der skal ind i hver partition.

Dette gøres, når du opretter partitionsfunktionen. Når du opretter partitionsfunktionen, angiver du grænseværdier, som bestemmer, hvilke værdier der går ind i hver partition.

Når du har oprettet din opdelte tabel, og du har indsat data, kan du køre en normal SELECT sætning for at returnere data, ligesom du ville gøre med en ikke-opdelt tabel (faktisk har selv ikke-opdelte tabeller én partition).

Men vidste du, at du også kan angive, hvilken partition du vil have data fra?

Du kan gøre dette ved hjælp af $PARTITION systemfunktion i din WHERE klausul.

Eksempel

Forestil dig, at vi har en opdelt tabel, der indeholder følgende data:

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

Og CatId er partitioneringskolonnen.

Og vi brugte følgende partitionsfunktion til at oprette dens partitioner:

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

Dette fortæller os, hvordan dataene er lagret i henhold til værdierne i partitioneringskolonnen.

Så vi kan nu køre en forespørgsel, der kun returnerer data fra en bestemt partition.

Returner data fra den anden partition

Sådan kan vi returnere alle rækker fra den anden partition.

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

Resultat:

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

Returner data fra den tredje partition

Og her er alle data fra den tredje partition.

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

Resultat:

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

Returner data fra den første og sidste partition

I dette tilfælde er min første partition tom, fordi der ikke er nogen negative værdier i CatId kolonne.

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

Resultat:

(0 rows affected)

På samme måde er den sidste partition også tom, fordi der ikke er nok rækker til at udfylde den partition.

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

Resultat:

(0 rows affected)

Dette overholder Microsofts anbefaling om at lade den første og sidste partition være tomme for at undgå enhver dataflytning i tilfælde af, at partitionerne opdeles eller flettes i fremtiden.


  1. Højere kardinalitetskolonne først i et indeks, når det involverer et interval?

  2. Tilslutning til en tabel baseret på kommaseparerede værdier

  3. Android - opdater klientens sqlite-database ved hjælp af GCM

  4. Sådan bruger du skabeloner i SQL Server Management Studio (SSMS) - SQL Server / TSQL Tutorial Del 16