Wie kann ich die Ergebnisse dieser DMVs interpretieren, um unsere Partitionierungsstrategie zu bewerten?

12

Version: SQL Server 2008 R2 Enterprise Edition. (10.50.4000)

Bei dem Versuch, unsere Partitionierungsstrategie zu evaluieren, habe ich diese Abfrage geschrieben, um die Zugriffsmethoden für Indizes auf Partitionen abzurufen (im weitesten Sinne des Wortes, obwohl ich Haufen eliminiere). Als ich meinen Fokus auf partitionierten Tabellen verengen, ich glaube , ich brauche auf zu suchen range_scan_countund singleton_lookup_countaber eine harte Zeit Konzeptionierung habe.

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 ;

Relevante Ausgabe (angesichts der Lücke in der Formatierung von Tabellen in SO ist dies ein Beispiel für die ersten 9 Spalten der obigen Abfrage, wobei die letzten beiden Spalten range_scan_countund singleton_lookup_countsind):

╔════════╦═════════════════╦════╦═══╦═══╦═══╦═══╦════════╦══════════╗
 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 
╚════════╩═════════════════╩════╩═══╩═══╩═══╩═══╩════════╩══════════╝

Ich sehe ein paar andere Möglichkeit , aber ich brauche eine Richtung auf , wie um darüber nachzudenken (natürlich bin ich couching dies in „ kann “ , weil ich weiß , dass „es kommt“, aber ich bin auch für die konzeptionelle Verständnis suchen):

  1. Ähnliche Werte für alle Partitionen von weisen range_scan_count möglicherweise darauf hin, dass wir keine gute Partitionseliminierung erhalten, da wir alle Partitionen ungefähr gleich oft scannen.
  2. Unterschiedliche Werte für alle Partitionen singleton_lookup_countund deutlich niedrigere Werte für range_scan_count können auf eine gute häufige Entfernung von Partitionen hinweisen, da weniger gescannt wird, als wir suchen.
  3. ?

Das sind meine bisherigen Gedanken. Ich hatte gehofft, dass jemand darüber nachdenkt, wie ich anhand dieser oder anderer Informationen bestimmen kann, welche Tabellen am wahrscheinlichsten davon profitieren würden, wenn die Partitionierung zugunsten von Indizes insgesamt fallen gelassen würde.

BEARBEITEN

Hier ist eine abgeschnittene 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
Swasheck
quelle
Könnten Sie die Frage so bearbeiten, dass sie das Tabellenschema enthält? Jede Interpretation muss von der geschäftlichen Bedeutung der Partitionierung abhängen.
Jon Seigel
@ JonSeigel Ich würde das gerne tun, aber es würde zu einer Code-Wand führen, also aktualisiere ich mit einem abgeschnittenen Äquivalent
swasheck

Antworten:

4

Anstatt die Indexauslastung zu untersuchen, würde ich den Plan-Cache untersuchen, um Ihre Abfragen mit den meisten logischen Lesevorgängen zu finden. Wenn ich mit Partitionierung zu tun habe, finde ich normalerweise nur eine Handvoll Abfragen, die die Lesevorgänge dominieren - etwa 50-80% der gesamten Lesevorgänge der Server. Überprüfen Sie diese Abfragen, um festzustellen, ob sie die Partitionsbeseitigung erfolgreich durchführen.

Wenn sie keine Partition entfernen, dies aber Ihrer Meinung nach tun sollten (basierend auf Ihrem Partitionsschema), arbeiten Sie mit den Abfrageerstellern zusammen, um die Partition zu entfernen.

Wenn sie keine Partitionen entfernen und dies nicht können (aufgrund der Art und Weise, wie die Abfrage geschrieben oder die Partition entworfen wurde), ist es an der Zeit, schwierige Fragen zu stellen.

Wenn die größten logischen Leseabfragen nichts mit Ihrer partitionierten Tabelle zu tun haben, fahren Sie fort und konzentrieren Sie sich stattdessen auf diese anderen Abfragen.

Brent Ozar
quelle
@swasheck Wetten Sie? Froh, dass ich helfen konnte.
Brent Ozar