SQL Server中的Insert/Update/Delete语句应使用哪种类型的索引(聚集/非聚集)。我知道它会产生额外的开销,但与非聚集索引相比,它的性能更好吗?另外,SQL Server中的Select语句应该使用哪个索引?
发布于 2010-04-24 04:31:51
不是100%确定你期望听到的是什么-你只能在一个表上有一个集群索引,默认情况下,每个表(有很少的边缘情况例外)都应该有一个。所有索引通常对您的选择帮助最大,一些索引往往会损害插入、删除和可能的更新(如果选择得不好,可能会有很大影响)。
对于每个操作,聚集索引可以使表变得更快。是!确实如此。有关背景信息,请参阅Kim Tripp的优秀The Clustered Index Debate continues。她还提到了她对聚集索引的主要标准:
)(never changes)
INT标识完全满足了GUID所不具备的功能。有关详细的背景信息,请参阅GUID's as Primary Key。
为什么很窄?是因为聚集键被添加到同一个表上的每个非聚集索引的每个索引页中(以便能够在需要时实际查找数据行)。你不希望在你的集群密钥中有VARCHAR(200) ...
为什么是唯一的??如上所示-聚集键是SQL Server用来唯一查找数据行的项和机制。它必须是唯一的。如果您选择了一个非唯一的群集键,SQL Server本身将为您的键添加一个4字节的唯一标识符。当心那个!
下一步:非聚集索引。基本上有一条规则:子表中引用另一个表的任何外键都应该被索引,这将加快连接和其他操作的速度。
此外,任何具有WHERE子句的查询都是一个很好的候选者-首先选择那些执行得很多的查询。将索引放在WHERE子句中显示的列上,放在ORDER BY语句中。
接下来:测量您的系统,检查DMV(动态管理视图)中有关未使用或缺少索引的提示,并反复调整您的系统。这是一个持续的过程,你永远不会完成!
另一个警告:使用一车的索引,您可以让任何SELECT查询执行得非常非常快。但与此同时,必须更新所有相关索引的插入、更新和删除操作可能会受到影响。如果你只选择-去坚果!否则,这是一个微妙而微妙的平衡行为。您总是可以对单个查询进行令人难以置信的调整--但这样做可能会影响系统的其余部分。不要过度索引你的数据库!设置几个好的索引,检查和观察系统的行为,然后可能再添加一个或两个,然后再次:观察系统的总体性能是如何受其影响的。
发布于 2010-04-24 04:29:41
我不太确定您所说的“应该用于Insert/Update/Delete语句”是什么意思,但在我看来,每个表都应该有一个聚集索引。聚集索引指定数据的实际存储顺序。如果没有定义聚集索引,数据将简单地存储在堆中。如果没有自然列作为聚集索引,那么可以像下面这样创建一个标识列作为int或bigint。
CREATE TABLE [dbo].[demo](
[ID] [int] IDENTITY(1,1) NOT NULL,
[FirstName] [nchar](10) NULL,
[LastName] [nchar](10) NULL,
[Job] [nchar](10) NULL,
CONSTRAINT [PK_demo] PRIMARY KEY CLUSTERED
(
[ID] ASC
))https://stackoverflow.com/questions/2701777
复制相似问题