金沙国际官网_金沙国际平台登录

因为这个金沙国际官网_金沙国际平台登录网站与很多的大型澳门赌场都有合作,金沙国际官网_金沙国际平台登录尽职尽责,高效执行,保持好奇心,不断学习,追求卓越,点击进入金沙国际官网_金沙国际平台登录马上体验吧,所以现在也正式地开始了营业。

您的位置:金沙国际官网 > 数据库 > 开窗函数,SqlServer2008查询性能优化_第一章

开窗函数,SqlServer2008查询性能优化_第一章

发布时间:2019-10-25 15:32编辑:数据库浏览(82)

    一个学习性任务:每个人有不同次数的成绩,统计出每个人的最高成绩。

    图片 1

    1.锁

    当多个用户同时对同一个数据进行修改时会产生并发问题,使用事务就可以解决这个问题。但是为了防止其他用户修改另一个还没完成的事务中的数据,就需要在事务中用到锁。
    SQL Server 2008提供了多种锁模式:排他锁,共享锁,更新锁,意向锁,键范围锁,架构锁和大容量更新锁。
    查询sys.dm_tran_locks视图可以快速了解SQL Server 2008内的加锁情况。

    SELECT * FROM sys.dm_tran_locks;
    

    注:关于锁的知识书中没细讲,将在以后的博客中补充。

    这个问题应该还是相对简单,其实就用聚合函数就好了。

     

    2.游标

    游标是类似于C语言指针一样的结构,是一种数据访问机制,允许用户访问单独的数据行。游标主要由游标结果集和游标位置组成。游标结果集是定义游标的SELECT语句返回行的集合,游标位置是指向这个结果集中某一行的指针。
    示例1:用游标检索出student表中每行记录
    Student表记录如图所示
    图片 2
    执行下列语句

    USE test
    DECLARE stu_cursor CURSOR FOR
    SELECT * FROM student--声明student表的游标stu
    OPEN stu_cursor--打开游标
    FETCH NEXT FROM stu_cursor--移动该记录指针
    WHILE @@FETCH_STATUS=0--@@FETCH_STATUS用于保存FETCH操作的结束信息,=0表示有记录检索成功
    BEGIN
    FETCH NEXT FROM stu_cursor--游标指针移动到下一条记录
    END
    CLOSE stu_cursor--关闭游标
    DEALLOCATE stu_cursor--释放游标资源
    

    结果如图所示
    图片 3

    select id,name,max(score) from Student group by id,name order by name

    2.1.游标定义的参数LOCAL和GLOBAL

    游标定义参数LOCAL表示该游标只能作用于本次批处理或函数或存储过程。游标定义参数GLOBAL表示该游标可以作用于全局。
    执行下列语句

    DECLARE stu_cursor CURSOR LOCAL
    FOR SELECT * FROM student
    GO
    OPEN stu_cursor
    GO
    

    执行结果如下
    图片 4
    语句中,声明了一个student表的游标stu_cursor,在打开游标时提示游标不存在。因为该游标参数是LOCAL,只能作用于当前批处理语句中,而打开游标语句和声明语句不在一个批处理中。如果去掉第一个GO,使两个语句在同一个批处理中,就能顺利执行不会报错。
    执行下列语句

    DECLARE stu_cursor1 CURSOR GLOBAL
    FOR SELECT * FROM student
    GO
    OPEN stu_cursor1
    GO
    

    执行结果:命令已成功完成
    和LOCAL参数对比,GOLBAL参数设置游标作用于全局,因此OPEN和DECLARE语句不在同一个批处理中依然可以成功执行。

    上边这种情况只适用id 和name是一一对应的,否则查询出来的数据是不正确的。

    2.2.游标分为游标变量和游标类型

    如下列语句

    --语句1
    DECLARE stu_cursor CURSOR
    FOR SELECT * FROM student--声明student表的游标名称为stu_cursor并赋值
    GO
    
    --语句2
    DECLARE @stu_cursor CURSOR--声明游标类型的变量@stu_cursor
    SET @stu_cursor=CURSOR FOR--给该变量赋值
    SELECT * FROM student
    

    在语句1中直接声明了一个游标并赋值,而语句2中声明了游标类型的变量@stu_cursor,然后给该变量赋值。这两者是不同的。

    例如 : 1 张三 100

    2.3.游标参数FORWARD_ONLY和SCROLL

    FORWARD_ONLY参数设置游标只能从结果集的开始向结束方向读取,使用FETCH语句时只能用NEXT,而SCROLL参数设置游标可以从结果集的任意方向,任意位置移动。如下列语句

    --语句1,默认FORWARD_ONLY
    DECLARE stu_cursor CURSOR LOCAL
    FOR SELECT * FROM student
    OPEN stu_cursor
    FETCH NEXT FROM stu_cursor
    GO
    --语句2,FORWARD_ONLY参数,FETCH时只能从开始往结束方向
    DECLARE stu_cursor CURSOR FORWARD_ONLY LOCAL
    FOR SELECT * FROM student
    OPEN stu_cursor 
    FETCH NEXT FROM stu_cursor
    GO
    --语句3,SCROLL参数,FETCH时可以从任意位置往任意方向
    DECLARE stu_cursor CURSOR SCROLL LOCAL
    FOR SELECT * FROM student
    OPEN stu_cursor
    FETCH LAST FROM stu_cursor
    GO
    

               2 张三 90

    2.4.游标的简单应用

    示例2:将student表中stu_enter_score大于600分的学生都减去100分
    Student表中的数据如图所示
    图片 5
    执行下列语句

    --游标的简单应用
    DECLARE stu_cursor CURSOR FORWARD_ONLY LOCAL
    FOR SELECT stu_no,stu_enter_score FROM student
    OPEN stu_cursor
    DECLARE @score INT
    DECLARE @stu_no VARCHAR(8)
    FETCH NEXT FROM stu_cursor INTO @stu_no,@score--把游标值赋值给变量@score
    WHILE @@FETCH_STATUS=0 
    BEGIN
    IF @score>=600
    BEGIN
    UPDATE student
    SET stu_enter_score=@score-100 WHERE stu_no=@stu_no 
    END
    FETCH NEXT FROM stu_cursor INTO @stu_no,@score--把游标值赋值给变量@score
    END
    CLOSE stu_cursor
    DEALLOCATE stu_cursor
    GO
    

    结果如图所示
    图片 6

              查询出来的结果

    3.存储过程

    存储过程是一组用于完成特定功能的语句集,经过编译后存储在数据库中。在SQL Server 2008中,既可以用T-SQL编写存储过程,也可以用CLR编写存储过程。

              两条信息都会输出。

    3.1.用户定义的存储过程

    该种存储过程是指封装了可重用代码的模块或者历程,有2种类型:T-SQL存储过程和CLR存储过程。
    T-SQL存储过程是指保存的T-SQL语句集合
    CLR存储过程是指对Microsoft .NET Framework公共语言运行时(CLR)方法的引用

    避免这种情况,可以使用开窗函数。

    3.2.扩展存储过程

    扩展存储过程是指可以动态加载和运行的DLL,允许使用编程语言(如C语言)创建自己的外部例程。扩展存储过程直接在SQL Server 2008的实例的地址空间中运行,可以使用SQL Server扩展存储过程API完成编程。

    本文由金沙国际官网发布于数据库,转载请注明出处:开窗函数,SqlServer2008查询性能优化_第一章

    关键词: