2014-11-13 46 views
1

我發現了一個表,看起來像這樣:聚集索引improvemens特定查詢

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] 

此表創建和彙總數據填充由工作一個特定時期。

特殊性:

  • 該表將容納一百萬行
  • ID用戶是唯一
  • sum_Amount運行總量的以前行。

該表格將保持原樣,不更新或刪除或插入操作。 只是這種類型的查詢:

select top (@n) * from table1 
order by [SUM_Amount] desc, [Attempts] desc 

select top (@n) * from table1 
where [SUM_Amount] >[email protected] 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團隊要求我不要因爲尺寸問題而創建新索引的原因。這就是爲什麼我想通過聚集索引重新排列表結構。同時改變超出正常範圍的數據類型。

+0

在[dba.se](http://dba.stackexchange.com)上詢問此問題可能會得到更好的答案, – Lamak

回答

1

好吧,一百萬行很小,根據提供的信息,這裏的表格大小不會超過75-100 MB,因此不知道爲什麼要提到這些,我是假設它們相當微不足道。除此之外,你不想索引表幷包含ID(PK),因爲你會得到一個RID查找。本質上,你的PK中的id對你沒有任何作用(你說數據已設置,並且不變,沒有理由繼續檢查任何東西的唯一性......這是在源系統中完成的),如果有什麼會減慢你的查詢速度,所以我要做的只是在SUM_Amount上添加一個聚集索引,它將訂購你要的數據,並在顯示的兩個查詢中創建索引查找。