Arka fon
İstatistikler nesnesine ilişkin veriler, aşağıdaki ifadeyi kullanarak toplanır:
SELECT
StatMan([SC0], [SC1], [SB0000])
FROM
(
SELECT TOP 100 PERCENT
[SC0], [SC1], STEP_DIRECTION([SC0]) OVER (ORDER BY NULL) AS [SB0000]
FROM
(
SELECT
[TextValue] AS [SC0],
[Id] AS [SC1]
FROM [dbo].[Test]
TABLESAMPLE SYSTEM (2.223684e+001 PERCENT)
WITH (READUNCOMMITTED)
) AS _MS_UPDSTATS_TBL_HELPER
ORDER BY
[SC0],
[SC1],
[SB0000]
) AS _MS_UPDSTATS_TBL
OPTION (MAXDOP 1)
Bu bildirimi Extended Events veya Profiler ( SP:StmtCompleted
) ile toplayabilirsiniz .
İstatistik oluşturma sorguları, kümelenmemiş dizin sayfalarında doğal olarak oluşan değerlerin kümelenmesini önlemek için genellikle temel tabloya (kümelenmemiş bir dizin yerine) erişir.
Örneklenen satır sayısı, örnekleme için seçilen tam sayfa sayısına bağlıdır. Tablonun her sayfası seçilir veya seçilmez. Seçilen sayfalardaki tüm satırlar istatistiklere katkıda bulunur.
Rastgele numaralar
SQL Server, bir sayfanın uygun olup olmadığına karar vermek için rastgele bir sayı üreticisi kullanır. Bu örnekte kullanılan jeneratör , aşağıda gösterildiği gibi parametre değerlerine sahip Lehmer rasgele sayı üretecidir :
X sonraki = X tohum * 7 5 mod (2 31 - 1)
Değeri Xseed
şu şekilde hesaplanır:
(Düşük tam sayı kısmı bigint
) taban tablo partition_id
, örneğin
SELECT
P.[partition_id] & 0xFFFFFFFF
FROM sys.partitions AS P
WHERE
P.[object_id] = OBJECT_ID(N'dbo.Test', N'U')
AND P.index_id = 1;
İçinde belirtilen değer REPEATABLE
madde
- Örneklenmiş için
UPDATE STATISTICS
için REPEATABLE
değer 1'dir.
- Bu değer,
m_randomSeed
örneğin erişim bayrağı 8666 etkinleştirildiğinde yürütme planlarında gösterilen erişim yönteminin dahili hata ayıklama bilgisinin öğesinde ortaya çıkar<Field FieldName="m_randomSeed" FieldValue="1" />
SQL Server 2012 için bu hesaplama sqlmin!UnOrderPageScanner::StartScan
şöyle yapılır:
mov edx,dword ptr [rcx+30h]
add edx,dword ptr [rcx+2Ch]
nerede hafıza [rcx+30h]
bölüm kimliğinin düşük 32 bitini içerir ve içindeki bellek kullanımdaki değeri [rcx+2Ch]
içerir REPEATABLE
.
Rasgele sayı üreteci daha sonra aynı yöntemde başlatılır, sqlmin!RandomNumGenerator::Init
, komutun bulunduğu yer:
imul r9d,r9d,41A7h
... tohumu, yukarıdaki denklemde gösterildiği gibi 41A7
hex (16807 ondalık = 7 5 ) ile çarpar .
Daha sonra rastgele sayılar (tek tek sayfalar için), içine sıralanan aynı temel kod kullanılarak üretilir sqlmin!UnOrderPageScanner::SetupSubScanner
.
StatMan
StatMan
Yukarıda gösterilen örnek sorgu için, T-SQL ifadesinde olduğu gibi aynı sayfalar toplanacaktır:
SELECT
COUNT_BIG(*)
FROM dbo.Test AS T
TABLESAMPLE SYSTEM (2.223684e+001 PERCENT) -- Same sample %
REPEATABLE (1) -- Always 1 for statman
WITH (INDEX(0)); -- Scan base object
Bu, çıktısı ile eşleşecektir:
SELECT
DDSP.rows_sampled
FROM sys.stats AS S
CROSS APPLY sys.dm_db_stats_properties(S.[object_id], S.stats_id) AS DDSP
WHERE
S.[object_id] = OBJECT_ID(N'dbo.Test', N'U')
AND S.[name] = N'IX_Test_TextValue';
Kenar durumda
MINSTD Lehmer rasgele sayı üretecini kullanmanın bir sonucu, tohum değerlerinin sıfır ve int.max değerinin kullanılmaması gerektiğidir, çünkü algoritma bir sıfır dizisi üretecektir (her sayfayı seçerek).
Kod sıfır algılar ve bu durumda tohum olarak sistem 'saatinden bir değer kullanır. Tohum int.max ise ( 0x7FFFFFFF
= 2 31) aynısını yapmaz - 1) aynı değildir.
İlk tohum, bölüm kimliğinin düşük 32 bitinin ve REPEATABLE
değerinin toplamı olarak hesaplandığından bu senaryoyu yapabiliriz . REPEATABLE
Örnektir için int.max ve bu nedenle her sayfa olmak tohum sonuçlanacaktır değeri seçildiği:
SELECT
0x7FFFFFFF - (P.[partition_id] & 0xFFFFFFFF)
FROM sys.partitions AS P
WHERE
P.[object_id] = OBJECT_ID(N'dbo.Test', N'U')
AND P.index_id = 1;
Bunu eksiksiz bir örnekle çalışmak:
DECLARE @SQL nvarchar(4000) =
N'
SELECT
COUNT_BIG(*)
FROM dbo.Test AS T
TABLESAMPLE (0 PERCENT)
REPEATABLE (' +
(
SELECT TOP (1)
CONVERT(nvarchar(11), 0x7FFFFFFF - P.[partition_id] & 0xFFFFFFFF)
FROM sys.partitions AS P
WHERE
P.[object_id] = OBJECT_ID(N'dbo.Test', N'U')
AND P.index_id = 1
) + ')
WITH (INDEX(0));';
PRINT @SQL;
--EXECUTE (@SQL);
Bu, TABLESAMPLE
cümlede ne olursa olsun her sayfada her satırı seçecektir (yüzde sıfır).