【问题标题】:Busy table, to index or not to index繁忙的表,索引或不索引
【发布时间】:2011-09-04 06:46:56
【问题描述】:

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])

【问题讨论】:

  • 你可能也读过那张表?每个请求?是的,用户和 ip 肯定会从索引中受益。
  • 是的,每个要求。读写

标签: sql-server indexing sql-server-2008-r2


【解决方案1】:

在写入表期间添加索引成本。 (插入、更新、删除操作)。它可以提高读取性能(SELECT、UPDATE、DELETE 操作)。因此,如果您的读取次数多于写入次数,那么可以,索引可以帮助您。如果你读的比写的少得多,那么索引可以帮助你,因为你不必读那么多(索引基本上是表的一个小子集,如果你的选择只命中那个子集,那么你可以加快读取速度在某些情况下相当)

我会添加索引并监控性能,如果它不适合您然后删除索引。最终,唯一确定的方法是尝试并比较结果。

【讨论】:

  • 啊——索引也可以加快删除和更新操作,对不起。因为对于删除和更新,您必须首先查找行,并且没有索引是强制表扫描。即使插入也可能更慢 - 没有索引的唯一键(主键)=....再次进行表扫描。
【解决方案2】:

数据存在的时间并不能告诉您是否需要建立索引。但是更新率与读取率确实如此。没有索引的插入是最快的。更新和删除可能不是,因为在搜索要更改的记录时,它们可能会受益于索引。选择也受益于索引。

所以通常最好有索引,即使一个表有很多更新。一般的例外是用于记录的表,您通常只写入该表,除非您确实需要该日志。

但可以肯定的是,您最好在其中放置一个索引并监控性能提升或提升。

【讨论】:

    【解决方案3】:

    拥有一个良好的集群键实际上可以加速甚至你的插入(阅读 Kimberly Tripp 的优秀博文 The Clustered Index Debate Continues 以获得出色而彻底的解释,为什么会这样)!而且从外观上看,您根本没有聚类键。

    因此,我绝对建议在您的 id 列上添加主键/集群键 - 它非常适合良好的集群键:窄、静态、唯一、不断增加:

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

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

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

    基本上,你需要做什么:

    • 建立基线 - 衡量您的表现
    • 然后应用有意义的索引 - 包括 WHERE 子句和/或 ORDER BY 表达式中使用的列
    • 再次测量并比较

    真的没有什么神奇的公式可以决定您是否需要索引、它是什么以及它对您的场景有多大帮助(或者它会在多大程度上损害 INSERT 性能)——您需要在您的数据库上衡量自己,您的硬件,您的环境。

    【讨论】:

    • 感谢您的回复。错误地点击了反对票,而不是试图通过赞成票来修复它。我希望它不会影响您的个人资料
    猜你喜欢
    • 1970-01-01
    • 2013-05-12
    • 2021-10-22
    • 2011-04-13
    • 1970-01-01
    • 1970-01-01
    • 2021-12-02
    • 2013-05-22
    • 2018-05-06
    相关资源
    最近更新 更多