Ако трябва да разберете дали дадена таблица е била разделена в SQL Server, можете да изпълните присъединяване срещу sys.tables
, sys.indexes
и sys.partition_schemes
изгледи.
Пример
Ето пример за демонстрация.
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';
Резултат:
+---------+------------------------------+-------------+------------------+-----------------------+ | Table | Index | type_desc | is_primary_key | Partition Scheme | |---------+------------------------------+-------------+------------------+-----------------------| | Movies | PK__Movies__4BD2941AD44D2FCF | CLUSTERED | 1 | MoviesPartitionScheme | +---------+------------------------------+-------------+------------------+-----------------------+
Тук отново се използва вертикален изход (така че да не се налага да превъртате настрани):
Table | Movies Index | PK__Movies__4BD2941AD44D2FCF type_desc | CLUSTERED is_primary_key | 1 Partition Scheme | MoviesPartitionScheme
Връщам само малка част от действителните колони, но не се колебайте да върнете колоните, които ви интересуват.
Освен това можете да премахнете последния ред, за да върнете всички разделени таблици.
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;
Резултат:
+---------+------------------------------+-------------+------------------+-----------------------+ | Table | Index | type_desc | is_primary_key | Partition Scheme | |---------+------------------------------+-------------+------------------+-----------------------| | Movies | PK__Movies__4BD2941AD44D2FCF | CLUSTERED | 1 | MoviesPartitionScheme | +---------+------------------------------+-------------+------------------+-----------------------+
В моя случай има само една разделена таблица в базата данни.
Само за да е ясно, това връща само таблици, които са били изрично разделени.
Върнете дяловете
Можете също да заявите други изгледи, като sys.partitions
и sys.dm_db_partition_stats
за да върнете списък с дяловете за всяка таблица.
Обърнете внимание, че и двата изгледа също ще връщат таблици, които не са изрично разделени (т.е. имат само един дял). В SQL Server таблиците и изгледите, които не са били изрично разделени, все още имат дял (partition_number
=1).
Ето пример за sys.dm_db_partition_stats
:
SELECT
partition_number,
row_count
FROM sys.dm_db_partition_stats
WHERE object_id = OBJECT_ID('Movies');
Резултат:
+--------------------+-------------+ | partition_number | row_count | |--------------------+-------------| | 1 | 0 | | 2 | 100 | | 3 | 3979 | | 4 | 0 | +--------------------+-------------+
Ето пример, в който връщам информацията за дяла за неразделена таблица.
SELECT
partition_number,
row_count
FROM sys.dm_db_partition_stats
WHERE object_id = OBJECT_ID('Cats');
Резултат:
+--------------------+-------------+ | partition_number | row_count | |--------------------+-------------| | 1 | 3 | +--------------------+-------------+
Както споменахме, той все още има един дял и неговия partition_number
е 1
.