【发布时间】:2014-01-24 11:45:37
【问题描述】:
与固有数据相比,有一个 SQL 表增长迅速且不一致。简而言之,有一个 Windows 服务备份此表中 .txt 文件的内容,文件的重量从 1KB 到 45KB 大约。因此 nvarchar(max) 列用于存储这些文本文件的内容。
在此表上运行 sp_spaceused 命令时,结果如下:
name rows reserved data index_size unused
Files 20402 814872 KB 813416 KB 1048 KB 408 KB
但是当运行这个简单的查询时,它给出了这个表使用的数据总量(以字节为单位),结果并不接近:(97231108 字节)。
SELECT (SUM(DATALENGTH(A)) +
SUM(DATALENGTH(B)) +
SUM(DATALENGTH(C)) +
SUM(DATALENGTH(D)) +
SUM(DATALENGTH(E)) +
SUM(DATALENGTH(F)) +
SUM(DATALENGTH(G)) +
SUM(DATALENGTH(H)) +
SUM(DATALENGTH(I))) AS BytesUsed
FROM Files
RESULT: 97231108 bytes
该表的创建语句如下:
CREATE TABLE [dbo].[Files](
[A] [int] IDENTITY(33515427,1) NOT NULL,
[B] [nvarchar](100) NOT NULL,
[C] [nvarchar](max) NOT NULL,
[D] [nvarchar](100) NOT NULL,
[E] [datetime] NULL,
[F] [nvarchar](2) NULL,
[G] [datetime] NULL,
[H] [nvarchar](100) NULL,
[I] [int] NULL,
CONSTRAINT [PK_Files] PRIMARY KEY CLUSTERED
(
[A] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF,
ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY],
CONSTRAINT [UK_Files_FileType_FileDate] UNIQUE NONCLUSTERED
(
[D] ASC,
[E] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF,
ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO
ALTER TABLE [dbo].[Files] WITH CHECK ADD CONSTRAINT [FK_Files_FileStatus] FOREIGN
KEY([F])
REFERENCES [dbo].[F] ([F])
GO
ALTER TABLE [dbo].[Files] CHECK CONSTRAINT [FK_Files_FileStatus]
GO
临时修复:我重新创建了表(DROP & CREATE),然后将旧表的数据复制到新表中,这使得表从 65GB 变为 108MB。
我的问题是:
- 是什么让这张桌子占用了这么多空间,我怎样才能防止它再次增长?
【问题讨论】:
标签: sql space disk create-table