T-SQL精髓总结

2021-01-08  本文已影响0人  Binary_r

一、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))

上一篇下一篇

猜你喜欢

热点阅读