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

Herausfinden, ob eine Tabelle in SQL Server (T-SQL) partitioniert ist

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 .