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


Відповіді:


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.