Estou comparando duas tabelas. Eles são:
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)
)
Esta é a segunda tabela:
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)
)
Nenhum deles tem índices não agrupados. Cada um deles tem uma chave estrangeira, mas os planos de consulta para procurá-los estão ficando mais rápidos! (Busca de índice agrupado que leva 00:00:00).
Quando copio 55K de linhas na primeira leva 45 minutos. Quando copio 7,7 milhões de linhas no segundo, leva 7 minutos.
Isso tudo parece fazer sentido para mim. (copiar imagens deve demorar mais, certo?)
Mas eu queria calcular um IO aproximado para esta operação. Então eu corri dbcc showcontig
nessas mesas.
Tabela MinimumRecordSize MaximumRecordSize AverageRecordSize Tabela1 75 123 81.733 Tabela 2 101 101 101
Então é aqui que estou ficando confuso. Se o tamanho médio do registro for 20 a menos para a tabela com as imagens, por que demora muito mais para inserir os dados? Especialmente quando estou inserindo mais 7 milhões de linhas na segunda tabela.
Quando você está armazenando dados maiores do que cabe na página de 8k do SQL Server, como varbinary(max) ou varchar(max), eles são armazenados em uma estrutura de dados de estouro de linha. Parece que o showcontig não mostra esses dados de acordo com os livros online :
Parece que o showcontig também está obsoleto. Sua substituição
sys.dm_db_index_physical_stats
pode ser configurada para mostrar o armazenamento de dados "fora da linha". SAMPLE ou DETAIL parece mostrar melhor esses dados.