Questions tagged «nonclustered-index»

nonclustered-index标记应用于有关如何实施和解决主要用于增强性能的补充索引的问题。术语“非群集”通常是SQL Server特定的术语。

1
为什么删除行时非聚集索引使用更多空间?
我有一张有75亿行和5个索引的大表。当我删除大约1000万行时,我注意到非聚集索引似乎增加了它们存储在页面上的数量。 我写了一个查询dm_db_partition_stats来报告页面中的差异(之后-之前): 索引1是聚集索引,索引2是主键。其他的则是非集群且非唯一的。 为什么这些非聚集索引上的页面增加? 我希望最坏的数字保持不变。 我确实看到性能计数器报告了删除期间页面拆分的增加。 删除时,幻像记录是否必须移至另一页?这和“唯一符”有关吗? 我们正处于推出RCSI的中间阶段,但是现在,RCSI已关闭。 它是可用性组中的主要节点。我知道快照以某种方式在次要上使用。如果这很有意义,我会感到惊讶。我计划对此进行深入研究(查看dbcc页面输出)以了解更多信息。希望有人看到过类似的内容。

1
是否需要在非聚集索引中包含聚集索引列?
考虑到非聚集索引是基于聚集索引的,那么非聚集索引是否有必要列出聚集索引中包含的任何列? 换句话说,如果“产品”表在ProductID上包含聚集索引,则在创建非聚集索引时建议在其中包含ProductID列时,是否仍然需要将其添加为列? 如果不是,是否存在将列名添加到非聚集索引的好方案?

2
为什么我的索引未在SELECT TOP中使用?
总结:我正在执行选择查询。WHEREand ORDER BY子句中的每一列都在单个非聚集索引中IX_MachineryId_DateRecorded,可以作为键的一部分,也可以作为INCLUDE列。我选择了所有列,因此将导致书签查找,但我只是在考虑TOP (1),因此可以肯定的是服务器可以告诉查找,最后只需要执行一次。 最重要的是,当我强制查询使用index时IX_MachineryId_DateRecorded,它在不到一秒钟的时间内运行。如果我让服务器决定使用哪个索引,它将选择IX_MachineryId,最多需要一分钟。这确实向我表明,我已正确编制了索引,而服务器只是在做出错误的决定。为什么? CREATE TABLE [dbo].[MachineryReading] ( [Id] INT IDENTITY (1, 1) NOT NULL, [Location] [sys].[geometry] NULL, [Latitude] FLOAT (53) NOT NULL, [Longitude] FLOAT (53) NOT NULL, [Altitude] FLOAT (53) NULL, [Odometer] INT NULL, [Speed] FLOAT (53) NULL, [BatteryLevel] INT NULL, [PinFlags] BIGINT NOT NULL, [DateRecorded] DATETIME NOT …

1
未使用的NONCLUSTERED INDEX仍然可以提高查询速度吗?
这是一种奇怪的情况,但我希望有人能回答。 在进行一些性能问题排查期间,我们按照的要求将NONCLUSTERED INDEX添加到了表中sp_BlitzIndex。第二天,我们检查了它的使用情况,结果显示0次读取(0次扫描/搜索,0次单例查找),因此我们将其禁用。 在第二分钟,我们收到了抱怨应用程序缓慢(性能问题)的投诉,这是我们在添加INDEX时首先尝试检查并解决的问题。 现在,从理论上讲,这听起来纯属巧合。可证明,可衡量的是,未使用 INDEX 。禁用它不会导致查询性能下降。但它几乎TOO巧合。 题 因此,我的问题就很简单了: 它是在所有可能的,一个非聚集索引,其使用提供的统计(从动态管理视图/ sp_BlitzIndex)显示NO使用,还是已经帮助受影响的表以某种方式查询性能?

3
具有高选择性和低选择性字段的复合索引顺序中的字段顺序
我有一个超过30亿行的SQL Server表。我的查询之一花费了很长时间,因此我正在考虑对其进行优化。查询如下所示: SELECT [Enroll_Date] ,Count(*) AS [Record #] ,Count(Distinct UserID) AS [User #] FROM UserTable GROUP BY [Enroll_Date] [Enroll_Date]是一个低选择性列,可能值少于50个,而UserID列是高选择性列,其中有2亿多个不同的值。根据我的研究,我相信我应该在这两列上创建非聚集复合索引,并且从理论上讲,高选择性列应该是第一列。但是我不确定我的工作是否可行,因为我在group by子句中使用了低选择性列。 该表没有聚簇索引。

2
存储IP地址-varchar(45)与varbinary(16)
我要创建一个表有两个领域- ID作为BIGINT和IPAddress作为两种varchar(45)或varbinary(16)。想法是存储所有唯一的IP地址,并使用引用ID代替IP address其他表中的实际IP 。 通常,我将创建一个存储过程,该存储过程返回ID给定的IP address或(如果未找到地址)插入地址并返回生成的ID。 我期望有很多记录(我无法确切知道有多少条记录),但是我需要上面的存储过程尽快执行。因此,我想知道如何以文本或字节格式存储实际的IP地址。哪个会更好? 我已经编写SQL CLR了将IP地址字节转换为字符串和反向的函数,因此转换不是问题(使用IPv4和都可以IPv6)。 我想我需要创建一个索引来优化搜索,但是我不确定是否应该将该IP address字段包括在聚集索引中,还是要创建一个单独的索引,并且使用哪种类型的搜索会更快?



3
非聚集索引是否对行顺序有任何保证?
我有一个开发人员希望在不按顺序执行select语句时,将表中的行按插入的顺序排列。开发人员建议从聚簇索引更改为非聚簇索引。 通过将索引从聚集索引更改为非聚集索引,这是否可以保证表中行的出现顺序? 这个问题主要是出于我的好奇心。我将建议改用Identity列,但是这个请求让我开始思考。可以使用时间戳,但是有可能同时插入行。 在此先感谢您的帮助。

1
“警告:操作导致残留的I / O”与关键查找
我在SQL Server 2017执行计划中看到了以下警告: 警告:操作导致剩余IO [sic]。实际读取的行数为(3,321,318),但返回的行数为40。 这是SQLSentry PlanExplorer的片段: 为了改进代码,我添加了非聚集索引,因此SQL Server可以访问相关行。它工作正常,但通常索引中将包含太多(大)列。看起来像这样: 如果我仅添加索引,而没有包含列,则强制使用索引,如下所示: 显然,SQL Server认为密钥查找比剩余的I / O昂贵得多。我有一个没有大量测试数据的测试设置(但是),但是当代码投入生产时,它需要处理更多的数据,所以我很确定需要某种非聚集索引。 当您在SSD上运行时,关键查询真的那么昂贵吗?我必须创建全脂索引(包含很多包含列)吗? 执行计划: https : //www.brentozar.com/pastetheplan/?id=SJtiRte2X这是一个长存储过程的一部分。寻找IX_BatchNo_DeviceNo_CreatedUTC。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.