sql >> Database >  >> RDS >> Sqlserver

De grenswaarden ophalen voor een gepartitioneerde tabel in SQL Server (T-SQL)

In SQL Server kunt u de sys.partition_range_values . gebruiken systeemcatalogusweergave om de grenswaarden te vinden die worden gebruikt voor een gepartitioneerde tabel.

U moet echter de function_id . weten van de partitiefunctie voordat u die weergave gebruikt.

Maar zoals altijd kun je een join uitvoeren tegen een heleboel andere tafels om de gewenste informatie te krijgen.

sys.partition_range_values

Laten we eerst eens kijken welke kolommen de sys.partition_range_values bekijk retouren.

 SELECT * FROM sys.partition_range_values;

Resultaat:

+---------------+---------------+----------------+---------+
| function_id   | boundary_id   | parameter_id   | value   |
|---------------+---------------+----------------+---------|
| 65542         | 1             | 1              | -1      |
| 65542         | 2             | 1              | 100     |
| 65542         | 3             | 1              | 10000   |
+---------------+---------------+----------------+---------+

Gelukkig voor mij heb ik maar één gepartitioneerde tabel in deze database, dus ik word niet gebombardeerd met resultaten.

Zoals vermeld, retourneert deze weergave de function_id , zodat we dat kunnen gebruiken om een ​​aantal andere tabellen samen te voegen, zodat we gegevens voor een specifieke tabel kunnen retourneren.

In mijn geval is dit overbodig, aangezien er maar één gepartitioneerde tabel is, maar laten we aannemen dat je een heleboel gepartitioneerde heaps en indexen hebt, en je wilt het gewoon beperken.

Beperk het tot een tabel

Hier is een voorbeeld van het retourneren van de grensbereiken voor een specifieke tabel met de naam Movies .

SELECT 
    p.partition_number,
    r.boundary_id, 
    r.value AS [Boundary Value]   
FROM sys.tables AS t  
JOIN sys.indexes AS i  
    ON t.object_id = i.object_id  
JOIN sys.partitions AS p
    ON i.object_id = p.object_id AND i.index_id = p.index_id   
JOIN  sys.partition_schemes AS s   
    ON i.data_space_id = s.data_space_id  
JOIN sys.partition_functions AS f   
    ON s.function_id = f.function_id  
LEFT JOIN sys.partition_range_values AS r   
    ON f.function_id = r.function_id and r.boundary_id = p.partition_number  
WHERE i.type <= 1 AND t.name = 'Movies' 
ORDER BY p.partition_number ASC;

Resultaat:

+--------------------+---------------+------------------+
| partition_number   | boundary_id   | Boundary Value   |
|--------------------+---------------+------------------|
| 1                  | 1             | -1               |
| 2                  | 2             | 100              |
| 3                  | 3             | 10000            |
| 4                  | NULL          | NULL             |
+--------------------+---------------+------------------+

Hier is het weer, maar we breiden de selectielijst uit met andere informatie, zoals de indexnaam, de naam van de partitiefunctie, enz.

 SELECT 
    t.name AS [Table], 
    i.name AS [Index], 
    p.partition_number,
    f.name,
    r.boundary_id, 
    r.value AS [Boundary Value]   
FROM sys.tables AS t  
JOIN sys.indexes AS i  
    ON t.object_id = i.object_id  
JOIN sys.partitions AS p
    ON i.object_id = p.object_id AND i.index_id = p.index_id   
JOIN  sys.partition_schemes AS s   
    ON i.data_space_id = s.data_space_id  
JOIN sys.partition_functions AS f   
    ON s.function_id = f.function_id  
LEFT JOIN sys.partition_range_values AS r   
    ON f.function_id = r.function_id and r.boundary_id = p.partition_number  
WHERE i.type <= 1 AND t.name = 'Movies' 
ORDER BY p.partition_number ASC;

Resultaat:

+---------+------------------------------+--------------------+-------------------------+---------------+------------------+
| Table   | Index                        | partition_number   | name                    | boundary_id   | Boundary Value   |
|---------+------------------------------+--------------------+-------------------------+---------------+------------------|
| Movies  | PK__Movies__4BD2941AD44D2FCF | 1                  | MoviesPartitionFunction | 1             | -1               |
| Movies  | PK__Movies__4BD2941AD44D2FCF | 2                  | MoviesPartitionFunction | 2             | 100              |
| Movies  | PK__Movies__4BD2941AD44D2FCF | 3                  | MoviesPartitionFunction | 3             | 10000            |
| Movies  | PK__Movies__4BD2941AD44D2FCF | 4                  | MoviesPartitionFunction | NULL          | NULL             |
+---------+------------------------------+--------------------+-------------------------+---------------+------------------+

Hier is dat resultaat opnieuw met verticale uitvoer (zodat u niet zijwaarts hoeft te scrollen):

-[ RECORD 1 ]-------------------------
Table            | Movies
Index            | PK__Movies__4BD2941AD44D2FCF
partition_number | 1
name             | MoviesPartitionFunction
boundary_id      | 1
Boundary Value   | -1
-[ RECORD 2 ]-------------------------
Table            | Movies
Index            | PK__Movies__4BD2941AD44D2FCF
partition_number | 2
name             | MoviesPartitionFunction
boundary_id      | 2
Boundary Value   | 100
-[ RECORD 3 ]-------------------------
Table            | Movies
Index            | PK__Movies__4BD2941AD44D2FCF
partition_number | 3
name             | MoviesPartitionFunction
boundary_id      | 3
Boundary Value   | 10000
-[ RECORD 4 ]-------------------------
Table            | Movies
Index            | PK__Movies__4BD2941AD44D2FCF
partition_number | 4
name             | MoviesPartitionFunction
boundary_id      | NULL
Boundary Value   | NULL


  1. Hoe maak je een gepartitioneerde PostgreSQL-reeks?

  2. SQL DROP TABLE-instructie en verschillende gebruiksscenario's

  3. Aantal(*) versus Aantal(1) - SQL Server

  4. het isoleren van een subtekenreeks in een tekenreeks vóór een symbool in SQL Server 2008