首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >强制Server使用分段索引吗?

强制Server使用分段索引吗?
EN

Database Administration用户
提问于 2019-08-27 11:35:04
回答 2查看 517关注 0票数 7

我有一个相当大的表(>10M行),它具有频繁的crud操作。它有适当的索引,但它们很快就会变得支离破碎。如果没有定期的索引重组/重建维护计划,索引碎片很容易超过90%。

现在,我已经通过每天重新组织索引和每周进行重建来解决这个问题。我也玩了填充因子等,以保持较低的碎片。

我的主要问题是,当索引变得太零碎时,Server会忽略这些索引,而是执行完整的表扫描。当发生这种情况时,它几乎会杀死应用程序,因为对这样大的表进行多次扫描是非常繁重的。我确信在这种情况下使用分段索引会更快。

是否有一种方法可以让Server使用索引而不考虑其碎片?

EN

回答 2

Database Administration用户

回答已采纳

发布于 2019-08-27 11:46:57

索引提示

您可以使用索引提示来做到这一点:

代码语言:javascript
复制
SELECT *
FROM dbo.Users AS u WITH (INDEX = ix_definitely_an_index)
WHERE u.Reputation = 2;

缺点是:

  • 可能会更改大量代码
  • 如果您重命名索引,这将中断。
  • 如果更改索引定义,它可能不再是使用的最佳索引。

计划指南

您还可以使用计划指南,它可以设置您想要的计划。

缺点是:

  • 这是变化无常的;如果您的查询不完全相同,您的计划可能不会被使用
  • 设置起来很难,你必须把一切都做好
  • 和索引提示一样的东西,所以.这太难了。

查询商店?

由于您使用的是Server 2017,所以您可能可以使用查询存储强制计划。这比使用“计划指南”容易得多,但您最终可能会得到一个意外计划

缺点:

  • 和上面一样的东西
  • 必须启用查询存储,如果您还没有使用它
  • 必须查询商店以查看强制计划是否失败

Alternatives

在不了解更多信息的情况下,我可能会更热衷于调查索引是否出于其他原因(如参数嗅探 )使用更改。

票数 14
EN

Database Administration用户

发布于 2019-08-29 19:26:55

下一次Server忽略索引时,尝试对该索引或整个表进行完全扫描来更新统计信息。如果这样做有效,那么碎裂就不是问题了。

另外,Server在选择计划时并不关心碎片问题,但是如果由于“内部碎片”而变得太大,它可能会忽略索引。请检查索引页内的空空间。

票数 1
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/246355

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档