Пример может помочь. Ниже создается куча и вставляется в нее пару строк
CREATE TABLE Demo(X CHAR(1));
INSERT INTO Demo VALUES ('A'), ('B');
Затем вы можете использовать следующую команду, чтобы увидеть RID
SELECT X,
%%physloc%% as rid,
sys.fn_PhysLocFormatter(%%physloc%%) as formatted
FROM Demo
, который для меня возвращает
+---+--------------------+-----------+
| X | rid | formatted |
+---+--------------------+-----------+
| A | 0xE700000001000000 | (1:231:0) |
| B | 0xE700000001000100 | (1:231:1) |
+---+--------------------+-----------+
RID представляет собой 8-байтовое двоичное значение, которое представляет собой объединение трех компонентов. FileNumber:PageNumber:SlotNumber
.
Каждый файл разделен на 8 КБ страниц с нумерацией, начинающейся с 0, поэтому вычислить смещение в файле для данного номера страницы несложно. Страница 231 - это 8-килобайтный раздел, начинающийся со смещения байта 1892352 в файле (231 * 8192
).
Чтобы найти строку, принадлежащую RID 1:231:1
, достаточно получить соответствующую страницу (1:231
) из менеджер буфера (который будет читать его с дис c, если необходимо) и go во второй слот на странице (нумерация слотов начинается с 0).
Каждая страница данных имеет массив слотов в нижнем колонтитуле, задающий смещение строки для каждой строки на странице.