ฉันจะตีความผลลัพธ์ของ DMV เหล่านี้เพื่อช่วยฉันประเมินกลยุทธ์การแบ่งพาร์ติชันของเราได้อย่างไร


12

เวอร์ชัน: SQL Server 2008 R2 Enterprise Edtn (10.50.4000)

ในความพยายามที่จะประเมินกลยุทธ์การแบ่งพาร์ติชันของฉันฉันเขียนแบบสอบถามนี้เพื่อรับวิธีการเข้าถึงกับดัชนีในพาร์ติชัน (ในความหมายกว้างที่สุดของคำแม้ว่าฉันจะกำจัดกอง) ในขณะที่ฉัน จำกัด การโฟกัสไปที่ตารางที่แบ่งพาร์ติชันฉันเชื่อว่าฉันต้องมองrange_scan_countและsingleton_lookup_countแต่ก็มีช่วงเวลาที่ยากลำบากในการกำหนดแนวคิด

SELECT 
    t.name AS table_name,
    i.name AS index_name,
    ios.partition_number, 
    leaf_insert_count,
    leaf_delete_count,
    leaf_update_count,
    leaf_ghost_count,
    range_scan_count,
    singleton_lookup_count,
    page_latch_wait_count ,
    page_latch_wait_in_ms,
    row_lock_count ,
    page_lock_count,
    row_lock_wait_in_ms ,
    page_lock_wait_in_ms,
    page_io_latch_wait_count ,
    page_io_latch_wait_in_ms
FROM sys.dm_db_partition_stats ps
    JOIN sys.tables t 
        ON ps.object_id = t.object_id
    JOIN sys.schemas s 
        ON t.schema_id = s.schema_id
    JOIN sys.indexes i 
        ON t.object_id = i.object_id
    AND ps.index_id = i.index_id
OUTER APPLY sys.dm_db_index_operational_stats(DB_ID(), NULL, NULL, NULL) ios                            
WHERE   
    ps.object_id = ios.object_id
    AND ps.index_id = ios.index_id
    AND ps.partition_number = ios.partition_number
    and ps.index_id = ios.index_id
    and ps.partition_number = ios.partition_number                                  
    and s.name <> 'sys'     
    and ps.index_id <> 0 ;

เอาต์พุตที่เกี่ยวข้อง (เนื่องจากช่องว่างในการจัดรูปแบบตารางของ SO นี่เป็นตัวอย่างของคอลัมน์ 9 คอลัมน์แรกจากแบบสอบถามด้านบนโดยมีสองคอลัมน์สุดท้ายอยู่range_scan_countและsingleton_lookup_countตามลำดับ):

╔════════╦═════════════════╦════╦═══╦═══╦═══╦═══╦════════╦══════════╗
 datetb  idx_datetb_col    1  0  0  0  0  205740   3486408 
 datetb  idx_datetb_col    2  0  0  0  0   29617   1079649 
 datetb  idx_datetb_col    3  0  0  0  0   29617   1174547 
 datetb  idx_datetb_col    4  0  0  0  0   29617   2952991 
 datetb  idx_datetb_col    5  0  0  0  0   29617   3974886 
 datetb  idx_datetb_col    6  0  0  0  0   29617   2931450 
 datetb  idx_datetb_col    7  0  0  0  0   29617   3316960 
 datetb  idx_datetb_col    8  0  0  0  0   29617   3393439 
 datetb  idx_datetb_col    9  0  0  0  0   29617   3735495 
 datetb  idx_datetb_col   10  0  0  0  0   29617   4803804 
 datetb  idx_datetb_col   11  0  0  0  0   29617   7655091 
 datetb  idx_datetb_col   12  1  0  0  0  174326  47377226 
╚════════╩═════════════════╩════╩═══╩═══╩═══╩═══╩════════╩══════════╝

ฉันเห็นความเป็นไปได้ที่แตกต่างกันเล็กน้อย แต่ฉันต้องการทิศทางเกี่ยวกับวิธีคิดเกี่ยวกับสิ่งนี้ (แน่นอนว่าฉันกำลังใช้วิธีนี้ในการ " อาจ " เพราะฉันรู้ว่า "มันขึ้นอยู่กับ" แต่ฉันก็กำลังมองหาความเข้าใจทางแนวคิดด้วย)

  1. ค่าที่คล้ายกันสำหรับพาร์ติชันทั้งหมดrange_scan_count อาจบ่งบอกว่าเราไม่ได้รับการกำจัดพาร์ติชันที่ดีเพราะเราสแกนพาร์ทิชันทั้งหมดในจำนวนเท่า ๆ กัน
  2. ค่าที่แตกต่างกันสำหรับพาร์ติชันทั้งหมดที่singleton_lookup_countมาพร้อมกับค่าที่ต่ำกว่าอย่างมากสำหรับrange_scan_count อาจบ่งบอกถึงการกำจัดพาร์ติชันที่ดีเนื่องจากเรากำลังสแกนน้อยกว่าที่เรากำลังค้นหา
  3. ?

นี่คือความคิดของฉัน ฉันหวังว่าจะมีใครบางคนชั่งน้ำหนักเกี่ยวกับวิธีที่ฉันสามารถใช้ข้อมูลนี้หรือชุดข้อมูลอื่นเพื่อพิจารณาว่าตารางใดน่าจะได้รับประโยชน์มากที่สุดจากการแบ่งพาร์ติชันตามดัชนี

แก้ไข

นี่คือ DDL ที่ถูกตัด:

CREATE TABLE [dbo].[date_table](
    [date_id] [int] NOT NULL,
    [calendar_date] [datetime] NULL,
    [valdate] [datetime] NULL,
        CONSTRAINT [PK_datedb] PRIMARY KEY CLUSTERED 
        (
            [date_id] ASC
        ) ON [partschm]([date_id]);

CREATE UNIQUE NONCLUSTERED INDEX [idx_datetb_col] ON [dbo].[date_table]
(
    [calendar_date] DESC,
    [date_id] ASC
) ON [partschm]([date_id])
GO

คุณสามารถแก้ไขคำถามเพื่อรวมตารางสคีมาได้หรือไม่ การตีความใด ๆ จะต้องขึ้นอยู่กับความหมายทางธุรกิจของการแบ่ง
Jon Seigel

@ JonSeigel ฉันยินดีที่จะทำเช่นนั้น แต่มันจะส่งผลให้มีกำแพงรหัสดังนั้นฉันอัปเดตด้วย clipped เทียบเท่า
swasheck

คำตอบ:


4

แทนที่จะดูการใช้ดัชนีฉันจะดูแคชแผนเพื่อค้นหาข้อความค้นหาของคุณด้วยจำนวนการอ่านเชิงตรรกะสูงสุด โดยปกติเมื่อฉันจัดการกับการแบ่งพาร์ติชันฉันพบเพียงไม่กี่คำสั่งที่ครอบครองอ่าน - เช่น 50-80% ของเซิร์ฟเวอร์อ่านโดยรวม ตรวจสอบข้อความค้นหาเหล่านั้นเพื่อดูว่าพวกเขาทำการกำจัดพาร์ติชันได้สำเร็จหรือไม่

หากพวกเขาไม่ได้ทำการกำจัดพาร์ติชัน แต่คุณคิดว่าควร (ขึ้นอยู่กับชุดรูปแบบพาร์ติชันของคุณ) จากนั้นทำงานร่วมกับตัวเขียนคิวรีเพื่อรับการกำจัดพาร์ติชัน

หากพวกเขาไม่ได้กำจัดพาร์ติชันและพวกเขาไม่สามารถ (เพราะวิธีการเขียนแบบสอบถามหรือพาร์ทิชันได้รับการออกแบบ) แล้วก็ถึงเวลาที่จะเริ่มถามคำถามยาก

หากเคียวรีการอ่านเชิงตรรกะที่ใหญ่ที่สุดไม่มีส่วนเกี่ยวข้องกับตารางที่แบ่งพาร์ติชันของคุณให้ย้ายไปและมุ่งเน้นไปที่คิวรีอื่น ๆ แทน


@swasheck คุณเดิมพัน! ดีใจที่ฉันสามารถช่วย
Brent Ozar
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.