【问题标题】:Need advise in choosing the right SQL indexes在选择正确的 SQL 索引时需要建议
【发布时间】:2014-02-06 16:12:22
【问题描述】:

我正在使用 Entity Framework 6.0 在 C# 4.5 / SQL2012 中重新执行我的“票务应用程序”。之前的开发是匆忙进行的,没有任何额外的索引。该应用程序运行良好,但我希望 v2 成为“应有的样子”。在我走得更远之前,我需要“垫在肩膀上”和这些词--是的.. ur doin' a'right-- ☺

在其他应用程序中,我的主键始终是我的 ID (int) 列,它恰好是集群的,因为它似乎是 SQL 的默认值。之后我只是添加了一个非聚集列“当我喜欢它的时候”。

总之.. 带有 id、类型(事件或请求)、状态(打开、暂停、已解决、..)、主题等的表 ticket。 带有 id 和名称的表 assignee 带有ticketId 和assigneeId 的表junctionTicketAssignee

票和受让人的关系是多对多的。 大多数时候,我只会通过它的 ID 来获取一张票或受让人。 在工单概览中,默认情况下工单的状态为“打开”和“暂停”,按分配给当前受让人的日期 (desc) 排序。

因此我现在有以下索引:

in 'ticket'
PK_ticket = PRIMARY KEY NON-CLUSTERED (ticket.id ASC)
IX_ticket = UNIQUE CLUSTERED (ticket.id ASC, ticket.dateCreate DESC, status ASC, type ASC)
IX_type = NON-UNIQUE NON-CLUSTERED (ticket.type)
IX_status = NON-UNIQUE NON-CLUSTERED (ticket.status)

in 'assignee'
PK_assignee = PRIMARY KEY CLUSTERED (assignee.id ASC)

in 'junctionTicketAssignee'
PK_junctionTicketAssignee = PRIMARY KEY CLUSTERED (ticketId ASC, assigneeId ASC)
FK_Assignee = PRIMARY KEY assignee.id -> FOREIGN KEY junctionTicketAssignee.assigneeId
FK_Ticket = PRIMARY KEY ticket.id -> FOREIGN KEY junctionTicketAssignee.ticketId

我已将这些与我对索引的基本知识放在一起。我在正确的轨道上吗?

【问题讨论】:

  • 您也可以查看filtered index。除此之外,看起来你在正确的轨道上。

标签: c# sql .net sql-server sql-server-2012


【解决方案1】:

如果你的索引策略是正确的,有很多不同的方法来解决。

首先在互联网上找到一篇关于索引的文章,然后阅读各种可用的索引。

然后使用实际执行计划运行一些查询并查看输出。然后找到一篇关于执行计划的文章并快速浏览一下。

有时,执行计划会提示缺少索引,并尝试引导您朝着正确的方向前进。

玩得开心。是的 - 你在正确的轨道上。

【讨论】:

  • 我已经安静地阅读了几篇文章,但我缺乏现实生活中的例子。 SQL 引擎何时使用 IX_type 和/或 IX_status 索引?
  • 认为索引在 WHERE 子句中很有用 ... ... WHERE ticket.type = 5... WHERE ticket.status = 1 。索引的部分工作是阻止数据库管理系统检查每一行。相反,可以检查索引并更快地检索数据值。
猜你喜欢
  • 1970-01-01
  • 2011-05-30
  • 1970-01-01
  • 1970-01-01
  • 2016-04-28
  • 1970-01-01
  • 1970-01-01
  • 2011-01-04
  • 2019-04-04
相关资源
最近更新 更多