【发布时间】:2015-01-11 01:31:49
【问题描述】:
我找到了一个如下所示的表格:
CREATE TABLE [dbo].Table1 (
id INT primary key IDENTITY (1, 1),
[idUser] INT NOT NULL ,
[Amount] INT NOT NULL ,
[Attempts] INT NOT NULL ,
[date] [datetime] NOT NULL ,
[SUM_Amount] INT NOT NULL
) ON [PRIMARY]
此表由作业创建并填充特定时期的汇总数据。
特殊性:
- 此表最多可容纳一百万行
- idUser 是唯一的
- sum_Amount 是前几行金额的总和。
此表将保持原样,没有更新、删除或插入操作。 只是这种类型的查询:
select top (@n) * from table1
order by [SUM_Amount] desc, [Attempts] desc
select top (@n) * from table1
where [SUM_Amount] >=@m order by [SUM_Amount] asc
我认为像这样更改为聚集索引会提高性能:
CREATE TABLE [dbo].Table2 (
id INT IDENTITY (1, 1),
[idUser] INT NOT NULL ,
[Amount] INT NOT NULL ,
[Attempts] INT NOT NULL ,
[date] [datetime] NOT NULL ,
[SUM_Amount] INT NOT NULL
CONSTRAINT [PK_Nueva]
PRIMARY KEY CLUSTERED ([SUM_Amount] desc, [Attempts] desc, id asc)
) ON [PRIMARY]
我读到使用无唯一聚集索引会添加一个 4 字节隐藏标识符列 (http://msdn.microsoft.com/en-us/library/ms190639(v=sql.90).aspx),因此我决定将身份 (id) 添加到聚集索引(不确定这是否是正确的方法)
我想问(可能听起来很荒谬,但需要确定):
- 如何改进?
- 我会影响磁盘大小吗?
- 是否应该在插入所有数据后重建索引?
编辑:
关于 id,我认为这只是一个坏习惯。我会保留它,不知道以前的工作如何计算运行总数(我无权访问它)
有很多这样的桌子,每天都有数百张(不要问我为什么)。这就是 DBA 团队因为大小问题而要求我不要创建新索引的原因。这就是为什么我考虑通过聚集索引重新排列表结构的原因。还会更改超出正常范围的数据类型。
【问题讨论】:
标签: sql sql-server tsql sql-server-2005