SQL Server索引(7)-Indexing for AND
2008-01-31 11:53:05 来源:blog 作者: 点击:
SQL Server 对于每一条查询语句。会根据实际索引情况(sysindexes 系统表中存储这些信息),分析每种组合可能的成本。然后选择它认为成本最小的一种。作为它实际执行的计划。成本代价计算的一个主要组成部分是逻辑I/O的数量,特别是对于单表的查询。
我们通过一个实例来看 有And 操作符时候的最常见的一种情况。我们有下面一个表,
CREATE TABLE [dbo].[member](
[member_no] [dbo].[numeric_id] IDENTITY(1,1) NOT NULL,
[lastname] [dbo].[shortstring] NOT NULL,
[firstname] [dbo].[shortstring] NOT NULL,
[middleinitial] [dbo].[letter] NULL,
[street] [dbo].[shortstring] NOT NULL,
[city] [dbo].[shortstring] NOT NULL,
[state_prov] [dbo].[statecode] NOT NULL,
[country] [dbo].[countrycode] NOT NULL,
[mail_code] [dbo].[mailcode] NOT NULL,
[phone_no] [dbo].[phonenumber] NULL,
[photograph] [image] NULL,
[issue_dt] [datetime] NOT NULL DEFAULT (getdate()),
[expr_dt] [datetime] NOT NULL DEFAULT (dateadd(year,1,getdate())),
[region_no] [dbo].[numeric_id] NOT NULL,
[corp_no] [dbo].[numeric_id] NULL,
[prev_balance] [money] NULL DEFAULT (0),
[curr_balance] [money] NULL DEFAULT (0),
[member_code] [dbo].[status_code] NOT NULL DEFAULT (' ') |
这个表具备下面的四个索引:
| 索引名 |
细节 |
索引的列 |
| member_corporation_link |
nonclustered located on PRIMARY |
corp_no |
| member_ident |
clustered, unique, primary key located on PRIMARY |
member_no |
| member_region_link |
nonclustered located on PRIMARY |
region_no |
| MemberFirstName |
nonclustered located on PRIMARY |
firstname |
当我们执行下面的SQL查询时候,
| SELECT m.Member_No, m.FirstName, m.Region_NoFROM dbo.Member AS mWHERE m.FirstName LIKE 'K%' AND m.Region_No > 6 AND m.Member_No < 5000go |
SQL Server 会根据索引方式,优化成下面方式来执行。
select a.Member_No,a.FirstName,b.Region_No
from
(select m.Member_No, m.FirstName from dbo.Member AS m
where m.FirstName LIKE 'K%' and m.Member_No < 5000) a ,
-- 这个查询可以直接使用 MemberFirstName 非聚集索引,而且这个非聚集索引覆盖了所有查询列
-- 实际执行时,只需要 逻辑读取 3 次
(SELECT m.Member_No, m.Region_No from dbo.Member AS m
where m.Region_No > 6) b
-- 这个查询可以直接使用 member_region_link 非聚集索引,而且这个非聚集索引覆盖了所有查询列
-- 实际执行时,只需要 逻辑读取 10 次
where a.Member_No = b.Member_No |