31

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

Which system tables/DMVs should I be looking at?

4 Answers 4

30

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

6
  • 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
    Commented Mar 14, 2012 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. Commented Mar 14, 2012 at 17:01
  • Thanks for the edit and I am glad there are few tables to tackle, just like I expected :)
    – RK Kuppala
    Commented Mar 14, 2012 at 17:10
  • @yogirk Have fun with that! Commented Mar 14, 2012 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
    Commented Feb 16, 2016 at 12:42
35

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.

1
  • 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
    Commented Feb 16, 2016 at 12:44
3

Well, then how about combining the 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    
0
1

I found this article while searching for this type of script and worked from a few resources to create these from a SQL 2019 server.

-- List partitioned tables (excluding system tables)

SELECT DISTINCT so.name
FROM sys.partitions sp
       JOIN sys.objects so ON so.object_id = sp.object_id
       where name NOT LIKE 'sys%' and name NOT LIKE 'sqla%' and name NOT LIKE 'plan%' 
       and name NOT LIKE 'persistent%' and name NOT LIKE 'queue_messages%'
       and name NOT LIKE 'ifts%' and name NOT LIKE 'fulltext%'
       ORDER BY name


-- List partitioned tables and partition information (excluding system tables)

SELECT so.name
      ,[partition_id]
      ,sp.[object_id]
      ,[index_id]
      ,[partition_number]
      ,[hobt_id]
      ,[rows]
      ,[filestream_filegroup_id]
      ,[data_compression]
      ,[data_compression_desc]
  FROM sys.partitions sp
       JOIN sys.objects so ON so.object_id = sp.object_id
       where name NOT LIKE 'sys%' and name NOT LIKE 'sqla%' and name NOT LIKE 'plan%' 
       and name NOT LIKE 'persistent%' and name NOT LIKE 'queue_messages%'
       and name NOT LIKE 'ifts%' and name NOT LIKE 'fulltext%'
       ORDER BY name

I hope they are helpful.

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