Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Abrufen der Grenzwerte für eine partitionierte Tabelle in SQL Server (T-SQL)

In SQL Server können Sie die sys.partition_range_values verwenden Systemkatalogansicht, um die für eine partitionierte Tabelle verwendeten Grenzwerte herauszufinden.

Sie müssen jedoch die function_id kennen der Partitionsfunktion, bevor Sie diese Ansicht verwenden.

Aber wie immer können Sie einen Join mit einer Reihe anderer Tische ausführen, um die gewünschten Informationen zu erhalten.

sys.partition_range_values

Sehen wir uns zunächst an, welche Spalten die sys.partition_range_values enthalten Rücksendungen anzeigen.

 SELECT * FROM sys.partition_range_values; 

Ergebnis:

+----------+---------------+------------- --+---------+| Funktions-ID | border_id | parameter_id | Wert ||---------------+---------------+--------------- -+---------|| 65542 | 1 | 1 | -1 || 65542 | 2 | 1 | 100 || 65542 | 3 | 1 | 10000 |+---------------+---------------+--------------- -+---------+

Zu meinem Glück habe ich nur eine partitionierte Tabelle in dieser Datenbank, sodass ich nicht mit Ergebnissen bombardiert werde.

Wie bereits erwähnt, gibt diese Ansicht die function_id zurück , sodass wir das verwenden können, um eine Reihe anderer Tabellen zu verbinden, sodass wir Daten für eine bestimmte Tabelle zurückgeben können.

In meinem Fall ist dies überflüssig, da es nur eine partitionierte Tabelle gibt, aber nehmen wir an, Sie haben eine ganze Menge partitionierter Heaps und Indizes und möchten sie nur eingrenzen.

Grenzen Sie es auf eine Tabelle ein

Hier ist ein Beispiel für die Rückgabe der Grenzbereiche für eine bestimmte Tabelle namens 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; 

Ergebnis:

+--------------------+---------------+--------- ---------+| Partitionsnummer | border_id | Grenzwert ||--------------------+---------------+--------- ---------|| 1 | 1 | -1 || 2 | 2 | 100 || 3 | 3 | 10000 || 4 | NULL | NULL |+--------------------+----------+---------- --------+

Hier ist es wieder, aber wir erweitern die Auswahlliste um weitere Informationen, wie den Indexnamen, den Namen der Partitionsfunktion usw.

 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; 

Ergebnis:

+---------+------------------------------+----- ------------------------------------+-------- -------+------------------+| Tabelle | Index | Partitionsnummer | Name | border_id | Grenzwert ||---------+------------------------------+----- ------------------------------------+-------- -------+------------------|| Filme | PK__Filme__4BD2941AD44D2FCF | 1 | MoviesPartitionFunction | 1 | -1 || Filme | PK__Filme__4BD2941AD44D2FCF | 2 | MoviesPartitionFunction | 2 | 100 || Filme | PK__Filme__4BD2941AD44D2FCF | 3 | MoviesPartitionFunction | 3 | 10000 || Filme | PK__Filme__4BD2941AD44D2FCF | 4 | MoviesPartitionFunction | NULL | NULL |+---------+------------------------------+------ --------------+-------------------------+--------- ------+------------------+

Hier ist das Ergebnis noch einmal mit vertikaler Ausgabe (damit Sie nicht seitwärts scrollen müssen):

-[ RECORD 1 ]-------------------------Tabelle | FilmeIndex | PK__Movies__4BD2941AD44D2FCFPartitionsnummer | 1Name | MoviesPartitionFunctionboundary_id | 1Grenzwert | -1-[ RECORD 2 ]-------------------------Tabelle | FilmeIndex | PK__Movies__4BD2941AD44D2FCFPartitionsnummer | 2name | MoviesPartitionFunctionboundary_id | 2Grenzwert | 100-[ RECORD 3 ]-------------------------Tabelle | FilmeIndex | PK__Movies__4BD2941AD44D2FCFPartitionsnummer | 3Name | MoviesPartitionFunctionboundary_id | 3Grenzwert | 10000-[ RECORD 4 ]-------------------------Tabelle | FilmeIndex | PK__Movies__4BD2941AD44D2FCFPartitionsnummer | 4Name | MoviesPartitionFunctionboundary_id | NULLGrenzwert | NULL