美文网首页
T-SQL精髓总结

T-SQL精髓总结

作者: Binary_r | 来源:发表于2021-01-08 19:33 被阅读0次

    一、WITH(NOLOCK)

    1、使用WITH(NOLOCK)时查询不受其它排他锁阻塞

    2、WITH(NOLOCK) 不发布共享锁来阻止其他事务修改当前事务读取的数据

    使用场景

    1: 基础数据表,这些表的数据很少变更。
    2:历史数据表,这些表的数据很少变更。
    3:业务允许脏读情况出现涉及的表。
    4:数据量超大的表,出于性能考虑,而允许脏读。

    二、批量操作

    方法一:使用子查询

    使用IN 或 exists关键字

    in是把外表和内表作hash 连接,而exists 是对外表作循环,每次循环再对内表进行查询。
    一直以来认为exists 比in 效率高的说法是不准确的。如果查询的两个表大小相当,那么用in 和exists 差别不大。
    如果两个表中一个较小,一个是大表,则子查询表大的用exists,子查询表小的用in

    NOT IN 或 NOT EXISTS

    如果查询语句使用了not in 那么内外表都进行全表扫描,没有用到索引;
    而not extsts 的子查询依然能用到表上的索引。所以无论那个表大,用not exists 都比not in 要快。

    方法二:使用JOIN关联表

    如果直接对多个数据库表进行join,数据量很大时,效率很低

    解决方案:采用临时表

    CREATE TABLE #tmp
    (
        ID INT IDENTITY(1,1) PRIMARY KEY,
        ItemNumber CHAR(25),
        CountryCode CHAR(3)
    )
    

    将需要处理的数据关键信息存入临时表,使用临时表进行join,大大提升性能

    三、循环操作

    游标CURSOR

    DECLARE Template_Cursor CURSOR
    FOR
    SELECT LastName, FirstName FROM Northwind.dbo.Employees
    OPEN Template_Cursor 
    FETCH NEXT FROM Template_Cursor 
    INTO @LastName, @FirstName
    
    WHILE @@FETCH_STATUS = 0
    BEGIN
          .....
          FETCH NEXT FROM Template_Cursor 
    END
    
    CLOSE Template_Cursor 
    DEALLOCATE Template_Cursor 
    
    

    @@fetch_status

    @@fetch_status是MicroSoft SQL SERVER的一个全局变量
    其值有以下三种,分别表示三种不同含义:【返回类型integer】
    0 FETCH 语句成功
    -1 FETCH 语句失败或此行不在结果集中
    -2 被提取的行不存在
    @@fetch_status值的改变是通过fetch next from实现的
    “FETCH NEXT FROM Cursor”

    四、类型转换

    将int类型转化为char
    select CAST(20201015 AS CHAR(10))

    将int类型转化为char再转化为date
    select CAST(CAST(20201015 AS CHAR(10)) AS DATE)

    对datetime进行计算以后转为date类型
    SELECT CAST(DATEADD(DAY, -180, GETDATE()) as DATE)

    对日期进行运算以后截取为char,再转为int类型
    DECLARE @start_date INT = CONVERT(INT,CONVERT(CHAR(10), DATEADD(d, -180, GETDATE()), 112))

    相关文章

      网友评论

          本文标题:T-SQL精髓总结

          本文链接:https://www.haomeiwen.com/subject/tpnfaktx.html