Як отримати список всіх розділених таблиць у моїй базі даних?
На які системні таблиці / DMV слід дивитись?
Як отримати список всіх розділених таблиць у моїй базі даних?
На які системні таблиці / DMV слід дивитись?
Відповіді:
Цей запит повинен дати вам те, що ви хочете:
select distinct t.name
from sys.partitions p
inner join sys.tables t
on p.object_id = t.object_id
where p.partition_number <> 1
У sys.partitions
поданні каталогу подано список усіх розділів для таблиць та більшості індексів. Просто ПРИЄДНАЙТЕСЬ з цим, sys.tables
щоб отримати столи.
Усі таблиці мають принаймні один розділ, тому якщо ви шукаєте спеціально для розділених таблиць, вам доведеться відфільтрувати цей запит на основі sys.partitions.partition_number <> 1
(для нерозподілених таблиць значення partition_number
завжди дорівнює 1).
partition_id
вашого пункту WHERE вам потрібно partition_number
. Мої вибачення.
Розгляньте кращий запит наступним чином:
select object_schema_name(i.object_id) as [schema],
object_name(i.object_id) as [object],
i.name as [index],
s.name as [partition_scheme]
from sys.indexes i
join sys.partition_schemes s on i.data_space_id = s.data_space_id
Це дивиться на "належне" місце для ідентифікації схеми розділів: sys.partition_schemes
вона має правильну кардинальність (не потрібно distinct
), вона показує лише розділений об'єкт (немає необхідності у фільтрувальному where
пункті), він проектує ім'я схеми та ім'я схеми розділу. Зауважте також, як цей запит підкреслює недолік у вихідному запитанні: це не розділені таблиці , а індекси (і це включає індекс 0 і 1, також. Heap та кластерний індекс). Таблиця може мати кілька індексів, деякі розділені, а деякі ні.
Ну, а як тоді поєднувати 2:
select
object_schema_name(i.object_id) as [schema],
object_name(i.object_id) as [object_name],
t.name as [table_name],
i.name as [index_name],
s.name as [partition_scheme]
from sys.indexes i
join sys.partition_schemes s on i.data_space_id = s.data_space_id
join sys.tables t on i.object_id = t.object_id