相当于 SQL Server 中 Oracle 的 RowID 是什么?
最佳答案
ROWID Pseudocolumn
For each row in the database, the ROWID pseudocolumn returns the address of the row. Oracle Database rowid values contain information necessary to locate a row:
- The data object number of the object
- The data block in the datafile in which the row resides
- The position of the row in the data block (first row is 0)
- The datafile in which the row resides (first file is 1). The file number is relative to the tablespace.
SQL Server 中与此最接近的等效项是 rid
,它具有三个组件 File:Page:Slot
。
在 SQL Server 2008 中,可以使用未记录且不受支持的 %%physloc%%
虚拟列来查看这一点。这会返回一个 binary(8)
值,前四个字节中包含页面 ID,然后是文件 ID 的 2 个字节,最后是页面上插槽位置的 2 个字节。
标量函数sys.fn_PhysLocFormatter
或sys.fn_PhysLocCracker
TVF可用于将其转换为更易读的形式
CREATE TABLE T(X INT);
INSERT INTO T VALUES(1),(2)
SELECT %%physloc%% AS [%%physloc%%],
sys.fn_PhysLocFormatter(%%physloc%%) AS [File:Page:Slot]
FROM T
示例输出
+--------------------+----------------+
| %%physloc%% | File:Page:Slot |
+--------------------+----------------+
| 0x2926020001000000 | (1:140841:0) |
| 0x2926020001000100 | (1:140841:1) |
+--------------------+----------------+
请注意,查询处理器不利用这一点。虽然可以在WHERE
子句中使用它
SELECT *
FROM T
WHERE %%physloc%% = 0x2926020001000100
SQL Server 将不会直接查找指定的行。相反,它会进行全表扫描,评估每一行的 %%physloc%%
并返回匹配的行(如果有)。
要反转前面提到的 2 个函数执行的过程并获取与已知文件、页面、插槽值相对应的 binary(8)
值,可以使用以下方法。
DECLARE @FileId int = 1,
@PageId int = 338,
@Slot int = 3
SELECT CAST(REVERSE(CAST(@PageId AS BINARY(4))) AS BINARY(4)) +
CAST(REVERSE(CAST(@FileId AS BINARY(2))) AS BINARY(2)) +
CAST(REVERSE(CAST(@Slot AS BINARY(2))) AS BINARY(2))
关于sql - 相当于SQL Server中Oracle的RowID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/909155/