日期:2014-05-17  浏览次数:20490 次

帮忙看下怎么建这个索引~
数据库里面想要这样的数据排序形式,首先要以时间做索引,然后里面再以字母做分类索引
时间          字母
2010年1月 A
2010年1月 A
2010年1月 B
2010年1月 B
2010年1月 C
2010年1月 C
2010年1月 C
2010年1月 D
2010年1月 D
2010年2月 A
2010年2月 A
2010年2月 A
2010年2月 A
2010年2月 B
2010年2月 B
2010年2月 C
2010年2月 D
2010年2月 D
2010年3月 A
2010年3月 A
2010年3月 A
2010年3月 A
2010年3月 B
2010年3月 B
2010年3月 C
2010年3月 D
2010年3月 D
下面是直接生产的代码

USE [test]

CREATE NONCLUSTERED INDEX [IX_testTable_1] ON [dbo].[testTable] 
(
[时间] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
GO

USE [test]

CREATE CLUSTERED INDEX [字母] ON [dbo].[testTable] 
(
[name] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
GO



如果把这两个索引语句颠倒下,会不会出现问题呢? 会不会现在先以字母作为分类索引,然后内部再时间排序。
像下面的这样
时间         字母
2010年1月 A
2010年1月 A
2010年2月 A
2010年2月 A
2010年2月 A
2010年3月 A
2010年3月 A
2010年1月 B
2010年1月 B
2010年2月 B
2010年2月 B
2010年2月 B
2010年3月 B
2010年3月 B



------解决方案--------------------
USE [test]
 
CREATE  CLUSTERED INDEX [IX_testTable_1] ON [dbo].[testTable] 
(
    [时间] ASC,[name] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
GO

--建一个索引就可以了.
------解决方案--------------------
如果同时用到了复合索引中的所有列,与单独索引做比较的话,那么复合索引要快
如果单一拿出复合索引中的第一列与单独索引比较,那么效率相当
如果单一拿出复合索引中其他列于单独索引比较,那么单独索引快
用复合索引时,索引的查询顺序一定要按照索引的创建顺序
而且如果拆开单独来查询的话,没有什么优势