当前位置: 首页 > 面试题库 >

SQL Server索引哪些群集?

王翰墨
2023-03-14
问题内容

我在某些表上有许多索引,它们都相似,并且我想知道聚集索引是否在正确的列上。以下是两个最活跃索引的统计信息:

Nonclustered
I3_Identity (bigint)
rows: 193,781
pages: 3821
MB: 29.85
user seeks: 463,355
user_scans: 784
user_lookups: 0
updates: 256,516

Clustered Primary Key
I3_RowId (varchar(80))
rows: 193,781
pages: 24,289
MB: 189.76
user_seeks: 2,473,413
user_scans: 958
user_lookups: 463,693
updates: 2,669,261

如您所见,经常搜索PK,但是对i3_identity列的所有搜索也正在对此PK进行关键查找,因此,我是否真的从I3_Identity的索引中受益匪浅?我应该改为使用I3_Identity作为群集吗?由于此表结构在我工作的地方重复了大约10000次,因此可能会产生巨大的影响,因此,我们将不胜感激。


问题答案:

弗雷德里克(Frederik)很好地总结了这一点,这正是金伯利·特里普(Kimberly
Tripp)所鼓吹的:集群密钥应该稳定(永不改变),不断增加(IDENTITY INT),小而独特。

在您的方案中,我宁愿将群集键放在BIGINT列上,而不是VARCHAR(80)列上。

首先,通过BIGINT列,可以很容易地实现唯一性(如果您自己不强制执行并保证唯一性,SQL
Server将为您的每一行添加一个4字节的“唯一性”),这是非常必要的平均比VARCHAR(80)小。

为什么尺寸如此重要?集群密钥也将添加到EACH和每个非集群索引中-
因此,如果您有很多行和很多非集群索引,那么40-80字节和8字节的字节数可以快速地增加区别。

另外,另一个性能提示:为了避免所谓的书签查找(从非聚簇索引中的值通过群集键进入实际数据叶页),SQL Server
2005引入了“包含列”的概念。在您的非聚集索引中。这些都是非常有帮助的,并且经常被忽略。如果您的查询经常需要索引字段以及数据库中仅一个或两个其他字段,请考虑包括这些字段以实现所谓的“覆盖索引”。再次-
请参见Kimberly Tripp的精彩文章-她是SQL Server索引女神!:-),她可以比我更好地解释这些东西。

综上所述:将您的集群键放在一个小的,稳定的,唯一的列上-您会做的很好!

马克



 类似资料:
  • Ehcache的2.5.x文档指出,它的标准实现提供了不依赖于索引的缓存搜索特性,并设法产生良好的性能( 该文档进一步指出,通过使用分布式缓存实现(“由Terracotta服务器阵列支持”),可以获得索引的好处。然而,似乎没有一种解决方案可以解决超过100万个元素的小型缓存,其大小足够小,不需要分发(我们的方案可以在~1Gb的缓存中容纳120万个元素)。 有没有人找到一种解决方法/解决方案来为这种

  • 本文向大家介绍SQLSERVER中忽略索引提示,包括了SQLSERVER中忽略索引提示的使用技巧和注意事项,需要的朋友参考一下 当我们想让某条查询语句利用某个索引的时候,我们一般会在查询语句里加索引提示,就像这样 当在生产环境里面,由于这个索引提示的原因,优化器一般不会再去考虑其他的索引,那有时候这个索引提示可能会导致查询变慢 经过你的测试,发现确实是因为这个索引提示的关系导致查询变慢,但是SQL

  • 本文向大家介绍详解sqlserver查询表索引,包括了详解sqlserver查询表索引的使用技巧和注意事项,需要的朋友参考一下 SELECT   索引名称=a.name  ,表名=c.name  ,索引字段名=d.name  ,索引字段位置=d.colid  需创建索引 例如: 根据某列判断是否有重复记录,如果该列为非主键,则创建索引 根据经常查询的列,创建索引 无须创建索引 字段内容大部分一样,

  • 本文向大家介绍做过哪些MySQL索引相关优化?相关面试题,主要包含被问及做过哪些MySQL索引相关优化?时的应答技巧和注意事项,需要的朋友参考一下 尽量使用主键查询: 聚簇索引上存储了全部数据, 相比普通索引查询, 减少了回表的消耗. MySQL5.6之后引入了索引下推优化, 通过适当的使用联合索引, 减少回表判断的消耗. 若频繁查询某一列数据, 可以考虑利用覆盖索引避免回表. 联合索引将高频字段

  • 问题内容: 我有一个非聚集索引要删除(它是聚集索引的副本)。但是,外键约束正在使用它。我希望能够确定哪个约束正在使用索引,因此我可以对其进行更新以使用主键索引。 当我尝试删除它时: 我收到一个错误: 不允许在索引’dbo.MyTable.idx_duplicate’上使用显式的DROP INDEX。它被用于FOREIGN KEY约束实施。 我尝试通过以下查询找到罪魁祸首,但没有运气: 问题答案:

  • 我使用Sqoop将数据从SQL server导入到本地HDF。我使用一个简单的自由形式查询从表中提取大约10行。下面是我从终端执行的sqoop命令: 当我从本地计算机执行此操作时,会出现以下异常: 原因:com。微软sqlserver。jdbc。SQLServerException:索引2超出范围。在com。微软sqlserver。jdbc。SQLServerException。在com上生成fr