【问题标题】:Clustered Index improvemens for particular queries特定查询的聚集索引改进
【发布时间】: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 团队因为大小问题而要求我不要创建新索引的原因。这就是为什么我考虑通过聚集索引重新排列表结构的原因。还会更改超出正常范围的数据类型。

【问题讨论】:

  • 您可能会在dba.sedba.se提出这个主题得到更好的答案

标签: sql sql-server tsql sql-server-2005


【解决方案1】:

好的,所以一百万行非常小,根据提供的信息,您在此处的表格大小不会超过 75-100 MB,因此不知道您为什么提到这些,我假设他们是相当微不足道的。除此之外,您不想索引表并包含 ID (PK),因为您将获得 RID 查找。本质上,您的 PK 中的 id 对您没有任何作用(您说数据已设置并且不变,没有理由继续检查任何东西的唯一性......这是在源系统中完成的),如果有任何事情会减慢您的查询速度,所以我要做的只是在 SUM_Amount 上添加一个聚集索引,它将对您要查找的数据进行排序,并在所示的两个查询中创建索引查找。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-17
    • 2014-08-27
    • 1970-01-01
    • 1970-01-01
    • 2011-12-19
    • 2014-11-04
    • 2013-12-23
    • 1970-01-01
    相关资源
    最近更新 更多