SQL数据库索引(7)-Indexing for AND_SQL SERVER数据库_黑客防线网安服务器维护基地--Powered by WWW.RONGSEN.COM.CN

SQL数据库索引(7)-Indexing for AND

作者:黑客防线网安SQL维护基地 来源:黑客防线网安SQL维护基地 浏览次数:0

本篇关键词:索引数据库NULL传输
黑客防线网安网讯:  我在SQL Server 索引基础知识系列中,第一篇就讲了记录数据的基本格式。那里主要讲解的是,数据库的最小读存单元:数据页。一个数据页是8K大小。  对于数据库来说,它不会每次有一个数...

  我在SQL Server 索引基础知识系列中,第一篇就讲了记录数据的基本格式那里主要讲解的是数据库的最小读存单元:数据页一个数据页是8K大小。
  对于数据库来说它不会每次有一个数据页变化后,就存到硬盘。而是变化达到一定数量级后才会作这个操作。 这时候,数据库并不是以数据页来作为操作单元,而是以64k的数据(8个数据页,一个区)作为操作单元。
  区是管理空间的基本单位。一个区是八个物理上连续的页(即 64 KB)。这意味着 SQL Server 数据库中每 MB 有 16 个区。
  为了使空间分配更有效,SQL Server 不会将所有区分配给包含少量数据的表。SQL Server 有两种类型的区:
  统一区,由单个对象所有。区中的所有 8 页只能由所属对象使用。
  混合区,最多可由八个对象共享。区中八页的每页可由不同的对象所有。
  通常 我们通过一个实例来看 有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进行后续分配。如果对现有表创建索引,并且该表包含的行足以在索引中生成 8 页,则对该索引的所有分配都使用统一区进行。
   
  为何会这样呢?
  其实很简单:
  读或写 8KB 的时间与读或写 64 KB的时间几乎相同。
  在 8 KB 到 64 KB 范围之内,单个磁盘 I/O 传输操作所花的时间主要是磁盘取数臂和读/写磁头运动的时间。
  因此,从数学上来讲,当需要传输 64 KB 以上的 SQL 数据时,
  尽可能地执行 64 KB 磁盘传输是有益的,即分成数个64K的操作。
  因为 64 KB 传输基本上与 8 KB 传输一样快,而每次传输的 SQL Server 数据是 8 KB 传输的 8 倍。

    黑客防线网安服务器维护方案本篇连接:http://www.rongsen.com.cn/show-11466-1.html
网站维护教程更新时间:2012-03-21 03:21:57  【打印此页】  【关闭
我要申请本站N点 | 黑客防线官网 |  
专业服务器维护及网站维护手工安全搭建环境,网站安全加固服务。黑客防线网安服务器维护基地招商进行中!QQ:29769479

footer  footer  footer  footer