“聚集索引”和“按条款排序”

时间:2011-06-01 05:30:42

标签: sql-server sql-server-2005 sql-server-2008

集群索引按条款排序之间有什么区别吗?

我必须填写主表中的Dropdown,以下是查询。

Select Id, Name from Table Order by Name

我是否应该使用按条款排序聚集索引进行上述任务?

修改

以下是表的架构

IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[lookup]') AND type in (N'U'))
BEGIN
CREATE TABLE [dbo].[lookup](
    [Id] [int] IDENTITY(1,1) NOT NULL,
    [Name] [varchar](50) NULL,
 CONSTRAINT [PK_lookup_ID] PRIMARY KEY NONCLUSTERED
(
    [Id] ASC
)WITH (PAD_INDEX  = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
END
GO

IF NOT EXISTS (SELECT * FROM sys.indexes WHERE object_id = OBJECT_ID(N'[dbo].[lookup]') AND name = N'IX_lookup_Name')
CREATE CLUSTERED INDEX [IX_lookup_Name] ON [dbo].[lookup]
(
    [Name] ASC
)WITH (PAD_INDEX  = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY]

我在Name上也有一个聚集索引。但是现在它没有在架构中显示。对不起,我不知道为什么。

5 个答案:

答案 0 :(得分:17)

苹果和橘子。聚簇索引是一种存储选项。 ORDER BY是一个查询选项。如果您需要有序的结果,那么 only 获取它们的方法是在查询中添加ORDER BY子句。期。

索引可以帮助查询优化器生成更有效的计划,并利用索引作为满足ORDER BY要求的方法。但是,聚类或非聚集索引的存在决不会保证结果的任何排序。

所以你在查询中绝对需要ORDER BY。您还可以 考虑Name列的索引来帮助查询。无论是否使用指数,都取决于更多因素。你应该阅读Designing IndexesThe Tipping Point

答案 1 :(得分:1)

索引允许快速搜索过滤“WHERE CLAUSE”,但也有额外的好处,即数据将被排序。

例如

这是数据保存在表格中的方式。

ID    Name
1     Jack
2     Bob
3     Jill

如果在名称(ASC)上添加聚集索引,则保存它的方式(主键始终与每个索引一起存储,以便查找信息)

2     Bob
1     Jack
3     Jill

所以使用你的SQL

Select Id, Name from Table Order by Name

对于没有聚集索引的选择,数据库将检查是否存在可以帮助更快地完成工作的索引。它将找不到任何内容,因此它将从表中选择数据,对其进行排序,然后返回。

对于具有聚簇索引的select,数据库将检查是否存在可以帮助更快地完成工作的索引。它将在名称上找到ASC排序的索引。它只需从索引中选择ID和Name,然后返回,因为它知道数据已经被排序。

因此,如果没有名称索引,数据库必须在每次运行查询时对数据进行排序。 使用索引,当数据被插入或更新时会发生排序(这会稍微减慢更新)不同之处在于它只需要排序一次而不是每次排序。

答案 2 :(得分:0)

如果Id是您的主键(这是常见方案)并且在连接中使用,则应在Id上创建聚簇索引。 但是为了搜索性能增益,您应该在Name上创建非聚集索引,其中包括Id。

答案 3 :(得分:0)

聚集索引和order by子句是两个完全不同的东西。聚簇索引决定如何对存储表中的行进行排序。 order by子句决定如何排序查询结果。

非聚集索引在数据库存储中创建另一个“影子表”,该索引在索引列上排序。它还包含主键,因此它可以在“真实”表中快速找到正确的行。数据库设计的最佳实践是在主键上创建聚簇索引(除非有理由反对它)。需要编制索引的任何其他列都可以在非聚簇索引中处理。

为了优化性能,where子句条件可以使用索引而不是顺序依次更为重要。

答案 4 :(得分:0)

我的第一个问题 是:什么是商业用例?如果答案是“按名称顺序显示行”,则按顺序命名。

既然你提到你已经在Name上有一个非聚集索引,你应该很高兴。

我还想象你会在'Name'上过滤数据,所以你已经在使用索引了。

我的第二个想法 :您是否过早地优化了这个?该表会有数千或数百万行吗?如果没有,您可能不会注意到索引是否存在。如果你确实有数千行,那么下拉框在没有过滤的情况下表现得有多好?

我们可以进行大量猜测,因此最好在您的环境中对查询进行分析。

通常,您将CLUSTERED INDEX置于递增值(IDENTITY,创建日期等)或数据是否相对静态。并非每个表都需要聚集索引。

相关问题