찾았어요
간단한 stats 객체로 테이블을 만듭니다.
CREATE DATABASE splunge;
GO
USE splunge;
GO
CREATE TABLE dbo.foo(bar INT, munge INT);
GO
CREATE STATISTICS x ON dbo.foo(bar);
CREATE STATISTICS y ON dbo.foo(munge);
GO
INSERT dbo.foo SELECT s1.[object_id], s2.[object_id]
FROM sys.objects AS s1
CROSS JOIN sys.objects AS s2;
GO
UPDATE STATISTICS dbo.foo;
GO
DAC ( ADMIN:Server[\instance]
)를 사용하여 연결하십시오 .
다음 쿼리를 실행하십시오.
DBCC SHOW_STATISTICS('dbo.foo', 'x') WITH STATS_STREAM;
DBCC SHOW_STATISTICS('dbo.foo', 'y') WITH STATS_STREAM;
SELECT name, imageval
FROM sys.stats AS s
INNER JOIN sys.sysobjvalues AS o
ON s.object_id = o.objid
AND s.stats_id = o.subobjid
WHERE
s.object_id = OBJECT_ID('dbo.foo');
당신은주의한다 imageval
각 통계 개체에 대한 통계 방울과 동일하지 않습니다, 그러나 그것은 않습니다 포함 된 통계의 덩어리를 - 그것은 단지의 오프셋. 내 시스템에서 x에 대해 이것을 산출했습니다 (분명히 약간의 비트가 잘 렸습니다).
0x0100...bunch of chars...000007000000C4E1BE00EEA0...rest the same
0x07000000C4E1BE00EEA0...rest the same
그리고 이것은 y의 경우 :
0x0100...bunch of chars...430007000000C7E1BE00EEA0...rest the same
0x07000000C7E1BE00EEA0...rest the same
인덱스 기반 통계에서도 마찬가지입니다.
DBCC
명령을 사용하여 일련의 쿼리를 사용하여 추가 유효성 검사를 수행 할 수 있습니다. 먼저 클러스터 된 인덱스와 관련된 페이지를 찾으십시오 sys.sysobjvalues
(데이터베이스 이름 대체).
DBCC IND('splunge', 'sys.sysobjvalues', 1);
결과는 여러 페이지를 나열하며의 페이지에 관심이 있습니다 PageType = 1
. 새 데이터베이스를 사용하면 가장 높은 PagePID
값을 가진 페이지 중 하나에서이 정보를 찾을 수 있습니다. 예를 들어 내 시스템에서 이것은 281 페이지이므로 해당 페이지를 자세히 보았습니다.
DBCC TRACEON(3604);
DECLARE @dbid INT = DB_ID();
DBCC PAGE(@dbid, 1, 281, 3);
DBCC TRACEOFF(3604);
물론 슬롯 17에서 데이터를 찾았습니다.
(대규모 데이터베이스의 경우 새로운 통계 개체조차도 새로운 페이지에 끝날 것이라는 보장이 없기 때문에 더 많은 사냥과 펙킹을 수행해야 할 수도 있습니다.)
계속해서 집에서 시도해보십시오. 그러나이를 위해 DAC와 연결해야하는 이유가 있습니다. 물론 DBCC SHOW_STATISTICS
출력으로 할 수 없었던이 정보로 무엇을 할 것인지 궁금합니다 .
물론 이것은 STATS_STREAM
히스토그램이나 다른 정보를 제공하기 위해 를 해독하려고 시도하지 않으며 표 형식의 출력이 DBCC SHOW_STATISTICS ... WITH HISTOGRAM
테이블 형식으로 어디에 저장되어 있는지에 대한 증거를 찾을 수 없었습니다 . Joe Chang은 당신이 좋아하는 디코딩에 대한 정보를 가지고 있습니다. 나는 그것이 당신이 쿼리에서하고 싶은 것이라고 생각하지 않습니다-그냥 사용하십시오 DBCC
.
STATS_STREAM
되므로 파일 자체에서 찾을 수 있는지 여부를 조사한 적이 없습니다.