Questions tagged «clustered-index»

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

3
使用SSD时,数据库设计中的聚集索引概念是否明智?
在设计SQL Server数据架构和后续查询,存储过程,视图等时,对于明确要部署在SSD平台上的数据库设计,聚集索引的概念和磁盘上数据的顺序是否有意义? “ http://msdn.microsoft.com/zh-cn/library/aa933131(v=sql.80).aspx “聚集索引确定表中数据的物理顺序。” 在物理磁盘平台上,考虑到它们的设计对我来说很有意义,因为对数据进行物理扫描以检索“顺序”行比在表中查找更有效。 在SSD平台上,所有数据读取访问都使用相同的查找。就位存储在同一块硅片而言,没有“物理顺序”的概念,并且数据读取不是“顺序的”。 那么,在设计应用程序数据库的过程中,聚集索引的考虑是否与此平台相关? 我最初的想法不是因为“有序数据”的概念不适用于SSD的存储和查找/恢复优化。 编辑:我知道SQL Server 将创建一个,我只是在思考在设计/优化过程中考虑它是否有意义。

6
为什么在我的测试案例中,顺序的GUID密钥比顺序的INT密钥执行得更快?
询问后这个问题比较顺序和非顺序的GUID,我试图表与顺序初始化的GUID主键比较上1 INSERT性能)newsequentialid(),和2)的表与INT主键与顺序初始化identity(1,1)。我希望后者是最快的,因为整数的宽度较小,并且生成顺序整数比顺序GUID似乎也更简单。但是令我惊讶的是,带有整数键的表上的INSERT显着慢于顺序GUID表。 这显示了测试运行的平均时间使用量(毫秒): NEWSEQUENTIALID() 1977 IDENTITY() 2223 谁能解释一下? 使用了以下实验: SET NOCOUNT ON CREATE TABLE TestGuid2 (Id UNIQUEIDENTIFIER NOT NULL DEFAULT NEWSEQUENTIALID() PRIMARY KEY, SomeDate DATETIME, batchNumber BIGINT, FILLER CHAR(100)) CREATE TABLE TestInt (Id Int NOT NULL identity(1,1) PRIMARY KEY, SomeDate DATETIME, batchNumber BIGINT, FILLER CHAR(100)) DECLARE @BatchCounter INT = 1 …

3
非聚集索引在堆上的性能与聚集索引的性能
该2007年白皮书比较了在作为聚簇索引组织的表上与在与CI相同的关键列具有非聚簇索引的组织为堆的表上的单个选择/插入/删除/更新和范围选择语句的性能表。 通常,聚簇索引选项在测试中表现更好,因为只需要维护一种结构,并且因为不需要书签查找。 本文未涉及的一个可能有趣的案例是,堆上的非聚簇索引与聚簇索引上的非聚簇索引之间的比较。在那种情况下,我希望堆甚至可以在NCI叶级别上表现更好,因为SQL Server具有直接遵循的RID,而不需要遍历聚集索引。 是否有人知道在这一领域已经进行过类似的正式测试,如果是的话,结果是什么?

2
PK索引中的列顺序重要吗?
我有一些具有相同基本结构的非常大的表。每个都有一个RowNumber (bigint)和DataDate (date)列。每天晚上使用SQLBulkImport加载数据,并且从未加载过任何“新”数据-它是历史记录(SQL Standard,不是Enterprise,因此没有分区)。 因为每个数据位都需要绑定到其他系统,并且每个RowNumber/DataDate组合都是唯一的,所以这就是我的主键。 我注意到,由于我在SSMS Table Designer中定义PK的方式,RowNumber第一和DataDate第二列出了。 我还注意到,我的碎片始终非常高,高达〜99%。 现在,由于每个DataDate索引仅出现一次,所以我希望索引器每天都添加到页面中,但是我想知道它是否实际上是RowNumber首先基于索引编制的,因此是否需要转移其他所有内容? Rownumber不是一个标识列,它是一个由外部系统生成的int(很糟糕)。它在每个开始时重置DataDate。 示例数据 RowNumber | DataDate | a | b | c..... 1 |2013-08-01| x | y | z 2 |2013-08-01| x | y | z ... 1 |2013-08-02| x | y | z 2 |2013-08-02| x | y | z …

3
HEAP表的有效使用方案是什么?
我目前正在将一些数据导入到旧版系统中,并且发现该系统未使用单个群集索引。快速的Google搜索向我介绍了HEAP表的概念,现在我很好奇在哪种使用情况下,HEAP表比集群表更可取? 据我了解,HEAP表仅对审计表和/或插入比选择频繁发生的地方有用。由于没有要维护的聚簇索引,而且由于非常罕见的读取,因此不会产生额外的碎片,因此,这将节省磁盘空间和磁盘I / O。


3
高效插入具有聚簇索引的表
我有一条SQL语句,将行插入到表中,该表在TRACKING_NUMBER列上具有聚簇索引。 例如: INSERT INTO TABL_NAME (TRACKING_NUMBER, COLB, COLC) SELECT TRACKING_NUMBER, COL_B, COL_C FROM STAGING_TABLE 我的问题是-在SELECT语句中为聚集索引列使用ORDER BY子句是否有帮助,或者ORDER BY子句所需的额外排序会否抵消获得的任何收益?

4
从SQL Server 2000开始,“避免基于递增键创建聚簇索引”是神话吗?
我们的数据库由很多表组成,其中大多数表使用整数代理键作为主键。这些主键中大约有一半在标识列上。 数据库开发始于SQL Server 6.0。 从一开始就遵循的规则之一是,避免在这些索引优化技巧中找到基于递增键创建聚簇索引的方法。 现在使用SQL Server 2005和SQL Server 2008,给人留下深刻的印象,那就是情况已经改变。同时,这些主键列是表聚集索引的最佳首选。

1
在SQL Server中,为什么向后扫描聚集索引不能不使用并行性?
我一直在阅读有关SQL Server内部的信息,每本书或博客都提到了有关向后扫描的内容。 向后扫描聚集索引不能使用并行性 唯一说些什么的是下面的这篇文章。该帖子说,SQL Server团队没有实现向后扫描所需的优化。https://www.itprotoday.com/sql-server/descending-indexes 由于叶级页面是使用双向链接列表链接的,因此我不明白为什么向后扫描与向前扫描不同。任何澄清都非常感激。

1
选择索引视图的聚集索引有哪些因素?
简而言之 ,查询优化器选择索引视图索引时会考虑哪些因素? 对我来说,索引视图似乎无视我对Optimizer如何选择索引的理解。我以前看过这个问题,但是OP不太受欢迎。 我确实在寻找路标,但是我将伪造一个伪示例,然后发布带有大量DDL,输出和示例的真实示例。 假设我使用的是Enterprise 2008+,请理解 with(noexpand) 伪示例 以这个伪示例为例:我创建一个具有22个联接,17个过滤器和一个马戏团小马的视图,该马戏小马穿过一千万个行表。这种观点很昂贵(是的,用大写字母E)可以实现。我将对SCHEMABIND进行索引并为视图建立索引。然后一个 SELECT a,b FROM AnIndexedView WHERE theClusterKeyField < 84。在Optimizer逻辑中,我无法进行底层联接。 结果: 没有提示:4825读取720行,在76ms内读取47 cpu,估计的子树开销为0.30523。 使用提示:17次读取,720行,4 ms内15 cpu,估计的子树成本为0.007253 那么这是怎么回事?我已经在Enterprise 2008、2008-R2和2012中进行了尝试。通过每一个度量标准,我都认为使用视图索引的效率大大提高。我没有参数嗅探问题或数据偏斜,因为这是广告问题。 一个真实(长)的例子 除非您是一个受虐狂,否则您可能不需要或不想阅读此部分。 是的 ,企业版。 Microsoft SQL Server 2012-11.0.2100.60(X64)2012年2月10日19:39:15版权所有(c)Windows NT 6.2(Build 9200:)上的Microsoft Corporation Enterprise Edition(64位)(Hypervisor) 风景 CREATE VIEW dbo.TimelineMaterialized WITH SCHEMABINDING AS SELECT TM.TimelineID, TM.TimelineTypeID, TM.EmployeeID, …



2
什么索引可用于大量重复值?
让我们做一些假设: 我有这样的表: a | b ---+--- a | -1 a | 17 ... a | 21 c | 17 c | -3 ... c | 22 关于我的场景的事实: 整个表的大小是〜10 10行。 我有〜100k行,其中acolumn中有值,a其他值也类似(例如c)。 这意味着“ a”列中的〜100k个不同的值。 我的大部分查询将读取例如中的给定值的全部或大部分值select sum(b) from t where a = 'c'。 该表以这样的方式编写,即连续值在物理上接近(或者按顺序编写,或者我们假设CLUSTER已在该表和column上使用过a)。 该表很少更新(如果有的话),我们只关心读取速度。 该表相对较窄(例如每个元组约25个字节,+ 23个字节的开销)。 现在的问题是,我应该使用哪种索引?我的理解是: BTree我的问题是BTree索引将是巨大的,因为据我所知它将存储重复值(它必须这样做,因为它不能假定表是物理排序的)。如果BTree很大,那么我最终必须同时读取索引和该索引指向的表的各个部分。(我们可以用来fillfactor = 100稍微减小索引的大小。) BRIN我的理解是,我可以在这里建立一个小的索引,而以阅读无用的页面为代价。使用较小的值pages_per_range表示索引较大(这是BRIN的问题,因为我需要读取整个索引),使用较大的值pages_per_range表示我将读取很多无用的页面。pages_per_range考虑到这些折衷,是否有一个神奇的公式可以找到一个好的价值? GIN …

1
删除语句中未使用的聚集索引
我有一个SQL Server表定义如下 CREATE TABLE [dbo].[Production_Detail] ( [Id] [bigint] NOT NULL DEFAULT (NEXT VALUE FOR [dbo].[Production_Detail_Seq]), [Meta_Data_ID] INT NOT NULL , [Production_Detail_Time] DATETIME NOT NULL, [Production_Detail_Time_Local] DATETIME NOT NULL, [Production_Detail_Value] FLOAT NULL, [IntegratedDM] BIT NOT NULL DEFAULT 0, [DailyIntegratedDM] BIT NOT NULL DEFAULT 0, [InsertedDate] DateTime NOT NULL, [ModifiedDate] DateTime NOT …

2
VACUUM FULL和CLUSTER之间的PostgreSQL区别
我有一个表,其中数据占用200 GB的大小,表上的6个索引占用180 GB的大小。它已膨胀了30%,所以我想回收它占用的多余空间。它聚集在job_id_idx索引上。 所以要回收空间,我需要使用clustercommand还是vacuum fullcommand? 这两个命令有什么区别? 是vacuum full为了通过一些列相同cluster的命令? 是否在两个命令中都重新创建了索引? 就我而言,哪一个会更快? PostgreSQL数据库版本为9.1

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.