Version: SQL Server 2008 R2 Enterprise Edtn. (10.50.4000)
Dans le but d'évaluer notre stratégie de partitionnement, j'ai écrit cette requête pour obtenir les méthodes d'accès aux index sur les partitions (au sens le plus large du terme, bien que j'élimine les tas). Alors que je me concentre sur les tables partitionnées, je pense que je dois regarder range_scan_countet singleton_lookup_countmais j'ai du mal à conceptualiser.
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 ;
Sortie pertinente (compte tenu de l'écart dans le formatage des tables par SO, il s'agit d'un échantillon des 9 premières colonnes de la requête ci-dessus, les deux dernières colonnes étant range_scan_countet singleton_lookup_count, respectivement):
╔════════╦═════════════════╦════╦═══╦═══╦═══╦═══╦════════╦══════════╗
║ 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 ║
╚════════╩═════════════════╩════╩═══╩═══╩═══╩═══╩════════╩══════════╝
Je vois quelques possibilités différentes mais j'ai besoin d'une direction sur la façon de penser à cela (bien sûr, je présente cela dans " peut " parce que je sais que "cela dépend", mais je recherche également la compréhension conceptuelle):
- Des valeurs similaires pour toutes les partitions de 
range_scan_countpeuvent indiquer que nous n'obtenons pas une bonne élimination des partitions car nous analysons toutes les partitions à peu près le même nombre de fois. - Des valeurs variables pour toutes les partitions 
singleton_lookup_countaccompagnées de valeurs significativement plus faibles pourrange_scan_countpeuvent indiquer une bonne élimination fréquente des partitions car nous analysons moins que ce que nous recherchons. - ?
 
Telles sont mes pensées jusqu'à présent. J'espérais que quelqu'un réfléchisse à la façon dont je pourrais utiliser cela, ou un autre ensemble d'informations, pour déterminer quelles tables bénéficieraient le plus probablement de l'abandon du partitionnement au profit des index.
ÉDITER
Voici un DDL tronqué:
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