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


Answers:


21

该查询应该给您您想要的:

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 Kuppala 2012年

1
@yogirk很抱歉,那里的错字。看到我的编辑。而不是partition_id在WHERE子句中,你需要partition_number。我很抱歉。
Thomas Stringer 2012年

感谢您的编辑,我很高兴能处理很少的表格,就像我期望的那样:)
RK Kuppala 2012年

@yogirk玩得开心!
Thomas Stringer 2012年

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

29

方法认为更好的查询如下:

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


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

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    
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.