数据库里面想要这样的数据排序形式,首先要以时间做索引,然后里面再以字母做分类索引
时间 字母
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
--建一个索引就可以了.
------解决方案--------------------
如果同时用到了复合索引中的所有列,与单独索引做比较的话,那么复合索引要快
如果单一拿出复合索引中的第一列与单独索引比较,那么效率相当
如果单一拿出复合索引中其他列于单独索引比较,那么单独索引快
用复合索引时,索引的查询顺序一定要按照索引的创建顺序
而且如果拆开单独来查询的话,没有什么优势