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_count
und singleton_lookup_count
aber 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_count
und singleton_lookup_count
sind):
╔════════╦═════════════════╦════╦═══╦═══╦═══╦═══╦════════╦══════════╗
║ 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):
- Ä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. - Unterschiedliche Werte für alle Partitionen
singleton_lookup_count
und deutlich niedrigere Werte fürrange_scan_count
können auf eine gute häufige Entfernung von Partitionen hinweisen, da weniger gescannt wird, als wir suchen. - ?
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
quelle
Antworten:
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.
quelle