Sürüm: SQL Server 2008 R2 Enterprise Edtn. (10.50.4000)
Bölümleme stratejimizi değerlendirmek amacıyla, bu sorguları bölümlerdeki dizinlere karşı erişim yöntemlerini almak için yazdım (terimlerin en geniş anlamıyla, yığınları ortadan kaldırıyorum). Odaklanmayı bölümlenmiş tablolara daraltırken, bakmam gerektiğine inanıyorum range_scan_count
ve singleton_lookup_count
kavramsallaştırmakta zorlanıyorum.
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 ;
İlgili çıktı (SO'nun tablo biçimlendirmesindeki boşluk göz önüne alındığında, bu, yukarıdaki sorgudan sırasıyla son iki sütunun olduğu ilk 9 sütunun bir örneğidir range_scan_count
ve singleton_lookup_count
sırasıyla):
╔════════╦═════════════════╦════╦═══╦═══╦═══╦═══╦════════╦══════════╗
║ 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 ║
╚════════╩═════════════════╩════╩═══╩═══╩═══╩═══╩════════╩══════════╝
Birkaç farklı olasılık görüyorum ama bunun hakkında nasıl düşüneceğime dair bir yönelime ihtiyacım var (tabii ki bunu " mayıs " ta alıyorum çünkü "buna bağlı" olduğunu biliyorum, ama aynı zamanda kavramsal anlama da arıyorum):
- Tüm bölümler için benzer değerler
range_scan_count
olabilir kabaca aynı sayıda tüm bölümleri tarayarak çünkü biz iyi bölüm ortadan kaldırılması almıyorsanız göstermektedir. - Aradaki tüm bölümler için değişken değerler
singleton_lookup_count
, önemli ölçüde daha düşük değerlerle birlikterange_scan_count
, sık sık bölüm elemine işaret edebilir , çünkü aradığımızdan daha az tararız. - ?
Bunlar benim düşüncelerim. Birisi nasıl bu tabloları veya başka bir bilgi kümesi, hangi tabloları büyük olasılıkla dizinleri lehine bölümleme bırakarak fayda sağlayacak belirlemek için tartmak umuyordum.
DÜZENLE
İşte kırpılmış bir 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