gpt4 book ai didi

sql - 相当于SQL Server中Oracle的RowID

转载 作者:行者123 更新时间:2023-12-01 17:13:43 26 4
gpt4 key购买 nike

相当于 SQL Server 中 Oracle 的 RowID 是什么?

最佳答案

From the Oracle docs

ROWID Pseudocolumn

For each row in the database, the ROWID pseudocolumn returns theaddress of the row. Oracle Database rowid values contain informationnecessary 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 filenumber is relative to the tablespace.

SQL Server 中与此最接近的等效项是 rid,它具有三个组件 File:Page:Slot

在 SQL Server 2008 中,可以使用未记录且不受支持的 %%physloc%% 虚拟列来查看这一点。这会返回一个 binary(8) 值,前四个字节中包含页面 ID,然后是文件 ID 的 2 个字节,最后是页面上插槽位置的 2 个字节。

标量函数sys.fn_PhysLocFormattersys.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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com