How do I get a list of all the partitioned tables in my database?

Which system tables/DMVs should I be looking at?


This query should give you what you want:

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

The sys.partitions catalog view gives a list of all partitions for tables and most indexes. Just JOIN that with sys.tables to get the tables.

All tables have at least one partition, so if you are looking specifically for partitioned tables, then you'll have to filter this query based off of sys.partitions.partition_number <> 1 (for non-partitioned tables, the partition_number is always equal to 1).

  • this returned 50K objects and something about it doesn't feel right to me. We are in the middle of a Peoplesoft Finance db upgrade from sql 2005 to 2008 R2 and it seems the newer version of people tools doesn't support partitioned tables. Is there any other way to identify the portioned tables? – RK Kuppala Mar 14 '12 at 16:32
  • 1
    @yogirk So sorry, typo there. See my edit. Instead of partition_id in your WHERE clause you need partition_number. My apologies. – Thomas Stringer Mar 14 '12 at 17:01
  • Thanks for the edit and I am glad there are few tables to tackle, just like I expected :) – RK Kuppala Mar 14 '12 at 17:10
  • @yogirk Have fun with that! – Thomas Stringer Mar 14 '12 at 17:20
  • 4
    There is an error here - table is still can be partitioned (using PF and PS) but having single partition. So for those tables the query returns wrong results – Oleg Dok Feb 16 '16 at 12:42

Methinks a better query is as follows:

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

This looks at the 'proper' place to identify the partition scheme: sys.partition_schemes, it has the right cardinality (no need for distinct), it shows only partitioned object (no need for a filtering where clause), it projects the schema name and partition scheme name. Note also how this query highlights a flaw on the original question: it is not tables that are partitioned, but indexes (and this includes index 0 and 1, aka. heap and clustered index). A table can have multiple indexes, some partitioned some not.

  • 3
    This is the right answer instead of the 1st one - taking into account if the table is ON partition scheme instead of filegroup – Oleg Dok Feb 16 '16 at 12:44

Well, then how about combining the 2:

    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    

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.