Как получить список всех секционированных таблиц в моей базе данных?

23

Как получить список всех секционированных таблиц в моей базе данных?

На какие системные таблицы / DMV я должен смотреть?

РК Куппала
источник

Ответы:

21

Этот запрос должен дать вам то, что вы хотите:

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).

Томас Стрингер
источник
это вернуло 50 тыс. объектов, и что-то в этом мне не подходит. Мы находимся в процессе обновления базы данных Peoplesoft Finance с sql 2005 до 2008 R2, и кажется, что более новая версия инструментов для людей не поддерживает секционированные таблицы. Есть ли другой способ идентифицировать разделенные таблицы?
Р.К.Куппала
1
@yogirk Извините, опечатка есть. Смотрите мое редактирование. Вместо того, чтобы partition_idв вашем предложении ГДЕ вам нужно partition_number. Мои извенения.
Томас Стрингер
Спасибо за редактирование, и я рад, что есть несколько таблиц для решения, как я и ожидал :)
RK Kuppala
@yogirk Удачи с этим!
Томас Стрингер
4
Здесь есть ошибка - таблица все еще может быть разделена (используя PF и PS), но с одним разделом. Таким образом, для этих таблиц запрос возвращает неверные результаты
Олег Док
29

Метинкс лучший запрос выглядит следующим образом:

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, иначе говоря, куча и кластеризованный индекс). Таблица может иметь несколько индексов, некоторые разделены, некоторые нет.

Ремус Русану
источник
3
Это правильный ответ вместо 1-го - учитывая, что в таблице включена схема разделов вместо файловой группы
Олег Док
3

Хорошо, тогда как насчет объединения 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    
гость
источник