一、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))
网友评论