2011-05-29 35 views
2

SQL Server是一个非常繁忙的表,它随时为大约6-10K用户保存活动,并在每个命中时都有插入/更新/删除。繁忙的表,要索引或不索引

我没有在这个表上使用索引,因为任何写入的数据都不会超过10分钟。

但在观看活动监视器时,我注意到SQL Server建议为该表添加索引。

我知道在表格上保留索引有其成本,你认为我应该增加索引?

更新有关的详细信息: SQL 2008 R2

 [id] [bigint] IDENTITY(1,1) NOT NULL, 
    [siteid] [int] NOT NULL, 
    [last_seen] [datetime] NOT NULL, 
    [ua] [varchar](250) NOT NULL, 
    [ip] [varchar](15) NOT NULL, 
    [t_id] [int] NOT NULL 

推荐指数

ON [dbo].[onlines] ([ua],[ip],[t_id]) 
+1

您可能从该表中读取?每个请求?是的,用户和IP可能肯定会从索引中受益。 – GolezTrol 2011-05-29 11:43:21

+0

是每个请求。读取和写入 – nLL 2011-05-29 11:48:08

回答

3

拥有一个良好的集群钥匙居然能加快甚至你的插件(阅读金佰利特里普的优秀博客文章The Clustered Index Debate Continues为一个伟大的和彻底的解释,为什么会这样)!从它的外观来看,你根本就没有集群密钥。

所以我肯定会推荐你的id栏添加一个主/聚集键 - 这是非常适合的好聚集关键字:窄,静态,唯一的,不断增加:

CREATE UNIQUE CLUSTERED INDEX CIX_YourTableName 
    ON dbo.YourTableName(ID) 

这应该加快一切 - 插入,更新,删除和选择。

您是否需要额外的索引(以及索引哪些列)取决于您的SELECT查询 - 因为您没有真正告诉我们关于这些的任何信息,我们只能猜测到蓝色.....

基本上,你需要做什么:

  • 建立一个基线 - 衡量你的表现
  • 然后应用有意义的指标 - 包括在所使用的列子句和/或ORDER BY表达式
  • 再次
  • 测量和比较

真的没有神奇的公式来决定你是否需要一个指数,它是什么,有多少,它会帮助你的情景(或多少会伤害INSERT性能) - 您需要测量自己,数据库,硬件和环境。

+1

感谢您的回复。点击了错误的投票,并试图通过投票解决它。我希望它不会影响你的个人资料 – nLL 2011-05-29 12:14:32

1

写入表中添加一个索引的成本。 (INSERT,UPDATE,DELETE操作)。它可以提高读取性能(SELECT,UPDATE,DELETE操作)。所以,如果你有更多的读取而不是写入,那么是的,索引可以帮助你。如果你阅读的内容比你写得少得多,那么索引可以帮助你,因为你不需要阅读更多的内容(索引基本上只是表格的一小部分,如果你的选择只打这个子集,那么你可以加快阅读速度相当多在某些情况下)

我会添加索引和监视性能,如果它不适合你然后删除索引。最终,知道确切的唯一方法就是尝试并比较结果。

+0

啊 - 索引也可以加快删除和更新操作,对不起。因为对于删除和更新,您必须首先查找行,并且没有强制表扫描的索引。即使插入可能会更慢 - 唯一键(priamry键)没有索引= ....表再次扫描。 – TomTom 2011-05-29 13:11:41

1

数据存在的时间并不能告诉你有关索引的需要。但更新与读取速度确实。没有索引插入是最快的。更新和删除可能不是,因为在搜索要更改的记录时,它们可能会从索引中受益。选择也从索引中受益。

因此,即使表中有很多更新,通常也会有更好的索引。一般的例外情况是一个记录表,除非有一次你真的需要记录,否则通常只写入记录表。

但是可以肯定的是,你最好在那里放一个索引并监视性能的提升或者提升。