Questions tagged «clustered-index»

一种索引类型,通常在SQL Server中使用,它使表的数据与索引对齐。


3
在SQL Server 2012中索引PK GUID
我的开发人员已将其应用程序设置为将GUID用作几乎所有表的PK,并且默认情况下,SQL Server已在这些PK上设置了聚集索引。 该系统还比较年轻,我们最大的表刚刚超过一百万行,但是我们正在研究索引并希望能够迅速扩展,因为不久的将来可能会需要它。 因此,我的第一个倾向是将聚集索引移动到创建的字段,该字段是DateTime的bigint表示形式。但是,使CX唯一的唯一方法是在此CX中包括GUID列,但先创建顺序。 这会导致群集密钥太宽,是否会提高写入性能?读取也很重要,但是此时写入可能是一个更大的问题。

6
重建非常大的主键索引
我有一个托管在Azure上的SQL数据库。问题在于大小已失控,我可以在主键聚集索引中看到多达99%的碎片。 我能够使用online=onoption 重建所有其他索引,并且不会影响性能。PK聚簇索引之一的大小大于200GB,并且为此REBUILD...WITH (ONLINE=ON)导致锁定。 实际上,确实有来自所有时区的用户都在访问该网站,因此,我找不到可以离线重建索引的时间。 在不造成站点停机的情况下重建大型索引的最佳策略是什么? 我相信重组将无济于事,因为碎片化率为99%。问题在于该表即使在线也被锁定。主要问题是索引大于200GB。主键是一个整数。

2
为什么索引视图不允许非唯一聚集索引?
我一直在研究使用索引视图来提高一些我们最常用的视图的性能。 但是,索引视图不支持非唯一的聚集索引,这与其余数据库结构设置的优先级略有不同。 例如,这是几个表的简化版本。 -Groups- Group ID GroupName -Users- UserKey UserName FullName GroupID 索引位于Groups.GroupID(非群集)和Users.GroupID(群集)上。聚簇键位于“用户”表中的GroupID上,因为通常会检索到来自特定组的一系列用户。显然,每个组将有多个用户,因此该聚集索引是唯一的。 这使我不确定如何在索引我的视图(例如本示例)时遵循此优先顺序,因为我无法拥有非唯一的聚集索引。 ConsumableID ConsumableVariantID AllowThresholdOverwrite FullPath GroupID ManufacturerID Type ModelID 101 29 1 0.1.2.4. 4 3 3 2 实际上,此View上唯一唯一的值是ConsumableID列,因此在将索引放置到什么地方时,我别无选择。 为什么在常规表允许时View不允许非唯一聚集索引?

2
聚集索引选择-PK还是FK?
我有一个SQL Server 2014表,如下所示: OrderId int not null IDENTITY --this is the primary key column OrderDate datetime2 not null CustomerId int not null Description nvarchar(255) null 我团队中的某些人建议应将聚集索引设置为on OrderId,但由于以下原因,我认为CustomerId+ OrderId是更好的选择: 几乎所有查询都会查找WHERE CustomerId = @param,而不是OrderId CustomerId是Customer表的外键,因此具有聚集索引CustomerId可以加快连接速度 虽然CustomerId不是唯一的,但OrderId在索引中指定其他列将确保唯一性(我们可以UNIQUE在这两列上创建聚集索引时使用关键字,以避免不唯一性的开销) 插入数据后,CustomerId和OrderId永远不会更改,因此在初始写入后这些行将不会移动。 数据访问通过默认情况下请求所有列的ORM进行,因此当基于的查询CustomerId进入时,聚集索引将能够提供所有列而无需任何其他工作。 是否CustomerId和OrderId做法的声音是最好的选择给出了上述?或者,OrderId由于它是一个单独保证其唯一性的列,它本身会更好吗? 当前,该表在上有一个聚集索引,在上有一个OrderId非聚集索引CustomerId,但是没有覆盖,因此,由于我们使用的是ORM,并且要求所有列,因此检索它们是额外的工作。因此,通过这篇文章,我试图考虑使用更好的CI来提高性能。 我们数据库上的活动是大约85%的读取和15%的写入。

2
DATALENGTH的总和与sys.allocation_units中的表大小不匹配
我的印象是,如果我将DATALENGTH()一个表中所有记录的所有字段的总和求和,我将得出该表的总大小。我错了吗? SELECT SUM(DATALENGTH(Field1)) + SUM(DATALENGTH(Field2)) + SUM(DATALENGTH(Field3)) TotalSizeInBytes FROM SomeTable WHERE X, Y, and Z are true 我在下面使用此查询(我从网上获得此查询来获取表大小,仅聚集索引,因此它不包含NC索引)来获取数据库中特定表的大小。出于计费目的(我们按部门使用的空间量向部门收取费用),我需要找出此表中每个部门使用的空间。我有一个查询,用于标识表中的每个组。我只需要弄清楚每个小组要占用多少空间。 由于VARCHAR(MAX)表中的字段,每行空间可能会波动很大,因此我不能只取平均大小*部门的行数比率。当我使用上述DATALENGTH()方法时,我只能获得下面查询中使用的总空间的85%。有什么想法吗? SELECT s.Name AS SchemaName, t.NAME AS TableName, p.rows AS RowCounts, (SUM(a.total_pages) * 8)/1024 AS TotalSpaceMB, (SUM(a.used_pages) * 8)/1024 AS UsedSpaceMB, ((SUM(a.total_pages) - SUM(a.used_pages)) * 8)/1024 AS UnusedSpaceMB FROM sys.tables t with …

1
非企业版和性能的noexpand提示
我必须使用索引视图才能达到性能。从该比较表中可以看出,标准版不支持索引视图。但是BOL说: 可以在任何版本的SQL Server中创建索引视图。在SQL Server Enterprise中,查询优化器会自动考虑索引视图。要在所有其他版本中使用索引视图,必须使用NOEXPAND表提示。 这样行得通吗(我在说性能) select * from dbo.OrderTotals with (noexpand, index=IXCU_OrderTotals) 在SQL Server Standard Edition上正常运行 select * from dbo.OrderTotals 对企业一? 这是查看代码: CREATE VIEW dbo.OrderTotals WITH SCHEMABINDING AS select OrderId = r.OrderId , TotalQty = SUM(r.Quantity) , TotalGrossConsid = SUM(r.Price * r.Quantity) , XCount = COUNT_BIG(*) from dbo.Order r …

2
为什么禁用聚集索引会使表不可访问?
禁用索引后,定义保留在系统目录中,但不再使用。SQL Server不维护索引(当表中的数据更改时),并且该索引不能用于满足查询。如果禁用了聚集索引,则整个表将无法访问。 为什么不能直接从丢弃B树的表中访问数据?(最有可能通过逐行扫描表)是否比使数据完全不可访问更合适? 这是一个纯粹的理论问题-我绝对不会这样做。这不是一个场景,也不是一个要做的事情,我只是想知道事情为什么这样发展,将其视为内部问题。

2
创建表时聚簇索引创建失败
运行以下脚本时出现错误; IF NOT EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE='BASE TABLE' AND TABLE_NAME='Table_Name') BEGIN CREATE TABLE Table_Name ( Field_Name_1 binary(32) NOT NULL CONSTRAINT PK_Name_Goes_Here PRIMARY KEY NONCLUSTERED , Field_Name_2 int NOT NULL , Field_Name_3 datetime NOT NULL INDEX IX_Name_Goes_Here CLUSTERED ) END 特别是聚集索引的创建会引发以下错误: 消息1018,级别15,状态1,第15行 'INDEX'附近的语法不正确。如果要将其用作表提示的一部分,则现在需要A WITH关键字和括号。有关正确的语法,请参见SQL Server联机丛书。 这很奇怪,因为它适用于我们所有的服务器,但特定的质量检查服务器除外。我们已经解决的问题是在表创建语句之外创建聚簇索引,但是如果有人之前遇到过此问题,我将很感兴趣。

2
使用聚簇索引时,是否读取“行外”字段?
我知道VARCHAR(MAX)/NVARCHAR(MAX)使用列时会存储数据out of the row-数据行将具有指向另一个存储“大值”位置的指针。 我有以下问题: 是存储每个字段out of the row还是仅存储一个字段max? 如果您使用clustered index表的读取整个记录,那么是否也读取了行外存储的字段? VARCHAR(MAX)或NVARCHAR(MAX)被视为“大值类型”。大值类型通常存储在“行外”。这意味着...

3
在聚集索引上重建,为什么datasize缩小?
当我们在其中包含约15gb数据的表的聚集索引上进行重建时,数据大小缩小到5gb,这怎么可能?什么样的“数据”被删除? 数据大小,我的意思是DBCC sp_spaceused的“数据”列 在聚集索引上重建之前: name rows reserved data index_size unused LEDGERJOURNALTRANS 43583730 39169656 KB 15857960 KB 22916496 KB 395200 KB 在聚集索引上重建后: name rows reserved data index_size unused LEDGERJOURNALTRANS 43583730 29076736 KB 5867048 KB 22880144 KB 329544 KB 用于重建的TSQL: USE [DAX5TEST] GO ALTER INDEX [I_212RECID] ON [dbo].[LEDGERJOURNALTRANS] REBUILD PARTITION = ALL …

1
为什么对具有INSTEAD OF UPDATE触发器的表进行UPDATE似乎会执行聚集索引插入以及聚集索引更新?
我将从一个非常简单的示例开始:两个表都具有相同的模式,它们都聚集在PK上,但是其中一个具有INSTEAD OF UPDATE触发器: CREATE TABLE Standard ( PK UNIQUEIDENTIFIER PRIMARY KEY CLUSTERED, V INT NOT NULL ) GO CREATE TABLE InsteadOf ( PK UNIQUEIDENTIFIER PRIMARY KEY CLUSTERED, V INT NOT NULL ) GO INSERT Standard (PK, V) VALUES ('1E58B555-B073-471E-B576-4B09C8E18976', 0) INSERT InsteadOf (PK, V) VALUES ('1E58B555-B073-471E-B576-4B09C8E18976', 0) GO CREATE TRIGGER …


4
如何故意对SQL Server索引进行分段?
我想在我拥有的SQL Server 2017测试数据库上有意创建坏索引条件,只是为了更好地理解这些维护脚本?SQL Server索引和统计信息维护 是否有快速/自动的方式来破坏索引完整性或增加索引碎片?您知道我有什么有用的资源可以实现这一目标吗?

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

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.