Database Administrators Stack Exchange is a question and answer site for database professionals who wish to improve their database skills and learn from others in the community. Join them; it only takes a minute:

Sign up
Here's how it works:
  1. Anybody can ask a question
  2. Anybody can answer
  3. The best answers are voted up and rise to the top

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

Which system tables/DMVs should I be looking at?

share|improve this question
up vote 9 down vote accepted

This query should give you what you want:

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

share|improve this answer
Wonderful! Thanks a lot!! – RK Kuppala Mar 14 '12 at 15:56
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
@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

Methinks a better query is as follows:

select object_schema_name(i.object_id) as [schema],
    object_name(i.object_id) as [object], as [index], 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.

share|improve this answer
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 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], as [table_name], as [index_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    
share|improve this answer

Your Answer


By posting your answer, you agree to the privacy policy and terms of service.

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