2011-06-01 57 views
10

是否存在被第聚集索引和秩序之间有什么区别?“聚集索引”和“句序”

我必须从主表填充下拉菜单,以下是查询。

Select Id, Name from Table Order by Name 

我应该使用ORDER BY子句或者聚集索引针对上述任务?

编辑

下面是桌子

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聚集索引为好。但现在它没有在模式中显示。对不起,我不知道为什么。

+0

我想,你应该按任何要求命令(Id或Name)。名字看起来像正确的顺序字段给我。 – 2011-06-01 05:34:14

回答

15

苹果和橘子。聚集索引是一个存储选项。 ORDER BY是一个查询选项。如果您需要订购的结果,只有获取它们的方法是将ORDER BY子句添加到您的查询中。期。

索引可能帮助查询优化器生成更高效的计划并利用索引作为满足ORDER BY需求的手段。但决不会保证任何索引的存在(聚簇或非聚簇),以确保结果的任何排序。

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

+0

对不起,如果我在名称上使用聚簇索引,它保证以升序显示名称。你也可以测试它。 – Pankaj 2011-06-01 06:44:07

+3

我完全可以向你保证你在你的假设中是错误的。 – 2011-06-01 06:45:04

+0

对不起,我测试了这个我的结局。它按姓名对记录进行排序,以防在名称上使用聚簇索引 – Pankaj 2011-06-01 06:49:07

0

如果Id是您的主键(这是常见的情况)并用于连接,您应该在Id上创建聚集索引。 但是为了搜索性能增益,您应该在Name上创建包含Id的非聚簇索引。

+0

我正在选择ID和名称而没有条款 – Pankaj 2011-06-01 06:41:48

0

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

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

为了优化性能,where子句条件可以使用的索引比罐子的顺序要重要得多。

+0

我没有使用where子句 – Pankaj 2011-06-01 06:36:57

0

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

既然你提到你已经有了名称上的非聚集索引,那么你应该很好。

我也想象你会过滤'姓名'上的数据,所以你已经在使用索引了。

我的第二个想法:你是否过早地优化了这个?表格将有成千上万或数百万行?如果没有,你可能不会注意到索引是否存在。如果你有成千上万的行,那么下拉框的行为没有过滤会有多好?

我们可以做很多猜测,所以如果您在您的环境中查询查询,总是最好的。

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

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 

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

对于使用聚集索引进行选择,数据库将检查是否存在可帮助快速完成其工作的索引。它会找到排序的ASC的名称索引。它只需从索引中选择ID和Name,然后返回,因为它知道数据已被排序。

因此,如果没有名称索引,则数据库每次运行查询时都必须对数据进行排序。 使用索引时,排序发生在数据被插入或更新时(这会稍微降低更新速度)。区别在于它只需要排序一次而不是每次都排序。

+0

有没有类似的,没有使用顺序,我们只有聚集索引来获取数据排序。系统不保证排序吗? – Pankaj 2011-06-01 07:04:45

+0

我不确定你在问什么。如果你只有一个聚集索引并且没有order by,那么会留下主键和聚集索引。由于聚集索引对查询没有任何好处,因此我会假设将使用表上的扫描并忽略聚集索引,这会导致不会排序的选择。我不确定为什么你不想在查询中排序,但仍然希望排序结果。您可能能够强制查询使用聚集索引,但这不是解决问题的最佳方式。 – 2011-06-01 07:35:42