如何获得数据库中所有分区表的列表?

我应该看哪个系统表/ DMV?

#1 楼

此查询应为您提供所需的信息:

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

评论


这返回了5万个对象,而这对我来说感觉不对。我们正在将Peoplesoft Finance数据库从sql 2005升级到2008 R2,似乎新版本的人员工具不支持分区表。还有其他方法可以识别分表吗?

–RK库帕拉
2012年3月14日下午16:32

@yogirk很抱歉,那里的错字。看到我的编辑。而不是WHERE子句中的partition_id,您需要partition_number。我很抱歉。

–托马斯·斯金格
2012年3月14日在17:01

谢谢您的编辑,我很高兴能处理几个表格,就像我期望的那样:)

–RK库帕拉
2012年3月14日17:10

@yogirk玩得开心!

–托马斯·斯金格
2012年3月14日17:20

这里有一个错误-表仍然可以进行分区(使用PF和PS),但是具有单个分区。因此,对于那些表,查询返回错误的结果

–Oleg Dok
16-2-16在12:42

#2 楼

更好的查询方法如下:

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,也就是堆索引和聚集索引)。一个表可以有多个索引,有些分区没有索引。

评论


这是正确的答案,而不是第一个答案-考虑到表是否为ON分区方案而不是文件组

–Oleg Dok
16年2月16日在12:44

#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