Wenn Sie herausfinden müssen, ob eine Tabelle in SQL Server partitioniert wurde, können Sie eine Verknüpfung mit sys.tables
ausführen , sys.indexes
und sys.partition_schemes
Aufrufe.
Beispiel
Hier ist ein Beispiel zur Veranschaulichung.
SELECT
t.name AS [Table],
i.name AS [Index],
i.type_desc,
i.is_primary_key,
ps.name AS [Partition Scheme]
FROM sys.tables t
INNER JOIN sys.indexes i
ON t.object_id = i.object_id
AND i.type IN (0,1)
INNER JOIN sys.partition_schemes ps
ON i.data_space_id = ps.data_space_id
WHERE t.name = 'Movies';
Ergebnis:
+---------+------------------------------+-------------+------------------+-----------------------+ | Table | Index | type_desc | is_primary_key | Partition Scheme | |---------+------------------------------+-------------+------------------+-----------------------| | Movies | PK__Movies__4BD2941AD44D2FCF | CLUSTERED | 1 | MoviesPartitionScheme | +---------+------------------------------+-------------+------------------+-----------------------+
Hier wird wieder die vertikale Ausgabe verwendet (damit Sie nicht seitwärts scrollen müssen):
Table | Movies Index | PK__Movies__4BD2941AD44D2FCF type_desc | CLUSTERED is_primary_key | 1 Partition Scheme | MoviesPartitionScheme
Ich gebe nur eine kleine Teilmenge der tatsächlichen Spalten zurück, aber Sie können gerne die Spalten zurückgeben, die Sie interessieren.
Sie können auch die letzte Zeile entfernen, um alle partitionierten Tabellen zurückzugeben.
SELECT
t.name AS [Table],
i.name AS [Index],
i.type_desc,
i.is_primary_key,
ps.name AS [Partition Scheme]
FROM sys.tables t
INNER JOIN sys.indexes i
ON t.object_id = i.object_id
AND i.type IN (0,1)
INNER JOIN sys.partition_schemes ps
ON i.data_space_id = ps.data_space_id;
Ergebnis:
+---------+------------------------------+-------------+------------------+-----------------------+ | Table | Index | type_desc | is_primary_key | Partition Scheme | |---------+------------------------------+-------------+------------------+-----------------------| | Movies | PK__Movies__4BD2941AD44D2FCF | CLUSTERED | 1 | MoviesPartitionScheme | +---------+------------------------------+-------------+------------------+-----------------------+
In meinem Fall gibt es nur eine partitionierte Tabelle in der Datenbank.
Nur um es klarzustellen, dies gibt nur Tabellen zurück, die explizit partitioniert wurden.
Partitionen zurückgeben
Sie können auch andere Ansichten wie sys.partitions
abfragen und sys.dm_db_partition_stats
um eine Liste der Partitionen für jede Tabelle zurückzugeben.
Beachten Sie, dass diese beiden Ansichten auch Tabellen zurückgeben, die nicht explizit partitioniert wurden (d. h. sie haben nur eine Partition). In SQL Server haben Tabellen und Ansichten, die nicht explizit partitioniert wurden, dennoch eine Partition (partition_number
=1).
Hier ist ein Beispiel für sys.dm_db_partition_stats
:
SELECT
partition_number,
row_count
FROM sys.dm_db_partition_stats
WHERE object_id = OBJECT_ID('Movies');
Ergebnis:
+--------------------+-------------+ | partition_number | row_count | |--------------------+-------------| | 1 | 0 | | 2 | 100 | | 3 | 3979 | | 4 | 0 | +--------------------+-------------+
Hier ist ein Beispiel, in dem ich die Partitionsinformationen für eine nicht partitionierte Tabelle zurückgebe.
SELECT
partition_number,
row_count
FROM sys.dm_db_partition_stats
WHERE object_id = OBJECT_ID('Cats');
Ergebnis:
+--------------------+-------------+ | partition_number | row_count | |--------------------+-------------| | 1 | 3 | +--------------------+-------------+
Wie bereits erwähnt, hat es immer noch eine Partition und ihre partition_number
ist 1
.