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