我正在比较两个表。他们是:
CREATE TABLE Table1(
Column1 [bigint] NOT NULL,
Column2 [VARBINARY](max) NULL,
Column3 [int] NULL,
Column4 [DATETIME] NULL,
Column5 [INT] NULL,
Column6 [DATETIME] NULL,
[RowVersionId] [timestamp] NOT NULL,
CONSTRAINT [PK_BagImage] PRIMARY KEY CLUSTERED (Column1 ASC)
)
这是第二张表:
CREATE TABLE Table2(
Column1 [bigint] IDENTITY(1,1) NOT FOR REPLICATION NOT NULL,
Column2 [BIGINT] NULL,
Column3 [VARCHAR](1) NOT NULL,
Column4 [int] NOT NULL,
Column5 [varchar](11) NOT NULL,
Column6 [varchar](13) NOT NULL,
Column7 [datetime] NOT NULL,
Column8 [bigint] NULL,
Column9 [bit] NOT NULL,
Column10 [uniqueidentifier] NOT NULL,
[RowVersionId] [timestamp] NOT NULL,
CONSTRAINT [PK_Table2] PRIMARY KEY CLUSTERED ( Column1 ASC)
)
它们都没有任何非聚集索引。他们每个人都有一个外键,但是查找它们的查询计划非常快!(需要 00:00:00 的聚集索引查找)。
当我将 55K 行复制到第一行时,需要 45 分钟。当我将 770 万行复制到第二个时,需要 7 分钟。
这一切对我来说似乎都有意义。(复制图像应该需要更长的时间,对吧?)
但是我想为这个操作计算一个粗略的IO。所以我dbcc showcontig
在这些桌子上跑了。
表 MinimumRecordSize MaximumRecordSize AverageRecordSize 表 1 75 123 81.733 表 2 101 101 101
所以这就是我感到困惑的地方。 如果包含图像的表的平均记录大小少 20,那么为什么插入数据要花这么长时间? 特别是当我在第二个表中插入700 万行时。
当您存储的数据大于适合 SQL Server 的 8k 页的数据时,如 varbinary(max) 或 varchar(max),它存储在行溢出数据结构中。根据在线书籍,showcontig 似乎根本不显示此数据:
似乎 showcontig 也被弃用了。它的替换
sys.dm_db_index_physical_stats
可以设置为显示“行外”数据的存储。SAMPLE 或 DETAIL 似乎最能显示此数据。