2012-06-28 68 views
0

我已经定义为一个表如下:巨大的内存占用2008

CREATE TABLE [dbo].[T](
[FileID] [bigint] NOT NULL, 
[Line] [nvarchar](250) NULL 
) ON [PRIMARY] 

写到FileID是一个外键,并且该表具有> 700万条记录

做一个SELECT COUNT (1)在该表上导致1.5GB +的内存尖峰。任何解决方法?

+3

桌子上有任何指标吗?如果不是,他们只能通过扫描整个表来获得行数。把一个索引放在'FileID'上,我相信你的内存使用量会少得多(因为现在,SQL Server可以扫描每个条目8个字节的索引来确定行数) –

+1

添加一个索引使情况变得更好;现在它已经上涨了0.4GB。谢谢。 – mido

回答

2

如果你不需要,而你得到一个计数,以阻止所有用户,并可以接受由于交易当前出现的微小差异,那么这是好多了:

SELECT SUM([rows]) FROM sys.partitions 
    WHERE [object_id] = OBJECT_ID('dbo.T') 
    AND index_id IN (0,1); 

否则,马克是正确 - 在FileID列上放置索引,SQL Server将选择扫描该索引而不是扫描整个表。

这张桌子上真的没有索引吗?有几个用例没有聚合索引是有意义的,但我不认为这是其中之一。虽然创建外键可以帮助优化器,但它不会创建索引(尽管这是一种常见的误解)。