3)复合索引(索引有两个以上的列)要注意列顺序 索引在数据库中是以B树的形式存储的。包含A,B两个列的索引会首先根据A列建B树,A列的叶节点上才会开始根据B列建B树。所以包含两个列的索引就需要根据查询条件所在列来决定两个列在索引中的顺序。 可以用下面的sql做实验: 复制代码 代码如下: USE [Test] GO /****** 对象: Table [dbo].[testIndexOrder] 脚本日期: 05/27/2010 09:11:26 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE TABLE [dbo].[testIndexOrder]( [ID] [int] IDENTITY(1,1) NOT NULL, [FirstName] [nvarchar](20) COLLATE Chinese_PRC_CI_AS NOT NULL, [LastName] [nvarchar](20) COLLATE Chinese_PRC_CI_AS NOT NULL, [Desc] [nvarchar](400) COLLATE Chinese_PRC_CI_AS NULL, CONSTRAINT [PK_testIndexOrder] PRIMARY KEY CLUSTERED ( [ID] ASC )WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY] ) ON [PRIMARY] GO /****** 对象: Index [IX_testIndexOrder] 脚本日期: 05/27/2010 09:11:51 ******/ CREATE NONCLUSTERED INDEX [IX_testIndexOrder] ON [dbo].[testIndexOrder] ( [FirstName] ASC, [LastName] ASC )WITH (SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF) ON [PRIMARY] GO declare @i INT; DECLARE @random varchar(36); set @i = 0; while @i < 100000 begin set @random = newid(); INSERT INTO [testIndexOrder] (FirstName,LastName,[Desc]) VALUES( substring(@random,1,8),substring(@random,12,8),@random ); set @i = @i + 1 end
set statistics time on select * from [testIndexOrder] where lastname = "6F-4ECA-" select * from [testIndexOrder] where firstname = "CAABE009" set statistics time off