通过索引,可以加快数据的查询速度和减少系统的响应时间;可以使表和表之间的连接速度加快。但是,不是在任何时候使用索引都能够达到这种效果。若在不恰当的场合下,使用索引反而会事与愿违。 索引是以表列为基础的数据库对象。索引中保存着表中排序的索引列
通过索引,可以加快数据的查询速度和减少系统的响应时间;可以使表和表之间的连接速度加快。但是,不是在任何时候使用索引都能够达到这种效果。若在不恰当的场合下,使用索引反而会事与愿违。
索引是以表列为基础的数据库对象。索引中保存着表中排序的索引列,并且纪录了索引列在数据库表中的物理存储位置,实现了表中数据的逻辑排序。通过索引,可以加快数据的查询速度和减少系统的响应时间;可以使表和表之间的连接速度加快。
但是,不是在任何时候使用索引都能够达到这种效果。若在不恰当的场合下,使用索引反而会事与愿违。所以,在SQL Server数据库中使用索引的话,还是需要遵守一定的规则。
铁律一:天下没有免费的午餐,使用索引是需要付出代价的
索引的优点有目共睹,但是,却很少有人关心过采用索引所需要付出的成本。若数据库管理员能够对索引所需要付出的代价有一个充分的认识,也就不会那么随意 ......
SQL> setsqlprompt"_user _privilege> " 通过以上设置,你的sqlplus提示标识就成了以下格式了: SYS AS SYSDBA> 这就表明当前的登录帐号是SYS,身份是SYSDBA。请注意在上面语句中使用了两个特殊的预定义道德变量:_user和_privilege,分别定义了当前用户和这个用户的登录身份(权限)。现在我们再增加一些其他内容。比如我除了想知道以上信息外,还想知道当前的登录时间: SQL> setsqlprompt"_user _privilege on _date>" SYS AS SYSDBA on 31-8月-05> 再增加一个连接信息看,这样就可以指出你登录的是哪个服务器的: SQL>setsqlprompt"_user on _date at _connect_identifier>" SYS on 31-8月-05 atteng> 但是前面的当前时间信息只有日期,如果需要精确到当前的确切时间呢: SYS on 31-8月-05 atteng>alter session setnls_date_format='yyyy-mm-ddhh24:mi:ss'; 会话已更改。 -------------- 15:02:59 SQL> SELECT USER ||'@'|| REPLACE (GLOBAL_NAME, '.WORLD', NULL) GLOBAL_NAME from GLOBAL_NAME 方法2: 加在login.sql或glogin.sql文件的后面: DEFINE gname = 'not connected'
CO ......
Student(S#,Sname,Sage,Ssex) 学生表
Course(C#,Cname,T#) 课程表
SC(S#,C#,score) 成绩表
Teacher(T#,Tname) 教师表
问题:
1、查询“001”课程比“002”课程成绩高的所有学生的学号;
select a.S# from (select s#,score from SC where C#='001') a,(select s#,score
from SC where C#='002') b
where a.score>b.score and a.s#=b.s#;
2、查询平均成绩大于60分的同学的学号和平均成绩;
select S#,avg(score)
from sc
group by S# having avg(score) >60;
3、查询所有同学的学号、姓名、选课数、总成绩;
select Student.S#,Student.Sname,count(SC.C#),sum(score)
from Student left Outer join SC on Student.S#=SC.S#
group by Student.S#,Sname
4、查询姓“李”的老师的个数;
select count(distinct(Tname))
from Teacher
where Tname like '李%';
5、查询没学过“叶平”老师课的同学的学号、姓名;
select Student.S#,Stu ......
在使用过程中大家经常碰到数据库日志非常大的情况,在这里介绍了两种处理方法……
方法一
一般情况下,SQL数据库的收缩并不能很大程度上减小数据库大小,其主要作用是收缩日志大小,应当定期进行此操作以免数据库日志过大。
1、设置数据库模式为简单模式:打开SQL企业管理器,在控制台根目录中依次点开Microsoft SQL Server-->SQL Server组-->双击打开你的服务器-->双击打开数据库目录-->选择你的数据库名称(如论坛数据库Forum)-->然后点击右键选择属性-->选择选项-->在故障还原的模式中选择“简单”,然后按确定保存
2、在当前数据库上点右键,看所有任务中的收缩数据库,一般里面的默认设置不用调整,直接点确定
3、收缩数据库完成后,建议将您的数据库属性重新设置为标准模式,操作方法同第一点,因为日志在一些异常情况下往往是恢复数据库的重要依据
方法二
SET NOCOUNT ON
DECLARE @LogicalFileName sysname,
@MaxMinutes INT,
@NewSize INT
USE tablename -- 要操作的数据库名
SELECT @LogicalFileName = 'tablename_log', -- 日志文件名
@M ......
1. Nested Loop Join(嵌套循环联结)
算法:
其思路相当的简单和直接:对于关系R的每个元组 r 将其与关系S的每个元组 s 在JOIN条件的字段上直接比较并筛选出符合条件的元组。写成伪代码就是:
代价:
被联结的表所处内层或外层的顺序对磁盘I/O开销有着非常重要的影响。而CPU开销相对来说影响较小,主要是元组读入内存以后(in-memory)的开销,是 O (n * m)
对于I/O开销,根据 page-at-a-time 的前提条件,I/O cost = M + M * N,
翻译一下就是 I/O的开销 = 读取M页的I/O开销 + M次读取N页的I/O开销。
2. Sort-Merge Join (排序合并联结)
Nested Loop一般在两个集合都很大的情况下效率就相当差了,而Sort-Merge在这种情况下就比它要高效不少,尤其是当两个集合的JOIN字段上都有聚集索引(clustered index)存在时,Sort-Merge性能将达到最好。
算法:
基本思路也很简单(复习一下数据结构中的合并排序吧),主要有两个步骤:
a.按JOIN字段进行排序
b.对两组已排序集合进行合并排序,从来源端各自取得数据列后加以比较(需要根据是否在JOIN字段有重复值做特殊的“分区”处理)
代价:(主要是I/O开销)
有两个因素左右Sort-Merge的开销:JOIN字段是否已排 ......
在SQL Server 2005数据库中实现自动备份的具体步骤:
1、打开SQL Server Management Studio
2、启动SQL Server代理
3、点击作业->新建作业
4、"常规"中输入作业的名称
5、新建步骤,类型选T-SQL,在下面的命令中输入下面语句(请根据自己的实际情况更改,D:\sql2005\\back\改为自己的备份路径,sq_test修改为想备份的数据库的名称)
DECLARE @strPath NVARchar(200)
set @strPath = convert(NVARchar(19),getdate(),120)
set @strPath = REPLACE(@strPath, ’:’ , ’.’)
set @strPath = ’D:\sql2005\\back\’ + @strPath + ’.bak’
BACKUP DATABASE [sq_test] TO DISK = @strPath WITH NOINIT , NOUNLOAD , NOSKIP , STATS = 10, NOFORMAT
6、添加计划,设置频率,时间等。
7、确定,完成。
......