网络中是否有任何信息,我可以在其中验证临时表功能的存储成本有多高?
服务器会创建被修改的行/元组的完整硬拷贝吗?或者服务器是否会使用未修改的主表原始值的引用/链接?
例如。我有一行 10 列 = 存储 100 KB。我更改了该行的一个值,两次。更改后,我在历史表中有几行。主表和历史表的填充存储成本是否约为 300KB?
感谢您的每一个提示!
拉加兹
网络中是否有任何信息,我可以在其中验证临时表功能的存储成本有多高?
服务器会创建被修改的行/元组的完整硬拷贝吗?或者服务器是否会使用未修改的主表原始值的引用/链接?
例如。我有一行 10 列 = 存储 100 KB。我更改了该行的一个值,两次。更改后,我在历史表中有几行。主表和历史表的填充存储成本是否约为 300KB?
感谢您的每一个提示!
拉加兹
服务器会创建被修改的行/元组的完整硬拷贝吗?或者服务器是否会使用未修改的主表原始值的引用/链接?
这是Dmitri Korotkevitch 所著的 Pro SQL Server Internals一书的引用,它回答了您的问题:
简而言之,每个时态表由两个表组成——包含当前数据的当前表和存储旧版本行的历史表。每次修改或删除当前表中的数据时,SQL Server 都会将这些行的原始版本添加到历史表中。
当前表应该总是有一个
primary key
定义的。此外,当前表和历史表都应该有两datetime2
列,称为周期列,指示行的生命周期。SQL Server 在创建新版本的行时根据事务开始时间自动填充这些列。当一行在一个事务中被多次修改时,SQL Server 不会在历史表中保留未提交的中间行版本。SQL Server 将历史表放置在默认文件组中,在控制行生存期的两个 datetime2 列上创建非唯一聚集索引。它不会在表上创建任何其他索引。
在 Enterprise 和 Developer Edition 中,历史表
compression
默认使用 page。
所以不是
参考/链接到主表的原始值
以前的行版本只是被复制到每个修改的历史表中。