首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >索引的选择性应如何?

索引的选择性应如何?
EN

Database Administration用户
提问于 2018-06-06 04:16:45
回答 2查看 1.4K关注 0票数 5

是否有适用非聚集索引的一般选择性规则?

我们知道不要在位列( 50/50 )上创建索引。“50/50发行版的行,可能会给您带来很少的性能增益”服务器中的索引位字段

那么,在应用索引之前,查询在Server中应该有多大的选择性呢?Server指南中是否有一般规则?25%的平均选择性分布? 10%的选择性?

这篇文章指出了大约31%的指数应该有多大的选择性?

EN

回答 2

Database Administration用户

回答已采纳

发布于 2018-06-06 14:23:13

只有当决定要索引的列时才考虑列的选择性时,才会忽略索引可以做什么,以及它们通常用于什么。

例如,您可能有一个标识或guid列,它具有难以置信的选择性--独特,甚至--但从未被使用过。既然如此,谁在乎呢?为什么查询不涉及索引列?

选择更少的索引,即使是BIT列,也可以成为索引的有用或有用的部分。在某些情况下,大型表上非常非选择性的列在需要排序或按其分组时可以从索引中获得相当大的好处。

Joins

请接受以下查询:

代码语言:javascript
复制
SELECT COUNT(*) AS records
FROM dbo.Users AS u
JOIN dbo.Posts AS p
ON u.Id = p.OwnerUserId;

如果在OwnerUserId上没有一个有用的索引,这是我们使用Hash连接的计划--这会溢出--但这是次要的。

有了一个有用的指数-- CREATE INDEX ix_yourmom ON dbo.Posts (OwnerUserId); --我们的计划发生了变化。

聚集

同样,分组操作可以从索引中受益。

代码语言:javascript
复制
SELECT   p.OwnerUserId, COUNT(*) AS records
FROM     dbo.Posts AS p
GROUP BY p.OwnerUserId;

没有索引的:

有索引:

排序

排序数据可能是查询中的另一个症结所在,索引可以帮助这些查询。

没有索引的:

用我们的指数:

阻塞

索引还可以帮助避免阻塞堆叠。

如果我们试图运行此更新:

代码语言:javascript
复制
UPDATE p
SET p.Score += 100
FROM dbo.Posts AS p
WHERE p.OwnerUserId = 22656;

并同时运行以下选择:

代码语言:javascript
复制
SELECT *
FROM   dbo.Posts AS p
WHERE  p.OwnerUserId = 8;

他们最终会被封锁:

在索引就位后,select立即结束,而不会被阻塞。Server有一种有效访问所需数据的方法。

如果您想知道(使用Kumar提供的方程),OwnerUserId列的选择性是0.0701539878296839478

将它包裹在

不要仅仅根据列的选择性来盲目地索引列。设计有助于工作负载高效运行的索引。在搜索相等谓词时,使用更多的选择性列作为主导键列通常是个好主意,但在范围搜索时可能不太有用。

票数 9
EN

Database Administration用户

发布于 2018-06-06 11:33:08

您所指的是“临界点”,Server优化器决定使用表扫描,而不是索引查找和键查找。

需要注意的是,临界点显然只影响非聚集索引(因为在使用聚集索引时不需要进行键查找),而且当非聚集索引覆盖时(所有选定的列都在键列中或索引的包含列中),提示点也不起作用。

尽管如此,行数并不是总行数的30%。这不是一个固定的值。

行数在页面数的25%到33%之间,因此,除非每页有1行,否则行的百分比要小得多。

参见金伯利·特里普在临界点查询答案中的例子

  • 如果一个表有500,000页,那么25% = 125,000页和33% = 166,000页。因此,查询将提示125,000至166,000行。将这一比例变为12.5万/100万= 12.5%和16.6万/100万= 16.6%。因此,如果一个表有50万页(和100万行),那么返回数据少于12.5%的查询可能会使用非聚集索引来查找数据,超过16.6%的查询可能使用表扫描。
  • 如果一个表有10,000页,那么25% = 2,500页,33% = 3,333页。因此,在2,500至3,333行之间,查询将被提示。将这一比例转化为2,500/1,000,000= .25%和3,333/1,000,000= .33% (甚至不到1%)。因此,如果一个表只有10,000页(和100万行),那么返回数据不足1%的查询很可能使用非聚集索引来查找数据,超过三分之一的查询可能使用表扫描。
  • 如果一个表有50,000页,那么25% = 12,500页,33% = 16,666页。因此,查询将提示12,500至16,666行。将这一比例变为12,500/100万= 1.25%和16,666/100万= 1.66% (低于2%)。因此,如果一个表有5万页(和100万行),那么返回数据少于1.25%的查询可能使用非聚集索引来查找数据,超过1.66%的查询可能使用表扫描。

现在,要回答您的问题,在使用索引之前,它应该有多大的选择性?

根据您的行大小和页数,它可能非常有选择性。如果您想确保您的索引被使用,您希望您的索引包括在内。

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

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

复制
相关文章

相似问题

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