Як отримати список всіх розділених таблиць у моїй базі даних?


Відповіді:


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


це повернуло 50K об’єктів, і щось про це мені не походить. Ми в середині оновлення db Peoplesoft Finance від sql 2005 до 2008 R2, і, здається, новіша версія інструментів людей не підтримує розділені таблиці. Чи існує якийсь інший спосіб ідентифікації розподілених таблиць?
— РК Купала

1
@yogirk Так вибачте, друкарка там. Дивіться мою редакцію. Замість partition_idвашого пункту WHERE вам потрібно partition_number. Мої вибачення.
— Томас Стрінгер

Дякую за редагування, і я радий, що є декілька таблиць, з якими потрібно вирішити, як я очікував :)
— РК Купала

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


3
Це правильна відповідь замість 1-ї - врахування, якщо таблиця є схемою розділів ON замість файлової групи
— Олег Док

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    
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.