Próbuję uzyskać listę stron dla tabeli zawierającej wiersze z ROW_OVERFLOW_DATA. Mogę uzyskać listę przydzielonych stron z nieudokumentowanego DMV, sys.db_db_database_page_allocations
jednak wydaje się, że nie ma żadnych ROW_OVERFLOW_DATA stron wymienionych w danych wyjściowych tego DMV. Czy jest jakiś inny DMV, którego po prostu nie mogę zlokalizować?
Minimalny, kompletny i (miejmy nadzieję) weryfikowalny przykład:
USE tempdb;
IF OBJECT_ID(N'dbo.t', N'U') IS NOT NULL
DROP TABLE dbo.t;
GO
CREATE TABLE dbo.t
(
rownum int NOT NULL IDENTITY(1,1)
PRIMARY KEY CLUSTERED
, on_row_data varchar(30) NOT NULL
DEFAULT ('on_row_data')
, off_row_data varchar(MAX) NOT NULL
DEFAULT REPLICATE('A', 20000) --PLENTY BIG ENOUGH!
) WITH (DATA_COMPRESSION = NONE); --not compressing those pages!
INSERT INTO dbo.t DEFAULT VALUES;
DECLARE @ObjectID int = (SELECT o.object_id FROM sys.objects o WHERE o.name = 't');
DECLARE @PageID int;
DECLARE @PageTypeDesc varchar(100);
SELECT FileID = dpa.allocated_page_file_id
, PageID = dpa.allocated_page_page_id
, PageTypeDesc = dpa.page_type_desc
FROM sys.dm_db_database_page_allocations(DB_ID(), @ObjectID, NULL, NULL, 'DETAILED') dpa
Wyjście wygląda następująco:
╔════════╦════════╦══════════════╗ ║ FileID ║ PageID ║ PageTypeDesc ║ ╠════════╬════════╬══════════════╣ ║ 1 ║ 1598 ║ IAM_PAGE ║ ║ 3 ║ 105368 ║ DATA_PAGE ║ ║ 3 ║ 105369 ║ NULL ║ ║ 3 ║ 105370 ║ NULL ║ ║ 3 ║ 105371 ║ NULL ║ ║ 3 ║ 105372 ║ NULL ║ ║ 3 ║ 105373 ║ NULL ║ ║ 3 ║ 105374 ║ NULL ║ ║ 3 ║ 105375 ║ NULL ║ ╚════════╩════════╩══════════════╝
Co ma sens, poza brakującą stroną ROW_OVERFLOW_DATA. Mamy jedną stronę z mapą alokacji indeksu i pełne zakresy stron danych o wielkości 8 KB, przy czym tylko jedna z tych stron jest faktycznie przydzielona.
Podobnie, jeśli użyję sys.fn_PhysLocCracker
funkcji nieudokumentowanej, aby wyświetlić stronę, na której istnieje każdy wiersz, jak w:
SELECT *
FROM dbo.t
CROSS APPLY sys.fn_PhysLocCracker(%%PHYSLOC%%)
Widzę tylko DATA_PAGE
wymienione:
╔════════╦═════════════╦═════════════════════╦════ ═════╦═════════╦═════════╗ ║ rownum ║ on_row_data ║ off_row_data ║ file_id ║ page_id ║ slot_id ║ ╠════════╬═════════════╬═════════════════════╬════ ═════╬═════════╬═════════╣ ║ 1 ║ on_row_data ║ AAAAAAAAAAAAAAAAAAA ║ 3 ║ 105368 ║ 0 ║ ╚════════╩═════════════╩═════════════════════╩════ ═════╩═════════╩═════════╝
Podobnie, jeśli używam, DBCC IND(database, table, index)
widzę tylko dwie wymienione strony:
DBCC IND (tempdb, t, 1);
Wynik:
╔═════════╦═════════╦════════╦════════╦═══════════ ═╦═════════╦═════════════════╦════════════════════ ═╦════════════════╦══════════╦════════════╦═══════ ══════╦═════════════╦═════════════╦═════════════╦═ ═╗ ║ PageFID ║ PagePID ║ IAMFID ║ IAMPID ║ ObjectID ║ IndexID ║ PartitionNumber ║ PartitionID ║ iam_chain_type ║ PageType ║ IndexLevel ║ NextPageFID ║ NextPagePID ║ PrevPageFID ║ PrevPagePID ║ ║ ╠═════════╬═════════╬════════╬════════╬═══════════ ═╬═════════╬═════════════════╬════════════════════ ═╬════════════════╬══════════╬════════════╬═══════ ══════╬═════════════╬═════════════╬═════════════╬═ ═╣ ║ 1 ║ 1598 ║ NULL ║ NULL ║ 2069582411 ║ 1 ║ 1 ║ 6989586877272752128 ║ Dane w wierszu ║ 10 ║ NULL ║ 0 ║ 0 ║ 0 ║ 0 ║ ║ ║ 3 ║ 105368 ║ 1 ║ 1598 ║ 2069582411 ║ 1 ║ 1 ║ 6989586877272752128 data Dane w wierszu ║ 1 ║ 0 ║ 0 ║ 0 ║ 0 ║ 0 ║ ║ ╚═════════╩═════════╩════════╩════════╩═══════════ ═╩═════════╩═════════════════╩════════════════════ ═╩════════════════╩══════════╩════════════╩═══════ ══════╩═════════════╩═════════════╩═════════════╩═ ═╝
Jeśli patrzę na rzeczywistą zawartość strony, używając DBCC PAGE
, wygląda na to, że nadal nie widzę niczego, która strona zawiera ROW_OVERFLOW_DATA - jestem pewien, że musi tam być, prawdopodobnie po prostu nie wiem na co patrzeć:
DBCC PAGE (tempdb, 3, 105368 , 3) WITH TABLERESULTS;
Wyniki są zbyt duże, aby zmieścić się tutaj, jeśli dołączę wiersze zrzutu pamięci, ale jest to wynik wyjściowy nagłówka:
╔══════════════╦════════════════════════════════╦═ ══════════════════════════════╦═══════════════════ ════════════╗ ║ ParentObject ║ Object ║ Field ║ VALUE ║ ╠══════════════╬════════════════════════════════╬═ ══════════════════════════════╬═══════════════════ ════════════╣ ║ BUFOR: ║ BUF @ 0x000002437E86D5C0 ║ strona ║ 0x000002431A8A2000 ║ ║ BUFOR: ║ BUF @ 0x000002437E86D5C0 ║ bhash ║ 0x0000000000000000 ║ FF BUFOR: ║ BUF @ 0x000002437E86D5C0 ║ bpageno ║ (3: 105368) ║ ║ BUFOR: ║ BUF @ 0x000002437E86D5C0 ║ bdbid ║ 2 ║ ║ BUFOR: ║ BUF @ 0x000002437E86D5C0 ferences naruszenia ║ 0 ║ ║ BUFOR: ║ BUF @ 0x000002437E86D5C0 ║ bcputicks ║ 0 ║ FF BUFOR: ║ BUF @ 0x000002437E86D5C0 ║ bsampleCount ║ 0 ║ ║ BUFOR: ║ BUF @ 0x000002437E86D5C0 ║ bUse1 ║ 63172 ║ FF BUFOR: ║ BUF @ 0x000002437E86D5C0 ║ bstat ║ 0x10b ║ ║ BUFOR: ║ BUF @ 0x000002437E86D5C0 ║ blog ║ 0x212121cc ║ ║ BUFOR: ║ BUF @ 0x000002437E86D5C0 ║ bnext ║ 0x0000000000000000 ║ ║ BUFOR: ║ BUF @ 0x000002437E86D5C0 ║ bDirtyContext ║ 0x000002435DA77160 ║ ║ BUFOR: ║ BUF @ 0x000002437E86D5C0 ║ bstat2 ║ 0x0 ║ AD NAGŁÓWEK STRONY: ║ Strona @ 0x000002431A8A2000 ║ m_pageId ║ (3: 105368) ║ AD NAGŁÓWEK STRONY: ║ Strona @ 0x000002431A8A2000 ║ m_headerVersion ║ 1 ║ AD NAGŁÓWEK STRONY: ║ Strona @ 0x000002431A8A2000 ║ m_type ║ 1 ║ HE NAGŁÓWEK STRONY: ║ Strona @ 0x000002431A8A2000 ║ m_typeFlagBits ║ 0x0 ║ AD NAGŁÓWEK STRONY: ║ Strona @ 0x000002431A8A2000 ║ m_level ║ 0 ║ AD NAGŁÓWEK STRONY: ║ Strona @ 0x000002431A8A2000 ║ m_flagBits ║ 0xc000 ║ AD NAGŁÓWEK STRONY: ║ Strona @ 0x000002431A8A2000 ║ m_objId (AllocUnitId.idObj) ║ 3920762 ║ AD NAGŁÓWEK STRONY: ║ Strona @ 0x000002431A8A2000 ║ m_indexId (AllocUnitId.idInd) ║ 512 ║ AD NAGŁÓWEK STRONY: ║ Strona @ 0x000002431A8A2000 ║ Metadane: AllocUnitId ║ 144115445026914304 ║ AD NAGŁÓWEK STRONY: ║ Strona @ 0x000002431A8A2000 ║ Metadane: PartitionId ║ 6989586877272752128 ║ AD NAGŁÓWEK STRONY: ║ Strona @ 0x000002431A8A2000 ║ Metadane: IndexId ║ 1 ║ AD NAGŁÓWEK STRONY: ║ Strona @ 0x000002431A8A2000 ║ Metadane: ObjectId ║ 2069582411 ║ AD NAGŁÓWEK STRONY: ║ Strona @ 0x000002431A8A2000 ║ m_prev Strona ║ (0: 0) ║ HE NAGŁÓWEK STRONY: ║ Strona @ 0x000002431A8A2000 ║ m_nextPage ║ (0: 0) ║ AD NAGŁÓWEK STRONY: ║ Strona @ 0x000002431A8A2000 ║ pminlen ║ 8 ║ AD NAGŁÓWEK STRONY: ║ Strona @ 0x000002431A8A2000 ║ m_slotCnt ║ 1 ║ AD NAGŁÓWEK STRONY: ║ Strona @ 0x000002431A8A2000 ║ m_freeCnt ║ 66 ║ AD NAGŁÓWEK STRONY: ║ Strona @ 0x000002431A8A2000 ║ m_freeData ║ 8124 ║ AD NAGŁÓWEK STRONY: ║ Strona @ 0x000002431A8A2000 ║ m_reservedCnt ║ 0 ║ AD NAGŁÓWEK STRONY: ║ Strona @ 0x000002431A8A2000 ║ m_lsn ║ (36: 47578: 1) ║ AD NAGŁÓWEK STRONY: ║ Strona @ 0x000002431A8A2000 ║ m_xactReserved ║ 0 ║ AD NAGŁÓWEK STRONY: ║ Strona @ 0x000002431A8A2000 ║ m_xdesId ║ (0: 0) ║ AD NAGŁÓWEK STRONY: ║ Strona @ 0x000002431A8A2000 ║ m_ghostRecCnt ║ 0 ║ AD NAGŁÓWEK STRONY: ║ Strona @ 0x000002431A8A2000 ║ m_tornBits ║ 0 ║ AD NAGŁÓWEK STRONY: ║ Strona @ 0x000002431A8A2000 ║ Identyfikator Frag Frag DB ║ 1 ║ ║ NAGŁÓWEK STRONY: ║ Status przydziału ║ GAM (3: 2) ║ PRZYDZIELONY ║ ║ NAGŁÓWEK STRONY: ║ Status przydziału ║ SGAM (3: 3) ║ NIE PRZYDZIELONY ║ AD NAGŁÓWEK STRONY: ║ Status przydziału ║ PFS (3: 105144) ║ 0x40 PRZYDZIELONY 0_PCT_FULL ║ ║ NAGŁÓWEK STRONY: ║ Status przydziału ║ DIFF (3: 6) ║ NIEZMIENIONO ║ ║ NAGŁÓWEK STRONY: ║ Status przydziału ║ ML (3: 7) ║ NOT MIN_LOGGED ║ AD NAGŁÓWEK STRONY: ║ Slot 0 Przesunięcie 0x60 Długość 8028 ║ Rodzaj rekordu ║ PODSTAWOWY_RECORD ║ AD NAGŁÓWEK STRONY: ║ Slot 0 Przesunięcie 0x60 Długość 8028 ║ Atrybuty zapisu ║ NULL_BITMAP VARIABLE_COLUMNS ║ AD NAGŁÓWEK STRONY: ║ Slot 0 Przesunięcie 0x60 Długość 8028 ║ Rozmiar rekordu ║ 8028 ║ ╚══════════════╩════════════════════════════════╩═ ══════════════════════════════╩═══════════════════ ════════════╝