ฉันจะรับรายการตารางที่แบ่งพาร์ติชันทั้งหมดในฐานข้อมูลของฉันได้อย่างไร


คำตอบ:


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 เสมอ)


สิ่งนี้คืนค่าวัตถุ 50K และบางสิ่งเกี่ยวกับมันไม่ได้รู้สึกถูกต้องสำหรับฉัน เรากำลังอยู่ระหว่างการอัพเกรดฐานข้อมูล Peoplesoft Finance จาก sql 2005 เป็น 2008 R2 และดูเหมือนว่าเครื่องมือสำหรับคนรุ่นใหม่จะไม่สนับสนุนตารางที่แบ่งพาร์ติชัน มีวิธีอื่นในการระบุตารางที่แบ่งส่วนหรือไม่?
RK Kuppala

1
@yogirk ขอโทษที่พิมพ์ผิดที่นั่น ดูการแก้ไขของฉัน แทนที่จะpartition_idในคำสั่ง WHERE partition_numberของคุณที่คุณต้องการ ขอโทษด้วย.
Thomas Stringer

ขอขอบคุณสำหรับการแก้ไขและฉันดีใจที่มีไม่กี่ตารางที่จะแก้ไขปัญหาเช่นเดียวกับที่ผมคาดไว้ :)
RK Kuppala

@yogirk ขอให้สนุกกับสิ่งนั้น!
Thomas Stringer

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, aka. heap และดัชนีคลัสเตอร์) ตารางสามารถมีดัชนีได้หลายดัชนีบางพาร์ติชั่นบางอย่างไม่มี


3
นี่คือคำตอบที่ถูกต้องแทนที่จะเป็นข้อที่ 1 โดยคำนึงถึงว่าตารางอยู่ในรูปแบบการจัดสรรพาร์ติชันแทนการจัดกลุ่มไฟล์
Oleg Dok

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    
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.