【发布时间】:2015-04-27 20:04:29
【问题描述】:
我遇到了以前从未遇到过的 SQL Server Express 问题。
我有一个包含 3200 万行的表,其中包含此列:
[Insp_ID] [nvarchar](8) NOT NULL,
[NodeID] [int] NULL,
[NodeVisible] [bit] NULL,
[Note] [nvarchar](max) NULL,
[Points] [int] NULL,
[QST_ID] [int] NULL,
[QST_Num] [int] NOT NULL,
[Response_Num] [int] NOT NULL,
[Value] [nvarchar](max) NULL,
[ValueID] [int] NULL,
[ValueVisible] [bit] NULL,
CONSTRAINT [QST2D_PK_i83] PRIMARY KEY CLUSTERED
([Insp_ID] ASC, [QST_Num] ASC, [Response_Num] ASC)
该表大约为 1900 MB,甚至可能更大一些。很难说,因为我几乎无法对桌子进行任何维护操作而不会出现此错误:
Msg 802 缓冲池内存不足。
据我了解,SQL Server Express 为此获得 1GB。当我尝试更改主键或执行DBCC DBREINDEX 时会发生这种情况。我可以从数据库中获取信息并重新获取信息的唯一方法是使用 BCP,这非常不方便(但是,有趣的是它可以工作)。 BCP 允许我重组表(即 PK),然后将数据带回。
无论如何,进一步的实验:我将行数减少到 8.2M,整体表大小减少到大约 633MB。仍然得到相同的错误,没有足够的内存。这令人费解,因为在我看来,这似乎不是很多数据。
那时,我删除了两个 nvarchar(max) 列,这进一步将表大小减少到大约 540MB。到那时,我不再内存不足了。
我无法判断缓冲区是否在抱怨行数或表大小,但根据这个轶事证据,感觉就像是表大小。
有人对此有解决方案或见解吗?我觉得我们使用 SQL Server Express 找错了树 - 这太糟糕了,因为到目前为止它完全符合我们的需求。
【问题讨论】:
-
更多信息:同一个数据库有另一个表,大小略高于 1GB,有 103,000 行。能够毫无问题地重新索引这个。所以,我不知道缓冲池如何使用内存,但现在感觉就像是表大小(总 MB)和行数的组合。
-
请记住,SQL Express 的 RAM 上限为 1 GB
标签: sql sql-server sql-server-2014