¿Cómo obtengo una lista de todas las tablas particionadas en mi base de datos?


Respuestas:


21

Esta consulta debería darte lo que quieres:

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

La sys.partitionsvista de catálogo proporciona una lista de todas las particiones para tablas y la mayoría de los índices. Solo únete a eso sys.tablespara obtener las mesas.

Todas las tablas tienen al menos una partición, por lo que si está buscando específicamente tablas particionadas, tendrá que filtrar esta consulta en función de sys.partitions.partition_number <> 1(para tablas no particionadas, partition_numbersiempre es igual a 1).


esto devolvió 50K objetos y algo al respecto no me parece correcto. Estamos en medio de una actualización de db de Peoplesoft Finance de sql 2005 a 2008 R2 y parece que la versión más nueva de las herramientas de personas no admite tablas particionadas. ¿Hay alguna otra forma de identificar las tablas divididas?
RK Kuppala

1
@yogirk Lo siento, error tipográfico allí. Mira mi edición. En lugar de partition_iden su cláusula WHERE que necesita partition_number. Mis disculpas.
Thomas Stringer

Gracias por la edición y me alegra que haya pocas mesas para abordar, tal como esperaba :)
RK Kuppala

@yogirk ¡Diviértete con eso!
Thomas Stringer

44
Aquí hay un error: la tabla todavía se puede particionar (usando PF y PS) pero con una sola partición. Entonces, para esas tablas, la consulta arroja resultados incorrectos
Oleg Dok

29

Creo que una mejor consulta es la siguiente:

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

Esto busca el lugar 'adecuado' para identificar el esquema de partición: sys.partition_schemestiene la cardinalidad correcta (no es necesario distinct), muestra solo el objeto particionado (no es necesario una wherecláusula de filtrado ), proyecta el nombre del esquema y el nombre del esquema de partición. Observe también cómo esta consulta resalta una falla en la pregunta original: no son las tablas las que están particionadas, sino los índices (y esto incluye el índice 0 y 1, también conocido como montón e índice agrupado). Una tabla puede tener múltiples índices, algunos particionados y otros no.


3
Esta es la respuesta correcta en lugar de la primera, teniendo en cuenta si la tabla está en el esquema de partición ON en lugar del grupo de archivos
Oleg Dok

3

Bueno, entonces ¿qué tal combinar los 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    
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.