SqlServer中的临时表
一、什么是临时表
临时表属于会话级的,会话结束的时候,临时表被释放,其创建、使用、删除都和普通表一样,临时表空间一般利用虚拟内存,不必进行磁盘I/O,因此效率较高。。临时表有两种:普通临时表 (#TbName)和全局临时表(##TbName)
普通临时表 属于创建该临时表的会话,会话结束时被释放,其他的会话不能使用
全局临时表 属于所有的会话,在所有会话结束时被释放
适用场合:高并发的场合(操作频繁,查询又多)
关于高并发的一些基本内容(后边会将用临时表改善高并发的方法):
1、只要进行表连接,那么肯定会做表的笛卡尔积(如join on时先做表的笛卡尔积,再筛选出满足on条件的数据)
2、数据库中的锁:
本例中锁的粒度在表级别上,用到的是X锁(排他锁)和S锁(共享锁)
insert update delete操作:表上添加X锁(其他的用户不能访问)
select操作:表上添加S锁(其他用户来的时候可以select,但是不能增删改)
3、简单死锁情况:
用户1的操作需要tb1和tb2两个表的资源,已经获取了tb1并给tb1加了X锁
用户2的操作需要tb1和tb2两个表的资源,已经获取了tb2并给tb2加了X锁
用户1和用户2都在等对方释放资源
其他用户来请求tb1和tb2时等待用户1和用户2释放资源
程序无法继续进行了
简单解决死锁:
①用户1和用户2获取资源的顺序都改成先获取资源1,再获取资源2
②获取资源时把资源1和资源2作为一个整体,一起获取
二、临时表的使用
2.1 临时表的基本使用
在创建数据库连接后创建一个临时表,连接期间像使用普通表一样使用
--创建临时表
create table #MyUserInfo
(
id int primary key identity(1,1),
username nvarchar(20)
)
--使用临时表
select * from #MyUserInfo --释放资源
drop table #MyUserInfo --临时表的常用方式,把用户表的数据存入一个临时表(#MyUserInfo)中
select * into #MyUserInfo from Tb_UserInfo
select * from #MyUserInfo --全局临时表,用法和普通临时表一样,用##TbName标识(开发中尽量不要自己创建,其他人也可能创建一个相同的全局临时表造成冲突)
select into ##myUserInfoG from Tb_UserInfo
drop table ##myUserInfoG
2.2 临时表改善高并发
用临时表对高并发进行优化时,优化的原则是尽早释放表中的锁,如我们在对Tb_UserInfo和Tb_RoleInfo中的数据进行连接查询时,会对这两种表都添加S锁,其他用户对这两张表进行增删改操作时,要等待查询完成。我们通过临时表实现优化,就是让用户在查询时通过临时表来查询,尽早释放原表的S锁。
--临时表改善高并发
select * into #userinfo from Tb_UserInfo
select * into #roleinfo from Tb_RoleInfo --执行下边查询时,原userinfo表和roleinfo表的s锁已经被释放了
select username,rolename from #userinfo as u
join #roleinfo as r on u.roleid=r.rid
SqlServer中的临时表的更多相关文章
- sqlserver 存储过程中使用临时表到底会不会导致重编译
曾经在网络上看到过一种说法,SqlServer的存储过程中使用临时表,会导致重编译,以至于执行计划无法重用, 运行时候会导致重编译的这么一个说法,自己私底下去做测试的时候,根据profile的跟踪结果 ...
- Sqlserver数据库中的临时表详解
临时表在Sqlserver数据库中,是非常重要的,下面就详细介绍SQL数据库中临时表的特点及其使用,仅供参考. 临时表与永久表相似,但临时表存储在tempdb中,当不再使用时会自动删除.临时表有两种类 ...
- SQLSERVER中的假脱机spool
SQLSERVER中的假脱机spool 我发现网上对于假脱机的解释都非常零散,究竟假脱机是什么? 这几天在家里研究了一下,收集了很多网上的资料 假脱机是中文的翻译,而英文的名字叫做 spool 在徐老 ...
- (转)笔记320 SQLSERVER中的加密函数 2013-7-11
1 --SQLSERVER中的加密函数 2013-7-11 2 ENCRYPTBYASYMKEY() --非对称密钥 3 ENCRYPTBYCERT() --证书加密 4 ENCRYPTBYKEY() ...
- Sqlserver中存储过程,触发器,自定义函数(一)
Sqlserver中存储过程,触发器,自定义函数 1.存储过程有关内容存储过程的定义:存储过程的分类:存储过程的创建,修改,执行:存储过程中参数的传递,返回与接收:存储过程的返回值:存储过程使用游标. ...
- Sqlserver中存储过程,触发器,自定义函数
Sqlserver中存储过程,触发器,自定义函数: 1. 触发器:是针对数据库表或数据库的特殊存储过程,在某些行为发生的时候就会被激活 触发器的分类: DML触发器:发生在数据操作语言执行时触发执行的 ...
- CTE在Oracle和Sqlserver中使用的差异
CTE是一个很好用的工具,他可以帮助我们清晰代码结构,减少临时表使用,同时oracle和sqlserver都提供支持.但在oracle和sqlserver中使用CTE也存在一定区别. Oracle使用 ...
- SQL点滴18—SqlServer中的merge操作,相当地风骚
原文:SQL点滴18-SqlServer中的merge操作,相当地风骚 今天在一个存储过程中看见了merge这个关键字,第一个想法是,这个是配置管理中的概念吗,把相邻两次的更改合并到一起.后来在tec ...
- SQLServer 中多行数据合并成一行数据(一个字段)
需求:有四行数据,如下: 1.苹果 2.橘子 3.桃子 4.波罗 合并成一个字段:苹果,橘子,桃子,波罗: 需求明确之后,先弄点测试数据,上代码: --创建一个临时表 Create table #te ...
随机推荐
- Golang 数组、切片、映射
定义数组 var arr1 [5]int //整型类型 fmt.Println(arr1) //[0 0 0 0 0] //赋值 arr1 = [5]int{1, 2, 3, 4, 5} fmt.Pr ...
- PHP和JavaScript将字符串转换为数字string2int
在看廖雪峰的JavaScript教程时,里面有一个题就是利用reduce()将string转换为int,我看评论中贴出的方法,当时觉得挺意外了,以为他只用了一行代码,即下面这行代码 var str=& ...
- HDU 2052 Picture
http://acm.hdu.edu.cn/showproblem.php?pid=2052 Problem Description Give you the width and height of ...
- ASP.NET MVC4学习笔记
一.MVC简介
- CentOS virt-manager 安装Win2008r2的一种GUI方法
1. 必须在物理机上面安装CentOS机器. 安装方法上一个blog里面简单写过. 注意一点,重复安装时 总是提示no disk found 我的解决办法使用 windows 安装盘 格式化了下磁盘重 ...
- python之发送HTML内容的邮件
# 发送html内容的邮件 import smtplib, time, os from email.mime.text import MIMEText from email.header import ...
- BZOJ5372 PKUSC2018神仙的游戏(NTT)
首先有一个想法,翻转串后直接卷积看有没有0匹配上1.但这是必要而不充分的因为在原串和翻转串中?不能同时取两个值. 先有一些结论: 如果s中长度为len的前缀是border,那么其存在|s|-len的循 ...
- 【总结】 Lucas定理
\(Lucas\)定理: \(C^x_y≡C^{x/p}_{y/p}*C^{x\%p}_{y\%p} ~~(mod~p)\) 证明不会2333 void pre(){ A[0]=A[1]=B[0]=B ...
- 自学Linux Shell14.2-在脚本中使用其他文件描述符
点击返回 自学Linux命令行与Shell脚本之路 14.2-在脚本中使用其他文件描述符 在脚本中重定向输入和输出,并布局限于以上讲的3个默认的文件描述符,shell最多可以有9个打开的文件描述符.这 ...
- js的==和===练习
今天检查了一下JS的== 和===的区别 如下: 表达式 值 1==true true 1===true false 0==false t ...