Jak uzyskać listę wszystkich tabel partycjonowanych w mojej bazie danych?

Odpowiedzi:

21

To zapytanie powinno dać ci to, czego chcesz:

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.partitionsWidok Katalog zawiera listę wszystkich partycji na stoły i większości indeksów. Po prostu DOŁĄCZ, sys.tablesaby uzyskać tabele.

Wszystkie tabele mają co najmniej jedną partycję, więc jeśli szukasz specjalnie tabel podzielonych na partycje, musisz odfiltrować to zapytanie na podstawie sys.partitions.partition_number <> 1(dla tabel niepartycjonowanych wartość ta partition_numberjest zawsze równa 1).

Thomas Stringer
źródło
to zwróciło 50 000 obiektów i coś w tym mi nie pasuje. Jesteśmy w trakcie aktualizacji db Peoplesoft Finance z sql 2005 do 2008 R2 i wygląda na to, że nowsza wersja narzędzi people nie obsługuje tabel partycjonowanych. Czy jest jakiś inny sposób na identyfikację porcjonowanych tabel?
RK Kuppala,
1
@yogirk Przepraszam, literówka tam. Zobacz moją edycję. Zamiast partition_idw klauzuli WHERE potrzebujesz partition_number. Przepraszam.
Thomas Stringer
Dziękuję za edycję i cieszę się, że jest kilka stolików do rozwiązania, tak jak się spodziewałem :)
RK Kuppala
@yogirk Baw się z tym!
Thomas Stringer
4
Wystąpił błąd - tabela nadal może być podzielona na partycje (przy użyciu PF i PS), ale ma jedną partycję. W przypadku tych tabel zapytanie zwraca błędne wyniki
Oleg Dok
29

Uważa, że ​​lepsze zapytanie jest następujące:

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

Spogląda na „właściwe” miejsce do identyfikacji schematu partycji: sys.partition_schemesma odpowiednią liczność (nie ma potrzeby distinct), pokazuje tylko partycjonowany obiekt (nie wymaga whereklauzuli filtrującej ), wyświetla nazwę schematu i nazwę schematu partycji. Zwróć też uwagę, jak to zapytanie uwypukla lukę w pierwotnym pytaniu: to nie tabele są podzielone na partycje, ale indeksy (i obejmuje to indeks 0 i 1, czyli kupa i indeks klastrowany). Tabela może mieć wiele indeksów, niektóre nie podzielone na partycje.

Remus Rusanu
źródło
3
To jest właściwa odpowiedź zamiast 1. - biorąc pod uwagę, że tabela jest w schemacie partycji ON zamiast grupy plików
Oleg Dok
3

A co powiesz na połączenie 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    
Gość
źródło